Forráskód Böngészése

问卷调查可以看到住院患者的填写情况

lighter 9 hónapja
szülő
commit
d7577d9978

+ 8 - 2
src/api/outpatient/clinic-satisfied.js

@@ -42,8 +42,6 @@ export function getPatientBriefInfo(patNo, times) {
 
 
 
-
-
 export function getQuestionnaireBodies(data) {
     return request({
         url: '/questionnaire/getQuestionnaireBodies',
@@ -52,6 +50,14 @@ export function getQuestionnaireBodies(data) {
     })
 }
 
+export function getPatInfoList(data) {
+    return request({
+        url: '/questionnaire/getPatInfoList',
+        method: 'post',
+        data
+    })
+}
+
 export function getAllQuestionnaireBodies(data) {
     return request({
         url: '/questionnaire/getAllQuestionnaireBodies',

+ 242 - 109
src/views/clinic/interactive/QuestionnaireV2.vue

@@ -6,80 +6,145 @@
         <el-option label="急诊" value="EMERGENCY"></el-option>
         <el-option label="住院" value="INPATIENT"></el-option>
       </el-select>
+      <el-select
+          v-if="inquiry.visitType === 'INPATIENT'"
+          v-model="inquiry.ward"
+          style="width: 140px"
+          clearable
+          placeholder="病区(为空时查全院)"
+      >
+        <el-option
+            v-for="item in wardList"
+            :key="item.code"
+            :label="item.name"
+            :value="item.code"
+        />
+      </el-select>
       <el-date-picker
           type="daterange"
           v-model="dateRange"
+          :shortcuts="shortcuts"
           style="width: 200px"
+          :clearable="false"
           start-placeholder="开始日期"
           end-placeholder="结束日期"
       ></el-date-picker>
       <el-divider direction="vertical"></el-divider>
-      <el-checkbox v-model="inquiry.onlyShowUnsatisfied" @change="handleSatisfiedChange">只看含有“不满意”的问卷
+      <el-checkbox
+          v-model="inquiry.onlyShowUnsatisfied"
+          @change="handleSatisfiedChange"
+      >
+        只看含有“不满意”的问卷
       </el-checkbox>
-      <el-button icon="Search" type="primary" @click="fetchAssessments" style="margin-left: 4px">检索</el-button>
+      <el-button icon="Search" type="primary" @click="fetchAssessments(true)" style="margin-left: 4px">检索</el-button>
       <el-button icon="DataAnalysis" type="success" @click="executeAssessmentAnalyse" style="margin-left: 12px">
         问卷分析
       </el-button>
-      <el-button type="primary" icon="Download" @click="exportExcel">导出Excel</el-button>
+      <el-button
+          type="primary"
+          icon="Download"
+          @click="exportExcel(1)"
+      >
+        导出问卷Excel
+      </el-button>
+      <el-button
+          v-if="inquiry.visitType === 'INPATIENT'"
+          type="primary"
+          icon="Download"
+          @click="exportExcel(2)"
+      >
+        导出患者Excel
+      </el-button>
     </header>
-    <div class="layout_main layout_el-table">
-      <el-table :data="assessments.listV2" stripe highlight-current-row>
-        <el-table-column prop="patientId" label="门诊号" width="70"></el-table-column>
-        <el-table-column v-if="inquiry.visitType === 'INPATIENT'" prop="zykshl" label="住院科室护理"></el-table-column>
-        <el-table-column v-if="inquiry.visitType === 'INPATIENT'" prop="zyksys" label="住院科室医生"></el-table-column>
-        <el-table-column v-if="inquiry.visitType === 'INPATIENT'" prop="yyst" label="医院食堂"></el-table-column>
-        <el-table-column v-if="inquiry.visitType !== 'INPATIENT'" prop="mjzdzjhl"
-                         label="门急诊导诊及护理"></el-table-column>
-        <el-table-column v-if="inquiry.visitType !== 'INPATIENT'" prop="mjzys" label="门急诊医生"></el-table-column>
-        <el-table-column prop="yjk" label="药剂科"></el-table-column>
-        <el-table-column prop="fsk" label="放射科"></el-table-column>
-        <el-table-column prop="csyxk" label="超声影像科"></el-table-column>
-        <el-table-column prop="jyk" label="检验科"></el-table-column>
-        <el-table-column prop="sfck" label="收费窗口"></el-table-column>
-        <el-table-column v-if="inquiry.visitType === 'INPATIENT'" prop="mzyh" label="门诊医护"></el-table-column>
-        <el-table-column v-if="inquiry.visitType === 'INPATIENT'" prop="jzyh" label="急诊医护"></el-table-column>
-        <el-table-column prop="ybk" label="医保科"></el-table-column>
-        <el-table-column prop="xzwyyy" label="选择我院的原因"></el-table-column>
-        <el-table-column prop="sfhxzzl" label="是否会再次选择我院"></el-table-column>
-        <el-table-column prop="ztpj" label="整体评价"></el-table-column>
-        <el-table-column prop="zmydyshs" label="满意的医生护士"></el-table-column>
-        <el-table-column prop="dwydjyhyj" label="意见和建议"></el-table-column>
-        <el-table-column prop="createDatetime" label="问卷时间"></el-table-column>
-        <el-table-column fixed="right" width="100">
-          <template #default="scope">
-            <el-button
-                v-if="scope.row.deleted === 0"
-                icon="Delete"
-                type="danger"
-                title="删除"
-                @click="changeAssessmentStatus(scope.row, 1)"
-            ></el-button>
-            <el-button
-                v-else
-                icon="Refresh"
-                type="success"
-                title="恢复"
-                @click="changeAssessmentStatus(scope.row, 0)"
-            ></el-button>
-            <el-button
-                icon="User"
-                title="患者信息"
-                type="primary"
-                plain
-                @click="beforeShowPatInfo(scope.row)"
-            ></el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      <el-pagination
-          @size-change="handleSizeChange"
-          @current-change="handleCurrentChange"
-          :current-page="inquiry.pageNum"
-          :page-sizes="[30, 50, 70, 100]"
-          :page-size="inquiry.pageSize"
-          layout="total, sizes, prev, pager, next"
-          :total="assessments.totalSize"
-      ></el-pagination>
+    <div class="layout_main layout_container layout-horizontal">
+      <div v-if="inquiry.visitType === 'INPATIENT'" class="layout_el-table" style="margin-right: 4px">
+        <el-table
+            ref="patTable"
+            :data="assessments.patients
+            .slice((currentPage - 1) * pageSize,
+            currentPage * pageSize)"
+            stripe
+            highlight-current-row
+            @row-click="handleClickPatRow"
+        >
+          <el-table-column prop="patNo" label="住院号" width="70"></el-table-column>
+          <el-table-column prop="patName" label="姓名" width="70"></el-table-column>
+          <el-table-column prop="disdate" label="出院时间" width="80"></el-table-column>
+          <el-table-column prop="disdept" label="出院病区" width="100"></el-table-column>
+          <el-table-column label="已填问卷" width="60">
+            <template #default="{row}">
+              <span v-html="questionnared(row.questionnaireCount)"></span>
+            </template>
+          </el-table-column>
+        </el-table>
+        <el-pagination
+            :current-page="currentPage"
+            :page-size="pageSize"
+            :total="assessments.patients.length"
+            layout="total, prev, next"
+            @current-change="handleCurrentChange1"
+        ></el-pagination>
+      </div>
+      <div class="layout_main layout_el-table">
+        <el-table :data="assessments.listV2" stripe highlight-current-row>
+          <el-table-column prop="patientId" label="门诊号" width="70"></el-table-column>
+          <el-table-column v-if="inquiry.visitType === 'INPATIENT'" prop="inpatientNo" label="住院号" width="70"></el-table-column>
+          <el-table-column v-if="inquiry.visitType === 'INPATIENT'" prop="zykshl" label="住院科室护理"></el-table-column>
+          <el-table-column v-if="inquiry.visitType === 'INPATIENT'" prop="zyksys" label="住院科室医生"></el-table-column>
+          <el-table-column v-if="inquiry.visitType === 'INPATIENT'" prop="yyst" label="医院食堂"></el-table-column>
+          <el-table-column v-if="inquiry.visitType !== 'INPATIENT'" prop="mjzdzjhl"
+                           label="门急诊导诊及护理"></el-table-column>
+          <el-table-column v-if="inquiry.visitType !== 'INPATIENT'" prop="mjzys" label="门急诊医生"></el-table-column>
+          <el-table-column prop="yjk" label="药剂科"></el-table-column>
+          <el-table-column prop="fsk" label="放射科"></el-table-column>
+          <el-table-column prop="csyxk" label="超声影像科"></el-table-column>
+          <el-table-column prop="jyk" label="检验科"></el-table-column>
+          <el-table-column prop="sfck" label="收费窗口"></el-table-column>
+          <el-table-column v-if="inquiry.visitType === 'INPATIENT'" prop="mzyh" label="门诊医护"></el-table-column>
+          <el-table-column v-if="inquiry.visitType === 'INPATIENT'" prop="jzyh" label="急诊医护"></el-table-column>
+          <el-table-column prop="ybk" label="医保科"></el-table-column>
+          <el-table-column prop="xzwyyy" label="选择我院的原因"></el-table-column>
+          <el-table-column prop="sfhxzzl" label="是否会再次选择我院"></el-table-column>
+          <el-table-column prop="ztpj" label="整体评价"></el-table-column>
+          <el-table-column prop="zmydyshs" label="满意的医生护士"></el-table-column>
+          <el-table-column prop="dwydjyhyj" label="意见和建议"></el-table-column>
+          <el-table-column prop="createDatetime" label="问卷时间"></el-table-column>
+          <el-table-column fixed="right" width="100">
+            <template #default="scope">
+              <el-button
+                  v-if="scope.row.deleted === 0"
+                  icon="Delete"
+                  type="danger"
+                  title="删除"
+                  @click="changeAssessmentStatus(scope.row, 1)"
+              ></el-button>
+              <el-button
+                  v-else
+                  icon="Refresh"
+                  type="success"
+                  title="恢复"
+                  @click="changeAssessmentStatus(scope.row, 0)"
+              ></el-button>
+              <el-button
+                  icon="User"
+                  title="患者信息"
+                  type="primary"
+                  plain
+                  @click="beforeShowPatInfo(scope.row)"
+              ></el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <el-pagination
+            @size-change="handleSizeChange"
+            @current-change="handleCurrentChange"
+            :current-page="inquiry.pageNum"
+            :page-sizes="[30, 50, 70, 100]"
+            :page-size="inquiry.pageSize"
+            layout="total, sizes, prev, pager, next"
+            :total="assessments.totalSize"
+        ></el-pagination>
+      </div>
     </div>
   </div>
 
@@ -928,6 +993,7 @@
 <script setup>
 import {
   getQuestionnaireBodies,
+  getPatInfoList,
   getAllQuestionnaireBodies,
   updateAssessmentStatusV2,
   assessmentsAnalyseV2,
@@ -935,11 +1001,51 @@ import {
 } from "@/api/outpatient/clinic-satisfied";
 import {ElMessage} from "element-plus";
 import {Export} from "@/utils/ExportExcel";
-import {getDateRangeFormatDate} from "@/utils/date";
+import {getDateRangeFormatDate, getOneMonthOffset} from "@/utils/date";
 import SimplestPatInfo from "@/components/outpatient/SimplestPatInfo.vue";
 import useDialogToJs from "@/components/js-dialog-comp/useDialogToJs";
+import {shortcuts} from "@/data/shortcuts";
+import {getAllWards} from "@/api/login";
+import {xcMessage} from "@/utils/xiaochan-element-plus";
 
 const dateRange = ref([])
+const wardList = ref([])
+
+const pageSize = 30
+const currentPage = ref(1)
+
+function handleCurrentChange1(val) {
+  currentPage.value = val
+}
+
+function questionnared(c) {
+  if (c > 0) {
+    return '<span style="color: green">是</span>'
+  }
+  return '<span style="color: red">否</span>'
+}
+
+const patTable = ref(null)
+function handleClickPatRow(row) {
+  if (row.patNo === inquiry.patNo && row.times === inquiry.times) {
+    inquiry.patNo = null
+    inquiry.times = null
+    patTable.value.setCurrentRow(null)
+  } else {
+    inquiry.patNo = row.patNo
+    inquiry.times = row.times
+  }
+  fetchAssessments()
+}
+
+onMounted(() => {
+  getAllWards().then((res) => {
+    wardList.value = res;
+  })
+  const m = getOneMonthOffset()
+  dateRange.value[0] = m.start
+  dateRange.value[1] = m.end
+})
 
 const formatDateRange = () => {
   if (dateRange.value.length === 2) {
@@ -953,14 +1059,18 @@ const inquiry = reactive({
   visitType: 'OUTPATIENT',
   start: null,
   end: null,
+  ward: null,
   pageNum: 1,
   pageSize: 30,
+  patNo: null,
+  times: null,
   onlyShowUnsatisfied: false
 })
 
 const assessments = reactive({
   totalSize: 0,
-  listV2: []
+  listV2: [],
+  patients: []
 })
 
 const showAnalyzeResult = ref(false)
@@ -980,10 +1090,18 @@ const titleOfAnalyze = computed(() => {
 const handleVisitTypeChange = () => {
   assessments.totalSize = 0
   assessments.listV2 = []
+  assessments.patients = []
 }
 
-const fetchAssessments = () => {
+const fetchAssessments = (flag) => {
   formatDateRange()
+  if (flag) {
+    inquiry.patNo = null
+    inquiry.times = null
+    getPatInfoList(inquiry).then(res => {
+      assessments.patients = res
+    })
+  }
   getQuestionnaireBodies(inquiry).then(res => {
     assessments.totalSize = res.totalSize
     assessments.listV2 = res.listV2
@@ -1005,7 +1123,6 @@ function beforeShowPatInfo(row) {
 const executeAssessmentAnalyse = () => {
   formatDateRange()
   assessmentsAnalyseV2(inquiry).then(res => {
-    console.log(res)
     analyzeResult.value = res
     showAnalyzeResult.value = true
   })
@@ -1042,55 +1159,71 @@ const changeAssessmentStatus = (row, deleted) => {
   })
 }
 
-const exportExcel = () => {
+const exportExcel = (flag) => {
   let fields;
-  if (inquiry.visitType === 'INPATIENT') {
-    fields = {
-      patientId: '门诊号',
-      inpatientNo: '住院号',
-      deptName: '出院科室',
-      zykshl: '住院科室护理人员',
-      zyksys: '住院科室医生',
-      yyst: '医院食堂',
-      yjk: '药剂科',
-      fsk: '放射科',
-      csyxk: '超声影像科',
-      jyk: '检验科',
-      sfck: '收费窗口',
-      ybk: '医保科',
-      yyhjws: '医院环境卫生',
-      mzyh: '门诊医护',
-      jzyh: '急诊医护',
-      xzwyyy: '选择我院的原因',
-      sfhxzzl: '是否会再次选择我院',
-      ztpj: '整体评价(1-10分)',
-      zmydyshs: '最满意的医生护士',
-      dwydjyhyj: '建议与意见'
-    };
+  if (flag === 1) {
+    if (inquiry.visitType === 'INPATIENT') {
+      fields = {
+        patientId: '门诊号',
+        inpatientNo: '住院号',
+        deptName: '出院科室',
+        zykshl: '住院科室护理人员',
+        zyksys: '住院科室医生',
+        yyst: '医院食堂',
+        yjk: '药剂科',
+        fsk: '放射科',
+        csyxk: '超声影像科',
+        jyk: '检验科',
+        sfck: '收费窗口',
+        ybk: '医保科',
+        yyhjws: '医院环境卫生',
+        mzyh: '门诊医护',
+        jzyh: '急诊医护',
+        xzwyyy: '选择我院的原因',
+        sfhxzzl: '是否会再次选择我院',
+        ztpj: '整体评价(1-10分)',
+        zmydyshs: '最满意的医生护士',
+        dwydjyhyj: '建议与意见'
+      };
+    } else {
+      fields = {
+        patientId: '门诊号',
+        deptName: '就诊科室',
+        mjzdzjhl: '门急诊导诊及护理',
+        mjzys: '门急诊医生',
+        yjk: '药剂科',
+        fsk: '放射科',
+        csyxk: '超声影像科',
+        jyk: '检验科',
+        sfck: '收费窗口',
+        ybk: '医保科',
+        yyhjws: '医院环境卫生',
+        xzwyyy: '选择我院的原因',
+        sfhxzzl: '是否会再次选择我院',
+        ztpj: '整体评价(1-10分)',
+        zmydyshs: '最满意的医生护士',
+        dwydjyhyj: '建议与意见'
+      };
+    }
+    formatDateRange();
+    getAllQuestionnaireBodies(inquiry).then(res => {
+      Export(res, fields, titleOfAnalyze.value)
+    })
   } else {
+    if (assessments.patients.length === 0) {
+      xcMessage.error('没有可以导出的患者数据。')
+      return
+    }
     fields = {
-      patientId: '门诊号',
-      deptName: '就诊科室',
-      mjzdzjhl: '门急诊导诊及护理',
-      mjzys: '门急诊医生',
-      yjk: '药剂科',
-      fsk: '放射科',
-      csyxk: '超声影像科',
-      jyk: '检验科',
-      sfck: '收费窗口',
-      ybk: '医保科',
-      yyhjws: '医院环境卫生',
-      xzwyyy: '选择我院的原因',
-      sfhxzzl: '是否会再次选择我院',
-      ztpj: '整体评价(1-10分)',
-      zmydyshs: '最满意的医生护士',
-      dwydjyhyj: '建议与意见'
+      patNo: '住院号',
+      times: '住院次数',
+      patName: '患者姓名',
+      disdate: '出院日期',
+      disdept: '出院病区',
+      countDes: '是否已填问卷',
     };
+    Export(assessments.patients, fields, '住院问卷患者填写情况')
   }
-  formatDateRange();
-  getAllQuestionnaireBodies(inquiry).then(res => {
-    Export(res, fields, titleOfAnalyze.value)
-  })
 }
 
 </script>