From a9d2b856e0f6be6475319c2dc36bf405c2f908fc Mon Sep 17 00:00:00 2001
From: WXL (wul) <wl_5969728@163.com>
Date: 星期二, 22 九月 2026 14:04:52 +0800
Subject: [PATCH] 测试完成
---
src/views/patient/archives/nutrition/index.vue | 12
vue.config.js | 4
src/views/Satisfaction/sfstatistics/components/DataOverview.vue | 1170 ++++++++--
src/views/followvisit/zbAgain/index.vue | 35
src/views/patient/archives/components/ArchiveDialog.vue | 276 --
src/views/patient/archives/menopause/index.vue | 12
src/api/AiCentre/satisfaction.js | 42
src/views/followvisit/zysatisfaction/index.vue | 19
src/views/sfstatistics/percentage/components/ChartDialog.vue | 93
src/views/patient/archives/childHealth/detail.vue | 153 +
src/views/Satisfaction/sfstatistics/components/SatisfactionStatistics.vue | 44
src/views/followvisit/mzsatisfaction/index.vue | 25
src/views/patient/archives/highRisk/index.vue | 12
src/views/followvisit/record/detailpage/index.vue | 104
src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue | 36
src/views/patient/archives/maternalHealth/detail.vue | 726 ++++--
src/views/patient/patient/behospitalized.vue | 4
src/views/followvisit/discharge/outpatientService.vue | 29
src/views/patient/archives/learning/index.vue | 12
src/views/followvisit/complaint/index.vue | 25
src/views/patient/archives/components/ServiceRecords.vue | 344 +++
src/views/followvisit/technology/index.vue | 15
src/views/sfstatistics/percentage/components/SecondFollowUp.vue | 287 ++
src/views/followvisit/again/index.vue | 4
src/views/patient/archives/types.js | 187 +
随访通用9.22.zip | 0
src/views/followvisit/operation/index.vue | 27
src/views/followvisit/Tracking/index.vue | 37
src/views/followvisit/beHospitalized/followUp.vue | 33
src/views/sfstatistics/percentage/components/FirstFollowUp.vue | 296 ++
src/views/followvisit/record/index.vue | 21
src/views/followvisit/Continue/index.vue | 21
src/views/loginSSO.vue | 16
src/views/followvisit/OutpatientAgain/index.vue | 34
/dev/null | 0
src/views/Satisfaction/sfstatistics/components/ChartsPanel.vue | 620 ++++-
src/views/login.vue | 12
src/views/followvisit/HistoricalFollow/index.vue | 21
src/views/patient/archives/pregnancy/index.vue | 12
src/views/sfstatistics/percentage/index.vue | 15
src/views/patient/archives/components/ArchiveList.vue | 148 +
src/views/patient/patient/profile/index.vue | 723 +++---
src/views/patient/archives/components/OutpatientPicker.vue | 145 +
src/views/repositoryai/intention/index.vue | 19
src/views/followvisit/discharge/index.vue | 34
src/views/sfstatistics/percentage/components/CombinedFollowUp.vue | 22
46 files changed, 4,341 insertions(+), 1,585 deletions(-)
diff --git a/src/api/AiCentre/satisfaction.js b/src/api/AiCentre/satisfaction.js
index 1d72c6e..09d6faf 100644
--- a/src/api/AiCentre/satisfaction.js
+++ b/src/api/AiCentre/satisfaction.js
@@ -8,8 +8,46 @@
data: data
});
}
-
-
+// 鍚勯」鏈嶅姟婊℃剰搴︽暟鎹粺璁�
+export function sltdMydTotalByScore(data) {
+ return request({
+ url: "/smartor/serviceSubtaskDetail/sltdMydTotalByScore",
+ method: "post",
+ data: data
+ });
+}
+// 鍚勯」鏈嶅姟婊℃剰搴︽暟鎹粺璁�
+export function mzMydScoreRank(data) {
+ return request({
+ url: "/smartor/serviceSubtaskDetail/mzMydScoreRank",
+ method: "post",
+ data: data
+ });
+}
+// 鍚勭瀹�/鐥呭尯婊℃剰搴﹁瘎鍒嗗姣�
+export function statQuestionOptionByKsOrBq(data) {
+ return request({
+ url: "/smartor/serviceSubtaskDetail/statQuestionOptionByKsOrBq",
+ method: "post",
+ data: data
+ });
+}
+// 璇勫垎瓒嬪娍
+export function mydTrend(data) {
+ return request({
+ url: "/smartor/serviceSubtaskDetail/mydTrend",
+ method: "post",
+ data: data
+ });
+}
+// 鐪佺珛鍚屽痉鎮h�呮弧鎰忓害缁存姢锛堟寜缁村害/闄㈠尯缁熻锛�
+export function sltdMydTotalByDimension(data) {
+ return request({
+ url: "/smartor/serviceSubtaskDetail/sltdMydTotalByDimension",
+ method: "post",
+ data: data
+ });
+}
// 缂撳瓨闂嵎
export function saveMYDQuestionAnswer(data) {
diff --git a/src/views/Satisfaction/sfstatistics/components/ChartsPanel.vue b/src/views/Satisfaction/sfstatistics/components/ChartsPanel.vue
index e0ce533..cc1be67 100644
--- a/src/views/Satisfaction/sfstatistics/components/ChartsPanel.vue
+++ b/src/views/Satisfaction/sfstatistics/components/ChartsPanel.vue
@@ -17,8 +17,14 @@
<span class="filter-label">鍖洪棿绫诲瀷锛�</span>
<el-radio-group v-model="queryParams.interval" size="small" @change="refreshAll">
<el-radio-button label="day">鎸夊ぉ</el-radio-button>
+ <el-radio-button label="week">鎸夊懆</el-radio-button>
<el-radio-button label="month">鎸夋湀</el-radio-button>
<el-radio-button label="year">鎸夊勾</el-radio-button>
+ </el-radio-group>
+ <span class="filter-label">缁熻缁村害锛�</span>
+ <el-radio-group v-model="queryParams.dimension" size="small" @change="onDimensionChange">
+ <el-radio-button label="ward">鎸夌梾鍖虹粺璁�</el-radio-button>
+ <el-radio-button label="dept">鎸夌瀹ょ粺璁�</el-radio-button>
</el-radio-group>
<el-button type="primary" size="small" icon="el-icon-search" @click="refreshAll">鏌ヨ</el-button>
<el-button size="small" icon="el-icon-refresh" @click="handleReset">閲嶇疆</el-button>
@@ -31,10 +37,13 @@
<el-col :span="12">
<el-card shadow="never" class="chart-card">
<div slot="header" class="card-header">
- <span>鏃堕棿缁村害 路 闂ㄨ瘖鎮h�呮弧鎰忓害瓒嬪娍</span>
+ <span>鎮h�呮弧鎰忓害缁煎悎寰楀垎瓒嬪娍</span>
<el-tag type="success" size="small">鐜瘮 {{ trendMoM }}</el-tag>
</div>
- <div ref="chart1" class="chart-box"></div>
+ <div class="chart-wrap" v-loading="trendLoading" element-loading-text="瓒嬪娍鍔犺浇涓�...">
+ <div ref="chart1" class="chart-box"></div>
+ <div v-if="!trendLoading && !trend.buckets.length" class="chart-empty">鏆傛棤瓒嬪娍鏁版嵁</div>
+ </div>
</el-card>
</el-col>
@@ -44,7 +53,10 @@
<div slot="header" class="card-header">
<span>鍒嗙被缁村害 路 鍚勬寚鏍噞{ intervalLabel }}瀵规瘮</span>
</div>
- <div ref="chart2" class="chart-box"></div>
+ <div class="chart-wrap" v-loading="categoryLoading" element-loading-text="鍒嗙被缁村害鍔犺浇涓�...">
+ <div ref="chart2" class="chart-box"></div>
+ <div v-if="!categoryLoading && !categoryCompare.categories.length" class="chart-empty">鏆傛棤鍒嗙被缁村害鏁版嵁</div>
+ </div>
</el-card>
</el-col>
</el-row>
@@ -56,25 +68,26 @@
<div slot="header" class="card-header">
<span>鍗曢 路 閫夐」缁熻</span>
<div class="header-right">
- <el-select v-model="singleQuestionId" size="small" class="sel sel-lg" @change="refreshAll">
- <el-option v-for="q in questionOptions" :key="q.id" :label="q.title" :value="q.id" />
+ <el-select v-model="singleQuestionId" size="small" class="sel sel-lg" filterable remote clearable
+ :remote-method="searchQuestions" :loading="questionLoading" placeholder="璇疯緭鍏ラ棶棰樺唴瀹规悳绱�" @change="onSingleQuestionChange">
+ <el-option v-for="q in questionOptions" :key="q.id" :label="q.scriptContent || q.title" :value="q.id" />
</el-select>
- <el-select v-model="singleDeptWards" multiple collapse-tags size="small" class="sel" clearable filterable placeholder="鍏ㄩ儴绉戝/鐥呭尯" @change="refreshAll">
- <el-option-group label="绉戝">
+ <el-select v-model="singleDeptWards" multiple collapse-tags size="small" class="sel" clearable filterable :placeholder="queryParams.dimension === 'dept' ? '鍏ㄩ儴绉戝' : '鍏ㄩ儴鐥呭尯'" @change="refreshAll">
+ <template v-if="queryParams.dimension === 'dept'">
<el-option v-for="d in deptOptions" :key="'dept:' + d" :label="d" :value="'dept:' + d" />
- </el-option-group>
- <el-option-group label="鐥呭尯">
+ </template>
+ <template v-else>
<el-option v-for="w in wardOptions" :key="'ward:' + w" :label="w" :value="'ward:' + w" />
- </el-option-group>
+ </template>
</el-select>
</div>
</div>
- <el-table :data="singleQuestionData" border size="small">
+ <el-table :data="singleQuestionData" border size="small" v-loading="singleLoading" element-loading-text="閫夐」缁熻鍔犺浇涓�...">
<el-table-column prop="option" label="閫夐」" />
<el-table-column prop="count" label="鍚堣鏁伴噺" width="120" align="center" />
<el-table-column prop="rate" label="鍗犳瘮姣斾緥" width="120" align="center" />
</el-table>
- <div class="table-footer">鏈鏈夋晥濉啓浜烘锛�<b>{{ singleQuestionMeta.total }}</b>銆�缁煎悎婊℃剰搴︼細<b>{{ singleQuestionMeta.score }}</b></div>
+ <div class="table-footer">鏈鏈夋晥濉啓浜烘锛�<b>{{ singleQuestionMeta.total }}</b>銆�缁煎悎寰楀垎锛�<b>{{ singleQuestionMeta.score }}</b></div>
</el-card>
</el-col>
@@ -84,7 +97,10 @@
<div slot="header" class="card-header">
<span>闄㈠尯缁村害 路 鍚勯櫌鍖簕{ intervalLabel }}瀵规瘮</span>
</div>
- <div ref="chart4" class="chart-box"></div>
+ <div class="chart-wrap" v-loading="hospitalLoading" element-loading-text="闄㈠尯缁村害鍔犺浇涓�...">
+ <div ref="chart4" class="chart-box"></div>
+ <div v-if="!hospitalLoading && !hospitalCompare.hospitals.length" class="chart-empty">鏆傛棤闄㈠尯缁村害鏁版嵁</div>
+ </div>
</el-card>
</el-col>
</el-row>
@@ -105,10 +121,11 @@
</el-select>
</div>
</div>
- <el-table :data="rankRows" border size="small" max-height="400">
- <el-table-column type="index" label="鎺掑悕" width="60" align="center" />
+ <el-table :data="rankRows" border size="small" max-height="400" v-loading="rankLoading" element-loading-text="鎺掑悕鍔犺浇涓�...">
+ <el-table-column prop="rank" label="鎺掑悕" width="60" align="center" />
<el-table-column prop="name" :label="rankDimLabel" />
<el-table-column prop="score" label="缁煎悎寰楀垎" width="120" align="center" />
+ <el-table-column prop="itemCount" label="椤规暟" width="100" align="center" />
</el-table>
</el-card>
</el-col>
@@ -128,10 +145,11 @@
</el-select>
</div>
</div>
- <el-table :data="crossRows" border size="small" max-height="400">
- <el-table-column type="index" label="鎺掑悕" width="60" align="center" />
+ <el-table :data="crossRows" border size="small" max-height="400" v-loading="crossLoading" element-loading-text="鎺掑悕鍔犺浇涓�...">
+ <el-table-column prop="rank" label="鎺掑悕" width="60" align="center" />
<el-table-column prop="name" :label="crossDimLabel" />
<el-table-column prop="score" label="缁煎悎寰楀垎" width="120" align="center" />
+ <el-table-column prop="itemCount" label="椤规暟" width="100" align="center" />
</el-table>
</el-card>
</el-col>
@@ -141,54 +159,29 @@
<script>
import * as echarts from 'echarts';
+import { mydTrend, sltdMydTotalByDimension, sltdMydTotalByScore ,mzMydScoreRank} from "@/api/AiCentre/satisfaction";
+import { getissuelist } from "@/api/AiCentre/questionnaire";
-// 鍗曢閫夐」
-const QUESTION_OPTIONS = ['闈炲父婊℃剰', '婊℃剰', '涓�鑸�', '涓嶆弧鎰�'];
-// 鍙�夐鐩�
-const QUESTIONS = [
- { id: 22, title: '绗�22棰橈細鎶辨�ㄥ拰涓嶆弧鑳藉惁鍙婃椂寰楀埌鍥炲簲锛�' },
- { id: 1, title: '绗�1棰橈細鎮ㄥ鎴戦櫌宸ヤ綔浜哄憳鐨勬湇鍔¤川閲忔弧鎰忎笉婊℃剰锛�' },
- { id: 5, title: '绗�5棰橈細鎮ㄥ鍖婚櫌鏈嶅姟璁炬柦鐨勬�讳綋鍗拌薄濡備綍锛�' },
- { id: 8, title: '绗�8棰橈細鍖荤敓瀵规偍鏄惁灏婇噸锛�' },
- { id: 12, title: '绗�12棰橈細鎶ゅ+瀵规偍鏄惁灏婇噸锛�' },
- { id: 15, title: '绗�15棰橈細鎮ㄥ棰勭害鎸傚彿鏄惁婊℃剰锛�' },
-];
const DEPTS = ['淇濆仴绉�', '浠嬪叆娌荤枟绉�', '涓撶鎶ゅ+闂ㄨ瘖', '搴峰鍖诲绉�', '鐨偆绉�', '鍐呭垎娉岀', '娑堝寲鍐呯', '鑲惧唴绉�', '鍛煎惛鍐呯', '蹇冭绠″唴绉�', '绁炵粡鍐呯', '琛�娑茬', '椋庢箍鍏嶇柅绉�', '鑲跨槫鍐呯', '鎰熸煋绉�', '鑰佸勾绉�', '鏅绉�', '楠ㄧ', '娉屽翱澶栫', '濡囦骇绉�'];
const WARDS = ['涓�鐥呭尯', '浜岀梾鍖�', '涓夌梾鍖�', '鍥涚梾鍖�', '浜旂梾鍖�', '鍏梾鍖�', '涓冪梾鍖�', '鍏梾鍖�'];
-// 纭畾鎬т吉闅忔満
-function hashString(str) {
- let h = 2166136261;
- for (let i = 0; i < str.length; i++) {
- h ^= str.charCodeAt(i);
- h = Math.imul(h, 16777619);
- }
- return h >>> 0;
-}
-function mulberry32(a) {
- return function () {
- a |= 0;
- a = (a + 0x6d2b79f5) | 0;
- let t = Math.imul(a ^ (a >>> 15), 1 | a);
- t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
- return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
- };
-}
-
export default {
name: 'ChartsPanel',
+ dicts: ['dimensionality_type'],
data() {
return {
queryParams: {
dateRange: [],
interval: 'month',
+ dimension: 'ward', // 缁熻缁村害锛歸ard=鎸夌梾鍖虹粺璁� dept=鎸夌瀹ょ粺璁�
},
deptOptions: DEPTS,
wardOptions: WARDS,
- questionOptions: QUESTIONS,
+ questionOptions: [],
// 鍗曢绛涢��
- singleQuestionId: 22,
+ singleQuestionId: null,
+ singleQuestionContent: '',
singleDeptWards: [],
// 鎺掑悕缁村害绛涢��
@@ -198,22 +191,44 @@
crossDeptWards: [],
// 鍥捐〃鏁版嵁
+ trendLoading: false,
+ categoryLoading: false,
+ hospitalLoading: false,
trend: { buckets: [], data: [], seriesName: '闂ㄨ瘖鎮h�呮弧鎰忓害' },
categoryCompare: { categories: [], seriesNames: [], series1: [], series2: [] },
hospitalCompare: { hospitals: [], seriesNames: [], series1: [], series2: [] },
+ // 鍗曢 / 鎺掑悕 / 浜ゅ弶琛ㄥ姞杞界姸鎬�
+ singleLoading: false,
+ questionLoading: false,
+ rankLoading: false,
+ crossLoading: false,
+
// 琛ㄦ牸鏁版嵁
singleQuestionData: [],
- singleQuestionMeta: { total: '0', score: '0.00%' },
- deptRankData: [],
- wardRankData: [],
- crossDeptData: [],
- crossWardData: [],
+ singleQuestionMeta: { total: '0', score: '0.00' },
+ rankData: [],
+ crossData: [],
};
},
computed: {
+ // 绉戝/鐥呭尯缂栫爜锛氫紭鍏堝彇褰撳墠鐢ㄦ埛鎵�灞烇紝鏃犲垯鍏滃簳鍚嶇О鏈韩浣滀负缂栫爜
+ deptCodeList() {
+ const list = this.$store.getters.belongDepts || [];
+ return list.length ? list : DEPTS.map((d) => ({ deptName: d, deptCode: d }));
+ },
+ wardCodeList() {
+ const list = this.$store.getters.belongWards || [];
+ return list.length ? list : WARDS.map((w) => ({ districtName: w, districtCode: w }));
+ },
+ defaultDeptCodes() {
+ return Array.from(new Set(this.deptCodeList.map((d) => d.deptCode)));
+ },
+ defaultWardCodes() {
+ return Array.from(new Set(this.wardCodeList.map((w) => w.districtCode)));
+ },
intervalLabel() {
- return { day: '鎸夊ぉ', month: '鎸夋湀', year: '鎸夊勾' }[this.queryParams.interval] || '鎸夋湀';
+ return { day: '鎸夊ぉ', week: '鎸夊懆', month: '鎸夋湀', year: '鎸夊勾' }[this.queryParams.interval] || '鎸夋湀';
},
trendMoM() {
const d = this.trend.data;
@@ -237,14 +252,10 @@
return this.crossDimension === 'dept' ? this.deptOptions : this.wardOptions;
},
rankRows() {
- const list = this.rankDimension === 'dept' ? this.deptRankData : this.wardRankData;
- if (!this.rankDeptWards.length) return list;
- return list.filter((r) => this.rankDeptWards.includes(r.name));
+ return this.rankData;
},
crossRows() {
- const list = this.crossDimension === 'dept' ? this.crossDeptData : this.crossWardData;
- if (!this.crossDeptWards.length) return list;
- return list.filter((r) => this.crossDeptWards.includes(r.name));
+ return this.crossData;
},
},
mounted() {
@@ -253,7 +264,26 @@
this.queryParams.dateRange = this.defaultRange();
}
this.initCharts();
+ // 鍒濆鍖栧嵆鏄剧ず鍚勬暟鎹潡鐨勫姞杞界姸鎬侊紝閬垮厤鍏堥棯鐜扳�滄殏鏃犳暟鎹��
+ this.trendLoading = true;
+ this.categoryLoading = true;
+ this.hospitalLoading = true;
+ this.singleLoading = true;
+ this.rankLoading = true;
+ this.crossLoading = true;
+ // 鏁版嵁鍧椾笌棰樼洰鍒楄〃骞惰鍔犺浇锛氭暟鎹潡涓嶄緷璧栭鐩垪琛紝鏃犻渶涓茶绛夊緟
this.refreshAll();
+ this.loadQuestions('').then(() => {
+ if (this.singleQuestionContent) {
+ // 鍗曢閫夐」缁熻 / 鍗曢浜ゅ弶鎺掑悕渚濊禆闂鏂囨湰锛岄鐩姞杞藉畬鎴愬悗琛ユ媺涓�娆�
+ this.fetchSingleQuestion();
+ this.fetchCross();
+ } else {
+ // 棰樼洰鍒楄〃涓虹┖鎴栧姞杞藉け璐ワ紝缁撴潫鍗曢鐩稿叧鍔犺浇鐘舵��
+ this.singleLoading = false;
+ this.crossLoading = false;
+ }
+ });
});
},
methods: {
@@ -269,9 +299,163 @@
if (c) c.resize();
});
},
+ // 缁村害缂栫爜 鈫� 瀛楀吀鍚嶇О锛坉imensionality_type锛�
+ getDimensionLabel(code) {
+ const dict = this.dict && this.dict.type && this.dict.type.dimensionality_type;
+ if (dict) {
+ const hit = dict.find((item) => String(item.value) === String(code));
+ if (hit) return hit.label;
+ }
+ return code == null ? '' : String(code);
+ },
+ // 鍙�夐鐩細杩滅▼妯$硦鎼滅储锛堟寜闂鍐呭 scriptContent锛�
+ searchQuestions(keyword) {
+ this.loadQuestions(keyword || '');
+ },
+ // 鍔犺浇鍙�夐鐩紙鍙傝�冮棶棰樺垪琛ㄩ〉 getissuelist锛�
+ async loadQuestions(keyword) {
+ this.questionLoading = true;
+ try {
+ const res = await getissuelist({
+ pageNum: 1,
+ pageSize: 50,
+ isavailable: '',
+ scriptContent: keyword || '',
+ });
+ const rows = (res && res.rows) || [];
+ this.questionOptions = rows.map((q) => ({
+ id: q.id,
+ scriptContent: q.scriptContent || q.title || '',
+ }));
+ // 鏃犲叧閿瓧鏃堕粯璁ら�変腑绗竴棰�
+ if (!keyword && this.questionOptions.length && !this.singleQuestionContent) {
+ const first = this.questionOptions[0];
+ this.singleQuestionId = first.id;
+ this.singleQuestionContent = first.scriptContent;
+ }
+ } catch (e) {
+ this.questionOptions = [];
+ } finally {
+ this.questionLoading = false;
+ }
+ },
+ onSingleQuestionChange(val) {
+ const q = this.questionOptions.find((o) => String(o.id) === String(val));
+ this.singleQuestionContent = q ? q.scriptContent : '';
+ this.refreshAll();
+ },
+ // 绉戝/鐥呭尯鍚嶇О 鈫� 缂栫爜
+ mapDeptNames(names) {
+ return names.map((n) => {
+ const hit = this.deptCodeList.find((d) => d.deptName === n);
+ return hit ? hit.deptCode : n;
+ });
+ },
+ mapWardNames(names) {
+ return names.map((n) => {
+ const hit = this.wardCodeList.find((w) => w.districtName === n);
+ return hit ? hit.districtCode : n;
+ });
+ },
+ // 缁煎悎寰楀垎锛堢湡瀹炲彛寰勶級锛毼�(閫夐」鍒嗗�� 脳 濉姤閲�) / 危(濉姤閲�)
+ scoreOfOptions(options) {
+ let num = 0;
+ let den = 0;
+ (options || []).forEach((o) => {
+ const c = Number(o && o.count) || 0;
+ const s = Number(o && o.score);
+ if (isNaN(s)) return;
+ num += s * c;
+ den += c;
+ });
+ if (!den) return '0.00';
+ return (num / den).toFixed(2);
+ },
+ // 瑙f瀽姣斾緥瀛楃涓诧細"14.29%"銆�"0"銆�"0.5" 鈫� 鏁板�硷紙鐧惧垎姣旓級锛涙棤鏁堣繑鍥� null
+ parsePercent(value) {
+ if (value == null || value === '') return null;
+ const n = Number(String(value).replace(/%/g, '').trim());
+ return isNaN(n) ? null : n;
+ },
+ // 鍗曢杩斿洖 List<QuestionResultDTO> 鈫� { options, total }
+ normalizeSingleQuestion(list) {
+ const arr = Array.isArray(list) ? list : (list && (list.list || list.rows)) || [];
+ const options = [];
+ let total = 0;
+ arr.forEach((item) => {
+ const details = Array.isArray(item && item.subtaskDetailRatioExportList)
+ ? item.subtaskDetailRatioExportList
+ : [];
+ details.forEach((d) => {
+ const option = (d && (d.optionresult || d.targetvalue || d.optioncontent || d.questiontext)) || '';
+ const count = Number(d && d.count) || 0;
+ const rawScore = Number(d && d.score);
+ const ratio = this.parsePercent(d && d.ratio);
+ options.push({ option, count, score: isNaN(rawScore) ? null : rawScore, ratio });
+ total += count;
+ });
+ });
+ return { options, total };
+ },
+ // 鍗曢閫夐」缁熻锛堢湡瀹炴帴鍙� /smartor/serviceSubtaskDetail/sltdMydTotalByScore锛�
+ async fetchSingleQuestion() {
+ const range = this.queryParams.dateRange || [];
+ if (range.length !== 2 || !range[0] || !range[1] || !this.singleQuestionContent) {
+ this.singleQuestionData = [];
+ this.singleQuestionMeta = { total: '0', score: '0.00' };
+ return;
+ }
+ this.singleLoading = true;
+ try {
+ const payload = {
+ deptOrDistrict: '1',
+ serviceTypeList: ['6', '14'],
+ startFinishTime: range[0],
+ endFinishTime: range[1],
+ questionContent: this.singleQuestionContent,
+ };
+ const sel = this.singleDeptWards || [];
+ if (this.queryParams.dimension === 'dept') {
+ const names = sel.map((s) => String(s).replace(/^dept:/, ''));
+ payload.leaveldeptcodes = names.length ? this.mapDeptNames(names) : this.defaultDeptCodes;
+ } else {
+ const names = sel.map((s) => String(s).replace(/^ward:/, ''));
+ payload.leavehospitaldistrictcodes = names.length ? this.mapWardNames(names) : this.defaultWardCodes;
+ }
+ const res = await sltdMydTotalByScore(payload);
+ console.log('[sltdMydTotalByScore 鍗曢] code=', res && res.code, 'data=', JSON.stringify(res && res.data).slice(0, 1500));
+ const list = res && res.code === 200 ? res.data : [];
+ const { options, total } = this.normalizeSingleQuestion(list);
+ this.singleQuestionData = options.map((o) => ({
+ option: o.option,
+ count: o.count,
+ rate: o.ratio != null
+ ? o.ratio.toFixed(2) + '%'
+ : (total ? ((o.count / total) * 100).toFixed(2) + '%' : '0.00%'),
+ }));
+ this.singleQuestionMeta = {
+ total: total.toLocaleString(),
+ score: this.scoreOfOptions(options),
+ };
+ if (!options.length) this.notify('褰撳墠鏉′欢涓嬫殏鏃犺棰樼殑閫夐」缁熻鏁版嵁', 'warning');
+ } catch (e) {
+ this.singleQuestionData = [];
+ this.singleQuestionMeta = { total: '0', score: '0.00' };
+ this.notify('鍗曢閫夐」缁熻鏁版嵁璇锋眰澶辫触锛岃绋嶅悗閲嶈瘯', 'error');
+ } finally {
+ this.singleLoading = false;
+ }
+ },
handleReset() {
this.queryParams.dateRange = this.defaultRange();
this.queryParams.interval = 'month';
+ this.queryParams.dimension = 'ward';
+ this.singleDeptWards = [];
+ this.refreshAll();
+ },
+ // 鍒囨崲鍏ㄥ眬缁熻缁村害鏃舵竻绌哄崟棰樼瓫閫夛紝淇濊瘉绉戝/鐥呭尯浜掓枼
+ onDimensionChange() {
+ this.singleDeptWards = [];
this.refreshAll();
},
onRankDimensionChange() {
@@ -285,7 +469,7 @@
defaultRange() {
const end = new Date();
const start = new Date();
- start.setDate(start.getDate() - 29);
+ start.setDate(start.getDate() - 91);
const f = (d) => {
const y = d.getFullYear();
const m = String(d.getMonth() + 1).padStart(2, '0');
@@ -298,6 +482,7 @@
intervalConfig() {
const buckets = this.genBuckets(this.queryParams.interval);
if (this.queryParams.interval === 'day') return { buckets, seriesNames: ['鏄ㄦ棩', '浠婃棩'] };
+ if (this.queryParams.interval === 'week') return { buckets, seriesNames: ['涓婂懆', '鏈懆'] };
if (this.queryParams.interval === 'year') return { buckets, seriesNames: ['鍘诲勾', '浠婂勾'] };
return { buckets, seriesNames: ['涓婃湀', '鏈湀'] };
},
@@ -312,6 +497,12 @@
d.setDate(end.getDate() - i);
buckets.push(`${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`);
}
+ } else if (type === 'week') {
+ for (let i = 5; i >= 0; i--) {
+ const d = new Date(end);
+ d.setDate(end.getDate() - i * 7);
+ buckets.push(`${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')} 鍛╜);
+ }
} else if (type === 'year') {
for (let i = 3; i >= 0; i--) buckets.push(String(end.getFullYear() - i));
} else {
@@ -322,83 +513,208 @@
}
return buckets;
},
- // 鍒锋柊鍏ㄩ儴鏁版嵁锛堟ā鎷燂紝鎺ュ彛灏辩华鍚庢浛鎹负鐪熷疄璇锋眰锛�
- refreshAll() {
- const baseChart = JSON.stringify(this.queryParams);
- const baseTime = JSON.stringify({ dateRange: this.queryParams.dateRange });
-
- // 鍥捐〃锛氬尯闂寸被鍨� + 鏃堕棿鑼冨洿
- this.genChartData(mulberry32(hashString(baseChart + 'charts')));
- // 鍗曢琛細鏃堕棿鑼冨洿 + 棰樼洰 + 绉戝/鐥呭尯
- this.genSingleData(mulberry32(hashString(baseTime + JSON.stringify({ sq: this.singleQuestionId, sdw: this.singleDeptWards }))));
- // 绉戝/鐥呭尯鎺掑悕锛氭椂闂磋寖鍥� + 缁村害 + 閫夋嫨
- this.genRankData(mulberry32(hashString(baseTime + JSON.stringify({ rd: this.rankDimension, rdw: this.rankDeptWards }))));
- // 鍗曢脳绉戝/鐥呭尯鎺掑悕锛氭椂闂磋寖鍥� + 缁村害 + 閫夋嫨 + 棰樼洰
- this.genCrossData(mulberry32(hashString(baseTime + JSON.stringify({ cd: this.crossDimension, cdw: this.crossDeptWards, sq: this.singleQuestionId }))));
+ // 鍒锋柊鍏ㄩ儴鏁版嵁锛堣秼鍔裤�佸垎绫荤淮搴︺�侀櫌鍖虹淮搴︺�佸崟棰樸�佹帓鍚嶃�佷氦鍙夊潎涓虹湡瀹炴帴鍙o級
+ async refreshAll() {
+ // 鍏釜鏁版嵁鍧楀苟琛屾媺鍙栵紝鍚勫尯鍧楀悓鏃舵樉绀哄悇鑷殑鍔犺浇鐘舵��
+ await Promise.all([
+ this.fetchTrend(),
+ this.fetchCategoryCompare(),
+ this.fetchHospitalCompare(),
+ this.fetchSingleQuestion(),
+ this.fetchRank(),
+ this.fetchCross(),
+ ]);
this.renderCharts();
},
- genChartData(rnd) {
- const jitter = (lo, hi) => lo + rnd() * (hi - lo);
- const cfg = this.intervalConfig();
- const buckets = cfg.buckets;
+ // 婊℃剰搴﹁秼鍔匡紙鐪熷疄鎺ュ彛锛夛細data = [{ period, totalScore }]
+ async fetchTrend() {
+ const range = this.queryParams.dateRange || [];
+ if (range.length !== 2 || !range[0] || !range[1]) {
+ this.trend = { buckets: [], data: [], seriesName: '闂ㄨ瘖鎮h�呮弧鎰忓害' };
+ return;
+ }
- this.trend = {
- buckets,
- seriesName: '闂ㄨ瘖鎮h�呮弧鎰忓害',
- data: buckets.map(() => Math.round(jitter(86, 90) * 100) / 100),
- };
-
- const categories = ['闅愮淇濇姢', '鐜涓庢爣璇�', '鍖诲姟浜哄憳鍥炲簲', '鍖荤敓娌熼��', '鎸傚彿浣撻獙', '鎶ゅ+娌熼��'];
- this.categoryCompare = {
- categories,
- seriesNames: cfg.seriesNames,
- series1: categories.map(() => Math.round(jitter(82, 88) * 100) / 100),
- series2: categories.map(() => Math.round(jitter(83, 89) * 100) / 100),
- };
-
- const hospitals = ['闄㈠尯涓�', '闄㈠尯浜�', '闄㈠尯涓�'];
- this.hospitalCompare = {
- hospitals,
- seriesNames: cfg.seriesNames,
- series1: hospitals.map(() => Math.round(jitter(85, 89) * 100) / 100),
- series2: hospitals.map(() => Math.round(jitter(86, 90) * 100) / 100),
+ this.trendLoading = true;
+ try {
+ const res = await mydTrend({
+ startFinishTime: range[0],
+ endFinishTime: range[1],
+ type: this.queryParams.interval, // day / week / month / year
+ });
+ const list = res && res.code === 200 && Array.isArray(res.data) ? res.data : [];
+ this.trend = {
+ seriesName: '闂ㄨ瘖鎮h�呮弧鎰忓害',
+ buckets: list.map((i) => String((i && i.period) || '')),
+ data: list.map((i) => {
+ const n = Number(i && i.totalScore);
+ return isNaN(n) ? 0 : Math.round(n * 100) / 100;
+ }),
+ };
+ if (!list.length) this.notify('褰撳墠鏉′欢涓嬫殏鏃犺秼鍔挎暟鎹�', 'warning');
+ } catch (e) {
+ this.trend = { buckets: [], data: [], seriesName: '闂ㄨ瘖鎮h�呮弧鎰忓害' };
+ this.notify('瓒嬪娍鏁版嵁璇锋眰澶辫触锛岃绋嶅悗閲嶈瘯', 'error');
+ } finally {
+ this.trendLoading = false;
+ }
+ },
+ notify(msg, type) {
+ const fn = { warning: 'warning', error: 'error', success: 'success' }[type] || 'info';
+ if (this.$message && this.$message[fn]) this.$message[fn](msg);
+ },
+ // 鍒嗙被缁村害瀵规瘮锛堢湡瀹炴帴鍙o級锛歞imensionType=1锛宒ata = [{ period, dimension, totalScore }]
+ async fetchCategoryCompare() {
+ const range = this.queryParams.dateRange || [];
+ if (range.length !== 2 || !range[0] || !range[1]) {
+ this.categoryCompare = { categories: [], seriesNames: [], series1: [], series2: [] };
+ return;
+ }
+ this.categoryLoading = true;
+ try {
+ const res = await sltdMydTotalByDimension({
+ startFinishTime: range[0],
+ endFinishTime: range[1],
+ type: this.queryParams.interval, // day / week / month / year
+ dimensionType: "1", // 1=鎸夋弧鎰忓害缁村害缁熻
+ });
+ // 鎺掓煡鐢細鎵撳嵃鎺ュ彛鍘熷杩斿洖锛屼究浜庢牳瀵瑰瓧娈靛悕锛堢‘璁ゆ棤璇悗鍙垹闄わ級
+ console.log("[sltdMydTotalByDimension dimensionType=1] code=", res && res.code, "data=", JSON.stringify(res && res.data).slice(0, 2000));
+ const list = res && res.code === 200 && Array.isArray(res.data) ? res.data : [];
+ // 缁村害缂栫爜 鈫� 瀛楀吀鍚嶇О锛屽苟杩囨护涓ゆ湡鍧囨棤鏁版嵁鐨勭淮搴�
+ const d = this.buildCompareData(list, (code) => this.getDimensionLabel(code));
+ this.categoryCompare = { categories: d.labels, seriesNames: d.seriesNames, series1: d.series1, series2: d.series2 };
+ if (!list.length) this.notify('褰撳墠鏉′欢涓嬫殏鏃犲垎绫荤淮搴︽暟鎹�', 'warning');
+ } catch (e) {
+ this.categoryCompare = { categories: [], seriesNames: [], series1: [], series2: [] };
+ this.notify('鍒嗙被缁村害鏁版嵁璇锋眰澶辫触锛岃绋嶅悗閲嶈瘯', 'error');
+ } finally {
+ this.categoryLoading = false;
+ }
+ },
+ // 闄㈠尯缁村害瀵规瘮锛堢湡瀹炴帴鍙o級锛歞imensionType=2锛宒ata = [{ period, dimension(闄㈠尯鍚�), totalScore }]
+ async fetchHospitalCompare() {
+ const range = this.queryParams.dateRange || [];
+ if (range.length !== 2 || !range[0] || !range[1]) {
+ this.hospitalCompare = { hospitals: [], seriesNames: [], series1: [], series2: [] };
+ return;
+ }
+ this.hospitalLoading = true;
+ try {
+ const res = await sltdMydTotalByDimension({
+ startFinishTime: range[0],
+ endFinishTime: range[1],
+ type: this.queryParams.interval, // day / week / month / year
+ dimensionType: "2", // 2=鎸夐櫌鍖虹粺璁�
+ });
+ // 鎺掓煡鐢細鎵撳嵃鎺ュ彛鍘熷杩斿洖锛屼究浜庢牳瀵瑰瓧娈靛悕锛堢‘璁ゆ棤璇悗鍙垹闄わ級
+ console.log("[sltdMydTotalByDimension dimensionType=2] code=", res && res.code, "data=", JSON.stringify(res && res.data).slice(0, 2000));
+ const list = res && res.code === 200 && Array.isArray(res.data) ? res.data : [];
+ const d = this.buildCompareData(list);
+ this.hospitalCompare = { hospitals: d.labels, seriesNames: d.seriesNames, series1: d.series1, series2: d.series2 };
+ if (!list.length) this.notify('褰撳墠鏉′欢涓嬫殏鏃犻櫌鍖虹淮搴︽暟鎹�', 'warning');
+ } catch (e) {
+ this.hospitalCompare = { hospitals: [], seriesNames: [], series1: [], series2: [] };
+ this.notify('闄㈠尯缁村害鏁版嵁璇锋眰澶辫触锛岃绋嶅悗閲嶈瘯', 'error');
+ } finally {
+ this.hospitalLoading = false;
+ }
+ },
+ // 灏� [{ period, dimension, totalScore }] 缁勮涓哄垎缁勬煴鐘跺浘鏁版嵁锛堜笂鏈�/鏈湡涓ょ粍瀵规瘮锛�
+ // labelFn锛氬彲閫夛紝鐢ㄤ簬鎶婄淮搴︾紪鐮佹槧灏勪负瀛楀吀鍚嶇О锛堝垎绫荤淮搴﹀浘浼犲叆锛�
+ buildCompareData(list, labelFn) {
+ const labels = [];
+ const byCat = {};
+ list.forEach((i) => {
+ // 缁村害缂栫爜锛坉imensionType=1锛夋垨闄㈠尯鍚嶇О锛坉imensionType=2锛夛紱鑻ュ悗绔瓧娈靛懡鍚嶄笉鍚岋紝鍏滃簳鍙� period
+ const key = (i && (i.dimension || i.campusName || i.campusid)) || (i && i.period) || '';
+ if (!key) return;
+ if (!byCat[key]) { byCat[key] = {}; labels.push(key); }
+ const n = Number(i.totalScore);
+ byCat[key][i.period] = isNaN(n) ? 0 : Math.round(n * 100) / 100;
+ });
+ // 鍚庣鎸夋椂闂村崌搴忚繑鍥烇紝鍙栨渶鍚庝袱涓懆鏈熶綔涓衡�滀笂鏈� / 鏈湡鈥�
+ const periods = [...new Set(list.map((i) => i && i.period).filter(Boolean))];
+ const cur = periods[periods.length - 1];
+ const prev = periods[periods.length - 2];
+ const val = (cat, p) => (p != null && byCat[cat][p] != null ? byCat[cat][p] : 0);
+ // 杩囨护涓ゆ湡鍧囨棤鏁版嵁鐨勭淮搴�
+ const cats = labels.filter((c) => val(c, prev) !== 0 || val(c, cur) !== 0);
+ const display = labelFn ? cats.map((c) => labelFn(c)) : cats;
+ return {
+ labels: display,
+ seriesNames: this.intervalConfig().seriesNames,
+ series1: cats.map((c) => val(c, prev)),
+ series2: cats.map((c) => val(c, cur)),
};
},
- genSingleData(rnd) {
- const jitter = (lo, hi) => lo + rnd() * (hi - lo);
- const scopeFactor = this.singleDeptWards.length ? 0.18 : 1;
- const total = Math.round(jitter(20000, 30000) * scopeFactor);
- const weights = [0.62, 0.27, 0.07, 0.04];
- const counts = weights.map((w) => Math.max(0, Math.round(total * w * jitter(0.92, 1.08))));
- const good = counts[0] + counts[1];
- this.singleQuestionData = QUESTION_OPTIONS.map((opt, i) => ({
- option: opt,
- count: counts[i],
- rate: ((counts[i] / total) * 100).toFixed(2) + '%',
+ // 绉戝/鐥呭尯缁村害 路 闂ㄨ瘖鎮h�呮弧鎰忓害寰楀垎鎺掑悕锛堢湡瀹炴帴鍙� /mzMydScoreRank锛屼笉甯﹂棶棰樻枃鏈級
+ async fetchRank() {
+ const range = this.queryParams.dateRange || [];
+ if (range.length !== 2 || !range[0] || !range[1]) {
+ this.rankData = [];
+ return;
+ }
+ this.rankLoading = true;
+ try {
+ const res = await mzMydScoreRank(this.buildRankPayload(this.rankDimension, this.rankDeptWards, ''));
+ this.rankData = this.normalizeRank(res);
+ if (!this.rankData.length) this.notify('褰撳墠鏉′欢涓嬫殏鏃犳帓鍚嶆暟鎹�', 'warning');
+ } catch (e) {
+ this.rankData = [];
+ this.notify('鎺掑悕鏁版嵁璇锋眰澶辫触锛岃绋嶅悗閲嶈瘯', 'error');
+ } finally {
+ this.rankLoading = false;
+ }
+ },
+ // 鍗曢脳绉戝/鐥呭尯 路 寰楀垎鎺掑悕锛堢湡瀹炴帴鍙� /mzMydScoreRank锛屽甫闂鏂囨湰锛�
+ async fetchCross() {
+ const range = this.queryParams.dateRange || [];
+ if (range.length !== 2 || !range[0] || !range[1] || !this.singleQuestionContent) {
+ this.crossData = [];
+ return;
+ }
+ this.crossLoading = true;
+ try {
+ const res = await mzMydScoreRank(this.buildRankPayload(this.crossDimension, this.crossDeptWards, this.singleQuestionContent));
+ this.crossData = this.normalizeRank(res);
+ if (!this.crossData.length) this.notify('褰撳墠鏉′欢涓嬫殏鏃犳帓鍚嶆暟鎹�', 'warning');
+ } catch (e) {
+ this.crossData = [];
+ this.notify('鎺掑悕鏁版嵁璇锋眰澶辫触锛岃绋嶅悗閲嶈瘯', 'error');
+ } finally {
+ this.crossLoading = false;
+ }
+ },
+ // 缁勮鎺掑悕鎺ュ彛璇锋眰浣擄紙dimensionType/serviceType/deptCodes/districtCodes/鏃堕棿/questionText锛�
+ buildRankPayload(dimension, selectedNames, questionText) {
+ const range = this.queryParams.dateRange || [];
+ const payload = {
+ dimensionType: dimension === 'dept' ? '1' : '2',
+ serviceTypes: ['6', '14'],
+ startFinishTime: range[0],
+ endFinishTime: range[1],
+ };
+ if (questionText) payload.questionText = questionText;
+ if (selectedNames && selectedNames.length) {
+ if (dimension === 'dept') {
+ payload.deptCodes = this.mapDeptNames(selectedNames);
+ } else {
+ payload.districtCodes = this.mapWardNames(selectedNames);
+ }
+ }
+ return payload;
+ },
+ // 褰掍竴鍖栨帓鍚嶈繑鍥� List<MzMydScoreRankDTO> 鈫� [{ rank, code, name, score, itemCount }]
+ normalizeRank(res) {
+ const list = res && res.code === 200 && Array.isArray(res.data) ? res.data : [];
+ return list.map((item) => ({
+ rank: item.rank,
+ code: item.code,
+ name: item.name,
+ score: item.score,
+ itemCount: item.itemCount,
}));
- this.singleQuestionMeta = {
- total: total.toLocaleString(),
- score: ((good / total) * 100).toFixed(2) + '%',
- };
- },
- genRankData(rnd) {
- const jitter = (lo, hi) => lo + rnd() * (hi - lo);
- this.deptRankData = DEPTS
- .map((d) => ({ name: d, score: jitter(70, 85).toFixed(2) }))
- .sort((a, b) => Number(b.score) - Number(a.score));
- this.wardRankData = WARDS
- .map((w) => ({ name: w, score: jitter(70, 85).toFixed(2) }))
- .sort((a, b) => Number(b.score) - Number(a.score));
- },
- genCrossData(rnd) {
- const jitter = (lo, hi) => lo + rnd() * (hi - lo);
- this.crossDeptData = DEPTS
- .map((d) => ({ name: d, score: jitter(70, 85).toFixed(2) }))
- .sort((a, b) => Number(b.score) - Number(a.score));
- this.crossWardData = WARDS
- .map((w) => ({ name: w, score: jitter(70, 85).toFixed(2) }))
- .sort((a, b) => Number(b.score) - Number(a.score));
},
renderCharts() {
const c1 = echarts.getInstanceByDom(this.$refs.chart1);
@@ -433,22 +749,46 @@
});
// 2. 鍒嗙粍鏌辩姸鍥� - 鍒嗙被缁村害
- c2.setOption({
+ // 鍒嗙被杈冨锛堝鍗佸嚑涓弧鎰忓害缁村害锛夋椂搴曢儴鍚嶇О浼氶噸鍙狅紝杩欓噷鎸夋暟閲忓姩鎬侀�傞厤锛�
+ // 鈮�6 涓細姝e父姘村钩鏍囩锛�
+ // 7~10 涓細x 杞存爣绛惧�炬枩 35掳 + 搴曢儴鐣欑櫧鍔犲ぇ + 鏌卞瓙鍙樼粏锛�
+ // >10 涓細鍐嶅惎鐢ㄦí鍚戠缉鏀撅紙鍒濆鏄剧ず绾� 8 涓垎绫伙紝鍙嫋鍔�/婊氬姩鏌ョ湅鍏朵綑锛夈��
+ const catCategories = this.categoryCompare.categories || [];
+ const catN = catCategories.length;
+ const catRotate = catN > 6 ? 35 : 0;
+ const catEnableZoom = catN > 10;
+ const catBarWidth = catN > 10 ? 18 : catN > 6 ? 20 : 22;
+ const catLegend = catEnableZoom
+ ? { data: this.categoryCompare.seriesNames, top: 4, textStyle: { color: '#666', fontSize: 12 } }
+ : { data: this.categoryCompare.seriesNames, bottom: 8, textStyle: { color: '#666', fontSize: 12 } };
+ const catGrid = catEnableZoom
+ ? { top: 36, right: 30, bottom: 80, left: 85 }
+ : { top: 48, right: 30, bottom: catRotate ? 100 : 60, left: 85 };
+ const catOption = {
color: ['#6DC8EC', '#5B8FF9'],
- grid: barGrid,
+ grid: catGrid,
tooltip: { ...baseTooltip, trigger: 'axis', axisPointer: { type: 'shadow', shadowStyle: { color: 'rgba(0,0,0,0.03)' } } },
- legend: { data: this.categoryCompare.seriesNames, bottom: 8, textStyle: { color: '#666', fontSize: 12 } },
- xAxis: [{ ...baseXAxis, data: this.categoryCompare.categories, axisLabel: { ...baseXAxis.axisLabel, interval: 0 } }],
+ legend: catLegend,
+ xAxis: [{ ...baseXAxis, data: catCategories, axisLabel: { ...baseXAxis.axisLabel, interval: 0, rotate: catRotate } }],
yAxis: [{ ...baseYAxis, name: '寰楀垎', nameTextStyle: { color: '#999', fontSize: 11 } }],
series: [
- { name: this.categoryCompare.seriesNames[0], type: 'bar', barWidth: 22, barGap: '30%',
+ { name: this.categoryCompare.seriesNames[0], type: 'bar', barWidth: catBarWidth, barGap: '30%',
itemStyle: { borderRadius: [6, 6, 0, 0], color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: '#6DC8EC' }, { offset: 1, color: '#48B0D5' }]) },
data: this.categoryCompare.series1 },
- { name: this.categoryCompare.seriesNames[1], type: 'bar', barWidth: 22,
+ { name: this.categoryCompare.seriesNames[1], type: 'bar', barWidth: catBarWidth,
itemStyle: { borderRadius: [6, 6, 0, 0], color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: '#5B8FF9' }, { offset: 1, color: '#3D6FDB' }]) },
data: this.categoryCompare.series2 },
],
- });
+ };
+ if (catEnableZoom) {
+ // 鍒濆鍙睍绀哄墠 8 涓垎绫诲搴︼紝閬垮厤鏌卞瓙鎸ゆ垚涓�鍥紝鐢ㄦ埛鍙í鍚戞粴鍔�/鎷栧姩鏌ョ湅鍏朵綑
+ const zoomEnd = catN > 0 ? Math.min(100, Math.round((8 / catN) * 100)) : 100;
+ catOption.dataZoom = [
+ { type: 'inside', start: 0, end: zoomEnd },
+ { type: 'slider', height: 16, bottom: 4, start: 0, end: zoomEnd },
+ ];
+ }
+ c2.setOption(catOption);
// 4. 闄㈠尯缁村害 - 鍒嗙粍鏌辩姸鍥�
c4.setOption({
@@ -527,6 +867,8 @@
.filter-bar { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; .filter-label { font-size: 13px; color: #606266; } .filter-date { width: 260px; } }
.chart-card { margin-bottom: 0; }
.chart-box { width: 100%; height: 360px; }
+.chart-wrap { position: relative; width: 100%; }
+.chart-empty { position: absolute; top: 0; left: 0; right: 0; bottom: 0; display: flex; align-items: center; justify-content: center; background: #fff; color: #909399; font-size: 14px; }
.card-header { display: flex; justify-content: space-between; align-items: center; span { font-size: 15px; font-weight: 600; color: #303133; } }
.header-right { display: flex; align-items: center; gap: 10px; .sel { width: 140px; } .sel-lg { width: 240px; } }
.table-footer { text-align: right; padding: 10px 0 0; font-size: 13px; color: #606266; }
diff --git a/src/views/Satisfaction/sfstatistics/components/DataOverview.vue b/src/views/Satisfaction/sfstatistics/components/DataOverview.vue
index 1987125..2cfa325 100644
--- a/src/views/Satisfaction/sfstatistics/components/DataOverview.vue
+++ b/src/views/Satisfaction/sfstatistics/components/DataOverview.vue
@@ -3,7 +3,7 @@
<!-- 椤堕儴绛涢�夛細鏃堕棿鑼冨洿 + 绉戝/鐥呭尯锛屾帶鍒舵湰椤垫墍鏈夋暟鎹� -->
<el-card shadow="never" class="overview-card filter-card">
<el-form inline class="filter-form">
- <el-form-item label="鏃堕棿鑼冨洿">
+ <el-form-item label="鍑洪櫌鏃ユ湡">
<el-date-picker
v-model="queryParams.dateRange"
type="daterange"
@@ -14,49 +14,117 @@
size="small"
/>
</el-form-item>
- <el-form-item label="绉戝/鐥呭尯">
+ <el-form-item label="缁熻缁村害">
+ <el-radio-group
+ v-model="queryParams.statMode"
+ size="small"
+ @change="onStatModeChange"
+ >
+ <el-radio-button label="ward">鎸夌梾鍖虹粺璁�</el-radio-button>
+ <el-radio-button label="dept">鎸夌瀹ょ粺璁�</el-radio-button>
+ </el-radio-group>
+ </el-form-item>
+ <el-form-item label="绉戝" v-if="queryParams.statMode === 'dept'">
<el-select
- v-model="queryParams.deptWard"
+ v-model="queryParams.deptCodes"
+ multiple
+ collapse-tags
clearable
filterable
- placeholder="鍏ㄩ儴"
+ placeholder="鍏ㄩ儴绉戝"
size="small"
class="filter-select"
>
- <el-option-group label="绉戝">
- <el-option
- v-for="d in deptOptions"
- :key="'dept:' + d"
- :label="d"
- :value="'dept:' + d"
- />
- </el-option-group>
- <el-option-group label="鐥呭尯">
- <el-option
- v-for="w in wardOptions"
- :key="'ward:' + w"
- :label="w"
- :value="'ward:' + w"
- />
- </el-option-group>
+ <el-option
+ v-for="d in deptOptions"
+ :key="d.value"
+ :label="d.label"
+ :value="d.value"
+ />
+ </el-select>
+ </el-form-item>
+ <el-form-item label="鐥呭尯" v-else>
+ <el-select
+ v-model="queryParams.wardCodes"
+ multiple
+ collapse-tags
+ clearable
+ filterable
+ placeholder="鍏ㄩ儴鐥呭尯"
+ size="small"
+ class="filter-select"
+ >
+ <el-option
+ v-for="w in wardOptions"
+ :key="w.value"
+ :label="w.label"
+ :value="w.value"
+ />
+ </el-select>
+ </el-form-item>
+ <el-form-item label="鏈嶅姟绫诲瀷">
+ <el-select
+ v-model="queryParams.serviceTypeList"
+ multiple
+ collapse-tags
+ clearable
+ filterable
+ placeholder="鍏ㄩ儴绫诲瀷"
+ size="small"
+ class="filter-select"
+ >
+ <el-option
+ v-for="s in serviceTypeOptions"
+ :key="s.value"
+ :label="s.label"
+ :value="s.value"
+ />
</el-select>
</el-form-item>
<el-form-item>
- <el-button type="primary" size="small" icon="el-icon-search" @click="fetchData">鏌ヨ</el-button>
- <el-button size="small" icon="el-icon-refresh" @click="handleReset">閲嶇疆</el-button>
+ <el-button
+ type="primary"
+ size="small"
+ icon="el-icon-search"
+ :loading="loading"
+ @click="fetchData"
+ >鏌ヨ</el-button
+ >
+ <el-button size="small" icon="el-icon-refresh" @click="handleReset"
+ >閲嶇疆</el-button
+ >
</el-form-item>
</el-form>
</el-card>
- <!-- 琛ㄦ牸涓�锛氬悇鏈嶅姟椤圭洰婊℃剰搴︾粺璁★紙鍥哄畾浜旈」閫夐」鐨勯鐩級 -->
+ <!-- 琛ㄦ牸涓�锛氬悇鏈嶅姟椤圭洰婊℃剰搴︾粺璁★紙鍥哄畾鍏」閫夐」鐨勯鐩級 -->
<el-card shadow="never" class="overview-card">
<div slot="header" class="card-header">
<span class="card-title">鍚勬湇鍔¢」鐩弧鎰忓害缁熻</span>
- <el-button type="warning" size="small" icon="el-icon-download" @click="exportTable('table1')">瀵煎嚭Excel</el-button>
+ <el-button
+ type="warning"
+ size="small"
+ icon="el-icon-download"
+ @click="exportTable('table1')"
+ >瀵煎嚭Excel</el-button
+ >
</div>
- <el-table id="table1" :data="serviceSatisfaction" border size="small" :header-cell-style="{ background: '#f5f7fa', color: '#303133' }">
- <el-table-column prop="category" label="鍒嗙被/棰樼洰" min-width="220" fixed="left" />
- <el-table-column label="闈炲父婊℃剰" align="center">
+ <el-table
+ id="table1"
+ v-loading="loading"
+ element-loading-text="缁熻涓�..."
+ :data="serviceSatisfaction"
+ border
+ size="small"
+ :header-cell-style="{ background: '#f5f7fa', color: '#303133' }"
+ >
+ <el-table-column
+ prop="category"
+ label="鍒嗙被/棰樼洰"
+ min-width="220"
+ fixed="left"
+ />
+ <el-table-column label="寰堟弧鎰�" align="center">
<el-table-column prop="veryGoodCount" label="鏁伴噺" width="90" />
<el-table-column prop="veryGoodRate" label="姣斾緥" width="90" />
</el-table-column>
@@ -72,11 +140,21 @@
<el-table-column prop="badCount" label="鏁伴噺" width="90" />
<el-table-column prop="badRate" label="姣斾緥" width="90" />
</el-table-column>
- <el-table-column label="涓嶉�傜敤" align="center">
+ <el-table-column label="寰堜笉婊℃剰" align="center">
+ <el-table-column prop="veryBadCount" label="鏁伴噺" width="90" />
+ <el-table-column prop="veryBadRate" label="姣斾緥" width="90" />
+ </el-table-column>
+ <el-table-column label="鏈粡鍘�" align="center">
<el-table-column prop="naCount" label="鏁伴噺" width="90" />
<el-table-column prop="naRate" label="姣斾緥" width="90" />
</el-table-column>
- <el-table-column prop="score" label="缁煎悎寰楀垎" width="100" align="center" />
+ <el-table-column
+ prop="score"
+ label="缁煎悎寰楀垎"
+ width="100"
+ align="center"
+ fixed="right"
+ />
</el-table>
</el-card>
@@ -84,17 +162,59 @@
<el-card shadow="never" class="overview-card">
<div slot="header" class="card-header">
<span class="card-title">鍗曢�夐/澶氶�夐缁熻</span>
- <el-button type="warning" size="small" icon="el-icon-download" @click="exportTable('table2')">瀵煎嚭Excel</el-button>
+ <div class="header-right">
+ <el-input
+ v-model="questionSearch"
+ size="small"
+ clearable
+ prefix-icon="el-icon-search"
+ placeholder="鎸夐鐩ā绯婃煡璇�"
+ class="search-input"
+ />
+ <el-button
+ type="warning"
+ size="small"
+ icon="el-icon-download"
+ @click="exportTable('table2')"
+ >瀵煎嚭Excel</el-button
+ >
+ </div>
</div>
- <div id="table2">
- <div class="question-block" v-for="(q, qi) in questionStats" :key="qi">
- <h4 class="q-title">{{ q.title }}</h4>
- <el-table :data="q.options" border size="small" :header-cell-style="{ background: '#f5f7fa', color: '#303133' }">
- <el-table-column prop="option" label="閫夐」" min-width="180" />
- <el-table-column prop="count" label="鏁伴噺" width="100" align="center" />
- <el-table-column prop="rate" label="姣斾緥" width="100" align="center" />
- </el-table>
- <div v-if="q.total" class="q-footer">鏈鏈夋晥濉啓浜烘锛�<b>{{ q.total }}</b></div>
+ <div id="table2" v-loading="loading" element-loading-text="缁熻涓�...">
+ <div class="table2-scroll">
+ <div
+ class="question-block"
+ v-for="(q, qi) in filteredQuestionStats"
+ :key="qi"
+ >
+ <h4 class="q-title">{{ q.title }}</h4>
+ <el-table
+ :data="q.options"
+ border
+ size="small"
+ :header-cell-style="{ background: '#f5f7fa', color: '#303133' }"
+ >
+ <el-table-column prop="option" label="閫夐」" min-width="180" />
+ <el-table-column
+ prop="count"
+ label="鏁伴噺"
+ width="100"
+ align="center"
+ />
+ <el-table-column
+ prop="rate"
+ label="姣斾緥"
+ width="100"
+ align="center"
+ />
+ </el-table>
+ <div v-if="q.total" class="q-footer">
+ 鏈濉姤鎬婚噺锛�<b>{{ q.total }}</b>
+ </div>
+ </div>
+ <div v-if="!loading && !filteredQuestionStats.length" class="empty-tip">
+ {{ questionStats.length ? "鏈壘鍒板尮閰嶇殑棰樼洰" : "鏆傛棤鍗曢��/澶氶�夐缁熻鏁版嵁" }}
+ </div>
</div>
</div>
</el-card>
@@ -104,149 +224,336 @@
<div slot="header" class="card-header">
<span class="card-title">鍚勭瀹�/鐥呭尯婊℃剰搴﹁瘎鍒嗗姣�</span>
<div class="header-right">
- <el-radio-group v-model="statDimension" size="small" @change="onStatDimensionChange">
+ <el-radio-group
+ v-model="statDimension"
+ size="small"
+ @change="onStatDimensionChange"
+ >
<el-radio-button label="dept">鎸夌瀹�</el-radio-button>
<el-radio-button label="ward">鎸夌梾鍖�</el-radio-button>
</el-radio-group>
- <el-select v-model="statDeptWard" size="small" class="stat-select" placeholder="娌跨敤椤堕儴鏉′欢">
+ <el-select
+ v-model="statDeptWard"
+ size="small"
+ class="stat-select"
+ placeholder="娌跨敤椤堕儴鏉′欢"
+ >
<el-option label="娌跨敤椤堕儴鏉′欢" value="inherit" />
<template v-if="statDimension === 'dept'">
- <el-option v-for="d in deptOptions" :key="'dept:' + d" :label="d" :value="'dept:' + d" />
+ <el-option
+ v-for="d in deptOptions"
+ :key="'dept:' + d.value"
+ :label="d.label"
+ :value="'dept:' + d.value"
+ />
</template>
<template v-else>
- <el-option v-for="w in wardOptions" :key="'ward:' + w" :label="w" :value="'ward:' + w" />
+ <el-option
+ v-for="w in wardOptions"
+ :key="'ward:' + w.value"
+ :label="w.label"
+ :value="'ward:' + w.value"
+ />
</template>
</el-select>
- <el-button type="warning" size="small" icon="el-icon-download" @click="exportTable('table3')">瀵煎嚭Excel</el-button>
+ <el-button
+ type="warning"
+ size="small"
+ icon="el-icon-download"
+ @click="exportTable('table3')"
+ >瀵煎嚭Excel</el-button
+ >
</div>
</div>
- <el-table id="table3" :data="table3Rows" border size="small" :header-cell-style="{ background: '#f5f7fa', color: '#303133' }">
- <el-table-column prop="name" :label="statDimension === 'dept' ? '绉戝' : '鐥呭尯'" fixed="left" align="center" />
- <el-table-column label="绗�1棰�" align="center">
- <el-table-column prop="q1VeryGood" label="闈炲父婊℃剰" width="100" />
- <el-table-column prop="q1Good" label="婊℃剰" width="90" />
- <el-table-column prop="q1Normal" label="涓�鑸�" width="90" />
- <el-table-column prop="q1Bad" label="涓嶆弧鎰�" width="90" />
- <el-table-column prop="q1Score" label="寰楀垎" width="100" />
+ <el-table
+ id="table3"
+ v-loading="loading"
+ element-loading-text="缁熻涓�..."
+ :data="table3Rows"
+ border
+ size="small"
+ max-height="500"
+ :header-cell-style="{ background: '#f5f7fa', color: '#303133' }"
+ >
+ <el-table-column
+ prop="name"
+ :label="statDimension === 'dept' ? '绉戝' : '鐥呭尯'"
+ fixed="left"
+ align="center"
+ />
+ <el-table-column
+ v-for="q in table3Questions"
+ :key="q.title"
+ :label="q.title"
+ align="center"
+ >
+ <el-table-column
+ v-for="opt in q.options"
+ :key="opt"
+ :label="opt"
+ width="100"
+ >
+ <template slot-scope="{ row }">
+ {{
+ (row.cells[q.title] &&
+ row.cells[q.title][opt] &&
+ row.cells[q.title][opt].count) ||
+ 0
+ }}
+ </template>
+ </el-table-column>
+ <el-table-column label="寰楀垎" width="90">
+ <template slot-scope="{ row }">
+ {{ (row.cells[q.title] && row.cells[q.title]._score) || "0.00" }}
+ </template>
+ </el-table-column>
</el-table-column>
- <el-table-column label="绗�2棰�" align="center">
- <el-table-column prop="q2VeryGood" label="闈炲父婊℃剰" width="100" />
- <el-table-column prop="q2Good" label="婊℃剰" width="90" />
- <el-table-column prop="q2Normal" label="涓�鑸�" width="90" />
- <el-table-column prop="q2Bad" label="涓嶆弧鎰�" width="90" />
- <el-table-column prop="q2Score" label="寰楀垎" width="100" />
+ <el-table-column label="缁煎悎寰楀垎" align="center">
+ <template slot-scope="{ row }">
+ {{ row.totalScore }}
+ </template>
</el-table-column>
- <el-table-column prop="totalScore" label="缁煎悎寰楀垎" align="center" />
</el-table>
</el-card>
</div>
</template>
<script>
-import XLSX from 'xlsx';
+import { sltdMydTotalByScore,statQuestionOptionByKsOrBq } from "@/api/AiCentre/satisfaction";
+import XLSX from "xlsx";
-// 婊℃剰搴﹂鐨勫浐瀹氶�夐」锛堥『搴忓嵆琛ㄦ牸鍒楅『搴忥級
-const FIXED_OPTIONS = ['闈炲父婊℃剰', '婊℃剰', '涓�鑸�', '涓嶆弧鎰�', '涓嶉�傜敤'];
-const DEPTS = ['鍐呭垎娉岀', '鐨偆绉�', '鑲跨槫鍐呯', '娑堝寲鍐呯', '鑲惧唴绉�'];
-const WARDS = ['涓�鐥呭尯', '浜岀梾鍖�', '涓夌梾鍖�', '鍥涚梾鍖�', '浜旂梾鍖�'];
+// 婊℃剰搴﹂鐨勫浐瀹氶�夐」锛堥『搴忓嵆琛ㄦ牸鍒楅『搴忥級鈥斺�旇繖浜涢�夐」鐨勯鐩繘琛ㄤ竴锛屽叾浣欒繘琛ㄤ簩
+const FIXED_OPTIONS = ["寰堟弧鎰�", "婊℃剰", "涓�鑸�", "涓嶆弧鎰�", "寰堜笉婊℃剰", "鏈粡鍘�"];
+// 鏃犲垎鍊奸�夐」锛堝"鏈粡鍘�"锛夋槸鍚﹁鍏ョ患鍚堝緱鍒嗗垎姣嶏細榛樿 false锛岄伩鍏嶆媺浣庡緱鍒�
+const NO_SCORE_IN_DENOMINATOR = false;
-// 婊℃剰搴﹂锛堝浐瀹氫簲椤归�夐」锛宑ounts 椤哄簭瀵瑰簲 FIXED_OPTIONS锛�
-const SATISFACTION_BASE = [
- ['璇婄枟杩囩▼涓紝鍖诲姟浜哄憳鏄惁娉ㄦ剰淇濇姢鎮ㄧ殑闅愮锛�', [3219, 1351, 142, 33, 0]],
- ['鎮ㄥ鍖婚櫌鏈嶅姟璁炬柦鐨勬�讳綋鍗拌薄濡備綍锛�', [3110, 1369, 217, 49, 0]],
- ['鍖婚櫌鐨勫帟鎵�鏄惁娓呮磥鏃犲紓鍛筹紵', [2973, 1504, 235, 33, 0]],
- ['鍖婚櫌鍐呯殑璺爣鍜屾寚绀烘槸鍚︽槑纭紵', [3234, 1289, 196, 26, 0]],
- ['鍖婚櫌鐨勭┖闂村竷灞�鏄惁渚垮埄锛�', [3037, 1460, 209, 39, 0]],
- ['鐪嬬梾鏈熼棿锛屾偍鐨勬姳鎬ㄥ拰涓嶆弧鑳藉惁鍙婃椂寰楀埌鍥炲簲锛�', [3019, 1317, 294, 115, 0]],
- ['鍖荤敓鏄惁鐢ㄦ偍鍚緱鎳傜殑鏂瑰紡瑙i噴闂锛�', [3402, 967, 254, 122, 0]],
- ['鍖荤敓瀵规偍鏄惁灏婇噸锛�', [3495, 897, 249, 104, 0]],
- ['鍖荤敓鏄惁浠旂粏鍊惧惉鎮ㄨ璇濓紵', [3422, 937, 251, 135, 0]],
- ['瀵规寕鍙锋湇鍔′汉鍛樻湇鍔℃�佸害鏄惁婊℃剰', [3458, 1205, 52, 30, 0]],
- ['鎮ㄥ棰勭害鎸傚彿鏄惁婊℃剰锛�', [3527, 1088, 72, 58, 0]],
- ['鎶ゅ+瀵规偍鏄惁灏婇噸锛�', [3420, 1184, 113, 28, 0]],
- ['鎶ゅ+鏄惁鐢ㄦ偍鍚緱鎳傜殑鏂瑰紡瑙i噴闂锛�', [3346, 1250, 122, 27, 0]],
- ['鎶ゅ+鏄惁浠旂粏鍊惧惉鎮ㄨ璇濓紵', [3378, 1205, 134, 28, 0]],
+// 鏈嶅姟绫诲瀷瀛楀吀锛堟帴鍙� serviceType锛�
+const SERVICE_TYPES = [
+ { value: "1", label: "鐩戞祴璇勪及" },
+ { value: "2", label: "鍑洪櫌闅忚" },
+ { value: "3", label: "闂ㄨ瘖闅忚" },
+ { value: "4", label: "瀹f暀鍏虫��" },
+ { value: "5", label: "澶嶈瘖閫氱煡" },
+ { value: "6", label: "婊℃剰搴﹁皟鏌�" },
+ { value: "7", label: "鎮h�呮姤鍛�" },
+ { value: "8", label: "鍏朵粬閫氱煡" },
+ { value: "9", label: "浣撴闅忚" },
+ { value: "10", label: "鍖绘妧闅忚" },
+ { value: "11", label: "褰卞儚涓撶闅忚" },
+ { value: "12", label: "蹇冪數涓撶闅忚" },
+ { value: "13", label: "涓撶闅忚" },
];
-// 鍏朵綑棰樼洰锛堝崟閫�/澶氶�夛紝闈炲浐瀹氭弧鎰忓害閫夐」锛�
-const OTHER_BASE = [
- {
- title: '鎮ㄥ鎴戦櫌宸ヤ綔浜哄憳鐨勬湇鍔¤川閲忔弧鎰忎笉婊℃剰锛熴�愬垎鍊煎崟閫夐銆�',
- type: 'single',
- options: [['闈炲父婊℃剰', 1084], ['婊℃剰', 1959], ['涓�鑸�', 167], ['涓嶆弧鎰�', 153]],
- },
- {
- title: '鎮ㄥ鍝儴鍒嗘湇鍔′笉婊℃剰锛熴�愬閫夐銆�',
- type: 'multiple',
- total: 408,
- options: [['鍖荤敓璇婃柇鍜岃瘖鐤�', 131], ['鎶ょ悊鏈嶅姟', 47], ['鍏朵粬鍖诲姟浜哄憳鎶�鏈按骞�', 30], ['宸ヤ汉', 72]],
- },
- {
- title: '鍖荤敓璇婃柇鍜屾不鐤椾腑鍝簺鏈嶅姟璐ㄩ噺涓嶆弧鎰忥紵銆愬閫夐銆�',
- type: 'multiple',
- total: 131,
- options: [['鍖荤敓璇婃柇閿欒', 23], ['瀵规不鐤楁晥鏋滀笉婊℃剰', 72], ['鍏朵粬', 54]],
- },
-];
+// 鏈嶅姟绫诲瀷榛樿閫変腑椤癸紙鎸� label 鍖归厤锛岄�傞厤涓嶅悓瀛楀吀鐨� value 宸紓锛�
+const DEFAULT_SERVICE_LABELS = ["浣忛櫌婊℃剰搴�", "闂ㄨ瘖婊℃剰搴�"];
-// 缁熶竴鎺ュ彛杩斿洖鐨勯鐩紙妯℃嫙锛夛細鍥哄畾浜旈」閫夐」 => 琛ㄤ竴锛屽叾浣� => 琛ㄤ簩
-const RAW_QUESTIONS = [
- ...SATISFACTION_BASE.map(([title, counts]) => ({
- title,
- type: 'single',
- options: FIXED_OPTIONS.map((opt, i) => ({ option: opt, count: counts[i] })),
- })),
- ...OTHER_BASE.map((q) => ({
- title: q.title,
- type: q.type,
- total: q.total,
- options: q.options.map(([option, count]) => ({ option, count })),
- })),
-];
+// 鍏滃簳锛歴tore 涓棤绉戝/鐥呭尯鏁版嵁鏃朵娇鐢紙琛ㄤ笁瀵规瘮 + 绛涢�変笅鎷夛級
+const DEPTS = ["鍐呭垎娉岀", "鐨偆绉�", "鑲跨槫鍐呯", "娑堝寲鍐呯", "鑲惧唴绉�"];
+const WARDS = ["涓�鐥呭尯", "浜岀梾鍖�", "涓夌梾鍖�", "鍥涚梾鍖�", "浜旂梾鍖�"];
-// 纭畾鎬т吉闅忔満锛堜究浜庣瓫閫夋潯浠跺浐瀹氭椂缁撴灉绋冲畾锛�
-function hashString(str) {
- let h = 2166136261;
- for (let i = 0; i < str.length; i++) {
- h ^= str.charCodeAt(i);
- h = Math.imul(h, 16777619);
- }
- return h >>> 0;
-}
-function mulberry32(a) {
- return function () {
- a |= 0;
- a = (a + 0x6d2b79f5) | 0;
- let t = Math.imul(a ^ (a >>> 15), 1 | a);
- t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
- return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
+/**
+ * 鎺ュ彛鏁版嵁 鈫� 椤甸潰鍐呴儴棰樼洰缁撴瀯
+ * 鍏ュ弬锛氭帴鍙� data锛圠ist<QuestionResultDTO>锛�
+ * 鍑哄弬锛歔{ title, type, total, options: [{ option, count, score }] }]
+ * 鍚屼竴棰樼洰鍙兘鍒嗘暎鍦ㄥ涓换鍔★紙taskname锛夐噷锛岃繖閲屾寜銆岄鐩� + 閫夐」銆嶅悎骞剁疮鍔犳暟閲�
+ */
+function normalizeQuestions(list) {
+ const map = new Map();
+
+ // 鍏ュ弬鍙兘鏄暟缁� / {list} / {rows} / 鍗曞璞★紝缁熶竴瑙勬暣鎴愭暟缁�
+ const arr = Array.isArray(list)
+ ? list
+ : (list &&
+ (Array.isArray(list.list)
+ ? list.list
+ : Array.isArray(list.rows)
+ ? list.rows
+ : [list])) ||
+ [];
+
+ // 棰樼洰鏂囨湰瀛楁鍊欓�夛紙鏈郴缁熼鐩唴瀹圭粺涓�鍙� scriptContent锛屽吋瀹瑰巻鍙插懡鍚嶏級
+ const pickTitle = (item) => {
+ const keys = [
+ "scriptContent",
+ "questionText",
+ "qeustionText",
+ "questiontext",
+ "scriptcontent",
+ "title",
+ "name",
+ "questionName",
+ ];
+ for (const k of keys) {
+ if (item && item[k] != null && String(item[k]).trim()) {
+ return String(item[k]).trim();
+ }
+ }
+ return "";
};
+
+ // 閫夐」鏄庣粏鍒楄〃瀛楁鍊欓��
+ const pickDetails = (item) => {
+ const keys = [
+ "subtaskDetailRatioExportList",
+ "details",
+ "optionList",
+ "options",
+ "optionResultList",
+ "subtaskDetailRatioExportlist",
+ "list",
+ ];
+ for (const k of keys) {
+ if (item && Array.isArray(item[k])) return item[k];
+ }
+ return [];
+ };
+
+ // 閫夐」鏂囨湰瀛楁鍊欓��
+ const pickOption = (d) => {
+ const keys = [
+ "optionresult",
+ "optioncontent",
+ "optionText",
+ "targetvalue",
+ "optionName",
+ "name",
+ "option",
+ "content",
+ ];
+ for (const k of keys) {
+ if (d && d[k] != null && String(d[k]).trim()) {
+ return String(d[k]).trim();
+ }
+ }
+ return "";
+ };
+
+ // 鏁伴噺瀛楁鍊欓��
+ const pickCount = (d) => {
+ const keys = ["count", "chosenQuantity", "num", "total", "chosenquantity"];
+ for (const k of keys) {
+ if (d && d[k] != null && !isNaN(Number(d[k]))) {
+ return Number(d[k]) || 0;
+ }
+ }
+ return 0;
+ };
+
+ arr.forEach((item) => {
+ if (!item || typeof item !== "object") return;
+ const title = pickTitle(item) || "鏈懡鍚嶉鐩�";
+ const details = pickDetails(item);
+ let node = map.get(title);
+ if (!node) {
+ node = { title, type: "", options: new Map() };
+ map.set(title, node);
+ }
+
+ details.forEach((d) => {
+ const option = pickOption(d);
+ if (!option) return;
+ const count = pickCount(d);
+ const rawScore = Number(d && d.score);
+ const score = isNaN(rawScore) ? null : rawScore;
+ // 棰樺瀷锛氫紭鍏� scriptType锛�1鍗曢�� 2澶氶�� 4闂瓟锛夛紝鍏舵 valueType锛�1鍗曢�� 2澶氶�� 3闂瓟 4濉┖ 5鍏跺畠锛�
+ const typeVal = String(
+ (item && item.scriptType) ||
+ (d && d.scriptType) ||
+ (d && d.valueType) ||
+ (item && item.valueType) ||
+ ""
+ );
+ if (!node.type) {
+ node.type =
+ typeVal === "2" ? "multiple" : typeVal === "1" ? "single" : "qa";
+ }
+
+ const old = node.options.get(option);
+ if (old) {
+ old.count += count;
+ if (old.score == null) old.score = score;
+ } else {
+ node.options.set(option, { option, count, score });
+ }
+ });
+ });
+
+ return Array.from(map.values()).map((n) => {
+ const options = Array.from(n.options.values());
+ const item = { title: n.title, type: n.type, options };
+ // 澶氶�夐锛氱敤鍚勯�夐」鏁伴噺涔嬪拰浣滀负濉姤鎬婚噺锛堟帴鍙f湭鍗曠嫭鎻愪緵浜烘锛�
+ if (n.type === "multiple")
+ item.total = options.reduce((s, o) => s + o.count, 0);
+ return item;
+ });
}
export default {
- name: 'DataOverview',
+ name: "DataOverview",
data() {
return {
// 椤堕儴鍏ㄥ眬绛涢��
queryParams: {
dateRange: [],
- deptWard: '',
+ deptCodes: [], // 绉戝缂栫爜闆嗗悎 => leaveldeptcodes
+ wardCodes: [], // 鍑洪櫌鐥呭尯缂栫爜闆嗗悎 => leavehospitaldistrictcodes锛堟帴鍙e繀濉級
+ serviceTypeList: [], // 鏈嶅姟绫诲瀷澶氶�夛紝鎻愪氦鏃剁敤閫楀彿鎷兼帴
+ deptOrDistrict: "1", // 绉戝/鐥呭尯缁勫悎鏂瑰紡锛岄粯璁� 1锛氱闄㈢梾鍖� and 绂婚櫌绉戝
+ statMode: "ward", // 缁熻缁村害锛歸ard=鎸夌梾鍖虹粺璁� dept=鎸夌瀹ょ粺璁�
},
- deptOptions: DEPTS,
- wardOptions: WARDS,
+ SERVICE_TYPES,
+ loading: false,
+
+ // 琛ㄤ簩锛氶鐩ā绯婃煡璇㈠叧閿瓧锛堢函鍓嶇杩囨护锛屼笉璇锋眰鍚庣锛�
+ questionSearch: "",
// 琛ㄦ牸涓夛細缁熻缁村害 + 鐙珛绉戝/鐥呭尯鏉′欢锛�'inherit' = 娌跨敤椤堕儴锛�
- statDimension: 'dept',
- statDeptWard: 'inherit',
+ statDimension: "ward",
+ statDeptWard: "inherit",
- // 缁熶竴鎺ュ彛杩斿洖鐨勬暟鎹紙妯℃嫙锛�
+ // 鎺ュ彛杩斿洖鐨勫師濮嬫暟鎹紙宸插綊涓�鍖栫殑棰樼洰鍒楄〃锛�
questionList: [],
- deptComparison: [],
- wardComparison: [],
+ // 琛ㄤ笁锛氱瀹�/鐥呭尯璇勫垎瀵规瘮锛坮ows=琛屾暟鎹紝questions=鍔ㄦ�佸垪锛�
+ deptComparison: { rows: [], questions: [] },
+ wardComparison: { rows: [], questions: [] },
};
},
computed: {
- // 鍥哄畾浜旈」閫夐」鐨勯鐩� => 琛ㄤ竴
+ // 绉戝閫夐」锛氫紭鍏堝彇褰撳墠鐢ㄦ埛鎵�灞炵瀹わ紝鏃犲垯鍏滃簳
+ 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 }));
+ },
+ // 鐥呭尯閫夐」锛氫紭鍏堝彇褰撳墠鐢ㄦ埛鎵�灞炵梾鍖猴紝鏃犲垯鍏滃簳
+ 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 }));
+ },
+ // 鏈嶅姟绫诲瀷涓嬫媺锛氬彇 store 鐨勯殢璁跨被鍨嬪瓧鍏� tasktypes锛屽彇涓嶅埌鏃跺厹搴曟湰鍦� SERVICE_TYPES
+ serviceTypeOptions() {
+ const toOptions = (list) =>
+ (Array.isArray(list) ? list : [])
+ .map((i) => ({
+ label: String(i.label || "").trim(),
+ value: String(i.value),
+ }))
+ .filter((i) => i.label && i.value && i.value !== "undefined");
+ 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)));
+ },
+ // 鏈�夌瀹ゆ椂鐨勯粯璁ゆ煡璇㈣寖鍥达細鍏ㄩ儴绉戝缂栫爜
+ defaultDeptCodes() {
+ return Array.from(new Set(this.deptOptions.map((d) => d.value)));
+ },
+ // 鍥哄畾鍏」閫夐」鐨勯鐩� => 琛ㄤ竴
satisfactionQuestions() {
return this.questionList.filter((q) => this.isSatisfactionQuestion(q));
},
@@ -256,54 +563,67 @@
},
// 琛ㄤ竴锛氭弧鎰忓害缁熻锛堝惈鎬昏琛岋級
serviceSatisfaction() {
+ // 鍙栨寚瀹氶�夐」鐨� { count, score }锛屾湭杩斿洖鍒欒椤逛负 0
+ const pick = (q, name) => {
+ const hit = q.options.find((o) => o.option === name);
+ return hit
+ ? { count: Number(hit.count) || 0, score: hit.score }
+ : { count: 0, score: null };
+ };
+ const NAMES = FIXED_OPTIONS;
+
const rows = this.satisfactionQuestions.map((q) => {
- const m = {};
- q.options.forEach((o) => (m[o.option] = o.count));
- const veryGood = m['闈炲父婊℃剰'] || 0;
- const good = m['婊℃剰'] || 0;
- const normal = m['涓�鑸�'] || 0;
- const bad = m['涓嶆弧鎰�'] || 0;
- const na = m['涓嶉�傜敤'] || 0;
- const total = veryGood + good + normal + bad + na;
+ const veryGood = pick(q, "寰堟弧鎰�");
+ const good = pick(q, "婊℃剰");
+ const normal = pick(q, "涓�鑸�");
+ const bad = pick(q, "涓嶆弧鎰�");
+ const veryBad = pick(q, "寰堜笉婊℃剰");
+ const na = pick(q, "鏈粡鍘�");
+ const items = [veryGood, good, normal, bad, veryBad, na];
+ const total = items.reduce((s, it) => s + it.count, 0);
return {
category: q.title,
- veryGoodCount: veryGood,
- veryGoodRate: this.rateOf(veryGood, total),
- goodCount: good,
- goodRate: this.rateOf(good, total),
- normalCount: normal,
- normalRate: this.rateOf(normal, total),
- badCount: bad,
- badRate: this.rateOf(bad, total),
- naCount: na,
- naRate: this.rateOf(na, total),
- score: this.scoreOf([veryGood, good, normal, bad, na]),
+ veryGoodCount: veryGood.count,
+ veryGoodRate: this.rateOf(veryGood.count, total),
+ goodCount: good.count,
+ goodRate: this.rateOf(good.count, total),
+ normalCount: normal.count,
+ normalRate: this.rateOf(normal.count, total),
+ badCount: bad.count,
+ badRate: this.rateOf(bad.count, total),
+ veryBadCount: veryBad.count,
+ veryBadRate: this.rateOf(veryBad.count, total),
+ naCount: na.count,
+ naRate: this.rateOf(na.count, total),
+ score: this.scoreOfItems(items),
};
});
- // 鎬昏琛�
- const sum = { veryGood: 0, good: 0, normal: 0, bad: 0, na: 0 };
- rows.forEach((r) => {
- sum.veryGood += r.veryGoodCount;
- sum.good += r.goodCount;
- sum.normal += r.normalCount;
- sum.bad += r.badCount;
- sum.na += r.naCount;
+ // 鎬昏琛岋細鍚勯鍚岄�夐」鏁伴噺绱姞锛屽垎鍊兼部鐢ㄨ閫夐」鍒嗗��
+ const sum = NAMES.map(() => ({ count: 0, score: null }));
+ this.satisfactionQuestions.forEach((q) => {
+ NAMES.forEach((name, i) => {
+ const it = pick(q, name);
+ sum[i].count += it.count;
+ if (sum[i].score == null) sum[i].score = it.score;
+ });
});
- const total = sum.veryGood + sum.good + sum.normal + sum.bad + sum.na;
+ const total = sum.reduce((s, it) => s + it.count, 0);
rows.push({
- category: '鎬昏',
- veryGoodCount: sum.veryGood,
- veryGoodRate: this.rateOf(sum.veryGood, total),
- goodCount: sum.good,
- goodRate: this.rateOf(sum.good, total),
- normalCount: sum.normal,
- normalRate: this.rateOf(sum.normal, total),
- badCount: sum.bad,
- badRate: this.rateOf(sum.bad, total),
- naCount: sum.na,
- naRate: this.rateOf(sum.na, total),
- score: this.scoreOf([sum.veryGood, sum.good, sum.normal, sum.bad, sum.na]),
+ category: "鎬昏",
+ veryGoodCount: sum[0].count,
+ veryGoodRate: this.rateOf(sum[0].count, total),
+ goodCount: sum[1].count,
+ goodRate: this.rateOf(sum[1].count, total),
+ normalCount: sum[2].count,
+ normalRate: this.rateOf(sum[2].count, total),
+ badCount: sum[3].count,
+ badRate: this.rateOf(sum[3].count, total),
+ veryBadCount: sum[4].count,
+ veryBadRate: this.rateOf(sum[4].count, total),
+ naCount: sum[5].count,
+ naRate: this.rateOf(sum[5].count, total),
+ score: this.scoreOfItems(sum),
});
return rows;
},
@@ -322,138 +642,359 @@
};
});
},
+ // 琛ㄤ簩锛氭寜棰樼洰妯$硦鏌ヨ锛堢函鍓嶇杩囨护锛屼笉璇锋眰鍚庣锛�
+ filteredQuestionStats() {
+ const kw = (this.questionSearch || "").trim().toLowerCase();
+ if (!kw) return this.questionStats;
+ return this.questionStats.filter((q) =>
+ (q.title || "").toLowerCase().indexOf(kw) > -1
+ );
+ },
// 琛ㄤ笁锛氭寜缁村害 + 鐙珛鏉′欢杩囨护鍚庣殑琛�
table3Rows() {
- const list = this.statDimension === 'dept' ? this.deptComparison : this.wardComparison;
- const f = this.statFilter();
- if (!f) return list;
- const [type, name] = f.split(':');
- if (type !== this.statDimension) return list;
- return list.filter((r) => r.name === name);
+ const comp =
+ this.statDimension === "dept"
+ ? this.deptComparison
+ : this.wardComparison;
+ const list = (comp && comp.rows) || [];
+ const names = this.statFilterNames();
+ if (!names || !names.length) return list;
+ return list.filter((r) => names.indexOf(r.name) > -1);
+ },
+ // 琛ㄤ笁锛氬綋鍓嶇淮搴︿笅鐨勯鐩垪锛堝姩鎬佸垪锛�
+ table3Questions() {
+ const comp =
+ this.statDimension === "dept"
+ ? this.deptComparison
+ : this.wardComparison;
+ return (comp && comp.questions) || [];
},
},
- mounted() {
+ created() {
if (!this.queryParams.dateRange || !this.queryParams.dateRange.length) {
this.queryParams.dateRange = this.defaultRange();
}
+ this.queryParams.serviceTypeList = this.defaultServiceTypes();
+ },
+ mounted() {
this.fetchData();
},
methods: {
- // 琛ㄤ笁鐙珛鏉′欢锛�'inherit' 鏃舵部鐢ㄩ《閮ㄦ潯浠�
- statFilter() {
- const v = this.statDeptWard === 'inherit' ? this.queryParams.deptWard : this.statDeptWard;
- return v || '';
+ // 榛樿閫変腑鐨勬湇鍔$被鍨嬶紙鎸� label 鍖归厤锛屽彇涓嶅埌灏辫繑鍥炵┖鏁扮粍 = 涓嶉檺锛�
+ defaultServiceTypes() {
+ const hit = DEFAULT_SERVICE_LABELS.map((label) => {
+ const item = this.serviceTypeOptions.find((o) => o.label === label);
+ return item ? item.value : null;
+ }).filter((v) => v != null);
+ return Array.from(new Set(hit));
+ },
+ // 琛ㄤ笁鐙珛鏉′欢锛�'inherit' 鏃舵部鐢ㄩ《閮ㄦ墍閫夛紱杩斿洖閫変腑鐨勫悕绉版暟缁勶紙鎺ュ彛鍙洖鍚嶇О锛夛紝绌烘暟缁勮〃绀轰笉闄�
+ statFilterNames() {
+ const opts =
+ this.statDimension === "dept" ? this.deptOptions : this.wardOptions;
+ const nameOf = (code) => {
+ const hit = opts.find((o) => String(o.value) === String(code));
+ return hit ? hit.label : null;
+ };
+ if (this.statDeptWard === "inherit") {
+ const codes =
+ this.statDimension === "dept"
+ ? this.queryParams.deptCodes
+ : this.queryParams.wardCodes;
+ return (codes || []).map(nameOf).filter(Boolean);
+ }
+ // 鍒囨崲缁村害鍚庯紝鑻ュ凡閫夋潯浠朵笉灞炰簬褰撳墠缁村害鍒欒涓轰笉闄�
+ if (this.statDeptWard.startsWith(this.statDimension + ":")) {
+ const name = nameOf(this.statDeptWard.slice(this.statDimension.length + 1));
+ return name ? [name] : [];
+ }
+ return [];
},
onStatDimensionChange() {
// 鍒囨崲缁村害鍚庯紝鑻ュ綋鍓嶅凡閫夋潯浠朵笉灞炰簬鏂扮淮搴︼紝鍒欐仮澶嶁�滄部鐢ㄩ《閮ㄢ��
- if (this.statDeptWard !== 'inherit' && !this.statDeptWard.startsWith(this.statDimension + ':')) {
- this.statDeptWard = 'inherit';
+ if (
+ this.statDeptWard !== "inherit" &&
+ !this.statDeptWard.startsWith(this.statDimension + ":")
+ ) {
+ this.statDeptWard = "inherit";
}
},
handleReset() {
this.queryParams.dateRange = this.defaultRange();
- this.queryParams.deptWard = '';
+ this.queryParams.deptCodes = [];
+ this.queryParams.wardCodes = [];
+ this.queryParams.statMode = "ward";
+ this.statDimension = "ward";
+ this.statDeptWard = "inherit";
+ this.queryParams.serviceTypeList = this.defaultServiceTypes();
this.fetchData();
},
- // 鍒ゆ柇棰樼洰閫夐」鏄惁涓哄浐瀹氭弧鎰忓害浜旈」
+ // 鍒囨崲缁熻缁村害锛堢瀹�/鐥呭尯锛夋椂娓呯┖鍙︿竴缁村害鐨勯�夋嫨锛屼繚璇佷簰鏂�
+ onStatModeChange() {
+ if (this.queryParams.statMode === "dept") {
+ this.queryParams.wardCodes = [];
+ } else {
+ this.queryParams.deptCodes = [];
+ }
+ // 鍗曞悜鍚屾鍒般�屽悇绉戝/鐥呭尯婊℃剰搴﹁瘎鍒嗗姣斻�嶈〃锛氶《閮� 鈫� 琛ㄤ笁
+ this.statDimension = this.queryParams.statMode;
+ this.onStatDimensionChange();
+ },
+ // 鍒ゆ柇棰樼洰鏄惁涓烘弧鎰忓害鍏」閫夐」棰橈細鎵�鏈夐�夐」閮借惤鍦ㄥ浐瀹氬叚椤瑰唴鍗冲綊琛ㄤ竴
isSatisfactionQuestion(q) {
- if (q.options.length !== FIXED_OPTIONS.length) return false;
- const set = q.options.map((o) => o.option);
- return FIXED_OPTIONS.every((o) => set.includes(o));
+ if (!q.options || !q.options.length) return false;
+ return q.options.every((o) => FIXED_OPTIONS.includes(o.option));
},
questionTotal(q) {
if (q.total != null) return q.total;
return q.options.reduce((s, o) => s + o.count, 0);
},
rateOf(count, total) {
- if (!total) return '0.00%';
- return ((count / total) * 100).toFixed(2) + '%';
+ if (!total) return "0.00%";
+ return ((count / total) * 100).toFixed(2) + "%";
},
- // 缁煎悎寰楀垎锛氶潪甯告弧鎰�5鍒嗐�佹弧鎰�4鍒嗐�佷竴鑸�3鍒嗐�佷笉婊℃剰2鍒嗭紝鎹㈢畻鐧惧垎鍒讹紙涓嶉�傜敤涓嶈鍏ワ級鈥斺�斿崰浣嶅叕寮忥紝鎺ュ彛灏辩华鍚庡彲鎸夊悗绔彛寰勬浛鎹�
- scoreOf(counts) {
- const [a, b, c, d] = counts;
- const total = a + b + c + d;
- if (!total) return '0.00';
- return (((a * 5 + b * 4 + c * 3 + d * 2) / total) * 20).toFixed(2);
+ /**
+ * 缁煎悎寰楀垎锛堢湡瀹炲彛寰勶級锛毼�(鍚勯�夐」鍒嗗�� 脳 濉姤閲�) / 危(濉姤閲�)
+ * items: [{ count, score }]锛宻core 鍙栨帴鍙h繑鍥炵殑 score 瀛楁
+ * 鏃犲垎鍊奸�夐」锛堝"鏈粡鍘�"锛夐粯璁や笉璁″叆鍒嗗瓙涓庡垎姣嶏紝閬垮厤鎷変綆寰楀垎
+ */
+ scoreOfItems(items) {
+ let numerator = 0;
+ let denominator = 0;
+ items.forEach((it) => {
+ const count = Number(it && it.count) || 0;
+ const score = Number(it && it.score);
+ const hasScore = !isNaN(score);
+ if (!hasScore && !NO_SCORE_IN_DENOMINATOR) return;
+ numerator += (hasScore ? score : 0) * count;
+ denominator += count;
+ });
+ if (!denominator) return "0.00";
+ return (numerator / denominator).toFixed(2);
},
defaultRange() {
const end = new Date();
const start = new Date();
- start.setDate(start.getDate() - 29);
+ start.setDate(start.getDate() - 91);
const f = (d) => {
const y = d.getFullYear();
- const m = String(d.getMonth() + 1).padStart(2, '0');
- const day = String(d.getDate()).padStart(2, '0');
+ const m = String(d.getMonth() + 1).padStart(2, "0");
+ const day = String(d.getDate()).padStart(2, "0");
return `${y}-${m}-${day}`;
};
return [f(start), f(end)];
},
- dateRangeDays(range) {
- if (Array.isArray(range) && range.length === 2 && range[0] && range[1]) {
- const ms = new Date(range[1]).getTime() - new Date(range[0]).getTime();
- return Math.max(1, Math.round(ms / 86400000));
+ // 鎻愮ず淇℃伅锛堝吋瀹� $modal 涓� $message锛�
+ notify(msg, type) {
+ const map = {
+ warning: ["msgWarning", "warning"],
+ error: ["msgError", "error"],
+ success: ["msgSuccess", "success"],
+ };
+ const [modalFn, msgFn] = map[type] || map.success;
+ if (this.$modal && this.$modal[modalFn]) {
+ this.$modal[modalFn](msg);
+ } else if (this.$message && this.$message[msgFn]) {
+ this.$message[msgFn](msg);
}
- return 30;
},
- // 鎷夊彇鏁版嵁锛堝綋鍓嶄负妯℃嫙鏁版嵁锛屾帴鍙e氨缁悗鏇挎崲涓虹湡瀹炶姹傦級
- fetchData() {
- const data = this.mockFetch(this.queryParams);
- this.questionList = data.questionList;
- this.deptComparison = data.deptComparison;
- this.wardComparison = data.wardComparison;
- },
- mockFetch(params) {
- const seed = hashString(JSON.stringify(params));
- const rnd = mulberry32(seed);
- const days = this.dateRangeDays(params.dateRange);
- const timeFactor = Math.max(0.05, days / 30);
- const scopeFactor = params.deptWard ? 0.18 : 1;
- const jitter = () => 0.9 + rnd() * 0.2;
+ // 鎷夊彇婊℃剰搴︾粺璁℃暟鎹紙鎺ュ彛锛�/smartor/serviceSubtaskDetail/sltdMydTotalByScore锛�
+ async fetchData() {
+ const range = this.queryParams.dateRange || [];
+ if (range.length !== 2 || !range[0] || !range[1]) {
+ this.notify("璇峰厛閫夋嫨鍑洪櫌鏃ユ湡鑼冨洿", "warning");
+ return;
+ }
- const questionList = RAW_QUESTIONS.map((q) => {
- const options = q.options.map((o) => ({
- option: o.option,
- count: Math.round(o.count * timeFactor * scopeFactor * jitter()),
- }));
- const item = { title: q.title, type: q.type, options };
- if (q.type === 'multiple' && q.total != null) {
- item.total = Math.round(q.total * timeFactor * scopeFactor);
+ // 鐥呭尯 => leavehospitaldistrictcodes锛岀瀹� => leaveldeptcodes
+ // 绉戝/鐥呭尯浜掓枼锛氭寜鐥呭尯鍙紶 leavehospitaldistrictcodes锛屾寜绉戝鍙紶 leaveldeptcodes
+ const wards = this.queryParams.wardCodes || [];
+ const depts = this.queryParams.deptCodes || [];
+
+ const payload = {
+ deptOrDistrict: this.queryParams.deptOrDistrict || "1",
+ startFinishTime: range[0],
+ endFinishTime: range[1],
+ };
+ if (this.queryParams.statMode === "dept") {
+ payload.leaveldeptcodes = depts.length
+ ? Array.from(new Set(depts))
+ : this.defaultDeptCodes;
+ } else {
+ payload.leavehospitaldistrictcodes = wards.length
+ ? Array.from(new Set(wards))
+ : this.defaultWardCodes;
+ }
+ // 鏈嶅姟绫诲瀷澶氶�夛細閫楀彿鍒嗛殧锛堟帴鍙e瓧娈典负 serviceType 瀛楃涓诧級
+ const serviceTypes = this.queryParams.serviceTypeList || [];
+ if (serviceTypes.length) payload.serviceType = serviceTypes.join(",");
+ payload.serviceTypeList = serviceTypes;
+ this.loading = true;
+ try {
+ const res = await sltdMydTotalByScore(payload);
+ // 鎺掓煡鐢細鎵撳嵃鎺ュ彛鍘熷杩斿洖锛屼究浜庢牳瀵瑰瓧娈靛悕锛堢‘璁ゆ棤璇悗鍙垹闄わ級
+ console.log(
+ "[sltdMydTotalByScore] code=",
+ res && res.code,
+ "data=",
+ JSON.stringify(res && res.data).slice(0, 2000)
+ );
+ if (res && res.code === 200) {
+ this.questionList = normalizeQuestions(res.data);
+ if (!this.questionList.length)
+ this.notify("褰撳墠鏉′欢涓嬫殏鏃犵粺璁℃暟鎹�", "warning");
+ } else {
+ this.questionList = [];
+ this.notify((res && res.msg) || "缁熻鏁版嵁鑾峰彇澶辫触", "error");
}
- return item;
+ // 琛ㄤ笁锛氬悇绉戝/鐥呭尯婊℃剰搴﹁瘎鍒嗗姣旓紙鐪熷疄鎺ュ彛锛屽唴閮ㄨ嚜琛屽鐞嗛敊璇級
+ await this.fetchComparison();
+ } catch (e) {
+ this.questionList = [];
+ this.notify("缁熻鏁版嵁璇锋眰澶辫触锛岃绋嶅悗閲嶈瘯", "error");
+ } finally {
+ this.loading = false;
+ }
+ },
+ // 鎷夊彇鍚勭瀹�/鐥呭尯婊℃剰搴﹁瘎鍒嗗姣旓紙鎺ュ彛锛�/smartor/serviceSubtaskDetail/statQuestionOptionByKsOrBq锛�
+ async fetchComparison() {
+ const range = this.queryParams.dateRange || [];
+ if (range.length !== 2 || !range[0] || !range[1]) {
+ this.deptComparison = { rows: [], questions: [] };
+ this.wardComparison = { rows: [], questions: [] };
+ return;
+ }
+ const base = {
+ deptOrDistrict: this.queryParams.deptOrDistrict || "1",
+ startFinishTime: range[0],
+ endFinishTime: range[1],
+ };
+ try {
+ // 鎸夌瀹ょ粺璁★紙leaveldeptcodes 浼樺厛锛変笌鎸夌梾鍖虹粺璁★紙leavehospitaldistrictcodes锛夊悇鏌ヤ竴娆�
+ const [deptRes, wardRes] = await Promise.all([
+ statQuestionOptionByKsOrBq({ ...base, leaveldeptcodes: this.defaultDeptCodes }),
+ statQuestionOptionByKsOrBq({ ...base, leavehospitaldistrictcodes: this.defaultWardCodes }),
+ ]);
+ // 鎺掓煡鐢細鎵撳嵃鎺ュ彛鍘熷杩斿洖锛屼究浜庢牳瀵逛袱绾у祵濂� Map 缁撴瀯锛堢‘璁ゆ棤璇悗鍙垹闄わ級
+ console.log(
+ "[statQuestionOptionByKsOrBq] dept code=",
+ deptRes && deptRes.code,
+ "data=",
+ JSON.stringify(deptRes && deptRes.data).slice(0, 2000),
+ "| ward code=",
+ wardRes && wardRes.code,
+ "data=",
+ JSON.stringify(wardRes && wardRes.data).slice(0, 2000)
+ );
+ this.deptComparison = this.buildComparison(
+ deptRes && deptRes.code === 200 ? deptRes.data : {},
+ "dept"
+ );
+ this.wardComparison = this.buildComparison(
+ wardRes && wardRes.code === 200 ? wardRes.data : {},
+ "ward"
+ );
+ } catch (e) {
+ this.deptComparison = { rows: [], questions: [] };
+ this.wardComparison = { rows: [], questions: [] };
+ console.error("鑾峰彇绉戝/鐥呭尯璇勫垎瀵规瘮澶辫触:", e);
+ }
+ },
+ // 缁勮涓鸿〃涓夋墍闇�鐨勮/鍒楃粨鏋勶細琛�=绉戝/鐥呭尯锛屽垪=棰樼洰脳閫夐」 + 寰楀垎 + 缁煎悎寰楀垎
+ // 鏂版帴鍙h繑鍥炰袱绾у祵濂� Map锛歿 绉戝/鐥呭尯鍚嶇О: { 棰樼洰鍐呭: [QuestionCountKsOrBqDTO] } }
+ // 鍏煎鏃ф墎骞虫暟缁勶細[{ questionText, deptname, leavehospitaldistrictname, targetvalue, answerCount, singleScore }]
+ buildComparison(data, mode) {
+ const questions = [];
+ const qMap = new Map();
+ const rowMap = new Map();
+
+ // 灏嗕竴鏉� (鍚嶇О, 棰樼洰, 閫夐」, 鏁伴噺, 寰楀垎) 鏄庣粏绱姞杩涜/鍒楃粨鏋�
+ const collect = (name, title, option, count, single) => {
+ if (!title || !name) return;
+ let q = qMap.get(title);
+ if (!q) {
+ q = { title, options: [] };
+ qMap.set(title, q);
+ questions.push(q);
+ }
+ if (option && q.options.indexOf(option) === -1) q.options.push(option);
+
+ let row = rowMap.get(name);
+ if (!row) {
+ row = { name, code: this.codeFor(mode, name), cells: {} };
+ rowMap.set(name, row);
+ }
+ if (!row.cells[title]) row.cells[title] = {};
+ const cell = row.cells[title][option] || { count: 0, score: 0 };
+ cell.count += count;
+ cell.score += single;
+ row.cells[title][option] = cell;
+ };
+
+ if (Array.isArray(data)) {
+ // 鏃х粨鏋勶細鎵佸钩鏁扮粍
+ data.forEach((it) => {
+ const title = it.questionText || it.qeustionText || "";
+ const name =
+ mode === "dept"
+ ? it.deptname || ""
+ : it.leavehospitaldistrictname || "";
+ const option = it.targetvalue || it.asrtext || "";
+ collect(name, title, option, Number(it.answerCount) || 0, Number(it.singleScore) || 0);
+ });
+ } else if (data && typeof data === "object") {
+ // 鏂扮粨鏋勶細涓ょ骇宓屽 Map锛岀涓�灞� key=绉戝/鐥呭尯鍚嶇О锛岀浜屽眰 key=棰樼洰锛寁alue=閫夐」鏄庣粏鍒楄〃
+ Object.keys(data).forEach((name) => {
+ const questionMap = data[name] || {};
+ Object.keys(questionMap).forEach((title) => {
+ const list = Array.isArray(questionMap[title]) ? questionMap[title] : [];
+ list.forEach((it) => {
+ const option = it.targetvalue || it.asrtext || "";
+ collect(name, title, option, Number(it.answerCount) || 0, Number(it.singleScore) || 0);
+ });
+ });
+ });
+ }
+
+ const rows = Array.from(rowMap.values());
+ rows.forEach((row) => {
+ let totalCount = 0;
+ let totalScore = 0;
+ questions.forEach((q) => {
+ const cells = row.cells[q.title] || {};
+ let qCount = 0;
+ let qScore = 0;
+ q.options.forEach((opt) => {
+ const c = cells[opt];
+ if (c) {
+ qCount += c.count;
+ qScore += c.score;
+ }
+ });
+ // 璇ラ鐩姞鏉冨钩鍧囧垎锛毼� singleScore / 危 answerCount
+ cells._score = qCount ? (qScore / qCount).toFixed(2) : "0.00";
+ totalCount += qCount;
+ totalScore += qScore;
+ row.cells[q.title] = cells;
+ });
+ row.totalScore = totalCount ? (totalScore / totalCount).toFixed(2) : "0.00";
});
- const deptComparison = DEPTS.map((d) => this.genCompareRow(d, rnd));
- const wardComparison = WARDS.map((w) => this.genCompareRow(w, rnd));
-
- return { questionList, deptComparison, wardComparison };
+ return { rows, questions };
},
- genCompareRow(name, rnd) {
- const r = (lo, hi) => Math.round(lo + rnd() * (hi - lo));
- const q1VeryGood = r(20, 180);
- const q1Good = r(5, 55);
- const q1Normal = r(0, 4);
- const q1Bad = r(0, 3);
- const q2VeryGood = r(18, 175);
- const q2Good = r(5, 55);
- const q2Normal = r(0, 4);
- const q2Bad = r(0, 3);
- return {
- name,
- q1VeryGood, q1Good, q1Normal, q1Bad,
- q1Score: this.scoreOf([q1VeryGood, q1Good, q1Normal, q1Bad]),
- q2VeryGood, q2Good, q2Normal, q2Bad,
- q2Score: this.scoreOf([q2VeryGood, q2Good, q2Normal, q2Bad]),
- totalScore: this.scoreOf([
- q1VeryGood + q2VeryGood,
- q1Good + q2Good,
- q1Normal + q2Normal,
- q1Bad + q2Bad,
- ]),
- };
+ // 鍚嶇О 鈫� 缂栫爜锛堢敤浜庤〃涓夋寜椤堕儴鎵�閫夌紪鐮佽繃婊わ級
+ codeFor(mode, name) {
+ const opts = mode === "dept" ? this.deptOptions : this.wardOptions;
+ const hit = opts.find((o) => String(o.label) === String(name));
+ return hit ? hit.value : name;
},
exportTable(tableId) {
- const tableNames = { table1: '鍚勬湇鍔¢」鐩弧鎰忓害缁熻', table2: '鍗曢�夐澶氶�夐缁熻', table3: '鍚勭瀹ゆ弧鎰忓害璇勫垎瀵规瘮' };
- const name = tableNames[tableId] || '缁熻鏁版嵁';
+ const tableNames = {
+ table1: "鍚勬湇鍔¢」鐩弧鎰忓害缁熻",
+ table2: "鍗曢�夐澶氶�夐缁熻",
+ table3: "鍚勭瀹ゆ弧鎰忓害璇勫垎瀵规瘮",
+ };
+ const name = tableNames[tableId] || "缁熻鏁版嵁";
const table = document.getElementById(tableId);
if (!table) return;
@@ -461,10 +1002,10 @@
// 浠庤〃鏍兼彁鍙栨暟鎹瀯寤哄甫鏍峰紡鐨� Excel
const wb = XLSX.utils.book_new();
const data = [];
- table.querySelectorAll('tr').forEach((tr) => {
+ table.querySelectorAll("tr").forEach((tr) => {
const row = [];
- tr.querySelectorAll('th,td').forEach((td) => {
- row.push((td.innerText || '').trim());
+ tr.querySelectorAll("th,td").forEach((td) => {
+ row.push((td.innerText || "").trim());
});
if (row.length) data.push(row);
});
@@ -472,22 +1013,24 @@
const ws = XLSX.utils.aoa_to_sheet(data);
// 璁剧疆鍒楀
const colWidths = data[0] ? data[0].map(() => ({ wch: 16 })) : [];
- ws['!cols'] = colWidths;
+ ws["!cols"] = colWidths;
- XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');
- XLSX.writeFile(wb, name + '.xlsx');
+ XLSX.utils.book_append_sheet(wb, ws, "Sheet1");
+ XLSX.writeFile(wb, name + ".xlsx");
} catch (e) {
// fallback: CSV
- let csv = '锘�';
- table.querySelectorAll('tr').forEach((tr) => {
+ let csv = "锘�";
+ table.querySelectorAll("tr").forEach((tr) => {
const row = [];
- tr.querySelectorAll('th,td').forEach((td) => row.push('"' + (td.innerText || '').replace(/"/g, '""') + '"'));
- csv += row.join(',') + '\n';
+ tr.querySelectorAll("th,td").forEach((td) =>
+ row.push('"' + (td.innerText || "").replace(/"/g, '""') + '"')
+ );
+ csv += row.join(",") + "\n";
});
- const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
- const link = document.createElement('a');
+ const blob = new Blob([csv], { type: "text/csv;charset=utf-8;" });
+ const link = document.createElement("a");
link.href = URL.createObjectURL(blob);
- link.download = name + '.csv';
+ link.download = name + ".csv";
link.click();
}
},
@@ -496,13 +1039,66 @@
</script>
<style lang="scss" scoped>
-.data-overview { .overview-card { margin-bottom: 20px; } }
-.filter-card { .filter-form { margin-bottom: -10px; } .filter-select { width: 200px; } }
-.card-header { display: flex; justify-content: space-between; align-items: center; }
-.card-title { font-size: 16px; font-weight: 600; color: #303133; }
-.header-right { display: flex; align-items: center; .stat-select { width: 180px; margin: 0 12px; } }
-.question-block { margin-bottom: 24px;
- .q-title { margin: 0 0 12px 0; font-size: 14px; color: #606266; }
- .q-footer { margin-top: 8px; font-size: 13px; color: #909399; text-align: right; }
+.data-overview {
+ .overview-card {
+ margin-bottom: 20px;
+ }
+}
+.filter-card {
+ .filter-form {
+ margin-bottom: -10px;
+ }
+ .filter-select {
+ width: 220px;
+ }
+ .filter-select-sm {
+ width: 150px;
+ }
+}
+.empty-tip {
+ padding: 40px 0;
+ text-align: center;
+ color: #909399;
+ font-size: 13px;
+}
+.table2-scroll {
+ max-height: 560px;
+ overflow-y: auto;
+}
+.card-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+.card-title {
+ font-size: 16px;
+ font-weight: 600;
+ color: #303133;
+}
+.header-right {
+ display: flex;
+ align-items: center;
+ .stat-select {
+ width: 180px;
+ margin: 0 12px;
+ }
+ .search-input {
+ width: 200px;
+ margin-right: 12px;
+ }
+}
+.question-block {
+ margin-bottom: 24px;
+ .q-title {
+ margin: 0 0 12px 0;
+ font-size: 14px;
+ color: #606266;
+ }
+ .q-footer {
+ margin-top: 8px;
+ font-size: 13px;
+ color: #909399;
+ text-align: right;
+ }
}
</style>
diff --git a/src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue b/src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue
index c1cee6a..f0534c0 100644
--- a/src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue
+++ b/src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue
@@ -354,7 +354,7 @@
statisticaltype: 1,
leavehospitaldistrictcodes: ["all"],
deptcodes: [],
- serviceType: [],
+ serviceType: [2],
dateRange: [],
pageNum: 1,
pageSize: 20,
@@ -374,23 +374,23 @@
// 鏈嶅姟绫诲瀷閫夐」
options: [
- {
- value: 6,
- label: "浣忛櫌婊℃剰搴�",
- raw: {
- cssClass: "",
- listClass: "",
- },
- },
+ // {
+ // value: 6,
+ // label: "浣忛櫌婊℃剰搴�",
+ // raw: {
+ // cssClass: "",
+ // listClass: "",
+ // },
+ // },
- {
- value: 14,
- label: "闂ㄨ瘖婊℃剰搴�",
- raw: {
- cssClass: "",
- listClass: "",
- },
- },
+ // {
+ // value: 14,
+ // label: "闂ㄨ瘖婊℃剰搴�",
+ // raw: {
+ // cssClass: "",
+ // listClass: "",
+ // },
+ // },
],
// 琛ㄦ牸鏁版嵁
@@ -475,7 +475,7 @@
// 鑾峰彇绉戝鏍�
getDeptTree() {
// 鑾峰彇鏈嶅姟绫诲瀷
- // this.options = this.$store.getters.tasktypes || [];
+ this.options = this.$store.getters.tasktypes || [];
// 鑾峰彇绉戝鍒楄〃
this.flatArraydept = (this.$store.getters.belongDepts || []).map(
diff --git a/src/views/Satisfaction/sfstatistics/components/SatisfactionStatistics.vue b/src/views/Satisfaction/sfstatistics/components/SatisfactionStatistics.vue
index 59623b3..9ec0011 100644
--- a/src/views/Satisfaction/sfstatistics/components/SatisfactionStatistics.vue
+++ b/src/views/Satisfaction/sfstatistics/components/SatisfactionStatistics.vue
@@ -141,6 +141,8 @@
<div
id="satisfactionBarChart"
+ v-loading="loading"
+ element-loading-text="缁熻鍔犺浇涓�..."
style="width: 100%; height: 400px"
></div>
</div>
@@ -858,6 +860,12 @@
}
return this.wardList.map((ward) => ward.value);
},
+
+ // 闂缁村害闆嗗悎锛氫粠 dimensionality_type 瀛楀吀鍙栫淮搴︾紪鐮侊紝鏌ョ淮搴︽椂蹇呬紶
+ dimensionList() {
+ const dict = this.dict && this.dict.type && this.dict.type.dimensionality_type;
+ return dict ? dict.map((d) => String(d.value)) : [];
+ },
},
mounted() {
@@ -978,6 +986,9 @@
deptcodes: this.deptCodes, // 浣跨敤璁$畻灞炴��
hospitaldistrictcodes: this.hospitalDistrictCodes, // 浣跨敤璁$畻灞炴��
templateid: this.templateId,
+ questionType: this.queryParams.type || null,
+ serviceTypes: this.defaultServiceTypes,
+ dimensionList: this.dimensionList, // 闂缁村害闆嗗悎锛屾煡缁村害鏃跺繀浼�
};
const response = await satisfactionGraphDimension(params);
@@ -1153,14 +1164,14 @@
return {
scriptContent: item.scriptContent || "",
scriptType: 1,
- answerPerson: item.answerPerson || 0,
- noAnswerPerson: item.noAnswerPerson || 0,
- answerCount: item.answerPerson || 0,
- averageScore: item.averageScore || 0,
- maxScore: item.maxScore || 0,
- minScore: item.minScore || 0,
- answerRate: item.answerRate || 0,
- totalCount: (item.answerPerson || 0) + (item.noAnswerPerson || 0),
+ answerPerson: Number(item.answerPerson) || 0,
+ noAnswerPerson: Number(item.noAnswerPerson) || 0,
+ answerCount: Number(item.answerPerson) || 0,
+ averageScore: Number(item.averageScore) || 0,
+ maxScore: Number(item.maxScore) || 0,
+ minScore: Number(item.minScore) || 0,
+ answerRate: Number(item.answerRate) || 0,
+ totalCount: (Number(item.answerPerson) || 0) + (Number(item.noAnswerPerson) || 0),
options: options,
};
});
@@ -1189,6 +1200,7 @@
templateid: this.templateId,
questionType: this.queryParams.type || null,
serviceTypes: this.defaultServiceTypes,
+ dimensionList: this.dimensionList, // 闂缁村害闆嗗悎锛屾煡缁村害鏃跺繀浼�
};
const response = await statisticsByDimension(params);
@@ -1238,14 +1250,14 @@
dimension: item.dimension || "0", // 缁村害浠g爜
dimensionName: this.getDimensionLabel(item.dimension || "0"), // 缁村害鍚嶇О
scriptType: 1,
- answerPerson: item.answerPerson || 0,
- noAnswerPerson: item.noAnswerPerson || 0,
- answerCount: item.answerPerson || 0,
- averageScore: item.averageScore || 0,
- maxScore: item.maxScore || 0,
- minScore: item.minScore || 0,
- answerRate: item.answerRate || 0,
- totalCount: (item.answerPerson || 0) + (item.noAnswerPerson || 0),
+ answerPerson: Number(item.answerPerson) || 0,
+ noAnswerPerson: Number(item.noAnswerPerson) || 0,
+ answerCount: Number(item.answerPerson) || 0,
+ averageScore: Number(item.averageScore) || 0,
+ maxScore: Number(item.maxScore) || 0,
+ minScore: Number(item.minScore) || 0,
+ answerRate: Number(item.answerRate) || 0,
+ totalCount: (Number(item.answerPerson) || 0) + (Number(item.noAnswerPerson) || 0),
options: options,
};
});
diff --git a/src/views/followvisit/Continue/index.vue b/src/views/followvisit/Continue/index.vue
index 1fb96fa..a98406b 100644
--- a/src/views/followvisit/Continue/index.vue
+++ b/src/views/followvisit/Continue/index.vue
@@ -1461,8 +1461,10 @@
this.getList(1);
},
onthatday() {
- this.topqueryParams.startSendDateTime = this.getCurrentDate();
- this.topqueryParams.endSendDateTime = this.getCurrentDate();
+ this.topqueryParams.sendstateView = 1; // 寰呴殢璁�
+ this.topqueryParams.sendstate = null;
+ this.topqueryParams.startSendDateTime = null;
+ this.topqueryParams.endSendDateTime = this.getCurrentDate(); // 寮�濮嬮殢璁挎棩鏈� <= 浠婂ぉ
this.getList(1);
},
getCurrentDate() {
@@ -1470,13 +1472,12 @@
return now.toISOString().slice(0, 10); // 鎴彇鍓�10涓瓧绗︼紝鍗� YYYY-MM-DD
},
buidegetTasklist(type) {
- if (this.topqueryParams.searchscope == 3) {
- this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
- (obj) => obj.deptCode
- );
- this.topqueryParams.leavehospitaldistrictcodes =
- store.getters.belongWards.map((obj) => obj.districtCode);
- }
+ // 鐢ㄦ埛鏉冮檺涓嬫墍鏈夊緟闅忚浠诲姟锛氫紶閫掑叏閮ㄧ瀹ゅ拰鐥呭尯
+ 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(
@@ -1488,7 +1489,7 @@
pageSize: 10,
leavehospitaldistrictcodes:
this.topqueryParams.leavehospitaldistrictcodes,
- sendstates: [2, 3],
+ sendstateView: 1,
leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
};
buidegetTasklist(obj).then((response) => {
diff --git a/src/views/followvisit/HistoricalFollow/index.vue b/src/views/followvisit/HistoricalFollow/index.vue
index eb2660f..cbc87c1 100644
--- a/src/views/followvisit/HistoricalFollow/index.vue
+++ b/src/views/followvisit/HistoricalFollow/index.vue
@@ -885,13 +885,12 @@
});
},
buidegetTasklist(type) {
- if (this.topqueryParams.searchscope == 3) {
- this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
- (obj) => obj.deptCode
- );
- this.topqueryParams.leavehospitaldistrictcodes =
- store.getters.belongWards.map((obj) => obj.districtCode);
- }
+ // 鐢ㄦ埛鏉冮檺涓嬫墍鏈夊緟闅忚浠诲姟锛氫紶閫掑叏閮ㄧ瀹ゅ拰鐥呭尯
+ 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(
@@ -903,7 +902,7 @@
pageSize: 10,
leavehospitaldistrictcodes:
this.topqueryParams.leavehospitaldistrictcodes,
- sendstates: [2, 3],
+ sendstateView: 1,
leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
};
buidegetTasklist(obj).then((response) => {
@@ -1101,8 +1100,10 @@
});
},
onthatday() {
- this.topqueryParams.startSendDateTime = this.getCurrentDate();
- this.topqueryParams.endSendDateTime = this.getCurrentDate();
+ this.topqueryParams.sendstateView = 1; // 寰呴殢璁�
+ this.topqueryParams.sendstate = null;
+ this.topqueryParams.startSendDateTime = null;
+ this.topqueryParams.endSendDateTime = this.getCurrentDate(); // 寮�濮嬮殢璁挎棩鏈� <= 浠婂ぉ
this.getList(1);
},
getCurrentDate() {
diff --git a/src/views/followvisit/OutpatientAgain/index.vue b/src/views/followvisit/OutpatientAgain/index.vue
index d8082bf..22c477b 100644
--- a/src/views/followvisit/OutpatientAgain/index.vue
+++ b/src/views/followvisit/OutpatientAgain/index.vue
@@ -173,7 +173,7 @@
</div>
</div>
</el-col>
- <el-col :span="1.5">
+ <!-- <el-col :span="1.5">
<div class="documentf">
<div class="document">
<el-button
@@ -185,7 +185,7 @@
>
</div>
</div>
- </el-col>
+ </el-col> -->
<el-col :span="1.5">
<div class="documentf">
<div class="document">
@@ -1015,7 +1015,7 @@
topqueryParams: {
pageNum: 1,
pageSize: 10,
- sendstateView:2,
+ sendstateView:1,
sort: localStorage.getItem("orgname") == "涓芥按甯備腑鍖婚櫌" ? 8 : 2, //0 鏈嶅姟鏃堕棿(姝e簭) 1 鏈嶅姟鏃堕棿(鍊掑簭) 2 鍙戦�佹椂闂�(姝e簭) 3 鍙戦�佹椂闂�(鍊掑簭) 7搴旈殢璁挎棩鏈�(鍊掑簭) 搴旈殢璁挎棩鏈�(姝e簭)
serviceType: 3,
searchscope: 3,
@@ -1230,8 +1230,10 @@
this.getList(1);
},
onthatday() {
- this.topqueryParams.startSendDateTime = this.getCurrentDate();
- this.topqueryParams.endSendDateTime = this.getCurrentDate();
+ this.topqueryParams.sendstateView = 1; // 寰呴殢璁�
+ this.topqueryParams.sendstate = null;
+ this.topqueryParams.startSendDateTime = null;
+ this.topqueryParams.endSendDateTime = this.getCurrentDate(); // 寮�濮嬮殢璁挎棩鏈� <= 浠婂ぉ
this.getList(1);
},
getCurrentDate() {
@@ -1239,16 +1241,12 @@
return now.toISOString().slice(0, 10); // 鎴彇鍓�10涓瓧绗︼紝鍗� YYYY-MM-DD
},
buidegetTasklist(type) {
- 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.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(
@@ -1260,7 +1258,7 @@
pageSize: 10,
leavehospitaldistrictcodes:
this.topqueryParams.leavehospitaldistrictcodes,
- sendstates: [2, 3],
+ sendstateView: 1,
visitDeptCodes: this.topqueryParams.visitDeptCodes,
// leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
};
@@ -1432,10 +1430,12 @@
resetQuery() {
this.dateRange = [];
this.dateRangefs = [];
+ this.serviceStatusValue = 10;
+
this.topqueryParams = {
pageNum: 1,
pageSize: 10,
- sendstateView:2,
+ sendstateView:1,
sort: 2, //0 鏈嶅姟鏃堕棿(姝e簭) 1 鏈嶅姟鏃堕棿(鍊掑簭) 2 鍙戦�佹椂闂�(姝e簭) 3 鍙戦�佹椂闂�(鍊掑簭)
serviceType: 3,
searchscope: 3,
diff --git a/src/views/followvisit/Tracking/index.vue b/src/views/followvisit/Tracking/index.vue
index fd1c987..9202b4c 100644
--- a/src/views/followvisit/Tracking/index.vue
+++ b/src/views/followvisit/Tracking/index.vue
@@ -168,7 +168,7 @@
</div>
</div>
</el-col>
- <el-col :span="1.5">
+ <!-- <el-col :span="1.5">
<div class="documentf">
<div class="document">
<el-button
@@ -180,7 +180,7 @@
>
</div>
</div>
- </el-col>
+ </el-col> -->
<el-col :span="1.5">
<div class="documentf">
<div class="document">
@@ -1007,7 +1007,7 @@
topqueryParams: {
pageNum: 1,
pageSize: 10,
- sendstateView:2,
+ sendstateView:1,
sort: localStorage.getItem("orgname") == "涓芥按甯備腑鍖婚櫌" ? 8 : 2, //0 寤剁画鎶ょ悊鏃堕棿(姝e簭) 1 寤剁画鎶ょ悊鏃堕棿(鍊掑簭) 2 鍙戦�佹椂闂�(姝e簭) 3 鍙戦�佹椂闂�(鍊掑簭) 7搴旈殢璁挎棩鏈�(鍊掑簭) 搴旈殢璁挎棩鏈�(姝e簭)
serviceType: 3,
searchscope: 3,
@@ -1222,8 +1222,10 @@
this.getList(1);
},
onthatday() {
- this.topqueryParams.startSendDateTime = this.getCurrentDate();
- this.topqueryParams.endSendDateTime = this.getCurrentDate();
+ this.topqueryParams.sendstateView = 1; // 寰呴殢璁�
+ this.topqueryParams.sendstate = null;
+ this.topqueryParams.startSendDateTime = null;
+ this.topqueryParams.endSendDateTime = this.getCurrentDate(); // 寮�濮嬮殢璁挎棩鏈� <= 浠婂ぉ
this.getList(1);
},
getCurrentDate() {
@@ -1231,16 +1233,15 @@
return now.toISOString().slice(0, 10); // 鎴彇鍓�10涓瓧绗︼紝鍗� YYYY-MM-DD
},
buidegetTasklist(type) {
- 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.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(
@@ -1252,7 +1253,7 @@
pageSize: 10,
leavehospitaldistrictcodes:
this.topqueryParams.leavehospitaldistrictcodes,
- sendstates: [2, 3],
+ sendstateView: 1,
visitDeptCodes: this.topqueryParams.visitDeptCodes,
leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
};
@@ -1424,10 +1425,12 @@
resetQuery() {
this.dateRange = [];
this.dateRangefs = [];
+ this.serviceStatusValue = 10;
+
this.topqueryParams = {
pageNum: 1,
pageSize: 10,
- sendstateView:2,
+ sendstateView:1,
sort: 2, //0 寤剁画鎶ょ悊鏃堕棿(姝e簭) 1 寤剁画鎶ょ悊鏃堕棿(鍊掑簭) 2 鍙戦�佹椂闂�(姝e簭) 3 鍙戦�佹椂闂�(鍊掑簭)
serviceType: 3,
searchscope: 3,
diff --git a/src/views/followvisit/again/index.vue b/src/views/followvisit/again/index.vue
index bdd1f0b..c1193ae 100644
--- a/src/views/followvisit/again/index.vue
+++ b/src/views/followvisit/again/index.vue
@@ -173,7 +173,7 @@
</div>
</div>
</el-col>
- <el-col :span="1.5">
+ <!-- <el-col :span="1.5">
<div class="documentf">
<div class="document">
<el-button
@@ -185,7 +185,7 @@
>
</div>
</div>
- </el-col>
+ </el-col> -->
<el-col :span="1.5">
<div class="documentf">
<div class="document">
diff --git a/src/views/followvisit/beHospitalized/followUp.vue b/src/views/followvisit/beHospitalized/followUp.vue
index 55c5573..134c2ed 100644
--- a/src/views/followvisit/beHospitalized/followUp.vue
+++ b/src/views/followvisit/beHospitalized/followUp.vue
@@ -1263,12 +1263,6 @@
},
],
loading: false,
- serviceStatusValue: 10,
- cascaderProps: {
- expandTrigger: "hover", // 鎮仠灞曞紑
- checkStrictly: true, // 鉁� 鍏抽敭锛氬厑璁搁�変腑浠绘剰涓�绾�
- emitPath: false, // 鉁� 鍙繑鍥為�変腑鐨勫�硷紝涓嶈繑鍥炶矾寰勬暟缁�
- },
// 闅忚鐘舵�佺骇鑱旈�夋嫨鍣�
serviceStatusOptions: [
{
@@ -1418,7 +1412,7 @@
topqueryParams: {
pageNum: 1,
pageSize: 10,
- sendstateView:2,
+ sendstateView:1,
sort: localStorage.getItem("orgname") == "涓芥按甯備腑鍖婚櫌" ? 8 : 2, //0 鍑洪櫌鏃堕棿(姝e簭) 1 鍑洪櫌鏃堕棿(鍊掑簭) 2 鍙戦�佹椂闂�(姝e簭) 3 鍙戦�佹椂闂�(鍊掑簭) 7搴旈殢璁挎棩鏈�(鍊掑簭) 搴旈殢璁挎棩鏈�(姝e簭)
serviceType: 18,
searchscope: 3,
@@ -1719,8 +1713,10 @@
this.getList(1);
},
onthatday() {
- this.topqueryParams.startSendDateTime = this.getCurrentDate();
- this.topqueryParams.endSendDateTime = this.getCurrentDate();
+ this.topqueryParams.sendstateView = 1; // 寰呴殢璁�
+ this.topqueryParams.sendstate = null;
+ this.topqueryParams.startSendDateTime = null;
+ this.topqueryParams.endSendDateTime = this.getCurrentDate(); // 寮�濮嬮殢璁挎棩鏈� <= 浠婂ぉ
this.getList(1);
},
getCurrentDate() {
@@ -1728,13 +1724,12 @@
return now.toISOString().slice(0, 10); // 鎴彇鍓�10涓瓧绗︼紝鍗� YYYY-MM-DD
},
buidegetTasklist(type) {
- if (this.topqueryParams.searchscope == 3) {
- this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
- (obj) => obj.deptCode
- );
- this.topqueryParams.leavehospitaldistrictcodes =
- store.getters.belongWards.map((obj) => obj.districtCode);
- }
+ // 鐢ㄦ埛鏉冮檺涓嬫墍鏈夊緟闅忚浠诲姟锛氫紶閫掑叏閮ㄧ瀹ゅ拰鐥呭尯
+ 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(
@@ -1746,7 +1741,7 @@
pageSize: 10,
leavehospitaldistrictcodes:
this.topqueryParams.leavehospitaldistrictcodes,
- sendstates: [2, 3],
+ sendstateView: 1,
leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
};
buidegetTasklist(obj).then((response) => {
@@ -1912,10 +1907,12 @@
resetQuery() {
this.dateRange = [];
this.dateRangefs = [];
+ this.serviceStatusValue = 10;
+
this.topqueryParams = {
pageNum: 1,
pageSize: 10,
- sendstateView:2,
+ sendstateView:1,
sort: 2, //0 鍑洪櫌鏃堕棿(姝e簭) 1 鍑洪櫌鏃堕棿(鍊掑簭) 2 鍙戦�佹椂闂�(姝e簭) 3 鍙戦�佹椂闂�(鍊掑簭)
serviceType: 18,
searchscope: 3,
diff --git a/src/views/followvisit/complaint/index.vue b/src/views/followvisit/complaint/index.vue
index 195ef8c..3e0c7c3 100644
--- a/src/views/followvisit/complaint/index.vue
+++ b/src/views/followvisit/complaint/index.vue
@@ -181,7 +181,7 @@
</div>
</div>
</el-col>
- <el-col :span="1.5">
+ <!-- <el-col :span="1.5">
<div class="documentf">
<div class="document">
<el-button
@@ -193,7 +193,7 @@
>
</div>
</div>
- </el-col>
+ </el-col> -->
<el-col :span="1.5">
<div class="documentf">
<div class="document">
@@ -1357,8 +1357,10 @@
this.getList(1);
},
onthatday() {
- this.topqueryParams.startSendDateTime = this.getCurrentDate();
- this.topqueryParams.endSendDateTime = this.getCurrentDate();
+ this.topqueryParams.sendstateView = 1; // 寰呴殢璁�
+ this.topqueryParams.sendstate = null;
+ this.topqueryParams.startSendDateTime = null;
+ this.topqueryParams.endSendDateTime = this.getCurrentDate(); // 寮�濮嬮殢璁挎棩鏈� <= 浠婂ぉ
this.getList(1);
},
getCurrentDate() {
@@ -1366,13 +1368,12 @@
return now.toISOString().slice(0, 10); // 鎴彇鍓�10涓瓧绗︼紝鍗� YYYY-MM-DD
},
buidegetTasklist(type) {
- if (this.topqueryParams.searchscope == 3) {
- this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
- (obj) => obj.deptCode
- );
- this.topqueryParams.leavehospitaldistrictcodes =
- store.getters.belongWards.map((obj) => obj.districtCode);
- }
+ // 鐢ㄦ埛鏉冮檺涓嬫墍鏈夊緟闅忚浠诲姟锛氫紶閫掑叏閮ㄧ瀹ゅ拰鐥呭尯
+ 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(
@@ -1384,7 +1385,7 @@
pageSize: 10,
leavehospitaldistrictcodes:
this.topqueryParams.leavehospitaldistrictcodes,
- sendstates: [2, 3],
+ sendstateView: 1,
leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
};
buidegetTasklist(obj).then((response) => {
diff --git a/src/views/followvisit/discharge/index.vue b/src/views/followvisit/discharge/index.vue
index 7b355eb..3531957 100644
--- a/src/views/followvisit/discharge/index.vue
+++ b/src/views/followvisit/discharge/index.vue
@@ -244,7 +244,7 @@
</div>
</el-col>
<div class="color-legend">
- <span class="legend-item" v-if="orgname == '鐪佺珛鍚屽痉缈犺嫅闄㈠尯'">
+ <span class="legend-item" v-if="orgname == '鍗楀崕澶у闄勫睘绗竴鍖婚櫌'">
<span class="legend-block legend-blue"></span>鏈埌闅忚鏃堕棿
</span>
<span class="legend-item">
@@ -1511,6 +1511,8 @@
value: dept.districtCode,
};
});
+ // 鍏嶇櫥鐩磋揪锛氭牴鎹瀹�/鐥呭尯缂栫爜棰勫~鎮h�呰寖鍥�
+ this.applyFollowUpScope();
if (this.errtype == 1) {
this.toleadExport(2);
} else if (this.errtype == 2) {
@@ -1725,8 +1727,10 @@
onthatday() {
this.resetQuerykj();
- this.topqueryParams.startSendDateTime = this.getCurrentDate();
- this.topqueryParams.endSendDateTime = this.getCurrentDate();
+ this.topqueryParams.sendstateView = 1; // 寰呴殢璁�
+ this.topqueryParams.sendstate = null;
+ this.topqueryParams.startSendDateTime = null;
+ this.topqueryParams.endSendDateTime = this.getCurrentDate(); // 寮�濮嬮殢璁挎棩鏈� <= 浠婂ぉ
this.getList(1);
},
getCurrentDate() {
@@ -1735,10 +1739,12 @@
},
buidegetTasklist(type) {
- if (type) {
- this.resetQuerykj();
- }
- this.applyDeptWardScope();
+ // 鐢ㄦ埛鏉冮檺涓嬫墍鏈夊緟闅忚浠诲姟锛氫紶閫掑叏閮ㄧ瀹ゅ拰鐥呭尯
+ 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(
@@ -1750,7 +1756,7 @@
pageSize: 10,
leavehospitaldistrictcodes:
this.topqueryParams.leavehospitaldistrictcodes,
- sendstates: [2, 3],
+ sendstateView: 1,
leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
};
buidegetTasklist(obj).then((response) => {
@@ -1847,6 +1853,7 @@
/** 鎼滅储鎸夐挳鎿嶄綔 */
handleQuery(refresh) {
this.applyDeptWardScope();
+ this.clearAllSelection();
this.topqueryParams.pageNum = 1;
// 鍒ゆ柇鏄笉鏄伐浣滃彴蹇嵎鏌ヨ
if (this.errtype != 2) {
@@ -1857,6 +1864,17 @@
}
this.getList(refresh);
},
+ // 鍏嶇櫥鐩磋揪锛氭牴鎹矾鐢变腑鐨勭瀹�/鐥呭尯缂栫爜棰勫~鎮h�呰寖鍥�
+ applyFollowUpScope() {
+ const deptCode = this.$route.query.followUpDeptCode;
+ const wardCode = this.$route.query.followUpWardCode;
+ if (!deptCode && !wardCode) return;
+ const scope = [];
+ if (deptCode) scope.push([1, deptCode]);
+ if (wardCode) scope.push([2, wardCode]);
+ this.topqueryParams.scopetype = scope;
+ this.lastScopeType = deptCode ? 1 : 2;
+ },
// 鎮h�呰寖鍥村鐞嗭細浠庡閫夌骇鑱� scopetype 瑙f瀽绉戝/鐥呭尯
applyDeptWardScope() {
const value = this.topqueryParams.scopetype || [];
diff --git a/src/views/followvisit/discharge/outpatientService.vue b/src/views/followvisit/discharge/outpatientService.vue
index 5910c74..f9811f2 100644
--- a/src/views/followvisit/discharge/outpatientService.vue
+++ b/src/views/followvisit/discharge/outpatientService.vue
@@ -185,7 +185,7 @@
</div>
</div>
</el-col>
- <el-col :span="1.5">
+ <!-- <el-col :span="1.5">
<div class="documentf">
<div class="document">
<el-button
@@ -197,7 +197,7 @@
>
</div>
</div>
- </el-col>
+ </el-col> -->
<el-col :span="1.5">
<div class="documentf">
<div class="document">
@@ -1227,8 +1227,10 @@
this.getList(1);
},
onthatday() {
- this.topqueryParams.startSendDateTime = this.getCurrentDate();
- this.topqueryParams.endSendDateTime = this.getCurrentDate();
+ this.topqueryParams.sendstateView = 1; // 寰呴殢璁�
+ this.topqueryParams.sendstate = null;
+ this.topqueryParams.startSendDateTime = null;
+ this.topqueryParams.endSendDateTime = this.getCurrentDate(); // 寮�濮嬮殢璁挎棩鏈� <= 浠婂ぉ
this.getList(1);
},
getCurrentDate() {
@@ -1236,13 +1238,12 @@
return now.toISOString().slice(0, 10); // 鎴彇鍓�10涓瓧绗︼紝鍗� YYYY-MM-DD
},
buidegetTasklist(type) {
- if (this.topqueryParams.searchscope == 3) {
- this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
- (obj) => obj.deptCode
- );
- this.topqueryParams.leavehospitaldistrictcodes =
- store.getters.belongWards.map((obj) => obj.districtCode);
- }
+ // 鐢ㄦ埛鏉冮檺涓嬫墍鏈夊緟闅忚浠诲姟锛氫紶閫掑叏閮ㄧ瀹ゅ拰鐥呭尯
+ 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(
@@ -1254,7 +1255,7 @@
pageSize: 10,
leavehospitaldistrictcodes:
this.topqueryParams.leavehospitaldistrictcodes,
- sendstates: [2, 3],
+ sendstateView: 1,
leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
};
buidegetTasklist(obj).then((response) => {
@@ -1418,10 +1419,12 @@
resetQuery() {
this.dateRange = [];
this.dateRangefs = [];
+ this.serviceStatusValue = 10;
+
this.topqueryParams = {
pageNum: 1,
pageSize: 10,
- sendstateView:2,
+ sendstateView:1,
sort: 2, //0 鍑洪櫌鏃堕棿(姝e簭) 1 鍑洪櫌鏃堕棿(鍊掑簭) 2 鍙戦�佹椂闂�(姝e簭) 3 鍙戦�佹椂闂�(鍊掑簭)
serviceType: 3,
searchscope: 3,
diff --git a/src/views/followvisit/mzsatisfaction/index.vue b/src/views/followvisit/mzsatisfaction/index.vue
index 0dd03b0..90c44aa 100644
--- a/src/views/followvisit/mzsatisfaction/index.vue
+++ b/src/views/followvisit/mzsatisfaction/index.vue
@@ -173,7 +173,7 @@
</div>
</div>
</el-col>
- <el-col :span="1.5">
+ <!-- <el-col :span="1.5">
<div class="documentf">
<div class="document">
<el-button
@@ -185,7 +185,7 @@
>
</div>
</div>
- </el-col>
+ </el-col> -->
<el-col :span="1.5">
<div class="documentf">
<div class="document">
@@ -1341,8 +1341,10 @@
this.getList(1);
},
onthatday() {
- this.topqueryParams.startSendDateTime = this.getCurrentDate();
- this.topqueryParams.endSendDateTime = this.getCurrentDate();
+ this.topqueryParams.sendstateView = 1; // 寰呴殢璁�
+ this.topqueryParams.sendstate = null;
+ this.topqueryParams.startSendDateTime = null;
+ this.topqueryParams.endSendDateTime = this.getCurrentDate(); // 寮�濮嬮殢璁挎棩鏈� <= 浠婂ぉ
this.getList(1);
},
getCurrentDate() {
@@ -1350,13 +1352,12 @@
return now.toISOString().slice(0, 10); // 鎴彇鍓�10涓瓧绗︼紝鍗� YYYY-MM-DD
},
buidegetTasklist(type) {
- if (this.topqueryParams.searchscope == 3) {
- this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
- (obj) => obj.deptCode
- );
- this.topqueryParams.leavehospitaldistrictcodes =
- store.getters.belongWards.map((obj) => obj.districtCode);
- }
+ // 鐢ㄦ埛鏉冮檺涓嬫墍鏈夊緟闅忚浠诲姟锛氫紶閫掑叏閮ㄧ瀹ゅ拰鐥呭尯
+ 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(
@@ -1368,7 +1369,7 @@
pageSize: 10,
leavehospitaldistrictcodes:
this.topqueryParams.leavehospitaldistrictcodes,
- sendstates: [2, 3],
+ sendstateView: 1,
leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
};
buidegetTasklist(obj).then((response) => {
diff --git a/src/views/followvisit/operation/index.vue b/src/views/followvisit/operation/index.vue
index d98d6e5..78a237f 100644
--- a/src/views/followvisit/operation/index.vue
+++ b/src/views/followvisit/operation/index.vue
@@ -1345,7 +1345,7 @@
topqueryParams: {
pageNum: 1,
pageSize: 10,
- sendstateView:2,
+ sendstateView:1,
sort: localStorage.getItem("orgname") == "涓芥按甯備腑鍖婚櫌" ? 8 : 2, //0 鎵嬫湳瀹屾垚鏃堕棿(姝e簭) 1 鎵嬫湳瀹屾垚鏃堕棿(鍊掑簭) 2 鍙戦�佹椂闂�(姝e簭) 3 鍙戦�佹椂闂�(鍊掑簭) 7搴旈殢璁挎棩鏈�(鍊掑簭) 搴旈殢璁挎棩鏈�(姝e簭)
serviceType: 19,
searchscope: 3,
@@ -1642,8 +1642,10 @@
this.getList(1);
},
onthatday() {
- this.topqueryParams.startSendDateTime = this.getCurrentDate();
- this.topqueryParams.endSendDateTime = this.getCurrentDate();
+ this.topqueryParams.sendstateView = 1; // 寰呴殢璁�
+ this.topqueryParams.sendstate = null;
+ this.topqueryParams.startSendDateTime = null;
+ this.topqueryParams.endSendDateTime = this.getCurrentDate(); // 寮�濮嬮殢璁挎棩鏈� <= 浠婂ぉ
this.getList(1);
},
getCurrentDate() {
@@ -1651,13 +1653,12 @@
return now.toISOString().slice(0, 10); // 鎴彇鍓�10涓瓧绗︼紝鍗� YYYY-MM-DD
},
buidegetTasklist(type) {
- if (this.topqueryParams.searchscope == 3) {
- this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
- (obj) => obj.deptCode
- );
- this.topqueryParams.leavehospitaldistrictcodes =
- store.getters.belongWards.map((obj) => obj.districtCode);
- }
+ // 鐢ㄦ埛鏉冮檺涓嬫墍鏈夊緟闅忚浠诲姟锛氫紶閫掑叏閮ㄧ瀹ゅ拰鐥呭尯
+ 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(
@@ -1669,7 +1670,7 @@
pageSize: 10,
leavehospitaldistrictcodes:
this.topqueryParams.leavehospitaldistrictcodes,
- sendstates: [2, 3],
+ sendstateView: 1,
leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
};
buidegetTasklist(obj).then((response) => {
@@ -1831,10 +1832,12 @@
resetQuery() {
this.dateRange = [];
this.dateRangefs = [];
+ this.serviceStatusValue = 10;
+
this.topqueryParams = {
pageNum: 1,
pageSize: 10,
- sendstateView:2,
+ sendstateView:1,
sort: 2, //0 鎵嬫湳瀹屾垚鏃堕棿(姝e簭) 1 鎵嬫湳瀹屾垚鏃堕棿(鍊掑簭) 2 鍙戦�佹椂闂�(姝e簭) 3 鍙戦�佹椂闂�(鍊掑簭)
serviceType: 19,
searchscope: 3,
diff --git a/src/views/followvisit/record/detailpage/index.vue b/src/views/followvisit/record/detailpage/index.vue
index 43446b9..cb7e4ef 100644
--- a/src/views/followvisit/record/detailpage/index.vue
+++ b/src/views/followvisit/record/detailpage/index.vue
@@ -336,8 +336,8 @@
v-if="
(orgname == '鍗楀崕澶у闄勫睘绗竴鍖婚櫌' ||
orgname == '涓芥按甯傜浜屼汉姘戝尰闄�' ||
- orgname == '缂欎簯鍘夸汉姘戝尰闄�'||
- orgname == '涓芥按甯傚骞间繚鍋ラ櫌'||
+ orgname == '缂欎簯鍘夸汉姘戝尰闄�' ||
+ orgname == '涓芥按甯傚骞间繚鍋ラ櫌' ||
orgname == '鏉鹃槼鍘夸腑鍖诲尰闄�') &&
!Voicetype
"
@@ -999,16 +999,29 @@
<div class="collapse-section">
<el-collapse v-model="collapseActive" accordion>
<el-collapse-item title="鎮h�呮。妗堜俊鎭�" name="patient">
- <el-form ref="userform2" :model="userform" label-width="90px" size="small">
+ <el-form
+ ref="userform2"
+ :model="userform"
+ label-width="90px"
+ size="small"
+ >
<el-row :gutter="16">
<el-col :span="12">
<el-form-item label="鎮h�呭鍚�">
- <el-input v-model="userform.name" placeholder="璇疯緭鍏ュ鍚�" maxlength="30"></el-input>
+ <el-input
+ v-model="userform.name"
+ placeholder="璇疯緭鍏ュ鍚�"
+ maxlength="30"
+ ></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="鎬у埆">
- <el-select v-model="userform.sex" placeholder="璇烽�夋嫨" style="width: 100%">
+ <el-select
+ v-model="userform.sex"
+ placeholder="璇烽�夋嫨"
+ style="width: 100%"
+ >
<el-option label="鐢�" :value="1"></el-option>
<el-option label="濂�" :value="2"></el-option>
</el-select>
@@ -1018,53 +1031,78 @@
<el-row :gutter="16">
<el-col :span="12">
<el-form-item label="骞撮緞">
- <el-input v-model="userform.age" placeholder="璇疯緭鍏ュ勾榫�" maxlength="20"></el-input>
+ <el-input
+ v-model="userform.age"
+ placeholder="璇疯緭鍏ュ勾榫�"
+ maxlength="20"
+ ></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="鑱旂郴鏂瑰紡">
- <el-input v-model="userform.telcode" placeholder="璇疯緭鍏ヨ仈绯绘柟寮�" maxlength="20"></el-input>
+ <el-input
+ v-model="userform.telcode"
+ placeholder="璇疯緭鍏ヨ仈绯绘柟寮�"
+ maxlength="20"
+ ></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="16">
<el-col :span="24">
<el-form-item label="浜插睘鐢佃瘽">
- <el-input v-model="userform.relativetelcode" placeholder="璇疯緭鍏ヤ翰灞炶仈绯绘柟寮�" maxlength="20"></el-input>
+ <el-input
+ v-model="userform.relativetelcode"
+ placeholder="璇疯緭鍏ヤ翰灞炶仈绯绘柟寮�"
+ maxlength="20"
+ ></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="16">
<el-col :span="24">
<el-form-item label="璇婃柇鍚嶇О">
- <el-input v-model="form.leavediagname" placeholder="璇疯緭鍏ヨ瘖鏂�" maxlength="50"></el-input>
+ <el-input
+ v-model="form.leavediagname"
+ placeholder="璇疯緭鍏ヨ瘖鏂�"
+ maxlength="50"
+ ></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="16">
<el-col :span="24">
<el-form-item label="鍑虹敓鍦�">
- <el-input v-model="userform.birthplace" placeholder="鍥姐�佺渷銆佸湴甯傘�佸尯鍘裤�佽閬撶瓑" maxlength="50"></el-input>
+ <el-input
+ v-model="userform.birthplace"
+ placeholder="鍥姐�佺渷銆佸湴甯傘�佸尯鍘裤�佽閬撶瓑"
+ maxlength="50"
+ ></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="16">
<el-col :span="24">
<el-form-item label="灞呬綇鍦�">
- <el-input v-model="userform.placeOfResidence" placeholder="鍥姐�佺渷銆佸湴甯傘�佸尯鍘裤�佽閬撶瓑" maxlength="50"></el-input>
+ <el-input
+ v-model="userform.placeOfResidence"
+ placeholder="鍥姐�佺渷銆佸湴甯傘�佸尯鍘裤�佽閬撶瓑"
+ maxlength="50"
+ ></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-collapse-item>
- <el-collapse-item title="鎶曡瘔寤鸿" name="advice" v-if="orgname=='缂欎簯鍘夸汉姘戝尰闄�'">
+ <el-collapse-item
+ title="鎶曡瘔寤鸿"
+ name="advice"
+ v-if="orgname == '缂欎簯鍘夸汉姘戝尰闄�'"
+ >
<AdviceList :subid="taskid" :taskid="id" :patid="patid" />
</el-collapse-item>
</el-collapse>
</div>
-
-
-
</div>
</div>
</div>
@@ -1670,7 +1708,7 @@
},
// 鏄惁浠ラ棶鍗峰舰寮忓睍绀猴紙闈炶闊虫湇鍔★紝鎴栬闊虫湇鍔′絾鏃犲畬鏁磋闊虫暟鎹渶鎵嬪姩濉姤锛�
showQuestionnaireForm() {
- return !this.Voicetype ;
+ return !this.Voicetype;
},
// 鏄惁涓虹鐞嗗憳瑙掕壊
isAdmin() {
@@ -2046,13 +2084,12 @@
.map((obj) => obj.targetvalue)
.join("&");
}
- console.log(item.targetvalue,'item.targetvalue');
+ console.log(item.targetvalue, "item.targetvalue");
if (item.targetvalue) {
item.scriptResult = item.targetvalue.split("&");
}
console.log(item.scriptResult);
-
});
}
});
@@ -2118,8 +2155,11 @@
this.$modal.msgSuccess("鏈嶅姟淇濆瓨鎴愬姛");
this.Editsingletasksonyic(this.serviceStates);
const orgName = localStorage.getItem("orgname");
-
- if (this.form.isVisitAgain != 1 || this.visitAgain == 1) {
+ if (
+ this.form.isVisitAgain != 1 ||
+ orgName == "涓芥按甯備腑鍖婚櫌" ||
+ this.visitAgain == 1
+ ) {
this.Torouter();
return;
}
@@ -2407,7 +2447,7 @@
savequestiondetail(obj).then((res) => {
if (res.code == 200) {
this.$modal.msgSuccess("鏈嶅姟淇濆瓨鎴愬姛");
- // this.Torouter();
+
if (
this.form.isVisitAgain != 1 ||
orgName == "涓芥按甯備腑鍖婚櫌" ||
@@ -2418,6 +2458,7 @@
this.Torouter();
return;
}
+
this.$modal
.confirm(
'浠诲姟淇濆瓨鎴愬姛鏄惁閽堝鎮h�咃細"' +
@@ -2750,6 +2791,7 @@
// 鍚屾椂閲嶇疆涓庨�夐」鐩稿叧鐨勭姸鎬�
// questionItem.isabnormal = false;
questionItem.showAppendInput = false;
+ questionItem.score = null; // 鍙栨秷閫変腑鍚庢竻绌洪鐩垎鏁�
// 娉ㄦ剰锛氬彇娑堥�変腑鏃讹紝鎴戜滑閫氬父涓嶅笇鏈涜Е鍙戦鐩烦杞�昏緫锛屾墍浠ョ洿鎺ヨ繑鍥�
// 濡傛灉闇�瑕侊紝鍙互鍦ㄨ繖閲屾坊鍔犲彇娑堥�変腑鍚庣殑鐗瑰畾閫昏緫锛屼緥濡傞噸缃鐩簭鍒�
} else {
@@ -2787,6 +2829,9 @@
// 澶勭悊寮傚父鐘舵�侀珮浜�
this.tableDatatop[questionIndex].isabnormal =
selectedOptionObj.isabnormal;
+
+ // 澶勭悊鍒嗘暟锛氭妸閫変腑閫夐」鐨� score 甯﹀埌棰樼洰 score 涓�
+ this.tableDatatop[questionIndex].score = selectedOptionObj.score;
// 澶勭悊闄勫姞杈撳叆妗嗘樉绀�
@@ -2881,6 +2926,10 @@
if (obj.isabnormal) {
this.tableDatatop[index].isabnormal = obj.isabnormal;
}
+ // 鍥炴樉鍗曢�夐鐩垎鏁帮細鎶婂凡閫変腑閫夐」鐨� score 甯﹀埌棰樼洰 score 涓�
+ if (obj.score !== undefined && obj.score !== null) {
+ this.tableDatatop[index].score = obj.score;
+ }
this.$forceUpdate();
}
});
@@ -2952,7 +3001,18 @@
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
},
- updateScore(a, b, c) {},
+ // 澶氶�夛細鎶婇�変腑閫夐」鐨勫垎鏁扮疮鍔犲埌棰樼洰 score 涓�
+ updateScore(selectedValues, questionIndex, question) {
+ const options = question.svyTaskTemplateTargetoptions || [];
+ const score = options.reduce((sum, opt) => {
+ if (selectedValues && selectedValues.includes(opt.optioncontent)) {
+ return sum + (Number(opt.score) || 0);
+ }
+ return sum;
+ }, 0);
+ question.score = score;
+ this.$forceUpdate();
+ },
// 鍚堝苟淇敼鐩稿叧=============================
toggleMergeMode() {
this.isMergeMode = !this.isMergeMode;
diff --git a/src/views/followvisit/record/index.vue b/src/views/followvisit/record/index.vue
index 33d5726..5f33b4b 100644
--- a/src/views/followvisit/record/index.vue
+++ b/src/views/followvisit/record/index.vue
@@ -1201,13 +1201,12 @@
return `${year}-${month}-${day}`;
},
buidegetTasklist(type) {
- if (this.topqueryParams.searchscope == 3) {
- this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
- (obj) => obj.deptCode
- );
- this.topqueryParams.leavehospitaldistrictcodes =
- store.getters.belongWards.map((obj) => obj.districtCode);
- }
+ // 鐢ㄦ埛鏉冮檺涓嬫墍鏈夊緟闅忚浠诲姟锛氫紶閫掑叏閮ㄧ瀹ゅ拰鐥呭尯
+ 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(
@@ -1219,7 +1218,7 @@
pageSize: 10,
leavehospitaldistrictcodes:
this.topqueryParams.leavehospitaldistrictcodes,
- sendstates: [2, 3],
+ sendstateView: 1,
leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
};
buidegetTasklist(obj).then((response) => {
@@ -1418,8 +1417,10 @@
});
},
onthatday() {
- this.topqueryParams.startSendDateTime = this.getCurrentDate();
- this.topqueryParams.endSendDateTime = this.getCurrentDate();
+ this.topqueryParams.sendstateView = 1; // 寰呴殢璁�
+ this.topqueryParams.sendstate = null;
+ this.topqueryParams.startSendDateTime = null;
+ this.topqueryParams.endSendDateTime = this.getCurrentDate(); // 寮�濮嬮殢璁挎棩鏈� <= 浠婂ぉ
this.getList(1);
},
getCurrentDate() {
diff --git a/src/views/followvisit/technology/index.vue b/src/views/followvisit/technology/index.vue
index b452289..33ed94e 100644
--- a/src/views/followvisit/technology/index.vue
+++ b/src/views/followvisit/technology/index.vue
@@ -1037,13 +1037,12 @@
});
},
buidegetTasklist(type) {
- if (this.topqueryParams.searchscope == 3) {
- this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
- (obj) => obj.deptCode
- );
- this.topqueryParams.leavehospitaldistrictcodes =
- store.getters.belongWards.map((obj) => obj.districtCode);
- }
+ // 鐢ㄦ埛鏉冮檺涓嬫墍鏈夊緟闅忚浠诲姟锛氫紶閫掑叏閮ㄧ瀹ゅ拰鐥呭尯
+ 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(
@@ -1055,7 +1054,7 @@
pageSize: 10,
leavehospitaldistrictcodes:
this.topqueryParams.leavehospitaldistrictcodes,
- sendstates: [2, 3],
+ sendstateView: 1,
leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
};
buidegetTasklist(obj).then((response) => {
diff --git a/src/views/followvisit/zbAgain/index.vue b/src/views/followvisit/zbAgain/index.vue
index bce150c..7b94858 100644
--- a/src/views/followvisit/zbAgain/index.vue
+++ b/src/views/followvisit/zbAgain/index.vue
@@ -173,7 +173,7 @@
</div>
</div>
</el-col>
- <el-col :span="1.5">
+ <!-- <el-col :span="1.5">
<div class="documentf">
<div class="document">
<el-button
@@ -185,7 +185,7 @@
>
</div>
</div>
- </el-col>
+ </el-col> -->
<el-col :span="1.5">
<div class="documentf">
<div class="document">
@@ -1005,7 +1005,7 @@
topqueryParams: {
pageNum: 1,
pageSize: 10,
- sendstateView:2,
+ sendstateView:1,
sort: localStorage.getItem("orgname") == "涓芥按甯備腑鍖婚櫌" ? 8 : 2, //0 鍑洪櫌鏃堕棿(姝e簭) 1 鍑洪櫌鏃堕棿(鍊掑簭) 2 鍙戦�佹椂闂�(姝e簭) 3 鍙戦�佹椂闂�(鍊掑簭) 7搴旈殢璁挎棩鏈�(鍊掑簭) 搴旈殢璁挎棩鏈�(姝e簭)
serviceType: 13,
searchscope: 3,
@@ -1220,8 +1220,10 @@
this.getList(1);
},
onthatday() {
- this.topqueryParams.startSendDateTime = this.getCurrentDate();
- this.topqueryParams.endSendDateTime = this.getCurrentDate();
+ this.topqueryParams.sendstateView = 1; // 寰呴殢璁�
+ this.topqueryParams.sendstate = null;
+ this.topqueryParams.startSendDateTime = null;
+ this.topqueryParams.endSendDateTime = this.getCurrentDate(); // 寮�濮嬮殢璁挎棩鏈� <= 浠婂ぉ
this.getList(1);
},
getCurrentDate() {
@@ -1229,16 +1231,15 @@
return now.toISOString().slice(0, 10); // 鎴彇鍓�10涓瓧绗︼紝鍗� YYYY-MM-DD
},
buidegetTasklist(type) {
- 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.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(
@@ -1250,7 +1251,7 @@
pageSize: 10,
leavehospitaldistrictcodes:
this.topqueryParams.leavehospitaldistrictcodes,
- sendstates: [2, 3],
+ sendstateView: 1,
visitDeptCodes: this.topqueryParams.visitDeptCodes,
leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
};
@@ -1425,7 +1426,7 @@
this.topqueryParams = {
pageNum: 1,
pageSize: 10,
- sendstateView:2,
+ sendstateView:1,
sort: 2, //0 鍑洪櫌鏃堕棿(姝e簭) 1 鍑洪櫌鏃堕棿(鍊掑簭) 2 鍙戦�佹椂闂�(姝e簭) 3 鍙戦�佹椂闂�(鍊掑簭)
serviceType: 13,
searchscope: 3,
diff --git a/src/views/followvisit/zysatisfaction/index.vue b/src/views/followvisit/zysatisfaction/index.vue
index 1577d9a..7197083 100644
--- a/src/views/followvisit/zysatisfaction/index.vue
+++ b/src/views/followvisit/zysatisfaction/index.vue
@@ -184,7 +184,7 @@
</div>
</div>
</el-col>
- <el-col :span="1.5">
+ <!-- <el-col :span="1.5">
<div class="documentf">
<div class="document">
<el-button
@@ -196,7 +196,7 @@
>
</div>
</div>
- </el-col>
+ </el-col> -->
<el-col :span="1.5">
<div class="documentf">
<div class="document">
@@ -1359,13 +1359,12 @@
return now.toISOString().slice(0, 10); // 鎴彇鍓�10涓瓧绗︼紝鍗� YYYY-MM-DD
},
buidegetTasklist(type) {
- if (this.topqueryParams.searchscope == 3) {
- this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
- (obj) => obj.deptCode
- );
- this.topqueryParams.leavehospitaldistrictcodes =
- store.getters.belongWards.map((obj) => obj.districtCode);
- }
+ // 鐢ㄦ埛鏉冮檺涓嬫墍鏈夊緟闅忚浠诲姟锛氫紶閫掑叏閮ㄧ瀹ゅ拰鐥呭尯
+ 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(
@@ -1377,7 +1376,7 @@
pageSize: 10,
leavehospitaldistrictcodes:
this.topqueryParams.leavehospitaldistrictcodes,
- sendstates: [2, 3],
+ sendstateView: 1,
leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
};
buidegetTasklist(obj).then((response) => {
diff --git a/src/views/login.vue b/src/views/login.vue
index 10cf9d3..ae3f1a4 100644
--- a/src/views/login.vue
+++ b/src/views/login.vue
@@ -13,6 +13,7 @@
type="text"
auto-complete="off"
placeholder="璐﹀彿"
+ @blur="handleUsernameBlur"
>
<svg-icon
slot="prefix"
@@ -184,6 +185,17 @@
}
});
},
+ // 杈撳叆瀹岃处鍙峰悗锛屾绱㈠彲閫夋満鏋勬槸鍚﹀寘鍚�滃崡鍗庨檮涓�鈥濓紝鑻ユ湁鍒欒嚜鍔ㄥ~鍏呭瘑鐮�
+ handleUsernameBlur() {
+ if (!this.loginForm.username) return;
+ const hasNanhua = this.options.some((item) => {
+ const label = item.label || "";
+ return label.includes("鍗楀崕") && label.includes("闄勪竴");
+ });
+ if (hasNanhua) {
+ this.loginForm.password = "nhfy@0230";
+ }
+ },
getCookie() {
const username = Cookies.get("username");
const password = Cookies.get("password");
diff --git a/src/views/loginSSO.vue b/src/views/loginSSO.vue
index b11fb85..73f24c1 100644
--- a/src/views/loginSSO.vue
+++ b/src/views/loginSSO.vue
@@ -162,6 +162,8 @@
id,
Voicetype,
visitCount,
+ followUpDeptCode,
+ followUpWardCode,
} = params;
console.log(
token,
@@ -171,6 +173,8 @@
deptCode,
redirect,
campusid,
+ followUpDeptCode,
+ followUpWardCode,
"鍙傛暟鏃ュ織"
);
@@ -229,8 +233,16 @@
visitCount: visitCount || "",
};
console.log("浣跨敤taskid璺宠浆鍒拌鎯呴〉:", redirectPath, redirectQuery);
+ } else if (followUpDeptCode || followUpWardCode) {
+ // 7.2 鎼哄甫绉戝/鐥呭尯缂栫爜锛岃烦杞埌鍑洪櫌闅忚鍒楄〃骞舵寜绉戝/鐥呭尯鏌ヨ
+ redirectPath = "/followvisit/discharge";
+ redirectQuery = {
+ followUpDeptCode: followUpDeptCode || "",
+ followUpWardCode: followUpWardCode || "",
+ };
+ console.log("浣跨敤绉戝/鐥呭尯缂栫爜璺宠浆鍒板嚭闄㈤殢璁垮垪琛�:", redirectPath, redirectQuery);
} else if (redirect) {
- // 7.2 濡傛灉浼犲叆鐨剅edirect瀛樺湪锛屼娇鐢ㄤ紶鍏ョ殑閲嶅畾鍚戣矾寰�
+ // 7.3 濡傛灉浼犲叆鐨剅edirect瀛樺湪锛屼娇鐢ㄤ紶鍏ョ殑閲嶅畾鍚戣矾寰�
try {
redirectPath = decodeURIComponent(redirect);
console.log("浣跨敤浼犲叆鐨勯噸瀹氬悜璺緞:", redirectPath);
@@ -239,7 +251,7 @@
redirectPath = this.getDefaultRedirectPath();
}
} else {
- // 7.3 浣跨敤榛樿璺緞
+ // 7.4 浣跨敤榛樿璺緞
redirectPath = this.getDefaultRedirectPath();
}
diff --git a/src/views/patient/archives/childHealth/detail.vue b/src/views/patient/archives/childHealth/detail.vue
index 9505e80..be662b4 100644
--- a/src/views/patient/archives/childHealth/detail.vue
+++ b/src/views/patient/archives/childHealth/detail.vue
@@ -3,9 +3,18 @@
<template v-if="archive">
<div class="action-bar">
<el-button @click="$router.go(-1)" icon="el-icon-back">杩斿洖</el-button>
- <el-button :type="editing ? 'success' : 'primary'" :icon="editing ? 'el-icon-check' : 'el-icon-edit'" @click="toggleEdit">{{ editing ? '淇濆瓨' : '缂栬緫' }}</el-button>
- <el-tag :type="subTypeTag(archive.subType)" style="margin-left:12px">{{ archive.subTypeLabel }}</el-tag>
+ <el-button :type="editing ? 'success' : 'primary'" :icon="editing ? 'el-icon-check' : 'el-icon-edit'" @click="toggleEdit">
+ {{ editing ? '淇濆瓨' : '缂栬緫' }}
+ </el-button>
+ <el-button v-if="archive.closeStatus != 1" type="danger" plain icon="el-icon-circle-close" @click="handleCloseCase">缁撴</el-button>
+ <el-tag :type="archive.closeStatus == 1 ? 'info' : 'success'" style="margin-left:12px">
+ {{ archive.closeStatus == 1 ? '宸茬粨妗�' : '鏈粨妗�' }}
+ </el-tag>
+ <el-tag :type="subTypeTag(archive.subType)" style="margin-left:8px">{{ archive.subTypeLabel }}</el-tag>
</div>
+
+ <el-tabs v-model="mainTab" type="border-card">
+ <el-tab-pane label="妗f璇︽儏" name="detail">
<!-- 鎮h�呭熀鏈俊鎭� -->
<el-card class="info-card" shadow="never">
@@ -19,7 +28,6 @@
<el-row :gutter="20" style="margin-top:10px">
<el-col :span="6"><InfoField label="绉戝" :value="archive.deptname" /></el-col>
<el-col :span="6"><InfoField label="璇婃柇" :value="archive.diagname" /></el-col>
- <el-col :span="6"><InfoField label="涓绘不鍖荤敓" :value="archive.drname" /></el-col>
<el-col :span="6"><InfoField label="鏉ユ簮" :value="sourceLabel" /></el-col>
</el-row>
</el-card>
@@ -27,43 +35,54 @@
<!-- 瀹堕暱淇℃伅 -->
<el-card class="info-card" shadow="never" style="margin-top:14px">
<div slot="header" class="card-header"><span>瀹堕暱/鐩戞姢浜轰俊鎭�</span></div>
- <el-row :gutter="20">
- <el-col :span="6">
- <InfoField label="瀹堕暱濮撳悕" :value="parentInfo.parentName" :editing="editing" v-model="parentInfo.parentName" />
- </el-col>
- <el-col :span="6">
- <InfoField label="涓庡効绔ュ叧绯�" :value="relationLabel" :editing="editing" type="select" :options="relationOptions" @change="v => parentInfo.relation = v" />
- </el-col>
- <el-col :span="6">
- <InfoField label="鑱旂郴鐢佃瘽" :value="parentInfo.parentPhone" :editing="editing" v-model="parentInfo.parentPhone" />
- </el-col>
- <el-col :span="6">
- <InfoField label="韬唤璇佸彿" :value="parentInfo.parentIdCard" :editing="editing" v-model="parentInfo.parentIdCard" />
- </el-col>
- </el-row>
- <el-row :gutter="20" style="margin-top:10px">
- <el-col :span="12">
- <InfoField label="鑱旂郴鍦板潃" :value="parentInfo.address" :editing="editing" v-model="parentInfo.address" />
- </el-col>
- </el-row>
+ <el-form :model="parentInfo" label-width="110px" size="small" :disabled="!editing">
+ <el-row :gutter="20">
+ <el-col :span="8"><el-form-item label="瀹堕暱濮撳悕"><el-input v-model="parentInfo.parentName" class="w-sm" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="涓庡効绔ュ叧绯�">
+ <el-select v-model="parentInfo.relation" class="w-sm">
+ <el-option v-for="o in relationOptions" :key="o.value" :label="o.label" :value="o.value" />
+ </el-select>
+ </el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="鑱旂郴鐢佃瘽"><el-input v-model="parentInfo.parentPhone" class="w-sm" /></el-form-item></el-col>
+ </el-row>
+ <el-row :gutter="20">
+ <el-col :span="8"><el-form-item label="韬唤璇佸彿"><el-input v-model="parentInfo.parentIdCard" class="w-md" /></el-form-item></el-col>
+ <el-col :span="16"><el-form-item label="鑱旂郴鍦板潃"><el-input v-model="parentInfo.address" class="w-full" /></el-form-item></el-col>
+ </el-row>
+ </el-form>
</el-card>
- <!-- 妗f鍩烘湰淇℃伅 -->
+ <!-- 妗f淇℃伅锛堝彲缂栬緫锛� -->
<el-card class="info-card" shadow="never" style="margin-top:14px">
<div slot="header" class="card-header">
- <span>妗f鍩烘湰淇℃伅</span>
+ <span>妗f淇℃伅</span>
<span class="header-sub">{{ archive.createTime ? archive.createTime.substring(0,10) : '-' }} 寤烘。</span>
</div>
- <el-row :gutter="20">
- <el-col :span="8"><InfoField label="寤烘。绫诲瀷" :value="archive.subTypeLabel" /></el-col>
- <el-col :span="8"><InfoField label="寤烘。鍖荤敓" :value="archive.archiveForm.doctorName" :editing="editing" v-model="archive.archiveForm.doctorName" /></el-col>
- <el-col :span="8"><InfoField label="寤烘。鏃堕棿" :value="archive.createTime" /></el-col>
- </el-row>
+ <el-form :model="archive" label-width="110px" size="small" :disabled="!editing">
+ <el-row :gutter="20">
+ <el-col :span="8"><el-form-item label="鍑虹敓鏃ユ湡"><el-date-picker v-model="archive.birthday" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="鍑虹敓浣撻噸"><el-input v-model="archive.birthWeight" class="w-xs" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="鍑虹敓瀛曞懆"><el-input v-model="archive.gestationalWeek" class="w-xs" /></el-form-item></el-col>
+ </el-row>
+ <el-row :gutter="20">
+ <el-col :span="8"><el-form-item label="璇婃柇鏃ユ湡"><el-date-picker v-model="archive.diagnosisDate" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="涓绘不鍖荤敓"><el-input v-model="archive.attendingDoctor" class="w-sm" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="缁忕鍖荤敓"><el-input v-model="archive.managingDoctor" class="w-sm" /></el-form-item></el-col>
+ </el-row>
+ <el-row :gutter="20">
+ <el-col :span="8"><el-form-item label="鐧昏浜哄憳"><el-input v-model="archive.registrant" class="w-sm" /></el-form-item></el-col>
+ </el-row>
+ </el-form>
</el-card>
<!-- 楂樺嵄鍎夸笓妗� 鈫� 鍙紪杈戣〃鏍� -->
<el-card v-if="archive.subType === 'highRisk'" class="info-card" shadow="never" style="margin-top:14px">
<div slot="header" class="card-header"><span>楂樺嵄鍎夸笓妗堢鐞�</span></div>
+ <el-form :model="archive" label-width="110px" size="small" :disabled="!editing" inline>
+ <el-form-item label="楂樺嵄鍎垮垎绫�"><el-input v-model="archive.highRiskCategory" class="w-md" /></el-form-item>
+ <el-form-item label="楂樺嵄鍎垮悕绉�"><el-input v-model="archive.highRiskName" class="w-lg" /></el-form-item>
+ <el-form-item label="鎷熼殢璁挎棩鏈�"><el-date-picker v-model="archive.followupDate" value-format="yyyy-MM-dd" class="w-md" /></el-form-item>
+ </el-form>
<el-tabs v-model="activeTab" type="border-card">
<el-tab-pane label="鐢熼暱鍙戣偛鐩戞祴" name="growth">
<EditableTable :data.sync="growthData" :editing="editing" :columns="growthColumns" />
@@ -80,6 +99,9 @@
<!-- 钀ュ吇鎬х柧鐥呬笓妗� 鈫� 鍙紪杈戣〃鏍� -->
<el-card v-if="archive.subType === 'nutrition'" class="info-card" shadow="never" style="margin-top:14px">
<div slot="header" class="card-header"><span>钀ュ吇鎬х柧鐥呬笓妗堢鐞�</span></div>
+ <el-form :model="archive" label-width="130px" size="small" :disabled="!editing" inline>
+ <el-form-item label="钀ュ吇鎬х柧鐥呭悕绉�"><el-input v-model="archive.nutritionName" class="w-lg" /></el-form-item>
+ </el-form>
<el-tabs v-model="activeTab" type="border-card">
<el-tab-pane label="浣撴牸娴嬮噺" name="measure">
<EditableTable :data.sync="measureData" :editing="editing" :columns="measureColumns" />
@@ -96,23 +118,26 @@
<!-- 瀛︿範鍥伴毦涓撴 鈫� 鍗曚竴琛ㄥ崟 -->
<el-card v-if="archive.subType === 'learning'" class="info-card" shadow="never" style="margin-top:14px">
<div slot="header" class="card-header"><span>瀛︿範鍥伴毦涓撴绠$悊</span></div>
+ <el-form :model="archive" label-width="110px" size="small" :disabled="!editing" inline>
+ <el-form-item label="棰勭害鎯呭喌"><el-input v-model="archive.appointmentStatus" class="w-lg" /></el-form-item>
+ </el-form>
<el-form :model="form" label-width="130px" size="small" :disabled="!editing">
<el-divider content-position="left">瀛︿範鑳藉姏璇勪及</el-divider>
<el-row :gutter="20">
- <el-col :span="8"><el-form-item label="璇勪及鏃ユ湡"><el-date-picker v-model="form.assessDate" value-format="yyyy-MM-dd" style="width:100%" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="娴嬭瘎宸ュ叿"><el-input v-model="form.testName" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="璇勪及鏃ユ湡"><el-date-picker v-model="form.assessDate" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="娴嬭瘎宸ュ叿"><el-input v-model="form.testName" class="w-sm" /></el-form-item></el-col>
<el-col :span="8"><el-form-item label="鏅哄晢(IQ)"><el-input-number v-model="form.iq" :min="40" :max="160" /></el-form-item></el-col>
</el-row>
<el-row :gutter="20">
- <el-col :span="8"><el-form-item label="闃呰鑳藉姏"><el-select v-model="form.reading" style="width:100%"><el-option v-for="o in gradeOptions" :key="o" :label="o" :value="o" /></el-select></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="涔﹀啓鑳藉姏"><el-select v-model="form.writing" style="width:100%"><el-option v-for="o in gradeOptions" :key="o" :label="o" :value="o" /></el-select></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="璁$畻鑳藉姏"><el-select v-model="form.math" style="width:100%"><el-option v-for="o in gradeOptions" :key="o" :label="o" :value="o" /></el-select></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="闃呰鑳藉姏"><el-select v-model="form.reading" class="w-sm"><el-option v-for="o in gradeOptions" :key="o" :label="o" :value="o" /></el-select></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="涔﹀啓鑳藉姏"><el-select v-model="form.writing" class="w-sm"><el-option v-for="o in gradeOptions" :key="o" :label="o" :value="o" /></el-select></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="璁$畻鑳藉姏"><el-select v-model="form.math" class="w-sm"><el-option v-for="o in gradeOptions" :key="o" :label="o" :value="o" /></el-select></el-form-item></el-col>
</el-row>
<el-form-item label="缁煎悎缁撹"><el-input v-model="form.result" type="textarea" :rows="2" /></el-form-item>
<el-divider content-position="left">琛屼负璇勪及</el-divider>
<el-row :gutter="20">
- <el-col :span="8"><el-form-item label="璇勪及鏃ユ湡"><el-date-picker v-model="form.behaviorDate" value-format="yyyy-MM-dd" style="width:100%" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="璇勪及鏃ユ湡"><el-date-picker v-model="form.behaviorDate" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
<el-col :span="4"><el-form-item label="娉ㄦ剰鍔�"><el-input-number v-model="form.attention" :min="0" :max="36" /></el-form-item></el-col>
<el-col :span="4"><el-form-item label="澶氬姩"><el-input-number v-model="form.hyperactivity" :min="0" :max="36" /></el-form-item></el-col>
<el-col :span="4"><el-form-item label="鍐插姩"><el-input-number v-model="form.impulsivity" :min="0" :max="36" /></el-form-item></el-col>
@@ -120,22 +145,29 @@
</el-row>
<el-row :gutter="20">
<el-col :span="8"><el-form-item label="鎬诲垎"><el-input-number v-model="form.totalScore" disabled /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="璇勪环"><el-select v-model="form.evaluation" style="width:100%"><el-option label="姝e父鑼冨洿" value="姝e父鑼冨洿" /><el-option label="杞诲害寮傚父" value="杞诲害寮傚父" /><el-option label="涓害寮傚父" value="涓害寮傚父" /></el-select></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="璇勪环"><el-select v-model="form.evaluation" class="w-sm"><el-option label="姝e父鑼冨洿" value="姝e父鑼冨洿" /><el-option label="杞诲害寮傚父" value="杞诲害寮傚父" /><el-option label="涓害寮傚父" value="涓害寮傚父" /></el-select></el-form-item></el-col>
</el-row>
<el-divider content-position="left">骞查璁粌璁板綍</el-divider>
<el-row :gutter="20">
- <el-col :span="8"><el-form-item label="璁粌鏃ユ湡"><el-date-picker v-model="form.trainDate" value-format="yyyy-MM-dd" style="width:100%" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="璁粌绫诲瀷"><el-input v-model="form.trainingType" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="璁粌鏃ユ湡"><el-date-picker v-model="form.trainDate" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="璁粌绫诲瀷"><el-input v-model="form.trainingType" class="w-sm" /></el-form-item></el-col>
<el-col :span="8"><el-form-item label="鏃堕暱(鍒嗛挓)"><el-input-number v-model="form.duration" :min="10" :max="120" /></el-form-item></el-col>
</el-row>
<el-form-item label="璁粌鍐呭"><el-input v-model="form.trainContent" type="textarea" :rows="2" /></el-form-item>
<el-row :gutter="20">
- <el-col :span="8"><el-form-item label="璁粌甯�"><el-input v-model="form.trainer" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="杩涘睍"><el-select v-model="form.progress" style="width:100%"><el-option label="鑹ソ" value="鑹ソ" /><el-option label="涓�鑸�" value="涓�鑸�" /><el-option label="缂撴參" value="缂撴參" /></el-select></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="璁粌甯�"><el-input v-model="form.trainer" class="w-sm" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="杩涘睍"><el-select v-model="form.progress" class="w-sm"><el-option label="鑹ソ" value="鑹ソ" /><el-option label="涓�鑸�" value="涓�鑸�" /><el-option label="缂撴參" value="缂撴參" /></el-select></el-form-item></el-col>
</el-row>
</el-form>
</el-card>
+
+ </el-tab-pane>
+
+ <el-tab-pane label="鏈嶅姟璁板綍" name="service">
+ <ServiceRecords :patid="archive.patid" />
+ </el-tab-pane>
+ </el-tabs>
</template>
<div v-else class="empty-wrap">妗f涓嶅瓨鍦ㄦ垨宸插垹闄�</div>
</div>
@@ -144,13 +176,15 @@
<script>
import EditableTable from "../components/EditableTable.vue";
import InfoField from "./InfoField.vue";
+import ServiceRecords from "../components/ServiceRecords.vue";
+import { loadArchives, saveArchives } from "../types";
export default {
name: "ChildHealthArchiveDetail",
- components: { EditableTable, InfoField },
+ components: { EditableTable, InfoField, ServiceRecords },
data() {
return {
- loading: false, archive: null, editing: false, activeTab: "growth",
+ loading: false, archive: null, editing: true, activeTab: "growth", mainTab: "detail",
relationOptions: [
{ label:"鐖朵翰", value:"father" },{ label:"姣嶄翰", value:"mother" },{ label:"绁栫埗", value:"grandfather" },{ label:"绁栨瘝", value:"grandmother" },{ label:"鍏朵粬", value:"other" },
],
@@ -203,21 +237,17 @@
const map = { standalone:"鐙珛寤烘。", outpatient:"闂ㄨ瘖璁板綍", inpatient:"鍦ㄩ櫌璁板綍" };
return map[this.archive?.sourcePage] || this.archive?.sourcePage || "-";
},
- relationLabel() {
- const r = this.relationOptions.find(o => o.value === (this.archive?.parentInfo?.relation));
- return r ? r.label : "-";
- },
},
created() {
const id = this.$route.query.id;
- if (id) this.loadArchive(id);
+ if (id) this.loadArchive(id, this.$route.query.edit == 1);
},
methods: {
- loadArchive(id) {
+ loadArchive(id, autoEdit) {
this.loading = true;
- const all = JSON.parse(localStorage.getItem("patientArchives") || "[]");
- this.archive = all.find(item => item.id === id) || null;
+ this.archive = loadArchives().find((item) => item.id === id) || null;
if (this.archive) {
+ if (!this.archive.parentInfo) this.archive.parentInfo = {};
if (this.archive.subType === 'highRisk') {
this.activeTab = "growth";
this.growthData = this.archive.growthData || getDefaultGrowthData();
@@ -232,6 +262,7 @@
Object.assign(this.form, this.archive.archiveForm.learningData);
}
}
+ if (autoEdit) this.editing = true;
this.loading = false;
},
toggleEdit() {
@@ -251,13 +282,24 @@
this.archive.planData = JSON.parse(JSON.stringify(this.planData));
}
this.archive.updateTime = new Date().toISOString().replace("T"," ").substring(0,19);
- const all = JSON.parse(localStorage.getItem("patientArchives") || "[]");
+ const all = loadArchives();
const idx = all.findIndex(item => item.id === this.archive.id);
if (idx >= 0) all[idx] = JSON.parse(JSON.stringify(this.archive));
- localStorage.setItem("patientArchives", JSON.stringify(all));
+ saveArchives(all);
this.$message.success("淇濆瓨鎴愬姛");
}
this.editing = !this.editing;
+ },
+ handleCloseCase() {
+ this.$modal.confirm("纭灏嗚妗f缁撴锛�").then(() => {
+ this.archive.closeStatus = 1;
+ this.archive.updateTime = new Date().toISOString().replace("T"," ").substring(0,19);
+ const all = loadArchives();
+ const idx = all.findIndex(item => item.id === this.archive.id);
+ if (idx >= 0) all[idx] = JSON.parse(JSON.stringify(this.archive));
+ saveArchives(all);
+ this.$message.success("宸茬粨妗�");
+ }).catch(() => {});
},
subTypeTag(type) { const m={highRisk:"danger",nutrition:"warning",learning:"info"}; return m[type]||""; },
},
@@ -297,6 +339,13 @@
</script>
<style lang="scss" scoped>
+// 杈撳叆妗嗗搴︼紙鎸夊瓧娈甸暱鐭尯鍒嗭級
+.w-xs { width: 90px; }
+.w-sm { width: 150px; }
+.w-md { width: 200px; }
+.w-lg { width: 280px; }
+.w-full { width: 100%; }
+
.action-bar { margin-bottom: 16px; }
.info-card { margin-bottom: 0; }
.card-header { display: flex; justify-content: space-between; align-items: center; font-size: 16px; font-weight: 600; }
diff --git a/src/views/patient/archives/components/ArchiveDialog.vue b/src/views/patient/archives/components/ArchiveDialog.vue
index a5a4207..3b54e85 100644
--- a/src/views/patient/archives/components/ArchiveDialog.vue
+++ b/src/views/patient/archives/components/ArchiveDialog.vue
@@ -1,15 +1,14 @@
<template>
<el-dialog
- :title="dialogTitle"
+ :title="standalone ? '鏂板缓寤烘。' : '閫夋嫨寤烘。绫诲瀷'"
:visible.sync="dialogVisible"
- width="750px"
+ width="640px"
:close-on-click-modal="false"
append-to-body
@close="handleClose"
- top="3vh"
>
<!-- 宸查�夋偅鑰呴瑙堬紙鍏宠仈寤烘。妯″紡锛� -->
- <div class="archive-section" v-if="selectedPatients.length > 0">
+ <div class="archive-section" v-if="!standalone && selectedPatients.length > 0">
<div class="section-title">宸查�夋偅鑰咃紙{{ selectedPatients.length }}浜猴級</div>
<el-table :data="selectedPatients" border size="small" max-height="180">
<el-table-column prop="patname" label="濮撳悕" width="80" align="center" />
@@ -52,186 +51,24 @@
<el-divider />
</div>
- <!-- 鍎夸繚绉戯細瀹堕暱淇℃伅锛堝繀濉級 -->
- <div class="archive-section" v-if="mainCategory === 'child'">
- <div class="section-title">瀹堕暱/鐩戞姢浜轰俊鎭�</div>
- <el-form :model="parentInfo" label-width="100px" size="small" inline>
- <el-form-item label="瀹堕暱濮撳悕" required>
- <el-input v-model="parentInfo.parentName" placeholder="璇疯緭鍏�" style="width:150px" />
- </el-form-item>
- <el-form-item label="涓庡効绔ュ叧绯�">
- <el-select v-model="parentInfo.relation" style="width:120px">
- <el-option label="鐖朵翰" value="father" />
- <el-option label="姣嶄翰" value="mother" />
- <el-option label="绁栫埗" value="grandfather" />
- <el-option label="绁栨瘝" value="grandmother" />
- <el-option label="鍏朵粬" value="other" />
- </el-select>
- </el-form-item>
- <el-form-item label="鑱旂郴鐢佃瘽" required>
- <el-input v-model="parentInfo.parentPhone" placeholder="鑱旂郴鐢佃瘽" style="width:150px" />
- </el-form-item>
- <el-form-item label="韬唤璇佸彿">
- <el-input v-model="parentInfo.parentIdCard" placeholder="韬唤璇佸彿" style="width:200px" />
- </el-form-item>
- <el-form-item label="鑱旂郴鍦板潃">
- <el-input v-model="parentInfo.address" placeholder="鑱旂郴鍦板潃" style="width:300px" />
- </el-form-item>
- </el-form>
- <el-divider />
- </div>
-
- <!-- 寤烘。涓诲垎绫� -->
+ <!-- 涓撴绫诲瀷閫夋嫨 -->
<div class="archive-section">
- <div class="section-title">閫夋嫨寤烘。绫诲瀷</div>
- <el-radio-group v-model="mainCategory" size="medium" @change="onMainCategoryChange">
- <el-radio-button label="child">鍎夸繚绉戝缓妗�</el-radio-button>
- <el-radio-button label="maternal">濡囦繚绉戝缓妗�</el-radio-button>
- </el-radio-group>
- </div>
-
- <!-- 瀛愮被鍨� -->
- <div class="archive-section" v-if="mainCategory">
<div class="section-title">閫夋嫨涓撴绫诲瀷</div>
- <el-radio-group v-model="subType" size="small" @change="onSubTypeChange">
- <template v-if="mainCategory === 'child'">
- <el-radio-button label="highRisk">楂樺嵄鍎夸笓妗堢鐞�</el-radio-button>
- <el-radio-button label="nutrition">钀ュ吇鎬х柧鐥呬笓妗堢鐞�</el-radio-button>
- <el-radio-button label="learning">瀛︿範鍥伴毦涓撴绠$悊</el-radio-button>
- </template>
- <template v-else>
- <el-radio-button label="pregnancy">瀛曞闅忚</el-radio-button>
- <el-radio-button label="menopause">鏇村勾鏈熼殢璁�</el-radio-button>
- </template>
+ <el-radio-group v-model="subType" size="medium">
+ <el-radio-button v-for="t in typeOptions" :key="t.key" :label="t.key">{{ t.entryLabel }}</el-radio-button>
</el-radio-group>
- </div>
-
- <!-- 寤烘。涓撳睘瀛楁 -->
- <div class="archive-section" v-if="subType">
- <div class="section-title">寤烘。淇℃伅</div>
- <el-form :model="archiveForm" label-width="120px" size="small">
- <!-- 鍎夸繚绉� - 楂樺嵄鍎� -->
- <template v-if="mainCategory === 'child' && subType === 'highRisk'">
- <el-form-item label="楂樺嵄鍥犵礌">
- <el-select v-model="archiveForm.riskFactor" multiple placeholder="鍙閫�" style="width:100%">
- <el-option label="鏃╀骇/浣庝綋閲�" value="preterm" />
- <el-option label="绐掓伅鍙�" value="asphyxia" />
- <el-option label="棰呭唴鍑鸿" value="ich" />
- <el-option label="楂樿儐绾㈢礌琛�鐥�" value="hyperbilirubinemia" />
- <el-option label="瀹唴鎰熸煋" value="intrauterine" />
- <el-option label="鍏堝ぉ鐣稿舰" value="malformation" />
- <el-option label="鍏朵粬" value="other" />
- </el-select>
- </el-form-item>
- <el-form-item label="鍑虹敓浣撻噸(g)">
- <el-input-number v-model="archiveForm.birthWeight" :min="500" :max="6000" />
- </el-form-item>
- <el-form-item label="鍑虹敓瀛曞懆">
- <el-input-number v-model="archiveForm.gestationalWeek" :min="22" :max="42" :precision="1" /> 鍛�
- </el-form-item>
- <el-form-item label="寤烘。鍖荤敓">
- <el-input v-model="archiveForm.doctorName" placeholder="璇疯緭鍏ュ缓妗e尰鐢�" />
- </el-form-item>
- <el-form-item label="澶囨敞">
- <el-input v-model="archiveForm.remark" type="textarea" :rows="2" />
- </el-form-item>
- </template>
-
- <!-- 鍎夸繚绉� - 钀ュ吇鎬х柧鐥� -->
- <template v-if="mainCategory === 'child' && subType === 'nutrition'">
- <el-form-item label="钀ュ吇璇婃柇" required>
- <el-select v-model="archiveForm.nutritionDiagnosis" placeholder="璇烽�夋嫨" style="width:100%">
- <el-option label="钀ュ吇涓嶈壇" value="malnutrition" />
- <el-option label="瓒呴噸" value="overweight" />
- <el-option label="鑲ヨ儢" value="obesity" />
- <el-option label="寰噺鍏冪礌缂轰箯" value="micronutrient" />
- <el-option label="鍠傚吇鍥伴毦" value="feeding" />
- </el-select>
- </el-form-item>
- <el-form-item label="寤烘。鍖荤敓">
- <el-input v-model="archiveForm.doctorName" placeholder="璇疯緭鍏ュ缓妗e尰鐢�" />
- </el-form-item>
- <el-form-item label="澶囨敞">
- <el-input v-model="archiveForm.remark" type="textarea" :rows="2" />
- </el-form-item>
- </template>
-
- <!-- 鍎夸繚绉� - 瀛︿範鍥伴毦 -->
- <template v-if="mainCategory === 'child' && subType === 'learning'">
- <el-form-item label="瀛︿範闂" required>
- <el-select v-model="archiveForm.learningIssue" placeholder="璇烽�夋嫨" style="width:100%">
- <el-option label="闃呰闅滅" value="dyslexia" />
- <el-option label="涔﹀啓闅滅" value="dysgraphia" />
- <el-option label="璁$畻闅滅" value="dyscalculia" />
- <el-option label="娉ㄦ剰鍔涚己闄�" value="adhd" />
- <el-option label="娣峰悎鍨�" value="mixed" />
- </el-select>
- </el-form-item>
- <el-form-item label="寤烘。鍖荤敓">
- <el-input v-model="archiveForm.doctorName" placeholder="璇疯緭鍏ュ缓妗e尰鐢�" />
- </el-form-item>
- <el-form-item label="澶囨敞">
- <el-input v-model="archiveForm.remark" type="textarea" :rows="2" />
- </el-form-item>
- </template>
-
- <!-- 濡囦繚绉� - 瀛曞闅忚 -->
- <template v-if="mainCategory === 'maternal' && subType === 'pregnancy'">
- <el-form-item label="鏈鏈堢粡">
- <el-date-picker v-model="archiveForm.lmp" type="date" value-format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡" style="width:100%" />
- </el-form-item>
- <el-row :gutter="12">
- <el-col :span="8"><el-form-item label="瀛曞懆"><el-input-number v-model="archiveForm.gestationalWeek" :min="1" :max="42" :precision="1" /> 鍛�</el-form-item></el-col>
- <el-col :span="8"><el-form-item label="瀛曟"><el-input-number v-model="archiveForm.gravidity" :min="1" :max="20" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="浜ф"><el-input-number v-model="archiveForm.parity" :min="0" :max="20" /></el-form-item></el-col>
- </el-row>
- <el-form-item label="棰勪骇鏈�">
- <el-date-picker v-model="archiveForm.edd" type="date" value-format="yyyy-MM-dd" placeholder="閫夋嫨棰勪骇鏈�" style="width:100%" />
- </el-form-item>
- <el-form-item label="楂樺嵄濡婂">
- <el-switch v-model="archiveForm.highRiskPregnancy" active-text="鏄�" inactive-text="鍚�" />
- </el-form-item>
- <el-form-item label="寤烘。鍖荤敓">
- <el-input v-model="archiveForm.doctorName" placeholder="璇疯緭鍏ュ缓妗e尰鐢�" />
- </el-form-item>
- <el-form-item label="澶囨敞">
- <el-input v-model="archiveForm.remark" type="textarea" :rows="2" />
- </el-form-item>
- </template>
-
- <!-- 濡囦繚绉� - 鏇村勾鏈熼殢璁� -->
- <template v-if="mainCategory === 'maternal' && subType === 'menopause'">
- <el-form-item label="鏈堢粡鐘舵��">
- <el-select v-model="archiveForm.menstrualStatus" placeholder="璇烽�夋嫨" style="width:100%">
- <el-option label="鏈堢粡绱婁贡" value="irregular" />
- <el-option label="闂粡锛�<12涓湀锛�" value="amenorrhea_short" />
- <el-option label="缁濈粡锛堚墺12涓湀锛�" value="menopause" />
- <el-option label="浜哄伐缁濈粡" value="surgical" />
- </el-select>
- </el-form-item>
- <el-form-item label="鏈鏈堢粡">
- <el-date-picker v-model="archiveForm.lmp" type="date" value-format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡" style="width:100%" />
- </el-form-item>
- <el-form-item label="寤烘。鍖荤敓">
- <el-input v-model="archiveForm.doctorName" placeholder="璇疯緭鍏ュ缓妗e尰鐢�" />
- </el-form-item>
- <el-form-item label="澶囨敞">
- <el-input v-model="archiveForm.remark" type="textarea" :rows="2" />
- </el-form-item>
- </template>
- </el-form>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">鍙� 娑�</el-button>
- <el-button type="primary" :loading="submitting" @click="handleSubmit" :disabled="!canSubmit">
- 纭寤烘。
- </el-button>
+ <el-button type="primary" :loading="submitting" @click="handleSubmit" :disabled="!canSubmit">纭寤烘。</el-button>
</div>
</el-dialog>
</template>
<script>
+import { ARCHIVE_TYPES, loadArchives, saveArchives, buildArchiveRecord } from "../types";
+
export default {
name: "ArchiveDialog",
props: {
@@ -243,33 +80,20 @@
data() {
return {
dialogVisible: false,
- mainCategory: "",
subType: "",
submitting: false,
standalonePatient: { patname: "", sex: 2, age: "", telcode: "", deptname: "", diagname: "" },
- parentInfo: { parentName: "", relation: "", parentPhone: "", parentIdCard: "", address: "" },
- archiveForm: {
- riskFactor: [], birthWeight: null, gestationalWeek: null,
- nutritionDiagnosis: "", learningIssue: "",
- gravidity: 1, parity: 0, edd: "", lmp: "",
- highRiskPregnancy: false, menstrualStatus: "",
- doctorName: "", remark: "",
- },
};
},
computed: {
- dialogTitle() {
- return this.standalone ? "鏂板缓寤烘。" : "鎮h�呭缓妗�";
- },
+ typeOptions() { return ARCHIVE_TYPES; },
canSubmit() {
if (!this.subType) return false;
- if (this.mainCategory === 'child' && !this.parentInfo.parentName) return false;
if (this.standalone && !this.standalonePatient.patname) return false;
+ if (!this.standalone && this.selectedPatients.length === 0) return false;
return true;
},
- selectedPatients() {
- return this.patients || [];
- },
+ selectedPatients() { return this.patients || []; },
},
watch: {
visible(val) {
@@ -282,83 +106,31 @@
},
methods: {
resetForm() {
- this.mainCategory = "";
this.subType = "";
this.standalonePatient = { patname: "", sex: 2, age: "", telcode: "", deptname: "", diagname: "" };
- this.parentInfo = { parentName: "", relation: "", parentPhone: "", parentIdCard: "", address: "" };
- this.archiveForm = {
- riskFactor: [], birthWeight: null, gestationalWeek: null,
- nutritionDiagnosis: "", learningIssue: "",
- gravidity: 1, parity: 0, edd: "", lmp: "",
- highRiskPregnancy: false, menstrualStatus: "",
- doctorName: "", remark: "",
- };
},
- onMainCategoryChange() { this.subType = ""; },
- onSubTypeChange() {},
-
- getSubTypeLabel() {
- const map = { highRisk: "楂樺嵄鍎夸笓妗堢鐞�", nutrition: "钀ュ吇鎬х柧鐥呬笓妗堢鐞�", learning: "瀛︿範鍥伴毦涓撴绠$悊", pregnancy: "瀛曞闅忚", menopause: "鏇村勾鏈熼殢璁�" };
- return map[this.subType] || "";
- },
- getMainCategoryLabel() {
- return this.mainCategory === "child" ? "鍎夸繚绉戝缓妗�" : "濡囦繚绉戝缓妗�";
- },
-
handleSubmit() {
if (!this.subType) { this.$message.warning("璇烽�夋嫨涓撴绫诲瀷"); return; }
+ if (this.standalone && !this.standalonePatient.patname) { this.$message.warning("璇疯緭鍏ュ鍚�"); return; }
if (!this.standalone && this.selectedPatients.length === 0) { this.$message.warning("璇烽�夋嫨鎮h��"); return; }
this.submitting = true;
- const archives = JSON.parse(localStorage.getItem("patientArchives") || "[]");
- const now = new Date().toISOString().replace("T", " ").substring(0, 19);
-
- // 纭畾鎮h�呭垪琛�
- const patientList = this.standalone
- ? [{ ...this.standalonePatient, patid: "sa_" + Date.now() }]
- : this.selectedPatients;
-
- patientList.forEach((patient) => {
- archives.push({
- id: "arc_" + Date.now() + "_" + Math.random().toString(36).substr(2, 6),
- patientId: patient.patid || patient.id,
- patname: patient.patname,
- sex: patient.sex,
- age: patient.age,
- telcode: patient.telcode || patient.phone || "",
- deptname: patient.deptname || "",
- diagname: patient.diagname || "",
- inhospno: patient.inhospno || "",
- outhospno: patient.outhospno || "",
- bedNo: patient.bedNo || "",
- drname: patient.drname || "",
- nurseName: patient.nurseName || "",
- starttime: patient.starttime || patient.admitdate || "",
- mainCategory: this.mainCategory,
- mainCategoryLabel: this.getMainCategoryLabel(),
- subType: this.subType,
- subTypeLabel: this.getSubTypeLabel(),
- archiveForm: JSON.parse(JSON.stringify(this.archiveForm)),
- parentInfo: this.mainCategory === 'child' ? JSON.parse(JSON.stringify(this.parentInfo)) : {},
- sourcePage: this.standalone ? "standalone" : this.sourcePage,
- status: "active",
- createTime: now,
- updateTime: now,
- });
- });
-
- localStorage.setItem("patientArchives", JSON.stringify(archives));
+ const patientList = this.standalone ? [this.standalonePatient] : this.selectedPatients;
+ const sourcePage = this.standalone ? "standalone" : this.sourcePage;
+ const records = patientList.map((p) => buildArchiveRecord(p, this.subType, sourcePage));
+ saveArchives([...loadArchives(), ...records]);
this.submitting = false;
this.dialogVisible = false;
- this.$message.success(`鎴愬姛鍒涘缓 ${patientList.length} 鏉″缓妗h褰昤);
+ this.$message.success(`鎴愬姛鍒涘缓 ${records.length} 鏉″缓妗h褰昤);
this.$emit("created");
- // 璺宠浆
- const routePath = this.mainCategory === "child"
- ? "/filing/childHealth"
- : "/filing/maternalHealth";
- this.$router.push({ path: routePath });
+ // 杩涘叆璇︽儏椤碉紙缂栬緫鎬侊級
+ const first = records[0];
+ const type = ARCHIVE_TYPES.find((t) => t.key === this.subType);
+ if (first && type) {
+ this.$router.push({ path: type.detailRoute, query: { id: first.id, edit: 1 } });
+ }
},
handleClose() { this.resetForm(); },
},
diff --git a/src/views/patient/archives/components/ArchiveList.vue b/src/views/patient/archives/components/ArchiveList.vue
new file mode 100644
index 0000000..8dac4b7
--- /dev/null
+++ b/src/views/patient/archives/components/ArchiveList.vue
@@ -0,0 +1,148 @@
+<template>
+ <div class="app-container">
+ <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="80px">
+ <el-form-item label="濮撳悕">
+ <el-input v-model="queryParams.patname" placeholder="璇疯緭鍏ュ鍚�" clearable @keyup.enter.native="handleQuery" style="width:180px" />
+ </el-form-item>
+ <el-form-item label="璇婃柇">
+ <el-input v-model="queryParams.diagname" placeholder="璇疯緭鍏ヨ瘖鏂�" clearable @keyup.enter.native="handleQuery" style="width:180px" />
+ </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-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>
+
+ <el-row :gutter="10" class="mb8">
+ <el-col :span="1.5">
+ <el-button type="primary" plain icon="el-icon-plus" size="medium" @click="handleCreate">鏂板缓寤烘。</el-button>
+ </el-col>
+ <el-col :span="1.5">
+ <el-button type="danger" plain icon="el-icon-delete" size="medium" :disabled="multiple" @click="handleDelete">鍒犻櫎</el-button>
+ </el-col>
+ <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" />
+ </el-row>
+
+ <el-table v-loading="loading" :data="displayList" @selection-change="handleSelectionChange">
+ <el-table-column type="selection" width="50" align="center" />
+ <el-table-column
+ v-for="col in typeConfig.columns"
+ :key="col.prop"
+ :label="col.label"
+ align="center"
+ show-overflow-tooltip
+ >
+ <template slot-scope="scope">
+ <el-tag v-if="col.type === 'closeStatus'" :type="scope.row.closeStatus == 1 ? 'info' : 'success'" size="mini">
+ {{ cellValue(scope.row, col) }}
+ </el-tag>
+ <span v-else>{{ cellValue(scope.row, col) }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鎿嶄綔" align="center" fixed="right" width="120">
+ <template slot-scope="scope">
+ <el-button size="medium" type="text" @click="goDetail(scope.row)">
+ <span class="button-textsc"><i class="el-icon-zoom-in" />鏌ョ湅</span>
+ </el-button>
+ <el-button size="medium" type="text" @click="handleSingleDelete(scope.row)">
+ <span style="color:#f56c6c"><i class="el-icon-delete" />鍒犻櫎</span>
+ </el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+
+ <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
+ @pagination="getList" />
+
+ <OutpatientPicker :visible.sync="pickerVisible" :type="type" @picked="onPicked" />
+ </div>
+</template>
+
+<script>
+import OutpatientPicker from "./OutpatientPicker.vue";
+import { getTypeByKey, loadArchives, saveArchives } from "../types";
+
+export default {
+ name: "ArchiveList",
+ components: { OutpatientPicker },
+ props: {
+ type: { type: String, default: "" },
+ },
+ data() {
+ return {
+ loading: false, showSearch: true, multiple: true, ids: [], dateRange: [],
+ total: 0, allList: [], displayList: [], pickerVisible: false,
+ queryParams: { pageNum: 1, pageSize: 10, patname: "", diagname: "" },
+ };
+ },
+ computed: {
+ typeConfig() {
+ return getTypeByKey(this.type) || { columns: [], detailRoute: "/filing/maternalDetail" };
+ },
+ },
+ created() { this.getList(); },
+ methods: {
+ getList() {
+ this.loading = true;
+ const all = loadArchives().filter((item) => item.subType === this.type);
+ let filtered = [...all];
+ if (this.queryParams.patname) filtered = filtered.filter((i) => i.patname && i.patname.includes(this.queryParams.patname));
+ if (this.queryParams.diagname) filtered = filtered.filter((i) => i.diagname && i.diagname.includes(this.queryParams.diagname));
+ if (this.dateRange && this.dateRange.length === 2) {
+ filtered = filtered.filter((i) => {
+ const d = (i.createTime || "").substring(0, 10);
+ return d >= this.dateRange[0] && d <= this.dateRange[1];
+ });
+ }
+ this.total = filtered.length;
+ const start = (this.queryParams.pageNum - 1) * this.queryParams.pageSize;
+ this.displayList = filtered.slice(start, start + this.queryParams.pageSize);
+ this.loading = false;
+ },
+ handleQuery() { this.queryParams.pageNum = 1; this.getList(); },
+ resetQuery() {
+ this.dateRange = [];
+ this.queryParams = { pageNum: 1, pageSize: 10, patname: "", diagname: "" };
+ this.getList();
+ },
+ handleSelectionChange(s) { this.ids = s.map((i) => i.id); this.multiple = !s.length; },
+ handleDelete() {
+ if (this.ids.length === 0) { this.$modal.msgWarning("璇疯嚦灏戦�夋嫨涓�鏉�"); return; }
+ this.$modal.confirm("纭鍒犻櫎閫変腑妗f锛�").then(() => {
+ const remaining = loadArchives().filter((item) => !this.ids.includes(item.id));
+ saveArchives(remaining);
+ this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+ this.getList();
+ }).catch(() => {});
+ },
+ handleSingleDelete(row) { this.ids = [row.id]; this.handleDelete(); },
+ handleCreate() { this.pickerVisible = true; },
+ onPicked(record) {
+ this.getList();
+ this.$router.push({ path: this.typeConfig.detailRoute, query: { id: record.id, edit: 1 } });
+ },
+ goDetail(row) {
+ this.$router.push({ path: this.typeConfig.detailRoute, query: { id: row.id } });
+ },
+ getProp(obj, path) {
+ if (!path) return "";
+ return path.split(".").reduce((o, k) => (o == null ? o : o[k]), obj);
+ },
+ cellValue(row, col) {
+ const val = this.getProp(row, col.prop);
+ if (col.type === "sex") return val == 1 ? "鐢�" : "濂�";
+ if (col.type === "date") return val ? String(val).substring(0, 10) : "-";
+ if (col.type === "closeStatus") return val == 1 ? "宸茬粨妗�" : "鏈粨妗�";
+ return val || "-";
+ },
+ },
+};
+</script>
+
+<style lang="scss" scoped>
+.button-textsc { color: #3664d9; }
+</style>
diff --git a/src/views/patient/archives/components/OutpatientPicker.vue b/src/views/patient/archives/components/OutpatientPicker.vue
new file mode 100644
index 0000000..290ef91
--- /dev/null
+++ b/src/views/patient/archives/components/OutpatientPicker.vue
@@ -0,0 +1,145 @@
+<template>
+ <el-dialog
+ title="閫夋嫨闂ㄨ瘖璁板綍"
+ :visible.sync="dialogVisible"
+ width="85%"
+ append-to-body
+ top="4vh"
+ :close-on-click-modal="false"
+ @close="handleClose"
+ >
+ <el-form :inline="true" size="small" label-width="56px">
+ <el-form-item label="濮撳悕">
+ <el-input v-model="queryParams.patname" placeholder="璇疯緭鍏ュ鍚�" clearable style="width:160px" @keyup.enter.native="handleQuery" />
+ </el-form-item>
+ <el-form-item label="璇婃柇">
+ <el-input v-model="queryParams.diagname" placeholder="璇疯緭鍏ヨ瘖鏂�" clearable style="width:160px" @keyup.enter.native="handleQuery" />
+ </el-form-item>
+ <el-form-item>
+ <el-button type="primary" icon="el-icon-search" @click="handleQuery">鎼滅储</el-button>
+ <el-button icon="el-icon-refresh" @click="resetQuery">閲嶇疆</el-button>
+ </el-form-item>
+ </el-form>
+
+ <el-table
+ v-loading="loading"
+ :data="list"
+ border
+ highlight-current-row
+ style="width: 100%"
+ @current-change="handleCurrentChange"
+ >
+ <el-table-column label="灏辫瘖鏃堕棿" align="center" width="140">
+ <template slot-scope="scope">{{ formatTime(scope.row.admitdate) }}</template>
+ </el-table-column>
+ <el-table-column label="鐥呮鍙�" align="center" prop="outhospno" width="110" />
+ <el-table-column label="濮撳悕" align="center" prop="patname" width="100" />
+ <el-table-column label="鎬у埆" align="center" width="60">
+ <template slot-scope="scope">{{ scope.row.sex == 1 ? "鐢�" : "濂�" }}</template>
+ </el-table-column>
+ <el-table-column label="骞撮緞" align="center" prop="age" width="60" />
+ <el-table-column label="鑱旂郴鐢佃瘽" align="center" prop="telcode" width="120" />
+ <el-table-column label="璇婃柇" align="center" prop="diagname" show-overflow-tooltip />
+ <el-table-column label="灏辫瘖绉戝" align="center" prop="deptname" show-overflow-tooltip />
+ <el-table-column label="鎺ヨ瘖鍖荤敓" align="center" prop="drname" width="100" />
+ </el-table>
+
+ <pagination
+ v-show="total > 0"
+ :total="total"
+ :page.sync="queryParams.pageNum"
+ :limit.sync="queryParams.pageSize"
+ @pagination="getList"
+ />
+
+ <div slot="footer" class="dialog-footer">
+ <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
+ <el-button type="primary" :disabled="!currentRow" @click="handleConfirm">纭畾</el-button>
+ </div>
+ </el-dialog>
+</template>
+
+<script>
+import { listPatouthosp } from "@/api/smartor/patouthosp";
+import { loadArchives, saveArchives, buildArchiveRecord } from "../types";
+import store from "@/store";
+
+export default {
+ name: "OutpatientPicker",
+ props: {
+ visible: { type: Boolean, default: false },
+ type: { type: String, default: "" },
+ sourcePage: { type: String, default: "outpatient" },
+ },
+ data() {
+ return {
+ dialogVisible: false,
+ loading: false,
+ list: [],
+ total: 0,
+ currentRow: null,
+ queryParams: { pageNum: 1, pageSize: 10, patname: "", diagname: "", searchscope: 3, deptcodes: [] },
+ };
+ },
+ watch: {
+ visible(val) {
+ this.dialogVisible = val;
+ if (val) {
+ this.currentRow = null;
+ this.getList();
+ }
+ },
+ dialogVisible(val) {
+ if (!val) this.$emit("update:visible", false);
+ },
+ },
+ methods: {
+ getList() {
+ this.loading = true;
+ if (this.queryParams.searchscope == 3) {
+ this.queryParams.deptcodes = store.getters.belongDepts.map((obj) => obj.deptCode);
+ }
+ listPatouthosp(this.queryParams)
+ .then((response) => {
+ this.list = response.rows || [];
+ this.total = response.total || 0;
+ })
+ .finally(() => { this.loading = false; });
+ },
+ handleQuery() {
+ this.queryParams.pageNum = 1;
+ this.getList();
+ },
+ resetQuery() {
+ this.queryParams = { pageNum: 1, pageSize: 10, patname: "", diagname: "", searchscope: 3, deptcodes: [] };
+ this.currentRow = null;
+ this.getList();
+ },
+ handleCurrentChange(row) {
+ this.currentRow = row;
+ },
+ formatTime(time) {
+ if (!time) return "-";
+ return String(time).substring(0, 19).replace("T", " ");
+ },
+ handleConfirm() {
+ if (!this.currentRow) return;
+ const record = buildArchiveRecord(this.currentRow, this.type, this.sourcePage);
+ const all = loadArchives();
+ all.push(record);
+ saveArchives(all);
+ this.dialogVisible = false;
+ this.$emit("picked", record);
+ },
+ handleClose() {
+ this.currentRow = null;
+ },
+ },
+};
+</script>
+
+<style lang="scss" scoped>
+.dialog-footer {
+ text-align: right;
+}
+</style>
diff --git a/src/views/patient/archives/components/ServiceRecords.vue b/src/views/patient/archives/components/ServiceRecords.vue
new file mode 100644
index 0000000..560b03e
--- /dev/null
+++ b/src/views/patient/archives/components/ServiceRecords.vue
@@ -0,0 +1,344 @@
+<template>
+ <el-card class="service-records" shadow="never" style="margin-top: 14px">
+ <div slot="header" class="card-header"><span>鏈嶅姟璁板綍</span></div>
+ <div v-loading="loading">
+ <div v-if="record.length === 0" class="empty-mini">鏆傛棤鏈嶅姟璁板綍</div>
+ <div v-else class="service-record">
+ <div class="service-item" v-for="(item, idx) in record" :key="idx">
+ <el-card shadow="never" class="service-card">
+ <!-- 鏍囬琛岋細鏈嶅姟绫诲瀷 + 浠诲姟鍚嶇О + 闅忚鐘舵�� + 寮傚父鐘舵�� -->
+ <div class="service-card__header">
+ <div class="service-card__title">
+ <span class="service-badge">{{ typeName(item.serviceType) }}</span>
+ <span class="service-name">{{ item.taskName || item.templatename || "-" }}</span>
+ </div>
+ <div class="service-card__tags">
+ <el-tag v-if="item.sendstateView == 1" type="primary" size="small" effect="dark">寰呴殢璁�</el-tag>
+ <el-tag v-else-if="item.sendstateView == 2" type="success" size="small" effect="dark">宸插畬鎴�</el-tag>
+ <el-tag v-else-if="item.sendstateView == 3" type="warning" size="small" effect="dark">鏃犻渶闅忚</el-tag>
+ <span class="service-status" :class="item.excep == 0 ? 'is-ok' : 'is-bad'">
+ {{ item.excep == 0 ? "鏈嶅姟姝e父" : item.excep == 2 ? "璀﹀憡" : "寮傚父" }}
+ </span>
+ </div>
+ </div>
+
+ <!-- 鏃堕棿绾匡細鍑洪櫌 鈫� 搴旇 鈫� 瀹屾垚 -->
+ <div class="service-card__timeline">
+ <span><em>鍑洪櫌</em>{{ fmtTime(item.endtime) }}</span>
+ <i>鈫�</i>
+ <span><em>搴旇</em>{{ fmtTime(item.visitTime) }}</span>
+ <i>鈫�</i>
+ <span><em>瀹屾垚</em>{{ fmtTime(item.finishtime) }}</span>
+ </div>
+
+ <!-- 涓夋爮涓讳綋 -->
+ <div class="service-card__columns">
+ <!-- 鈶� 鎮h�呬俊鎭� -->
+ <div class="svc-block svc-block--blue">
+ <div class="svc-block__title"><i class="el-icon-user-solid"></i>鎮h�呬俊鎭�</div>
+ <div class="svc-block__row">
+ <span class="svc-name">{{ item.sendname || "-" }}</span>
+ <span class="svc-sub">{{ sexName(item.sex) }}</span>
+ <span class="svc-sub">{{ item.phone || "-" }}</span>
+ <span class="svc-sub" v-if="item.endtime">鍑洪櫌{{ endDay(item.endtime) }}澶�</span>
+ </div>
+ <div class="svc-block__row svc-sub" v-if="item.sfzh">韬唤璇侊細{{ item.sfzh }}</div>
+ <div class="svc-block__row" v-if="item.leavediagname"><span class="svc-diag">璇婃柇</span>{{ item.leavediagname }}</div>
+ </div>
+
+ <!-- 鈶� 绉戝鐥呭尯 路 鍖绘姢 -->
+ <div class="svc-block svc-block--green">
+ <div class="svc-block__title"><i class="el-icon-office-building"></i>绉戝鐥呭尯 路 鍖绘姢</div>
+ <div class="svc-block__row">绉戝锛歿{ item.deptname || "-" }} / 鐥呭尯锛歿{ item.leavehospitaldistrictname || "-" }}</div>
+ <div class="svc-block__row">
+ 涓绘不锛歿{ item.drname || "-" }}
+ <span class="svc-sub">缁忕锛歿{ item.managementDoctor || "-" }}</span>
+ <span class="svc-sub">鎶ゅ+锛歿{ item.nurseName || "-" }}</span>
+ </div>
+ <div class="svc-block__row svc-sub">闅忚浜哄憳锛歿{ item.updateBy || "-" }}</div>
+ <div class="svc-block__row svc-sub">璐熻矗浜猴細{{ item.createBy || "-" }}</div>
+ </div>
+
+ <!-- 鈶� 鎵ц璇︽儏 -->
+ <div class="svc-block svc-block--gray">
+ <div class="svc-block__title"><i class="el-icon-s-management"></i>鎵ц璇︽儏</div>
+ <div class="svc-meta">
+ <span v-if="item.sendstate || item.sendstate === 0"><em>鐘舵��</em>{{ sendStateName(item.sendstate) }}</span>
+ <span v-if="preach(item.preachform)"><em>鎵ц</em>{{ preach(item.preachform) }}</span>
+ <span v-if="item.templatename"><em>妯℃澘</em>{{ item.templatename }}</span>
+ <span v-if="item.suggest !== undefined && item.suggest !== null && item.suggest !== ''"><em>鎰忚</em><dict-tag :options="dict.type.sys_suggest" :value="item.suggest" /></span>
+ <span v-if="item.remark"><em>璇存槑</em>{{ item.remark }}</span>
+ <span v-if="item.createTime"><em>鍒涘缓</em>{{ fmtTime(item.createTime) }}</span>
+ </div>
+ </div>
+ </div>
+ </el-card>
+ </div>
+ </div>
+ </div>
+ </el-card>
+</template>
+
+<script>
+import { getTaskservelist } from "@/api/AiCentre/index";
+
+export default {
+ name: "ServiceRecords",
+ dicts: ["sys_suggest"],
+ props: {
+ patid: { default: "" },
+ },
+ data() {
+ return { loading: false, record: [] };
+ },
+ watch: {
+ patid: { immediate: true, handler(v) { if (v) this.load(v); } },
+ },
+ methods: {
+ load(patid) {
+ this.loading = true;
+ getTaskservelist({ patid })
+ .then((res) => {
+ if (res.code === 200 && res.rows && res.rows[0]) {
+ this.record = res.rows[0].serviceSubtaskList || [];
+ } else {
+ this.record = [];
+ }
+ })
+ .catch(() => { this.record = []; })
+ .finally(() => { this.loading = false; });
+ },
+ typeName(t) {
+ if (t == 1) return "蹇冪數闅忚";
+ if (t == 2) return "鍑洪櫌闅忚";
+ if (t == 3) return "褰卞儚闅忚";
+ if (t == 4) return "瀹f暀鍏虫��";
+ return "鍏朵粬鏈嶅姟";
+ },
+ sexName(s) {
+ if (s == 1) return "鐢�";
+ if (s == 2) return "濂�";
+ return "-";
+ },
+ sendStateName(s) {
+ const map = { 1: "宸查鍙�", 2: "寰呴殢璁�", 3: "宸插彂閫�", 4: "涓嶆墽琛�", 5: "澶辫触", 6: "宸插畬鎴�", 7: "瓒呮椂" };
+ return map[s] || "-";
+ },
+ fmtTime(t) {
+ if (!t) return "-";
+ const s = String(t).replace("T", " ");
+ return s.length > 16 ? s.substring(0, 16) : s.substring(0, 10);
+ },
+ endDay(t) {
+ if (!t) return "-";
+ const d = new Date(String(t).replace("T", " ").replace(/-/g, "/"));
+ const diff = Date.now() - d.getTime();
+ return Math.round(diff / (1000 * 3600 * 24));
+ },
+ preach(v) {
+ if (!v) return "";
+ return Array.isArray(v) ? v.join("銆�") : String(v);
+ },
+ },
+};
+</script>
+
+<style lang="scss" scoped>
+$primary: #3f6ef0;
+
+.service-records {
+ .card-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ font-size: 16px;
+ font-weight: 600;
+ }
+}
+
+.empty-mini {
+ padding: 30px 0;
+ text-align: center;
+ color: #c0c4cc;
+ font-size: 14px;
+}
+
+.service-record {
+ .service-item {
+ margin-bottom: 16px;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+
+ .service-card {
+ border-radius: 12px;
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);
+
+ ::v-deep .el-card__body {
+ padding: 20px 24px;
+ }
+ }
+
+ .service-card__header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding-bottom: 14px;
+ border-bottom: 1px dashed #eef0f4;
+ }
+
+ .service-card__title {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ min-width: 0;
+ }
+
+ .service-card__tags {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ flex-shrink: 0;
+ }
+
+ .service-badge {
+ display: inline-block;
+ padding: 4px 12px;
+ font-size: 13px;
+ font-weight: 600;
+ color: $primary;
+ background: #eef4ff;
+ border-radius: 6px;
+ white-space: nowrap;
+ }
+
+ .service-name {
+ font-size: 16px;
+ font-weight: 600;
+ color: #303133;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+
+ .service-status {
+ padding: 4px 12px;
+ font-size: 13px;
+ border-radius: 999px;
+
+ &.is-ok {
+ color: #12a182;
+ background: #e8f7f1;
+ }
+
+ &.is-bad {
+ color: #e0564c;
+ background: #fdeeee;
+ }
+ }
+
+ .service-card__timeline {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ flex-wrap: wrap;
+ padding: 12px 0;
+ font-size: 13px;
+ color: #606266;
+
+ em {
+ font-style: normal;
+ color: #909399;
+ margin-right: 2px;
+ }
+
+ i {
+ color: #c0c4cc;
+ font-style: normal;
+ }
+ }
+
+ .service-card__columns {
+ display: flex;
+ gap: 12px;
+ }
+
+ .svc-block {
+ flex: 1;
+ min-width: 0;
+ border-radius: 6px;
+ padding: 10px 12px;
+ font-size: 13px;
+
+ &--blue {
+ background: #ecf5ff;
+ .svc-block__title { color: #409eff; }
+ }
+
+ &--green {
+ background: #edf7f0;
+ .svc-block__title { color: #67c23a; }
+ }
+
+ &--gray {
+ background: #f5f7fa;
+ .svc-block__title { color: #909399; }
+ }
+ }
+
+ .svc-block__title {
+ font-size: 12px;
+ font-weight: 600;
+ margin-bottom: 6px;
+
+ i { margin-right: 4px; }
+ }
+
+ .svc-block__row {
+ color: #303133;
+ line-height: 1.7;
+ font-size: 13px;
+ word-break: break-all;
+ }
+
+ .svc-sub {
+ color: #909399;
+ font-size: 12px;
+ margin-left: 8px;
+ }
+
+ .svc-name {
+ color: #409eff;
+ font-weight: 600;
+ cursor: default;
+ }
+
+ .svc-diag {
+ display: inline-block;
+ font-size: 11px;
+ color: #e6a23c;
+ background: #fdf6ec;
+ padding: 1px 6px;
+ border-radius: 3px;
+ margin-right: 6px;
+ }
+
+ .svc-meta {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 4px 12px;
+ font-size: 12px;
+ color: #606266;
+
+ span { white-space: normal; }
+
+ em {
+ font-style: normal;
+ color: #909399;
+ margin-right: 2px;
+ }
+ }
+}
+</style>
diff --git a/src/views/patient/archives/highRisk/index.vue b/src/views/patient/archives/highRisk/index.vue
new file mode 100644
index 0000000..7c78b9e
--- /dev/null
+++ b/src/views/patient/archives/highRisk/index.vue
@@ -0,0 +1,12 @@
+<template>
+ <ArchiveList type="highRisk" />
+</template>
+
+<script>
+import ArchiveList from "../components/ArchiveList.vue";
+
+export default {
+ name: "HighRiskArchiveList",
+ components: { ArchiveList },
+};
+</script>
diff --git a/src/views/patient/archives/learning/index.vue b/src/views/patient/archives/learning/index.vue
new file mode 100644
index 0000000..b3dee06
--- /dev/null
+++ b/src/views/patient/archives/learning/index.vue
@@ -0,0 +1,12 @@
+<template>
+ <ArchiveList type="learning" />
+</template>
+
+<script>
+import ArchiveList from "../components/ArchiveList.vue";
+
+export default {
+ name: "LearningArchiveList",
+ components: { ArchiveList },
+};
+</script>
diff --git a/src/views/patient/archives/maternalHealth/detail.vue b/src/views/patient/archives/maternalHealth/detail.vue
index 6d723e9..4d0d7db 100644
--- a/src/views/patient/archives/maternalHealth/detail.vue
+++ b/src/views/patient/archives/maternalHealth/detail.vue
@@ -3,253 +3,359 @@
<template v-if="archive">
<div class="action-bar">
<el-button @click="$router.go(-1)" icon="el-icon-back">杩斿洖</el-button>
- <el-button :type="editing ? 'success' : 'primary'" :icon="editing ? 'el-icon-check' : 'el-icon-edit'" @click="toggleEdit">{{ editing ? '淇濆瓨' : '缂栬緫' }}</el-button>
- <el-tag :type="archive.subType === 'pregnancy' ? 'success' : 'warning'" style="margin-left:12px">{{ archive.subTypeLabel }}</el-tag>
+ <el-button :type="editing ? 'success' : 'primary'" :icon="editing ? 'el-icon-check' : 'el-icon-edit'" @click="toggleEdit">
+ {{ editing ? '淇濆瓨' : '缂栬緫' }}
+ </el-button>
+ <el-button v-if="archive.closeStatus != 1" type="danger" plain icon="el-icon-circle-close" @click="handleCloseCase">缁撴</el-button>
+ <el-tag :type="archive.closeStatus == 1 ? 'info' : 'success'" style="margin-left:12px">
+ {{ archive.closeStatus == 1 ? '宸茬粨妗�' : '鏈粨妗�' }}
+ </el-tag>
+ <el-tag :type="archive.subType === 'pregnancy' ? 'success' : 'warning'" style="margin-left:8px">{{ archive.subTypeLabel }}</el-tag>
</div>
- <!-- 鎮h�呭熀鏈俊鎭� -->
- <el-card class="info-card" shadow="never">
- <div slot="header" class="card-header"><span>鎮h�呭熀鏈俊鎭�</span></div>
- <el-row :gutter="20">
- <el-col :span="6"><InfoField label="濮撳悕" :value="archive.patname" /></el-col>
- <el-col :span="6"><InfoField label="鎬у埆" :value="archive.sex == 1 ? '鐢�' : '濂�'" /></el-col>
- <el-col :span="6"><InfoField label="骞撮緞" :value="archive.age" /></el-col>
- <el-col :span="6"><InfoField label="鐢佃瘽" :value="archive.telcode" /></el-col>
- </el-row>
- <el-row :gutter="20" style="margin-top:10px">
- <el-col :span="6"><InfoField label="绉戝" :value="archive.deptname" /></el-col>
- <el-col :span="6"><InfoField label="璇婃柇" :value="archive.diagname" /></el-col>
- <el-col :span="6"><InfoField label="涓绘不鍖荤敓" :value="archive.drname" /></el-col>
- <el-col :span="6"><InfoField label="鏉ユ簮" :value="sourceLabel" /></el-col>
- </el-row>
- </el-card>
+ <el-tabs v-model="mainTab" type="border-card">
+ <el-tab-pane label="妗f璇︽儏" name="detail">
+ <!-- 鎮h�呭熀鏈俊鎭� -->
+ <el-card class="info-card" shadow="never">
+ <div slot="header" class="card-header"><span>鎮h�呭熀鏈俊鎭�</span></div>
+ <el-row :gutter="20">
+ <el-col :span="6"><InfoField label="濮撳悕" :value="archive.patname" /></el-col>
+ <el-col :span="6"><InfoField label="鎬у埆" :value="archive.sex == 1 ? '鐢�' : '濂�'" /></el-col>
+ <el-col :span="6"><InfoField label="骞撮緞" :value="archive.age" /></el-col>
+ <el-col :span="6"><InfoField label="鑱旂郴鐢佃瘽" :value="archive.telcode" /></el-col>
+ </el-row>
+ <el-row :gutter="20" style="margin-top:10px">
+ <el-col :span="6"><InfoField label="绉戝" :value="archive.deptname" /></el-col>
+ <el-col :span="6"><InfoField label="璇婃柇" :value="archive.diagname" /></el-col>
+ <el-col :span="6"><InfoField label="鏉ユ簮" :value="sourceLabel" /></el-col>
+ </el-row>
+ </el-card>
- <!-- 妗f鍩烘湰淇℃伅 -->
- <el-card class="info-card" shadow="never" style="margin-top:14px">
- <div slot="header" class="card-header">
- <span>妗f鍩烘湰淇℃伅</span>
- <span class="header-sub">{{ archive.createTime ? archive.createTime.substring(0,10) : '-' }} 寤烘。</span>
- </div>
- <el-row :gutter="20">
- <el-col :span="8"><InfoField label="寤烘。绫诲瀷" :value="archive.subTypeLabel" /></el-col>
- <el-col :span="8"><InfoField label="寤烘。鍖荤敓" :value="archive.archiveForm.doctorName" :editing="editing" v-model="archive.archiveForm.doctorName" /></el-col>
- <el-col :span="8"><InfoField label="寤烘。鏃堕棿" :value="archive.createTime" /></el-col>
- </el-row>
- <!-- 瀛曞涓撳睘 -->
- <el-row v-if="archive.subType === 'pregnancy'" :gutter="20" style="margin-top:10px">
- <el-col :span="6"><InfoField label="瀛曞懆" :value="archive.archiveForm.gestationalWeek" :editing="editing" v-model="archive.archiveForm.gestationalWeek" type="number" /></el-col>
- <el-col :span="6"><InfoField label="瀛曟/浜ф" :value="'G'+(archive.archiveForm.gravidity||1)+'P'+(archive.archiveForm.parity||0)" /></el-col>
- <el-col :span="6"><InfoField label="棰勪骇鏈�" :value="archive.archiveForm.edd" /></el-col>
- <el-col :span="6"><InfoField label="楂樺嵄濡婂" :value="archive.archiveForm.highRiskPregnancy ? '鏄�' : '鍚�'" /></el-col>
- </el-row>
- <el-row v-if="archive.subType === 'menopause'" :gutter="20" style="margin-top:10px">
- <el-col :span="8"><InfoField label="鏈堢粡鐘舵��" :value="menstrualLabel" /></el-col>
- <el-col :span="8"><InfoField label="鏈鏈堢粡" :value="archive.archiveForm.lmp" /></el-col>
- </el-row>
- </el-card>
-
- <!-- ===== 瀛曞闅忚锛�3涓〃鍗� ===== -->
- <template v-if="archive.subType === 'pregnancy'">
- <el-card class="info-card" shadow="never" style="margin-top:14px">
- <div slot="header" class="card-header"><span>瀛曞闅忚绠$悊</span></div>
- <el-tabs v-model="activeTab" type="border-card">
- <!-- 1. 瀛曞闅忚绯荤粺闂 -->
- <el-tab-pane label="瀛曞闅忚绯荤粺闂" name="sysQ">
- <el-form :model="form.pregSysQ" label-width="150px" size="small" :disabled="!editing">
+ <!-- ===== 瀛曞闅忚锛氭。妗堜俊鎭� + 棣栬瘖淇℃伅 + 濡婂鎯呭喌 鍚堝苟鍖哄潡 ===== -->
+ <el-card v-if="archive.subType === 'pregnancy'" class="info-card" shadow="never" style="margin-top:14px">
+ <div class="sub-section">
+ <div class="sub-title">妗f淇℃伅</div>
+ <el-form :model="archive" label-width="110px" size="small" :disabled="!editing">
<el-row :gutter="20">
- <el-col :span="8"><el-form-item label="濉啓鏃ユ湡"><el-date-picker v-model="form.pregSysQ.date" value-format="yyyy-MM-dd" style="width:100%" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="瀛曞懆"><el-input-number v-model="form.pregSysQ.gestWeek" :min="1" :max="42" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="韬唤璇佸彿"><el-input v-model="archive.idcardno" class="w-md" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="鍑虹敓鏃ユ湡"><el-date-picker v-model="archive.birthday" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="璇婃柇鏃ユ湡"><el-date-picker v-model="archive.diagnosisDate" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
</el-row>
<el-row :gutter="20">
- <el-col :span="8"><el-form-item label="浣撻噸(kg)"><el-input-number v-model="form.pregSysQ.weight" :precision="1" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="琛�鍘�"><el-input v-model="form.pregSysQ.bloodPressure" placeholder="鏀剁缉鍘�/鑸掑紶鍘�" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="瀹珮(cm)"><el-input-number v-model="form.pregSysQ.fundalHeight" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="涓绘不鍖荤敓"><el-input v-model="archive.attendingDoctor" class="w-sm" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="缁忕鍖荤敓"><el-input v-model="archive.managingDoctor" class="w-sm" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="鐧昏浜哄憳"><el-input v-model="archive.registrant" class="w-sm" /></el-form-item></el-col>
</el-row>
- <el-row :gutter="20">
- <el-col :span="8"><el-form-item label="鑳庡績(娆�/鍒�)"><el-input-number v-model="form.pregSysQ.fetalHeart" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="姘磋偪"><el-select v-model="form.pregSysQ.edema" style="width:100%"><el-option label="鏃�" value="鏃�" /><el-option label="+" value="+" /><el-option label="++" value="++" /><el-option label="+++" value="+++" /></el-select></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="灏胯泲鐧�"><el-select v-model="form.pregSysQ.urineProtein" style="width:100%"><el-option label="-" value="-" /><el-option label="卤" value="卤" /><el-option label="+" value="+" /><el-option label="++" value="++" /></el-select></el-form-item></el-col>
- </el-row>
- <el-form-item label="鑷鐥囩姸"><el-input v-model="form.pregSysQ.symptoms" type="textarea" :rows="2" placeholder="澶存檿/鐪艰姳/鑳搁椃/鑵圭棝绛�" /></el-form-item>
- <el-form-item label="澶勭悊鎰忚"><el-input v-model="form.pregSysQ.advice" type="textarea" :rows="2" /></el-form-item>
- <el-form-item label="涓嬫闅忚鏃ユ湡"><el-date-picker v-model="form.pregSysQ.nextVisit" value-format="yyyy-MM-dd" style="width:200px" /></el-form-item>
- <el-form-item label="闅忚鍖荤敓"><el-input v-model="form.pregSysQ.doctor" style="width:200px" /></el-form-item>
</el-form>
- </el-tab-pane>
+ </div>
- <!-- 2. 瀛曞棣栬瘖淇℃伅鐧昏琛� -->
- <el-tab-pane label="涓芥按濡囧辜淇濆仴闄㈠瓡濡囬璇婁俊鎭櫥璁拌〃" name="firstVisit">
- <el-form :model="form.pregFirst" label-width="160px" size="small" :disabled="!editing">
- <el-divider content-position="left">鍩烘湰淇℃伅</el-divider>
+ <div class="sub-section">
+ <div class="sub-title">瀛曞棣栬瘖淇℃伅鐧昏</div>
+ <el-form :model="pregForm.firstVisit" label-width="120px" size="small" :disabled="!editing">
<el-row :gutter="20">
- <el-col :span="8"><el-form-item label="寤烘。鏃ユ湡"><el-date-picker v-model="form.pregFirst.regDate" value-format="yyyy-MM-dd" style="width:100%" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="涓堝か濮撳悕"><el-input v-model="form.pregFirst.husbandName" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="涓堝か鐢佃瘽"><el-input v-model="form.pregFirst.husbandPhone" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="灏辫瘖鍙�"><el-input v-model="pregForm.firstVisit.visitNo" class="w-sm" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="鏈汉鑱旂郴鏂瑰紡"><el-input v-model="pregForm.firstVisit.selfPhone" class="w-sm" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="鐥呭尯濮撳悕"><el-input v-model="pregForm.firstVisit.wardName" class="w-sm" /></el-form-item></el-col>
</el-row>
<el-row :gutter="20">
- <el-col :span="8"><el-form-item label="鏈鏈堢粡"><el-date-picker v-model="form.pregFirst.lmp" value-format="yyyy-MM-dd" style="width:100%" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="棰勪骇鏈�"><el-date-picker v-model="form.pregFirst.edd" value-format="yyyy-MM-dd" style="width:100%" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="瀛曟/浜ф"><el-input v-model="form.pregFirst.gp" placeholder="G_P_" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="鑱旂郴浜鸿仈绯绘柟寮�"><el-input v-model="pregForm.firstVisit.contactPhone" class="w-sm" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="韬唤璇佸彿"><el-input v-model="pregForm.firstVisit.idcardno" class="w-md" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="棣栬瘖鍖荤敓"><el-input v-model="pregForm.firstVisit.firstDoctor" class="w-sm" /></el-form-item></el-col>
</el-row>
- <el-divider content-position="left">鏃㈠線鍙�</el-divider>
<el-row :gutter="20">
- <el-col :span="8"><el-form-item label="鍓栧浜у彶"><el-select v-model="form.pregFirst.csHistory" style="width:100%"><el-option label="鏃�" :value="0" /><el-option label="鏈�" :value="1" /></el-select></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="娴佷骇鍙�"><el-select v-model="form.pregFirst.abortionHistory" style="width:100%"><el-option label="鏃�" :value="0" /><el-option label="鏈�" :value="1" /></el-select></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="鐤剧梾鍙�"><el-input v-model="form.pregFirst.diseaseHistory" placeholder="楂樿鍘�/绯栧翱鐥�/鐢茬姸鑵虹瓑" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="璇婃柇鍚嶇О"><el-input v-model="pregForm.firstVisit.diagname" class="w-full" /></el-form-item></el-col>
+ <el-col :span="16"><el-form-item label="灞呬綇鍦板潃"><el-input v-model="pregForm.firstVisit.address" class="w-full" /></el-form-item></el-col>
</el-row>
- <el-divider content-position="left">鏈濡婂鎯呭喌</el-divider>
- <el-row :gutter="20">
- <el-col :span="8"><el-form-item label="韬珮(cm)"><el-input-number v-model="form.pregFirst.height" :precision="1" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="瀛曞墠浣撻噸(kg)"><el-input-number v-model="form.pregFirst.preWeight" :precision="1" /></el-form-item></el-col>
- </el-row>
- <el-form-item label="楂樺嵄鍥犵礌璇勪及"><el-input v-model="form.pregFirst.riskAssessment" type="textarea" :rows="2" /></el-form-item>
- <el-form-item label="寤哄唽鍖荤敓"><el-input v-model="form.pregFirst.doctor" style="width:200px" /></el-form-item>
</el-form>
- </el-tab-pane>
+ </div>
- <!-- 3. 鏃╁瓡闅忚鐧昏琛� -->
- <el-tab-pane label="涓芥按濡囧辜淇濆仴闄㈡棭瀛曢殢璁跨櫥璁拌〃" name="earlyFollow">
- <el-form :model="form.pregEarly" label-width="150px" size="small" :disabled="!editing">
- <el-row :gutter="20">
- <el-col :span="8"><el-form-item label="闅忚鏃ユ湡"><el-date-picker v-model="form.pregEarly.date" value-format="yyyy-MM-dd" style="width:100%" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="瀛曞懆"><el-input-number v-model="form.pregEarly.gestWeek" :min="1" :max="14" /></el-form-item></el-col>
+ <div class="sub-section">
+ <div class="sub-title">濡婂鎯呭喌</div>
+ <el-form label-width="0" size="small" :disabled="!editing">
+ <el-row :gutter="24" class="preg-cascade">
+ <el-col :span="8">
+ <div class="cascade-col">
+ <div class="cascade-label">濡婂鎯呭喌</div>
+ <el-radio-group v-model="pregForm.pregnancy.status" @change="onPregnancyStatusChange">
+ <el-radio v-for="(opt, key) in PREGNANCY_OPTIONS" :key="key" :label="key">{{ opt.label }}</el-radio>
+ </el-radio-group>
+ </div>
+ </el-col>
+ <el-col :span="8">
+ <div class="cascade-col">
+ <div class="cascade-label">鍏蜂綋鎯呭喌</div>
+ <el-checkbox-group v-model="pregForm.pregnancy.details" :disabled="!pregForm.pregnancy.status">
+ <el-checkbox v-for="d in pregnancySubOptions" :key="d" :label="d">{{ d }}</el-checkbox>
+ </el-checkbox-group>
+ <div v-if="!pregForm.pregnancy.status" class="cascade-empty">璇峰厛閫夋嫨濡婂鎯呭喌</div>
+ </div>
+ </el-col>
+ <el-col :span="8">
+ <div class="cascade-col">
+ <div class="cascade-label">澶勭悊寤鸿</div>
+ <el-checkbox-group v-model="pregForm.pregnancy.hint" :disabled="!pregForm.pregnancy.status">
+ <el-checkbox v-for="h in pregnancyHintOptions" :key="h" :label="h">{{ h }}</el-checkbox>
+ </el-checkbox-group>
+ <div v-if="!pregForm.pregnancy.status" class="cascade-empty">璇峰厛閫夋嫨濡婂鎯呭喌</div>
+ </div>
+ </el-col>
</el-row>
- <el-row :gutter="20">
- <el-col :span="8"><el-form-item label="鏃╁瓡鍙嶅簲"><el-select v-model="form.pregEarly.morningSickness" style="width:100%"><el-option label="鏃�" value="鏃�" /><el-option label="杞诲害" value="杞诲害" /><el-option label="涓害" value="涓害" /><el-option label="閲嶅害" value="閲嶅害" /></el-select></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="闃撮亾鍑鸿"><el-select v-model="form.pregEarly.bleeding" style="width:100%"><el-option label="鏃�" value="鏃�" /><el-option label="鏈�" value="鏈�" /></el-select></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="鑵圭棝"><el-select v-model="form.pregEarly.abdominalPain" style="width:100%"><el-option label="鏃�" value="鏃�" /><el-option label="鏈�" value="鏈�" /></el-select></el-form-item></el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="8"><el-form-item label="琛�甯歌"><el-input v-model="form.pregEarly.bloodRoutine" placeholder="Hb/PLT绛�" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="灏垮父瑙�"><el-input v-model="form.pregEarly.urineRoutine" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="B瓒呮鏌�"><el-input v-model="form.pregEarly.ultrasound" placeholder="CRL/NT绛�" /></el-form-item></el-col>
- </el-row>
- <el-form-item label="鍙堕吀琛ュ厖"><el-select v-model="form.pregEarly.folicAcid" style="width:200px"><el-option label="瑙勫緥鏈嶇敤" value="瑙勫緥鏈嶇敤" /><el-option label="鍋跺皵鏈嶇敤" value="鍋跺皵鏈嶇敤" /><el-option label="鏈湇鐢�" value="鏈湇鐢�" /></el-select></el-form-item>
- <el-form-item label="鎸囧鎰忚"><el-input v-model="form.pregEarly.advice" type="textarea" :rows="2" /></el-form-item>
- <el-form-item label="闅忚鍖荤敓"><el-input v-model="form.pregEarly.doctor" style="width:200px" /></el-form-item>
</el-form>
- </el-tab-pane>
- </el-tabs>
- </el-card>
- </template>
+ </div>
+ </el-card>
- <!-- ===== 鏇村勾鏈熼殢璁匡細6涓〃鍗� ===== -->
- <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>
- <el-tabs v-model="activeTab" type="border-card">
- <!-- 1. 鏇村勾鏈熼殢璁跨郴缁熼棶棰樿〃 -->
- <el-tab-pane label="鏇村勾鏈熼殢璁跨郴缁熼棶棰樿〃" name="sysQ">
- <el-form :model="form.menoSysQ" label-width="150px" size="small" :disabled="!editing">
- <el-row :gutter="20">
- <el-col :span="8"><el-form-item label="濉啓鏃ユ湡"><el-date-picker v-model="form.menoSysQ.date" value-format="yyyy-MM-dd" style="width:100%" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="骞撮緞"><el-input-number v-model="form.menoSysQ.age" /></el-form-item></el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="8"><el-form-item label="鏈堢粡鎯呭喌"><el-input v-model="form.menoSysQ.menstruation" placeholder="鍛ㄦ湡/缁忔湡/缁忛噺" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="鏈鏈堢粡"><el-date-picker v-model="form.menoSysQ.lmp" value-format="yyyy-MM-dd" style="width:100%" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="缁濈粡骞撮緞"><el-input-number v-model="form.menoSysQ.menopauseAge" /></el-form-item></el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="6"><el-form-item label="娼儹鍑烘睏"><el-select v-model="form.menoSysQ.hotFlash" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
- <el-col :span="6"><el-form-item label="澶辩湢"><el-select v-model="form.menoSysQ.insomnia" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
- <el-col :span="6"><el-form-item label="鎯呯华娉㈠姩"><el-select v-model="form.menoSysQ.mood" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
- <el-col :span="6"><el-form-item label="鐤蹭箯"><el-select v-model="form.menoSysQ.fatigue" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="6"><el-form-item label="鍏宠妭鐥�"><el-select v-model="form.menoSysQ.jointPain" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
- <el-col :span="6"><el-form-item label="蹇冩偢"><el-select v-model="form.menoSysQ.palpitation" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
- <el-col :span="6"><el-form-item label="闃撮亾骞叉订"><el-select v-model="form.menoSysQ.dryness" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
- <el-col :span="6"><el-form-item label="鎬ф鍑忛��"><el-select v-model="form.menoSysQ.libido" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
- </el-row>
- <el-form-item label="鍏朵粬鐥囩姸"><el-input v-model="form.menoSysQ.otherSymptoms" type="textarea" :rows="2" /></el-form-item>
- <el-form-item label="澶勭悊鎰忚"><el-input v-model="form.menoSysQ.advice" type="textarea" :rows="2" /></el-form-item>
- <el-form-item label="鍖荤敓"><el-input v-model="form.menoSysQ.doctor" style="width:200px" /></el-form-item>
- </el-form>
- </el-tab-pane>
+ <!-- 鏄惁寤哄唽锛堝瓡濡囬殢璁匡級 -->
+ <el-card v-if="archive.subType === 'pregnancy'" class="info-card" shadow="never" style="margin-top:14px">
+ <div slot="header" class="card-header"><span>鏄惁寤哄唽</span></div>
+ <el-form :model="pregForm.registration" label-width="120px" size="small" :disabled="!editing">
+ <el-row :gutter="20">
+ <el-col :span="8"><el-form-item label="鏄惁寤哄唽">
+ <el-radio-group v-model="pregForm.registration.isRegistered">
+ <el-radio label="鏄�">鏄�</el-radio><el-radio label="鍚�">鍚�</el-radio>
+ </el-radio-group>
+ </el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="棰勪骇鏈�"><el-date-picker v-model="pregForm.registration.edd" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="璁板綍鑰�"><el-input v-model="pregForm.registration.recorder" class="w-sm" /></el-form-item></el-col>
+ </el-row>
+ <el-form-item v-if="pregForm.registration.isRegistered === '鍚�'" label="鏈缓妗e師鍥�">
+ <el-input v-model="pregForm.registration.unregisteredReason" type="textarea" :rows="2" class="w-lg" />
+ </el-form-item>
+ </el-form>
+ </el-card>
- <!-- 2. MHT棣栬瘖鐥呭巻琛� -->
- <el-tab-pane label="MHT棣栬瘖鐥呭巻琛�" name="mhtFirst">
- <el-form :model="form.mhtFirst" label-width="160px" size="small" :disabled="!editing">
- <el-row :gutter="20">
- <el-col :span="8"><el-form-item label="灏辫瘖鏃ユ湡"><el-date-picker v-model="form.mhtFirst.date" value-format="yyyy-MM-dd" style="width:100%" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="涓昏瘔"><el-input v-model="form.mhtFirst.chiefComplaint" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="缁濈粡骞撮檺"><el-input-number v-model="form.mhtFirst.menopauseYears" :precision="1" /></el-form-item></el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="8"><el-form-item label="韬珮(cm)"><el-input-number v-model="form.mhtFirst.height" :precision="1" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="浣撻噸(kg)"><el-input-number v-model="form.mhtFirst.weight" :precision="1" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="BMI"><el-input-number v-model="form.mhtFirst.bmi" :precision="1" disabled /></el-form-item></el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="8"><el-form-item label="琛�鍘�"><el-input v-model="form.mhtFirst.bloodPressure" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="琛�绯�"><el-input-number v-model="form.mhtFirst.glucose" :precision="1" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="琛�鑴�"><el-input v-model="form.mhtFirst.lipid" placeholder="TC/TG/LDL/HDL" /></el-form-item></el-col>
- </el-row>
- <el-form-item label="鏃㈠線鍙�"><el-input v-model="form.mhtFirst.pastHistory" type="textarea" :rows="2" placeholder="楂樿鍘�/绯栧翱鐥�/琛�鏍�/涔宠吅鐧�/瀛愬鑲岀槫绛�" /></el-form-item>
- <el-form-item label="濡囩妫�鏌�"><el-input v-model="form.mhtFirst.gynExam" type="textarea" :rows="2" /></el-form-item>
- <el-form-item label="涔宠吅妫�鏌�"><el-input v-model="form.mhtFirst.breastExam" type="textarea" :rows="2" /></el-form-item>
- <el-form-item label="杈呭姪妫�鏌�"><el-input v-model="form.mhtFirst.auxExam" type="textarea" :rows="2" placeholder="B瓒�/楠ㄥ瘑搴�/婵�绱犳按骞崇瓑" /></el-form-item>
- <el-form-item label="MHT鏂规"><el-input v-model="form.mhtFirst.mhtPlan" type="textarea" :rows="2" placeholder="鑽墿鍚嶇О/鍓傞噺/鐢ㄦ硶/鐤楃▼" /></el-form-item>
- <el-form-item label="鍖荤敓"><el-input v-model="form.mhtFirst.doctor" style="width:200px" /></el-form-item>
- </el-form>
- </el-tab-pane>
+ <!-- ===== 鍥寸粷缁忔湡MHI锛氭。妗堜俊鎭紙鍚殢璁垮懆鏈熸鏁帮級 ===== -->
+ <el-card v-if="archive.subType === 'menopause'" class="info-card" shadow="never" style="margin-top:14px">
+ <div slot="header" class="card-header">
+ <span>妗f淇℃伅</span>
+ <span class="header-sub">{{ archive.createTime ? archive.createTime.substring(0,10) : '-' }} 寤烘。</span>
+ </div>
+ <el-form :model="archive" label-width="110px" size="small" :disabled="!editing">
+ <el-row :gutter="20">
+ <el-col :span="8"><el-form-item label="韬唤璇佸彿"><el-input v-model="archive.idcardno" class="w-md" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="鍑虹敓鏃ユ湡"><el-date-picker v-model="archive.birthday" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="璇婃柇鏃ユ湡"><el-date-picker v-model="archive.diagnosisDate" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
+ </el-row>
+ <el-row :gutter="20">
+ <el-col :span="8"><el-form-item label="涓绘不鍖荤敓"><el-input v-model="archive.attendingDoctor" class="w-sm" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="缁忕鍖荤敓"><el-input v-model="archive.managingDoctor" class="w-sm" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="鐧昏浜哄憳"><el-input v-model="archive.registrant" class="w-sm" /></el-form-item></el-col>
+ </el-row>
+ <el-row :gutter="20">
+ <el-col :span="8"><el-form-item label="闅忚鍛ㄦ湡(娆℃暟)"><el-input v-model="archive.followupCycles" class="w-xs" /></el-form-item></el-col>
+ </el-row>
+ </el-form>
+ </el-card>
- <!-- 3. MHT澶嶈瘖鐥呭巻琛� -->
- <el-tab-pane label="MHT澶嶈瘖鐥呭巻琛�" name="mhtFollow">
- <el-form :model="form.mhtFollow" label-width="160px" size="small" :disabled="!editing">
+ <!-- ===== 瀛曞闅忚锛氭棭瀛曢殢璁胯〃 + 璇勫垎琛紙閫変腑銆岀粡鍜ㄨ鎸囧鍚庣户缁濞犲苟鍦ㄤ骇绉戝缓妗c�嶅悗鍑虹幇锛� ===== -->
+ <template v-if="archive.subType === 'pregnancy' && showFollowUp">
+ <el-card class="info-card" shadow="never" style="margin-top:14px">
+ <div slot="header" class="card-header"><span>鏃╁瓡闅忚琛�</span></div>
+ <el-form :model="pregForm.earlyFollow" label-width="140px" size="small" :disabled="!editing">
<el-row :gutter="20">
- <el-col :span="8"><el-form-item label="澶嶈瘖鏃ユ湡"><el-date-picker v-model="form.mhtFollow.date" value-format="yyyy-MM-dd" style="width:100%" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="鐢ㄨ嵂渚濅粠鎬�"><el-select v-model="form.mhtFollow.compliance" style="width:100%"><el-option label="鑹ソ" value="鑹ソ" /><el-option label="涓�鑸�" value="涓�鑸�" /><el-option label="宸�" value="宸�" /></el-select></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="濮撳悕"><el-input v-model="pregForm.earlyFollow.name" class="w-sm" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="骞撮緞"><el-input v-model="pregForm.earlyFollow.age" class="w-xs" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="灏辫瘖鍙�"><el-input v-model="pregForm.earlyFollow.visitNo" class="w-sm" /></el-form-item></el-col>
</el-row>
<el-row :gutter="20">
- <el-col :span="8"><el-form-item label="鐥囩姸鏀瑰杽"><el-select v-model="form.mhtFollow.symptomImprove" style="width:100%"><el-option label="鏄庢樉" value="鏄庢樉" /><el-option label="閮ㄥ垎" value="閮ㄥ垎" /><el-option label="鏃犲彉鍖�" value="鏃犲彉鍖�" /></el-select></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="涓嶈壇鍙嶅簲"><el-input v-model="form.mhtFollow.sideEffect" placeholder="濡備钩鎴胯儉鐥�/闃撮亾鍑鸿绛�" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="闃撮亾鍑鸿"><el-select v-model="form.mhtFollow.bleeding" style="width:100%"><el-option label="鏃�" value="鏃�" /><el-option label="鐐规淮" value="鐐规淮" /><el-option label="灏戦噺" value="灏戦噺" /><el-option label="涓噺" value="涓噺" /></el-select></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="鑱旂郴鏂瑰紡(寰俊)"><el-input v-model="pregForm.earlyFollow.wechat" class="w-sm" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="鎴风睄"><el-input v-model="pregForm.earlyFollow.household" class="w-sm" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="瀛曚骇鍙�"><el-input v-model="pregForm.earlyFollow.gravidaPara" placeholder="G_P_" class="w-xs" /></el-form-item></el-col>
</el-row>
<el-row :gutter="20">
- <el-col :span="8"><el-form-item label="浣撻噸(kg)"><el-input-number v-model="form.mhtFollow.weight" :precision="1" /></el-form-item></el-col>
- <el-col :span="8"><el-form-item label="琛�鍘�"><el-input v-model="form.mhtFollow.bloodPressure" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="濠氬Щ鐘跺喌">
+ <el-select v-model="pregForm.earlyFollow.maritalStatus" class="w-sm">
+ <el-option label="鏈" value="鏈" /><el-option label="宸插" value="宸插" /><el-option label="涓嶈" value="涓嶈" />
+ </el-select>
+ </el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="寤鸿〃鏃ユ湡"><el-date-picker v-model="pregForm.earlyFollow.buildDate" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="棰勪骇鏈�"><el-date-picker v-model="pregForm.earlyFollow.edd" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
</el-row>
- <el-form-item label="澶嶆煡缁撴灉"><el-input v-model="form.mhtFollow.reExamResult" type="textarea" :rows="2" placeholder="B瓒�/涔宠吅/婵�绱犵瓑妫�鏌ョ粨鏋�" /></el-form-item>
- <el-form-item label="鏂规璋冩暣"><el-input v-model="form.mhtFollow.planAdjust" type="textarea" :rows="2" /></el-form-item>
- <el-form-item label="涓嬫澶嶈瘖"><el-date-picker v-model="form.mhtFollow.nextVisit" value-format="yyyy-MM-dd" style="width:200px" /></el-form-item>
- <el-form-item label="鍖荤敓"><el-input v-model="form.mhtFollow.doctor" style="width:200px" /></el-form-item>
+ <el-form-item label="璁″垝娴佷骇涓昏鍘熷洜(鍙閫�)">
+ <el-checkbox-group v-model="pregForm.earlyFollow.abortionReasons">
+ <el-checkbox label="宸叉湁澶氬" /><el-checkbox label="缁忔祹鍥犵礌" /><el-checkbox label="鑽墿鏆撮湶" />
+ <el-checkbox label="鏈揪缁撳骞撮緞" /><el-checkbox label="韬綋鍥犵礌" /><el-checkbox label="瀹跺涵鏀寔涓嶈冻" />
+ <el-checkbox label="鑷韩涓嶆効鐢熻偛" /><el-checkbox label="鍏朵粬" />
+ </el-checkbox-group>
+ <el-input v-if="pregForm.earlyFollow.abortionReasons.includes('鍏朵粬')" v-model="pregForm.earlyFollow.otherReason" placeholder="鍏朵粬鍘熷洜" class="w-md" style="margin-top:8px" />
+ </el-form-item>
+ <el-form-item label="缁х画濡婂">
+ <el-radio-group v-model="pregForm.earlyFollow.continuePregnancy">
+ <el-radio label="鏄�">鏄�</el-radio><el-radio label="鍚�">鍚�</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ <el-row :gutter="20">
+ <el-col :span="16"><el-form-item label="鏃╁瓡寤哄唽鍗曚綅"><el-input v-model="pregForm.earlyFollow.registrationUnit" class="w-full" /></el-form-item></el-col>
+ </el-row>
</el-form>
- </el-tab-pane>
- <!-- 4. 鏀硅壇Kupperman璇勫垎鏍囧噯琛� -->
- <el-tab-pane label="鏀硅壇Kupperman璇勫垎鏍囧噯琛�" name="kupperman">
- <el-form :model="form.kupperman" label-width="160px" size="small" :disabled="!editing">
- <el-row :gutter="20">
- <el-col :span="8"><el-form-item label="璇勪及鏃ユ湡"><el-date-picker v-model="form.kupperman.date" value-format="yyyy-MM-dd" style="width:100%" /></el-form-item></el-col>
- </el-row>
- <KuppermanScoreTable v-model="form.kupperman" :editing="editing" />
- </el-form>
- </el-tab-pane>
+ <div class="sub-section">
+ <div class="sub-title">杈呭鍐呭</div>
+ <el-table :data="pregForm.counseling" border size="small">
+ <el-table-column label="杈呭娆℃暟" width="120" align="center">
+ <template slot-scope="scope">{{ ['绗竴娆¤緟瀵�','绗簩娆¤緟瀵�','绗笁娆¤緟瀵�','绗洓娆¤緟瀵�'][scope.$index] }}</template>
+ </el-table-column>
+ <el-table-column label="杈呭鏃ユ湡" width="160" align="center">
+ <template slot-scope="scope">
+ <el-date-picker v-if="editing" v-model="scope.row.date" value-format="yyyy-MM-dd" size="small" style="width:100%" />
+ <span v-else>{{ scope.row.date || '-' }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="杈呭鍐呭" align="center">
+ <template slot-scope="scope">
+ <el-input v-if="editing" v-model="scope.row.content" size="small" />
+ <span v-else>{{ scope.row.content || '-' }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="杈呭浜哄憳" width="140" align="center">
+ <template slot-scope="scope">
+ <el-input v-if="editing" v-model="scope.row.person" size="small" />
+ <span v-else>{{ scope.row.person || '-' }}</span>
+ </template>
+ </el-table-column>
+ </el-table>
+ </div>
- <!-- 5. 鏇村勾鏈熻瘎鍒嗛噺琛�(MRS) -->
- <el-tab-pane label="鏇村勾鏈熻瘎鍒嗛噺琛紙MRS锛�" name="mrs">
- <el-form :model="form.mrs" label-width="160px" size="small" :disabled="!editing">
- <el-row :gutter="20">
- <el-col :span="8"><el-form-item label="璇勪及鏃ユ湡"><el-date-picker v-model="form.mrs.date" value-format="yyyy-MM-dd" style="width:100%" /></el-form-item></el-col>
- </el-row>
- <MRSScoreTable v-model="form.mrs" :editing="editing" />
- </el-form>
- </el-tab-pane>
+ <div class="sub-section">
+ <div class="sub-title">璇勫垎琛�</div>
+ <el-form :model="pregForm.score" label-width="140px" size="small" :disabled="!editing" inline>
+ <el-form-item label="璇勫垎鎬诲垎"><el-input-number v-model="pregForm.score.total" :controls="false" style="width:140px" /></el-form-item>
+ <el-form-item label="璇勪及缁撴灉"><el-input v-model="pregForm.score.result" class="w-lg" /></el-form-item>
+ </el-form>
+ </div>
+ </el-card>
- <!-- 6. 鍖瑰吂鍫$潯鐪犺川閲忚瘎鍒嗛噺琛�(PSQI) -->
- <el-tab-pane label="鍖瑰吂鍫$潯鐪犺川閲忚瘎鍒嗛噺琛紙PSQI锛�" name="psqi">
- <el-form :model="form.psqi" label-width="160px" size="small" :disabled="!editing">
- <el-row :gutter="20">
- <el-col :span="8"><el-form-item label="璇勪及鏃ユ湡"><el-date-picker v-model="form.psqi.date" value-format="yyyy-MM-dd" style="width:100%" /></el-form-item></el-col>
- </el-row>
- <PSQIScoreTable v-model="form.psqi" :editing="editing" />
- </el-form>
- </el-tab-pane>
- </el-tabs>
- </el-card>
- </template>
+ <!-- 闅忚鍛ㄦ湡 -->
+ <el-card class="info-card" shadow="never" style="margin-top:14px">
+ <div slot="header" class="card-header"><span>闅忚鍛ㄦ湡</span></div>
+ <EditableTable :data.sync="pregForm.followupCycle" :editing="editing" :columns="followupColumns" />
+ </el-card>
+
+ <!-- 褰撳墠鎮h�呴殢璁胯褰曡〃 -->
+ <el-card class="info-card" shadow="never" style="margin-top:14px">
+ <div slot="header" class="card-header"><span>褰撳墠鎮h�呴殢璁胯褰曡〃</span></div>
+ <el-table :data="currentFollowRecords" border size="small">
+ <el-table-column type="index" label="搴忓彿" width="60" align="center" />
+ <el-table-column prop="planDate" label="鎷熼殢璁挎棩鏈�" width="130" align="center" />
+ <el-table-column prop="status" label="鐘跺喌" width="100" align="center" />
+ <el-table-column prop="method" label="闅忚鏂瑰紡" width="110" align="center" />
+ <el-table-column prop="situation" label="闅忚鎯呭喌" align="center" show-overflow-tooltip />
+ <el-table-column prop="followDate" label="闅忚鏃ユ湡" width="130" align="center" />
+ <el-table-column prop="staff" label="闅忚浜哄憳" width="110" align="center" />
+ </el-table>
+ </el-card>
+ </template>
+
+ <!-- ===== 鍥寸粷缁忔湡MHI锛�6 涓噺琛� tab ===== -->
+ <template v-if="archive.subType === 'menopause'">
+ <el-card class="info-card" shadow="never" style="margin-top:14px">
+ <div slot="header" class="card-header"><span>鍥寸粷缁忔湡MHI绠$悊</span></div>
+ <el-tabs v-model="activeTab" type="border-card">
+ <el-tab-pane label="鏇村勾鏈熼殢璁跨郴缁熼棶棰樿〃" name="sysQ">
+ <el-form :model="form.menoSysQ" label-width="150px" size="small" :disabled="!editing">
+ <el-row :gutter="20">
+ <el-col :span="8"><el-form-item label="濉啓鏃ユ湡"><el-date-picker v-model="form.menoSysQ.date" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="骞撮緞"><el-input-number v-model="form.menoSysQ.age" /></el-form-item></el-col>
+ </el-row>
+ <el-row :gutter="20">
+ <el-col :span="8"><el-form-item label="鏈堢粡鎯呭喌"><el-input v-model="form.menoSysQ.menstruation" placeholder="鍛ㄦ湡/缁忔湡/缁忛噺" class="w-md" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="鏈鏈堢粡"><el-date-picker v-model="form.menoSysQ.lmp" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="缁濈粡骞撮緞"><el-input-number v-model="form.menoSysQ.menopauseAge" /></el-form-item></el-col>
+ </el-row>
+ <el-row :gutter="20">
+ <el-col :span="6"><el-form-item label="娼儹鍑烘睏"><el-select v-model="form.menoSysQ.hotFlash" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
+ <el-col :span="6"><el-form-item label="澶辩湢"><el-select v-model="form.menoSysQ.insomnia" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
+ <el-col :span="6"><el-form-item label="鎯呯华娉㈠姩"><el-select v-model="form.menoSysQ.mood" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
+ <el-col :span="6"><el-form-item label="鐤蹭箯"><el-select v-model="form.menoSysQ.fatigue" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
+ </el-row>
+ <el-row :gutter="20">
+ <el-col :span="6"><el-form-item label="鍏宠妭鐥�"><el-select v-model="form.menoSysQ.jointPain" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
+ <el-col :span="6"><el-form-item label="蹇冩偢"><el-select v-model="form.menoSysQ.palpitation" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
+ <el-col :span="6"><el-form-item label="闃撮亾骞叉订"><el-select v-model="form.menoSysQ.dryness" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
+ <el-col :span="6"><el-form-item label="鎬ф鍑忛��"><el-select v-model="form.menoSysQ.libido" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
+ </el-row>
+ <el-form-item label="鍏朵粬鐥囩姸"><el-input v-model="form.menoSysQ.otherSymptoms" type="textarea" :rows="2" /></el-form-item>
+ <el-form-item label="澶勭悊鎰忚"><el-input v-model="form.menoSysQ.advice" type="textarea" :rows="2" /></el-form-item>
+ <el-form-item label="鍖荤敓"><el-input v-model="form.menoSysQ.doctor" class="w-sm" /></el-form-item>
+ </el-form>
+ </el-tab-pane>
+
+ <el-tab-pane label="MHT棣栬瘖鐥呭巻琛�" name="mhtFirst">
+ <el-form :model="form.mhtFirst" label-width="160px" size="small" :disabled="!editing">
+ <el-row :gutter="20">
+ <el-col :span="8"><el-form-item label="灏辫瘖鏃ユ湡"><el-date-picker v-model="form.mhtFirst.date" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="涓昏瘔"><el-input v-model="form.mhtFirst.chiefComplaint" class="w-sm" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="缁濈粡骞撮檺"><el-input-number v-model="form.mhtFirst.menopauseYears" :precision="1" /></el-form-item></el-col>
+ </el-row>
+ <el-row :gutter="20">
+ <el-col :span="8"><el-form-item label="韬珮(cm)"><el-input-number v-model="form.mhtFirst.height" :precision="1" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="浣撻噸(kg)"><el-input-number v-model="form.mhtFirst.weight" :precision="1" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="BMI"><el-input-number v-model="form.mhtFirst.bmi" :precision="1" disabled /></el-form-item></el-col>
+ </el-row>
+ <el-row :gutter="20">
+ <el-col :span="8"><el-form-item label="琛�鍘�"><el-input v-model="form.mhtFirst.bloodPressure" class="w-xs" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="琛�绯�"><el-input-number v-model="form.mhtFirst.glucose" :precision="1" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="琛�鑴�"><el-input v-model="form.mhtFirst.lipid" placeholder="TC/TG/LDL/HDL" class="w-md" /></el-form-item></el-col>
+ </el-row>
+ <el-form-item label="鏃㈠線鍙�"><el-input v-model="form.mhtFirst.pastHistory" type="textarea" :rows="2" placeholder="楂樿鍘�/绯栧翱鐥�/琛�鏍�/涔宠吅鐧�/瀛愬鑲岀槫绛�" /></el-form-item>
+ <el-form-item label="濡囩妫�鏌�"><el-input v-model="form.mhtFirst.gynExam" type="textarea" :rows="2" /></el-form-item>
+ <el-form-item label="涔宠吅妫�鏌�"><el-input v-model="form.mhtFirst.breastExam" type="textarea" :rows="2" /></el-form-item>
+ <el-form-item label="杈呭姪妫�鏌�"><el-input v-model="form.mhtFirst.auxExam" type="textarea" :rows="2" placeholder="B瓒�/楠ㄥ瘑搴�/婵�绱犳按骞崇瓑" /></el-form-item>
+ <el-form-item label="MHT鏂规"><el-input v-model="form.mhtFirst.mhtPlan" type="textarea" :rows="2" placeholder="鑽墿鍚嶇О/鍓傞噺/鐢ㄦ硶/鐤楃▼" /></el-form-item>
+ <el-form-item label="鍖荤敓"><el-input v-model="form.mhtFirst.doctor" class="w-sm" /></el-form-item>
+ </el-form>
+ </el-tab-pane>
+
+ <el-tab-pane label="MHT澶嶈瘖鐥呭巻琛�" name="mhtFollow">
+ <el-form :model="form.mhtFollow" label-width="160px" size="small" :disabled="!editing">
+ <el-row :gutter="20">
+ <el-col :span="8"><el-form-item label="澶嶈瘖鏃ユ湡"><el-date-picker v-model="form.mhtFollow.date" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="鐢ㄨ嵂渚濅粠鎬�"><el-select v-model="form.mhtFollow.compliance" style="width:100%"><el-option label="鑹ソ" value="鑹ソ" /><el-option label="涓�鑸�" value="涓�鑸�" /><el-option label="宸�" value="宸�" /></el-select></el-form-item></el-col>
+ </el-row>
+ <el-row :gutter="20">
+ <el-col :span="8"><el-form-item label="鐥囩姸鏀瑰杽"><el-select v-model="form.mhtFollow.symptomImprove" style="width:100%"><el-option label="鏄庢樉" value="鏄庢樉" /><el-option label="閮ㄥ垎" value="閮ㄥ垎" /><el-option label="鏃犲彉鍖�" value="鏃犲彉鍖�" /></el-select></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="涓嶈壇鍙嶅簲"><el-input v-model="form.mhtFollow.sideEffect" placeholder="濡備钩鎴胯儉鐥�/闃撮亾鍑鸿绛�" class="w-md" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="闃撮亾鍑鸿"><el-select v-model="form.mhtFollow.bleeding" style="width:100%"><el-option label="鏃�" value="鏃�" /><el-option label="鐐规淮" value="鐐规淮" /><el-option label="灏戦噺" value="灏戦噺" /><el-option label="涓噺" value="涓噺" /></el-select></el-form-item></el-col>
+ </el-row>
+ <el-row :gutter="20">
+ <el-col :span="8"><el-form-item label="浣撻噸(kg)"><el-input-number v-model="form.mhtFollow.weight" :precision="1" /></el-form-item></el-col>
+ <el-col :span="8"><el-form-item label="琛�鍘�"><el-input v-model="form.mhtFollow.bloodPressure" class="w-xs" /></el-form-item></el-col>
+ </el-row>
+ <el-form-item label="澶嶆煡缁撴灉"><el-input v-model="form.mhtFollow.reExamResult" type="textarea" :rows="2" placeholder="B瓒�/涔宠吅/婵�绱犵瓑妫�鏌ョ粨鏋�" /></el-form-item>
+ <el-form-item label="鏂规璋冩暣"><el-input v-model="form.mhtFollow.planAdjust" type="textarea" :rows="2" /></el-form-item>
+ <el-form-item label="涓嬫澶嶈瘖"><el-date-picker v-model="form.mhtFollow.nextVisit" value-format="yyyy-MM-dd" class="w-md" /></el-form-item>
+ <el-form-item label="鍖荤敓"><el-input v-model="form.mhtFollow.doctor" class="w-sm" /></el-form-item>
+ </el-form>
+ </el-tab-pane>
+
+ <el-tab-pane label="鏀硅壇Kupperman璇勫垎鏍囧噯琛�" name="kupperman">
+ <el-form :model="form.kupperman" label-width="160px" size="small" :disabled="!editing">
+ <el-row :gutter="20"><el-col :span="8"><el-form-item label="璇勪及鏃ユ湡"><el-date-picker v-model="form.kupperman.date" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col></el-row>
+ <KuppermanScoreTable v-model="form.kupperman" :editing="editing" />
+ </el-form>
+ </el-tab-pane>
+
+ <el-tab-pane label="鏇村勾鏈熻瘎鍒嗛噺琛紙MRS锛�" name="mrs">
+ <el-form :model="form.mrs" label-width="160px" size="small" :disabled="!editing">
+ <el-row :gutter="20"><el-col :span="8"><el-form-item label="璇勪及鏃ユ湡"><el-date-picker v-model="form.mrs.date" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col></el-row>
+ <MRSScoreTable v-model="form.mrs" :editing="editing" />
+ </el-form>
+ </el-tab-pane>
+
+ <el-tab-pane label="鍖瑰吂鍫$潯鐪犺川閲忚瘎鍒嗛噺琛紙PSQI锛�" name="psqi">
+ <el-form :model="form.psqi" label-width="160px" size="small" :disabled="!editing">
+ <el-row :gutter="20"><el-col :span="8"><el-form-item label="璇勪及鏃ユ湡"><el-date-picker v-model="form.psqi.date" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col></el-row>
+ <PSQIScoreTable v-model="form.psqi" :editing="editing" />
+ </el-form>
+ </el-tab-pane>
+ </el-tabs>
+ </el-card>
+ </template>
+ </el-tab-pane>
+
+ <el-tab-pane label="鏈嶅姟璁板綍" name="service">
+ <ServiceRecords :patid="archive.patid" />
+ </el-tab-pane>
+ </el-tabs>
</template>
<div v-else class="empty-wrap">妗f涓嶅瓨鍦ㄦ垨宸插垹闄�</div>
</div>
@@ -257,20 +363,48 @@
<script>
import InfoField from "../childHealth/InfoField.vue";
+import EditableTable from "../components/EditableTable.vue";
+import ServiceRecords from "../components/ServiceRecords.vue";
import KuppermanScoreTable from "./KuppermanScoreTable.vue";
import MRSScoreTable from "./MRSScoreTable.vue";
import PSQIScoreTable from "./PSQIScoreTable.vue";
+import { loadArchives, saveArchives } from "../types";
+
+const PREGNANCY_OPTIONS = {
+ planBirth: { label: "棣栬瘖鎷熺敓鑲�", details: ["鍏堝厗娴佷骇"], hints: ["鍖诲澶勭疆鍚庣户缁濞犲苟鍦ㄤ骇绉戝缓妗�"] },
+ earlyAbnormal: { label: "棣栬瘖鏃╁瓡寮傚父", details: ["鑷劧娴佷骇", "鑳氳儙鍋滆偛"], hints: ["涓哄コ鎬у啀娆″濞犳彁渚涘瀛曟寚瀵�"] },
+ planAbortion: { label: "棣栬瘖鎷熶汉宸ユ祦浜�", details: ["鑽墿娴佷骇", "鎵嬫湳娴佷骇"], hints: ["缁忓挩璇㈡寚瀵煎悗缁х画濡婂骞跺湪浜х寤烘。"] },
+};
export default {
name: "MaternalHealthArchiveDetail",
- components: { InfoField, KuppermanScoreTable, MRSScoreTable, PSQIScoreTable },
+ components: { InfoField, EditableTable, ServiceRecords, KuppermanScoreTable, MRSScoreTable, PSQIScoreTable },
data() {
return {
- loading: false, archive: null, editing: false, activeTab: "sysQ",
+ PREGNANCY_OPTIONS,
+ loading: false, archive: null, editing: true, activeTab: "sysQ", mainTab: "detail",
+ followupColumns: [
+ { prop: "seq", label: "搴忓彿", width: 60 },
+ { prop: "planDate", label: "鎷熼殢璁挎棩鏈�", width: 130, type: "date" },
+ { prop: "status", label: "鐘跺喌", width: 100, type: "select", options: ["宸插畬鎴�", "鏈畬鎴�"] },
+ { prop: "method", label: "闅忚鏂瑰紡", width: 110 },
+ { prop: "situation", label: "闅忚鎯呭喌", minWidth: 160 },
+ { prop: "followDate", label: "闅忚鏃ユ湡", width: 130, type: "date" },
+ { prop: "staff", label: "闅忚浜哄憳", width: 110 },
+ ],
+ pregForm: {
+ firstVisit: { visitNo: "", selfPhone: "", wardName: "", contactPhone: "", idcardno: "", address: "", diagname: "", firstDoctor: "" },
+ pregnancy: { status: "", details: [], hint: [] },
+ earlyFollow: { name: "", age: "", visitNo: "", wechat: "", household: "", gravidaPara: "", maritalStatus: "", buildDate: "", abortionReasons: [], otherReason: "", continuePregnancy: "", edd: "", registrationUnit: "" },
+ counseling: [
+ { date: "", content: "", person: "" }, { date: "", content: "", person: "" },
+ { date: "", content: "", person: "" }, { date: "", content: "", person: "" },
+ ],
+ score: { total: null, result: "" },
+ registration: { isRegistered: "", unregisteredReason: "", edd: "", recorder: "" },
+ followupCycle: [],
+ },
form: {
- pregSysQ: { date:"", gestWeek:null, weight:null, bloodPressure:"", fundalHeight:null, fetalHeart:null, edema:"鏃�", urineProtein:"-", symptoms:"", advice:"", nextVisit:"", doctor:"" },
- pregFirst: { regDate:"", husbandName:"", husbandPhone:"", lmp:"", edd:"", gp:"", csHistory:0, abortionHistory:0, diseaseHistory:"", height:null, preWeight:null, riskAssessment:"", doctor:"" },
- pregEarly: { date:"", gestWeek:null, morningSickness:"鏃�", bleeding:"鏃�", abdominalPain:"鏃�", bloodRoutine:"", urineRoutine:"", ultrasound:"", folicAcid:"瑙勫緥鏈嶇敤", advice:"", doctor:"" },
menoSysQ: { date:"", age:null, menstruation:"", lmp:"", menopauseAge:null, hotFlash:0, insomnia:0, mood:0, fatigue:0, jointPain:0, palpitation:0, dryness:0, libido:0, otherSymptoms:"", advice:"", doctor:"" },
mhtFirst: { date:"", chiefComplaint:"", menopauseYears:null, height:null, weight:null, bmi:null, bloodPressure:"", glucose:null, lipid:"", pastHistory:"", gynExam:"", breastExam:"", auxExam:"", mhtPlan:"", doctor:"" },
mhtFollow: { date:"", compliance:"鑹ソ", symptomImprove:"閮ㄥ垎", sideEffect:"", bleeding:"鏃�", weight:null, bloodPressure:"", reExamResult:"", planAdjust:"", nextVisit:"", doctor:"" },
@@ -282,48 +416,168 @@
},
computed: {
sourceLabel() { const m={standalone:"鐙珛寤烘。",outpatient:"闂ㄨ瘖璁板綍",inpatient:"鍦ㄩ櫌璁板綍"}; return m[this.archive?.sourcePage]||this.archive?.sourcePage||"-"; },
- menstrualLabel() { const m={irregular:"鏈堢粡绱婁贡",amenorrhea_short:"闂粡锛�<12涓湀锛�",menopause:"缁濈粡锛堚墺12涓湀锛�",surgical:"浜哄伐缁濈粡"}; return m[this.archive?.archiveForm?.menstrualStatus]||"-"; },
+ pregnancySubOptions() {
+ const opt = PREGNANCY_OPTIONS[this.pregForm.pregnancy.status];
+ return opt ? opt.details : [];
+ },
+ pregnancyHintOptions() {
+ const opt = PREGNANCY_OPTIONS[this.pregForm.pregnancy.status];
+ return opt ? opt.hints : [];
+ },
+ showFollowUp() {
+ return this.pregForm.pregnancy.status === "planAbortion" &&
+ this.pregForm.pregnancy.hint.includes("缁忓挩璇㈡寚瀵煎悗缁х画濡婂骞跺湪浜х寤烘。");
+ },
+ currentFollowRecords() {
+ return (this.pregForm.followupCycle || []).filter((r) => r.status === "宸插畬鎴�");
+ },
},
created() {
const id = this.$route.query.id;
- if (id) this.loadArchive(id);
+ if (id) this.loadArchive(id, this.$route.query.edit == 1);
},
methods: {
- loadArchive(id) {
+ loadArchive(id, autoEdit) {
this.loading = true;
- const all = JSON.parse(localStorage.getItem("patientArchives") || "[]");
- this.archive = all.find(item => item.id === id) || null;
+ this.archive = loadArchives().find((item) => item.id === id) || null;
if (this.archive) {
- if (this.archive.subType === 'pregnancy') this.activeTab = "sysQ";
- else if (this.archive.subType === 'menopause') this.activeTab = "sysQ";
- if (this.archive.formData) {
- Object.keys(this.form).forEach(k => {
- if (this.archive.formData[k]) Object.assign(this.form[k], this.archive.formData[k]);
- });
+ if (this.archive.subType === "pregnancy") {
+ if (this.archive.pregFormData) {
+ const saved = JSON.parse(JSON.stringify(this.archive.pregFormData));
+ this.pregForm = Object.assign({}, this.pregForm, saved);
+ if (!this.pregForm.pregnancy) this.pregForm.pregnancy = { status: "", details: [], hint: [] };
+ }
+ } else if (this.archive.subType === "menopause") {
+ if (this.archive.formData) {
+ Object.keys(this.form).forEach((k) => {
+ if (this.archive.formData[k]) Object.assign(this.form[k], this.archive.formData[k]);
+ });
+ }
}
}
+ if (autoEdit) this.editing = true;
this.loading = false;
+ },
+ onPregnancyStatusChange() {
+ this.pregForm.pregnancy.details = [];
+ this.pregForm.pregnancy.hint = [];
+ const opt = PREGNANCY_OPTIONS[this.pregForm.pregnancy.status];
+ if (this.archive) this.archive.pregnancyStatus = opt ? opt.label : "";
},
toggleEdit() {
if (this.editing) {
- this.archive.formData = JSON.parse(JSON.stringify(this.form));
- this.archive.updateTime = new Date().toISOString().replace("T"," ").substring(0,19);
- const all = JSON.parse(localStorage.getItem("patientArchives") || "[]");
- const idx = all.findIndex(item => item.id === this.archive.id);
+ 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));
+ this.archive.updateTime = new Date().toISOString().replace("T", " ").substring(0, 19);
+ const all = loadArchives();
+ const idx = all.findIndex((item) => item.id === this.archive.id);
if (idx >= 0) all[idx] = JSON.parse(JSON.stringify(this.archive));
- localStorage.setItem("patientArchives", JSON.stringify(all));
+ saveArchives(all);
this.$message.success("淇濆瓨鎴愬姛");
}
this.editing = !this.editing;
+ },
+ handleCloseCase() {
+ this.$modal.confirm("纭灏嗚妗f缁撴锛熺粨妗堝悗鍙湪鍒楄〃椤垫煡鐪嬬粨妗堢姸鎬併��").then(() => {
+ this.archive.closeStatus = 1;
+ this.archive.updateTime = new Date().toISOString().replace("T", " ").substring(0, 19);
+ const all = loadArchives();
+ const idx = all.findIndex((item) => item.id === this.archive.id);
+ if (idx >= 0) all[idx] = JSON.parse(JSON.stringify(this.archive));
+ saveArchives(all);
+ this.$message.success("宸茬粨妗�");
+ }).catch(() => {});
},
},
};
</script>
<style lang="scss" scoped>
+$primary: #3f6ef0;
+
+// 杈撳叆妗嗗搴︼紙鎸夊瓧娈甸暱鐭尯鍒嗭級
+.w-xs { width: 90px; }
+.w-sm { width: 150px; }
+.w-md { width: 200px; }
+.w-lg { width: 280px; }
+.w-full { width: 100%; }
+
.action-bar { margin-bottom: 16px; }
.info-card { margin-bottom: 0; }
.card-header { display: flex; justify-content: space-between; align-items: center; font-size: 16px; font-weight: 600; }
.header-sub { font-size: 13px; color: #909399; font-weight: normal; }
.empty-wrap { text-align: center; padding: 100px 0; color: #c0c4cc; font-size: 16px; }
+
+// 钃濊壊鍒嗗壊绾� + 灏忔爣棰�
+.sub-section {
+ & + .sub-section {
+ margin-top: 24px;
+ }
+}
+.sub-title {
+ position: relative;
+ padding-left: 12px;
+ margin-bottom: 16px;
+ font-size: 15px;
+ font-weight: 600;
+ color: #303133;
+ line-height: 1.2;
+
+ &::before {
+ content: "";
+ position: absolute;
+ left: 0;
+ top: 1px;
+ bottom: 1px;
+ width: 3px;
+ border-radius: 2px;
+ background: $primary;
+ }
+
+ &::after {
+ content: "";
+ position: absolute;
+ left: 0;
+ right: 0;
+ bottom: -7px;
+ border-bottom: 1px solid #dbe5ff;
+ }
+}
+
+// 濡婂鎯呭喌 涓夌骇鍕鹃��
+.preg-cascade {
+ .cascade-col {
+ padding: 14px 16px;
+ min-height: 120px;
+ border: 1px solid #e6ecfb;
+ border-radius: 8px;
+ background: #fafbff;
+
+ .el-radio-group,
+ .el-checkbox-group {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+
+ .el-radio,
+ .el-checkbox {
+ margin-right: 0;
+ margin-bottom: 8px;
+ }
+ }
+ }
+
+ .cascade-label {
+ margin-bottom: 10px;
+ font-size: 13px;
+ font-weight: 600;
+ color: $primary;
+ }
+
+ .cascade-empty {
+ padding: 10px 0;
+ font-size: 12px;
+ color: #c0c4cc;
+ }
+}
</style>
diff --git a/src/views/patient/archives/menopause/index.vue b/src/views/patient/archives/menopause/index.vue
new file mode 100644
index 0000000..bf66584
--- /dev/null
+++ b/src/views/patient/archives/menopause/index.vue
@@ -0,0 +1,12 @@
+<template>
+ <ArchiveList type="menopause" />
+</template>
+
+<script>
+import ArchiveList from "../components/ArchiveList.vue";
+
+export default {
+ name: "MenopauseArchiveList",
+ components: { ArchiveList },
+};
+</script>
diff --git a/src/views/patient/archives/nutrition/index.vue b/src/views/patient/archives/nutrition/index.vue
new file mode 100644
index 0000000..a96425f
--- /dev/null
+++ b/src/views/patient/archives/nutrition/index.vue
@@ -0,0 +1,12 @@
+<template>
+ <ArchiveList type="nutrition" />
+</template>
+
+<script>
+import ArchiveList from "../components/ArchiveList.vue";
+
+export default {
+ name: "NutritionArchiveList",
+ components: { ArchiveList },
+};
+</script>
diff --git a/src/views/patient/archives/pregnancy/index.vue b/src/views/patient/archives/pregnancy/index.vue
new file mode 100644
index 0000000..141acdc
--- /dev/null
+++ b/src/views/patient/archives/pregnancy/index.vue
@@ -0,0 +1,12 @@
+<template>
+ <ArchiveList type="pregnancy" />
+</template>
+
+<script>
+import ArchiveList from "../components/ArchiveList.vue";
+
+export default {
+ name: "PregnancyArchiveList",
+ components: { ArchiveList },
+};
+</script>
diff --git a/src/views/patient/archives/types.js b/src/views/patient/archives/types.js
new file mode 100644
index 0000000..3f91f1b
--- /dev/null
+++ b/src/views/patient/archives/types.js
@@ -0,0 +1,187 @@
+// 濡囦繚/鍎夸繚 5 绉嶇壒娈婃偅鑰呬笓妗堟敞鍐岃〃锛堝崟涓�鏁版嵁婧愶級
+// category: maternal=濡囦繚绉� / child=鍎夸繚绉�
+// entryLabel: 鍏ュ彛锛堥棬璇婅褰曢〉閫変笓妗堬級鎸夐挳鍚�
+// label: 鍒楄〃椤�/璇︽儏椤垫爣棰�
+// columns: 鍒楄〃椤靛垪瀹氫箟 { label, prop, type }
+// type 鍙栧�硷細text(榛樿) | sex | date | closeStatus
+export const ARCHIVE_TYPES = [
+ {
+ key: "pregnancy",
+ category: "maternal",
+ entryLabel: "鏃╁瓡鍏崇埍",
+ label: "瀛曞闅忚",
+ subTypeLabel: "瀛曞闅忚",
+ route: "/filing/pregnancy",
+ detailRoute: "/filing/maternalDetail",
+ columns: [
+ { label: "濮撳悕", prop: "patname" },
+ { label: "鍑虹敓鏃ユ湡", prop: "birthday", type: "date" },
+ { label: "韬唤璇佸彿", prop: "idcardno" },
+ { label: "鑱旂郴鐢佃瘽", prop: "telcode" },
+ { label: "璇婃柇鏃ユ湡", prop: "diagnosisDate", type: "date" },
+ { label: "寤烘。鏃ユ湡", prop: "createTime", type: "date" },
+ { label: "璇婃柇", prop: "diagname" },
+ { label: "濡婂鎯呭喌", prop: "pregnancyStatus" },
+ { label: "涓绘不鍖荤敓", prop: "attendingDoctor" },
+ { label: "缁忕鍖荤敓", prop: "managingDoctor" },
+ { label: "缁撴鐘舵��", prop: "closeStatus", type: "closeStatus" },
+ { label: "鐧昏浜哄憳", prop: "registrant" },
+ ],
+ },
+ {
+ key: "menopause",
+ category: "maternal",
+ entryLabel: "鍥寸粷缁忔湡MHI",
+ label: "鍥寸粷缁忔湡MHI",
+ subTypeLabel: "鍥寸粷缁忔湡MHI",
+ route: "/filing/menopause",
+ detailRoute: "/filing/maternalDetail",
+ columns: [
+ { label: "濮撳悕", prop: "patname" },
+ { label: "鍑虹敓鏃ユ湡", prop: "birthday", type: "date" },
+ { label: "韬唤璇佸彿", prop: "idcardno" },
+ { label: "鑱旂郴鐢佃瘽", prop: "telcode" },
+ { label: "璇婃柇鏃ユ湡", prop: "diagnosisDate", type: "date" },
+ { label: "寤烘。鏃ユ湡", prop: "createTime", type: "date" },
+ { label: "璇婃柇", prop: "diagname" },
+ { label: "闅忚鍛ㄦ湡锛堟鏁帮級", prop: "followupCycles" },
+ { label: "涓绘不鍖荤敓", prop: "attendingDoctor" },
+ { label: "缁忕鍖荤敓", prop: "managingDoctor" },
+ { label: "缁撴鐘舵��", prop: "closeStatus", type: "closeStatus" },
+ { label: "鐧昏浜哄憳", prop: "registrant" },
+ ],
+ },
+ {
+ key: "highRisk",
+ category: "child",
+ entryLabel: "楂樺嵄鍎夸笓妗�",
+ label: "楂樺嵄鍎夸笓妗�",
+ subTypeLabel: "楂樺嵄鍎夸笓妗堢鐞�",
+ route: "/filing/highRisk",
+ detailRoute: "/filing/childDetail",
+ columns: [
+ { label: "鍎跨濮撳悕", prop: "patname" },
+ { label: "瀹堕暱濮撳悕", prop: "parentInfo.parentName" },
+ { label: "鎷熼殢璁挎棩鏈�", prop: "followupDate", type: "date" },
+ { label: "鑱旂郴鐢佃瘽", prop: "telcode" },
+ { label: "璇婃柇鏃ユ湡", prop: "diagnosisDate", type: "date" },
+ { label: "寤烘。鏃ユ湡", prop: "createTime", type: "date" },
+ { label: "鍑虹敓瀛曞懆", prop: "gestationalWeek" },
+ { label: "鎬у埆", prop: "sex", type: "sex" },
+ { label: "鍑虹敓鏃ユ湡", prop: "birthday", type: "date" },
+ { label: "鍑虹敓浣撻噸", prop: "birthWeight" },
+ { label: "楂樺嵄鍎垮垎绫�", prop: "highRiskCategory" },
+ { label: "楂樺嵄鍎垮悕绉�", prop: "highRiskName" },
+ { label: "鐧昏浜哄憳", prop: "registrant" },
+ ],
+ },
+ {
+ key: "nutrition",
+ category: "child",
+ entryLabel: "钀ュ吇鎬х柧鐥�",
+ label: "钀ュ吇鎬х柧鐥�",
+ subTypeLabel: "钀ュ吇鎬х柧鐥呬笓妗堢鐞�",
+ route: "/filing/nutrition",
+ detailRoute: "/filing/childDetail",
+ columns: [
+ { label: "鍎跨濮撳悕", prop: "patname" },
+ { label: "瀹堕暱濮撳悕", prop: "parentInfo.parentName" },
+ { label: "鍑虹敓鏃ユ湡", prop: "birthday", type: "date" },
+ { label: "鑱旂郴鐢佃瘽", prop: "telcode" },
+ { label: "璇婃柇鏃ユ湡", prop: "diagnosisDate", type: "date" },
+ { label: "寤烘。鏃ユ湡", prop: "createTime", type: "date" },
+ { label: "鍑虹敓瀛曞懆", prop: "gestationalWeek" },
+ { label: "鎬у埆", prop: "sex", type: "sex" },
+ { label: "鍑虹敓浣撻噸", prop: "birthWeight" },
+ { label: "钀ュ吇鎬х柧鐥呭悕绉�", prop: "nutritionName" },
+ { label: "鐧昏浜哄憳", prop: "registrant" },
+ ],
+ },
+ {
+ key: "learning",
+ category: "child",
+ entryLabel: "瀛︿範鍥伴毦",
+ label: "瀛︿範鍥伴毦",
+ subTypeLabel: "瀛︿範鍥伴毦涓撴绠$悊",
+ route: "/filing/learning",
+ detailRoute: "/filing/childDetail",
+ columns: [
+ { label: "鍎跨濮撳悕", prop: "patname" },
+ { label: "瀹堕暱濮撳悕", prop: "parentInfo.parentName" },
+ { label: "鍑虹敓鏃ユ湡", prop: "birthday", type: "date" },
+ { label: "鑱旂郴鐢佃瘽", prop: "telcode" },
+ { label: "璇婃柇鏃ユ湡", prop: "diagnosisDate", type: "date" },
+ { label: "寤烘。鏃ユ湡", prop: "createTime", type: "date" },
+ { label: "鎬у埆", prop: "sex", type: "sex" },
+ { label: "棰勭害鎯呭喌", prop: "appointmentStatus" },
+ ],
+ },
+];
+
+export function getTypeByKey(key) {
+ return ARCHIVE_TYPES.find((t) => t.key === key);
+}
+
+// 璇诲彇 localStorage 妗f鍒楄〃
+export function loadArchives() {
+ try {
+ return JSON.parse(localStorage.getItem("patientArchives") || "[]");
+ } catch (e) {
+ return [];
+ }
+}
+
+export function saveArchives(list) {
+ localStorage.setItem("patientArchives", JSON.stringify(list));
+}
+
+// 鐢变竴鏉℃偅鑰呰褰曪紙闂ㄨ瘖/浣忛櫌/鐙珛褰曞叆锛夌敓鎴愭煇涓撴鐨勬。妗堣崏绋�
+export function buildArchiveRecord(patient, typeKey, sourcePage) {
+ const type = getTypeByKey(typeKey);
+ const now = new Date().toISOString().replace("T", " ").substring(0, 19);
+ const patid = patient.patid || patient.id || "sa_" + Date.now();
+ return {
+ id: "arc_" + Date.now() + "_" + Math.random().toString(36).substr(2, 6),
+ patientId: patid,
+ patid: patid,
+ patname: patient.patname || patient.name || "",
+ sex: patient.sex,
+ age: patient.age,
+ telcode: patient.telcode || patient.phone || "",
+ deptname: patient.deptname || "",
+ diagname: patient.diagname || "",
+ outhospno: patient.outhospno || "",
+ inhospno: patient.inhospno || "",
+ bedNo: patient.bedNo || "",
+ drname: patient.drname || "",
+ nurseName: patient.nurseName || "",
+ starttime: patient.starttime || patient.admitdate || "",
+ mainCategory: type.category,
+ mainCategoryLabel: type.category === "child" ? "鍎夸繚绉戝缓妗�" : "濡囦繚绉戝缓妗�",
+ subType: type.key,
+ subTypeLabel: type.subTypeLabel,
+ archiveForm: { doctorName: "" },
+ parentInfo: {},
+ sourcePage: sourcePage || "outpatient",
+ status: "active",
+ closeStatus: 0,
+ // 鍒楄〃椤垫柊澧炲瓧娈�
+ idcardno: patient.idcardno || "",
+ birthday: patient.birthday || patient.goday || "",
+ birthWeight: "",
+ gestationalWeek: "",
+ diagnosisDate: patient.diagnosisDate || patient.admitdate || "",
+ attendingDoctor: patient.drname || "",
+ managingDoctor: "",
+ registrant: localStorage.getItem("YongHuXM") || "",
+ pregnancyStatus: "",
+ followupCycles: "",
+ highRiskCategory: "",
+ highRiskName: "",
+ nutritionName: "",
+ appointmentStatus: "",
+ followupDate: "",
+ createTime: now,
+ updateTime: now,
+ };
+}
diff --git a/src/views/patient/patient/behospitalized.vue b/src/views/patient/patient/behospitalized.vue
index 81b612d..e35a72e 100644
--- a/src/views/patient/patient/behospitalized.vue
+++ b/src/views/patient/patient/behospitalized.vue
@@ -111,7 +111,7 @@
娣诲姞寤剁画鎶ょ悊浠诲姟
</el-button>
</el-col>
- <el-col :span="1.5">
+ <!-- <el-col :span="1.5">
<el-button
type="success"
plain
@@ -122,7 +122,7 @@
>
鎮h�呭缓妗�</el-button
>
- </el-col>
+ </el-col> -->
<el-col :span="1.5">
<el-button
type="danger"
diff --git a/src/views/patient/patient/profile/index.vue b/src/views/patient/patient/profile/index.vue
index 454c3fc..20af72e 100644
--- a/src/views/patient/patient/profile/index.vue
+++ b/src/views/patient/patient/profile/index.vue
@@ -1,35 +1,23 @@
<template>
<div class="app-container">
- <!-- 澶撮儴鐩掑瓙 -->
- <div class="personages">
- <el-row :gutter="20">
- <el-col :span="18">
- <div class="headportrait">
- <div class="text-center">
- <img
- v-imgError="require('@/assets/images/shoushuzhudaoyisheng.png')"
- src=""
- />
- </div>
- <div style="margin-left: 10px">{{ userform.name }}</div>
- <div style="margin-left: 10px" class="text-title">
- {{ userform.sex == 1 ? "鐢�" : "濂�" }}
- </div>
- <div style="margin-left: 10px" class="text-title">
- {{ userform.age }}宀�
- </div>
- <div style="margin-left: 10px" class="text-title">
- {{ userform.birthdate }}
- </div>
- <div style="margin-left: 10px" class="text-title">
- {{ userform.nation }}
- </div>
- <div style="margin-left: 10px" class="text-title">
- {{ userform.birthplace }}
- </div>
- </div></el-col
- >
- </el-row>
+ <!-- 鎮h�呬俊鎭ご閮� -->
+ <div class="profile-header">
+ <div class="profile-header__avatar">
+ <img
+ v-imgError="require('@/assets/images/shoushuzhudaoyisheng.png')"
+ src=""
+ />
+ </div>
+ <div class="profile-header__info">
+ <div class="profile-header__name">{{ userform.name }}</div>
+ <div class="profile-header__chips">
+ <span class="chip">{{ userform.sex == 1 ? "鐢�" : "濂�" }}</span>
+ <span class="chip">{{ userform.age }}宀�</span>
+ <span class="chip">{{ userform.birthdate }}</span>
+ <span class="chip">{{ userform.nation }}</span>
+ <span class="chip">{{ userform.birthplace }}</span>
+ </div>
+ </div>
</div>
<el-tabs type="border-card" v-model="activeName" @tab-click="handleClick">
@@ -101,67 +89,45 @@
<!-- 鍋ュ悍妗f妯″潡 -->
<div class="information-content" v-if="activeName == 'health'">
- <div class="top-message">
- <div class="headlines">
- <div>鍩虹淇℃伅</div>
- <el-button type="primary" @click="savefile">淇濆瓨鎮h�呮。妗�</el-button>
+ <div class="section-card">
+ <div class="section-card__header">
+ <span class="section-title">鍩虹淇℃伅</span>
+ <el-button type="primary" size="small" @click="savefile">淇濆瓨鎮h�呮。妗�</el-button>
</div>
- <div class="detailed">
+ <div class="section-card__body">
<el-form
ref="userform"
:model="userform"
:rules="rules"
- label-width="150px"
+ label-width="110px"
+ class="profile-form"
>
- <el-row :gutter="20">
+ <el-row :gutter="24">
<el-col :span="12">
<el-form-item label="鎮h�呭鍚�" prop="name">
- <el-input
- v-model="userform.name"
- placeholder="璇疯緭鍏ュ鍚�"
- maxlength="30"
- ></el-input> </el-form-item
- ></el-col>
- </el-row>
- <el-row >
- <el-col :span="12"
- ><el-form-item label="鑱旂郴鏂瑰紡" prop="telcode">
- <el-input
- v-model="userform.telcode"
- placeholder="璇疯緭鍏ヨ仈绯绘柟寮�"
- maxlength="30"
- /> </el-form-item
- ></el-col>
+ <el-input v-model="userform.name" placeholder="璇疯緭鍏ュ鍚�" maxlength="30"></el-input>
+ </el-form-item>
+ </el-col>
<el-col :span="12">
- <el-form-item label="浜插睘鑱旂郴鏂瑰紡" prop="name">
- <el-input
- v-model="userform.telcodewx"
- placeholder="璇疯緭鍏ュ鍚�"
- maxlength="30"
- ></el-input> </el-form-item
- ></el-col>
- </el-row>
- <el-row :gutter="20">
+ <el-form-item label="鑱旂郴鏂瑰紡" prop="telcode">
+ <el-input v-model="userform.telcode" placeholder="璇疯緭鍏ヨ仈绯绘柟寮�" maxlength="30"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="浜插睘鑱旂郴鏂瑰紡" prop="name">
+ <el-input v-model="userform.telcodewx" placeholder="璇疯緭鍏ュ鍚�" maxlength="30"></el-input>
+ </el-form-item>
+ </el-col>
<el-col :span="24">
<el-form-item label="鍑虹敓鍦�" prop="birthplace">
- <el-input
- v-model="userform.birthplace"
- placeholder="鍥姐�佺渷銆佸湴甯傘�佸尯鍘裤�佽閬撶瓑璇︾粏淇℃伅"
- maxlength="50"
- /> </el-form-item
- ></el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="24"
- ><el-form-item label="灞呬綇鍦�" prop="placeOfResidence">
- <el-input
- v-model="userform.placeOfResidence"
- placeholder="鍥姐�佺渷銆佸湴甯傘�佸尯鍘裤�佽閬撶瓑璇︾粏淇℃伅"
- maxlength="50"
- /> </el-form-item
- ></el-col>
- </el-row>
- <el-row :gutter="20">
+ <el-input v-model="userform.birthplace" placeholder="鍥姐�佺渷銆佸湴甯傘�佸尯鍘裤�佽閬撶瓑璇︾粏淇℃伅" maxlength="50"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="24">
+ <el-form-item label="灞呬綇鍦�" prop="placeOfResidence">
+ <el-input v-model="userform.placeOfResidence" placeholder="鍥姐�佺渷銆佸湴甯傘�佸尯鍘裤�佽閬撶瓑璇︾粏淇℃伅" maxlength="50"></el-input>
+ </el-form-item>
+ </el-col>
<el-col :span="24">
<el-form-item label="鏍囩" prop="desc">
<div class="xinz-inf">
@@ -193,7 +159,6 @@
>
</el-option>
</el-select>
-
<el-button
v-else
class="button-new-tag"
@@ -208,56 +173,36 @@
</el-form>
</div>
</div>
- <!-- <div class="top-message">
- <div class="headline">鐥呭彶</div>
- <div class="detailed">
- <el-form :model="form" label-width="100px">
- <el-row>
+ <div class="section-card">
+ <div class="section-card__header">
+ <span class="section-title">鐥呭彶</span>
+ </div>
+ <div class="section-card__body">
+ <el-form :model="form" label-width="110px" class="profile-form">
+ <el-row :gutter="24">
<el-col :span="8">
<el-form-item label="杩囧線鐤剧梾" prop="name">
- <el-input
- v-model="form.pastIllnesses"
- placeholder="璇疯緭鍏�"
- maxlength="30"
- />
+ <el-input v-model="form.pastIllnesses" placeholder="璇疯緭鍏�" maxlength="30" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="鑽墿杩囨晱" prop="sex">
- <el-input
- v-model="form.drugAllergy"
- placeholder="璇疯緭鍏ュ叿浣撹嵂鐗�/鏃�"
- maxlength="30"
- />
+ <el-input v-model="form.drugAllergy" placeholder="璇疯緭鍏ュ叿浣撹嵂鐗�/鏃�" maxlength="30" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="瀹舵棌鐥呭彶" prop="age">
- <el-input
- v-model="form.familyHistory"
- placeholder="璇疯緭鍏ュ叿浣撶柧鐥�/鏃�"
- maxlength="30"
- />
+ <el-input v-model="form.familyHistory" placeholder="璇疯緭鍏ュ叿浣撶柧鐥�/鏃�" maxlength="30" />
</el-form-item>
</el-col>
- </el-row>
- <el-row>
<el-col :span="8">
<el-form-item label="鎵嬫湳鍙�" prop="name">
- <el-input
- v-model="form.surgicalHistory"
- placeholder="璇疯緭鍏ユ墜鏈�/鏃�"
- maxlength="30"
- />
+ <el-input v-model="form.surgicalHistory" placeholder="璇疯緭鍏ユ墜鏈�/鏃�" maxlength="30" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="鐢熻偛鍙�" prop="age">
- <el-input
- v-model="form.reproductiveHistory"
- placeholder="璇疯緭鍏ヨ儙鏁�/鏃�"
- maxlength="30"
- />
+ <el-input v-model="form.reproductiveHistory" placeholder="璇疯緭鍏ヨ儙鏁�/鏃�" maxlength="30" />
</el-form-item>
</el-col>
<el-col :span="8">
@@ -268,8 +213,6 @@
</el-radio-group>
</el-form-item>
</el-col>
- </el-row>
- <el-row>
<el-col :span="8">
<el-form-item label="鍚哥儫鎯呭喌" prop="smoking">
<el-radio-group v-model="form.smoking">
@@ -294,8 +237,6 @@
</el-radio-group>
</el-form-item>
</el-col>
- </el-row>
- <el-row>
<el-col :span="12">
<el-form-item label="楗鎯呭喌" prop="diet">
<el-radio-group v-model="form.diet">
@@ -303,8 +244,9 @@
<el-radio label="2">姝e父楗</el-radio>
<el-radio label="3">椋熸涓嶆尟</el-radio>
</el-radio-group>
- </el-form-item> </el-col
- ><el-col :span="12">
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
<el-form-item label="蹇冪悊鎯呭喌" prop="psychology">
<el-radio-group v-model="form.psychology">
<el-radio label="1">蹇冩儏鎰夋偊</el-radio>
@@ -316,18 +258,20 @@
</el-row>
</el-form>
</div>
- </div> -->
- <!-- 鑱旂郴鐢佃瘽 -->
- <div class="bottom-message">
- <div class="headline">
- 浜插睘鍙风爜缁存姢<span style="margin-right: 60px"> </span>
- <el-button type="primary" @click="addcompiletb">+鏂板</el-button>
+ </div>
+ <!-- 浜插睘鍙风爜缁存姢 -->
+ <div class="section-card">
+ <div class="section-card__header">
+ <span class="section-title">浜插睘鍙风爜缁存姢</span>
+ <el-button type="primary" size="small" icon="el-icon-plus" @click="addcompiletb">鏂板</el-button>
</div>
- <div class="Table-screen">
+ <div class="section-card__body">
<el-table
:data="tableData"
style="width: 100%"
:row-class-name="tableRowClassName"
+ stripe
+ border
>
<el-table-column prop="id" label="搴忓彿" width="180">
</el-table-column>
@@ -355,7 +299,6 @@
size="small"
>缂栬緫</el-button
>
-
<el-button @click="deltb(scope.row)" type="danger" size="small"
>鍒犻櫎</el-button
>
@@ -369,7 +312,7 @@
<div class="medical-record" v-else-if="activeName == 'medical'">
<!-- 闂ㄨ瘖 -->
<div v-if="sonactiveName == 'outpatient'">
- <el-table :data="serviceData" style="width: 100%">
+ <el-table :data="serviceData" style="width: 100%" stripe border>
<el-table-column
label="灏辫瘖鏃堕棿"
align="center"
@@ -458,7 +401,7 @@
</div>
<!-- 浣忛櫌 -->
<div v-if="sonactiveName == 'inhospital'">
- <el-table :data="serviceDatary" style="width: 100%">
+ <el-table :data="serviceDatary" style="width: 100%" stripe border>
<el-table-column
label="浣忛櫌鍙�"
align="center"
@@ -535,7 +478,7 @@
</div>
<!-- 鍑洪櫌 -->
<div v-if="sonactiveName == 'checkout'">
- <el-table :data="serviceDatacy" style="width: 100%">
+ <el-table :data="serviceDatacy" style="width: 100%" stripe border>
<el-table-column
label="浣忛櫌鍙�"
align="center"
@@ -614,91 +557,7 @@
</div>
<!-- 鏈嶅姟璁板綍 -->
- <div
- class="medical-recordc"
- style="margin-top: 20px; font-size: 20px !important"
- v-else-if="activeName == 'serve'"
- >
- <div style="margin-bottom: 15px" v-for="item in record">
- <el-card class="box-card">
- <div
- style="
- font-size: 22px;
- padding-left: 5px;
- margin: 15px 0;
- border-left: 4px solid rgb(190, 65, 134);
- "
- >
- <span v-if="item.serviceType == 2">鍑洪櫌闅忚</span>
- <span v-if="item.serviceType == 1">蹇冪數闅忚</span>
- <span v-if="item.serviceType == 3">褰卞儚闅忚</span>
- <span v-if="item.serviceType == 4">瀹f暀鍏虫��</span>
- </div>
- <el-divider></el-divider>
- <div style="margin-top: 10px">
- 鏈嶅姟鍚嶇О锛�<span style="color: #2775b6">{{
- item.templatename
- }}</span>
- </div>
- <div style="margin-top: 10px">
- 鍒涘缓鏃堕棿锛�<span style="color: #2775b6">{{ item.createTime }}</span>
- </div>
- <div style="margin-top: 10px">
- 瀹屾垚鏃堕棿锛�<span style="color: #2775b6">{{ item.finishtime }}</span>
- </div>
- <div style="margin-top: 10px">
- <el-row :gutter="20">
- <el-col :span="12"
- >绉戝锛�
- <span style="color: #2775b6">{{ item.deptname }}</span></el-col
- >
- <el-col :span="12"
- >鐥呭尯锛�
- <span style="color: #2775b6">{{
- item.leavehospitaldistrictname
- }}</span></el-col
- >
- </el-row>
- </div>
-
- <div
- style="
- font-size: 20px;
- padding-left: 5px;
- margin: 15px 0;
- border-left: 4px solid rgb(65, 161, 190);
- "
- >
- 浜哄伐璁板綍
- </div>
- <div style="margin-top: 10px">
- <el-row :gutter="20">
- <el-col :span="6"
- >璐熻矗浜猴細
- <span style="color: #2775b6">{{ item.createBy }}</span></el-col
- >
- <el-col :span="6"
- >涓绘不鍖荤敓锛�
- <span style="color: #2775b6">{{ item.drname }}</span></el-col
- >
- <el-col :span="6"
- >璐d换鎶ゅ+
- <span style="color: #2775b6">{{ item.nurseName }}</span></el-col
- >
- </el-row>
- </div>
- <div style="margin-top: 10px">
- 缁撴灉鐘舵�侊細
- <span style="color: #2775b6" v-if="item.excep == 0">鏈嶅姟姝e父</span>
- <span style="color: #b55e54" v-if="item.excep == 1">寮傚父</span>
- </div>
- <!-- <div style="margin-top: 10px">
- 澶囨敞锛�
- <span style="color: #2775b6">鎻愰啋娉ㄦ剰楗鍋ュ悍</span>
- </div> -->
- </el-card>
- </div>
- </div>
+ <ServiceRecords v-else-if="activeName == 'serve'" :patid="id" />
<!-- 鍋ュ悍鐩戞祴 -->
<!-- <div class="medical-record" v-show="activeName == 'monitor'">
<div v-show="sontwoactiveName == 'blood'" style="display: flex">
@@ -846,13 +705,14 @@
Patientclinic,
} from "@/api/patient/homepage";
-import { getsearchrResults, getTaskservelist } from "@/api/AiCentre/index";
+import { getsearchrResults } from "@/api/AiCentre/index";
+import ServiceRecords from "@/views/patient/archives/components/ServiceRecords.vue";
import { listPatouthosp } from "@/api/smartor/patouthosp";
import { listpatient } from "@/api/patient/record";
export default {
name: "Profile",
- components: { userAvatar, userInfo, resetPwd, SFtable },
+ components: { userAvatar, userInfo, resetPwd, SFtable, ServiceRecords },
data() {
return {
userform: {},
@@ -1233,24 +1093,11 @@
handleClick(tab, event) {
if (tab.index == "1") {
this.getList(1);
- } else if (tab.index == "2") {
- this.handleClickfw();
}
},
handleClickson(tab, event) {
console.log(tab, "son");
this.getList(tab.index);
- },
- // 鏌ヨ鏈嶅姟璁板綍
- handleClickfw() {
-
- getTaskservelist({
- patid: this.id,
- }).then((res) => {
- if (res.code == 200) {
- this.record = res.rows[0].serviceSubtaskList;
- }
- });
},
// 鑱旂郴鏂瑰紡鏂板
Addanumber() {},
@@ -1780,134 +1627,354 @@
</script>
<style lang="scss" scoped>
-.personages {
- height: 88px;
- width: 100%;
- background-color: #5e86f9;
- border-radius: 5px;
- padding: 20px;
- margin-bottom: 10px;
- line-height: 48px;
- font-size: 25px;
- font-weight: 600;
- color: #ffffff;
- .headportrait {
- display: flex;
- .text-center {
- width: 55px;
- height: 55px;
- margin-right: 10px;
- img {
- width: 100%;
- height: 100%;
- border-radius: 50%;
- }
+$primary: #3f6ef0;
+
+// ===== 鎮h�呬俊鎭ご閮� =====
+.profile-header {
+ position: relative;
+ display: flex;
+ align-items: center;
+ padding: 26px 32px;
+ margin-bottom: 16px;
+ border-radius: 14px;
+ overflow: hidden;
+ color: #fff;
+ background: linear-gradient(120deg, #3f6ef0 0%, #5b8cff 55%, #78a9ff 100%);
+ box-shadow: 0 8px 24px rgba(63, 110, 240, 0.26);
+
+ &::before {
+ content: "";
+ position: absolute;
+ right: -70px;
+ top: -90px;
+ width: 280px;
+ height: 280px;
+ border-radius: 50%;
+ background: rgba(255, 255, 255, 0.09);
+ }
+ &::after {
+ content: "";
+ position: absolute;
+ right: 90px;
+ bottom: -130px;
+ width: 230px;
+ height: 230px;
+ border-radius: 50%;
+ background: rgba(255, 255, 255, 0.06);
+ }
+
+ &__avatar {
+ position: relative;
+ z-index: 1;
+ width: 76px;
+ height: 76px;
+ flex-shrink: 0;
+ border-radius: 50%;
+ padding: 3px;
+ background: rgba(255, 255, 255, 0.4);
+ box-shadow: 0 4px 14px rgba(0, 0, 0, 0.18);
+
+ img {
+ width: 100%;
+ height: 100%;
+ border-radius: 50%;
+ object-fit: cover;
+ background: #eef2fb;
}
- .text-title {
- font-size: 20px;
+ }
+
+ &__info {
+ position: relative;
+ z-index: 1;
+ margin-left: 22px;
+ min-width: 0;
+ }
+
+ &__name {
+ font-size: 24px;
+ font-weight: 700;
+ letter-spacing: 1px;
+ line-height: 1.3;
+ }
+
+ &__chips {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px;
+ margin-top: 12px;
+
+ .chip {
+ padding: 4px 14px;
+ font-size: 13px;
font-weight: 500;
- color: #ecfcfc;
+ border-radius: 999px;
+ background: rgba(255, 255, 255, 0.2);
+ border: 1px solid rgba(255, 255, 255, 0.3);
+ color: #f5f8ff;
+ line-height: 1.5;
}
}
}
-.xinz-inf {
- font-size: 18px;
- // white-space: nowrap;
+
+// ===== Tabs =====
+::v-deep .el-tabs--border-card {
+ border: none;
+ border-radius: 12px;
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);
overflow: hidden;
- text-overflow: ellipsis;
- line-height: 48px;
+ > .el-tabs__header {
+ margin: 0;
+ background: #fff;
+ border-bottom: 1px solid #eef0f4;
- .el-tag + .el-tag {
- margin-left: 10px;
+ .el-tabs__nav {
+ border: none;
+
+ .el-tabs__item {
+ height: 54px;
+ line-height: 54px;
+ font-size: 15px;
+ color: #606266;
+ border: none !important;
+
+ .mulsz {
+ font-size: 15px;
+ }
+
+ &.is-active {
+ color: $primary;
+ font-weight: 600;
+ background: #f3f7ff;
+ box-shadow: inset 0 -3px 0 $primary;
+ }
+ }
+ }
}
+
+ > .el-tabs__content {
+ padding: 0;
+ }
+}
+
+// ===== 鍋ュ悍妗f鍗$墖 =====
+.information-content {
+ margin-top: 16px;
+}
+
+.section-card {
+ margin-bottom: 16px;
+ background: #fff;
+ border-radius: 12px;
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);
+ overflow: hidden;
+
+ &__header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 16px 24px;
+ border-bottom: 1px solid #f0f2f5;
+
+ .section-title {
+ position: relative;
+ padding-left: 12px;
+ font-size: 16px;
+ font-weight: 600;
+ color: #303133;
+
+ &::before {
+ content: "";
+ position: absolute;
+ left: 0;
+ top: 50%;
+ transform: translateY(-50%);
+ width: 4px;
+ height: 16px;
+ border-radius: 2px;
+ background: $primary;
+ }
+ }
+ }
+
+ &__body {
+ padding: 20px 24px 4px;
+ }
+}
+
+// 琛ㄥ崟
+.profile-form {
+ .el-form-item {
+ margin-bottom: 18px;
+ }
+
+ ::v-deep .el-form-item__label {
+ color: #606266;
+ font-weight: 500;
+ }
+
+ ::v-deep .el-input__inner {
+ border-radius: 6px;
+ }
+}
+
+// 鏍囩
+.xinz-inf {
+ line-height: 40px;
+
+ .el-tag {
+ margin-bottom: 6px;
+ border-radius: 4px;
+
+ & + .el-tag {
+ margin-left: 8px;
+ }
+ }
+
.button-new-tag {
- margin-left: 10px;
+ margin-left: 8px;
height: 32px;
line-height: 30px;
padding-top: 0;
padding-bottom: 0;
}
+
.input-new-tag {
width: 90px;
- margin-left: 10px;
+ margin-left: 8px;
vertical-align: bottom;
}
}
-.el-tabs--border-card {
- // font-size: 25px;
- .mulsz {
- font-size: 25px;
- margin-top: 20px;
+
+// ===== 鍖荤枟妗f琛ㄦ牸 =====
+.medical-record {
+ margin-top: 16px;
+ padding: 24px;
+ background: #fff;
+ border-radius: 12px;
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);
+
+ ::v-deep .el-table {
+ th.el-table__cell {
+ background: #f5f7fb;
+ color: #303133;
+ font-weight: 600;
+ }
+
+ .el-table__row td {
+ padding: 10px 0;
+ }
+
+ .el-table__row--striped td {
+ background: #fafbfd;
+ }
+
+ .el-table__row:hover > td {
+ background: #f3f7ff !important;
+ }
}
}
-.information-content {
- margin-top: 20px;
- 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);
- .top-message {
- margin-top: 25px;
- margin-left: 100px;
- .detailed {
- width: 88%;
- border-radius: 8px;
- padding: 30px;
- margin-bottom: 30px;
- background-color: #ddf0f8;
- .bg-purple {
- margin-bottom: 20px;
- }
- .spanvalue {
- display: inline-block;
- min-width: 200px;
- border-bottom: 1px solid rgb(172, 172, 172);
- }
+
+// 鍗$墖鍐呰〃鏍硷紙浜插睘鍙风爜锛�
+.section-card__body {
+ ::v-deep .el-table {
+ th.el-table__cell {
+ background: #f5f7fb;
+ color: #303133;
+ font-weight: 600;
+ }
+ }
+}
+
+// ===== 鏈嶅姟璁板綍 =====
+.service-record {
+ margin-top: 16px;
+
+ .service-item {
+ margin-bottom: 16px;
+ }
+
+ .service-card {
+ border-radius: 12px;
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);
+
+ ::v-deep .el-card__body {
+ padding: 20px 24px;
}
}
- .headline {
- font-size: 25px;
- padding-left: 5px;
- margin-bottom: 10px;
- border-left: 8px solid rgb(65, 161, 190);
- }
- .headlines {
- font-size: 25px;
+ .service-card__header {
display: flex;
- width: 88%;
+ align-items: center;
justify-content: space-between;
- padding-left: 5px;
- margin-bottom: 10px;
- border-left: 8px solid rgb(65, 161, 190);
+ padding-bottom: 14px;
+ border-bottom: 1px dashed #eef0f4;
}
- .bottom-message {
- margin-bottom: 25px;
- margin-left: 100px;
- .Table-screen {
- width: 88%;
- padding: 30px;
- margin-bottom: 30px;
- border-radius: 8px;
- background-color: #ddf0f8;
- font-size: 20px !important;
+
+ .service-card__title {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ }
+
+ .service-badge {
+ display: inline-block;
+ padding: 4px 12px;
+ font-size: 13px;
+ font-weight: 600;
+ color: $primary;
+ background: #eef4ff;
+ border-radius: 6px;
+ }
+
+ .service-name {
+ font-size: 16px;
+ font-weight: 600;
+ color: #303133;
+ }
+
+ .service-status {
+ padding: 4px 12px;
+ font-size: 13px;
+ border-radius: 999px;
+
+ &.is-ok {
+ color: #12a182;
+ background: #e8f7f1;
+ }
+
+ &.is-bad {
+ color: #e0564c;
+ background: #fdeeee;
+ }
+ }
+
+ .service-grid {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 18px 24px;
+ padding-top: 16px;
+ }
+
+ .service-cell {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+
+ .s-label {
+ font-size: 12px;
+ color: #909399;
+ }
+
+ .s-value {
+ font-size: 14px;
+ color: #303133;
}
}
}
-.medical-record {
- 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);
-}
-.sontwoactiveName {
- margin: 0 auto;
-}
-::v-deep.el-table .warning-row {
- background: oldlace;
+
+// 榛樿鑱旂郴鏂瑰紡楂樹寒琛�
+::v-deep .el-table .warning-row {
+ background: #fff7e6;
}
</style>
diff --git a/src/views/repositoryai/intention/index.vue b/src/views/repositoryai/intention/index.vue
index 2647196..45d22c9 100644
--- a/src/views/repositoryai/intention/index.vue
+++ b/src/views/repositoryai/intention/index.vue
@@ -152,7 +152,6 @@
icon="el-icon-plus"
size="medium"
@click="handleAdd"
-
>鏂板</el-button
>
</el-col>
@@ -165,7 +164,6 @@
size="medium"
:disabled="multiple"
@click="handleDelete"
-
>鍒犻櫎</el-button
>
</el-col>
@@ -218,7 +216,6 @@
</template>
</el-table-column>
-
<!-- <el-table-column
label="姝e父鍊艰寖鍥�"
align="center"
@@ -230,7 +227,7 @@
<span>{{ scope.row.warnup }}~{{ scope.row.warndown }}</span>
</template>
</el-table-column> -->
- <el-table-column
+ <el-table-column
label="閫傜敤鍦烘櫙"
align="center"
key="suitWayList"
@@ -253,7 +250,6 @@
size="medium"
type="text"
@click="illnessUpdate(scope.row)"
-
><span class="button-textxg"
><i class="el-icon-date"></i>璇︽儏</span
></el-button
@@ -290,7 +286,6 @@
size="medium"
type="text"
@click="handleUpdate(scope.row)"
-
><span class="button-textxg"
><i class="el-icon-edit"></i>淇敼</span
></el-button
@@ -308,7 +303,6 @@
size="medium"
type="text"
@click="handleDelete(scope.row)"
-
><span class="button-textsc"
><i class="el-icon-delete"></i>鍒犻櫎</span
></el-button
@@ -351,14 +345,14 @@
<el-input
v-model="indexform.targetname"
placeholder="璇疯緭鍏ユ寚鏍囧悕绉�"
- maxlength="40"
+ maxlength="100"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="鎸囨爣鍒嗙被" prop="assortid">
<el-select
- style="width: 300px;"
+ style="width: 300px"
v-model="indexform.assortid"
size="medium"
filterable
@@ -379,18 +373,19 @@
</el-option-group>
</el-select>
</el-form-item>
-
</el-col>
</el-row>
<el-row v-if="!measurement">
<el-col :span="24">
<el-form-item label="鎸囨爣鎻忚堪" prop="targetdesc">
<el-input
+ type="textarea"
+ :rows="2"
v-model="indexform.targetdesc"
placeholder="璇疯緭鍏ユ寚鏍囨弿杩�"
id="targetdesc"
@focus="currentInputId = 'targetdesc'"
- maxlength="40"
+ maxlength="400"
/>
</el-form-item> </el-col
></el-row>
@@ -1293,7 +1288,7 @@
targetregex: "",
targetregex2: "",
isoperation: 1,
- isabnormal:0,
+ isabnormal: 0,
picturePath: "",
dynamiccruxs: [],
nodynamiccruxs: [],
diff --git a/src/views/sfstatistics/percentage/components/ChartDialog.vue b/src/views/sfstatistics/percentage/components/ChartDialog.vue
index f8deb36..bf27f7d 100644
--- a/src/views/sfstatistics/percentage/components/ChartDialog.vue
+++ b/src/views/sfstatistics/percentage/components/ChartDialog.vue
@@ -210,6 +210,28 @@
{ value: careData.inProgress, name: "鎶ょ悊杩涜涓�" },
{ value: careData.notStarted, name: "鎶ょ悊鏈紑濮�" },
];
+ } else if (this.activeTab === "combined") {
+ legendData = ["寰呴殢璁�", "闅忚鎴愬姛", "闅忚澶辫触"];
+ const followUpData = {
+ pending: 0,
+ success: 0,
+ fail: 0,
+ };
+
+ this.data.forEach((item) => {
+ followUpData.pending +=
+ (item.pendingFollowUp || 0) + (item.pendingFollowUpAgain || 0);
+ followUpData.success +=
+ (item.followUpSuccess || 0) + (item.followUpSuccessAgain || 0);
+ followUpData.fail +=
+ (item.followUpFail || 0) + (item.followUpFailAgain || 0);
+ });
+
+ seriesData = [
+ { value: followUpData.pending, name: "寰呴殢璁�" },
+ { value: followUpData.success, name: "闅忚鎴愬姛" },
+ { value: followUpData.fail, name: "闅忚澶辫触" },
+ ];
}
return { legendData, seriesData };
@@ -536,6 +558,77 @@
},
},
];
+ } else if (this.activeTab === "combined") {
+ title = "缁煎悎闅忚";
+ yAxisName1 = "浜烘";
+ legendData = ["鍑洪櫌浜烘", "棣栨瀹屾垚", "鍐嶆瀹屾垚", "闅忚鐜�(%)", "鎺ㄩ�佺巼(%)"];
+ colors = ["#5470C6", "#91CC75", "#FAC858", "#EE6666", "#9A60B4"];
+
+ const dischargeData = this.data.map((item) => item.dischargeCount || 0);
+ const firstSuccessData = this.data.map(
+ (item) => item.followUpSuccess || 0
+ );
+ const againSuccessData = this.data.map(
+ (item) => item.followUpSuccessAgain || 0
+ );
+ const followUpRateData = this.data.map((item) => {
+ const success = Number(item.followUpSuccess) || 0;
+ const nonFollowUp = Number(item.nonFollowUp) || 0;
+ const followUpNeeded = Number(item.followUpNeeded) || 0;
+ const denominator = followUpNeeded + nonFollowUp;
+ return denominator > 0
+ ? Number((((success + nonFollowUp) / denominator) * 100).toFixed(2))
+ : 0;
+ });
+ const pushRateData = this.data.map((item) => {
+ const successAgain = Number(item.followUpSuccessAgain) || 0;
+ const nonFollowUp = Number(item.nonFollowUp) || 0;
+ const followUpNeeded = Number(item.followUpNeeded) || 0;
+ const denominator = followUpNeeded + nonFollowUp;
+ return denominator > 0
+ ? Number(((successAgain / denominator) * 100).toFixed(2))
+ : 0;
+ });
+
+ series = [
+ {
+ name: "鍑洪櫌浜烘",
+ type: "bar",
+ barWidth: "25%",
+ data: dischargeData,
+ itemStyle: { borderRadius: [4, 4, 0, 0] },
+ },
+ {
+ name: "棣栨瀹屾垚",
+ type: "bar",
+ barWidth: "25%",
+ data: firstSuccessData,
+ itemStyle: { borderRadius: [4, 4, 0, 0] },
+ },
+ {
+ name: "鍐嶆瀹屾垚",
+ type: "bar",
+ barWidth: "25%",
+ data: againSuccessData,
+ itemStyle: { borderRadius: [4, 4, 0, 0] },
+ },
+ {
+ name: "闅忚鐜�(%)",
+ type: "line",
+ yAxisIndex: 1,
+ data: followUpRateData,
+ symbolSize: 8,
+ lineStyle: { width: 3 },
+ },
+ {
+ name: "鎺ㄩ�佺巼(%)",
+ type: "line",
+ yAxisIndex: 1,
+ data: pushRateData,
+ symbolSize: 8,
+ lineStyle: { width: 3, type: "dotted" },
+ },
+ ];
}
return {
diff --git a/src/views/sfstatistics/percentage/components/CombinedFollowUp.vue b/src/views/sfstatistics/percentage/components/CombinedFollowUp.vue
index fc3823c..540e2d0 100644
--- a/src/views/sfstatistics/percentage/components/CombinedFollowUp.vue
+++ b/src/views/sfstatistics/percentage/components/CombinedFollowUp.vue
@@ -582,6 +582,18 @@
},
// ===================== 瀵煎嚭 =====================
+ getServiceTypeLabel() {
+ const val = this.queryParams.serviceType;
+ if (val == null) return "";
+ const values = Array.isArray(val) ? val : [val];
+ const list =
+ this.options && this.options.length ? this.options : this.tasktypes;
+ const labels = values
+ .map((v) => (list.find((o) => o.value === v) || {}).label)
+ .filter(Boolean);
+ return labels.join("/");
+ },
+
async exportTable() {
try {
let dateRangeString = "";
@@ -603,7 +615,9 @@
dateRangeString = isLishuiHospital ? `${now.getFullYear()}骞�${now.getMonth() + 1}鏈坄 : `${now.getMonth() + 1}鏈坄;
}
- const excelName = `缁煎悎闅忚缁熻琛╛${dateRangeString}.xlsx`;
+ const serviceTypeLabel = this.getServiceTypeLabel();
+ const serviceTypeSuffix = serviceTypeLabel ? `_${serviceTypeLabel}` : "";
+ const excelName = `缁煎悎闅忚缁熻琛�${serviceTypeSuffix}_${dateRangeString}.xlsx`;
if (!this.tableData || this.tableData.length === 0) {
this.$message.warning("鏆傛棤鏁版嵁鍙鍑�");
return false;
@@ -611,7 +625,7 @@
const workbook = new ExcelJS.Workbook();
const worksheet = workbook.addWorksheet("缁煎悎缁熻");
- this.buildExportSheet(worksheet, dateRangeString);
+ this.buildExportSheet(worksheet, dateRangeString, serviceTypeSuffix);
const buffer = await workbook.xlsx.writeBuffer();
const blob = new Blob([buffer], {
type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
@@ -626,7 +640,7 @@
}
},
- buildExportSheet(worksheet, dateRangeString) {
+ buildExportSheet(worksheet, dateRangeString, serviceTypeSuffix = "") {
// 瀹氫箟鏍峰紡
const titleStyle = {
font: { name: "寰蒋闆呴粦", size: 16, bold: true },
@@ -653,7 +667,7 @@
// 鏍囬琛�
worksheet.mergeCells(1, 1, 1, 20);
- worksheet.getCell(1, 1).value = `缁煎悎闅忚缁熻琛╛${dateRangeString}`;
+ worksheet.getCell(1, 1).value = `缁煎悎闅忚缁熻琛�${serviceTypeSuffix}_${dateRangeString}`;
worksheet.getCell(1, 1).style = titleStyle;
worksheet.getRow(1).height = 35;
diff --git a/src/views/sfstatistics/percentage/components/FirstFollowUp.vue b/src/views/sfstatistics/percentage/components/FirstFollowUp.vue
index 67d329f..e2167f6 100644
--- a/src/views/sfstatistics/percentage/components/FirstFollowUp.vue
+++ b/src/views/sfstatistics/percentage/components/FirstFollowUp.vue
@@ -590,6 +590,223 @@
</template>
</el-table-column>
<el-table-column
+ v-if="isTargetHospital"
+ label="浜哄伐"
+ align="center"
+ >
+ <el-table-column
+ label="鍙戦�佸畬鎴�"
+ align="center"
+ key="manualSuccess"
+ prop="manualSuccess"
+ :render-header="Tooltipfswc"
+ >
+ <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
+ 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>
+ </el-table-column>
+ <el-table-column
+ v-if="isTargetHospital"
+ label="璇煶"
+ align="center"
+ >
+ <el-table-column
+ label="鍙戦�佸畬鎴�"
+ align="center"
+ key="voiceSuccess"
+ prop="voiceSuccess"
+ :render-header="Tooltipfswc"
+ >
+ <template slot-scope="scope">
+ <el-button
+ size="medium"
+ type="text"
+ @click="
+ handleViewDetails(
+ scope.row,
+ 'voiceSuccessInfo',
+ '鍙戦�佸畬鎴愯闊抽殢璁垮垪琛�'
+ )
+ "
+ >
+ <span class="button-zx">{{ scope.row.voiceSuccess }}</span>
+ </el-button>
+ </template>
+ </el-table-column>
+ <el-table-column
+ label="鏈�缁堝畬鎴�"
+ align="center"
+ key="voiceAgainSuccess"
+ prop="voiceAgainSuccess"
+ :render-header="Tooltipzzwc"
+ >
+ <template slot-scope="scope">
+ <el-button
+ size="medium"
+ type="text"
+ @click="
+ handleViewDetails(
+ scope.row,
+ 'voiceAgainSuccessInfo',
+ '鏈�缁堝畬鎴愯闊抽殢璁垮垪琛�'
+ )
+ "
+ >
+ <span class="button-zx">{{
+ scope.row.voiceAgainSuccess
+ }}</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="smsSuccess"
+ prop="smsSuccess"
+ :render-header="Tooltipfswc"
+ >
+ <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
+ label="鏈�缁堝畬鎴�"
+ align="center"
+ key="smsAgainSuccess"
+ prop="smsAgainSuccess"
+ :render-header="Tooltipzzwc"
+ >
+ <template slot-scope="scope">
+ <el-button
+ size="medium"
+ type="text"
+ @click="
+ handleViewDetails(
+ scope.row,
+ 'smsAgainSuccessInfo',
+ '鏈�缁堝畬鎴愮煭淇¢殢璁垮垪琛�'
+ )
+ "
+ >
+ <span class="button-zx">{{
+ scope.row.smsAgainSuccess
+ }}</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="weChatSuccess"
+ prop="weChatSuccess"
+ :render-header="Tooltipfswc"
+ >
+ <template slot-scope="scope">
+ <el-button
+ size="medium"
+ type="text"
+ @click="
+ handleViewDetails(
+ scope.row,
+ 'wechatSuccessInfo',
+ '鍙戦�佸畬鎴愬井淇¢殢璁垮垪琛�'
+ )
+ "
+ >
+ <span class="button-zx">{{ scope.row.weChatSuccess }}</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"
key="manual"
@@ -607,7 +824,13 @@
</el-button>
</template>
</el-table-column>
- <el-table-column label="璇煶" align="center" key="voice" prop="voice">
+ <el-table-column
+ v-if="!isTargetHospital"
+ label="璇煶"
+ align="center"
+ key="voice"
+ prop="voice"
+ >
<template slot-scope="scope">
<el-button
size="medium"
@@ -620,7 +843,13 @@
</el-button>
</template>
</el-table-column>
- <el-table-column label="鐭俊" align="center" key="sms" prop="sms">
+ <el-table-column
+ v-if="!isTargetHospital"
+ label="鐭俊"
+ align="center"
+ key="sms"
+ prop="sms"
+ >
<template slot-scope="scope">
<el-button
size="medium"
@@ -632,6 +861,7 @@
</template>
</el-table-column>
<el-table-column
+ v-if="!isTargetHospital"
label="寰俊"
align="center"
key="weChat"
@@ -748,6 +978,14 @@
patientqueryParams: { pn: 1, ps: 10 },
tasktypes: store.getters.tasktypes,
};
+ },
+ computed: {
+ isTargetHospital() {
+ return (
+ this.orgname == "绗竴浜烘皯鍖婚櫌婀栨花闄㈠尯" ||
+ this.orgname == "绗竴浜烘皯鍖婚櫌鍚村北闄㈠尯"
+ );
+ },
},
methods: {
loadData() {
@@ -982,6 +1220,32 @@
[h("span", column.label)]
);
},
+ Tooltipfswc(h, { column }) {
+ return h(
+ "el-tooltip",
+ {
+ props: {
+ content: "棣栨鍙戦�佹偅鑰呭嵆濉姤鎴愬姛鐨勬暟閲�",
+ placement: "top",
+ effect: "dark",
+ },
+ },
+ [h("span", column.label)]
+ );
+ },
+ Tooltipzzwc(h, { column }) {
+ return h(
+ "el-tooltip",
+ {
+ props: {
+ content: "棣栨鏈畬鎴愪簩娆℃垨涓夋琛ュ伩鎺ㄩ�佹湰鏂瑰紡鐨勫畬鎴愭鏁�",
+ placement: "top",
+ effect: "dark",
+ },
+ },
+ [h("span", column.label)]
+ );
+ },
getInnerSummaries(param) {
const { columns, data } = param;
const sums = [];
@@ -1207,19 +1471,21 @@
}
}
- // 鏍规嵁 serviceType 鐢熸垚闅忚绫诲瀷鍚嶇О
+ // 鏍规嵁 serviceType 鐢熸垚闅忚绫诲瀷鍚嶇О锛堝吋瀹瑰崟閫�/澶氶�夛級
+ const serviceTypes = Array.isArray(this.queryParams.serviceType)
+ ? this.queryParams.serviceType
+ : this.queryParams.serviceType
+ ? [this.queryParams.serviceType]
+ : [];
+
let serviceTypeName = "棣栨鍑洪櫌闅忚"; // 鏂囦欢鍚嶄娇鐢ㄧ殑鍚嶇О
let sheetTypeName = "棣栨闅忚"; // 宸ヤ綔琛ㄤ娇鐢ㄧ殑鍚嶇О锛堢畝鍖栫増锛�
- if (
- this.queryParams.serviceType &&
- Array.isArray(this.queryParams.serviceType) &&
- this.queryParams.serviceType.length > 0
- ) {
+ if (serviceTypes.length > 0) {
// 浣跨敤 props 涓殑 options锛堝嵆 tasktypes锛�
if (this.options && Array.isArray(this.options)) {
const matchedTypes = this.options.filter((task) =>
- this.queryParams.serviceType.includes(task.value)
+ serviceTypes.includes(task.value)
);
console.log(matchedTypes, "matchedTypes");
@@ -1232,14 +1498,14 @@
serviceTypeName = `棣栨${typeNames.join("/")}`;
// 宸ヤ綔琛ㄥ悕绠�鍖栵紙鍙栫涓�涓�+鈥滅瓑鈥濓級
sheetTypeName = `棣栨${typeNames[0]}绛塦;
- } else if (this.queryParams.serviceType.length > 0) {
+ } else {
// 鏃犲尮閰嶆椂浣跨敤鍘熷鍊�
- const typeStr = this.queryParams.serviceType.join("/");
+ const typeStr = serviceTypes.join("/");
serviceTypeName = `棣栨${typeStr}`;
sheetTypeName = "棣栨闅忚";
}
- } else if (this.queryParams.serviceType.length > 0) {
- const typeStr = this.queryParams.serviceType.join("/");
+ } else {
+ const typeStr = serviceTypes.join("/");
serviceTypeName = `棣栨${typeStr}`;
sheetTypeName = "棣栨闅忚";
}
@@ -1800,7 +2066,9 @@
console.log(1);
this.patientqueryParams.serviceTypes = queryParams.serviceType
- ? queryParams.serviceType.join(",")
+ ? Array.isArray(queryParams.serviceType)
+ ? queryParams.serviceType.join(",")
+ : String(queryParams.serviceType)
: null;
return selectTimelyRate(this.patientqueryParams);
diff --git a/src/views/sfstatistics/percentage/components/SecondFollowUp.vue b/src/views/sfstatistics/percentage/components/SecondFollowUp.vue
index 88fe70e..d3abd40 100644
--- a/src/views/sfstatistics/percentage/components/SecondFollowUp.vue
+++ b/src/views/sfstatistics/percentage/components/SecondFollowUp.vue
@@ -554,6 +554,223 @@
:render-header="Tooltipsfl"
/>
<el-table-column
+ v-if="isTargetHospital"
+ label="浜哄伐"
+ align="center"
+ >
+ <el-table-column
+ label="鍙戦�佸畬鎴�"
+ align="center"
+ key="manualSuccess"
+ prop="manualSuccess"
+ :render-header="Tooltipfswc"
+ >
+ <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
+ 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>
+ </el-table-column>
+ <el-table-column
+ v-if="isTargetHospital"
+ label="璇煶"
+ align="center"
+ >
+ <el-table-column
+ label="鍙戦�佸畬鎴�"
+ align="center"
+ key="voiceSuccess"
+ prop="voiceSuccess"
+ :render-header="Tooltipfswc"
+ >
+ <template slot-scope="scope">
+ <el-button
+ size="medium"
+ type="text"
+ @click="
+ handleViewDetails(
+ scope.row,
+ 'voiceSuccessInfo',
+ '鍙戦�佸畬鎴愯闊抽殢璁垮垪琛�'
+ )
+ "
+ >
+ <span class="button-zx">{{ scope.row.voiceSuccess }}</span>
+ </el-button>
+ </template>
+ </el-table-column>
+ <el-table-column
+ label="鏈�缁堝畬鎴�"
+ align="center"
+ key="voiceAgainSuccess"
+ prop="voiceAgainSuccess"
+ :render-header="Tooltipzzwc"
+ >
+ <template slot-scope="scope">
+ <el-button
+ size="medium"
+ type="text"
+ @click="
+ handleViewDetails(
+ scope.row,
+ 'voiceAgainSuccessInfo',
+ '鏈�缁堝畬鎴愯闊抽殢璁垮垪琛�'
+ )
+ "
+ >
+ <span class="button-zx">{{
+ scope.row.voiceAgainSuccess
+ }}</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="smsSuccess"
+ prop="smsSuccess"
+ :render-header="Tooltipfswc"
+ >
+ <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
+ label="鏈�缁堝畬鎴�"
+ align="center"
+ key="smsAgainSuccess"
+ prop="smsAgainSuccess"
+ :render-header="Tooltipzzwc"
+ >
+ <template slot-scope="scope">
+ <el-button
+ size="medium"
+ type="text"
+ @click="
+ handleViewDetails(
+ scope.row,
+ 'smsAgainSuccessInfo',
+ '鏈�缁堝畬鎴愮煭淇¢殢璁垮垪琛�'
+ )
+ "
+ >
+ <span class="button-zx">{{
+ scope.row.smsAgainSuccess
+ }}</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="weChatSuccess"
+ prop="weChatSuccess"
+ :render-header="Tooltipfswc"
+ >
+ <template slot-scope="scope">
+ <el-button
+ size="medium"
+ type="text"
+ @click="
+ handleViewDetails(
+ scope.row,
+ 'wechatSuccessInfo',
+ '鍙戦�佸畬鎴愬井淇¢殢璁垮垪琛�'
+ )
+ "
+ >
+ <span class="button-zx">{{ scope.row.weChatSuccess }}</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"
key="manualAgain"
@@ -576,6 +793,7 @@
</template>
</el-table-column>
<el-table-column
+ v-if="!isTargetHospital"
label="璇煶"
align="center"
key="voiceAgain"
@@ -594,6 +812,7 @@
</template>
</el-table-column>
<el-table-column
+ v-if="!isTargetHospital"
label="鐭俊"
align="center"
key="smsAgain"
@@ -616,6 +835,7 @@
</template>
</el-table-column>
<el-table-column
+ v-if="!isTargetHospital"
label="寰俊"
align="center"
key="weChatAgain"
@@ -682,6 +902,14 @@
tasktypes: store.getters.tasktypes,
};
},
+ computed: {
+ isTargetHospital() {
+ return (
+ this.orgname == "绗竴浜烘皯鍖婚櫌婀栨花闄㈠尯" ||
+ this.orgname == "绗竴浜烘皯鍖婚櫌鍚村北闄㈠尯"
+ );
+ },
+ },
methods: {
loadData() {
this.loading = true;
@@ -746,6 +974,32 @@
{
props: {
content: "(闅忚鎴愬姛+棣栨闅忚澶辫触)/棣栨搴旈殢璁�",
+ placement: "top",
+ effect: "dark",
+ },
+ },
+ [h("span", column.label)]
+ );
+ },
+ Tooltipfswc(h, { column }) {
+ return h(
+ "el-tooltip",
+ {
+ props: {
+ content: "棣栨鍙戦�佹偅鑰呭嵆濉姤鎴愬姛鐨勬暟閲�",
+ placement: "top",
+ effect: "dark",
+ },
+ },
+ [h("span", column.label)]
+ );
+ },
+ Tooltipzzwc(h, { column }) {
+ return h(
+ "el-tooltip",
+ {
+ props: {
+ content: "棣栨鏈畬鎴愪簩娆℃垨涓夋琛ュ伩鎺ㄩ�佹湰鏂瑰紡鐨勫畬鎴愭鏁�",
placement: "top",
effect: "dark",
},
@@ -1121,20 +1375,21 @@
}
}
- // 鏍规嵁 serviceType 鐢熸垚闅忚绫诲瀷鍚嶇О
+ // 鏍规嵁 serviceType 鐢熸垚闅忚绫诲瀷鍚嶇О锛堝吋瀹瑰崟閫�/澶氶�夛級
+ const serviceTypes = Array.isArray(this.queryParams.serviceType)
+ ? this.queryParams.serviceType
+ : this.queryParams.serviceType
+ ? [this.queryParams.serviceType]
+ : [];
+
let serviceTypeName = "鍑洪櫌闅忚"; // 鏂囦欢鍚嶄娇鐢ㄧ殑鍚嶇О
let sheetTypeName = "鍐嶆闅忚"; // 宸ヤ綔琛ㄤ娇鐢ㄧ殑鍚嶇О锛堢畝鍖栫増锛�
- console.log(this.queryParams.serviceType);
- if (
- this.queryParams.serviceType &&
- Array.isArray(this.queryParams.serviceType) &&
- this.queryParams.serviceType.length > 0
- ) {
+ if (serviceTypes.length > 0) {
if (this.tasktypes && Array.isArray(this.tasktypes)) {
// 杩囨护鍑哄尮閰嶇殑闅忚绫诲瀷
const matchedTypes = this.tasktypes.filter((task) =>
- this.queryParams.serviceType.includes(task.value)
+ serviceTypes.includes(task.value)
);
if (matchedTypes.length === 1) {
@@ -1150,22 +1405,16 @@
serviceTypeName = typeNames.join("/");
// 宸ヤ綔琛ㄥ悕锛氫娇鐢ㄧ涓�涓被鍨嬫垨绠�鍖栧悕绉�
- if (matchedTypes.length <= 2) {
- // 濡傛灉鍙湁2涓被鍨嬶紝閮芥樉绀�
- sheetTypeName = `${typeNames[0]}绛塦;
- } else {
- // 濡傛灉瓒呰繃2涓被鍨嬶紝鍙樉绀虹涓�涓�
- sheetTypeName = `${typeNames[0]}绛塦;
- }
- } else if (this.queryParams.serviceType.length > 0) {
+ sheetTypeName = `${typeNames[0]}绛塦;
+ } else {
// 濡傛灉娌℃湁鍖归厤鐨勶紝浣跨敤鍘熷鍊�
- const typeStr = this.queryParams.serviceType.join("/");
+ const typeStr = serviceTypes.join("/");
serviceTypeName = typeStr;
sheetTypeName = "鍐嶆闅忚";
}
- } else if (this.queryParams.serviceType.length > 0) {
+ } else {
// 濡傛灉娌℃湁 tasktypes锛屼娇鐢ㄥ師濮嬪��
- const typeStr = this.queryParams.serviceType.join("/");
+ const typeStr = serviceTypes.join("/");
serviceTypeName = typeStr;
sheetTypeName = "鍐嶆闅忚";
}
diff --git a/src/views/sfstatistics/percentage/index.vue b/src/views/sfstatistics/percentage/index.vue
index a542f86..39b83e2 100644
--- a/src/views/sfstatistics/percentage/index.vue
+++ b/src/views/sfstatistics/percentage/index.vue
@@ -58,8 +58,7 @@
<el-form-item label="鏈嶅姟绫诲瀷" prop="userName">
<el-select
- v-model="queryParams.serviceType"
- multiple
+ v-model="serviceTypeSingle"
placeholder="璇烽�夋嫨"
>
<el-option
@@ -319,6 +318,18 @@
},
};
},
+ computed: {
+ // 鏈嶅姟绫诲瀷鍗曢�夛細UI 缁戝畾鍗曞�硷紝鍐呴儴浠嶄互鏁扮粍褰㈠紡浼犵粰鍚庣
+ serviceTypeSingle: {
+ get() {
+ const st = this.queryParams.serviceType;
+ return Array.isArray(st) ? st[0] : st;
+ },
+ set(val) {
+ this.queryParams.serviceType = val == null || val === "" ? [] : [val];
+ },
+ },
+ },
created() {
this.getDeptTree();
this.loadCurrentTabData();
diff --git a/vue.config.js b/vue.config.js
index fe4bda0..fd08b34 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -36,11 +36,11 @@
// detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: {
// target: `https://www.health-y.cn/lssf`,
- // target: `http://192.168.100.10:8096`,
+ target: `http://192.168.100.10:8096`,
// target: `http://192.168.100.10:8094`,//鐪佺珛鍚屽痉
// target: `http://192.168.100.10:8095`,//鏂板崕
// target: `http://192.168.100.10:8098`,//甯備竴
- target:`http://localhost:8095`,
+ // target:`http://localhost:8095`,
// target:`http://35z1t16164.qicp.vip`,
// target: `http://192.168.100.172:8095`,
// target: `http://192.168.100.10:8089`,//鍗楀崕
diff --git "a/\351\232\217\350\256\277\345\244\226\351\223\276\351\200\232\347\224\2509.12.zip" "b/\351\232\217\350\256\277\345\244\226\351\223\276\351\200\232\347\224\2509.12.zip"
deleted file mode 100644
index e05720c..0000000
--- "a/\351\232\217\350\256\277\345\244\226\351\223\276\351\200\232\347\224\2509.12.zip"
+++ /dev/null
Binary files differ
diff --git "a/\351\232\217\350\256\277\351\200\232\347\224\250.zip" "b/\351\232\217\350\256\277\351\200\232\347\224\250.zip"
deleted file mode 100644
index e770d46..0000000
--- "a/\351\232\217\350\256\277\351\200\232\347\224\250.zip"
+++ /dev/null
Binary files differ
diff --git "a/\351\232\217\350\256\277\351\200\232\347\224\2509.10.zip" "b/\351\232\217\350\256\277\351\200\232\347\224\2509.10.zip"
deleted file mode 100644
index 220f919..0000000
--- "a/\351\232\217\350\256\277\351\200\232\347\224\2509.10.zip"
+++ /dev/null
Binary files differ
diff --git "a/\351\232\217\350\256\277\351\200\232\347\224\2509.11.zip" "b/\351\232\217\350\256\277\351\200\232\347\224\2509.11.zip"
deleted file mode 100644
index 5cdef33..0000000
--- "a/\351\232\217\350\256\277\351\200\232\347\224\2509.11.zip"
+++ /dev/null
Binary files differ
diff --git "a/\351\232\217\350\256\277\351\200\232\347\224\250 9.14.zip" "b/\351\232\217\350\256\277\351\200\232\347\224\2509.22.zip"
similarity index 74%
rename from "\351\232\217\350\256\277\351\200\232\347\224\250 9.14.zip"
rename to "\351\232\217\350\256\277\351\200\232\347\224\2509.22.zip"
index 87b3f17..08a35f9 100644
--- "a/\351\232\217\350\256\277\351\200\232\347\224\250 9.14.zip"
+++ "b/\351\232\217\350\256\277\351\200\232\347\224\2509.22.zip"
Binary files differ
--
Gitblit v1.9.3