InpatientSatisfiedAssessment.vue 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. <template>
  2. <window-size>
  3. <div v-for="(item, index) in headQuestions" :key="item.code" class="question-box">
  4. <p>{{index + 1}}-1、{{ item.label }}</p>
  5. <div style="margin-top: 4px">
  6. <van-radio-group v-model="answer[item.code]" direction="horizontal">
  7. <van-radio name="满意">满意</van-radio>
  8. <van-radio name="不满意">不满意</van-radio>
  9. <van-radio v-if="item.hasWjc" name="未接触">未接触</van-radio>
  10. </van-radio-group>
  11. </div>
  12. <div v-show="answer[item.code] === '不满意'">
  13. <p style="margin-top: 6px">{{ index + 1 }}-2、{{ tailQuestions[index] }}</p>
  14. <van-checkbox-group v-model="answer[item.code + 'BmyyyList']" direction="horizontal">
  15. <van-checkbox
  16. shape="square"
  17. v-for="child in getOptions(item.code)"
  18. :key="child"
  19. :name="child"
  20. style="margin-top: 5px"
  21. >{{ child }}
  22. </van-checkbox>
  23. </van-checkbox-group>
  24. <div class="m-input">其他:<input type="text" v-model="answer[item.code + 'Input']"></div>
  25. </div>
  26. </div>
  27. <div style="padding: 6px 6px 12px 6px; border-bottom: 1px dashed rgb(128,128,128)">
  28. <p>13-1、您选择我院的主要原因是什么?</p>
  29. <van-checkbox-group v-model="answer.xzwyyyList" direction="horizontal">
  30. <van-checkbox
  31. shape="square"
  32. v-for="child in xzwyyyXx"
  33. :key="child"
  34. :name="child"
  35. style="margin-top: 5px"
  36. >{{ child }}
  37. </van-checkbox>
  38. </van-checkbox-group>
  39. <div class="m-input">其他:<input type="text" v-model="answer.xzwyyyInput"></div>
  40. </div>
  41. <div style="padding: 6px 6px 12px 6px; border-bottom: 1px dashed rgb(128,128,128)">
  42. <p>14-1、如果您或亲朋好友需要医疗保健、治疗服务时,您会选择再来或推荐来吗?</p>
  43. <van-radio-group v-model="answer.sfhxzzl" direction="horizontal">
  44. <van-radio
  45. shape="square"
  46. v-for="child in hbhXx"
  47. :name="child"
  48. style="margin-top: 5px"
  49. >{{ child }}
  50. </van-radio>
  51. </van-radio-group>
  52. </div>
  53. <div style="padding: 6px 6px 12px 6px; border-bottom: 1px dashed rgb(128,128,128)">
  54. <p>15-1、请您对本次就诊的医疗服务全过程给予整体评价(1-10分)</p>
  55. <van-radio-group v-model="answer.ztpj" direction="horizontal">
  56. <van-radio
  57. shape="square"
  58. v-for="n in 10"
  59. :name="n"
  60. style="margin-top: 5px"
  61. >{{ n }}
  62. </van-radio>
  63. </van-radio-group>
  64. </div>
  65. <div style="padding: 6px 6px 12px 6px; border-bottom: 1px dashed rgb(128,128,128)">
  66. <p>您最满意的医生、护士是:</p>
  67. <div class="m-input">
  68. <input type="text" v-model="answer.zmydyshs">
  69. </div>
  70. </div>
  71. <div class="m-input" style="padding: 0 6px; margin-bottom: 20px">
  72. 您对我院的建议和意见:
  73. <input type="text" v-model="answer.dwydjyhyj" style="width: 100%">
  74. </div>
  75. <van-button type="primary" block :disabled="disableSubmitButton" @click="submitAnswer">提交</van-button>
  76. </window-size>
  77. </template>
  78. <script setup>
  79. import {onMounted, reactive, ref} from "vue";
  80. import {submitInpatientQuestionnaire} from '@/api/assessments'
  81. import {showDialog, showToast} from "vant";
  82. import {useRouter} from "vue-router";
  83. import {receiveAssessmentGift} from "@/api/coupon";
  84. const router = useRouter()
  85. const routerValue = router.currentRoute.value
  86. const routerParams = routerValue.params.visitId
  87. const couponGift = routerValue.path.indexOf('inpatientSatisfiedByPush') > -1
  88. && routerParams.indexOf('AND') > -1
  89. const answer = reactive({
  90. inpatientNo: null,
  91. times: null,
  92. patientId: null
  93. })
  94. const disableSubmitButton = ref(false)
  95. // 默认选项
  96. const mrXx = ['叫号服务', '等待时长', '服务态度', '沟通解释', '及时响应', '服装礼仪', '准确率']
  97. const zykshlXx = ['技术水平', '隐私保护', '服务态度', '沟通解释', '病情巡视', '服装礼仪', '其他']
  98. const zyksysXx = ['技术水平', '隐私保护', '服务态度', '沟通解释', '按时查房', '服装礼仪', '其他']
  99. const yystXx = ['卫生情况', '口味', '菜品', '服务态度', '服装礼仪', '其他']
  100. const ybkXx = ['专业能力', '等待时长', '服务态度', '沟通解释', '及时响应', '服装礼仪', '服务流程']
  101. const xzwyyyXx = ['慕名而来', '就近选择', '朋友推荐', '网络查询', '服务水平', '环境设备', '医疗价格']
  102. const hbhXx = ['会', '不会']
  103. const hjwxXx = ['食堂卫生', '门诊大厅卫生', '诊间卫生', '病房卫生', '卫生间卫生', '电梯卫生', '楼道卫生', '座椅卫生', '公共区域']
  104. const headQuestions = [
  105. {code: 'zykshl', label: '您对住院科室护理人员服务满意吗?'},
  106. {code: 'zyksys', label: '您对住院科室医生服务满意吗?'},
  107. {code: 'yyst', label: '您对医院食堂满意吗?', hasWjc: true},
  108. {code: 'yjk', label: '您对药剂科工作人员服务满意吗?', hasWjc: true},
  109. {code: 'fsk', label: '您对放射科工作人员服务满意吗?', hasWjc: true},
  110. {code: 'csyxk', label: '您对超声影像科工作人员服务满意吗?', hasWjc: true},
  111. {code: 'jyk', label: '您对检验科工作人员服务满意吗?', hasWjc: true},
  112. {code: 'sfck', label: '您对收费窗口工作人员服务满意吗?', hasWjc: true},
  113. {code: 'mzyh', label: '您对门诊医护人员服务满意吗?', hasWjc: true},
  114. {code: 'jzyh', label: '您对急诊医护人员服务满意吗?', hasWjc: true},
  115. {code: 'ybk', label: '您对医保科工作人员服务满意吗?', hasWjc: true},
  116. {code: 'yyhjws', label: '您对医院环境卫生满意吗?'}
  117. ]
  118. const tailQuestions = [
  119. '您对住院科室护理人员哪些服务不满意?',
  120. '您对住院科室医生哪些服务不满意?',
  121. '您对医院食堂哪些地方不满意?',
  122. '您对药剂科工作人员哪些服务不满意?',
  123. '您对放射科工作人员哪些服务不满意?',
  124. '您对超声影像科工作人员哪些服务不满意?',
  125. '您对检验科工作人员哪些服务不满意?',
  126. '您对收费窗口工作人员哪些服务不满意?',
  127. '您对门诊医护人员哪些服务不满意?',
  128. '您对急诊医护人员哪些服务不满意?',
  129. '您对医保科工作人员哪些服务不满意?',
  130. '您对医院环境卫生哪些地方不满意?'
  131. ]
  132. const submitAnswer = () => {
  133. if (!validAnswer()) {
  134. return
  135. }
  136. submitInpatientQuestionnaire(answer).then(() => {
  137. disableSubmitButton.value = true
  138. if (couponGift) {
  139. receiveAssessmentGift(routerParams).then((res) => {
  140. showDialog({
  141. title: '提示',
  142. message: res,
  143. }).then(() => {
  144. gotoResult()
  145. }).catch(() => {
  146. gotoResult()
  147. })
  148. }).catch(() => {
  149. gotoResult()
  150. })
  151. } else {
  152. gotoResult()
  153. }
  154. })
  155. }
  156. const gotoResult = () => {
  157. router.push({
  158. name: 'resultSuccess',
  159. params: {
  160. title: '提交成功',
  161. subtitle: '感谢您的评价,您的意见对我们非常重要。',
  162. },
  163. })
  164. }
  165. const keyList = [
  166. {key1: 'zykshl', key2: 'zykshlBmyyyList', key3: 'zykshlInput'},
  167. {key1: 'zyksys', key2: 'zyksysBmyyyList', key3: 'zyksysInput'},
  168. {key1: 'yyst', key2: 'yystBmyyyList', key3: 'yystInput'},
  169. {key1: 'yjk', key2: 'yjkBmyyyList', key3: 'yjkInput'},
  170. {key1: 'fsk', key2: 'yjkBmyyyList', key3: 'fskInput'},
  171. {key1: 'csyxk', key2: 'csyxkBmyyyList', key3: 'csyxkInput'},
  172. {key1: 'jyk', key2: 'jykBmyyyList', key3: 'jykInput'},
  173. {key1: 'sfck', key2: 'sfckBmyyyList', key3: 'sfckInput'},
  174. {key1: 'mzyh', key2: 'mzyhBmyyyList', key3: 'mzyhInput'},
  175. {key1: 'jzyh', key2: 'jzyhBmyyyList', key3: 'jzyhInput'},
  176. {key1: 'ybk', key2: 'ybkBmyyyList', key3: 'ybkInput'},
  177. {key1: 'yyhjws', key2: 'yyhjwsBmyyyList', key3: 'yyhjwsInput'},
  178. ]
  179. const validAnswer = () => {
  180. for (let i = 0; i < keyList.length; i++) {
  181. let keyObj = keyList[i]
  182. if (answer[keyObj.key1] === '不满意'
  183. && (!answer[keyObj.key2] || answer[keyObj.key2].length === 0)
  184. && !answer[keyObj.key3]) {
  185. showToast({
  186. message: `请补充或者勾选【${i + 1}-2】中您不满意的原因。`,
  187. position: 'top',
  188. duration: 3000,
  189. })
  190. return false
  191. }
  192. }
  193. if ((!answer.xzwyyyList || answer.xzwyyyList.length === 0) && !answer.xzwyyyInput) {
  194. showToast({
  195. message: `请补充或者勾选【13-1】中的选项。`,
  196. position: 'top',
  197. duration: 3000,
  198. })
  199. return false
  200. }
  201. if (!answer.sfhxzzl) {
  202. showToast({
  203. message: `请勾选【14-1】中的选项。`,
  204. position: 'top',
  205. duration: 3000,
  206. })
  207. return false
  208. }
  209. if (!answer.ztpj) {
  210. showToast({
  211. message: `请勾选【15-1】中的选项。`,
  212. position: 'top',
  213. duration: 3000,
  214. })
  215. return false
  216. }
  217. return true
  218. }
  219. function getOptions(code) {
  220. if (code === 'zykshl') {
  221. return zykshlXx
  222. } else if (code === 'zyksys') {
  223. return zyksysXx
  224. } else if (code === 'yyst') {
  225. return yystXx;
  226. } else if (code === 'fsk') {
  227. return zyksysXx;
  228. } else if (code === 'ybk') {
  229. return ybkXx;
  230. } else if (code === 'yyhjws') {
  231. return hjwxXx;
  232. } else {
  233. return mrXx;
  234. }
  235. }
  236. onMounted(() => {
  237. let visitIdArr = routerParams.split('AND')
  238. if (visitIdArr.length < 3) {
  239. answer.inpatientNo = 'unknown'
  240. answer.times = 0
  241. answer.patientId = routerParams
  242. } else {
  243. answer.inpatientNo = visitIdArr[0]
  244. answer.times = visitIdArr[1]
  245. answer.patientId = visitIdArr[2]
  246. }
  247. })
  248. </script>
  249. <style scoped>
  250. .question-box {
  251. padding: 6px 0 12px 6px;
  252. border-bottom: 1px dashed rgb(128, 128, 128);
  253. }
  254. .m-input {
  255. margin-top: 6px;
  256. }
  257. .m-input > input {
  258. border: none;
  259. width: 80%;
  260. height: 26px;
  261. border-bottom: 1px solid rgb(128, 128, 128);
  262. }
  263. </style>