ylyx-cli 1.0.14 → 1.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) hide show
  1. package/README.md +4 -0
  2. package/bin/ylyx.js +168 -168
  3. package/lib/config.js +283 -299
  4. package/lib/deploy.js +529 -415
  5. package/lib/generator.js +192 -192
  6. package/lib/index.js +113 -113
  7. package/lib/interactive.js +87 -87
  8. package/lib/remote.js +179 -179
  9. package/lib/template.js +174 -174
  10. package/lib/utils.js +148 -148
  11. package/package.json +5 -5
  12. package/templates/react-app/files/README.md +23 -23
  13. package/templates/react-app/files/package.json +28 -28
  14. package/templates/react-app/files/public/index.html +11 -11
  15. package/templates/react-app/files/src/App.css +15 -15
  16. package/templates/react-app/files/src/App.js +15 -15
  17. package/templates/react-app/files/src/index.css +10 -10
  18. package/templates/react-app/files/src/index.js +11 -11
  19. package/templates/react-app/template.json +11 -11
  20. package/templates/react-component/files/Component.module.css +5 -5
  21. package/templates/react-component/files/Component.tsx +31 -31
  22. package/templates/react-component/files/index.ts +2 -2
  23. package/templates/react-component/template.json +48 -48
  24. package/templates/vue-app/files/.editorconfig +14 -14
  25. package/templates/vue-app/files/.env.development +21 -21
  26. package/templates/vue-app/files/.env.production +18 -18
  27. package/templates/vue-app/files/.eslintignore +5 -5
  28. package/templates/vue-app/files/.eslintrc.js +267 -267
  29. package/templates/vue-app/files/.prettierignore +11 -11
  30. package/templates/vue-app/files/.travis.yml +5 -5
  31. package/templates/vue-app/files/.vscode/extensions.json +7 -7
  32. package/templates/vue-app/files/.vscode/settings.json +39 -39
  33. package/templates/vue-app/files/LICENSE +191 -191
  34. package/templates/vue-app/files/README.md +87 -87
  35. package/templates/vue-app/files/babel.config.js +11 -11
  36. package/templates/vue-app/files/jest.config.js +24 -24
  37. package/templates/vue-app/files/package.json +136 -136
  38. package/templates/vue-app/files/plopfile.js +7 -7
  39. package/templates/vue-app/files/postcss.config.js +5 -5
  40. package/templates/vue-app/files/public/default.js +25 -25
  41. package/templates/vue-app/files/public/index.html +26 -26
  42. package/templates/vue-app/files/src/App.vue +54 -54
  43. package/templates/vue-app/files/src/api/bigDataV/index.js +198 -198
  44. package/templates/vue-app/files/src/api/data.js +42 -42
  45. package/templates/vue-app/files/src/api/dataArchive/index.js +186 -186
  46. package/templates/vue-app/files/src/api/generator/genConfig.js +16 -16
  47. package/templates/vue-app/files/src/api/generator/generator.js +32 -32
  48. package/templates/vue-app/files/src/api/indexManagement/index.js +39 -39
  49. package/templates/vue-app/files/src/api/institutionMonitor/index.js +396 -396
  50. package/templates/vue-app/files/src/api/institutionSet/index.js +120 -120
  51. package/templates/vue-app/files/src/api/login.js +44 -44
  52. package/templates/vue-app/files/src/api/selfStatistics/index.js +50 -50
  53. package/templates/vue-app/files/src/api/system/code.js +15 -15
  54. package/templates/vue-app/files/src/api/system/dict.js +34 -34
  55. package/templates/vue-app/files/src/api/system/dictDetail.js +52 -52
  56. package/templates/vue-app/files/src/api/system/equipment.js +35 -35
  57. package/templates/vue-app/files/src/api/system/examManage.js +49 -49
  58. package/templates/vue-app/files/src/api/system/examProject.js +48 -48
  59. package/templates/vue-app/files/src/api/system/hosModel.js +35 -35
  60. package/templates/vue-app/files/src/api/system/hospital.js +88 -88
  61. package/templates/vue-app/files/src/api/system/job.js +40 -40
  62. package/templates/vue-app/files/src/api/system/menu.js +67 -67
  63. package/templates/vue-app/files/src/api/system/model.js +42 -42
  64. package/templates/vue-app/files/src/api/system/risConfig.js +9 -9
  65. package/templates/vue-app/files/src/api/system/role.js +64 -64
  66. package/templates/vue-app/files/src/api/system/sysSet.js +19 -19
  67. package/templates/vue-app/files/src/api/system/timing.js +41 -41
  68. package/templates/vue-app/files/src/api/system/user.js +121 -121
  69. package/templates/vue-app/files/src/api/tools/alipay.js +25 -25
  70. package/templates/vue-app/files/src/api/tools/email.js +24 -24
  71. package/templates/vue-app/files/src/api/tools/localStorage.js +27 -27
  72. package/templates/vue-app/files/src/api/tools/qiniu.js +40 -40
  73. package/templates/vue-app/files/src/assets/css/font-awesome.css +2342 -2342
  74. package/templates/vue-app/files/src/assets/css/font-awesome.min.css +2336 -2336
  75. package/templates/vue-app/files/src/assets/fonts/fontawesome-webfont.svg +2671 -2671
  76. package/templates/vue-app/files/src/assets/icons/index.js +9 -9
  77. package/templates/vue-app/files/src/assets/icons/svg/hospital.svg +1 -1
  78. package/templates/vue-app/files/src/assets/icons/svg/hospital1.svg +1 -1
  79. package/templates/vue-app/files/src/assets/icons/svg/loginOne.svg +35 -35
  80. package/templates/vue-app/files/src/assets/icons/svg/loginOneWhite.svg +19 -19
  81. package/templates/vue-app/files/src/assets/icons/svg/loginOr.svg +93 -93
  82. package/templates/vue-app/files/src/assets/icons/svg/loginUp.svg +96 -96
  83. package/templates/vue-app/files/src/assets/icons/svg/monitor.svg +1 -1
  84. package/templates/vue-app/files/src/assets/icons/svg/offline.svg +1 -1
  85. package/templates/vue-app/files/src/assets/icons/svg/online.svg +1 -1
  86. package/templates/vue-app/files/src/assets/icons/svg/system.svg +1 -1
  87. package/templates/vue-app/files/src/assets/icons/svgo.yml +21 -21
  88. package/templates/vue-app/files/src/assets/styles/btn.scss +103 -103
  89. package/templates/vue-app/files/src/assets/styles/eladmin.scss +124 -124
  90. package/templates/vue-app/files/src/assets/styles/element-ui.scss +217 -217
  91. package/templates/vue-app/files/src/assets/styles/element-variables.scss +31 -31
  92. package/templates/vue-app/files/src/assets/styles/global.scss +73 -73
  93. package/templates/vue-app/files/src/assets/styles/index.scss +220 -220
  94. package/templates/vue-app/files/src/assets/styles/mixin.scss +60 -60
  95. package/templates/vue-app/files/src/assets/styles/publicStyle.scss +224 -224
  96. package/templates/vue-app/files/src/assets/styles/sidebar.scss +239 -239
  97. package/templates/vue-app/files/src/assets/styles/transition.scss +48 -48
  98. package/templates/vue-app/files/src/assets/styles/variables.scss +44 -44
  99. package/templates/vue-app/files/src/common/flexible.js +145 -145
  100. package/templates/vue-app/files/src/components/Breadcrumb/index.vue +87 -87
  101. package/templates/vue-app/files/src/components/Crud/CRUD.operation.vue +248 -248
  102. package/templates/vue-app/files/src/components/Crud/Pagination.vue +20 -20
  103. package/templates/vue-app/files/src/components/Crud/RR.operation.vue +39 -39
  104. package/templates/vue-app/files/src/components/Crud/UD.operation.vue +106 -106
  105. package/templates/vue-app/files/src/components/Crud/crud.js +907 -907
  106. package/templates/vue-app/files/src/components/Crud/user/UR.operation.vue +154 -154
  107. package/templates/vue-app/files/src/components/DateRangePicker/index.vue +42 -42
  108. package/templates/vue-app/files/src/components/DateRangePickerProhibitNext/index.vue +42 -42
  109. package/templates/vue-app/files/src/components/DateRangePickerProhibitTodayNext/index.vue +48 -48
  110. package/templates/vue-app/files/src/components/Dict/Dict.js +31 -31
  111. package/templates/vue-app/files/src/components/Dict/index.js +29 -29
  112. package/templates/vue-app/files/src/components/Doc/index.vue +16 -16
  113. package/templates/vue-app/files/src/components/Echarts/BarChart.vue +115 -115
  114. package/templates/vue-app/files/src/components/Echarts/Category.vue +768 -768
  115. package/templates/vue-app/files/src/components/Echarts/Funnel.vue +120 -120
  116. package/templates/vue-app/files/src/components/Echarts/Gauge.vue +74 -74
  117. package/templates/vue-app/files/src/components/Echarts/Graph.vue +101 -101
  118. package/templates/vue-app/files/src/components/Echarts/HeatMap.vue +301 -301
  119. package/templates/vue-app/files/src/components/Echarts/Line3D.vue +110 -110
  120. package/templates/vue-app/files/src/components/Echarts/PieChart.vue +84 -84
  121. package/templates/vue-app/files/src/components/Echarts/Point.vue +161 -161
  122. package/templates/vue-app/files/src/components/Echarts/RadarChart.vue +123 -123
  123. package/templates/vue-app/files/src/components/Echarts/Rich.vue +160 -160
  124. package/templates/vue-app/files/src/components/Echarts/Sankey.vue +114 -114
  125. package/templates/vue-app/files/src/components/Echarts/Scatter.vue +192 -192
  126. package/templates/vue-app/files/src/components/Echarts/Sunburst.vue +127 -127
  127. package/templates/vue-app/files/src/components/Echarts/ThemeRiver.vue +233 -233
  128. package/templates/vue-app/files/src/components/Echarts/WordCloud.vue +201 -201
  129. package/templates/vue-app/files/src/components/GithubCorner/index.vue +55 -55
  130. package/templates/vue-app/files/src/components/Hamburger/index.vue +44 -44
  131. package/templates/vue-app/files/src/components/HeaderSearch/index.vue +196 -196
  132. package/templates/vue-app/files/src/components/IconSelect/index.vue +74 -74
  133. package/templates/vue-app/files/src/components/IconSelect/requireIcons.js +10 -10
  134. package/templates/vue-app/files/src/components/Iframe/index.vue +30 -30
  135. package/templates/vue-app/files/src/components/JavaEdit/index.vue +78 -78
  136. package/templates/vue-app/files/src/components/Pagination/index.vue +100 -100
  137. package/templates/vue-app/files/src/components/PanThumb/index.vue +149 -149
  138. package/templates/vue-app/files/src/components/ParentView/index.vue +3 -3
  139. package/templates/vue-app/files/src/components/Permission/index.js +13 -13
  140. package/templates/vue-app/files/src/components/Permission/permission.js +21 -21
  141. package/templates/vue-app/files/src/components/RightPanel/index.vue +149 -149
  142. package/templates/vue-app/files/src/components/Screenfull/index.vue +60 -60
  143. package/templates/vue-app/files/src/components/SizeSelect/index.vue +60 -60
  144. package/templates/vue-app/files/src/components/SvgIcon/index.vue +66 -66
  145. package/templates/vue-app/files/src/components/ThemePicker/index.vue +177 -177
  146. package/templates/vue-app/files/src/components/UploadExcel/index.vue +149 -149
  147. package/templates/vue-app/files/src/components/WaterMark/setWaterMark.js +68 -68
  148. package/templates/vue-app/files/src/components/WaterMark/waterMark.vue +69 -69
  149. package/templates/vue-app/files/src/components/Xgplayer/index.vue +49 -49
  150. package/templates/vue-app/files/src/components/YamlEdit/index.vue +81 -81
  151. package/templates/vue-app/files/src/layout/components/AppMain.vue +67 -67
  152. package/templates/vue-app/files/src/layout/components/Navbar.vue +209 -209
  153. package/templates/vue-app/files/src/layout/components/Settings/index.vue +125 -125
  154. package/templates/vue-app/files/src/layout/components/Sidebar/FixiOSBug.js +26 -26
  155. package/templates/vue-app/files/src/layout/components/Sidebar/Item.vue +29 -29
  156. package/templates/vue-app/files/src/layout/components/Sidebar/Link.vue +35 -35
  157. package/templates/vue-app/files/src/layout/components/Sidebar/Logo.vue +93 -93
  158. package/templates/vue-app/files/src/layout/components/Sidebar/SidebarItem.vue +104 -104
  159. package/templates/vue-app/files/src/layout/components/Sidebar/index.vue +79 -79
  160. package/templates/vue-app/files/src/layout/components/TagsView/ScrollPane.vue +90 -90
  161. package/templates/vue-app/files/src/layout/components/TagsView/index.vue +299 -299
  162. package/templates/vue-app/files/src/layout/components/index.js +5 -5
  163. package/templates/vue-app/files/src/layout/index.vue +119 -119
  164. package/templates/vue-app/files/src/layout/mixin/ResizeHandler.js +45 -45
  165. package/templates/vue-app/files/src/main.js +89 -89
  166. package/templates/vue-app/files/src/mixins/crud.js +348 -348
  167. package/templates/vue-app/files/src/router/index.js +156 -156
  168. package/templates/vue-app/files/src/router/routers.js +203 -203
  169. package/templates/vue-app/files/src/settings.js +57 -57
  170. package/templates/vue-app/files/src/store/getters.js +29 -29
  171. package/templates/vue-app/files/src/store/index.js +25 -25
  172. package/templates/vue-app/files/src/store/modules/api.js +33 -33
  173. package/templates/vue-app/files/src/store/modules/app.js +55 -55
  174. package/templates/vue-app/files/src/store/modules/permission.js +79 -79
  175. package/templates/vue-app/files/src/store/modules/register.js +17 -17
  176. package/templates/vue-app/files/src/store/modules/settings.js +46 -46
  177. package/templates/vue-app/files/src/store/modules/tagsView.js +168 -168
  178. package/templates/vue-app/files/src/store/modules/user.js +119 -119
  179. package/templates/vue-app/files/src/utils/auth.js +18 -18
  180. package/templates/vue-app/files/src/utils/base64ToFile.js +27 -27
  181. package/templates/vue-app/files/src/utils/clipboard.js +36 -36
  182. package/templates/vue-app/files/src/utils/datetime.js +289 -289
  183. package/templates/vue-app/files/src/utils/getBlobFile.js +10 -10
  184. package/templates/vue-app/files/src/utils/getTime.js +29 -29
  185. package/templates/vue-app/files/src/utils/index.js +520 -520
  186. package/templates/vue-app/files/src/utils/permission.js +29 -29
  187. package/templates/vue-app/files/src/utils/pinyin.js +450 -450
  188. package/templates/vue-app/files/src/utils/request.js +139 -139
  189. package/templates/vue-app/files/src/utils/rsaEncrypt.js +37 -37
  190. package/templates/vue-app/files/src/utils/shortcuts.js +210 -210
  191. package/templates/vue-app/files/src/utils/upload.js +12 -12
  192. package/templates/vue-app/files/src/utils/validate.js +262 -262
  193. package/templates/vue-app/files/src/views/components/Echarts.vue +124 -124
  194. package/templates/vue-app/files/src/views/components/Editor.vue +75 -75
  195. package/templates/vue-app/files/src/views/components/MarkDown.vue +44 -44
  196. package/templates/vue-app/files/src/views/components/UVideo.vue +37 -37
  197. package/templates/vue-app/files/src/views/components/YamlEdit.vue +206 -206
  198. package/templates/vue-app/files/src/views/components/camera/camera.vue +115 -115
  199. package/templates/vue-app/files/src/views/components/camera/cameraTest.vue +158 -158
  200. package/templates/vue-app/files/src/views/components/excel/upload-excel.vue +41 -41
  201. package/templates/vue-app/files/src/views/components/icons/element-icons.js +74 -74
  202. package/templates/vue-app/files/src/views/components/icons/index.vue +106 -106
  203. package/templates/vue-app/files/src/views/components/icons/svg-icons.js +10 -10
  204. package/templates/vue-app/files/src/views/components/scroll/index.vue +107 -107
  205. package/templates/vue-app/files/src/views/components/scrollFull/index.vue +99 -99
  206. package/templates/vue-app/files/src/views/dashboard/LineChart.vue +138 -138
  207. package/templates/vue-app/files/src/views/dashboard/PanelGroup.vue +173 -173
  208. package/templates/vue-app/files/src/views/dashboard/mixins/resize.js +57 -57
  209. package/templates/vue-app/files/src/views/dataArchive/delTable.vue +354 -354
  210. package/templates/vue-app/files/src/views/dataArchive/exportDetail.vue +121 -121
  211. package/templates/vue-app/files/src/views/dataArchive/exportList.vue +160 -160
  212. package/templates/vue-app/files/src/views/dataArchive/index.vue +2104 -2104
  213. package/templates/vue-app/files/src/views/features/401.vue +83 -83
  214. package/templates/vue-app/files/src/views/features/404.vue +226 -226
  215. package/templates/vue-app/files/src/views/features/redirect.vue +12 -12
  216. package/templates/vue-app/files/src/views/generator/config.vue +348 -348
  217. package/templates/vue-app/files/src/views/generator/index.vue +143 -143
  218. package/templates/vue-app/files/src/views/generator/preview.vue +39 -39
  219. package/templates/vue-app/files/src/views/home.vue +80 -80
  220. package/templates/vue-app/files/src/views/indexManagement/index.vue +422 -422
  221. package/templates/vue-app/files/src/views/indexManagement/other.vue +286 -286
  222. package/templates/vue-app/files/src/views/institutionMonitor/components/LineChart.vue +191 -191
  223. package/templates/vue-app/files/src/views/institutionMonitor/index.scss +339 -339
  224. package/templates/vue-app/files/src/views/institutionMonitor/index.vue +1385 -1385
  225. package/templates/vue-app/files/src/views/institutionMonitor/mixins/resize.js +57 -57
  226. package/templates/vue-app/files/src/views/institutionMonitor/monitorDetail/checkProjectCode.vue +267 -267
  227. package/templates/vue-app/files/src/views/institutionMonitor/monitorDetail/imageAbnormalMonitor.vue +361 -361
  228. package/templates/vue-app/files/src/views/institutionMonitor/monitorDetail/index.vue +686 -686
  229. package/templates/vue-app/files/src/views/institutionMonitor/monitorDetail/leakageAnomaly.vue +270 -270
  230. package/templates/vue-app/files/src/views/institutionMonitor/monitorDetail/moveMonitore.vue +114 -114
  231. package/templates/vue-app/files/src/views/institutionMonitor/monitorDetail/qualityMonitore.vue +338 -338
  232. package/templates/vue-app/files/src/views/institutionSet/cloudSet.vue +534 -534
  233. package/templates/vue-app/files/src/views/institutionSet/index.vue +2550 -2550
  234. package/templates/vue-app/files/src/views/login.vue +243 -243
  235. package/templates/vue-app/files/src/views/qualityLogin.vue +280 -280
  236. package/templates/vue-app/files/src/views/selfStatistics/components/LineChart.vue +296 -296
  237. package/templates/vue-app/files/src/views/selfStatistics/hospitalDetail/index.vue +533 -533
  238. package/templates/vue-app/files/src/views/selfStatistics/index.scss +447 -447
  239. package/templates/vue-app/files/src/views/selfStatistics/index.vue +903 -903
  240. package/templates/vue-app/files/src/views/selfStatistics/mixins/resize.js +57 -57
  241. package/templates/vue-app/files/src/views/selfStatistics/monitorDetail/index.vue +285 -285
  242. package/templates/vue-app/files/src/views/selfStatistics/offlineDetail/index.vue +104 -104
  243. package/templates/vue-app/files/src/views/selfStatistics/selfActiveDetail/index.vue +104 -104
  244. package/templates/vue-app/files/src/views/selfStatistics/selfMonitorDetail/index.vue +420 -420
  245. package/templates/vue-app/files/src/views/selfStatistics/setWaterMark/setWaterMark.js +68 -68
  246. package/templates/vue-app/files/src/views/selfStatistics/setWaterMark/waterMark.vue +69 -69
  247. package/templates/vue-app/files/src/views/system/dept/index.vue +144 -144
  248. package/templates/vue-app/files/src/views/system/dict/dictDetail.vue +146 -146
  249. package/templates/vue-app/files/src/views/system/dict/index.vue +159 -159
  250. package/templates/vue-app/files/src/views/system/examModality/index.vue +174 -174
  251. package/templates/vue-app/files/src/views/system/examPart/index.vue +184 -184
  252. package/templates/vue-app/files/src/views/system/examProject/index.vue +321 -321
  253. package/templates/vue-app/files/src/views/system/examine/index.vue +66 -66
  254. package/templates/vue-app/files/src/views/system/job/index.vue +119 -119
  255. package/templates/vue-app/files/src/views/system/job/module/form.vue +72 -72
  256. package/templates/vue-app/files/src/views/system/job/module/header.vue +48 -48
  257. package/templates/vue-app/files/src/views/system/menu/index.vue +327 -327
  258. package/templates/vue-app/files/src/views/system/model/index.vue +285 -285
  259. package/templates/vue-app/files/src/views/system/role/index.vue +434 -434
  260. package/templates/vue-app/files/src/views/system/sysSet/index.vue +84 -84
  261. package/templates/vue-app/files/src/views/system/timing/index.vue +289 -289
  262. package/templates/vue-app/files/src/views/system/timing/log.vue +143 -143
  263. package/templates/vue-app/files/src/views/system/user/admin.vue +414 -414
  264. package/templates/vue-app/files/src/views/system/user/center/updateEmail.vue +146 -146
  265. package/templates/vue-app/files/src/views/system/user/center/updatePass.vue +168 -168
  266. package/templates/vue-app/files/src/views/system/user/center.vue +140 -140
  267. package/templates/vue-app/files/src/views/system/user/index.vue +972 -972
  268. package/templates/vue-app/files/src/views/systemSet/role/index.vue +314 -314
  269. package/templates/vue-app/files/src/views/systemSet/user/admin.vue +414 -414
  270. package/templates/vue-app/files/src/views/systemSet/user/center/updateEmail.vue +146 -146
  271. package/templates/vue-app/files/src/views/systemSet/user/center/updatePass.vue +115 -115
  272. package/templates/vue-app/files/src/views/systemSet/user/center.vue +351 -351
  273. package/templates/vue-app/files/src/views/systemSet/user/index.vue +928 -928
  274. package/templates/vue-app/files/src/views/tools/aliPay/config.vue +102 -102
  275. package/templates/vue-app/files/src/views/tools/aliPay/index.vue +48 -48
  276. package/templates/vue-app/files/src/views/tools/aliPay/toPay.vue +91 -91
  277. package/templates/vue-app/files/src/views/tools/email/config.vue +91 -91
  278. package/templates/vue-app/files/src/views/tools/email/index.vue +42 -42
  279. package/templates/vue-app/files/src/views/tools/email/send.vue +159 -159
  280. package/templates/vue-app/files/src/views/tools/storage/index.vue +35 -35
  281. package/templates/vue-app/files/src/views/tools/storage/local/index.vue +207 -207
  282. package/templates/vue-app/files/src/views/tools/storage/qiniu/form.vue +108 -108
  283. package/templates/vue-app/files/src/views/tools/storage/qiniu/index.vue +241 -241
  284. package/templates/vue-app/files/src/views/tools/swagger/index.vue +14 -14
  285. package/templates/vue-app/files/vue.config.js +173 -173
  286. package/templates/vue-app/template.json +29 -29
@@ -1,2104 +1,2104 @@
1
- <template>
2
- <div class="app-container" ref="dataArchiveContainer">
3
- <!--工具栏-->
4
- <div class="head-container" ref="fixedDiv" style="width: calc(100%)">
5
- <div class="query-container" v-if="crud.props.searchToggle">
6
- <el-form :inline="true" :model="query" class="demo-form-dataArchive" size="small">
7
- <el-form-item prop="address">
8
- <!-- 区域 -->
9
- <el-cascader
10
- v-model="query.address"
11
- clearable
12
- placeholder="机构地区"
13
- :options="provinceList"
14
- :props="props"
15
- @active-item-change="handleItemChange"
16
- @change="addressChange">
17
- </el-cascader>
18
- </el-form-item>
19
- <el-form-item>
20
- <el-input
21
- v-model="query.patientId"
22
- size="small"
23
- clearable
24
- @clear="crud.toQuery"
25
- placeholder="请输入患者编号"
26
- style="width: 150px"
27
- class="filter-item"
28
- @keyup.enter.native="crud.toQuery" />
29
- </el-form-item>
30
- <el-form-item>
31
- <el-input
32
- v-model="query.accessNumber"
33
- size="small"
34
- clearable
35
- @clear="crud.toQuery"
36
- placeholder="请输入检查编号"
37
- style="width: 150px"
38
- class="filter-item"
39
- @keyup.enter.native="crud.toQuery" />
40
- </el-form-item>
41
- <el-form-item>
42
- <el-input
43
- v-model="query.patientName"
44
- size="small"
45
- clearable
46
- @clear="crud.toQuery"
47
- placeholder="请输入姓名"
48
- style="width: 150px"
49
- class="filter-item"
50
- @keyup.enter.native="crud.toQuery" />
51
- </el-form-item>
52
- <el-form-item>
53
- <el-input
54
- v-model="query.mobilePhone"
55
- size="small"
56
- @clear="crud.toQuery"
57
- placeholder="请输入手机号"
58
- style="width: 150px"
59
- class="filter-item"
60
- @keyup.enter.native="crud.toQuery" />
61
- </el-form-item>
62
- <el-form-item>
63
- <el-input
64
- v-model="query.idCardNo"
65
- size="small"
66
- clearable
67
- @clear="crud.toQuery"
68
- placeholder="请输入患者身份证号"
69
- style="width: 180px"
70
- class="filter-item"
71
- @keyup.enter.native="crud.toQuery" />
72
- </el-form-item>
73
- <el-form-item>
74
- <el-input
75
- v-model="query.studyUid"
76
- size="small"
77
- clearable
78
- @clear="crud.toQuery"
79
- placeholder="请输入studyUid"
80
- style="width: 150px"
81
- class="filter-item"
82
- @keyup.enter.native="crud.toQuery" />
83
- </el-form-item>
84
- <el-form-item>
85
- <el-input
86
- v-model="query.modality"
87
- size="small"
88
- clearable
89
- @clear="crud.toQuery"
90
- placeholder="请输入检查模式"
91
- style="width: 160px"
92
- class="filter-item"
93
- @keyup.enter.native="crud.toQuery" />
94
- </el-form-item>
95
- <el-form-item>
96
- <el-input
97
- v-model="query.examBodyPart"
98
- size="small"
99
- clearable
100
- @clear="crud.toQuery"
101
- placeholder="请输入检查部位"
102
- style="width: 160px"
103
- class="filter-item"
104
- @keyup.enter.native="crud.toQuery" />
105
- </el-form-item>
106
- <el-form-item>
107
- <el-input
108
- v-model="query.examItemName"
109
- size="small"
110
- clearable
111
- @clear="crud.toQuery"
112
- placeholder="请输入检查项目"
113
- style="width: 160px"
114
- class="filter-item"
115
- @keyup.enter.native="crud.toQuery" />
116
- </el-form-item>
117
- <el-form-item> </el-form-item>
118
- <el-form-item>
119
- <el-input
120
- v-model="query.urlKey"
121
- clearable
122
- @clear="crud.toQuery"
123
- type="number"
124
- placeholder="请输入urlKey"
125
- style="width: 160px"
126
- class="filter-item"
127
- @keyup.enter.native="crud.toQuery" />
128
- </el-form-item>
129
- <el-form-item>
130
- <el-input
131
- v-model="query.applicationId"
132
- clearable
133
- @clear="crud.toQuery"
134
- placeholder="请输入申请单ID"
135
- style="width: 160px"
136
- class="filter-item"
137
- @keyup.enter.native="crud.toQuery" />
138
- </el-form-item>
139
- <el-form-item>
140
- <el-input
141
- v-model="query.studyOrderId"
142
- clearable
143
- @clear="crud.toQuery"
144
- placeholder="请输入检查医嘱ID"
145
- style="width: 160px"
146
- class="filter-item"
147
- @keyup.enter.native="crud.toQuery" />
148
- </el-form-item>
149
- <el-form-item prop="isOss">
150
- <el-select
151
- v-model="query.isOss"
152
- clearable
153
- placeholder="图像状态"
154
- class="filter-item"
155
- style="width: 160px"
156
- @change="crud.toQuery">
157
- <el-option
158
- v-for="item in dict.is_oss"
159
- :key="item.value"
160
- :label="item.label"
161
- :value="item.value" />
162
- </el-select>
163
- </el-form-item>
164
- <el-form-item label="检查机构:">
165
- <el-select
166
- v-model="query.hosId"
167
- placeholder="请选择"
168
- filterable
169
- remote
170
- clearable
171
- reserve-keyword
172
- :remote-method="remoteMethod"
173
- :loading="loading"
174
- style="width: 160px"
175
- size="small"
176
- @focus="clear"
177
- @hook:mounted="clear"
178
- @visible-change="clear"
179
- ref="select">
180
- <el-option
181
- v-for="(item, index) in options"
182
- :key="index"
183
- :label="item.hospitalName"
184
- :value="item.hospitalId">
185
- </el-option>
186
- </el-select>
187
- </el-form-item>
188
- <el-form-item label="检查时间:">
189
- <date-range-picker
190
- style="width: 300px; height: 34px"
191
- startPlaceholder="开始检查时间"
192
- endPlaceholder="结束检查时间"
193
- @change="crud.toQuery"
194
- :clearable="false"
195
- v-model="query.checkTime"
196
- unlink-panels />
197
- </el-form-item>
198
- <el-form-item>
199
- <el-button @click="crud.toQuery" class="filter-item" size="small">查询</el-button>
200
- <el-button @click="ResetClick" class="filter-item" size="small" style="margin-left: 5px"
201
- >重置</el-button
202
- >
203
- <el-button
204
- @click="exportExcel"
205
- v-if="checkPer(permission.export)"
206
- class="filter-item"
207
- size="small"
208
- style="margin-left: 5px"
209
- >导出</el-button
210
- >
211
- <el-button @click="exportLog" class="filter-item" size="small" style="margin-left: 5px"
212
- >导出日志</el-button
213
- >
214
- </el-form-item>
215
- <!-- 搜索 -->
216
- </el-form>
217
- <div>
218
- <el-button
219
- size="medium"
220
- type="primary"
221
- v-if="checkPer(permission.editUrlKey)"
222
- @click="editUrlKey"
223
- >修改urlKey
224
- </el-button>
225
- <el-button size="medium" type="danger" v-if="checkPer(permission.del)" @click="delAction"
226
- >删除</el-button
227
- >
228
- <el-button
229
- size="medium"
230
- type="info"
231
- v-if="checkPer(permission.delList)"
232
- @click="delRecordsShow"
233
- >删除记录</el-button
234
- >
235
- </div>
236
- </div>
237
- <crudOperation :permission="permission" />
238
- </div>
239
- <!--表单渲染-->
240
- <el-dialog
241
- :title="
242
- showReport ? '浏览报告' : showQRCode ? '二维码' : showUrlKey ? '修改urlKey' : '删除记录'
243
- "
244
- :visible.sync="dataArchiveVisible"
245
- style="min-width: 300px"
246
- :width="showReport ? '55%' : showUrlKey || showQRCode ? '500px' : '80%'"
247
- :before-close="handleClose"
248
- append-to-body
249
- :top="showQRCode ? '10vh' : '3vh'"
250
- @open="dialogOpen"
251
- @close="dialogClose">
252
- <div v-if="showReport">
253
- <el-row>
254
- <el-col :span="24"
255
- ><h3 style="text-align: center">
256
- {{ this.currentRow.applyHospitalName || this.empty }}
257
- </h3>
258
- </el-col>
259
- </el-row>
260
- <el-row class="patientDetail">
261
- <el-col :span="8"
262
- ><span>姓名:</span>{{ this.currentRow.patientName || this.empty }}</el-col
263
- >
264
- <el-col :span="8"
265
- ><span>性别:</span>{{ this.currentRow.patientSex || this.empty }}</el-col
266
- >
267
- <el-col :span="8"
268
- ><span>年龄:</span>{{ this.currentRow.patientAge || this.empty }}</el-col
269
- >
270
- </el-row>
271
- <el-row class="patientDetail">
272
- <el-col :span="8"
273
- ><span>申请科室:</span>{{ this.currentRow.applyOffice || this.empty }}</el-col
274
- >
275
- <el-col :span="8"
276
- ><span>患者类型:</span>{{ this.currentRow.patientType || this.empty }}</el-col
277
- >
278
- <el-col :span="8"
279
- ><span>检查编号:</span>{{ this.currentRow.accessNumber || this.empty }}</el-col
280
- >
281
- </el-row>
282
- <el-row class="patientDetail">
283
- <el-col :span="8"
284
- ><span>检查部位:</span>{{ this.currentRow.examBodyPart || this.empty }}</el-col
285
- >
286
- <el-col :span="8">
287
- <span>检查项目:</span>
288
- <span v-if="currentRow.examItemName">
289
- <span
290
- v-for="(item, index) in currentRow.examItemName"
291
- :key="index"
292
- style="font-weight: normal">
293
- {{ item }}<span v-if="index != currentRow.examItemName.length - 1">,</span>
294
- </span>
295
- </span>
296
- <span v-else>{{ this.empty }}</span>
297
- </el-col>
298
- <el-col :span="8"
299
- ><span>检查时间:</span>{{ this.currentRow.patientCheckDate || this.empty }}</el-col
300
- >
301
- </el-row>
302
- <el-row>
303
- <el-col :span="24" class="paddingClass"><h3>检查所见</h3></el-col>
304
- </el-row>
305
- <el-row>
306
- <el-col class="paddingClass" :span="24">
307
- <p>{{ this.currentRow.firExamFindings || this.empty }}</p></el-col
308
- >
309
- </el-row>
310
- <el-row>
311
- <el-col :span="24" class="paddingClass"><h3>检查印象</h3></el-col>
312
- </el-row>
313
- <el-row>
314
- <el-col :span="24" class="paddingClass">
315
- <p>{{ this.currentRow.firExamImpression || this.empty }}</p></el-col
316
- >
317
- </el-row>
318
- <el-row class="patientDetail">
319
- <el-col :span="8"
320
- ><span>报告医生:</span
321
- ><span>{{ this.currentRow.firstRepDocName || this.empty }}</span></el-col
322
- >
323
- <el-col :span="8"
324
- ><span>审核医生:</span
325
- ><span>{{ this.currentRow.audiRepDocName || this.empty }}</span></el-col
326
- >
327
- <el-col :span="8"
328
- ><span>审核时间:</span
329
- ><span>{{ this.currentRow.auditRepTime || this.empty }}</span></el-col
330
- >
331
- </el-row>
332
- </div>
333
- <div v-else-if="showQRCode">
334
- <div style="padding: 0 20px">
335
- <p style="font-size: 15px; line-height: 1.75em">
336
- 检查项目:<span v-if="currentRow.examItemName">
337
- <span
338
- v-for="(item, index) in currentRow.examItemName"
339
- :key="index"
340
- style="font-weight: normal">
341
- {{ item }}<span v-if="index != currentRow.examItemName.length - 1">,</span>
342
- </span>
343
- </span>
344
- <span v-else>{{ this.empty }}</span>
345
- </p>
346
- <p style="font-size: 15px; line-height: 1.75em">
347
- 检查时间:{{ this.currentRow.patientCheckDate || this.empty }}
348
- </p>
349
- </div>
350
-
351
- <div class="scanImg">
352
- <div class="qrcode">
353
- <div>
354
- <img :src="scanString[1]" />
355
- <span>无校验二维码</span>
356
- </div>
357
- <div>
358
- <img :src="scanString[0]" />
359
- <span>校验二维码</span>
360
- </div>
361
- </div>
362
- </div>
363
- </div>
364
- <div v-else-if="showUrlKey">
365
- <el-form
366
- :model="ruleForm"
367
- :rules="rules"
368
- ref="ruleForm"
369
- label-width="0"
370
- class="demo-ruleForm">
371
- <el-form-item label="" prop="urlKey">
372
- <el-input v-model="ruleForm.urlKey" placeholder="请输Url Key"></el-input>
373
- <div class="showUrlKeyWarn">
374
- <i class="el-icon-warning"></i>
375
- 修改Key值可能会导致看图错误,请谨慎修改!
376
- </div>
377
- </el-form-item>
378
- </el-form>
379
- </div>
380
- <div v-else>
381
- <delTable v-if="delTableShow" ref="delTable" />
382
- </div>
383
- <span slot="footer" class="dialog-footer" v-if="showUrlKey">
384
- <el-button @click="dataArchiveVisible = false">取 消</el-button>
385
- <el-button type="primary" @click="dialogSubmit">确 定</el-button>
386
- </span>
387
- </el-dialog>
388
- <!--表格渲染-->
389
- <div class="box-card" ref="dataArchiveTable">
390
- <el-popover
391
- popper-class="popoverCollapsemedical"
392
- placement="bottom"
393
- width="200"
394
- trigger="click">
395
- <el-form style="max-height: 50vh; overflow: auto">
396
- <el-form-item style="margin-bottom: 0">
397
- <!-- :disabled="index == 0" -->
398
- <el-checkbox
399
- @change="inkured"
400
- :disabled="item.prop == 'accessNumber'"
401
- v-for="(item, index) in tableHeader"
402
- :key="index"
403
- v-model="item.isShow">
404
- <p style="margin: 2px 0">{{ item.label }}</p>
405
- </el-checkbox>
406
- </el-form-item>
407
- </el-form>
408
- <el-button slot="reference" size="small" style="margin-bottom: 10px" class="el-icon-s-grid">
409
- <i class="el-icon-arrow-down el-icon--right"></i>
410
- </el-button>
411
- </el-popover>
412
- <el-table
413
- ref="multipleTable"
414
- v-loading="crud.loading"
415
- lazy
416
- :data="crud.data"
417
- :cell-style="{ textAlign: 'center' }"
418
- :header-cell-style="{ textAlign: 'center' }"
419
- :tree-props="{ children: 'flag', hasChildren: 'flag' }"
420
- :row-key="getRowKeys"
421
- @current-change="handleCurrentChange"
422
- @select="crud.selectChange"
423
- @select-all="crud.selectAllChange"
424
- @selection-change="handleSelectionChange"
425
- :max-height="tableHeight">
426
- <el-table-column fixed="" type="selection" width="55"> </el-table-column>
427
- <el-table-column fixed label="序号" type="index" align="center">
428
- <template slot-scope="scope">
429
-  <span>{{ (crud.page.page - 1) * crud.page.size + scope.$index + 1 }}</span>
430
- </template>
431
- </el-table-column>
432
- <el-table-column
433
- :show-overflow-tooltip="true"
434
- v-for="(item, index) in bindTableColumns"
435
- :key="index + '-bindTableColumns'"
436
- align="center"
437
- :label="item.label"
438
- :prop="item.prop"
439
- :min-width="item.width"
440
- :sortable="item.sortable">
441
- <template slot-scope="scope">
442
- <span v-if="item.prop == 'standardProjectName'">
443
- <ul v-if="scope.row.standardProjectName">
444
- <li v-for="(item, index) in scope.row.standardProjectName" :key="index">
445
- {{ item }}
446
- </li>
447
- </ul>
448
- <span v-else>-</span>
449
- </span>
450
- <span v-else-if="item.prop == 'standardProjectCode'">
451
- <ul v-if="scope.row.standardProjectCode">
452
- <li v-for="(item, index) in scope.row.standardProjectCode" :key="index">
453
- {{ item }}
454
- </li>
455
- </ul>
456
- <span v-else>-</span>
457
- </span>
458
- <span v-else-if="item.prop == 'examItemName'">
459
- <ul v-if="scope.row.examItemName">
460
- <li v-for="(item, index) in scope.row.examItemName" :key="index">
461
- {{ item }}
462
- </li>
463
- </ul>
464
- <span v-else>-</span>
465
- </span>
466
- <span v-else-if="item.prop == 'examItemCode'">
467
- <ul v-if="scope.row.examItemCode">
468
- <li v-for="(item, index) in scope.row.examItemCode" :key="index">
469
- {{ item }}
470
- </li>
471
- </ul>
472
- <span v-else>-</span>
473
- </span>
474
- <span v-else>
475
- {{ scope.row[item.prop] || empty }}
476
- </span>
477
- </template>
478
- </el-table-column>
479
-
480
- <el-table-column label="操作" width="250px" fixed="right">
481
- <template slot-scope="scope">
482
- <el-button type="text" size="mini" @click="showReportDetail">报告</el-button>
483
-
484
- <el-button
485
- type="text"
486
- size="mini"
487
- v-if="checkPer(permission.downLoad)"
488
- :disabled="scope.row.isOss == 1 || scope.row.isOss == 5"
489
- @click="operateDonwnLoad(scope.row)"
490
- >下载</el-button
491
- >
492
-
493
- <el-button
494
- type="text"
495
- size="mini"
496
- v-if="scope.row.isOss == 1"
497
- @click="getImage(scope.row)">
498
- <span style="color: #ff7e00"> 获取图像</span>
499
- </el-button>
500
- <el-button type="text" size="mini" :disabled="true" v-if="scope.row.isOss == 5">
501
- 正在获取
502
- </el-button>
503
- <el-button
504
- type="text"
505
- size="mini"
506
- @click="imageBrower(scope.row)"
507
- v-if="scope.row.isOss == 2 || scope.row.isOss == 0">
508
- 浏览图像
509
- </el-button>
510
-
511
- <el-dropdown>
512
- <span class="el-dropdown-link">
513
- 更多<i class="el-icon-arrow-down el-icon--right"></i>
514
- </span>
515
- <el-dropdown-menu slot="dropdown">
516
- <el-dropdown-item>
517
- <el-button
518
- type="text"
519
- style="width: 100%"
520
- size="mini"
521
- @click="getUpdate(scope.row)"
522
- v-if="checkPer(permission.editInfo)"
523
- >修改信息</el-button
524
- >
525
- </el-dropdown-item>
526
- <el-dropdown-item>
527
- <el-button type="text" size="mini" @click="showQRCodeDetail(scope.row)"
528
- >二维码</el-button
529
- >
530
- </el-dropdown-item>
531
- <el-dropdown-item>
532
- <el-button
533
- type="text"
534
- size="mini"
535
- v-if="checkPer(permission.SMSnotice)"
536
- @click="SMSnotice(scope.row)">
537
- 短信通知
538
- </el-button>
539
- </el-dropdown-item>
540
- <el-dropdown-item>
541
- <el-button type="text" size="mini" @click="checkReport(scope.row, 1)">
542
- 电子报告
543
- </el-button>
544
- </el-dropdown-item>
545
- <el-dropdown-item>
546
- <el-button type="text" size="mini" @click="checkReport(scope.row, 2)">
547
- 电子胶片
548
- </el-button>
549
- </el-dropdown-item>
550
- </el-dropdown-menu>
551
- </el-dropdown>
552
- </template>
553
- </el-table-column>
554
- </el-table>
555
- <!--分页组件-->
556
- <pagination />
557
- </div>
558
- <el-dialog
559
- title="修改患者信息"
560
- :visible.sync="updateInfoShow"
561
- width="400px"
562
- top="6vh"
563
- :before-close="beforeClose">
564
- <div class="warning">
565
- <span class="el-icon-warning"></span>
566
- <span>修改患者信息可能会导致无法查看图像,请谨慎修改!</span>
567
- </div>
568
- <!-- :rules="rules" -->
569
- <el-form
570
- :inline="true"
571
- :model="form"
572
- class="form-inline-hospital"
573
- size="small"
574
- ref="form"
575
- label-position="right"
576
- label-width="100px">
577
- <el-form-item prop="patientName" label="患者姓名">
578
- <el-input
579
- v-model="form.patientName"
580
- type="text"
581
- auto-complete="off"
582
- placeholder="请输入患者姓名">
583
- </el-input>
584
- </el-form-item>
585
- <el-form-item prop="mobilePhone" label="手机号">
586
- <el-input
587
- v-model="form.mobilePhone"
588
- type="text"
589
- auto-complete="off"
590
- placeholder="请输入手机号">
591
- </el-input>
592
- </el-form-item>
593
- <el-form-item prop="idCardNo" label="身份证号">
594
- <el-input
595
- v-model="form.idCardNo"
596
- type="text"
597
- auto-complete="off"
598
- placeholder="请输入身份证号">
599
- </el-input>
600
- </el-form-item>
601
- <el-form-item prop="examItemCode" label="检查项目编码">
602
- <el-input
603
- v-model="form.examItemCode"
604
- type="textarea"
605
- autosize
606
- auto-complete="off"
607
- placeholder="请输入检查项目编码">
608
- </el-input>
609
- </el-form-item>
610
- </el-form>
611
- <span slot="footer" class="dialog-footer">
612
- <el-button @click="beforeClose">取消</el-button>
613
- <el-button type="primary" @click="sureUpdate">确认</el-button>
614
- </span>
615
- </el-dialog>
616
- <el-dialog title="下载" :visible.sync="downLoadShow" width="25%" :before-close="beforeClose1">
617
- <div class="download">
618
- <div @click="openHref">
619
- <p>链接:</p>
620
- <span class="hover">{{ pramsUrl.shortUrl }}</span>
621
- <el-button type="text" style="margin-left: 15%">打开</el-button>
622
- </div>
623
- <div>
624
- <p>提取码:</p>
625
- <span id="text">{{ pramsUrl.vfCode }}</span>
626
- <el-button
627
- type="text"
628
- style="margin-left: 5%"
629
- data-clipboard-target="#text"
630
- @click="btnCopy"
631
- class="btn"
632
- >复制</el-button
633
- >
634
- </div>
635
- <div>
636
- <p>有效期:</p>
637
- <span>{{ pramsUrl.validityTime }}</span>
638
- </div>
639
- </div>
640
- <span slot="footer" class="dialog-footer">
641
- <el-button type="primary" @click="beforeClose1">确认</el-button>
642
- </span>
643
- </el-dialog>
644
- <!-- 短信通知 -->
645
- <el-dialog title="短信通知" :visible.sync="SMSnoticeShow" width="30%" @close="closeSMS">
646
- <div class="SMSnoticeStyle">
647
- <div>检查机构:{{ SMSnoticeObj.applyHospitalName || '-' }}</div>
648
- <div>检查编号:{{ SMSnoticeObj.accessNumber || '-' }}</div>
649
- <div>手机号码:{{ SMSnoticeObj.mobilePhone || '-' }}</div>
650
- </div>
651
- <span slot="footer" class="dialog-footer">
652
- <el-button size="small" @click="closeSMS">取 消</el-button>
653
- <el-button size="small" type="primary" @click="submitSMSnotice">确 定</el-button>
654
- </span>
655
- </el-dialog>
656
- <!-- 收费状态 -->
657
- <el-dialog
658
- title="修改收费状态"
659
- :visible.sync="chargeStatusShow"
660
- width="30%"
661
- @close="closecharge">
662
- <div class="SMSnoticeStyle">
663
- <el-select
664
- v-model="isImageService"
665
- clearable
666
- placeholder="收费状态"
667
- class="filter-item"
668
- style="width: 100%">
669
- <el-option
670
- v-for="item in dict.dataCharge_status"
671
- :key="item.value"
672
- :label="item.label"
673
- :value="item.value" />
674
- </el-select>
675
- <div class="warningStyle">
676
- <div>
677
- <i class="el-icon-warning warning-icon"
678
- >修改收费状态可能会导致收费数据不一致,请谨慎修改!</i
679
- >
680
- </div>
681
- </div>
682
- </div>
683
- <span slot="footer" class="dialog-footer">
684
- <el-button size="small" @click="closecharge">取 消</el-button>
685
- <el-button size="small" type="primary" @click="updateIsImageService">确 定</el-button>
686
- </span>
687
- </el-dialog>
688
- <el-dialog title="验证手机" :visible.sync="validateShow" width="400px" @close="closeValidate">
689
- <div class="phone-box">
690
- <el-form
691
- :inline="true"
692
- :model="validateForm"
693
- class="form-inline-hospital"
694
- size="small"
695
- ref="validateForm"
696
- :rules="rules"
697
- label-position="right"
698
- label-width="100px">
699
- <el-form-item prop="mobilePhone" label="手机号">
700
- <el-input
701
- v-model="validateForm.mobilePhone"
702
- type="text"
703
- auto-complete="off"
704
- placeholder="请输入手机号"
705
- disabled>
706
- </el-input>
707
- </el-form-item>
708
- <el-form-item prop="code" label="验证码" style="width: 100%">
709
- <el-input
710
- v-model="validateForm.code"
711
- type="text"
712
- auto-complete="off"
713
- placeholder="请输入验证码"
714
- style="width: 58%">
715
- </el-input>
716
- <el-button
717
- type="primary"
718
- :disabled="canClick"
719
- @click="getCode"
720
- size="small"
721
- style="width: 40%"
722
- >{{ btnText }}</el-button
723
- >
724
- </el-form-item>
725
- </el-form>
726
- </div>
727
- <span slot="footer" class="dialog-footer">
728
- <el-button size="small" @click="closeValidate">取 消</el-button>
729
- <el-button size="small" :loading="downloadLoading" type="primary" @click="sureExport"
730
- >确 定</el-button
731
- >
732
- </span>
733
- </el-dialog>
734
- <!-- 电子报告 -->
735
- <el-dialog
736
- :visible.sync="imageReportShow"
737
- custom-class="report-dialog"
738
- top="5vh"
739
- width="70%"
740
- @close="closeReport">
741
- <span slot="title" class="dialog-footer">
742
- <span>{{ imageTitle }}</span>
743
- </span>
744
- <div class="checkReportImage">
745
- <el-image
746
- v-if="imageArray.length > 0"
747
- :src="currentImage"
748
- :preview-src-list="[currentImage]">
749
- </el-image>
750
-
751
- <p v-else>{{ loadingText }}</p>
752
- </div>
753
- <span slot="footer" class="dialog-footer">
754
- <div class="footer-left">
755
- <el-button @click="prevImage" :disabled="currentIndex === 1">上一页</el-button>
756
- <p>
757
- <span>{{ currentIndex }}</span
758
- >/{{ imageArray.length }}
759
- </p>
760
- <el-button @click="nextImage" :disabled="currentIndex === imageArray.length">
761
- 下一页
762
- </el-button>
763
- </div>
764
-
765
- <el-button size="small" type="primary" @click="deleteImage">删除</el-button>
766
- </span>
767
- </el-dialog>
768
- <!-- 导出日志 -->
769
- <el-dialog
770
- :visible.sync="exportLogShow"
771
- custom-class="report-dialog"
772
- top="5vh"
773
- width="70%"
774
- @close="closeExportLog"
775
- title="导出日志详情">
776
- <export-list />
777
- </el-dialog>
778
- </div>
779
- </template>
780
-
781
- <script>
782
- import { getDay } from '@/utils/getTime';
783
- import { mapGetters } from 'vuex';
784
- import { downloadFile } from '@/utils/index';
785
- import { download } from '@/api/data';
786
- const start = getDay(-6) + ' 00:00:00';
787
- const end = getDay(0) + ' 23:59:59';
788
- import exportList from './exportList.vue';
789
-
790
- import crudDataAchive, {
791
- getHospital,
792
- getNewScanString,
793
- updateOssStatus,
794
- viewImage,
795
- modifyUrlKey,
796
- deletePatients,
797
- operateDonwnLoad,
798
- updatePatientInfo,
799
- echoPatientInfo,
800
- sendMessage,
801
- sendMsgCode,
802
- updateIsImageService,
803
- getTypesettingFilmInfo,
804
- checkExistByOriginalReport,
805
- getReportStream,
806
- retrieveTypesettingFilm,
807
- removeTypesettingFilm,
808
- removeApplyOrReportFile,
809
- } from '@/api/dataArchive/index';
810
- // import { validatePhone, validateIdNo } from "@/utils/validate";
811
- import IconSelect from '@/components/IconSelect';
812
- import Treeselect from '@riophae/vue-treeselect';
813
- import '@riophae/vue-treeselect/dist/vue-treeselect.css';
814
- import CRUD, { presenter, header, form, crud } from '@crud/crud';
815
- import rrOperation from '@crud/RR.operation';
816
- import crudOperation from '@crud/CRUD.operation';
817
- import udOperation from '@crud/UD.operation';
818
- import DateRangePicker from '@/components/DateRangePicker';
819
- import pagination from '@crud/Pagination';
820
- import delTable from '@/views/dataArchive/delTable.vue';
821
- import QRCode from 'qrcodejs2';
822
- import Clipboard from 'clipboard';
823
- import institutionMonitor from '@/api/institutionMonitor/index';
824
-
825
- const defaultForm = {
826
- id: null,
827
- name: '',
828
- url: '',
829
- parentId: null,
830
- type: '',
831
- radio: '',
832
- isDeleted: '',
833
- };
834
- export default {
835
- name: 'dataArchive',
836
- components: {
837
- Treeselect,
838
- IconSelect,
839
- crudOperation,
840
- rrOperation,
841
- udOperation,
842
- DateRangePicker,
843
- pagination,
844
- delTable,
845
- QRCode,
846
- exportList,
847
- },
848
- cruds() {
849
- return CRUD({
850
- title: '接口',
851
- url: '/patient/queryPatientList',
852
- sort: '',
853
- crudMethod: { ...crudDataAchive },
854
- query: {
855
- checkTime: [start, end],
856
- },
857
- optShow: {
858
- add: false,
859
- reset: true,
860
- },
861
- page: {
862
- page: 0,
863
- size: 10,
864
- total: 0,
865
- sizes: [10, 20, 30, 40, 50, 100, 1000],
866
- },
867
- });
868
- },
869
- mixins: [presenter(), header(), form(defaultForm), crud()],
870
- dicts: ['isOss_status', 'is_oss', 'dataCharge_status'],
871
- data() {
872
- var _this = this;
873
- /* 是否手机号码*/
874
- function validatePhone(rule, value, callback) {
875
- const reg = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/;
876
- if (!value && !_this.form.mobilePhone) {
877
- callback(new Error('请填写手机号'));
878
- } else if (!reg.test(value) && value !== '') {
879
- callback(new Error('请输入正确的手机号'));
880
- } else {
881
- callback();
882
- // _this.$refs['form'].clearValidate()
883
- if (_this.$refs['form']) _this.$refs['form'].validateField();
884
- }
885
- }
886
- function validateIdNo(rule, value, callback) {
887
- const reg =
888
- /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
889
- if (!value && !_this.form.idCardNo) {
890
- callback(new Error('请填写身份证号'));
891
- } else if (!reg.test(value) && value) {
892
- callback(new Error('请输入正确的身份证号码'));
893
- } else {
894
- callback();
895
- // _this.$refs['form'].clearValidate('mobilePhone')
896
- if (_this.$refs['form']) _this.$refs['form'].validateField();
897
- }
898
- }
899
- return {
900
- waterMarkProp: {
901
- zIndex: 1,
902
- devicePixelRatio: 2,
903
- text: '',
904
- showTime: true,
905
- },
906
- menus: [],
907
- props: {
908
- value: 'value',
909
- children: 'cities',
910
- label: 'label',
911
- checkStrictly: true,
912
- },
913
- fixedDivHeight: 0,
914
- tableHeight: 0,
915
- sidebarWidth: 0,
916
- permission: {
917
- delList: ['admin', 'datas:dellist'],
918
- editUrlKey: ['admin', 'datas:editurlKey'],
919
- editImageStatus: ['admin', 'datas:editImageStatus'],
920
- del: ['admin', 'datas:del'],
921
- downLoad: ['admin', 'datas:downLoad'],
922
- editInfo: ['admin', 'datas:editInfo'],
923
- SMSnotice: ['admin', 'datas:SMSnotice'],
924
- export: ['admin', 'datas:export'],
925
- editCostStatus: ['admin', 'datas:editCostStatus'],
926
- },
927
- rules: {
928
- urlKey: [{ required: true, message: '请输入urlKey', trigger: 'blur' }],
929
- patientName: [{ required: true, message: '请输入患者姓名', trigger: 'blur' }],
930
- mobilePhone: [{ required: true, validator: validatePhone, trigger: 'blur' }],
931
- idCardNo: [
932
- {
933
- required: true,
934
- trigger: 'blur',
935
- validator: validateIdNo,
936
- },
937
- ],
938
- //
939
- code: [{ required: true, message: '请输入', trigger: 'blur' }],
940
- },
941
- provinceList: [],
942
- tableHeader: [
943
- { label: '患者编号', prop: 'patientId', width: '140', isShow: true },
944
- {
945
- label: '检查编号',
946
- prop: 'accessNumber',
947
- width: '140',
948
- sortable: false,
949
- isShow: true,
950
- },
951
- {
952
- label: '患者姓名',
953
- prop: 'patientName',
954
- width: '80',
955
- sortable: false,
956
- isShow: true,
957
- },
958
- {
959
- label: 'studyUid ',
960
- prop: 'studyUid',
961
- width: '100',
962
- sortable: false,
963
- isShow: true,
964
- },
965
- {
966
- label: '身份证号',
967
- prop: 'idCardNo',
968
- width: '130',
969
- sortable: false,
970
- isShow: true,
971
- },
972
- {
973
- label: '性别',
974
- prop: 'patientSex',
975
- width: '80',
976
- sortable: false,
977
- isShow: true,
978
- },
979
- {
980
- label: '年龄',
981
- prop: 'patientAge',
982
- width: '80',
983
- sortable: false,
984
- isShow: true,
985
- },
986
- {
987
- label: '图像数量',
988
- prop: 'imageCount',
989
- width: '80',
990
- sortable: false,
991
- isShow: true,
992
- },
993
- {
994
- label: '检查模式',
995
- prop: 'modality',
996
- width: '120',
997
- sortable: false,
998
- isShow: true,
999
- },
1000
- {
1001
- label: '检查部位',
1002
- prop: 'examBodyPart',
1003
- width: '140',
1004
- sortable: false,
1005
- isShow: true,
1006
- },
1007
- {
1008
- label: '检查项目',
1009
- prop: 'examItemName',
1010
- width: '140',
1011
- sortable: false,
1012
- isShow: true,
1013
- },
1014
- {
1015
- label: '检查项目编码',
1016
- prop: 'examItemCode',
1017
- width: '140',
1018
- sortable: false,
1019
- isShow: true,
1020
- },
1021
- {
1022
- label: '标准检查项目',
1023
- prop: 'standardProjectName',
1024
- width: '140',
1025
- sortable: false,
1026
- isShow: true,
1027
- },
1028
- {
1029
- label: '标准检查项目编码',
1030
- prop: 'standardProjectCode',
1031
- width: '140',
1032
- sortable: false,
1033
- isShow: true,
1034
- },
1035
- {
1036
- label: '申请单ID',
1037
- prop: 'applicationId',
1038
- width: '140',
1039
- sortable: false,
1040
- isShow: true,
1041
- },
1042
- {
1043
- label: '检查医嘱ID',
1044
- prop: 'studyOrderId',
1045
- width: '140',
1046
- sortable: false,
1047
- isShow: true,
1048
- },
1049
- {
1050
- label: '检查时间',
1051
- prop: 'patientCheckDate',
1052
- width: '180',
1053
- sortable: false,
1054
- isShow: true,
1055
- },
1056
- {
1057
- label: '检查机构',
1058
- prop: 'applyHospitalName',
1059
- width: '140',
1060
- sortable: false,
1061
- isShow: true,
1062
- },
1063
- {
1064
- label: '数字影像服务费',
1065
- prop: 'isImageService',
1066
- width: '160',
1067
- sortable: false,
1068
- isShow: false,
1069
- },
1070
- {
1071
- label: '住院号',
1072
- prop: 'hospitalizedNo',
1073
- width: '140',
1074
- sortable: false,
1075
- isShow: true,
1076
- },
1077
- {
1078
- label: '就诊卡号',
1079
- prop: 'healthCardNo',
1080
- width: '140',
1081
- sortable: false,
1082
- isShow: true,
1083
- },
1084
- {
1085
- label: 'urlKey',
1086
- prop: 'urlKey',
1087
- width: '80',
1088
- sortable: false,
1089
- isShow: true,
1090
- },
1091
- {
1092
- label: '数字影像服务费',
1093
- prop: 'isImageService',
1094
- width: '100',
1095
- sortable: false,
1096
- isShow: false,
1097
- },
1098
- ],
1099
- options: [],
1100
- sysList: [],
1101
- partherOptions: [],
1102
- dataArchiveVisible: false,
1103
- showReport: false,
1104
- showQRCode: false,
1105
- showUrlKey: false,
1106
- currentRow: {},
1107
- qrcode: '', //生成的二维码
1108
- loading: false,
1109
- empty: '---',
1110
- multiSelection: [],
1111
- ruleForm: {
1112
- urlKey: '',
1113
- },
1114
- delTableShow: false,
1115
- imageRuleForm: {
1116
- imageState: '',
1117
- },
1118
- imageRuleRules: {
1119
- imageState: [{ required: true, message: '请选择看图状态', trigger: 'change' }],
1120
- },
1121
- visible: false,
1122
- // 控制修改弹窗
1123
- updateInfoShow: false,
1124
- downLoadShow: false,
1125
- // 存储修改的手机号和身份证
1126
- form: {
1127
- mobilePhone: '',
1128
- idCardNo: '',
1129
- patientName: '',
1130
- examItemCode: '',
1131
- },
1132
- // 存储选中那条数据
1133
- clickRow: {},
1134
- pramsUrl: {},
1135
- SMSnoticeShow: false,
1136
- SMSnoticeObj: {},
1137
- tableShowHeight: 0,
1138
- crudShow: false,
1139
- // 收费弹窗
1140
- chargeStatusShow: false,
1141
- isImageService: '',
1142
- // 验证手机,验证码
1143
- validateShow: false,
1144
- validateForm: {
1145
- mobilePhone: '',
1146
- code: '',
1147
- },
1148
- // 查看胶片报告
1149
-
1150
- imageReportShow: false,
1151
- currentIndex: 1,
1152
- imageTitle: '电子报告',
1153
- imageArray: [],
1154
- // 导出日志
1155
- exportLogShow: false,
1156
- downloadLoading: false,
1157
- loadingText: '加载中',
1158
- canClick: false,
1159
- totalTime: 60,
1160
- btnText: '获取验证码',
1161
- timer: null,
1162
- // viewer: null,
1163
- };
1164
- },
1165
- created() {
1166
- this.getHospital();
1167
- },
1168
- mounted() {
1169
- this.$nextTick(() => {
1170
- this.fixedDivHeight = this.$refs.fixedDiv.clientHeight - 25;
1171
- this.tableHeight = this.$refs.dataArchiveContainer.clientHeight - 280;
1172
- window.addEventListener('resize', () => {
1173
- this.fixedDivHeight = this.$refs.fixedDiv.clientHeight - 25;
1174
- });
1175
- this.waterMarkProp.text = this.user.name;
1176
- });
1177
- },
1178
- computed: {
1179
- ...mapGetters(['user', 'sidebar']),
1180
- bindTableColumns() {
1181
- return this.tableHeader.filter(column => column.isShow);
1182
- },
1183
- currentImage() {
1184
- console.log(this.currentIndex - 1);
1185
- return this.imageArray[this.currentIndex - 1].url;
1186
- },
1187
- },
1188
- methods: {
1189
- clear(async) {
1190
- this.$nextTick(() => {
1191
- if (!async) {
1192
- // ios 手机有延迟问题
1193
- setTimeout(() => {
1194
- const { select } = this.$refs;
1195
- const input = select.$el.querySelector('.el-input__inner');
1196
- input.removeAttribute('readonly');
1197
- }, 200);
1198
- }
1199
- });
1200
- },
1201
-
1202
- // 地区联动获取数据
1203
- getPosition(val, cb) {
1204
- let vm = this; //查询省市县
1205
- let params = { parent: 1 };
1206
- if (!val) {
1207
- //初始化加载 获取所有省份数据
1208
- params = { parent: 1 };
1209
- } else if (val.length === 1) {
1210
- //加载二级 获取市级数据
1211
- params = { parent: val[0] };
1212
- } else {
1213
- //加载3级 获取县级数据
1214
- params = { parent: val[1] };
1215
- }
1216
- institutionMonitor
1217
- .queryNation(params)
1218
- .then(res => {
1219
- if (!val) {
1220
- //初始化加载 查询省份数据
1221
- vm.provinceList = res.content.map(e => {
1222
- return {
1223
- value: e.saleid,
1224
- label: e.province,
1225
- cities: [],
1226
- };
1227
- });
1228
- } else if (val.length === 1) {
1229
- //加载二级 查询该省下市级数据
1230
- vm.provinceList.map(item => {
1231
- if (item.value === val[0]) {
1232
- item.cities = res.content.map(e => {
1233
- return {
1234
- value: e.saleid,
1235
- label: e.city || e.county,
1236
- cities: [],
1237
- };
1238
- });
1239
- }
1240
- });
1241
- } else {
1242
- //加载3级 查询该省市下县级数据
1243
- vm.provinceList.map(item => {
1244
- if (item.value === val[0]) {
1245
- item.cities.map(value => {
1246
- if (value.value === val[1]) {
1247
- value.cities = res.content.map(e => {
1248
- return { value: e.saleid, label: e.county };
1249
- });
1250
- }
1251
- });
1252
- }
1253
- });
1254
- }
1255
- cb && cb(res);
1256
- })
1257
- .catch(err => {
1258
- console.log(err);
1259
- });
1260
- },
1261
- // 一级二级改变的时候调取下一级数据
1262
- handleItemChange(val) {
1263
- this.getPosition(val);
1264
- },
1265
- addressChange() {
1266
- if (this.query.address.length > 0) {
1267
- this.query.province = this.query.address[0];
1268
- this.query.city = this.query.address[1];
1269
- this.query.district = this.query.address[2];
1270
- } else {
1271
- this.query.province = '';
1272
- this.query.city = '';
1273
- this.query.district = '';
1274
- }
1275
- this.crud.toQuery();
1276
- },
1277
- forceUpdate() {
1278
- this.$forceUpdate(); // 强制刷新
1279
- },
1280
- // setTableHeight() {
1281
- // setTimeout(() => {
1282
- // const dataArchiveContainer = this.$refs.dataArchiveContainer;
1283
- // const dataArchiveTable = this.$refs.dataArchiveTable;
1284
- // this.tableShowHeight =
1285
- // dataArchiveContainer.clientHeight -
1286
- // (dataArchiveTable.offsetTop - dataArchiveContainer.offsetTop) -
1287
- // 30;
1288
- // }, 1000);
1289
- // },
1290
- getUpdate(row) {
1291
- this.clickRow = row;
1292
- echoPatientInfo(encodeURIComponent(row.id)).then(res => {
1293
- this.form.mobilePhone = res.mobilePhone;
1294
- this.form.idCardNo = res.idCardNo;
1295
- this.form.patientName = res.patientName;
1296
- this.form.examItemCode = res.examItemCode;
1297
- });
1298
-
1299
- this.updateInfoShow = true;
1300
- },
1301
- sureUpdate() {
1302
- this.$refs.form.validate(valid => {
1303
- console.log(valid, this.$refs.form, 'valid');
1304
- if (!valid) return false;
1305
- let data = {
1306
- ...this.form,
1307
- userName: this.user.username,
1308
- accessNumber: this.clickRow.accessNumber,
1309
- hospitalId: this.clickRow.hospitalId,
1310
- id: this.clickRow.id,
1311
- studyUid: this.clickRow.studyUid,
1312
- };
1313
- updatePatientInfo(data).then(res => {
1314
- if (res == 'ERROR_MSG') {
1315
- this.$message.error('身份证不正确,请重新输入');
1316
- } else {
1317
- this.$message.success('修改成功');
1318
- this.beforeClose();
1319
- this.crud.toQuery();
1320
- }
1321
- });
1322
- });
1323
- },
1324
- operateDonwnLoad(row) {
1325
- this.downLoadShow = true;
1326
- operateDonwnLoad(row).then(res => {
1327
- console.log(res);
1328
- this.pramsUrl = res;
1329
- });
1330
- },
1331
- btnCopy() {
1332
- let textUrl = new Clipboard('.btn');
1333
- console.log(textUrl);
1334
- textUrl.on('success', e => {
1335
- console.log(e.action);
1336
- this.$message('复制成功');
1337
- textUrl.destroy();
1338
- });
1339
- textUrl.on('error', () => {
1340
- consold.log('没有复制成功');
1341
- this.$message('没有复制成功');
1342
- textUrl.destroy();
1343
- });
1344
- },
1345
- openHref() {
1346
- window.open(`${this.pramsUrl.shortUrl}`, '_blank');
1347
- },
1348
- beforeClose() {
1349
- this.$refs.form.resetFields();
1350
- this.updateInfoShow = false;
1351
- },
1352
- beforeClose1() {
1353
- this.pramsUrl = {};
1354
- this.downLoadShow = false;
1355
- },
1356
- //重置
1357
- ResetClick() {
1358
- for (let key in this.query) {
1359
- if (key !== 'checkTime') {
1360
- this.query[key] = '';
1361
- }
1362
- }
1363
- this.getPosition(null, () => {});
1364
- this.query.address = [window.config.defaultAddress];
1365
- this.query.province = this.query.address[0];
1366
- this.crud.toQuery();
1367
- },
1368
- //获取检查机构下拉列表
1369
- getHospital() {
1370
- getHospital().then(res => {
1371
- this.optionsDefault = res.content;
1372
- this.options = res.content;
1373
- });
1374
- },
1375
- //检查机构筛选
1376
- remoteMethod(query) {
1377
- this.options = this.optionsDefault.filter((item, index) => {
1378
- return item.hospitalName.indexOf(query) !== -1;
1379
- });
1380
- },
1381
-
1382
- handleClose() {
1383
- this.dataArchiveVisible = false;
1384
- },
1385
- getRowKeys(row) {
1386
- return row.id;
1387
- },
1388
-
1389
- //无校验二维码
1390
- showQRCodeDetail(row) {
1391
- this.$nextTick(res => {
1392
- this.showReport = false;
1393
- this.showQRCode = true;
1394
- this.showUrlKey = false;
1395
- let data = {
1396
- hospitalId: row.hospitalId,
1397
- applyHospitalId: row.applyHospitalId,
1398
- accessNumber: row.accessNumber,
1399
- };
1400
-
1401
- getNewScanString(data).then(res => {
1402
- this.scanString = res;
1403
- if (this.showQRCode) {
1404
- this.dataArchiveVisible = true;
1405
- }
1406
- });
1407
- });
1408
- },
1409
- //查看报告
1410
- showReportDetail() {
1411
- this.dataArchiveVisible = true;
1412
- this.showReport = true;
1413
- this.showQRCode = false;
1414
- this.showUrlKey = false;
1415
- },
1416
- //删除记录
1417
- delRecordsShow() {
1418
- this.dataArchiveVisible = true;
1419
- this.showReport = false;
1420
- this.showQRCode = false;
1421
- this.showUrlKey = false;
1422
- this.delTableShow = true;
1423
- },
1424
- //删除按钮
1425
- delAction() {
1426
- if (this.multiSelection.length == 0) {
1427
- return this.$message.info('请至少选择一条数据!');
1428
- }
1429
- this.$confirm('删除后云端将无此数据,是否删除?', '提示', {
1430
- confirmButtonText: '确定',
1431
- cancelButtonText: '取消',
1432
- type: 'warning',
1433
- })
1434
- .then(() => {
1435
- let ids = [];
1436
- this.multiSelection.forEach((item, index) => {
1437
- ids.push(item.id);
1438
- });
1439
- // this.$store.state.user.username
1440
- // console.log(this.user.username,'this.user.username')
1441
- let data = {
1442
- ids: ids,
1443
- loginName: this.user.username,
1444
- };
1445
- deletePatients(data).then(res => {
1446
- console.log(res);
1447
- if (res == undefined) {
1448
- this.crud.toQuery();
1449
- this.$message({
1450
- type: 'success',
1451
- message: '删除成功!',
1452
- });
1453
- }
1454
- });
1455
- })
1456
- .catch(() => {});
1457
- },
1458
- updateIsImageService() {
1459
- let ids = [];
1460
- this.multiSelection.forEach((item, index) => {
1461
- ids.push(item.id);
1462
- });
1463
- let data = {
1464
- ids,
1465
- isImageService: this.isImageService,
1466
- };
1467
- console.log(data);
1468
- updateIsImageService(data)
1469
- .then(res => {
1470
- this.chargeStatusShow = false;
1471
- this.crud.toQuery();
1472
- this.$message({
1473
- type: 'info',
1474
- message: '收费状态修改中,稍后查看!',
1475
- });
1476
- })
1477
- .catch(err => {
1478
- this.chargeStatusShow = false;
1479
- });
1480
- },
1481
- //浏览图像
1482
- imageBrower(row) {
1483
- let data = {
1484
- urlKey: row.urlKey,
1485
- studyUid: row.studyUid,
1486
- accessNumber: row.accessNumber,
1487
- hospitalId: row.hospitalId,
1488
- };
1489
- viewImage(data).then(res => {
1490
- if (res) {
1491
- window.open(res);
1492
- }
1493
- });
1494
- },
1495
- SMSnotice(row) {
1496
- this.SMSnoticeObj = row;
1497
- this.SMSnoticeShow = true;
1498
- },
1499
- submitSMSnotice() {
1500
- this.$confirm('确定要发送向该手机号的短信通知 ?', '提示', {
1501
- confirmButtonText: '确定',
1502
- cancelButtonText: '取消',
1503
- type: 'warning',
1504
- }).then(() => {
1505
- let iphoneRule = /^[1][3,4,5,6.7,8,9][0-9]{9}$/;
1506
- if (iphoneRule.test(this.SMSnoticeObj.mobilePhone)) {
1507
- let params = {
1508
- hospitalId: this.SMSnoticeObj.hospitalId,
1509
- accessNumber: this.SMSnoticeObj.accessNumber,
1510
- applyHospitalName: this.SMSnoticeObj.applyHospitalName,
1511
- mobilePhone: this.SMSnoticeObj.mobilePhone,
1512
- patientName: this.SMSnoticeObj.patientName,
1513
- modality: this.SMSnoticeObj.modality,
1514
- };
1515
- sendMessage(params)
1516
- .then(res => {
1517
- this.$message.success('发送成功');
1518
- this.closeSMS();
1519
- })
1520
- .catch(err => {});
1521
- } else {
1522
- this.$message.warning('该编号手机号码有误,无法发送短信通知');
1523
- }
1524
- });
1525
- },
1526
- closeSMS() {
1527
- this.SMSnoticeShow = false;
1528
- },
1529
- closecharge() {
1530
- this.chargeStatusShow = false;
1531
- },
1532
- exportExcel(row) {
1533
- if (!this.query.hosId) {
1534
- return this.$message.info('请选择一家机构!');
1535
- }
1536
- this.validateShow = true;
1537
- this.validateForm.mobilePhone = this.user.phone;
1538
- },
1539
- closeValidate() {
1540
- this.$refs.validateForm.resetFields();
1541
- window.clearInterval(this.timer);
1542
- this.btnText = '获取验证码';
1543
- this.totalTime = 60;
1544
- this.canClick = false;
1545
- this.validateShow = false;
1546
- },
1547
- checkReport(row, status) {
1548
- if (status == 1) {
1549
- this.imageTitle = '电子报告';
1550
- this.getReport(row);
1551
- } else {
1552
- this.imageTitle = '电子胶片';
1553
- this.getImagefilm(row);
1554
- }
1555
- },
1556
- getReport(row) {
1557
- let data = {
1558
- hospitalId: row.hospitalId,
1559
- accessNumber: row.accessNumber,
1560
- };
1561
- checkExistByOriginalReport(data).then(res => {
1562
- let array = [];
1563
- if (res.length == 0) return this.$message.info('暂无电子报告');
1564
- this.imageReportShow = true;
1565
- res.forEach(item => {
1566
- let data = {
1567
- accessNumber: item.accessNumber,
1568
- hospitalId: item.hospitalId,
1569
- formType: item.formType,
1570
- };
1571
- // let image = `${window.config.baseUrl}/patient/retrieveTypesettingFilm`;
1572
- getReportStream(data)
1573
- .then(result => {})
1574
- .catch(result => {
1575
- let blob = new Blob([result], { type: 'image/png' }); // 创建一个Blob对象,并指定文件类型
1576
- let imageUrl = URL.createObjectURL(blob);
1577
- let params = {
1578
- ...data,
1579
- url: imageUrl,
1580
- };
1581
- array.push(params);
1582
- });
1583
- });
1584
- this.imageArray = array;
1585
- console.log(this.imageArray);
1586
- });
1587
- },
1588
- // // 预览图片
1589
- // previewImage() {
1590
- // if (!this.viewer) {
1591
- // console.log(this.$el.querySelector("img"));
1592
- // this.viewer = new Viewer(this.$el.querySelector("img"), {
1593
- // // 可以根据需要设置viewer的配置选项
1594
- // });
1595
- // this.viewer.show();
1596
- // } else {
1597
- // this.viewer.show();
1598
- // }
1599
- // },
1600
- getImagefilm(row) {
1601
- let data = {
1602
- hospitalId: row.hospitalId,
1603
- accessNumber: row.accessNumber,
1604
- };
1605
- getTypesettingFilmInfo(data).then(res => {
1606
- let array = [];
1607
- if (res.content.length == 0) return this.$message.info('暂无电子胶片');
1608
- this.imageReportShow = true;
1609
-
1610
- res.content.forEach(item => {
1611
- let data = {
1612
- accessNumber: item.accessNumber,
1613
- hospitalId: item.hospitalId,
1614
- typesettingFilmFileId: item.typesettingFilmFileId,
1615
- contentType: 'image/jpeg',
1616
- };
1617
- // let image = `${window.config.baseUrl}/patient/retrieveTypesettingFilm`;
1618
- retrieveTypesettingFilm(data)
1619
- .then(result => {})
1620
- .catch(result => {
1621
- let blob = new Blob([result], { type: 'image/png' }); // 创建一个Blob对象,并指定文件类型
1622
- let imageUrl = URL.createObjectURL(blob);
1623
- let params = {
1624
- ...data,
1625
- url: imageUrl,
1626
- };
1627
- array.push(params);
1628
- });
1629
- });
1630
- this.imageArray = array;
1631
- console.log(this.imageArray);
1632
- });
1633
- },
1634
- closeReport() {
1635
- this.imageReportShow = false;
1636
- this.currentIndex = 1;
1637
- this.imageArray = [];
1638
- this.loadingText = '加载中';
1639
- },
1640
- prevImage() {
1641
- if (this.currentIndex > 0) {
1642
- this.currentIndex--;
1643
- }
1644
- },
1645
- exportLog() {
1646
- this.exportLogShow = true;
1647
- },
1648
- closeExportLog() {
1649
- this.exportLogShow = false;
1650
- },
1651
- deleteImage() {
1652
- if (this.imageArray.length == 0) return this.$message.info('没有数据可删除');
1653
- this.$confirm('此操作将删除该条数据,是否继续?', '提示', {
1654
- confirmButtonText: '确定',
1655
- cancelButtonText: '取消',
1656
- type: 'warning',
1657
- }).then(() => {
1658
- if (this.imageTitle == '电子报告') {
1659
- removeApplyOrReportFile(this.imageArray[this.currentIndex - 1]).then(res => {
1660
- this.$message.success('删除成功');
1661
- this.imageArray.splice(this.currentIndex - 1, 1);
1662
- if (this.currentIndex >= this.imageArray.length) {
1663
- this.currentIndex = this.imageArray.length;
1664
- }
1665
- if (this.imageArray.length == 0) this.closeReport();
1666
- });
1667
- } else {
1668
- removeTypesettingFilm(this.imageArray[this.currentIndex - 1]).then(res => {
1669
- this.$message.success('删除成功');
1670
- this.imageArray.splice(this.currentIndex - 1, 1);
1671
- if (this.currentIndex >= this.imageArray.length) {
1672
- this.currentIndex = this.imageArray.length;
1673
- }
1674
- if (this.imageArray.length == 0) this.closeReport();
1675
- });
1676
- }
1677
- });
1678
- },
1679
- nextImage() {
1680
- if (this.currentIndex < this.imageArray.length) {
1681
- this.currentIndex++;
1682
- }
1683
- },
1684
- //获取图像
1685
- getImage(row) {
1686
- this.$message.warning('开始获取,请稍后手动刷新页面查看');
1687
- updateOssStatus(row.id).then(res => {
1688
- this.crud.toQuery();
1689
- });
1690
- },
1691
- validateBtn() {
1692
- console.log(this.dict.isOss_status);
1693
- this.$refs.imageRuleForm.validate(valid => {
1694
- if (valid) {
1695
- this.visible = true;
1696
- } else {
1697
- this.visible = false;
1698
- return false;
1699
- }
1700
- });
1701
- },
1702
- // 获取验证码
1703
- getCode() {
1704
- let _this = this;
1705
- if (this.canClick) return;
1706
- this.canClick = true;
1707
- sendMsgCode({
1708
- telNum: this.validateForm.mobilePhone,
1709
- }).then(res => {});
1710
- this.btnText = this.totalTime + 's后重新发送';
1711
- this.timer = window.setInterval(() => {
1712
- this.totalTime--;
1713
- this.btnText = this.totalTime + 's后重新发送';
1714
- if (this.totalTime < 0) {
1715
- window.clearInterval(_this.timer);
1716
- this.btnText = '重新获取验证码';
1717
- this.totalTime = 60;
1718
- this.canClick = false;
1719
- }
1720
- }, 1000);
1721
- },
1722
- sureExport() {
1723
- let _this = this;
1724
- this.$refs.validateForm.validate(valid => {
1725
- if (!valid) return false;
1726
- this.downloadLoading = true;
1727
- let query = {
1728
- ...this.query,
1729
- telNum: this.validateForm.mobilePhone,
1730
- code: this.validateForm.code,
1731
- };
1732
- download('patient/exprotQueryPatient', query)
1733
- .then(result => {
1734
- this.downloadLoading = false;
1735
- })
1736
- .catch(e => {
1737
- console.log(e);
1738
- const reader = new FileReader();
1739
- // 设置读取完成后的回调函数
1740
- reader.onload = function (event) {
1741
- const jsonText = event.target.result; // 获取读取的结果(JSON 字符串)
1742
- console.log(jsonText.includes('code'));
1743
-
1744
- if (jsonText.includes('code')) {
1745
- let data = JSON.parse(jsonText);
1746
- _this.$message.error(data.message);
1747
- } else {
1748
- downloadFile(e, '归档数据', 'xlsx');
1749
- _this.validateShow = false;
1750
- }
1751
- };
1752
- reader.readAsText(e);
1753
- // downloadFile(e, "归档数据", "xlsx");
1754
- this.downloadLoading = false;
1755
- });
1756
- });
1757
- },
1758
- //修改url Key
1759
- editUrlKey() {
1760
- if (this.multiSelection.length == 0) {
1761
- return this.$message.info('请至少选择一条数据!');
1762
- }
1763
- // 不同的UrlKey 给出提示
1764
- let urlKeyList = [];
1765
- this.multiSelection.forEach((item, index) => {
1766
- urlKeyList.push(item.urlKey);
1767
- });
1768
- let urlKeyFilterList = new Set(urlKeyList);
1769
- urlKeyFilterList = Array.from(urlKeyFilterList);
1770
- console.log(urlKeyFilterList, urlKeyList);
1771
- if (this.multiSelection.length !== 1 && urlKeyList.length == urlKeyFilterList.length) {
1772
- return this.$message.warning('请选择urlKey值相同的数据!');
1773
- }
1774
- this.ruleForm.urlKey = this.multiSelection[0].urlKey;
1775
- this.dataArchiveVisible = true;
1776
- this.showReport = false;
1777
- this.showQRCode = false;
1778
- this.showUrlKey = true;
1779
- },
1780
- //dialog 确定按钮
1781
- dialogSubmit() {
1782
- this.$refs.ruleForm.validate(valid => {
1783
- if (valid) {
1784
- if (this.showUrlKey) {
1785
- let ids = [];
1786
- this.multiSelection.forEach((item, index) => {
1787
- ids.push(item.id);
1788
- });
1789
- let data = {
1790
- ids: ids,
1791
- urlKey: this.ruleForm.urlKey,
1792
- };
1793
- modifyUrlKey(data).then(res => {
1794
- if (res == undefined) {
1795
- this.dataArchiveVisible = false;
1796
- this.crud.toQuery();
1797
- return this.$message.success('修改成功!');
1798
- }
1799
- });
1800
- }
1801
- }
1802
- });
1803
- },
1804
- handleSelectionChange(val) {
1805
- console.log('选中多选', val);
1806
- this.multiSelection = val;
1807
- },
1808
- // 新增与编辑前做的操作
1809
- [CRUD.HOOK.afterToCU](crud, form) {},
1810
- [CRUD.HOOK.beforeRefresh](crud, form) {
1811
- if (!this.crudShow) {
1812
- this.getPosition(null, () => {});
1813
- this.query.address = [window.config.defaultAddress];
1814
- this.query.province = this.query.address[0];
1815
-
1816
- this.crudShow = true;
1817
- }
1818
- },
1819
- [CRUD.HOOK.afterRefresh](crud, form) {
1820
- crud.data.forEach(tmp => {
1821
- if (tmp.standardProjectCode) tmp.standardProjectCode = tmp.standardProjectCode.split(',');
1822
- if (tmp.standardProjectName) tmp.standardProjectName = tmp.standardProjectName.split(',');
1823
- if (tmp.examItemCode) tmp.examItemCode = tmp.examItemCode.split(',');
1824
- if (tmp.examItemName) tmp.examItemName = tmp.examItemName.split(',');
1825
- });
1826
- },
1827
- //弹出框打开
1828
- dialogOpen() {},
1829
- //关闭弹出框
1830
- dialogClose() {
1831
- this.delTableShow = false;
1832
- this.scanString = [];
1833
- if (document.getElementById('qrcodeDom')) {
1834
- document.getElementById('qrcodeDom').innerHTML = '';
1835
- }
1836
- },
1837
- // 选中图标
1838
- selected(name) {
1839
- this.form.icon = name;
1840
- },
1841
-
1842
- //获取当前数据
1843
- handleCurrentChange(val) {
1844
- this.currentRow = val;
1845
- console.log(this.currentRow, 'val', '741');
1846
- },
1847
- //生成二维码
1848
- transQrcode() {
1849
- this.$nextTick(() => {
1850
- this.qrcode = new QRCode('qrcodeDom', {
1851
- widht: 250,
1852
- height: 250,
1853
- text: this.scanString,
1854
- });
1855
- });
1856
- },
1857
- inkured() {
1858
- this.$nextTick(() => {
1859
- this.$refs.multipleTable.doLayout();
1860
- });
1861
- },
1862
- },
1863
- activated() {
1864
- this.$nextTick(() => {
1865
- this.fixedDivHeight = this.$refs.fixedDiv.clientHeight - 25;
1866
- console.log(this.fixedDivHeight);
1867
- });
1868
-
1869
- this.crud.toQuery();
1870
- },
1871
- };
1872
- </script>
1873
- // App.vue
1874
- <style lang="scss">
1875
- // to fix 在ios设备中,el-select组件下拉框,点击2次才能选中问题。
1876
- .el-scrollbar .el-scrollbar__bar {
1877
- opacity: 1 !important;
1878
- }
1879
- .phone-box {
1880
- .el-form-item {
1881
- width: 100%;
1882
- .el-form-item__content {
1883
- width: calc(100% - 100px);
1884
- }
1885
- }
1886
- }
1887
- .report-dialog {
1888
- .dialog-footer {
1889
- display: flex;
1890
- justify-content: space-between;
1891
- .footer-left {
1892
- display: flex;
1893
- align-items: center;
1894
- p {
1895
- margin: 0 15px;
1896
- span {
1897
- color: #0089ff;
1898
- }
1899
- }
1900
- }
1901
- }
1902
- }
1903
- .el-dropdown {
1904
- margin-left: 10px;
1905
- span {
1906
- color: #0089ff;
1907
- }
1908
- .el-dropdown-menu {
1909
- display: flex;
1910
- flex-direction: column;
1911
- }
1912
- }
1913
- </style>
1914
- <style rel="stylesheet/scss" lang="scss" scoped>
1915
- .app-container {
1916
- display: flex;
1917
- flex-direction: column;
1918
- border: 1px solid #dcdfe6;
1919
- padding: 8px;
1920
- }
1921
- ::v-deep .el-table__fixed-right {
1922
- height: 100% !important;
1923
- }
1924
- ::v-deep .el-dropdown-menu__item {
1925
- width: 100%;
1926
- padding: 0;
1927
- height: auto;
1928
- .el-button {
1929
- width: 100%;
1930
- padding: 0 20px;
1931
- height: 36px;
1932
- line-height: 36px;
1933
- span {
1934
- display: inline-block;
1935
- width: 100%;
1936
- height: 100%;
1937
- }
1938
- }
1939
- }
1940
- .query-container {
1941
- background: #fff;
1942
- // padding: 10px;
1943
- padding-bottom: 0;
1944
- }
1945
- .head-container {
1946
- // position: fixed;
1947
- // z-index: 10;
1948
- // margin: -16px 0 0 -15px;
1949
- }
1950
- .box-card {
1951
- // margin-top: 230px;
1952
- border: 1px solid #dcdfe6;
1953
- padding: 15px;
1954
- }
1955
- .warning {
1956
- height: 30px;
1957
- line-height: 30px;
1958
- background-color: #f8f9fa;
1959
- padding: 0 10px;
1960
- margin-bottom: 10px;
1961
- span {
1962
- color: #ff7b35;
1963
- &:last-child {
1964
- font-size: 13px;
1965
- display: inline-block;
1966
- margin-left: 5px;
1967
- }
1968
- }
1969
- }
1970
- .download {
1971
- > div {
1972
- display: flex;
1973
- align-items: center;
1974
- > p {
1975
- text-align: right;
1976
- width: 60px;
1977
- }
1978
- .hover:hover {
1979
- color: #0089ff;
1980
- }
1981
- &:last-child {
1982
- margin: 10px 0;
1983
- }
1984
- }
1985
- }
1986
- ::v-deep .el-input-number .el-input__inner {
1987
- text-align: left;
1988
- }
1989
- ::v-deep .el-button.filter-item {
1990
- color: #1890ff;
1991
- border: 1px solid #1890ff;
1992
- }
1993
-
1994
- ::v-deep .vue-treeselect__control,
1995
- ::v-deep .vue-treeselect__placeholder,
1996
- ::v-deep .vue-treeselect__single-value {
1997
- height: 30px;
1998
- line-height: 30px;
1999
- }
2000
- ::v-deep.el-form-item {
2001
- margin-bottom: 16px;
2002
- }
2003
- .demo-form-dataArchive {
2004
- position: relative;
2005
- background-color: #fff;
2006
- // z-index: 10;
2007
- .el-form-item {
2008
- margin-bottom: 0;
2009
- }
2010
- }
2011
-
2012
- .patientDetail {
2013
- padding: 10px 0;
2014
-
2015
- span {
2016
- color: #606266;
2017
- font-weight: bold;
2018
- }
2019
- }
2020
-
2021
- .paddingClass {
2022
- padding: 10px 0;
2023
- }
2024
-
2025
- #qrcodeDom {
2026
- position: relative;
2027
-
2028
- display: flex;
2029
- align-items: center;
2030
- justify-content: center;
2031
- }
2032
-
2033
- #qrCodeIco {
2034
- position: absolute;
2035
- width: 40px;
2036
- height: 40px;
2037
- left: 50%;
2038
- top: 50%;
2039
- margin-left: -20px;
2040
- margin-top: -20px;
2041
- z-index: 99;
2042
- background-color: #fff;
2043
- }
2044
-
2045
- .showUrlKeyWarn {
2046
- padding: 10px 0;
2047
- }
2048
-
2049
- .OperationFlex {
2050
- display: flex;
2051
- }
2052
-
2053
- .imageStateDialog {
2054
- display: flex;
2055
- flex-direction: column;
2056
- }
2057
- .scanImg {
2058
- display: flex;
2059
- justify-content: center;
2060
- img {
2061
- width: 200px;
2062
- margin: 0 20px;
2063
- }
2064
- span {
2065
- margin-top: 8px;
2066
- }
2067
- }
2068
- .qrcode {
2069
- display: flex;
2070
- align-items: center;
2071
- justify-content: center;
2072
- div {
2073
- display: flex;
2074
- flex-direction: column;
2075
- align-items: center;
2076
- justify-content: center;
2077
- }
2078
- }
2079
- .SMSnoticeStyle {
2080
- & > div {
2081
- color: #111111;
2082
- line-height: 32px;
2083
- }
2084
- }
2085
- .warningStyle {
2086
- margin-top: 15px;
2087
- }
2088
- .checkReportImage {
2089
- height: 70vh;
2090
- overflow: auto;
2091
- display: flex;
2092
- // align-items: center;
2093
- justify-content: center;
2094
- img {
2095
- width: auto;
2096
- height: 100%;
2097
- }
2098
- p {
2099
- font-size: 16px;
2100
- color: #111111;
2101
- margin-top: 30%;
2102
- }
2103
- }
2104
- </style>
1
+ <template>
2
+ <div class="app-container" ref="dataArchiveContainer">
3
+ <!--工具栏-->
4
+ <div class="head-container" ref="fixedDiv" style="width: calc(100%)">
5
+ <div class="query-container" v-if="crud.props.searchToggle">
6
+ <el-form :inline="true" :model="query" class="demo-form-dataArchive" size="small">
7
+ <el-form-item prop="address">
8
+ <!-- 区域 -->
9
+ <el-cascader
10
+ v-model="query.address"
11
+ clearable
12
+ placeholder="机构地区"
13
+ :options="provinceList"
14
+ :props="props"
15
+ @active-item-change="handleItemChange"
16
+ @change="addressChange">
17
+ </el-cascader>
18
+ </el-form-item>
19
+ <el-form-item>
20
+ <el-input
21
+ v-model="query.patientId"
22
+ size="small"
23
+ clearable
24
+ @clear="crud.toQuery"
25
+ placeholder="请输入患者编号"
26
+ style="width: 150px"
27
+ class="filter-item"
28
+ @keyup.enter.native="crud.toQuery" />
29
+ </el-form-item>
30
+ <el-form-item>
31
+ <el-input
32
+ v-model="query.accessNumber"
33
+ size="small"
34
+ clearable
35
+ @clear="crud.toQuery"
36
+ placeholder="请输入检查编号"
37
+ style="width: 150px"
38
+ class="filter-item"
39
+ @keyup.enter.native="crud.toQuery" />
40
+ </el-form-item>
41
+ <el-form-item>
42
+ <el-input
43
+ v-model="query.patientName"
44
+ size="small"
45
+ clearable
46
+ @clear="crud.toQuery"
47
+ placeholder="请输入姓名"
48
+ style="width: 150px"
49
+ class="filter-item"
50
+ @keyup.enter.native="crud.toQuery" />
51
+ </el-form-item>
52
+ <el-form-item>
53
+ <el-input
54
+ v-model="query.mobilePhone"
55
+ size="small"
56
+ @clear="crud.toQuery"
57
+ placeholder="请输入手机号"
58
+ style="width: 150px"
59
+ class="filter-item"
60
+ @keyup.enter.native="crud.toQuery" />
61
+ </el-form-item>
62
+ <el-form-item>
63
+ <el-input
64
+ v-model="query.idCardNo"
65
+ size="small"
66
+ clearable
67
+ @clear="crud.toQuery"
68
+ placeholder="请输入患者身份证号"
69
+ style="width: 180px"
70
+ class="filter-item"
71
+ @keyup.enter.native="crud.toQuery" />
72
+ </el-form-item>
73
+ <el-form-item>
74
+ <el-input
75
+ v-model="query.studyUid"
76
+ size="small"
77
+ clearable
78
+ @clear="crud.toQuery"
79
+ placeholder="请输入studyUid"
80
+ style="width: 150px"
81
+ class="filter-item"
82
+ @keyup.enter.native="crud.toQuery" />
83
+ </el-form-item>
84
+ <el-form-item>
85
+ <el-input
86
+ v-model="query.modality"
87
+ size="small"
88
+ clearable
89
+ @clear="crud.toQuery"
90
+ placeholder="请输入检查模式"
91
+ style="width: 160px"
92
+ class="filter-item"
93
+ @keyup.enter.native="crud.toQuery" />
94
+ </el-form-item>
95
+ <el-form-item>
96
+ <el-input
97
+ v-model="query.examBodyPart"
98
+ size="small"
99
+ clearable
100
+ @clear="crud.toQuery"
101
+ placeholder="请输入检查部位"
102
+ style="width: 160px"
103
+ class="filter-item"
104
+ @keyup.enter.native="crud.toQuery" />
105
+ </el-form-item>
106
+ <el-form-item>
107
+ <el-input
108
+ v-model="query.examItemName"
109
+ size="small"
110
+ clearable
111
+ @clear="crud.toQuery"
112
+ placeholder="请输入检查项目"
113
+ style="width: 160px"
114
+ class="filter-item"
115
+ @keyup.enter.native="crud.toQuery" />
116
+ </el-form-item>
117
+ <el-form-item> </el-form-item>
118
+ <el-form-item>
119
+ <el-input
120
+ v-model="query.urlKey"
121
+ clearable
122
+ @clear="crud.toQuery"
123
+ type="number"
124
+ placeholder="请输入urlKey"
125
+ style="width: 160px"
126
+ class="filter-item"
127
+ @keyup.enter.native="crud.toQuery" />
128
+ </el-form-item>
129
+ <el-form-item>
130
+ <el-input
131
+ v-model="query.applicationId"
132
+ clearable
133
+ @clear="crud.toQuery"
134
+ placeholder="请输入申请单ID"
135
+ style="width: 160px"
136
+ class="filter-item"
137
+ @keyup.enter.native="crud.toQuery" />
138
+ </el-form-item>
139
+ <el-form-item>
140
+ <el-input
141
+ v-model="query.studyOrderId"
142
+ clearable
143
+ @clear="crud.toQuery"
144
+ placeholder="请输入检查医嘱ID"
145
+ style="width: 160px"
146
+ class="filter-item"
147
+ @keyup.enter.native="crud.toQuery" />
148
+ </el-form-item>
149
+ <el-form-item prop="isOss">
150
+ <el-select
151
+ v-model="query.isOss"
152
+ clearable
153
+ placeholder="图像状态"
154
+ class="filter-item"
155
+ style="width: 160px"
156
+ @change="crud.toQuery">
157
+ <el-option
158
+ v-for="item in dict.is_oss"
159
+ :key="item.value"
160
+ :label="item.label"
161
+ :value="item.value" />
162
+ </el-select>
163
+ </el-form-item>
164
+ <el-form-item label="检查机构:">
165
+ <el-select
166
+ v-model="query.hosId"
167
+ placeholder="请选择"
168
+ filterable
169
+ remote
170
+ clearable
171
+ reserve-keyword
172
+ :remote-method="remoteMethod"
173
+ :loading="loading"
174
+ style="width: 160px"
175
+ size="small"
176
+ @focus="clear"
177
+ @hook:mounted="clear"
178
+ @visible-change="clear"
179
+ ref="select">
180
+ <el-option
181
+ v-for="(item, index) in options"
182
+ :key="index"
183
+ :label="item.hospitalName"
184
+ :value="item.hospitalId">
185
+ </el-option>
186
+ </el-select>
187
+ </el-form-item>
188
+ <el-form-item label="检查时间:">
189
+ <date-range-picker
190
+ style="width: 300px; height: 34px"
191
+ startPlaceholder="开始检查时间"
192
+ endPlaceholder="结束检查时间"
193
+ @change="crud.toQuery"
194
+ :clearable="false"
195
+ v-model="query.checkTime"
196
+ unlink-panels />
197
+ </el-form-item>
198
+ <el-form-item>
199
+ <el-button @click="crud.toQuery" class="filter-item" size="small">查询</el-button>
200
+ <el-button @click="ResetClick" class="filter-item" size="small" style="margin-left: 5px"
201
+ >重置</el-button
202
+ >
203
+ <el-button
204
+ @click="exportExcel"
205
+ v-if="checkPer(permission.export)"
206
+ class="filter-item"
207
+ size="small"
208
+ style="margin-left: 5px"
209
+ >导出</el-button
210
+ >
211
+ <el-button @click="exportLog" class="filter-item" size="small" style="margin-left: 5px"
212
+ >导出日志</el-button
213
+ >
214
+ </el-form-item>
215
+ <!-- 搜索 -->
216
+ </el-form>
217
+ <div>
218
+ <el-button
219
+ size="medium"
220
+ type="primary"
221
+ v-if="checkPer(permission.editUrlKey)"
222
+ @click="editUrlKey"
223
+ >修改urlKey
224
+ </el-button>
225
+ <el-button size="medium" type="danger" v-if="checkPer(permission.del)" @click="delAction"
226
+ >删除</el-button
227
+ >
228
+ <el-button
229
+ size="medium"
230
+ type="info"
231
+ v-if="checkPer(permission.delList)"
232
+ @click="delRecordsShow"
233
+ >删除记录</el-button
234
+ >
235
+ </div>
236
+ </div>
237
+ <crudOperation :permission="permission" />
238
+ </div>
239
+ <!--表单渲染-->
240
+ <el-dialog
241
+ :title="
242
+ showReport ? '浏览报告' : showQRCode ? '二维码' : showUrlKey ? '修改urlKey' : '删除记录'
243
+ "
244
+ :visible.sync="dataArchiveVisible"
245
+ style="min-width: 300px"
246
+ :width="showReport ? '55%' : showUrlKey || showQRCode ? '500px' : '80%'"
247
+ :before-close="handleClose"
248
+ append-to-body
249
+ :top="showQRCode ? '10vh' : '3vh'"
250
+ @open="dialogOpen"
251
+ @close="dialogClose">
252
+ <div v-if="showReport">
253
+ <el-row>
254
+ <el-col :span="24"
255
+ ><h3 style="text-align: center">
256
+ {{ this.currentRow.applyHospitalName || this.empty }}
257
+ </h3>
258
+ </el-col>
259
+ </el-row>
260
+ <el-row class="patientDetail">
261
+ <el-col :span="8"
262
+ ><span>姓名:</span>{{ this.currentRow.patientName || this.empty }}</el-col
263
+ >
264
+ <el-col :span="8"
265
+ ><span>性别:</span>{{ this.currentRow.patientSex || this.empty }}</el-col
266
+ >
267
+ <el-col :span="8"
268
+ ><span>年龄:</span>{{ this.currentRow.patientAge || this.empty }}</el-col
269
+ >
270
+ </el-row>
271
+ <el-row class="patientDetail">
272
+ <el-col :span="8"
273
+ ><span>申请科室:</span>{{ this.currentRow.applyOffice || this.empty }}</el-col
274
+ >
275
+ <el-col :span="8"
276
+ ><span>患者类型:</span>{{ this.currentRow.patientType || this.empty }}</el-col
277
+ >
278
+ <el-col :span="8"
279
+ ><span>检查编号:</span>{{ this.currentRow.accessNumber || this.empty }}</el-col
280
+ >
281
+ </el-row>
282
+ <el-row class="patientDetail">
283
+ <el-col :span="8"
284
+ ><span>检查部位:</span>{{ this.currentRow.examBodyPart || this.empty }}</el-col
285
+ >
286
+ <el-col :span="8">
287
+ <span>检查项目:</span>
288
+ <span v-if="currentRow.examItemName">
289
+ <span
290
+ v-for="(item, index) in currentRow.examItemName"
291
+ :key="index"
292
+ style="font-weight: normal">
293
+ {{ item }}<span v-if="index != currentRow.examItemName.length - 1">,</span>
294
+ </span>
295
+ </span>
296
+ <span v-else>{{ this.empty }}</span>
297
+ </el-col>
298
+ <el-col :span="8"
299
+ ><span>检查时间:</span>{{ this.currentRow.patientCheckDate || this.empty }}</el-col
300
+ >
301
+ </el-row>
302
+ <el-row>
303
+ <el-col :span="24" class="paddingClass"><h3>检查所见</h3></el-col>
304
+ </el-row>
305
+ <el-row>
306
+ <el-col class="paddingClass" :span="24">
307
+ <p>{{ this.currentRow.firExamFindings || this.empty }}</p></el-col
308
+ >
309
+ </el-row>
310
+ <el-row>
311
+ <el-col :span="24" class="paddingClass"><h3>检查印象</h3></el-col>
312
+ </el-row>
313
+ <el-row>
314
+ <el-col :span="24" class="paddingClass">
315
+ <p>{{ this.currentRow.firExamImpression || this.empty }}</p></el-col
316
+ >
317
+ </el-row>
318
+ <el-row class="patientDetail">
319
+ <el-col :span="8"
320
+ ><span>报告医生:</span
321
+ ><span>{{ this.currentRow.firstRepDocName || this.empty }}</span></el-col
322
+ >
323
+ <el-col :span="8"
324
+ ><span>审核医生:</span
325
+ ><span>{{ this.currentRow.audiRepDocName || this.empty }}</span></el-col
326
+ >
327
+ <el-col :span="8"
328
+ ><span>审核时间:</span
329
+ ><span>{{ this.currentRow.auditRepTime || this.empty }}</span></el-col
330
+ >
331
+ </el-row>
332
+ </div>
333
+ <div v-else-if="showQRCode">
334
+ <div style="padding: 0 20px">
335
+ <p style="font-size: 15px; line-height: 1.75em">
336
+ 检查项目:<span v-if="currentRow.examItemName">
337
+ <span
338
+ v-for="(item, index) in currentRow.examItemName"
339
+ :key="index"
340
+ style="font-weight: normal">
341
+ {{ item }}<span v-if="index != currentRow.examItemName.length - 1">,</span>
342
+ </span>
343
+ </span>
344
+ <span v-else>{{ this.empty }}</span>
345
+ </p>
346
+ <p style="font-size: 15px; line-height: 1.75em">
347
+ 检查时间:{{ this.currentRow.patientCheckDate || this.empty }}
348
+ </p>
349
+ </div>
350
+
351
+ <div class="scanImg">
352
+ <div class="qrcode">
353
+ <div>
354
+ <img :src="scanString[1]" />
355
+ <span>无校验二维码</span>
356
+ </div>
357
+ <div>
358
+ <img :src="scanString[0]" />
359
+ <span>校验二维码</span>
360
+ </div>
361
+ </div>
362
+ </div>
363
+ </div>
364
+ <div v-else-if="showUrlKey">
365
+ <el-form
366
+ :model="ruleForm"
367
+ :rules="rules"
368
+ ref="ruleForm"
369
+ label-width="0"
370
+ class="demo-ruleForm">
371
+ <el-form-item label="" prop="urlKey">
372
+ <el-input v-model="ruleForm.urlKey" placeholder="请输Url Key"></el-input>
373
+ <div class="showUrlKeyWarn">
374
+ <i class="el-icon-warning"></i>
375
+ 修改Key值可能会导致看图错误,请谨慎修改!
376
+ </div>
377
+ </el-form-item>
378
+ </el-form>
379
+ </div>
380
+ <div v-else>
381
+ <delTable v-if="delTableShow" ref="delTable" />
382
+ </div>
383
+ <span slot="footer" class="dialog-footer" v-if="showUrlKey">
384
+ <el-button @click="dataArchiveVisible = false">取 消</el-button>
385
+ <el-button type="primary" @click="dialogSubmit">确 定</el-button>
386
+ </span>
387
+ </el-dialog>
388
+ <!--表格渲染-->
389
+ <div class="box-card" ref="dataArchiveTable">
390
+ <el-popover
391
+ popper-class="popoverCollapsemedical"
392
+ placement="bottom"
393
+ width="200"
394
+ trigger="click">
395
+ <el-form style="max-height: 50vh; overflow: auto">
396
+ <el-form-item style="margin-bottom: 0">
397
+ <!-- :disabled="index == 0" -->
398
+ <el-checkbox
399
+ @change="inkured"
400
+ :disabled="item.prop == 'accessNumber'"
401
+ v-for="(item, index) in tableHeader"
402
+ :key="index"
403
+ v-model="item.isShow">
404
+ <p style="margin: 2px 0">{{ item.label }}</p>
405
+ </el-checkbox>
406
+ </el-form-item>
407
+ </el-form>
408
+ <el-button slot="reference" size="small" style="margin-bottom: 10px" class="el-icon-s-grid">
409
+ <i class="el-icon-arrow-down el-icon--right"></i>
410
+ </el-button>
411
+ </el-popover>
412
+ <el-table
413
+ ref="multipleTable"
414
+ v-loading="crud.loading"
415
+ lazy
416
+ :data="crud.data"
417
+ :cell-style="{ textAlign: 'center' }"
418
+ :header-cell-style="{ textAlign: 'center' }"
419
+ :tree-props="{ children: 'flag', hasChildren: 'flag' }"
420
+ :row-key="getRowKeys"
421
+ @current-change="handleCurrentChange"
422
+ @select="crud.selectChange"
423
+ @select-all="crud.selectAllChange"
424
+ @selection-change="handleSelectionChange"
425
+ :max-height="tableHeight">
426
+ <el-table-column fixed="" type="selection" width="55"> </el-table-column>
427
+ <el-table-column fixed label="序号" type="index" align="center">
428
+ <template slot-scope="scope">
429
+  <span>{{ (crud.page.page - 1) * crud.page.size + scope.$index + 1 }}</span>
430
+ </template>
431
+ </el-table-column>
432
+ <el-table-column
433
+ :show-overflow-tooltip="true"
434
+ v-for="(item, index) in bindTableColumns"
435
+ :key="index + '-bindTableColumns'"
436
+ align="center"
437
+ :label="item.label"
438
+ :prop="item.prop"
439
+ :min-width="item.width"
440
+ :sortable="item.sortable">
441
+ <template slot-scope="scope">
442
+ <span v-if="item.prop == 'standardProjectName'">
443
+ <ul v-if="scope.row.standardProjectName">
444
+ <li v-for="(item, index) in scope.row.standardProjectName" :key="index">
445
+ {{ item }}
446
+ </li>
447
+ </ul>
448
+ <span v-else>-</span>
449
+ </span>
450
+ <span v-else-if="item.prop == 'standardProjectCode'">
451
+ <ul v-if="scope.row.standardProjectCode">
452
+ <li v-for="(item, index) in scope.row.standardProjectCode" :key="index">
453
+ {{ item }}
454
+ </li>
455
+ </ul>
456
+ <span v-else>-</span>
457
+ </span>
458
+ <span v-else-if="item.prop == 'examItemName'">
459
+ <ul v-if="scope.row.examItemName">
460
+ <li v-for="(item, index) in scope.row.examItemName" :key="index">
461
+ {{ item }}
462
+ </li>
463
+ </ul>
464
+ <span v-else>-</span>
465
+ </span>
466
+ <span v-else-if="item.prop == 'examItemCode'">
467
+ <ul v-if="scope.row.examItemCode">
468
+ <li v-for="(item, index) in scope.row.examItemCode" :key="index">
469
+ {{ item }}
470
+ </li>
471
+ </ul>
472
+ <span v-else>-</span>
473
+ </span>
474
+ <span v-else>
475
+ {{ scope.row[item.prop] || empty }}
476
+ </span>
477
+ </template>
478
+ </el-table-column>
479
+
480
+ <el-table-column label="操作" width="250px" fixed="right">
481
+ <template slot-scope="scope">
482
+ <el-button type="text" size="mini" @click="showReportDetail">报告</el-button>
483
+
484
+ <el-button
485
+ type="text"
486
+ size="mini"
487
+ v-if="checkPer(permission.downLoad)"
488
+ :disabled="scope.row.isOss == 1 || scope.row.isOss == 5"
489
+ @click="operateDonwnLoad(scope.row)"
490
+ >下载</el-button
491
+ >
492
+
493
+ <el-button
494
+ type="text"
495
+ size="mini"
496
+ v-if="scope.row.isOss == 1"
497
+ @click="getImage(scope.row)">
498
+ <span style="color: #ff7e00"> 获取图像</span>
499
+ </el-button>
500
+ <el-button type="text" size="mini" :disabled="true" v-if="scope.row.isOss == 5">
501
+ 正在获取
502
+ </el-button>
503
+ <el-button
504
+ type="text"
505
+ size="mini"
506
+ @click="imageBrower(scope.row)"
507
+ v-if="scope.row.isOss == 2 || scope.row.isOss == 0">
508
+ 浏览图像
509
+ </el-button>
510
+
511
+ <el-dropdown>
512
+ <span class="el-dropdown-link">
513
+ 更多<i class="el-icon-arrow-down el-icon--right"></i>
514
+ </span>
515
+ <el-dropdown-menu slot="dropdown">
516
+ <el-dropdown-item>
517
+ <el-button
518
+ type="text"
519
+ style="width: 100%"
520
+ size="mini"
521
+ @click="getUpdate(scope.row)"
522
+ v-if="checkPer(permission.editInfo)"
523
+ >修改信息</el-button
524
+ >
525
+ </el-dropdown-item>
526
+ <el-dropdown-item>
527
+ <el-button type="text" size="mini" @click="showQRCodeDetail(scope.row)"
528
+ >二维码</el-button
529
+ >
530
+ </el-dropdown-item>
531
+ <el-dropdown-item>
532
+ <el-button
533
+ type="text"
534
+ size="mini"
535
+ v-if="checkPer(permission.SMSnotice)"
536
+ @click="SMSnotice(scope.row)">
537
+ 短信通知
538
+ </el-button>
539
+ </el-dropdown-item>
540
+ <el-dropdown-item>
541
+ <el-button type="text" size="mini" @click="checkReport(scope.row, 1)">
542
+ 电子报告
543
+ </el-button>
544
+ </el-dropdown-item>
545
+ <el-dropdown-item>
546
+ <el-button type="text" size="mini" @click="checkReport(scope.row, 2)">
547
+ 电子胶片
548
+ </el-button>
549
+ </el-dropdown-item>
550
+ </el-dropdown-menu>
551
+ </el-dropdown>
552
+ </template>
553
+ </el-table-column>
554
+ </el-table>
555
+ <!--分页组件-->
556
+ <pagination />
557
+ </div>
558
+ <el-dialog
559
+ title="修改患者信息"
560
+ :visible.sync="updateInfoShow"
561
+ width="400px"
562
+ top="6vh"
563
+ :before-close="beforeClose">
564
+ <div class="warning">
565
+ <span class="el-icon-warning"></span>
566
+ <span>修改患者信息可能会导致无法查看图像,请谨慎修改!</span>
567
+ </div>
568
+ <!-- :rules="rules" -->
569
+ <el-form
570
+ :inline="true"
571
+ :model="form"
572
+ class="form-inline-hospital"
573
+ size="small"
574
+ ref="form"
575
+ label-position="right"
576
+ label-width="100px">
577
+ <el-form-item prop="patientName" label="患者姓名">
578
+ <el-input
579
+ v-model="form.patientName"
580
+ type="text"
581
+ auto-complete="off"
582
+ placeholder="请输入患者姓名">
583
+ </el-input>
584
+ </el-form-item>
585
+ <el-form-item prop="mobilePhone" label="手机号">
586
+ <el-input
587
+ v-model="form.mobilePhone"
588
+ type="text"
589
+ auto-complete="off"
590
+ placeholder="请输入手机号">
591
+ </el-input>
592
+ </el-form-item>
593
+ <el-form-item prop="idCardNo" label="身份证号">
594
+ <el-input
595
+ v-model="form.idCardNo"
596
+ type="text"
597
+ auto-complete="off"
598
+ placeholder="请输入身份证号">
599
+ </el-input>
600
+ </el-form-item>
601
+ <el-form-item prop="examItemCode" label="检查项目编码">
602
+ <el-input
603
+ v-model="form.examItemCode"
604
+ type="textarea"
605
+ autosize
606
+ auto-complete="off"
607
+ placeholder="请输入检查项目编码">
608
+ </el-input>
609
+ </el-form-item>
610
+ </el-form>
611
+ <span slot="footer" class="dialog-footer">
612
+ <el-button @click="beforeClose">取消</el-button>
613
+ <el-button type="primary" @click="sureUpdate">确认</el-button>
614
+ </span>
615
+ </el-dialog>
616
+ <el-dialog title="下载" :visible.sync="downLoadShow" width="25%" :before-close="beforeClose1">
617
+ <div class="download">
618
+ <div @click="openHref">
619
+ <p>链接:</p>
620
+ <span class="hover">{{ pramsUrl.shortUrl }}</span>
621
+ <el-button type="text" style="margin-left: 15%">打开</el-button>
622
+ </div>
623
+ <div>
624
+ <p>提取码:</p>
625
+ <span id="text">{{ pramsUrl.vfCode }}</span>
626
+ <el-button
627
+ type="text"
628
+ style="margin-left: 5%"
629
+ data-clipboard-target="#text"
630
+ @click="btnCopy"
631
+ class="btn"
632
+ >复制</el-button
633
+ >
634
+ </div>
635
+ <div>
636
+ <p>有效期:</p>
637
+ <span>{{ pramsUrl.validityTime }}</span>
638
+ </div>
639
+ </div>
640
+ <span slot="footer" class="dialog-footer">
641
+ <el-button type="primary" @click="beforeClose1">确认</el-button>
642
+ </span>
643
+ </el-dialog>
644
+ <!-- 短信通知 -->
645
+ <el-dialog title="短信通知" :visible.sync="SMSnoticeShow" width="30%" @close="closeSMS">
646
+ <div class="SMSnoticeStyle">
647
+ <div>检查机构:{{ SMSnoticeObj.applyHospitalName || '-' }}</div>
648
+ <div>检查编号:{{ SMSnoticeObj.accessNumber || '-' }}</div>
649
+ <div>手机号码:{{ SMSnoticeObj.mobilePhone || '-' }}</div>
650
+ </div>
651
+ <span slot="footer" class="dialog-footer">
652
+ <el-button size="small" @click="closeSMS">取 消</el-button>
653
+ <el-button size="small" type="primary" @click="submitSMSnotice">确 定</el-button>
654
+ </span>
655
+ </el-dialog>
656
+ <!-- 收费状态 -->
657
+ <el-dialog
658
+ title="修改收费状态"
659
+ :visible.sync="chargeStatusShow"
660
+ width="30%"
661
+ @close="closecharge">
662
+ <div class="SMSnoticeStyle">
663
+ <el-select
664
+ v-model="isImageService"
665
+ clearable
666
+ placeholder="收费状态"
667
+ class="filter-item"
668
+ style="width: 100%">
669
+ <el-option
670
+ v-for="item in dict.dataCharge_status"
671
+ :key="item.value"
672
+ :label="item.label"
673
+ :value="item.value" />
674
+ </el-select>
675
+ <div class="warningStyle">
676
+ <div>
677
+ <i class="el-icon-warning warning-icon"
678
+ >修改收费状态可能会导致收费数据不一致,请谨慎修改!</i
679
+ >
680
+ </div>
681
+ </div>
682
+ </div>
683
+ <span slot="footer" class="dialog-footer">
684
+ <el-button size="small" @click="closecharge">取 消</el-button>
685
+ <el-button size="small" type="primary" @click="updateIsImageService">确 定</el-button>
686
+ </span>
687
+ </el-dialog>
688
+ <el-dialog title="验证手机" :visible.sync="validateShow" width="400px" @close="closeValidate">
689
+ <div class="phone-box">
690
+ <el-form
691
+ :inline="true"
692
+ :model="validateForm"
693
+ class="form-inline-hospital"
694
+ size="small"
695
+ ref="validateForm"
696
+ :rules="rules"
697
+ label-position="right"
698
+ label-width="100px">
699
+ <el-form-item prop="mobilePhone" label="手机号">
700
+ <el-input
701
+ v-model="validateForm.mobilePhone"
702
+ type="text"
703
+ auto-complete="off"
704
+ placeholder="请输入手机号"
705
+ disabled>
706
+ </el-input>
707
+ </el-form-item>
708
+ <el-form-item prop="code" label="验证码" style="width: 100%">
709
+ <el-input
710
+ v-model="validateForm.code"
711
+ type="text"
712
+ auto-complete="off"
713
+ placeholder="请输入验证码"
714
+ style="width: 58%">
715
+ </el-input>
716
+ <el-button
717
+ type="primary"
718
+ :disabled="canClick"
719
+ @click="getCode"
720
+ size="small"
721
+ style="width: 40%"
722
+ >{{ btnText }}</el-button
723
+ >
724
+ </el-form-item>
725
+ </el-form>
726
+ </div>
727
+ <span slot="footer" class="dialog-footer">
728
+ <el-button size="small" @click="closeValidate">取 消</el-button>
729
+ <el-button size="small" :loading="downloadLoading" type="primary" @click="sureExport"
730
+ >确 定</el-button
731
+ >
732
+ </span>
733
+ </el-dialog>
734
+ <!-- 电子报告 -->
735
+ <el-dialog
736
+ :visible.sync="imageReportShow"
737
+ custom-class="report-dialog"
738
+ top="5vh"
739
+ width="70%"
740
+ @close="closeReport">
741
+ <span slot="title" class="dialog-footer">
742
+ <span>{{ imageTitle }}</span>
743
+ </span>
744
+ <div class="checkReportImage">
745
+ <el-image
746
+ v-if="imageArray.length > 0"
747
+ :src="currentImage"
748
+ :preview-src-list="[currentImage]">
749
+ </el-image>
750
+
751
+ <p v-else>{{ loadingText }}</p>
752
+ </div>
753
+ <span slot="footer" class="dialog-footer">
754
+ <div class="footer-left">
755
+ <el-button @click="prevImage" :disabled="currentIndex === 1">上一页</el-button>
756
+ <p>
757
+ <span>{{ currentIndex }}</span
758
+ >/{{ imageArray.length }}
759
+ </p>
760
+ <el-button @click="nextImage" :disabled="currentIndex === imageArray.length">
761
+ 下一页
762
+ </el-button>
763
+ </div>
764
+
765
+ <el-button size="small" type="primary" @click="deleteImage">删除</el-button>
766
+ </span>
767
+ </el-dialog>
768
+ <!-- 导出日志 -->
769
+ <el-dialog
770
+ :visible.sync="exportLogShow"
771
+ custom-class="report-dialog"
772
+ top="5vh"
773
+ width="70%"
774
+ @close="closeExportLog"
775
+ title="导出日志详情">
776
+ <export-list />
777
+ </el-dialog>
778
+ </div>
779
+ </template>
780
+
781
+ <script>
782
+ import { getDay } from '@/utils/getTime';
783
+ import { mapGetters } from 'vuex';
784
+ import { downloadFile } from '@/utils/index';
785
+ import { download } from '@/api/data';
786
+ const start = getDay(-6) + ' 00:00:00';
787
+ const end = getDay(0) + ' 23:59:59';
788
+ import exportList from './exportList.vue';
789
+
790
+ import crudDataAchive, {
791
+ getHospital,
792
+ getNewScanString,
793
+ updateOssStatus,
794
+ viewImage,
795
+ modifyUrlKey,
796
+ deletePatients,
797
+ operateDonwnLoad,
798
+ updatePatientInfo,
799
+ echoPatientInfo,
800
+ sendMessage,
801
+ sendMsgCode,
802
+ updateIsImageService,
803
+ getTypesettingFilmInfo,
804
+ checkExistByOriginalReport,
805
+ getReportStream,
806
+ retrieveTypesettingFilm,
807
+ removeTypesettingFilm,
808
+ removeApplyOrReportFile,
809
+ } from '@/api/dataArchive/index';
810
+ // import { validatePhone, validateIdNo } from "@/utils/validate";
811
+ import IconSelect from '@/components/IconSelect';
812
+ import Treeselect from '@riophae/vue-treeselect';
813
+ import '@riophae/vue-treeselect/dist/vue-treeselect.css';
814
+ import CRUD, { presenter, header, form, crud } from '@crud/crud';
815
+ import rrOperation from '@crud/RR.operation';
816
+ import crudOperation from '@crud/CRUD.operation';
817
+ import udOperation from '@crud/UD.operation';
818
+ import DateRangePicker from '@/components/DateRangePicker';
819
+ import pagination from '@crud/Pagination';
820
+ import delTable from '@/views/dataArchive/delTable.vue';
821
+ import QRCode from 'qrcodejs2';
822
+ import Clipboard from 'clipboard';
823
+ import institutionMonitor from '@/api/institutionMonitor/index';
824
+
825
+ const defaultForm = {
826
+ id: null,
827
+ name: '',
828
+ url: '',
829
+ parentId: null,
830
+ type: '',
831
+ radio: '',
832
+ isDeleted: '',
833
+ };
834
+ export default {
835
+ name: 'dataArchive',
836
+ components: {
837
+ Treeselect,
838
+ IconSelect,
839
+ crudOperation,
840
+ rrOperation,
841
+ udOperation,
842
+ DateRangePicker,
843
+ pagination,
844
+ delTable,
845
+ QRCode,
846
+ exportList,
847
+ },
848
+ cruds() {
849
+ return CRUD({
850
+ title: '接口',
851
+ url: '/patient/queryPatientList',
852
+ sort: '',
853
+ crudMethod: { ...crudDataAchive },
854
+ query: {
855
+ checkTime: [start, end],
856
+ },
857
+ optShow: {
858
+ add: false,
859
+ reset: true,
860
+ },
861
+ page: {
862
+ page: 0,
863
+ size: 10,
864
+ total: 0,
865
+ sizes: [10, 20, 30, 40, 50, 100, 1000],
866
+ },
867
+ });
868
+ },
869
+ mixins: [presenter(), header(), form(defaultForm), crud()],
870
+ dicts: ['isOss_status', 'is_oss', 'dataCharge_status'],
871
+ data() {
872
+ var _this = this;
873
+ /* 是否手机号码*/
874
+ function validatePhone(rule, value, callback) {
875
+ const reg = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/;
876
+ if (!value && !_this.form.mobilePhone) {
877
+ callback(new Error('请填写手机号'));
878
+ } else if (!reg.test(value) && value !== '') {
879
+ callback(new Error('请输入正确的手机号'));
880
+ } else {
881
+ callback();
882
+ // _this.$refs['form'].clearValidate()
883
+ if (_this.$refs['form']) _this.$refs['form'].validateField();
884
+ }
885
+ }
886
+ function validateIdNo(rule, value, callback) {
887
+ const reg =
888
+ /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
889
+ if (!value && !_this.form.idCardNo) {
890
+ callback(new Error('请填写身份证号'));
891
+ } else if (!reg.test(value) && value) {
892
+ callback(new Error('请输入正确的身份证号码'));
893
+ } else {
894
+ callback();
895
+ // _this.$refs['form'].clearValidate('mobilePhone')
896
+ if (_this.$refs['form']) _this.$refs['form'].validateField();
897
+ }
898
+ }
899
+ return {
900
+ waterMarkProp: {
901
+ zIndex: 1,
902
+ devicePixelRatio: 2,
903
+ text: '',
904
+ showTime: true,
905
+ },
906
+ menus: [],
907
+ props: {
908
+ value: 'value',
909
+ children: 'cities',
910
+ label: 'label',
911
+ checkStrictly: true,
912
+ },
913
+ fixedDivHeight: 0,
914
+ tableHeight: 0,
915
+ sidebarWidth: 0,
916
+ permission: {
917
+ delList: ['admin', 'datas:dellist'],
918
+ editUrlKey: ['admin', 'datas:editurlKey'],
919
+ editImageStatus: ['admin', 'datas:editImageStatus'],
920
+ del: ['admin', 'datas:del'],
921
+ downLoad: ['admin', 'datas:downLoad'],
922
+ editInfo: ['admin', 'datas:editInfo'],
923
+ SMSnotice: ['admin', 'datas:SMSnotice'],
924
+ export: ['admin', 'datas:export'],
925
+ editCostStatus: ['admin', 'datas:editCostStatus'],
926
+ },
927
+ rules: {
928
+ urlKey: [{ required: true, message: '请输入urlKey', trigger: 'blur' }],
929
+ patientName: [{ required: true, message: '请输入患者姓名', trigger: 'blur' }],
930
+ mobilePhone: [{ required: true, validator: validatePhone, trigger: 'blur' }],
931
+ idCardNo: [
932
+ {
933
+ required: true,
934
+ trigger: 'blur',
935
+ validator: validateIdNo,
936
+ },
937
+ ],
938
+ //
939
+ code: [{ required: true, message: '请输入', trigger: 'blur' }],
940
+ },
941
+ provinceList: [],
942
+ tableHeader: [
943
+ { label: '患者编号', prop: 'patientId', width: '140', isShow: true },
944
+ {
945
+ label: '检查编号',
946
+ prop: 'accessNumber',
947
+ width: '140',
948
+ sortable: false,
949
+ isShow: true,
950
+ },
951
+ {
952
+ label: '患者姓名',
953
+ prop: 'patientName',
954
+ width: '80',
955
+ sortable: false,
956
+ isShow: true,
957
+ },
958
+ {
959
+ label: 'studyUid ',
960
+ prop: 'studyUid',
961
+ width: '100',
962
+ sortable: false,
963
+ isShow: true,
964
+ },
965
+ {
966
+ label: '身份证号',
967
+ prop: 'idCardNo',
968
+ width: '130',
969
+ sortable: false,
970
+ isShow: true,
971
+ },
972
+ {
973
+ label: '性别',
974
+ prop: 'patientSex',
975
+ width: '80',
976
+ sortable: false,
977
+ isShow: true,
978
+ },
979
+ {
980
+ label: '年龄',
981
+ prop: 'patientAge',
982
+ width: '80',
983
+ sortable: false,
984
+ isShow: true,
985
+ },
986
+ {
987
+ label: '图像数量',
988
+ prop: 'imageCount',
989
+ width: '80',
990
+ sortable: false,
991
+ isShow: true,
992
+ },
993
+ {
994
+ label: '检查模式',
995
+ prop: 'modality',
996
+ width: '120',
997
+ sortable: false,
998
+ isShow: true,
999
+ },
1000
+ {
1001
+ label: '检查部位',
1002
+ prop: 'examBodyPart',
1003
+ width: '140',
1004
+ sortable: false,
1005
+ isShow: true,
1006
+ },
1007
+ {
1008
+ label: '检查项目',
1009
+ prop: 'examItemName',
1010
+ width: '140',
1011
+ sortable: false,
1012
+ isShow: true,
1013
+ },
1014
+ {
1015
+ label: '检查项目编码',
1016
+ prop: 'examItemCode',
1017
+ width: '140',
1018
+ sortable: false,
1019
+ isShow: true,
1020
+ },
1021
+ {
1022
+ label: '标准检查项目',
1023
+ prop: 'standardProjectName',
1024
+ width: '140',
1025
+ sortable: false,
1026
+ isShow: true,
1027
+ },
1028
+ {
1029
+ label: '标准检查项目编码',
1030
+ prop: 'standardProjectCode',
1031
+ width: '140',
1032
+ sortable: false,
1033
+ isShow: true,
1034
+ },
1035
+ {
1036
+ label: '申请单ID',
1037
+ prop: 'applicationId',
1038
+ width: '140',
1039
+ sortable: false,
1040
+ isShow: true,
1041
+ },
1042
+ {
1043
+ label: '检查医嘱ID',
1044
+ prop: 'studyOrderId',
1045
+ width: '140',
1046
+ sortable: false,
1047
+ isShow: true,
1048
+ },
1049
+ {
1050
+ label: '检查时间',
1051
+ prop: 'patientCheckDate',
1052
+ width: '180',
1053
+ sortable: false,
1054
+ isShow: true,
1055
+ },
1056
+ {
1057
+ label: '检查机构',
1058
+ prop: 'applyHospitalName',
1059
+ width: '140',
1060
+ sortable: false,
1061
+ isShow: true,
1062
+ },
1063
+ {
1064
+ label: '数字影像服务费',
1065
+ prop: 'isImageService',
1066
+ width: '160',
1067
+ sortable: false,
1068
+ isShow: false,
1069
+ },
1070
+ {
1071
+ label: '住院号',
1072
+ prop: 'hospitalizedNo',
1073
+ width: '140',
1074
+ sortable: false,
1075
+ isShow: true,
1076
+ },
1077
+ {
1078
+ label: '就诊卡号',
1079
+ prop: 'healthCardNo',
1080
+ width: '140',
1081
+ sortable: false,
1082
+ isShow: true,
1083
+ },
1084
+ {
1085
+ label: 'urlKey',
1086
+ prop: 'urlKey',
1087
+ width: '80',
1088
+ sortable: false,
1089
+ isShow: true,
1090
+ },
1091
+ {
1092
+ label: '数字影像服务费',
1093
+ prop: 'isImageService',
1094
+ width: '100',
1095
+ sortable: false,
1096
+ isShow: false,
1097
+ },
1098
+ ],
1099
+ options: [],
1100
+ sysList: [],
1101
+ partherOptions: [],
1102
+ dataArchiveVisible: false,
1103
+ showReport: false,
1104
+ showQRCode: false,
1105
+ showUrlKey: false,
1106
+ currentRow: {},
1107
+ qrcode: '', //生成的二维码
1108
+ loading: false,
1109
+ empty: '---',
1110
+ multiSelection: [],
1111
+ ruleForm: {
1112
+ urlKey: '',
1113
+ },
1114
+ delTableShow: false,
1115
+ imageRuleForm: {
1116
+ imageState: '',
1117
+ },
1118
+ imageRuleRules: {
1119
+ imageState: [{ required: true, message: '请选择看图状态', trigger: 'change' }],
1120
+ },
1121
+ visible: false,
1122
+ // 控制修改弹窗
1123
+ updateInfoShow: false,
1124
+ downLoadShow: false,
1125
+ // 存储修改的手机号和身份证
1126
+ form: {
1127
+ mobilePhone: '',
1128
+ idCardNo: '',
1129
+ patientName: '',
1130
+ examItemCode: '',
1131
+ },
1132
+ // 存储选中那条数据
1133
+ clickRow: {},
1134
+ pramsUrl: {},
1135
+ SMSnoticeShow: false,
1136
+ SMSnoticeObj: {},
1137
+ tableShowHeight: 0,
1138
+ crudShow: false,
1139
+ // 收费弹窗
1140
+ chargeStatusShow: false,
1141
+ isImageService: '',
1142
+ // 验证手机,验证码
1143
+ validateShow: false,
1144
+ validateForm: {
1145
+ mobilePhone: '',
1146
+ code: '',
1147
+ },
1148
+ // 查看胶片报告
1149
+
1150
+ imageReportShow: false,
1151
+ currentIndex: 1,
1152
+ imageTitle: '电子报告',
1153
+ imageArray: [],
1154
+ // 导出日志
1155
+ exportLogShow: false,
1156
+ downloadLoading: false,
1157
+ loadingText: '加载中',
1158
+ canClick: false,
1159
+ totalTime: 60,
1160
+ btnText: '获取验证码',
1161
+ timer: null,
1162
+ // viewer: null,
1163
+ };
1164
+ },
1165
+ created() {
1166
+ this.getHospital();
1167
+ },
1168
+ mounted() {
1169
+ this.$nextTick(() => {
1170
+ this.fixedDivHeight = this.$refs.fixedDiv.clientHeight - 25;
1171
+ this.tableHeight = this.$refs.dataArchiveContainer.clientHeight - 280;
1172
+ window.addEventListener('resize', () => {
1173
+ this.fixedDivHeight = this.$refs.fixedDiv.clientHeight - 25;
1174
+ });
1175
+ this.waterMarkProp.text = this.user.name;
1176
+ });
1177
+ },
1178
+ computed: {
1179
+ ...mapGetters(['user', 'sidebar']),
1180
+ bindTableColumns() {
1181
+ return this.tableHeader.filter(column => column.isShow);
1182
+ },
1183
+ currentImage() {
1184
+ console.log(this.currentIndex - 1);
1185
+ return this.imageArray[this.currentIndex - 1].url;
1186
+ },
1187
+ },
1188
+ methods: {
1189
+ clear(async) {
1190
+ this.$nextTick(() => {
1191
+ if (!async) {
1192
+ // ios 手机有延迟问题
1193
+ setTimeout(() => {
1194
+ const { select } = this.$refs;
1195
+ const input = select.$el.querySelector('.el-input__inner');
1196
+ input.removeAttribute('readonly');
1197
+ }, 200);
1198
+ }
1199
+ });
1200
+ },
1201
+
1202
+ // 地区联动获取数据
1203
+ getPosition(val, cb) {
1204
+ let vm = this; //查询省市县
1205
+ let params = { parent: 1 };
1206
+ if (!val) {
1207
+ //初始化加载 获取所有省份数据
1208
+ params = { parent: 1 };
1209
+ } else if (val.length === 1) {
1210
+ //加载二级 获取市级数据
1211
+ params = { parent: val[0] };
1212
+ } else {
1213
+ //加载3级 获取县级数据
1214
+ params = { parent: val[1] };
1215
+ }
1216
+ institutionMonitor
1217
+ .queryNation(params)
1218
+ .then(res => {
1219
+ if (!val) {
1220
+ //初始化加载 查询省份数据
1221
+ vm.provinceList = res.content.map(e => {
1222
+ return {
1223
+ value: e.saleid,
1224
+ label: e.province,
1225
+ cities: [],
1226
+ };
1227
+ });
1228
+ } else if (val.length === 1) {
1229
+ //加载二级 查询该省下市级数据
1230
+ vm.provinceList.map(item => {
1231
+ if (item.value === val[0]) {
1232
+ item.cities = res.content.map(e => {
1233
+ return {
1234
+ value: e.saleid,
1235
+ label: e.city || e.county,
1236
+ cities: [],
1237
+ };
1238
+ });
1239
+ }
1240
+ });
1241
+ } else {
1242
+ //加载3级 查询该省市下县级数据
1243
+ vm.provinceList.map(item => {
1244
+ if (item.value === val[0]) {
1245
+ item.cities.map(value => {
1246
+ if (value.value === val[1]) {
1247
+ value.cities = res.content.map(e => {
1248
+ return { value: e.saleid, label: e.county };
1249
+ });
1250
+ }
1251
+ });
1252
+ }
1253
+ });
1254
+ }
1255
+ cb && cb(res);
1256
+ })
1257
+ .catch(err => {
1258
+ console.log(err);
1259
+ });
1260
+ },
1261
+ // 一级二级改变的时候调取下一级数据
1262
+ handleItemChange(val) {
1263
+ this.getPosition(val);
1264
+ },
1265
+ addressChange() {
1266
+ if (this.query.address.length > 0) {
1267
+ this.query.province = this.query.address[0];
1268
+ this.query.city = this.query.address[1];
1269
+ this.query.district = this.query.address[2];
1270
+ } else {
1271
+ this.query.province = '';
1272
+ this.query.city = '';
1273
+ this.query.district = '';
1274
+ }
1275
+ this.crud.toQuery();
1276
+ },
1277
+ forceUpdate() {
1278
+ this.$forceUpdate(); // 强制刷新
1279
+ },
1280
+ // setTableHeight() {
1281
+ // setTimeout(() => {
1282
+ // const dataArchiveContainer = this.$refs.dataArchiveContainer;
1283
+ // const dataArchiveTable = this.$refs.dataArchiveTable;
1284
+ // this.tableShowHeight =
1285
+ // dataArchiveContainer.clientHeight -
1286
+ // (dataArchiveTable.offsetTop - dataArchiveContainer.offsetTop) -
1287
+ // 30;
1288
+ // }, 1000);
1289
+ // },
1290
+ getUpdate(row) {
1291
+ this.clickRow = row;
1292
+ echoPatientInfo(encodeURIComponent(row.id)).then(res => {
1293
+ this.form.mobilePhone = res.mobilePhone;
1294
+ this.form.idCardNo = res.idCardNo;
1295
+ this.form.patientName = res.patientName;
1296
+ this.form.examItemCode = res.examItemCode;
1297
+ });
1298
+
1299
+ this.updateInfoShow = true;
1300
+ },
1301
+ sureUpdate() {
1302
+ this.$refs.form.validate(valid => {
1303
+ console.log(valid, this.$refs.form, 'valid');
1304
+ if (!valid) return false;
1305
+ let data = {
1306
+ ...this.form,
1307
+ userName: this.user.username,
1308
+ accessNumber: this.clickRow.accessNumber,
1309
+ hospitalId: this.clickRow.hospitalId,
1310
+ id: this.clickRow.id,
1311
+ studyUid: this.clickRow.studyUid,
1312
+ };
1313
+ updatePatientInfo(data).then(res => {
1314
+ if (res == 'ERROR_MSG') {
1315
+ this.$message.error('身份证不正确,请重新输入');
1316
+ } else {
1317
+ this.$message.success('修改成功');
1318
+ this.beforeClose();
1319
+ this.crud.toQuery();
1320
+ }
1321
+ });
1322
+ });
1323
+ },
1324
+ operateDonwnLoad(row) {
1325
+ this.downLoadShow = true;
1326
+ operateDonwnLoad(row).then(res => {
1327
+ console.log(res);
1328
+ this.pramsUrl = res;
1329
+ });
1330
+ },
1331
+ btnCopy() {
1332
+ let textUrl = new Clipboard('.btn');
1333
+ console.log(textUrl);
1334
+ textUrl.on('success', e => {
1335
+ console.log(e.action);
1336
+ this.$message('复制成功');
1337
+ textUrl.destroy();
1338
+ });
1339
+ textUrl.on('error', () => {
1340
+ consold.log('没有复制成功');
1341
+ this.$message('没有复制成功');
1342
+ textUrl.destroy();
1343
+ });
1344
+ },
1345
+ openHref() {
1346
+ window.open(`${this.pramsUrl.shortUrl}`, '_blank');
1347
+ },
1348
+ beforeClose() {
1349
+ this.$refs.form.resetFields();
1350
+ this.updateInfoShow = false;
1351
+ },
1352
+ beforeClose1() {
1353
+ this.pramsUrl = {};
1354
+ this.downLoadShow = false;
1355
+ },
1356
+ //重置
1357
+ ResetClick() {
1358
+ for (let key in this.query) {
1359
+ if (key !== 'checkTime') {
1360
+ this.query[key] = '';
1361
+ }
1362
+ }
1363
+ this.getPosition(null, () => {});
1364
+ this.query.address = [window.config.defaultAddress];
1365
+ this.query.province = this.query.address[0];
1366
+ this.crud.toQuery();
1367
+ },
1368
+ //获取检查机构下拉列表
1369
+ getHospital() {
1370
+ getHospital().then(res => {
1371
+ this.optionsDefault = res.content;
1372
+ this.options = res.content;
1373
+ });
1374
+ },
1375
+ //检查机构筛选
1376
+ remoteMethod(query) {
1377
+ this.options = this.optionsDefault.filter((item, index) => {
1378
+ return item.hospitalName.indexOf(query) !== -1;
1379
+ });
1380
+ },
1381
+
1382
+ handleClose() {
1383
+ this.dataArchiveVisible = false;
1384
+ },
1385
+ getRowKeys(row) {
1386
+ return row.id;
1387
+ },
1388
+
1389
+ //无校验二维码
1390
+ showQRCodeDetail(row) {
1391
+ this.$nextTick(res => {
1392
+ this.showReport = false;
1393
+ this.showQRCode = true;
1394
+ this.showUrlKey = false;
1395
+ let data = {
1396
+ hospitalId: row.hospitalId,
1397
+ applyHospitalId: row.applyHospitalId,
1398
+ accessNumber: row.accessNumber,
1399
+ };
1400
+
1401
+ getNewScanString(data).then(res => {
1402
+ this.scanString = res;
1403
+ if (this.showQRCode) {
1404
+ this.dataArchiveVisible = true;
1405
+ }
1406
+ });
1407
+ });
1408
+ },
1409
+ //查看报告
1410
+ showReportDetail() {
1411
+ this.dataArchiveVisible = true;
1412
+ this.showReport = true;
1413
+ this.showQRCode = false;
1414
+ this.showUrlKey = false;
1415
+ },
1416
+ //删除记录
1417
+ delRecordsShow() {
1418
+ this.dataArchiveVisible = true;
1419
+ this.showReport = false;
1420
+ this.showQRCode = false;
1421
+ this.showUrlKey = false;
1422
+ this.delTableShow = true;
1423
+ },
1424
+ //删除按钮
1425
+ delAction() {
1426
+ if (this.multiSelection.length == 0) {
1427
+ return this.$message.info('请至少选择一条数据!');
1428
+ }
1429
+ this.$confirm('删除后云端将无此数据,是否删除?', '提示', {
1430
+ confirmButtonText: '确定',
1431
+ cancelButtonText: '取消',
1432
+ type: 'warning',
1433
+ })
1434
+ .then(() => {
1435
+ let ids = [];
1436
+ this.multiSelection.forEach((item, index) => {
1437
+ ids.push(item.id);
1438
+ });
1439
+ // this.$store.state.user.username
1440
+ // console.log(this.user.username,'this.user.username')
1441
+ let data = {
1442
+ ids: ids,
1443
+ loginName: this.user.username,
1444
+ };
1445
+ deletePatients(data).then(res => {
1446
+ console.log(res);
1447
+ if (res == undefined) {
1448
+ this.crud.toQuery();
1449
+ this.$message({
1450
+ type: 'success',
1451
+ message: '删除成功!',
1452
+ });
1453
+ }
1454
+ });
1455
+ })
1456
+ .catch(() => {});
1457
+ },
1458
+ updateIsImageService() {
1459
+ let ids = [];
1460
+ this.multiSelection.forEach((item, index) => {
1461
+ ids.push(item.id);
1462
+ });
1463
+ let data = {
1464
+ ids,
1465
+ isImageService: this.isImageService,
1466
+ };
1467
+ console.log(data);
1468
+ updateIsImageService(data)
1469
+ .then(res => {
1470
+ this.chargeStatusShow = false;
1471
+ this.crud.toQuery();
1472
+ this.$message({
1473
+ type: 'info',
1474
+ message: '收费状态修改中,稍后查看!',
1475
+ });
1476
+ })
1477
+ .catch(err => {
1478
+ this.chargeStatusShow = false;
1479
+ });
1480
+ },
1481
+ //浏览图像
1482
+ imageBrower(row) {
1483
+ let data = {
1484
+ urlKey: row.urlKey,
1485
+ studyUid: row.studyUid,
1486
+ accessNumber: row.accessNumber,
1487
+ hospitalId: row.hospitalId,
1488
+ };
1489
+ viewImage(data).then(res => {
1490
+ if (res) {
1491
+ window.open(res);
1492
+ }
1493
+ });
1494
+ },
1495
+ SMSnotice(row) {
1496
+ this.SMSnoticeObj = row;
1497
+ this.SMSnoticeShow = true;
1498
+ },
1499
+ submitSMSnotice() {
1500
+ this.$confirm('确定要发送向该手机号的短信通知 ?', '提示', {
1501
+ confirmButtonText: '确定',
1502
+ cancelButtonText: '取消',
1503
+ type: 'warning',
1504
+ }).then(() => {
1505
+ let iphoneRule = /^[1][3,4,5,6.7,8,9][0-9]{9}$/;
1506
+ if (iphoneRule.test(this.SMSnoticeObj.mobilePhone)) {
1507
+ let params = {
1508
+ hospitalId: this.SMSnoticeObj.hospitalId,
1509
+ accessNumber: this.SMSnoticeObj.accessNumber,
1510
+ applyHospitalName: this.SMSnoticeObj.applyHospitalName,
1511
+ mobilePhone: this.SMSnoticeObj.mobilePhone,
1512
+ patientName: this.SMSnoticeObj.patientName,
1513
+ modality: this.SMSnoticeObj.modality,
1514
+ };
1515
+ sendMessage(params)
1516
+ .then(res => {
1517
+ this.$message.success('发送成功');
1518
+ this.closeSMS();
1519
+ })
1520
+ .catch(err => {});
1521
+ } else {
1522
+ this.$message.warning('该编号手机号码有误,无法发送短信通知');
1523
+ }
1524
+ });
1525
+ },
1526
+ closeSMS() {
1527
+ this.SMSnoticeShow = false;
1528
+ },
1529
+ closecharge() {
1530
+ this.chargeStatusShow = false;
1531
+ },
1532
+ exportExcel(row) {
1533
+ if (!this.query.hosId) {
1534
+ return this.$message.info('请选择一家机构!');
1535
+ }
1536
+ this.validateShow = true;
1537
+ this.validateForm.mobilePhone = this.user.phone;
1538
+ },
1539
+ closeValidate() {
1540
+ this.$refs.validateForm.resetFields();
1541
+ window.clearInterval(this.timer);
1542
+ this.btnText = '获取验证码';
1543
+ this.totalTime = 60;
1544
+ this.canClick = false;
1545
+ this.validateShow = false;
1546
+ },
1547
+ checkReport(row, status) {
1548
+ if (status == 1) {
1549
+ this.imageTitle = '电子报告';
1550
+ this.getReport(row);
1551
+ } else {
1552
+ this.imageTitle = '电子胶片';
1553
+ this.getImagefilm(row);
1554
+ }
1555
+ },
1556
+ getReport(row) {
1557
+ let data = {
1558
+ hospitalId: row.hospitalId,
1559
+ accessNumber: row.accessNumber,
1560
+ };
1561
+ checkExistByOriginalReport(data).then(res => {
1562
+ let array = [];
1563
+ if (res.length == 0) return this.$message.info('暂无电子报告');
1564
+ this.imageReportShow = true;
1565
+ res.forEach(item => {
1566
+ let data = {
1567
+ accessNumber: item.accessNumber,
1568
+ hospitalId: item.hospitalId,
1569
+ formType: item.formType,
1570
+ };
1571
+ // let image = `${window.config.baseUrl}/patient/retrieveTypesettingFilm`;
1572
+ getReportStream(data)
1573
+ .then(result => {})
1574
+ .catch(result => {
1575
+ let blob = new Blob([result], { type: 'image/png' }); // 创建一个Blob对象,并指定文件类型
1576
+ let imageUrl = URL.createObjectURL(blob);
1577
+ let params = {
1578
+ ...data,
1579
+ url: imageUrl,
1580
+ };
1581
+ array.push(params);
1582
+ });
1583
+ });
1584
+ this.imageArray = array;
1585
+ console.log(this.imageArray);
1586
+ });
1587
+ },
1588
+ // // 预览图片
1589
+ // previewImage() {
1590
+ // if (!this.viewer) {
1591
+ // console.log(this.$el.querySelector("img"));
1592
+ // this.viewer = new Viewer(this.$el.querySelector("img"), {
1593
+ // // 可以根据需要设置viewer的配置选项
1594
+ // });
1595
+ // this.viewer.show();
1596
+ // } else {
1597
+ // this.viewer.show();
1598
+ // }
1599
+ // },
1600
+ getImagefilm(row) {
1601
+ let data = {
1602
+ hospitalId: row.hospitalId,
1603
+ accessNumber: row.accessNumber,
1604
+ };
1605
+ getTypesettingFilmInfo(data).then(res => {
1606
+ let array = [];
1607
+ if (res.content.length == 0) return this.$message.info('暂无电子胶片');
1608
+ this.imageReportShow = true;
1609
+
1610
+ res.content.forEach(item => {
1611
+ let data = {
1612
+ accessNumber: item.accessNumber,
1613
+ hospitalId: item.hospitalId,
1614
+ typesettingFilmFileId: item.typesettingFilmFileId,
1615
+ contentType: 'image/jpeg',
1616
+ };
1617
+ // let image = `${window.config.baseUrl}/patient/retrieveTypesettingFilm`;
1618
+ retrieveTypesettingFilm(data)
1619
+ .then(result => {})
1620
+ .catch(result => {
1621
+ let blob = new Blob([result], { type: 'image/png' }); // 创建一个Blob对象,并指定文件类型
1622
+ let imageUrl = URL.createObjectURL(blob);
1623
+ let params = {
1624
+ ...data,
1625
+ url: imageUrl,
1626
+ };
1627
+ array.push(params);
1628
+ });
1629
+ });
1630
+ this.imageArray = array;
1631
+ console.log(this.imageArray);
1632
+ });
1633
+ },
1634
+ closeReport() {
1635
+ this.imageReportShow = false;
1636
+ this.currentIndex = 1;
1637
+ this.imageArray = [];
1638
+ this.loadingText = '加载中';
1639
+ },
1640
+ prevImage() {
1641
+ if (this.currentIndex > 0) {
1642
+ this.currentIndex--;
1643
+ }
1644
+ },
1645
+ exportLog() {
1646
+ this.exportLogShow = true;
1647
+ },
1648
+ closeExportLog() {
1649
+ this.exportLogShow = false;
1650
+ },
1651
+ deleteImage() {
1652
+ if (this.imageArray.length == 0) return this.$message.info('没有数据可删除');
1653
+ this.$confirm('此操作将删除该条数据,是否继续?', '提示', {
1654
+ confirmButtonText: '确定',
1655
+ cancelButtonText: '取消',
1656
+ type: 'warning',
1657
+ }).then(() => {
1658
+ if (this.imageTitle == '电子报告') {
1659
+ removeApplyOrReportFile(this.imageArray[this.currentIndex - 1]).then(res => {
1660
+ this.$message.success('删除成功');
1661
+ this.imageArray.splice(this.currentIndex - 1, 1);
1662
+ if (this.currentIndex >= this.imageArray.length) {
1663
+ this.currentIndex = this.imageArray.length;
1664
+ }
1665
+ if (this.imageArray.length == 0) this.closeReport();
1666
+ });
1667
+ } else {
1668
+ removeTypesettingFilm(this.imageArray[this.currentIndex - 1]).then(res => {
1669
+ this.$message.success('删除成功');
1670
+ this.imageArray.splice(this.currentIndex - 1, 1);
1671
+ if (this.currentIndex >= this.imageArray.length) {
1672
+ this.currentIndex = this.imageArray.length;
1673
+ }
1674
+ if (this.imageArray.length == 0) this.closeReport();
1675
+ });
1676
+ }
1677
+ });
1678
+ },
1679
+ nextImage() {
1680
+ if (this.currentIndex < this.imageArray.length) {
1681
+ this.currentIndex++;
1682
+ }
1683
+ },
1684
+ //获取图像
1685
+ getImage(row) {
1686
+ this.$message.warning('开始获取,请稍后手动刷新页面查看');
1687
+ updateOssStatus(row.id).then(res => {
1688
+ this.crud.toQuery();
1689
+ });
1690
+ },
1691
+ validateBtn() {
1692
+ console.log(this.dict.isOss_status);
1693
+ this.$refs.imageRuleForm.validate(valid => {
1694
+ if (valid) {
1695
+ this.visible = true;
1696
+ } else {
1697
+ this.visible = false;
1698
+ return false;
1699
+ }
1700
+ });
1701
+ },
1702
+ // 获取验证码
1703
+ getCode() {
1704
+ let _this = this;
1705
+ if (this.canClick) return;
1706
+ this.canClick = true;
1707
+ sendMsgCode({
1708
+ telNum: this.validateForm.mobilePhone,
1709
+ }).then(res => {});
1710
+ this.btnText = this.totalTime + 's后重新发送';
1711
+ this.timer = window.setInterval(() => {
1712
+ this.totalTime--;
1713
+ this.btnText = this.totalTime + 's后重新发送';
1714
+ if (this.totalTime < 0) {
1715
+ window.clearInterval(_this.timer);
1716
+ this.btnText = '重新获取验证码';
1717
+ this.totalTime = 60;
1718
+ this.canClick = false;
1719
+ }
1720
+ }, 1000);
1721
+ },
1722
+ sureExport() {
1723
+ let _this = this;
1724
+ this.$refs.validateForm.validate(valid => {
1725
+ if (!valid) return false;
1726
+ this.downloadLoading = true;
1727
+ let query = {
1728
+ ...this.query,
1729
+ telNum: this.validateForm.mobilePhone,
1730
+ code: this.validateForm.code,
1731
+ };
1732
+ download('patient/exprotQueryPatient', query)
1733
+ .then(result => {
1734
+ this.downloadLoading = false;
1735
+ })
1736
+ .catch(e => {
1737
+ console.log(e);
1738
+ const reader = new FileReader();
1739
+ // 设置读取完成后的回调函数
1740
+ reader.onload = function (event) {
1741
+ const jsonText = event.target.result; // 获取读取的结果(JSON 字符串)
1742
+ console.log(jsonText.includes('code'));
1743
+
1744
+ if (jsonText.includes('code')) {
1745
+ let data = JSON.parse(jsonText);
1746
+ _this.$message.error(data.message);
1747
+ } else {
1748
+ downloadFile(e, '归档数据', 'xlsx');
1749
+ _this.validateShow = false;
1750
+ }
1751
+ };
1752
+ reader.readAsText(e);
1753
+ // downloadFile(e, "归档数据", "xlsx");
1754
+ this.downloadLoading = false;
1755
+ });
1756
+ });
1757
+ },
1758
+ //修改url Key
1759
+ editUrlKey() {
1760
+ if (this.multiSelection.length == 0) {
1761
+ return this.$message.info('请至少选择一条数据!');
1762
+ }
1763
+ // 不同的UrlKey 给出提示
1764
+ let urlKeyList = [];
1765
+ this.multiSelection.forEach((item, index) => {
1766
+ urlKeyList.push(item.urlKey);
1767
+ });
1768
+ let urlKeyFilterList = new Set(urlKeyList);
1769
+ urlKeyFilterList = Array.from(urlKeyFilterList);
1770
+ console.log(urlKeyFilterList, urlKeyList);
1771
+ if (this.multiSelection.length !== 1 && urlKeyList.length == urlKeyFilterList.length) {
1772
+ return this.$message.warning('请选择urlKey值相同的数据!');
1773
+ }
1774
+ this.ruleForm.urlKey = this.multiSelection[0].urlKey;
1775
+ this.dataArchiveVisible = true;
1776
+ this.showReport = false;
1777
+ this.showQRCode = false;
1778
+ this.showUrlKey = true;
1779
+ },
1780
+ //dialog 确定按钮
1781
+ dialogSubmit() {
1782
+ this.$refs.ruleForm.validate(valid => {
1783
+ if (valid) {
1784
+ if (this.showUrlKey) {
1785
+ let ids = [];
1786
+ this.multiSelection.forEach((item, index) => {
1787
+ ids.push(item.id);
1788
+ });
1789
+ let data = {
1790
+ ids: ids,
1791
+ urlKey: this.ruleForm.urlKey,
1792
+ };
1793
+ modifyUrlKey(data).then(res => {
1794
+ if (res == undefined) {
1795
+ this.dataArchiveVisible = false;
1796
+ this.crud.toQuery();
1797
+ return this.$message.success('修改成功!');
1798
+ }
1799
+ });
1800
+ }
1801
+ }
1802
+ });
1803
+ },
1804
+ handleSelectionChange(val) {
1805
+ console.log('选中多选', val);
1806
+ this.multiSelection = val;
1807
+ },
1808
+ // 新增与编辑前做的操作
1809
+ [CRUD.HOOK.afterToCU](crud, form) {},
1810
+ [CRUD.HOOK.beforeRefresh](crud, form) {
1811
+ if (!this.crudShow) {
1812
+ this.getPosition(null, () => {});
1813
+ this.query.address = [window.config.defaultAddress];
1814
+ this.query.province = this.query.address[0];
1815
+
1816
+ this.crudShow = true;
1817
+ }
1818
+ },
1819
+ [CRUD.HOOK.afterRefresh](crud, form) {
1820
+ crud.data.forEach(tmp => {
1821
+ if (tmp.standardProjectCode) tmp.standardProjectCode = tmp.standardProjectCode.split(',');
1822
+ if (tmp.standardProjectName) tmp.standardProjectName = tmp.standardProjectName.split(',');
1823
+ if (tmp.examItemCode) tmp.examItemCode = tmp.examItemCode.split(',');
1824
+ if (tmp.examItemName) tmp.examItemName = tmp.examItemName.split(',');
1825
+ });
1826
+ },
1827
+ //弹出框打开
1828
+ dialogOpen() {},
1829
+ //关闭弹出框
1830
+ dialogClose() {
1831
+ this.delTableShow = false;
1832
+ this.scanString = [];
1833
+ if (document.getElementById('qrcodeDom')) {
1834
+ document.getElementById('qrcodeDom').innerHTML = '';
1835
+ }
1836
+ },
1837
+ // 选中图标
1838
+ selected(name) {
1839
+ this.form.icon = name;
1840
+ },
1841
+
1842
+ //获取当前数据
1843
+ handleCurrentChange(val) {
1844
+ this.currentRow = val;
1845
+ console.log(this.currentRow, 'val', '741');
1846
+ },
1847
+ //生成二维码
1848
+ transQrcode() {
1849
+ this.$nextTick(() => {
1850
+ this.qrcode = new QRCode('qrcodeDom', {
1851
+ widht: 250,
1852
+ height: 250,
1853
+ text: this.scanString,
1854
+ });
1855
+ });
1856
+ },
1857
+ inkured() {
1858
+ this.$nextTick(() => {
1859
+ this.$refs.multipleTable.doLayout();
1860
+ });
1861
+ },
1862
+ },
1863
+ activated() {
1864
+ this.$nextTick(() => {
1865
+ this.fixedDivHeight = this.$refs.fixedDiv.clientHeight - 25;
1866
+ console.log(this.fixedDivHeight);
1867
+ });
1868
+
1869
+ this.crud.toQuery();
1870
+ },
1871
+ };
1872
+ </script>
1873
+ // App.vue
1874
+ <style lang="scss">
1875
+ // to fix 在ios设备中,el-select组件下拉框,点击2次才能选中问题。
1876
+ .el-scrollbar .el-scrollbar__bar {
1877
+ opacity: 1 !important;
1878
+ }
1879
+ .phone-box {
1880
+ .el-form-item {
1881
+ width: 100%;
1882
+ .el-form-item__content {
1883
+ width: calc(100% - 100px);
1884
+ }
1885
+ }
1886
+ }
1887
+ .report-dialog {
1888
+ .dialog-footer {
1889
+ display: flex;
1890
+ justify-content: space-between;
1891
+ .footer-left {
1892
+ display: flex;
1893
+ align-items: center;
1894
+ p {
1895
+ margin: 0 15px;
1896
+ span {
1897
+ color: #0089ff;
1898
+ }
1899
+ }
1900
+ }
1901
+ }
1902
+ }
1903
+ .el-dropdown {
1904
+ margin-left: 10px;
1905
+ span {
1906
+ color: #0089ff;
1907
+ }
1908
+ .el-dropdown-menu {
1909
+ display: flex;
1910
+ flex-direction: column;
1911
+ }
1912
+ }
1913
+ </style>
1914
+ <style rel="stylesheet/scss" lang="scss" scoped>
1915
+ .app-container {
1916
+ display: flex;
1917
+ flex-direction: column;
1918
+ border: 1px solid #dcdfe6;
1919
+ padding: 8px;
1920
+ }
1921
+ ::v-deep .el-table__fixed-right {
1922
+ height: 100% !important;
1923
+ }
1924
+ ::v-deep .el-dropdown-menu__item {
1925
+ width: 100%;
1926
+ padding: 0;
1927
+ height: auto;
1928
+ .el-button {
1929
+ width: 100%;
1930
+ padding: 0 20px;
1931
+ height: 36px;
1932
+ line-height: 36px;
1933
+ span {
1934
+ display: inline-block;
1935
+ width: 100%;
1936
+ height: 100%;
1937
+ }
1938
+ }
1939
+ }
1940
+ .query-container {
1941
+ background: #fff;
1942
+ // padding: 10px;
1943
+ padding-bottom: 0;
1944
+ }
1945
+ .head-container {
1946
+ // position: fixed;
1947
+ // z-index: 10;
1948
+ // margin: -16px 0 0 -15px;
1949
+ }
1950
+ .box-card {
1951
+ // margin-top: 230px;
1952
+ border: 1px solid #dcdfe6;
1953
+ padding: 15px;
1954
+ }
1955
+ .warning {
1956
+ height: 30px;
1957
+ line-height: 30px;
1958
+ background-color: #f8f9fa;
1959
+ padding: 0 10px;
1960
+ margin-bottom: 10px;
1961
+ span {
1962
+ color: #ff7b35;
1963
+ &:last-child {
1964
+ font-size: 13px;
1965
+ display: inline-block;
1966
+ margin-left: 5px;
1967
+ }
1968
+ }
1969
+ }
1970
+ .download {
1971
+ > div {
1972
+ display: flex;
1973
+ align-items: center;
1974
+ > p {
1975
+ text-align: right;
1976
+ width: 60px;
1977
+ }
1978
+ .hover:hover {
1979
+ color: #0089ff;
1980
+ }
1981
+ &:last-child {
1982
+ margin: 10px 0;
1983
+ }
1984
+ }
1985
+ }
1986
+ ::v-deep .el-input-number .el-input__inner {
1987
+ text-align: left;
1988
+ }
1989
+ ::v-deep .el-button.filter-item {
1990
+ color: #1890ff;
1991
+ border: 1px solid #1890ff;
1992
+ }
1993
+
1994
+ ::v-deep .vue-treeselect__control,
1995
+ ::v-deep .vue-treeselect__placeholder,
1996
+ ::v-deep .vue-treeselect__single-value {
1997
+ height: 30px;
1998
+ line-height: 30px;
1999
+ }
2000
+ ::v-deep.el-form-item {
2001
+ margin-bottom: 16px;
2002
+ }
2003
+ .demo-form-dataArchive {
2004
+ position: relative;
2005
+ background-color: #fff;
2006
+ // z-index: 10;
2007
+ .el-form-item {
2008
+ margin-bottom: 0;
2009
+ }
2010
+ }
2011
+
2012
+ .patientDetail {
2013
+ padding: 10px 0;
2014
+
2015
+ span {
2016
+ color: #606266;
2017
+ font-weight: bold;
2018
+ }
2019
+ }
2020
+
2021
+ .paddingClass {
2022
+ padding: 10px 0;
2023
+ }
2024
+
2025
+ #qrcodeDom {
2026
+ position: relative;
2027
+
2028
+ display: flex;
2029
+ align-items: center;
2030
+ justify-content: center;
2031
+ }
2032
+
2033
+ #qrCodeIco {
2034
+ position: absolute;
2035
+ width: 40px;
2036
+ height: 40px;
2037
+ left: 50%;
2038
+ top: 50%;
2039
+ margin-left: -20px;
2040
+ margin-top: -20px;
2041
+ z-index: 99;
2042
+ background-color: #fff;
2043
+ }
2044
+
2045
+ .showUrlKeyWarn {
2046
+ padding: 10px 0;
2047
+ }
2048
+
2049
+ .OperationFlex {
2050
+ display: flex;
2051
+ }
2052
+
2053
+ .imageStateDialog {
2054
+ display: flex;
2055
+ flex-direction: column;
2056
+ }
2057
+ .scanImg {
2058
+ display: flex;
2059
+ justify-content: center;
2060
+ img {
2061
+ width: 200px;
2062
+ margin: 0 20px;
2063
+ }
2064
+ span {
2065
+ margin-top: 8px;
2066
+ }
2067
+ }
2068
+ .qrcode {
2069
+ display: flex;
2070
+ align-items: center;
2071
+ justify-content: center;
2072
+ div {
2073
+ display: flex;
2074
+ flex-direction: column;
2075
+ align-items: center;
2076
+ justify-content: center;
2077
+ }
2078
+ }
2079
+ .SMSnoticeStyle {
2080
+ & > div {
2081
+ color: #111111;
2082
+ line-height: 32px;
2083
+ }
2084
+ }
2085
+ .warningStyle {
2086
+ margin-top: 15px;
2087
+ }
2088
+ .checkReportImage {
2089
+ height: 70vh;
2090
+ overflow: auto;
2091
+ display: flex;
2092
+ // align-items: center;
2093
+ justify-content: center;
2094
+ img {
2095
+ width: auto;
2096
+ height: 100%;
2097
+ }
2098
+ p {
2099
+ font-size: 16px;
2100
+ color: #111111;
2101
+ margin-top: 30%;
2102
+ }
2103
+ }
2104
+ </style>