Browse Source

添加住院满意度调查和投诉与建议

lighter 2 years ago
parent
commit
e828ac445b

+ 17 - 1
src/api/assessments.js

@@ -45,4 +45,20 @@ export function submitClinicSatisfiedAssessment(data) {
     method: 'post',
     data,
   })
-}
+}
+
+export function submitInpatientSatisfiedAssessment(data) {
+  return request({
+    url: 'assessment/submitInpatientSatisfiedAssessment',
+    method: 'post',
+    data,
+  })
+}
+
+export function submitComplaintsAndSuggestions(data) {
+  return request({
+    url: 'assessment/submitComplaintsAndSuggestions',
+    method: 'post',
+    data,
+  })
+}

BIN
src/assets/hospital-service/complaints_and_suggestions.png


+ 7 - 0
src/router/index.js

@@ -301,6 +301,13 @@ export const constantRoutes = [
       title: '门诊服务满意度调查',
     },
   },
+  {
+    path: '/assessments/inpatientSatisfied/:patientId',
+    component: () => import('../views/hospital-service/assessments/InpatientSatisfiedAssessment.vue'),
+    meta: {
+      title: '住院服务满意度调查',
+    },
+  },
   {
     path: '/assessments/covid/:patientId?/:from?',
     component: () => import('../views/hospital-service/assessments/Covid19Assessment.vue'),

+ 320 - 267
src/views/hospital-service/HospitalServiceHome.vue

@@ -1,22 +1,22 @@
 <template>
-  <window-size :showBackNav="false">
-    <div class="logo-div">
-      <div style="display: flex">
-        <div><img src="../../assets/thyy_logo.png" style="height: 60px" /></div>
-        <div style="color: #00525e">
-          <h3>医疗服务平台</h3>
+    <window-size :showBackNav="false">
+        <div class="logo-div">
+            <div style="display: flex">
+                <div><img src="../../assets/thyy_logo.png" style="height: 60px"/></div>
+                <div style="color: #00525e">
+                    <h3>医疗服务平台</h3>
+                </div>
+            </div>
+            <div style="font-size: 13px">
+                <i class="van-icon van-icon-user-o"></i>
+                <span style="margin-left: 4px; color: #777" @click="router.push('/myPatientIdCards')">{{
+                    defaultPatientId
+                    }}</span>
+            </div>
         </div>
-      </div>
-      <div style="font-size: 13px">
-        <i class="van-icon van-icon-user-o"></i>
-        <span style="margin-left: 4px; color: #777" @click="router.push('/myPatientIdCards')">{{
-          defaultPatientId
-        }}</span>
-      </div>
-    </div>
-    <div style="position: relative; width: 95%; margin-top: 10px; height: 70px; display: flex">
-      <div
-          style="
+        <div style="position: relative; width: 95%; margin-top: 10px; height: 70px; display: flex">
+            <div
+                    style="
           width: 45%;
           margin-left: 5%;
           height: 70px;
@@ -26,11 +26,11 @@
           align-items: center;
           background-image: url('http://staticweb.hnthyy.cn/images/ybdzpzrk.png');
         "
-          @click="toybdzpz"
-      >
-      </div>
-      <div
-          style="
+                    @click="toybdzpz"
+            >
+            </div>
+            <div
+                    style="
           width: 45%;
           margin-left: 5%;
           height: 70px;
@@ -40,301 +40,354 @@
           align-items: center;
           background-image: url('http://staticweb.hnthyy.cn/images/dzjkkrk.png');
         "
-          @click="todzjkk"
-      >
-      </div>
-    </div>
-    <div id="router-lane">
-      <div style="height: 10px"></div>
-      <van-row gutter="5">
-        <van-col span="6" @click="routeTo('/appointment')">
-          <img src="../../assets/hospital-service/yuyueguahao.png" />
-          <div class="icon-label">预约挂号</div>
-        </van-col>
-        <van-col span="6" @click="routeTo(filterPath('/unPaidList/', '/selectPayPatient'))">
-          <img src="../../assets/hospital-service/menzhenjiaofei.png" />
-          <div class="icon-label">门诊缴费</div>
-        </van-col>
-        <van-col span="6" @click="routeTo(filterPath('/checkExamIndex/', '/selectExamPatient'))">
-          <img src="../../assets/hospital-service/baogaochaxun.png" />
-          <div class="icon-label">报告查询</div>
-        </van-col>
-        <van-col span="6" @click="routeTo(filterPath('/inPatientService/', '/selectInpatientCard'))">
-          <img src="../../assets/hospital-service/zhuyuanfuwu.png" />
-          <div class="icon-label">住院服务</div>
-        </van-col>
-      </van-row>
-      <div style="height: 10px"></div>
-      <van-row gutter="5">
-        <van-col span="6" @click="routeTo(filterPath('/assessments/', '/selectAssessmentPatient'))">
-          <img src="../../assets/hospital-service/wenjuandiaocha.png" />
-          <div class="icon-label">问卷调查</div>
-        </van-col>
-        <van-col span="6" @click="routeTo(filterPath('/physicalExamIndex/', '/selectPhysicalExamPatient'))">
-          <img src="../../assets/hospital-service/tijianbaogao.png" />
-          <div class="icon-label">体检报告</div>
-        </van-col>
-        <van-col span="6" @click="routeTo(filterPath('/healthCartCategory/', '/selectHealthCartPatient'))">
-          <img src="../../assets/hospital-service/gouwuche.png" />
-          <div class="icon-label">自助预约</div>
-        </van-col>
+                    @click="todzjkk"
+            >
+            </div>
+        </div>
+        <div id="router-lane">
+            <div style="height: 10px"></div>
+            <van-row gutter="5">
+                <van-col span="6" @click="routeTo('/appointment')">
+                    <img src="../../assets/hospital-service/yuyueguahao.png"/>
+                    <div class="icon-label">预约挂号</div>
+                </van-col>
+                <van-col span="6" @click="routeTo(filterPath('/unPaidList/', '/selectPayPatient'))">
+                    <img src="../../assets/hospital-service/menzhenjiaofei.png"/>
+                    <div class="icon-label">门诊缴费</div>
+                </van-col>
+                <van-col span="6" @click="routeTo(filterPath('/checkExamIndex/', '/selectExamPatient'))">
+                    <img src="../../assets/hospital-service/baogaochaxun.png"/>
+                    <div class="icon-label">报告查询</div>
+                </van-col>
+                <van-col span="6" @click="routeTo(filterPath('/inPatientService/', '/selectInpatientCard'))">
+                    <img src="../../assets/hospital-service/zhuyuanfuwu.png"/>
+                    <div class="icon-label">住院服务</div>
+                </van-col>
+            </van-row>
+            <div style="height: 10px"></div>
+            <van-row gutter="5">
+                <van-col span="6" @click="routeTo(filterPath('/assessments/', '/selectAssessmentPatient'))">
+                    <img src="../../assets/hospital-service/wenjuandiaocha.png"/>
+                    <div class="icon-label">问卷调查</div>
+                </van-col>
+                <van-col span="6" @click="routeTo(filterPath('/physicalExamIndex/', '/selectPhysicalExamPatient'))">
+                    <img src="../../assets/hospital-service/tijianbaogao.png"/>
+                    <div class="icon-label">体检报告</div>
+                </van-col>
+                <van-col span="6" @click="routeTo(filterPath('/healthCartCategory/', '/selectHealthCartPatient'))">
+                    <img src="../../assets/hospital-service/gouwuche.png"/>
+                    <div class="icon-label">自助预约</div>
+                </van-col>
 
-        <van-col span="6" @click="routeTo('/onlineConsult')">
-          <img src="../../assets/hospital-service/online-consult.png" />
-          <div class="icon-label">在线咨询</div>
-        </van-col>
-      </van-row>
-      <div style="height: 10px"></div>
-      <van-row gutter="5">
-        <van-col span="6" @click="routeTo('/selectTargetPatient')">
-          <img src="../../assets/hospital-service/appointmentmanagement.png" />
-          <div class="icon-label">挂号管理</div>
-        </van-col>
-        <van-col span="6" @click="routeTo('/selectPriceQueryBranch')">
-          <img src="../../assets/hospital-service/price-query.png" />
-          <div class="icon-label">价格查询</div>
-        </van-col>
-      </van-row>
-    </div>
-    <div style="width: 90%; margin-left: 5%; margin-top: 15px">
-      <van-tag size="large" type="warning">名医直达</van-tag>
-    </div>
-    <div :style="swipeStyle">
-      <div :style="loadingStyle" v-show="loading">
-        <van-loading size="24px" type="spinner" vertical></van-loading>
-      </div>
-      <van-swipe :autoplay="10000" :show-indicators="false" vertical style="height: 100%">
-        <van-swipe-item v-for="(arr, index) in doctors" :key="index">
-          <div :style="swipeRowStyle" v-for="item in arr" :key="item.doctorCode" @click="clickDoctor(item)">
-            <van-image
-              round
-              fit="cover"
-              style="margin-top: 5px; margin-left: 5px"
-              :width="portraitWidth"
-              :height="portraitHeight"
-              :src="'data:image/png;base64,' + item.portrait"
-            />
-            <div :style="infoStyle">
-              {{ item.doctorName }} | {{ item.deptName }} | {{ item.doctorTitle }}
-              <div v-show="item.introduction" :style="specialtyStyle">{{ item.introduction }}</div>
+                <van-col span="6" @click="routeTo('/onlineConsult')">
+                    <img src="../../assets/hospital-service/online-consult.png"/>
+                    <div class="icon-label">在线咨询</div>
+                </van-col>
+            </van-row>
+            <div style="height: 10px"></div>
+            <van-row gutter="5">
+                <van-col span="6" @click="routeTo('/selectTargetPatient')">
+                    <img src="../../assets/hospital-service/appointmentmanagement.png"/>
+                    <div class="icon-label">挂号管理</div>
+                </van-col>
+                <van-col span="6" @click="routeTo('/selectPriceQueryBranch')">
+                    <img src="../../assets/hospital-service/price-query.png"/>
+                    <div class="icon-label">价格查询</div>
+                </van-col>
+                <van-col span="6" @click="clickComplaintsAndSuggestions">
+                    <img src="../../assets/hospital-service/complaints_and_suggestions.png"/>
+                    <div class="icon-label">投诉与建议</div>
+                </van-col>
+            </van-row>
+        </div>
+        <div style="width: 90%; margin-left: 5%; margin-top: 15px">
+            <van-tag size="large" type="warning">名医直达</van-tag>
+        </div>
+        <div :style="swipeStyle">
+            <div :style="loadingStyle" v-show="loading">
+                <van-loading size="24px" type="spinner" vertical></van-loading>
+            </div>
+            <van-swipe :autoplay="10000" :show-indicators="false" vertical style="height: 100%">
+                <van-swipe-item v-for="(arr, index) in doctors" :key="index">
+                    <div :style="swipeRowStyle" v-for="item in arr" :key="item.doctorCode" @click="clickDoctor(item)">
+                        <van-image
+                                round
+                                fit="cover"
+                                style="margin-top: 5px; margin-left: 5px"
+                                :width="portraitWidth"
+                                :height="portraitHeight"
+                                :src="'data:image/png;base64,' + item.portrait"
+                        />
+                        <div :style="infoStyle">
+                            {{ item.doctorName }} | {{ item.deptName }} | {{ item.doctorTitle }}
+                            <div v-show="item.introduction" :style="specialtyStyle">{{ item.introduction }}</div>
+                        </div>
+                    </div>
+                </van-swipe-item>
+            </van-swipe>
+        </div>
+        <div class="van-overlay" style="z-index: 2001" v-show="showComplaintsAndSuggestions">
+            <div style="position: absolute; top: 60px; left: 30px; right: 30px; background: white; border-radius: 10px; padding-bottom: 20px">
+                <div style="margin: 20px 0 20px 20px;font-size: 15px; font-weight: bold; padding-bottom: 10px; border-bottom: 1px solid gray">投诉与建议</div>
+                <van-field required v-model="complaintsAndSuggestions.department" label="投诉科室"></van-field>
+                <van-field required v-model="complaintsAndSuggestions.object" label="投诉对象"></van-field>
+                <van-field required v-model="complaintsAndSuggestions.content" label="投诉与建议"></van-field>
+                <van-field required v-model="complaintsAndSuggestions.contact" label="联系方式"></van-field>
+                <van-field v-model="complaintsAndSuggestions.name" label="您的姓名"></van-field>
+                <div style="display: flex; margin-top: 30px">
+                    <div style="width: 50%; padding: 12px">
+                        <van-button block @click="showComplaintsAndSuggestions = false">取消</van-button>
+                    </div>
+                    <div style="width: 50%; padding: 12px">
+                        <van-button block type="primary" @click="confirmComplaints">提交</van-button>
+                    </div>
+                </div>
             </div>
-          </div>
-        </van-swipe-item>
-      </van-swipe>
-    </div>
-  </window-size>
+        </div>
+    </window-size>
 </template>
 
 <script>
-import { computed, onMounted, ref } from 'vue'
+import {computed, onMounted, reactive, ref} from 'vue'
 import store from '../../store'
-import { getDate } from '../../utils/date'
+import {getDate} from '../../utils/date'
 import router from '../../router'
 import axios from 'axios'
-import {Toast} from "vant";
+import {Dialog, Toast} from "vant";
+import {submitComplaintsAndSuggestions} from "../../api/assessments";
+
 export default {
-  setup() {
-    const windowSize = store.state.windowSize
-    const swipeStyle = {
-      width: '90%',
-      marginLeft: '5%',
-      marginTop: '5px',
-      height: windowSize.h - 460 + 'px',
-      h: windowSize.h - 460,
-      w: windowSize.w * 0.9,
-    }
+    setup() {
+        const windowSize = store.state.windowSize
+        const swipeStyle = {
+            width: '90%',
+            marginLeft: '5%',
+            marginTop: '5px',
+            height: windowSize.h - 460 + 'px',
+            h: windowSize.h - 460,
+            w: windowSize.w * 0.9,
+        }
 
-    const swipeRowStyle = {
-      width: '100%',
-      height: swipeStyle.h / 3 - 5 + 'px',
-      marginBottom: '5px',
-      borderRadius: '8px',
-      backgroundColor: '#00525e',
-      backgroundImage: 'linear-gradient(to bottom right, #03a0b8, #00525e)',
-      display: 'flex',
-      h: swipeStyle.h / 3 - 5,
-      color: 'white',
-    }
+        const swipeRowStyle = {
+            width: '100%',
+            height: swipeStyle.h / 3 - 5 + 'px',
+            marginBottom: '5px',
+            borderRadius: '8px',
+            backgroundColor: '#00525e',
+            backgroundImage: 'linear-gradient(to bottom right, #03a0b8, #00525e)',
+            display: 'flex',
+            h: swipeStyle.h / 3 - 5,
+            color: 'white',
+        }
+
+        const loadingStyle = {
+            position: 'fixed',
+            top: 400 + swipeStyle.h / 2 - 32 + 'px',
+            left: 0,
+            right: 0,
+            bottom: '50px',
+        }
 
-    const loadingStyle = {
-      position: 'fixed',
-      top: 400 + swipeStyle.h / 2 - 32 + 'px',
-      left: 0,
-      right: 0,
-      bottom: '50px',
-    }
+        const portraitHeight = swipeRowStyle.h - 10 + 'px'
+        const portraitWidth = swipeRowStyle.h * 0.65 + 'px'
 
-    const portraitHeight = swipeRowStyle.h - 10 + 'px'
-    const portraitWidth = swipeRowStyle.h * 0.65 + 'px'
+        const infoStyle = {
+            width: swipeStyle.w - swipeRowStyle.h * 0.65 - 10 + 'px',
+            height: '32px',
+            fontSize: '13px',
+            fontWeight: 'bold',
+            marginLeft: '10px',
+            marginTop: swipeRowStyle.h / 2 - 20 + 'px',
+        }
 
-    const infoStyle = {
-      width: swipeStyle.w - swipeRowStyle.h * 0.65 - 10 + 'px',
-      height: '32px',
-      fontSize: '13px',
-      fontWeight: 'bold',
-      marginLeft: '10px',
-      marginTop: swipeRowStyle.h / 2 - 20 + 'px',
-    }
+        const specialtyStyle = {
+            overflow: 'hidden',
+            textOverflow: 'ellipsis',
+            whiteSpace: 'nowrap',
+            fontSize: '12px',
+            fontWeight: 'normal',
+            paddingRight: '15px',
+        }
+        const cards = computed(() => {
+            return store.state.patientCards
+        })
+        const filterPath = (singleCardPath, multipleCardsPath) => {
+            return cards.value.length === 1 ? singleCardPath + cards.value[0].patientId : multipleCardsPath
+        }
+        const defaultPatientId = computed(() => {
+            if (cards.value.length === 0) {
+                return '未绑卡'
+            }
+            if (cards.value.length === 1) {
+                return cards.value[0].patientId
+            }
+            for (let i = 0; i < cards.value.length; i++) {
+                if (cards.value[i].isDefault === 1) {
+                    return cards.value[i].patientId
+                }
+            }
+        })
 
-    const specialtyStyle = {
-      overflow: 'hidden',
-      textOverflow: 'ellipsis',
-      whiteSpace: 'nowrap',
-      fontSize: '12px',
-      fontWeight: 'normal',
-      paddingRight: '15px',
-    }
-    const cards = computed(() => {
-      return store.state.patientCards
-    })
-    const filterPath = (singleCardPath, multipleCardsPath) => {
-      return cards.value.length === 1 ? singleCardPath + cards.value[0].patientId : multipleCardsPath
-    }
-    const defaultPatientId = computed(() => {
-      if (cards.value.length === 0) {
-        return '未绑卡'
-      }
-      if (cards.value.length === 1) {
-        return cards.value[0].patientId
-      }
-      for (let i = 0; i < cards.value.length; i++) {
-        if (cards.value[i].isDefault === 1) {
-          return cards.value[i].patientId
+        const doctors = computed(() => {
+            return store.state.homePageDoctors
+        })
+        const date = getDate()
+        const clickDoctor = (val) => {
+            const path = '/doctorArrangement/' + date + '/' + val.deptCode + '/' + val.doctorCode
+            router.push(path)
         }
-      }
-    })
 
-    const doctors = computed(() => {
-      return store.state.homePageDoctors
-    })
-    const date = getDate()
-    const clickDoctor = (val) => {
-      const path = '/doctorArrangement/' + date + '/' + val.deptCode + '/' + val.doctorCode
-      router.push(path)
-    }
+        const routeTo = (val) => {
+            router.push(val)
+        }
 
-    const routeTo = (val) => {
-      router.push(val)
-    }
+        const toVaccinateAppointment = () => {
+            if (cards.value.length === 1) {
+                window.open('http://www.hnthyy.cn:8080/covidVaccinate/' + cards.value[0].patientId, '_self')
+            } else {
+                router.push('/selectCovidVaccinatePatient')
+            }
+        }
 
-    const toVaccinateAppointment = () => {
-      if (cards.value.length === 1) {
-        window.open('http://www.hnthyy.cn:8080/covidVaccinate/' + cards.value[0].patientId, '_self')
-      } else {
-        router.push('/selectCovidVaccinatePatient')
-      }
-    }
+        const toybdzpz = () => {
+            store.commit('SET_LOADING', true)
+            window.location.href =
+                'https://mp.weixin.qq.com/insurance/card/creditjump?cityid=430100&from=u1ZYLGrYTJspxoHAQoU96w.%3D#wechat_redirect'
+        }
 
-    const toybdzpz = () => {
-      store.commit('SET_LOADING', true)
-      window.location.href =
-        'https://mp.weixin.qq.com/insurance/card/creditjump?cityid=430100&from=u1ZYLGrYTJspxoHAQoU96w.%3D#wechat_redirect'
-    }
+        const todzjkk = () => {
+            router.push('/electronicHealthCardHome')
+        }
 
-    const todzjkk = () => {
-      router.push('/electronicHealthCardHome')
-    }
+        const showComplaintsAndSuggestions = ref(false)
+        const complaintsAndSuggestions = reactive({
+            openId: localStorage.getItem('openId'),
+            department: null,
+            object: null,
+            content: null,
+            contact: null,
+            name: null,
+        })
+        const clickComplaintsAndSuggestions = () => {
+            showComplaintsAndSuggestions.value = true
+        }
+        const confirmComplaints = () => {
+            submitComplaintsAndSuggestions(complaintsAndSuggestions).then(res => {
+                showComplaintsAndSuggestions.value = false
+                Dialog.alert({
+                    title: '提示',
+                    message: '提交成功!',
+                })
+            })
+        }
 
-    const loading = ref(false)
-    onMounted(() => {
-      if (doctors.value.length === 0) {
-        loading.value = true
-        const url = import.meta.env.VITE_BASE_URL + '/homepage/selectHomePageDoctors'
-        axios({
-          withCredentials: true,
-          url: url,
-        }).then((res) => {
-          store.commit('SET_HOMEPAGEDOCTORS', res.data.data)
-          loading.value = false
+        const loading = ref(false)
+        onMounted(() => {
+            if (doctors.value.length === 0) {
+                loading.value = true
+                const url = import.meta.env.VITE_BASE_URL + '/homepage/selectHomePageDoctors'
+                axios({
+                    withCredentials: true,
+                    url: url,
+                }).then((res) => {
+                    store.commit('SET_HOMEPAGEDOCTORS', res.data.data)
+                    loading.value = false
+                })
+            }
         })
-      }
-    })
-    return {
-      filterPath,
-      doctors,
-      router,
-      clickDoctor,
-      swipeStyle,
-      swipeRowStyle,
-      portraitHeight,
-      portraitWidth,
-      infoStyle,
-      specialtyStyle,
-      defaultPatientId,
-      routeTo,
-      toVaccinateAppointment,
-      loadingStyle,
-      loading,
-      toybdzpz,
-      todzjkk,
-    }
-  },
+        return {
+            filterPath,
+            doctors,
+            router,
+            clickDoctor,
+            swipeStyle,
+            swipeRowStyle,
+            portraitHeight,
+            portraitWidth,
+            infoStyle,
+            specialtyStyle,
+            defaultPatientId,
+            routeTo,
+            toVaccinateAppointment,
+            loadingStyle,
+            loading,
+            toybdzpz,
+            todzjkk,
+            showComplaintsAndSuggestions,
+            complaintsAndSuggestions,
+            clickComplaintsAndSuggestions,
+            confirmComplaints
+        }
+    },
 }
 </script>
 
 <style scoped>
 .logo-div {
-  width: 92.5%;
-  margin-left: 3%;
-  height: 60px;
-  line-height: 60px;
-  display: flex;
-  justify-content: space-between;
+    width: 92.5%;
+    margin-left: 3%;
+    height: 60px;
+    line-height: 60px;
+    display: flex;
+    justify-content: space-between;
 }
+
 .big-box {
-  margin-top: 10px;
-  width: 90%;
-  margin-left: 5%;
-  height: 70px;
-  background-size: 100%;
-  border-radius: 8px;
-  display: flex;
-  align-items: center;
+    margin-top: 10px;
+    width: 90%;
+    margin-left: 5%;
+    height: 70px;
+    background-size: 100%;
+    border-radius: 8px;
+    display: flex;
+    align-items: center;
 }
+
 .hsjctext {
-  font-size: 36px;
-  color: rgba(4, 59, 104, 0.9);
-  font-weight: bold;
-  padding-left: 8px;
+    font-size: 36px;
+    color: rgba(4, 59, 104, 0.9);
+    font-weight: bold;
+    padding-left: 8px;
 }
+
 .large-icon {
-  margin-left: 10px;
-  margin-top: 11px;
+    margin-left: 10px;
+    margin-top: 11px;
 }
 
 .xinguanjiance {
-  background: url('../../assets/hospital-service/xinguanjiancebackground.png') no-repeat !important;
-  background-size: 100% !important;
+    background: url('../../assets/hospital-service/xinguanjiancebackground.png') no-repeat !important;
+    background-size: 100% !important;
 }
 
 .bold-text {
-  font-weight: bold;
+    font-weight: bold;
 }
 
 #router-lane .van-col {
-  text-align: center;
+    text-align: center;
 }
 
 #router-lane img {
-  width: 32px;
-  height: 32px;
+    width: 32px;
+    height: 32px;
 }
 
 .icon-label {
-  font-size: 13px;
-  color: #333;
-  /* color:#048a9e; */
+    font-size: 13px;
+    color: #333;
+    /* color:#048a9e; */
 }
 
 .doctor-loading-box {
-  position: fixed;
-  display: inline-block;
-  width: 120px;
-  padding: 15px 0;
-  vertical-align: middle;
-  background-color: #fff;
-  border-radius: 4px;
-  border: 1px solid #ebeef5;
-  box-shadow: 1px 2px 9px 5px rgba(0, 0, 0, 0.1);
+    position: fixed;
+    display: inline-block;
+    width: 120px;
+    padding: 15px 0;
+    vertical-align: middle;
+    background-color: #fff;
+    border-radius: 4px;
+    border: 1px solid #ebeef5;
+    box-shadow: 1px 2px 9px 5px rgba(0, 0, 0, 0.1);
 }
 </style>

+ 119 - 109
src/views/hospital-service/appointment/AppointmentConfirm.vue

@@ -1,126 +1,136 @@
 <template>
-  <window-size>
-    <van-cell title="医生姓名" :value="appointment.doctorName" />
-    <van-cell title="医生号别" :value="appointment.doctorTitle" />
-    <van-cell title="就诊科室" :value="appointment.deptName" />
-    <van-cell title="就诊时段">
-      <template #default>
-        <div style="color: orangered">
-          {{ appointment.date }}&nbsp;&nbsp;{{ appointment.week }}&nbsp;&nbsp;{{ appointment.ampm }}
-        </div>
-      </template>
-    </van-cell>
-    <div style="height: 5px"></div>
-    <van-cell title="挂号金额">
-      <template #default>
-        <div style="color: orangered">¥{{ appointment.fee }}</div>
-      </template>
-    </van-cell>
-    <div style="height: 5px"></div>
-    <van-radio-group v-model="appointment.patientId">
-      <van-cell-group>
-        <div v-for="item in patientCards" :key="item.patientId">
-          <van-cell center icon="user-o" :label="item.patientId" clickable @click="changePatient(item.patientId)">
-            <template #title>
-              <span class="custom-title">{{ item.name }}</span>
-              &nbsp;
-              <van-tag type="primary" plain v-if="item.isDefault === 1">默认</van-tag>
+    <window-size>
+        <van-cell title="医生姓名" :value="appointment.doctorName"/>
+        <van-cell title="医生号别" :value="appointment.doctorTitle"/>
+        <van-cell title="就诊科室" :value="appointment.deptName"/>
+        <van-cell title="就诊时段">
+            <template #default>
+                <div style="color: orangered">
+                    {{ appointment.date }}&nbsp;&nbsp;{{ appointment.week }}&nbsp;&nbsp;{{ appointment.ampm }}
+                </div>
             </template>
-            <template #right-icon>
-              <van-radio :name="item.patientId" />
+        </van-cell>
+        <div style="height: 5px"></div>
+        <van-cell title="挂号金额">
+            <template #default>
+                <div style="color: orangered">¥{{ appointment.fee }}</div>
             </template>
-          </van-cell>
-        </div>
-      </van-cell-group>
-    </van-radio-group>
-    <van-cell
-      v-if="showAddCard"
-      icon="add-o"
-      title="添加就诊人"
-      :value="addCardText"
-      is-link
-      to="/addElectronicHealthCard"
-    ></van-cell>
-    <div style="height: 10px"></div>
-    <van-button type="primary" block @click="confirmAppointment" :disabled="disableGhBtn">确认挂号</van-button>
-  </window-size>
+        </van-cell>
+        <div style="height: 5px"></div>
+        <van-radio-group v-model="appointment.patientId">
+            <van-cell-group>
+                <div v-for="item in patientCards" :key="item.patientId">
+                    <van-cell center icon="user-o" :label="item.patientId" clickable
+                              @click="changePatient(item.patientId)">
+                        <template #title>
+                            <span class="custom-title">{{ item.name }}</span>
+                            &nbsp;
+                            <van-tag type="primary" plain v-if="item.isDefault === 1">默认</van-tag>
+                        </template>
+                        <template #right-icon>
+                            <van-radio :name="item.patientId"/>
+                        </template>
+                    </van-cell>
+                </div>
+            </van-cell-group>
+        </van-radio-group>
+        <van-cell
+                v-if="showAddCard"
+                icon="add-o"
+                title="添加就诊人"
+                :value="addCardText"
+                is-link
+                to="/addElectronicHealthCard"
+        ></van-cell>
+        <div style="height: 10px"></div>
+        <van-button type="primary" block @click="confirmAppointment" :disabled="disableGhBtn">确认挂号</van-button>
+    </window-size>
 </template>
 
 <script>
 import store from '../../../store'
-import { computed, onMounted, ref, watchEffect } from 'vue'
+import {computed, onMounted, ref, watchEffect} from 'vue'
 import {checkAppointmentRequirements, getGhFee} from '../../../api/appointment'
 import router from '../../../router'
-import { Toast } from 'vant'
+import {Dialog, Toast} from 'vant'
+
 export default {
-  name: 'AppointConfirm',
-  setup() {
-    const appointment = store.state.appointmentInfo
-    const patientCards = computed(() => {
-      return store.state.patientCards
-    })
-    watchEffect(() => {
-      patientCards.value.forEach((item) => {
-        if (item.isDefault === 1) {
-          appointment.patientId = item.patientId
-        }
-      })
-    })
-    const showAddCard = computed(() => {
-      return patientCards.value.length < 5
-    })
-    const addCardText = computed(() => {
-      return '还可添加' + (5 - patientCards.value.length) + '人'
-    })
-    const changePatient = (patientId) => {
-      appointment.patientId = patientId
-      fetchGhFee()
-    }
-    const confirmAppointment = () => {
-      checkAppointmentRequirements(appointment.patientId, appointment.deptCode).then(() => {
-        patientCards.value.forEach((item) => {
-          if (item.patientId === appointment.patientId) {
-            appointment.patientName = item.name
-          }
+    name: 'AppointConfirm',
+    setup() {
+        const appointment = store.state.appointmentInfo
+        const patientCards = computed(() => {
+            return store.state.patientCards
         })
-        store.commit('SET_APPOINTMENTINFO', appointment)
-        router.push('/payAppointmentFee')
-      })
-    }
-
-    const disableGhBtn = ref(true)
-
-    const fetchGhFee = () => {
-      getGhFee(appointment)
-        .then((res) => {
-          appointment.fee = res.fee
-          disableGhBtn.value = false
-          if (res.message) {
-            Toast({
-              message: res.message,
-              position: 'top',
-              duration: 3000,
+        watchEffect(() => {
+            patientCards.value.forEach((item) => {
+                if (item.isDefault === 1) {
+                    appointment.patientId = item.patientId
+                }
             })
-          }
         })
-        .catch(() => {
-          appointment.fee = '获取失败'
-          disableGhBtn.value = true
+        const showAddCard = computed(() => {
+            return patientCards.value.length < 5
         })
-    }
+        const addCardText = computed(() => {
+            return '还可添加' + (5 - patientCards.value.length) + '人'
+        })
+        const changePatient = (patientId) => {
+            appointment.patientId = patientId
+            fetchGhFee()
+        }
+        const confirmAppointment = () => {
+            checkAppointmentRequirements(appointment.patientId, appointment.deptCode).then(() => {
+                patientCards.value.forEach((item) => {
+                    if (item.patientId === appointment.patientId) {
+                        appointment.patientName = item.name
+                    }
+                })
+                Dialog.confirm({
+                    title: '温馨提示',
+                    message: '超过预约日期未就诊,不予退号、换号、转科,敬请谅解。',
+                    confirmButtonText: '确认挂号',
+                    cancelButtonText: '取消挂号'
+                }).then(() => {
+                    store.commit('SET_APPOINTMENTINFO', appointment)
+                    router.push('/payAppointmentFee')
+                }).catch(() => {
+                })
+            })
+        }
+
+        const disableGhBtn = ref(true)
+
+        const fetchGhFee = () => {
+            getGhFee(appointment)
+                .then((res) => {
+                    appointment.fee = res.fee
+                    disableGhBtn.value = false
+                    if (res.message) {
+                        Toast({
+                            message: res.message,
+                            position: 'top',
+                            duration: 3000,
+                        })
+                    }
+                })
+                .catch(() => {
+                    appointment.fee = '获取失败'
+                    disableGhBtn.value = true
+                })
+        }
 
-    onMounted(() => {
-      fetchGhFee()
-    })
-    return {
-      appointment,
-      patientCards,
-      showAddCard,
-      addCardText,
-      confirmAppointment,
-      disableGhBtn,
-      changePatient,
-    }
-  },
+        onMounted(() => {
+            fetchGhFee()
+        })
+        return {
+            appointment,
+            patientCards,
+            showAddCard,
+            addCardText,
+            confirmAppointment,
+            disableGhBtn,
+            changePatient,
+        }
+    },
 }
 </script>

+ 2 - 7
src/views/hospital-service/appointment/SelectDoctorAndDate.vue

@@ -116,13 +116,8 @@ export default {
       if (val.leftNum === 0) {
         Toast.fail(val.doctorName + '医生已无号')
       } else {
-        Dialog.confirm({
-          title: '温馨提示',
-          message: '超过预约日期未就诊,不予退号、换号、转科,敬请谅解。'
-        }).then(() => {
-          const to = '/doctorArrangement/' + data.dateSelected + '/' + deptCode + '/' + val.doctorCode
-          router.push(to)
-        }).catch(() => {})
+        const to = '/doctorArrangement/' + data.dateSelected + '/' + deptCode + '/' + val.doctorCode
+        router.push(to)
       }
     }
     onMounted(() => {

+ 2 - 0
src/views/hospital-service/assessments/AssessmentsEntrance.vue

@@ -4,6 +4,8 @@
         <div style="height: 5px"></div>
         <van-cell title="门诊服务满意度调查" is-link :to="'/assessments/clinicSatisfied/' + patientId"></van-cell>
         <div style="height: 5px"></div>
+        <van-cell title="住院服务满意度调查" is-link :to="'/assessments/inpatientSatisfied/' + patientId"></van-cell>
+        <div style="height: 5px"></div>
         <van-cell title="新型冠状病毒感染流行病学史问卷" is-link :to="'/assessments/covid/' + patientId"></van-cell>
     </window-size>
 </template>

+ 1 - 0
src/views/hospital-service/assessments/ClinicSatisfiedAssessment.vue

@@ -6,6 +6,7 @@
                 <van-radio-group v-model="answer['item' + item.key]" direction="horizontal">
                     <van-radio name="A">满意</van-radio>
                     <van-radio name="B">不满意</van-radio>
+                    <van-radio name="C">未接触</van-radio>
                 </van-radio-group>
             </div>
             <div v-show="answer['item' + item.key] === 'B'">

+ 214 - 0
src/views/hospital-service/assessments/InpatientSatisfiedAssessment.vue

@@ -0,0 +1,214 @@
+<template>
+    <window-size>
+        <div class="question-box">
+            <p>1-1、您对住院科室护理人员服务满意吗?</p>
+            <div style="margin-top: 4px">
+                <van-radio-group v-model="answer.item1" direction="horizontal">
+                    <van-radio name="A">满意</van-radio>
+                    <van-radio name="B">不满意</van-radio>
+                </van-radio-group>
+            </div>
+            <div v-show="answer.item1 === 'B'">
+                <p style="margin-top: 6px">1-2、您对住院科室护理人员哪些服务不满意?</p>
+                <van-checkbox-group v-model="answer.item2Arr" direction="horizontal">
+                    <van-checkbox
+                            shape="square"
+                            v-for="child in checkboxOptions1"
+                            :key="child.key"
+                            :name="child.key"
+                            style="margin-top: 5px"
+                    >{{ child.label }}
+                    </van-checkbox>
+                </van-checkbox-group>
+            </div>
+        </div>
+        <div class="question-box">
+            <p>2-1、您对住院科室医生服务满意吗?</p>
+            <div style="margin-top: 4px">
+                <van-radio-group v-model="answer.item3" direction="horizontal">
+                    <van-radio name="A">满意</van-radio>
+                    <van-radio name="B">不满意</van-radio>
+                </van-radio-group>
+            </div>
+            <div v-show="answer.item3 === 'B'">
+                <p style="margin-top: 6px">2-2、您对住院科室医生哪些服务不满意?</p>
+                <van-checkbox-group v-model="answer.item4Arr" direction="horizontal">
+                    <van-checkbox
+                            shape="square"
+                            v-for="child in checkboxOptions2"
+                            :key="child.key"
+                            :name="child.key"
+                            style="margin-top: 5px"
+                    >{{ child.label }}
+                    </van-checkbox>
+                </van-checkbox-group>
+            </div>
+        </div>
+        <div class="question-box">
+            <p>3-1、您对医院环境卫生满意吗?</p>
+            <div style="margin-top: 4px">
+                <van-radio-group v-model="answer.item5" direction="horizontal">
+                    <van-radio name="A">满意</van-radio>
+                    <van-radio name="B">不满意</van-radio>
+                </van-radio-group>
+            </div>
+            <div v-show="answer.item5 === 'B'">
+                <p style="margin-top: 6px">3-2、您对医院环境卫生哪些项目不满意?</p>
+                <van-checkbox-group v-model="answer.item6Arr" direction="horizontal">
+                    <van-checkbox
+                            shape="square"
+                            v-for="child in checkboxOptions3"
+                            :key="child.key"
+                            :name="child.key"
+                            style="margin-top: 5px"
+                    >{{ child.label }}
+                    </van-checkbox>
+                </van-checkbox-group>
+            </div>
+        </div>
+        <div class="question-box">
+            <p>4-1、您对医院食堂满意吗?</p>
+            <div style="margin-top: 4px">
+                <van-radio-group v-model="answer.item7" direction="horizontal">
+                    <van-radio name="A">满意</van-radio>
+                    <van-radio name="B">不满意</van-radio>
+                    <van-radio name="C">未接触</van-radio>
+                </van-radio-group>
+            </div>
+            <div v-show="answer.item7 === 'B'">
+                <p style="margin-top: 6px">4-2、您对医院环境卫生哪些项目不满意?</p>
+                <van-checkbox-group v-model="answer.item8Arr" direction="horizontal">
+                    <van-checkbox
+                            shape="square"
+                            v-for="child in checkboxOptions4"
+                            :key="child.key"
+                            :name="child.key"
+                            style="margin-top: 5px"
+                    >{{ child.label }}
+                    </van-checkbox>
+                </van-checkbox-group>
+            </div>
+        </div>
+        <div v-for="(item, index) in headQuestions" :key="item.key" class="question-box">
+            <p>{{ item.label }}</p>
+            <div style="margin-top: 4px">
+                <van-radio-group v-model="answer['item' + item.key]" direction="horizontal">
+                    <van-radio name="A">满意</van-radio>
+                    <van-radio name="B">不满意</van-radio>
+                    <van-radio name="C">未接触</van-radio>
+                </van-radio-group>
+            </div>
+            <div v-show="answer['item' + item.key] === 'B'">
+                <p style="margin-top: 6px">{{ tailQuestions[index].label }}</p>
+                <van-checkbox-group v-model="answer['item' + (item.key + 1) + 'Arr']" direction="horizontal">
+                    <van-checkbox
+                            shape="square"
+                            v-for="child in (item.key === 11 ? checkboxOptions2 : checkboxOptions)"
+                            :key="child.key"
+                            :name="child.key"
+                            style="margin-top: 5px"
+                    >{{ child.label }}
+                    </van-checkbox>
+                </van-checkbox-group>
+            </div>
+        </div>
+        <div style="height: 20px"></div>
+        <van-button type="primary" block :disabled="disableSubmitButton" @click="submitAnswer">提交</van-button>
+    </window-size>
+</template>
+<script setup>
+import {reactive, ref} from "vue";
+import {submitInpatientSatisfiedAssessment} from '../../../api/assessments'
+import {Dialog} from "vant";
+import {useRouter} from "vue-router";
+
+const router = useRouter()
+const answer = reactive({
+    patientId: router.currentRoute.value.params.patientId
+})
+const disableSubmitButton = ref(false)
+
+const checkboxOptions1 = [
+    {key: 'A', label: '技术水平'},
+    {key: 'B', label: '隐私保护'},
+    {key: 'C', label: '服务态度'},
+    {key: 'D', label: '沟通解释'},
+    {key: 'E', label: '病情巡视'},
+    {key: 'F', label: '服装礼仪'},
+    {key: 'G', label: '其他'},
+]
+
+const checkboxOptions2 = [
+    {key: 'A', label: '技术水平'},
+    {key: 'B', label: '隐私保护'},
+    {key: 'C', label: '服务态度'},
+    {key: 'D', label: '沟通解释'},
+    {key: 'E', label: '按时查房'},
+    {key: 'F', label: '服装礼仪'},
+    {key: 'G', label: '其他'},
+]
+
+const checkboxOptions3 = [
+    {key: 'A', label: '卫生情况'},
+    {key: 'B', label: '布局不合理'},
+    {key: 'C', label: '服务态度'},
+    {key: 'D', label: '舒适度'},
+    {key: 'E', label: '按时清理'},
+    {key: 'F', label: '服装礼仪'},
+    {key: 'G', label: '其他'},
+]
+
+const checkboxOptions4 = [
+    {key: 'A', label: '卫生情况'},
+    {key: 'B', label: '口味'},
+    {key: 'C', label: '菜品'},
+    {key: 'D', label: '服务态度'},
+    {key: 'F', label: '服装礼仪'},
+    {key: 'G', label: '其他'},
+]
+
+const headQuestions = [
+    {key: 9, label: '5-1、您对药剂科工作人员服务满意吗?'},
+    {key: 11, label: '6-1、您对放射科工作人员服务满意吗?'},
+    {key: 13, label: '7-1、您对超声影像科工作人员服务满意吗?'},
+    {key: 15, label: '8-1、您对检验科工作人员服务满意吗?'},
+    {key: 17, label: '9-1、您对收费窗口工作人员服务满意吗?'},
+    {key: 19, label: '10-1、您对门急诊医护人员服务满意吗?'},
+]
+
+const tailQuestions = [
+    {key: 10, label: '5-2、您对药剂科工作人员哪些服务不满意?'},
+    {key: 12, label: '6-2、您对放射科工作人员哪些服务不满意?'},
+    {key: 14, label: '7-2、您对超声影像科工作人员哪些服务不满意?'},
+    {key: 16, label: '8-2、您对检验科工作人员哪些服务不满意?'},
+    {key: 18, label: '9-2、您对收费窗口工作人员哪些服务不满意?'},
+    {key: 20, label: '10-2、您对门急诊医护人员哪些服务不满意?'},
+]
+
+const checkboxOptions = [
+    {key: 'A', label: '叫号服务'},
+    {key: 'B', label: '等待时长'},
+    {key: 'C', label: '服务态度'},
+    {key: 'D', label: '沟通解释'},
+    {key: 'E', label: '及时响应'},
+    {key: 'F', label: '服装礼仪'},
+    {key: 'G', label: '准确率'},
+]
+
+const submitAnswer = () => {
+    submitInpatientSatisfiedAssessment(answer).then(res => {
+        disableSubmitButton.value = true
+        Dialog.alert({
+            title: '提示',
+            message: '提交成功!',
+        })
+    })
+}
+</script>
+
+<style scoped>
+.question-box {
+    padding: 6px 0 12px 6px;
+    border-bottom: 1px dashed gray;
+}
+</style>