vue2-client 1.15.84 → 1.15.86

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 (377) hide show
  1. package/.claude/settings.local.json +12 -0
  2. package/.editorconfig +9 -9
  3. package/.env +20 -20
  4. package/.env.development +1 -1
  5. package/.env.iot +19 -19
  6. package/.env.message +19 -19
  7. package/.env.revenue +19 -19
  8. package/.env.runtime +19 -19
  9. package/.eslintrc.json +5 -5
  10. package/CLAUDE.md +89 -89
  11. package/README.md +65 -65
  12. package/babel.config.js +21 -21
  13. package/docs/Logic/345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +46 -46
  14. package/docs/notice.md +22 -22
  15. package/docs//345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +179 -179
  16. package/jest.config.js +22 -22
  17. package/package.json +111 -111
  18. package/src/App.vue +196 -196
  19. package/src/ReportView.js +13 -13
  20. package/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox.vue +532 -532
  21. package/src/base-client/components/common/AddressSearchCombobox/index.js +3 -3
  22. package/src/base-client/components/common/AmapMarker/index.js +3 -3
  23. package/src/base-client/components/common/CitySelect/CitySelect.vue +376 -376
  24. package/src/base-client/components/common/CitySelect/demo.vue +43 -43
  25. package/src/base-client/components/common/ColorPickerCombobox/ColorPickerCombobox.vue +99 -99
  26. package/src/base-client/components/common/ColorPickerCombobox/demo.vue +34 -34
  27. package/src/base-client/components/common/FormGroupEdit/FormGroupEdit.vue +146 -146
  28. package/src/base-client/components/common/JSONToTree/index.js +3 -3
  29. package/src/base-client/components/common/Upload/Upload.vue +323 -323
  30. package/src/base-client/components/common/XAddForm/index.js +3 -3
  31. package/src/base-client/components/common/XAddForm/index.md +61 -61
  32. package/src/base-client/components/common/XAddNativeForm/XAddNativeForm.vue +1169 -1169
  33. package/src/base-client/components/common/XAddNativeForm/demo.vue +54 -40
  34. package/src/base-client/components/common/XAddNativeForm/index.js +3 -3
  35. package/src/base-client/components/common/XAddReport/XAddReport.vue +212 -212
  36. package/src/base-client/components/common/XBadge/index.js +3 -3
  37. package/src/base-client/components/common/XBadge/index.md +39 -39
  38. package/src/base-client/components/common/XButtons/XButtons.vue +284 -284
  39. package/src/base-client/components/common/XCalendar/XCalendar.vue +369 -369
  40. package/src/base-client/components/common/XCalendar/index.md +284 -284
  41. package/src/base-client/components/common/XCard/index.js +3 -3
  42. package/src/base-client/components/common/XCard/index.md +43 -43
  43. package/src/base-client/components/common/XCardSet/XCardSet.vue +300 -300
  44. package/src/base-client/components/common/XCollapse/XCollapse.vue +354 -354
  45. package/src/base-client/components/common/XConversation/XConversation.vue +576 -576
  46. package/src/base-client/components/common/XConversation/XConversationDemo.vue +28 -28
  47. package/src/base-client/components/common/XDataCard/XDataCard.vue +629 -629
  48. package/src/base-client/components/common/XDatePicker/index.vue +276 -276
  49. package/src/base-client/components/common/XDescriptions/XDescriptions.vue +174 -174
  50. package/src/base-client/components/common/XDescriptions/XDescriptionsGroup.vue +314 -314
  51. package/src/base-client/components/common/XDescriptions/demo.vue +51 -51
  52. package/src/base-client/components/common/XForm/XForm.vue +420 -420
  53. package/src/base-client/components/common/XForm/XFormItem.vue +1474 -1390
  54. package/src/base-client/components/common/XForm/XTreeSelect.vue +276 -276
  55. package/src/base-client/components/common/XForm/demo.vue +105 -105
  56. package/src/base-client/components/common/XForm/index.js +3 -3
  57. package/src/base-client/components/common/XFormCol/XFormCol.vue +157 -157
  58. package/src/base-client/components/common/XFormCol/index.js +3 -3
  59. package/src/base-client/components/common/XFormCol/index.md +35 -35
  60. package/src/base-client/components/common/XFormGroup/XFormGroup.vue +301 -301
  61. package/src/base-client/components/common/XFormGroup/demo.vue +41 -41
  62. package/src/base-client/components/common/XFormTable/XFormTable.vue +938 -938
  63. package/src/base-client/components/common/XFormTable/demo.vue +87 -87
  64. package/src/base-client/components/common/XFormTable/index.js +3 -3
  65. package/src/base-client/components/common/XImportExcel/XImportExcel.vue +174 -174
  66. package/src/base-client/components/common/XImportExcel/index.js +3 -3
  67. package/src/base-client/components/common/XImportExcel/index.md +38 -38
  68. package/src/base-client/components/common/XInput/XInput.vue +128 -128
  69. package/src/base-client/components/common/XInput/index.js +3 -3
  70. package/src/base-client/components/common/XInput/index.md +97 -97
  71. package/src/base-client/components/common/XIntervalPicker/XIntervalPicker.vue +121 -121
  72. package/src/base-client/components/common/XLicensePlate/index.js +3 -3
  73. package/src/base-client/components/common/XLicensePlate/index.md +38 -38
  74. package/src/base-client/components/common/XPrint/Demo.vue +41 -41
  75. package/src/base-client/components/common/XPrint/PrintBill.vue +308 -308
  76. package/src/base-client/components/common/XRate/demo.vue +102 -102
  77. package/src/base-client/components/common/XRate/index.vue +149 -149
  78. package/src/base-client/components/common/XReport/XReport.vue +963 -963
  79. package/src/base-client/components/common/XReport/XReportDemo.vue +70 -70
  80. package/src/base-client/components/common/XReport/XReportTrGroup.vue +1005 -1005
  81. package/src/base-client/components/common/XReport/index.md +103 -103
  82. package/src/base-client/components/common/XReportDrawer/XReportDrawer.vue +201 -201
  83. package/src/base-client/components/common/XReportGrid/XReport.vue +1075 -1075
  84. package/src/base-client/components/common/XReportGrid/XReportDemo.vue +44 -44
  85. package/src/base-client/components/common/XReportGrid/XReportDesign.vue +620 -620
  86. package/src/base-client/components/common/XReportGrid/XReportTrGroup.vue +723 -723
  87. package/src/base-client/components/common/XReportGrid/print.js +184 -184
  88. package/src/base-client/components/common/XTab/XTab.vue +299 -299
  89. package/src/base-client/components/common/XTable/ExportExcel.vue +283 -283
  90. package/src/base-client/components/common/XTable/XTable.vue +1599 -1599
  91. package/src/base-client/components/common/XTable/XTableWrapper.vue +597 -597
  92. package/src/base-client/components/common/XTable/index.js +3 -3
  93. package/src/base-client/components/common/XTimeline/XTimeline.vue +358 -358
  94. package/src/base-client/components/common/XTimeline/index.md +191 -191
  95. package/src/base-client/components/common/XTree/XTreePro.vue +452 -452
  96. package/src/base-client/components/common/XTreeOne/index.js +3 -3
  97. package/src/base-client/components/common/XUploadFilesView/index.vue +485 -485
  98. package/src/base-client/components/his/XCharge/XCharge.vue +238 -238
  99. package/src/base-client/components/his/XCheckbox/XCheckbox.vue +105 -105
  100. package/src/base-client/components/his/XCheckbox/index.md +253 -253
  101. package/src/base-client/components/his/XHDescriptions/XHDescriptions.vue +430 -430
  102. package/src/base-client/components/his/XHDescriptions/index.md +217 -217
  103. package/src/base-client/components/his/XHisEditor/XHisEditor.vue +629 -629
  104. package/src/base-client/components/his/XHisEditor/diagnosisAutocomplete.js +263 -263
  105. package/src/base-client/components/his/XList/XList.vue +495 -495
  106. package/src/base-client/components/his/XQuestionnaire/XQuestionnaire.json +3 -3
  107. package/src/base-client/components/his/XQuestionnaire/XQuestionnaire.vue +106 -106
  108. package/src/base-client/components/his/XQuestionnaire/XQuestionnaireDemo.vue +51 -51
  109. package/src/base-client/components/his/XQuestionnaire/XQuestionnaireItem.vue +269 -269
  110. package/src/base-client/components/his/XRadio/XRadio.vue +125 -125
  111. package/src/base-client/components/his/XRadio/index.md +234 -234
  112. package/src/base-client/components/his/XSelect/XSelect.vue +72 -72
  113. package/src/base-client/components/his/XShiftSchedule/XShiftSchedule.vue +234 -234
  114. package/src/base-client/components/his/XShiftSchedule/dome.vue +29 -29
  115. package/src/base-client/components/his/XSidebar/XSidebar.vue +240 -240
  116. package/src/base-client/components/his/XTextCard/XTextCard.vue +207 -207
  117. package/src/base-client/components/his/XTimeSelect/XTimeSelect.vue +162 -162
  118. package/src/base-client/components/his/XTimeSelect/XTimeSelectDemo.vue +23 -23
  119. package/src/base-client/components/his/XTitle/README.md +113 -113
  120. package/src/base-client/components/his/XTitle/XTitle.vue +123 -123
  121. package/src/base-client/components/his/XTreeRows/TreeNode.vue +107 -107
  122. package/src/base-client/components/his/XTreeRows/XTreeRows.vue +307 -307
  123. package/src/base-client/components/his/threeTestOrders/dome.vue +68 -68
  124. package/src/base-client/components/his/threeTestOrders/editor.vue +111 -111
  125. package/src/base-client/components/his/threeTestOrders/textBox.vue +457 -457
  126. package/src/base-client/components/his/threeTestOrders/threeTestOrders.vue +475 -475
  127. package/src/base-client/components/layout/XPageView/RenderRow.vue +88 -88
  128. package/src/base-client/components/layout/XPageView/XErrorView.vue +22 -22
  129. package/src/base-client/components/layout/XPageView/XPageRowTemplate.vue +37 -37
  130. package/src/base-client/components/layout/XPageView/XPageView.vue +223 -223
  131. package/src/base-client/components/layout/XPageView/XTab/XTab.vue +96 -96
  132. package/src/base-client/components/layout/XPageView/XTab/index.js +3 -3
  133. package/src/base-client/components/layout/XPageView/componentTypes.js +22 -22
  134. package/src/base-client/components/layout/XPageView/index.js +2 -2
  135. package/src/base-client/components/layout/XPageView/index.md +96 -96
  136. package/src/base-client/components/system/DictionaryDetailsView/index.js +3 -3
  137. package/src/base-client/components/system/DictionaryDetailsView/index.md +41 -41
  138. package/src/base-client/components/system/LogDetailsView/LogDetailsView.vue +376 -376
  139. package/src/base-client/components/system/LogDetailsView/index.js +3 -3
  140. package/src/base-client/components/system/LogDetailsView/index.md +41 -41
  141. package/src/base-client/components/system/QueryParamsDetailsView/index.js +3 -3
  142. package/src/base-client/components/ticket/TicketDetailsView/TicketDetailsView.vue +807 -807
  143. package/src/base-client/components/ticket/TicketDetailsView/index.js +3 -3
  144. package/src/base-client/components/ticket/TicketDetailsView/index.md +29 -29
  145. package/src/base-client/components/ticket/TicketDetailsView/part/TicketDetailsFlow.vue +260 -260
  146. package/src/base-client/components/ticket/TicketDetailsView/part/index.js +3 -3
  147. package/src/base-client/components/ticket/TicketSubmitSuccessView/TicketSubmitSuccessView.vue +532 -532
  148. package/src/base-client/components/ticket/TicketSubmitSuccessView/index.js +3 -3
  149. package/src/base-client/components/ticket/TicketSubmitSuccessView/index.md +29 -29
  150. package/src/base-client/plugins/AppData.js +126 -126
  151. package/src/base-client/plugins/PagedList.js +177 -177
  152. package/src/base-client/plugins/__tests__/selectValueTypeHelper.test.js +154 -0
  153. package/src/base-client/plugins/authority-plugin.js +167 -167
  154. package/src/base-client/plugins/compatible/LoginServiceOA.js +20 -20
  155. package/src/base-client/plugins/i18n-extend.js +32 -32
  156. package/src/base-client/plugins/moment.js +8 -8
  157. package/src/base-client/plugins/selectValueTypeHelper.js +281 -0
  158. package/src/bootstrap.js +51 -51
  159. package/src/components/Ellipsis/Ellipsis.vue +65 -65
  160. package/src/components/Ellipsis/index.js +3 -3
  161. package/src/components/Ellipsis/index.md +38 -38
  162. package/src/components/FileImageItem/FileItem.vue +320 -320
  163. package/src/components/FileImageItem/FileItemGroup.vue +197 -197
  164. package/src/components/FileImageItem/ImageItem.vue +107 -107
  165. package/src/components/FileImageItem/index.js +4 -4
  166. package/src/components/FilePreview/FilePreview.vue +181 -181
  167. package/src/components/FilePreview/FilePreviewDemo.vue +30 -30
  168. package/src/components/FilePreview/index.js +3 -3
  169. package/src/components/HeightScanner/index.vue +615 -615
  170. package/src/components/STable/README.md +341 -341
  171. package/src/components/STable/index.js +558 -558
  172. package/src/components/TableSetting/TableSetting.vue +143 -143
  173. package/src/components/TableSetting/index.js +3 -3
  174. package/src/components/Trend/Trend.vue +41 -41
  175. package/src/components/Trend/index.js +3 -3
  176. package/src/components/Trend/index.less +41 -41
  177. package/src/components/Trend/index.md +45 -45
  178. package/src/components/_util/util.js +46 -46
  179. package/src/components/cache/AKeepAlive.js +179 -179
  180. package/src/components/exception/typeConfig.js +19 -19
  181. package/src/components/form/FormRow.vue +52 -52
  182. package/src/components/index.less +5 -5
  183. package/src/components/menu/Contextmenu.vue +84 -84
  184. package/src/components/menu/index.less +38 -38
  185. package/src/components/page/header/PageHeader.vue +64 -64
  186. package/src/components/page/header/index.less +40 -40
  187. package/src/components/result/Result.vue +77 -77
  188. package/src/components/setting/SettingItem.vue +26 -26
  189. package/src/components/setting/i18n.js +117 -117
  190. package/src/components/table/StandardTable.vue +141 -141
  191. package/src/components/table/advance/ActionColumns.vue +158 -158
  192. package/src/components/table/advance/ActionSize.vue +45 -45
  193. package/src/components/table/advance/AdvanceTable.vue +275 -275
  194. package/src/components/table/advance/SearchArea.vue +355 -355
  195. package/src/components/table/advance/index.js +2 -2
  196. package/src/components/table/api/ApiTable.vue +50 -50
  197. package/src/components/task/TaskGroup.vue +80 -80
  198. package/src/components/task/TaskItem.vue +26 -26
  199. package/src/components/tool/AvatarList.vue +68 -68
  200. package/src/components/tool/DetailList.vue +157 -157
  201. package/src/components/tool/Drawer.vue +142 -142
  202. package/src/components/tool/FooterToolBar.vue +30 -30
  203. package/src/components/tool/HeadInfo.vue +35 -35
  204. package/src/components/tool/TagSelect.vue +83 -83
  205. package/src/components/tool/TagSelectOption.vue +33 -33
  206. package/src/components/transition/PageToggleTransition.vue +97 -97
  207. package/src/config/default/admin.config.js +18 -18
  208. package/src/config/default/animate.config.js +21 -21
  209. package/src/config/default/index.js +6 -6
  210. package/src/config/index.js +3 -3
  211. package/src/config/replacer/index.js +10 -10
  212. package/src/config/replacer/resolve.config.js +67 -67
  213. package/src/expression/ExpressionRunner.js +26 -26
  214. package/src/expression/TestExpression.js +509 -509
  215. package/src/expression/core/Delegate.js +115 -115
  216. package/src/expression/core/Expression.js +1358 -1358
  217. package/src/expression/core/Program.js +932 -932
  218. package/src/expression/core/Token.js +27 -27
  219. package/src/expression/enums/ExpressionType.js +81 -81
  220. package/src/expression/enums/TokenType.js +11 -11
  221. package/src/expression/exception/BreakWayException.js +2 -2
  222. package/src/expression/exception/ContinueWayException.js +2 -2
  223. package/src/expression/exception/ExpressionException.js +28 -28
  224. package/src/expression/exception/ReturnWayException.js +14 -14
  225. package/src/expression/exception/ServiceException.js +22 -22
  226. package/src/expression/instances/LogicConsole.js +44 -44
  227. package/src/expression/ts/ExpressionRunner.ts +28 -28
  228. package/src/expression/ts/TestExpression.ts +509 -509
  229. package/src/expression/ts/core/Delegate.ts +114 -114
  230. package/src/expression/ts/core/Expression.ts +1309 -1309
  231. package/src/expression/ts/core/Program.ts +950 -950
  232. package/src/expression/ts/core/Token.ts +29 -29
  233. package/src/expression/ts/enums/ExpressionType.ts +81 -81
  234. package/src/expression/ts/enums/TokenType.ts +13 -13
  235. package/src/expression/ts/exception/BreakWayException.ts +2 -2
  236. package/src/expression/ts/exception/ContinueWayException.ts +2 -2
  237. package/src/expression/ts/exception/ExpressionException.ts +28 -28
  238. package/src/expression/ts/exception/ReturnWayException.ts +14 -14
  239. package/src/expression/ts/exception/ServiceException.ts +22 -22
  240. package/src/expression/ts/instances/JSONArray.ts +48 -48
  241. package/src/expression/ts/instances/JSONObject.ts +109 -109
  242. package/src/expression/ts/instances/LogicConsole.ts +32 -32
  243. package/src/layouts/AdminLayout.vue +176 -176
  244. package/src/layouts/BlankView.vue +79 -79
  245. package/src/layouts/ComponentLayoutOne.vue +47 -47
  246. package/src/layouts/GridView.vue +43 -43
  247. package/src/layouts/PageView.vue +55 -55
  248. package/src/layouts/footer/PageFooter.vue +49 -49
  249. package/src/layouts/header/HeaderAvatar.vue +64 -64
  250. package/src/layouts/header/HeaderSearch.vue +67 -67
  251. package/src/layouts/header/index.less +92 -92
  252. package/src/layouts/tabs/TabsView.vue +383 -383
  253. package/src/layouts/tabs/i18n.js +25 -25
  254. package/src/layouts/tabs/index.js +2 -2
  255. package/src/logic/LogicRunner.js +62 -62
  256. package/src/logic/TestLogic.js +13 -13
  257. package/src/logic/plugins/common/DateTools.js +35 -35
  258. package/src/logic/plugins/common/VueTools.js +30 -30
  259. package/src/logic/plugins/index.js +7 -7
  260. package/src/logic/ts/LogicRunner.ts +67 -67
  261. package/src/logic/ts/TestLogic.ts +13 -13
  262. package/src/main.js +33 -33
  263. package/src/mixins/formValidationMixin.js +46 -46
  264. package/src/mock/common/activityData.js +32 -32
  265. package/src/mock/common/index.js +89 -89
  266. package/src/mock/common/reportData.js +20 -20
  267. package/src/mock/common/tableData.js +118 -118
  268. package/src/mock/index.js +12 -12
  269. package/src/mock/project/index.js +17 -17
  270. package/src/mock/user/current.js +13 -13
  271. package/src/mock/user/login.js +39 -39
  272. package/src/mock/user/routes.js +61 -61
  273. package/src/mock/workplace/index.js +15 -15
  274. package/src/pages/LogicCallExample/index.vue +46 -46
  275. package/src/pages/ReportGrid/index.vue +76 -76
  276. package/src/pages/ReportView.vue +50 -50
  277. package/src/pages/WorkflowDetail/WorkFlowDemo.vue +47 -47
  278. package/src/pages/WorkflowDetail/WorkFlowDemo2.vue +204 -204
  279. package/src/pages/WorkflowDetail/WorkFlowDemo3.vue +203 -203
  280. package/src/pages/WorkflowDetail/WorkflowDetail.vue +391 -391
  281. package/src/pages/WorkflowDetail/WorkflowPageDetail/LeaveMessage.vue +388 -388
  282. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowBaseInformation.vue +415 -415
  283. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandle.vue +1766 -1765
  284. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandleReso.vue +975 -975
  285. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowPreview.vue +109 -109
  286. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowTimeline.vue +929 -929
  287. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkOrderParentDetails.vue +222 -222
  288. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowDetailResso.vue +243 -243
  289. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowLog.vue +188 -188
  290. package/src/pages/WorkflowDetail/WorkflowPageDetail/components/WorkflowPersonSelector.vue +109 -109
  291. package/src/pages/WorkflowDetail/WorkflowPageDetail/worklog.vue +97 -97
  292. package/src/pages/XPageViewExample/index.vue +149 -149
  293. package/src/pages/addressSelect/addressDemo.vue +24 -24
  294. package/src/pages/addressSelect/index.vue +270 -270
  295. package/src/pages/dashboard/workplace/i18n.js +40 -40
  296. package/src/pages/dashboard/workplace/index.js +2 -2
  297. package/src/pages/dashboard/workplace/index.less +59 -59
  298. package/src/pages/exception/403.vue +21 -21
  299. package/src/pages/exception/404.vue +24 -24
  300. package/src/pages/exception/500.vue +21 -21
  301. package/src/pages/login/index.js +2 -2
  302. package/src/pages/report/ReportTableHome.vue +28 -28
  303. package/src/pages/resourceManage/depListManage.vue +23 -23
  304. package/src/pages/resourceManage/funListManage.vue +23 -23
  305. package/src/pages/resourceManage/index.js +15 -15
  306. package/src/pages/resourceManage/resourceManageMain.vue +57 -57
  307. package/src/pages/resourceManage/roleListManage.vue +23 -23
  308. package/src/pages/resourceManage/staffListManage.vue +23 -23
  309. package/src/pages/system/file/Info.vue +56 -56
  310. package/src/pages/system/file/index.vue +317 -317
  311. package/src/pages/system/settings/index.vue +126 -126
  312. package/src/pages/userInfoDetailManage/FillCardRecordQuery/index.vue +77 -77
  313. package/src/pages/userInfoDetailManage/FillGasRecordQuery/index.vue +75 -75
  314. package/src/pages/userInfoDetailManage/InsuranceDetailQuery/index.vue +64 -64
  315. package/src/pages/userInfoDetailManage/MachineRecordQuery/index.vue +75 -75
  316. package/src/pages/userInfoDetailManage/OtherChargeRecordQuery/index.vue +75 -75
  317. package/src/pages/userInfoDetailManage/PriceAdjustments/index.vue +64 -64
  318. package/src/pages/userInfoDetailManage/UserChargeRecordQuery/index.vue +94 -94
  319. package/src/pages/userInfoDetailManage/UserException/index.vue +64 -64
  320. package/src/pages/userInfoDetailManage/UserHandRecordQuery/index.vue +87 -87
  321. package/src/pages/userInfoDetailManage/UserRecordQuery/index.vue +74 -74
  322. package/src/pages/userInfoDetailManage/index.vue +290 -290
  323. package/src/pages/userInfoDetailManage/uploadFilesHistory/ImagePreview.vue +101 -101
  324. package/src/pages/userInfoDetailManage/uploadFilesHistory/index.vue +129 -129
  325. package/src/pages/userInfoDetailManage/userInfoDetailQueryTabs.vue +144 -144
  326. package/src/plugins/HiPrintPlugin.js +164 -164
  327. package/src/router/async/router.map.js +126 -126
  328. package/src/router/guards.js +262 -262
  329. package/src/router/i18n.js +57 -57
  330. package/src/router.js +17 -17
  331. package/src/services/api/DictionaryDetailsViewApi.js +6 -6
  332. package/src/services/api/LogDetailsViewApi.js +10 -10
  333. package/src/services/api/QueryParamsDetailsViewApi.js +6 -6
  334. package/src/services/api/logininfor/index.js +6 -6
  335. package/src/services/api/manage.js +8 -8
  336. package/src/services/api/restTools.js +215 -215
  337. package/src/services/api/workFlow.js +57 -57
  338. package/src/services/apiService.js +16 -16
  339. package/src/services/dataSource.js +12 -12
  340. package/src/services/index.js +7 -7
  341. package/src/services/user.js +92 -92
  342. package/src/services/v3Api.js +116 -116
  343. package/src/store/index.js +5 -5
  344. package/src/store/mutation-types.js +4 -4
  345. package/src/theme/antd/ant-menu.less +2 -2
  346. package/src/theme/antd/ant-message.less +3 -3
  347. package/src/theme/antd/ant-table.less +22 -22
  348. package/src/theme/antd/ant-time-picker.less +3 -3
  349. package/src/theme/antd/index.less +3 -3
  350. package/src/theme/default/color.less +43 -43
  351. package/src/theme/default/index.less +3 -3
  352. package/src/theme/default/nprogress.less +76 -76
  353. package/src/theme/global.less +279 -279
  354. package/src/theme/index.less +5 -5
  355. package/src/theme/reportTable.less +58 -58
  356. package/src/theme/theme.less +1 -1
  357. package/src/utils/EncryptUtil.js +162 -162
  358. package/src/utils/Objects.js +25 -25
  359. package/src/utils/axios-interceptors.js +100 -100
  360. package/src/utils/colors.js +107 -107
  361. package/src/utils/common.js +10 -10
  362. package/src/utils/excel/Blob.js +180 -180
  363. package/src/utils/excel/Export2Excel.js +141 -141
  364. package/src/utils/filter.js +21 -21
  365. package/src/utils/i18n.js +80 -80
  366. package/src/utils/indexedDB.js +549 -549
  367. package/src/utils/microAppUtils.js +49 -49
  368. package/src/utils/request.js +395 -395
  369. package/src/utils/routerUtil.js +553 -553
  370. package/src/utils/themeUtil.js +100 -100
  371. package/test/Tree.spec.js +168 -168
  372. package/test/myDialog.spec.js +47 -47
  373. package/test/request.test.js +17 -17
  374. package/test/util.test.js +53 -53
  375. package/test/v3Api.test.js +1984 -1984
  376. package/tests/unit/ReportTable.spec.js +16 -16
  377. package/vue.config.js +222 -222
@@ -1,629 +1,629 @@
1
- <template>
2
- <div>
3
- <div v-show="ready">
4
- <a-row v-if="this.readonly" class="editor-action-container" type="flex" justify="space-between">
5
- <a-col class="editor-tools">
6
- <a-space>
7
- <template v-if="resList.length > 0">
8
- <a-select
9
- style="width: 200px"
10
- v-model="toggleResId"
11
- placeholder="请选择文档"
12
- show-search
13
- @change="changeRes"
14
- >
15
- <a-select-option v-for="item of resListCp" :key="item.value" :value="item.value">{{ item.label }}</a-select-option>
16
- </a-select>
17
- <!-- <template v-if="this.modeType !== 'readonly' && this.resId !== -1">-->
18
- <!-- <a-button icon="plus" @click="addRes"/>-->
19
- <!-- </template>-->
20
- </template>
21
- <a-radio-group
22
- v-show="showModeChoose"
23
- button-style="solid"
24
- @change="changeMode"
25
- v-model="modeType">
26
- <a-radio-button v-for="item of modeList" :key="item.value" :value="item.value">
27
- {{ item.label }}
28
- </a-radio-button>
29
- </a-radio-group>
30
- </a-space>
31
- </a-col>
32
- <a-col class="editor-action">
33
- <a-space>
34
- <template v-if="this.modeType !== 'readonly'">
35
- <!-- <a-button-->
36
- <!-- type="primary"-->
37
- <!-- v-if = "userTemplateVisible"-->
38
- <!-- @click="useTemplateData"-->
39
- <!-- >-->
40
- <!-- 使用-->
41
- <!-- </a-button>-->
42
-
43
- <a-button type="primary" @click="openRenameModal" v-if="this.resId !== -1">
44
- 重命名
45
- </a-button>
46
- <!-- 组合按钮容器 -->
47
- <div class="save-btn-main">
48
- <!-- 保存按钮 (左侧) -->
49
- <a-button
50
- type="primary"
51
- class="save-btn-main"
52
- @click="showSaveModal('normal')"
53
- >
54
- 保存
55
- </a-button>
56
-
57
- <!-- 下拉部分 (右侧) -->
58
- <!-- 下拉触发部分 -->
59
- <template v-if="modeType !== 'design'">
60
- <a-dropdown
61
- :trigger="['click']"
62
- placement="bottomRight">
63
- <a-button
64
- type="primary"
65
- class="dropdown-trigger-btn">
66
- <a-icon type="down" />
67
- </a-button>
68
- <a-menu slot="overlay">
69
- <a-menu-item @click="showSaveModal('template')">
70
- 保存并作为模板
71
- </a-menu-item>
72
- </a-menu>
73
- </a-dropdown>
74
- </template>
75
- </div>
76
- <a-modal
77
- title="保存"
78
- :visible="saveVisible"
79
- confirm-loading = false
80
- @ok="handleSaveConfirm"
81
- @cancel="saveVisible = false"
82
- >
83
- <a-form-item label="文件名" :label-col="{ span: 4 }" :wrapper-col="{ span: 20 }">
84
- <a-input
85
- v-model="fileName"
86
- placeholder="请输入文件名"
87
- @pressEnter="handleSaveConfirm"
88
- />
89
- </a-form-item>
90
- </a-modal>
91
- </template>
92
- <a-button type="primary" @click="print">
93
- 打印
94
- </a-button>
95
- <a-button @click="refresh">
96
- 刷新
97
- </a-button>
98
- </a-space>
99
- <a-dropdown>
100
- <a-menu slot="overlay" @click="handleExportMenuClick">
101
- <a-menu-item key="exportPdf">导出为Pdf</a-menu-item>
102
- <a-menu-item key="exportWord">导出为Word</a-menu-item>
103
- <a-menu-item key="exportHtmlWithStyle">导出为Html</a-menu-item>
104
- </a-menu>
105
- <a-button style="margin-left: 8px"> 导出 <a-icon type="down" /> </a-button>
106
- </a-dropdown>
107
- </a-col>
108
- </a-row>
109
- <a-divider/>
110
- <a-spin tip="加载中,马上好" :spinning="loading">
111
- <iframe
112
- id="x-editor"
113
- src="/his/editor/editor.html"
114
- v-bind="objectOfAttrs"
115
- @load="onload"
116
- style="height: calc(-200px - 3rem + 100vh);">
117
- </iframe>
118
- </a-spin>
119
- </div>
120
- <div v-show="!ready">
121
- <a-empty description="请选择文书" />
122
- </div>
123
- <a-modal
124
- :destroyOnClose="true"
125
- :title="this.resDataModalMode === 'modify' ? '修改文档' : '新建文档'"
126
- :visible="resDataModalVisible"
127
- okText="提交"
128
- @cancel="resDataModalVisible = false"
129
- @ok="onSubmit">
130
- <a-form-model ref="resModifyForm" :model="modifyResModel" :rules="resRules">
131
- <a-form-model-item prop="f_file_name" label="文档名">
132
- <a-input v-model="modifyResModel.f_file_name" placeholder="请输入文档名"/>
133
- </a-form-model-item>
134
- </a-form-model>
135
- </a-modal></div>
136
- </template>
137
-
138
- <script>
139
-
140
- import { runLogic } from '@vue2-client/services/api/common'
141
- import { initDiagnosisDropdown } from './diagnosisAutocomplete'
142
-
143
- export default {
144
- name: 'XHisEditor',
145
- computed: {
146
- resListCp () {
147
- const list = this.resList
148
- if (this.resId === -1) {
149
- list.push({
150
- label: '未保存文档*', value: -1
151
- })
152
- }
153
- return list
154
- }
155
- },
156
- data () {
157
- return {
158
- readonly: false,
159
- ready: false,
160
- loading: false,
161
- resDataModalMode: 'modify',
162
- resDataModalVisible: false,
163
- saveVisible: false,
164
- // 使用按钮显隐控制
165
- // userTemplateVisible: false,
166
- objectOfAttrs: {
167
- width: '100%',
168
- height: '650vh',
169
- frameborder: 0
170
- },
171
- // 数据模式
172
- modeType: 'form',
173
- // 是否显示模式切换功能
174
- showModeChoose: true,
175
- // 是否作为模板 1 是,0 否
176
- isTemplate: 0,
177
- // 模板id
178
- templateId: undefined,
179
- admissionId: undefined,
180
- // 保存类型
181
- saveType: 'normal',
182
- fileName: '',
183
- // 数据模式列表
184
- modeList: [
185
- {
186
- label: '预览',
187
- value: 'readonly'
188
- },
189
- {
190
- label: '表单',
191
- value: 'form'
192
- },
193
- {
194
- label: '设计',
195
- value: 'design'
196
- }
197
- ],
198
- // 编辑器实例
199
- editorRef: null,
200
- // 文档资源列表
201
- resList: [],
202
- // 文档资源ID
203
- resId: undefined,
204
- // 文档链接
205
- fileUrl: undefined,
206
- // 文档绑定数据
207
- bindObject: undefined,
208
- // 合并模板数据后文档数据
209
- assignBindObject: undefined,
210
- // 数据模式 template:模板编辑;data:数据编辑
211
- dataMode: undefined,
212
- // 保存数据调用的Logic名称
213
- saveDataLogicName: undefined,
214
- // 保存数据调用Logic传入的额外参数
215
- logicExtraParams: undefined,
216
- // 服务名
217
- serviceName: undefined,
218
- // 当前文档信息
219
- currResData: {},
220
- // 切换的文档id
221
- toggleResId: undefined,
222
- // 待提交的修改信息
223
- modifyResModel: {},
224
- codeData: {},
225
- resRules: {
226
- f_file_name: [{ required: true, message: '请输入文档名', trigger: 'blur' }],
227
- }
228
- }
229
- },
230
- // 初始化 保存后 加载文件后 诊断选择
231
- emits: ['init', 'saveafter', 'afterLoadFile', 'selected'],
232
- methods: {
233
- runLogic,
234
- /* eslint-disable */
235
- async initDiagnosisAutocomplete (dropDownBoxParams) {
236
- console.log('dropDownBoxParams',dropDownBoxParams)
237
- if (!this.editorRef || !this.editorRef.document) {
238
- return
239
- }
240
-
241
- // 添加参数检查
242
- if (!dropDownBoxParams || !Array.isArray(dropDownBoxParams) || dropDownBoxParams.length === 0) {
243
- return
244
- }
245
-
246
- // 创建一个简单的自定义事件系统
247
- // 1. 创建一个隐藏的DOM元素作为事件通道
248
- const eventChannel = this.editorRef.document.createElement('div');
249
- eventChannel.id = 'diagnosis-event-channel';
250
- eventChannel.style.display = 'none';
251
- this.editorRef.document.body.appendChild(eventChannel);
252
- // 2. 在iframe文档中监听自定义事件
253
- const that = this;
254
- this.editorRef.document.addEventListener('diagnosis-selected', function(e) {
255
- if (e && e.detail) {
256
- that.$emit('selected', { item: e.detail, editor: that.editorRef });
257
- that.codeData = { ...that.codeData, ...{[e.detail.codeKey]: e.detail.code} }
258
- }
259
- });
260
-
261
- for (const param of dropDownBoxParams) {
262
- if (param.identificationCode && param.dataLogic) {
263
- try {
264
- let preliDiagnoData = null
265
- // 保留获取后端数据的逻辑
266
- await runLogic(param.dataLogic,
267
- {}, 'af-his').then(res => {
268
- preliDiagnoData = res
269
- })
270
-
271
- // 创建脚本元素
272
- const scriptElement = this.editorRef.document.createElement('script')
273
-
274
- // 注入自定义事件触发函数和初始化代码
275
- scriptElement.textContent = `
276
- // 定义一个函数来触发自定义事件
277
- function triggerDiagnosisSelected(data) {
278
- const event = new CustomEvent('diagnosis-selected', {
279
- detail: data,
280
- bubbles: true
281
- });
282
- document.dispatchEvent(event);
283
- }
284
-
285
- // 初始化诊断下拉菜单,使用自定义事件触发函数
286
- (${initDiagnosisDropdown.toString()})(
287
- editor,
288
- ${JSON.stringify(preliDiagnoData)},
289
- '${param.identificationCode}',
290
- triggerDiagnosisSelected
291
- );
292
- `;
293
-
294
- this.editorRef.document.body.appendChild(scriptElement);
295
- } catch (error) {
296
- console.error('初始化诊断自动完成失败:', error);
297
- }
298
- }
299
- }
300
- },
301
- showSaveModal (type) {
302
- this.saveType = type // 记录当前保存类型
303
- if (type === 'template') {
304
- this.saveVisible = true
305
- }else {
306
- if (this.resId !== -1 || this.resId !== undefined) {
307
- this.save()
308
- } else {
309
- this.openAddResModal()
310
- }
311
- }
312
-
313
- },
314
- handleSaveConfirm () {
315
- if (!this.fileName.trim()) {
316
- this.$message.error('文件名不能为空')
317
- return
318
- }
319
- this.saveAsTemplate()
320
- },
321
- /* eslint-disable */
322
- // 初始化文档
323
- onload (e) {
324
- if (e && e.target && e.target.contentWindow) {
325
- this.editorRef = e.target.contentWindow.editor
326
- // 等待文档加载完成
327
- this.$emit('init', {})
328
- }
329
- },
330
- init (params) {
331
- const {
332
- fileUrl,
333
- resId,
334
- currResData = {},
335
- bindObject,
336
- saveDataLogicName,
337
- logicExtraParams,
338
- dropDownBoxParams,
339
- serviceName,
340
- showModeChoose = true,
341
- modeType = 'form'
342
- } = params
343
- this.resId = resId
344
- if (bindObject) {
345
- this.dataMode = 'data'
346
- this.bindObject = bindObject
347
- } else {
348
- this.dataMode = 'template'
349
- }
350
- if (logicExtraParams?.admissionId !== undefined && logicExtraParams?.templateId !== undefined) {
351
- this.admissionId = logicExtraParams.admissionId
352
- this.templateId = logicExtraParams.templateId
353
- } else {
354
- console.warn('病例id:admissionId不存在或模板id:templateId不存在')
355
- }
356
- this.saveDataLogicName = saveDataLogicName
357
- this.logicExtraParams = logicExtraParams
358
- this.serviceName = serviceName
359
- this.showModeChoose = showModeChoose
360
- this.modeType = (modeType === "readonly!" ? "readonly" :modeType)
361
- this.readonly = (modeType !== "readonly!")
362
- this.ready = true
363
- // 先加载文件
364
- this.loadFile(fileUrl, bindObject, currResData).then(async () => {
365
- // 文件加载完成后再初始化自动完成
366
- await this.initDiagnosisAutocomplete(dropDownBoxParams)
367
- })
368
- this.loadResList()
369
- },
370
- // 加载文档
371
- loadFile (fileUrl, bindObject, currResData) {
372
- this.loading = true
373
- return new Promise((resolve) => {
374
- this.editorRef.loadUrl(fileUrl).then(() => {
375
- if (bindObject) {
376
- this.editorRef.setBindObject(bindObject)
377
- if (bindObject.template) {
378
- for (const key of Object.keys(bindObject.template)) {
379
- this.editorRef.bindDataList(key, bindObject.template[key])
380
- }
381
- }
382
- }
383
- // 拿取多于模板中的数据
384
- const diff = this.bindObject? Object.fromEntries(
385
- Object.entries(this.bindObject)
386
- .filter(([key]) => !(key in this.editorRef.getBindObject()))
387
- ) : {}
388
- this.codeData = {...this.codeData,...diff}
389
- this.changeMode()
390
- this.fileUrl = fileUrl
391
- if (!currResData.f_file_name) {
392
- currResData.f_file_name = '未命名'
393
- }
394
- this.currResData = currResData
395
- this.loading = false
396
- this.$emit('afterLoadFile', {})
397
- resolve()
398
- })
399
- })
400
- },
401
- // 保存并作为模板
402
- saveAsTemplate () {
403
- this.isTemplate = 1
404
- this.save()
405
- },
406
- // 加载文档列表
407
- loadResList () {
408
- runLogic('getTemplateListLogic', this.logicExtraParams, this.serviceName).then(res => {
409
- this.resList = res
410
- this.toggleResId = this.resId
411
- })
412
- },
413
- // 修改模式
414
- changeMode (e) {
415
- this.editorRef.execCommand(this.modeType)
416
- },
417
- // 打开文档信息修改面板
418
- openRenameModal () {
419
- this.resDataModalMode = 'modify'
420
- this.modifyResModel = {
421
- f_file_name: this.currResData.f_file_name
422
- }
423
- this.resDataModalVisible = true
424
- },
425
- // 提交文档信息修改
426
- onSubmit () {
427
- this.$refs.resModifyForm.validate(valid => {
428
- if (valid) {
429
- if (this.resDataModalMode === 'modify' && this.modifyResModel.f_file_name === this.currResData.f_file_name) {
430
- this.$message.warn('新文档名不能与原文档名一致!')
431
- return false
432
- }
433
- this.save()
434
- return true
435
- } else {
436
- return false
437
- }
438
- })
439
- },
440
- // 打开文档新建面板
441
- openAddResModal () {
442
- this.resDataModalMode = 'add'
443
- this.modifyResModel = {
444
- f_file_name: undefined
445
- }
446
- this.resDataModalVisible = true
447
- },
448
- // 新建文档
449
- addRes () {
450
- this.$emit('add', {})
451
- // const params = Object.assign({
452
- // isAddForce: true
453
- // }, this.logicExtraParams)
454
- // this.reload(params)
455
- },
456
- // 重新加载
457
- reload (params) {
458
- runLogic('getFileInformation', params, this.serviceName).then(res => {
459
- this.resDataModalVisible = false
460
- this.assignBindObject = this.assignTemplates(this.bindObject, res.bindObject)
461
- this.useTemplateData()
462
- // this.init({
463
- // modeType: this.modeType,
464
- // fileUrl: res.url,
465
- // resId: res.id,
466
- // currResData: res.currResData,
467
- // bindObject: res.bindObject,
468
- // saveDataLogicName: this.saveDataLogicName,
469
- // serviceName: this.serviceName,
470
- // logicExtraParams: this.logicExtraParams,
471
- // dropDownBoxParams: this.dropDownBoxParams
472
- // })
473
- })
474
- },
475
- // 合并模板数据
476
- assignTemplates (newBindObject, templateData) {
477
- // 检查templates数组是否存在
478
- if (!templateData.templates || !Array.isArray(templateData.templates)) {
479
- console.warn('templateData.templates不存在或不是数组')
480
- return newBindObject
481
- }
482
- // 遍历templates数组中的每个属性名
483
- templateData.templates.forEach(propName => {
484
- // 检查templateData是否有该属性
485
- if (propName in templateData) {
486
- // 无论newBindObject是否有该属性,都进行赋值/添加
487
- newBindObject[propName] = templateData[propName]
488
- } else {
489
- console.warn(`templateData中不存在属性: ${propName}`)
490
- }
491
- })
492
- return newBindObject
493
- },
494
- useTemplateData () {
495
- // 确认是否有合并后的模板数据
496
- if (!this.assignBindObject) {
497
- this.$message.warning('没有可用的模板数据');
498
- return;
499
- }
500
- this.editorRef.setBindObject(this.assignBindObject)
501
- // console.log('resId', this.resId)
502
- },
503
- // 切换文档
504
- changeRes (value) {
505
- console.log('value', value)
506
- let params = {
507
- resId: value
508
- }
509
- if (value === -1) {
510
- params = {
511
- ...params,
512
- admissionId: this.admissionId,
513
- f_template_id: this.templateId
514
- }
515
- const that = this
516
- this.$confirm({
517
- title: '确认切换文档吗?',
518
- content: '您有尚未保存的文档,切换文档将丢失所有的修改',
519
- onOk () {
520
- that.reload(params)
521
- // that.userTemplateVisible = true
522
- },
523
- onCancel () {
524
- that.toggleResId = that.resId
525
- },
526
- })
527
- } else {
528
- this.reload(params)
529
- }
530
- },
531
- // 保存文档
532
- save () {
533
- // 验证必须输入项
534
- if (this.editorRef.validate()) {
535
- // 获取HTML文档和结构化数据(JSON)
536
- console.log('save',this.editorRef.getBindObject())
537
- const data = {
538
- doc: this.editorRef.getHtml(),
539
- dataObject: {
540
- ...this.editorRef.getBindObject(),
541
- ...this.codeData // 合并 codeData 数据
542
- },
543
- dataMode: this.dataMode,
544
- resId: this.resId,
545
- modifyResModel: this.modifyResModel,
546
- logicExtraParams: this.logicExtraParams,
547
- is_template: this.isTemplate,
548
- f_file_name: this.fileName
549
- }
550
- // 保存HTML文档和结构化数据到后端服务
551
- runLogic(this.saveDataLogicName, data, this.serviceName).then(res => {
552
- this.$message.success('保存成功')
553
- this.changeRes(res.currResData.id)
554
- this.$emit('saveafter', data.dataObject)
555
- }).finally(() => {
556
- this.resDataModalVisible = false
557
- this.saveVisible = false
558
- })
559
- } else {
560
- this.$message.error('请检查未填写的项目')
561
- }
562
- },
563
- // 打印文档
564
- print () {
565
- this.editorRef.execCommand('print')
566
- },
567
- // 关闭编辑器
568
- close () {
569
- this.ready = false
570
- },
571
- // 刷新文档
572
- refresh () {
573
- this.loadFile(this.fileUrl, this.bindObject, this.currResData)
574
- },
575
- // 导出下拉菜单
576
- handleExportMenuClick (e) {
577
- const key = e.key
578
- this.editorRef.execCommand(key)
579
- }
580
- }
581
- }
582
- </script>
583
- <style scoped lang="less">
584
- .editor-action-container {
585
- height: 40px;
586
- }
587
- :deep(.ant-divider-horizontal) {
588
- margin: 4px 0;
589
- }
590
- /* 组合按钮容器 - 关键修正 */
591
- .combined-save-btn {
592
- display: inline-flex;
593
- height: 32px;
594
- }
595
-
596
- /* 主保存按钮 - 保持原有样式 */
597
- .save-btn-main {
598
- border-top-right-radius: 0 !important;
599
- border-bottom-right-radius: 0 !important;
600
- border-right: none !important;
601
- height: 32px;
602
- padding: 0 15px;
603
- display: inline-flex;
604
- align-items: center;
605
- justify-content: center;
606
- margin-right: -1px; /* 关键:负边距消除间距 */
607
- }
608
-
609
- /* 下拉按钮 - 仅调整间距 */
610
- .dropdown-trigger-btn {
611
- height: 32px !important;
612
- width: 24px !important;
613
- min-width: 24px !important;
614
- padding: 0 !important;
615
- border-top-left-radius: 0 !important;
616
- border-bottom-left-radius: 0 !important;
617
- border-left: 1px solid rgba(255, 255, 255, 0.3) !important;
618
- display: inline-flex;
619
- align-items: center;
620
- justify-content: center;
621
- margin-left: 0px;
622
- }
623
-
624
- /* 下拉图标保持原样 */
625
- .dropdown-trigger-btn .anticon {
626
- font-size: 12px;
627
- margin: 0 !important;
628
- }
629
- </style>
1
+ <template>
2
+ <div>
3
+ <div v-show="ready">
4
+ <a-row v-if="this.readonly" class="editor-action-container" type="flex" justify="space-between">
5
+ <a-col class="editor-tools">
6
+ <a-space>
7
+ <template v-if="resList.length > 0">
8
+ <a-select
9
+ style="width: 200px"
10
+ v-model="toggleResId"
11
+ placeholder="请选择文档"
12
+ show-search
13
+ @change="changeRes"
14
+ >
15
+ <a-select-option v-for="item of resListCp" :key="item.value" :value="item.value">{{ item.label }}</a-select-option>
16
+ </a-select>
17
+ <!-- <template v-if="this.modeType !== 'readonly' && this.resId !== -1">-->
18
+ <!-- <a-button icon="plus" @click="addRes"/>-->
19
+ <!-- </template>-->
20
+ </template>
21
+ <a-radio-group
22
+ v-show="showModeChoose"
23
+ button-style="solid"
24
+ @change="changeMode"
25
+ v-model="modeType">
26
+ <a-radio-button v-for="item of modeList" :key="item.value" :value="item.value">
27
+ {{ item.label }}
28
+ </a-radio-button>
29
+ </a-radio-group>
30
+ </a-space>
31
+ </a-col>
32
+ <a-col class="editor-action">
33
+ <a-space>
34
+ <template v-if="this.modeType !== 'readonly'">
35
+ <!-- <a-button-->
36
+ <!-- type="primary"-->
37
+ <!-- v-if = "userTemplateVisible"-->
38
+ <!-- @click="useTemplateData"-->
39
+ <!-- >-->
40
+ <!-- 使用-->
41
+ <!-- </a-button>-->
42
+
43
+ <a-button type="primary" @click="openRenameModal" v-if="this.resId !== -1">
44
+ 重命名
45
+ </a-button>
46
+ <!-- 组合按钮容器 -->
47
+ <div class="save-btn-main">
48
+ <!-- 保存按钮 (左侧) -->
49
+ <a-button
50
+ type="primary"
51
+ class="save-btn-main"
52
+ @click="showSaveModal('normal')"
53
+ >
54
+ 保存
55
+ </a-button>
56
+
57
+ <!-- 下拉部分 (右侧) -->
58
+ <!-- 下拉触发部分 -->
59
+ <template v-if="modeType !== 'design'">
60
+ <a-dropdown
61
+ :trigger="['click']"
62
+ placement="bottomRight">
63
+ <a-button
64
+ type="primary"
65
+ class="dropdown-trigger-btn">
66
+ <a-icon type="down" />
67
+ </a-button>
68
+ <a-menu slot="overlay">
69
+ <a-menu-item @click="showSaveModal('template')">
70
+ 保存并作为模板
71
+ </a-menu-item>
72
+ </a-menu>
73
+ </a-dropdown>
74
+ </template>
75
+ </div>
76
+ <a-modal
77
+ title="保存"
78
+ :visible="saveVisible"
79
+ confirm-loading = false
80
+ @ok="handleSaveConfirm"
81
+ @cancel="saveVisible = false"
82
+ >
83
+ <a-form-item label="文件名" :label-col="{ span: 4 }" :wrapper-col="{ span: 20 }">
84
+ <a-input
85
+ v-model="fileName"
86
+ placeholder="请输入文件名"
87
+ @pressEnter="handleSaveConfirm"
88
+ />
89
+ </a-form-item>
90
+ </a-modal>
91
+ </template>
92
+ <a-button type="primary" @click="print">
93
+ 打印
94
+ </a-button>
95
+ <a-button @click="refresh">
96
+ 刷新
97
+ </a-button>
98
+ </a-space>
99
+ <a-dropdown>
100
+ <a-menu slot="overlay" @click="handleExportMenuClick">
101
+ <a-menu-item key="exportPdf">导出为Pdf</a-menu-item>
102
+ <a-menu-item key="exportWord">导出为Word</a-menu-item>
103
+ <a-menu-item key="exportHtmlWithStyle">导出为Html</a-menu-item>
104
+ </a-menu>
105
+ <a-button style="margin-left: 8px"> 导出 <a-icon type="down" /> </a-button>
106
+ </a-dropdown>
107
+ </a-col>
108
+ </a-row>
109
+ <a-divider/>
110
+ <a-spin tip="加载中,马上好" :spinning="loading">
111
+ <iframe
112
+ id="x-editor"
113
+ src="/his/editor/editor.html"
114
+ v-bind="objectOfAttrs"
115
+ @load="onload"
116
+ style="height: calc(-200px - 3rem + 100vh);">
117
+ </iframe>
118
+ </a-spin>
119
+ </div>
120
+ <div v-show="!ready">
121
+ <a-empty description="请选择文书" />
122
+ </div>
123
+ <a-modal
124
+ :destroyOnClose="true"
125
+ :title="this.resDataModalMode === 'modify' ? '修改文档' : '新建文档'"
126
+ :visible="resDataModalVisible"
127
+ okText="提交"
128
+ @cancel="resDataModalVisible = false"
129
+ @ok="onSubmit">
130
+ <a-form-model ref="resModifyForm" :model="modifyResModel" :rules="resRules">
131
+ <a-form-model-item prop="f_file_name" label="文档名">
132
+ <a-input v-model="modifyResModel.f_file_name" placeholder="请输入文档名"/>
133
+ </a-form-model-item>
134
+ </a-form-model>
135
+ </a-modal></div>
136
+ </template>
137
+
138
+ <script>
139
+
140
+ import { runLogic } from '@vue2-client/services/api/common'
141
+ import { initDiagnosisDropdown } from './diagnosisAutocomplete'
142
+
143
+ export default {
144
+ name: 'XHisEditor',
145
+ computed: {
146
+ resListCp () {
147
+ const list = this.resList
148
+ if (this.resId === -1) {
149
+ list.push({
150
+ label: '未保存文档*', value: -1
151
+ })
152
+ }
153
+ return list
154
+ }
155
+ },
156
+ data () {
157
+ return {
158
+ readonly: false,
159
+ ready: false,
160
+ loading: false,
161
+ resDataModalMode: 'modify',
162
+ resDataModalVisible: false,
163
+ saveVisible: false,
164
+ // 使用按钮显隐控制
165
+ // userTemplateVisible: false,
166
+ objectOfAttrs: {
167
+ width: '100%',
168
+ height: '650vh',
169
+ frameborder: 0
170
+ },
171
+ // 数据模式
172
+ modeType: 'form',
173
+ // 是否显示模式切换功能
174
+ showModeChoose: true,
175
+ // 是否作为模板 1 是,0 否
176
+ isTemplate: 0,
177
+ // 模板id
178
+ templateId: undefined,
179
+ admissionId: undefined,
180
+ // 保存类型
181
+ saveType: 'normal',
182
+ fileName: '',
183
+ // 数据模式列表
184
+ modeList: [
185
+ {
186
+ label: '预览',
187
+ value: 'readonly'
188
+ },
189
+ {
190
+ label: '表单',
191
+ value: 'form'
192
+ },
193
+ {
194
+ label: '设计',
195
+ value: 'design'
196
+ }
197
+ ],
198
+ // 编辑器实例
199
+ editorRef: null,
200
+ // 文档资源列表
201
+ resList: [],
202
+ // 文档资源ID
203
+ resId: undefined,
204
+ // 文档链接
205
+ fileUrl: undefined,
206
+ // 文档绑定数据
207
+ bindObject: undefined,
208
+ // 合并模板数据后文档数据
209
+ assignBindObject: undefined,
210
+ // 数据模式 template:模板编辑;data:数据编辑
211
+ dataMode: undefined,
212
+ // 保存数据调用的Logic名称
213
+ saveDataLogicName: undefined,
214
+ // 保存数据调用Logic传入的额外参数
215
+ logicExtraParams: undefined,
216
+ // 服务名
217
+ serviceName: undefined,
218
+ // 当前文档信息
219
+ currResData: {},
220
+ // 切换的文档id
221
+ toggleResId: undefined,
222
+ // 待提交的修改信息
223
+ modifyResModel: {},
224
+ codeData: {},
225
+ resRules: {
226
+ f_file_name: [{ required: true, message: '请输入文档名', trigger: 'blur' }],
227
+ }
228
+ }
229
+ },
230
+ // 初始化 保存后 加载文件后 诊断选择
231
+ emits: ['init', 'saveafter', 'afterLoadFile', 'selected'],
232
+ methods: {
233
+ runLogic,
234
+ /* eslint-disable */
235
+ async initDiagnosisAutocomplete (dropDownBoxParams) {
236
+ console.log('dropDownBoxParams',dropDownBoxParams)
237
+ if (!this.editorRef || !this.editorRef.document) {
238
+ return
239
+ }
240
+
241
+ // 添加参数检查
242
+ if (!dropDownBoxParams || !Array.isArray(dropDownBoxParams) || dropDownBoxParams.length === 0) {
243
+ return
244
+ }
245
+
246
+ // 创建一个简单的自定义事件系统
247
+ // 1. 创建一个隐藏的DOM元素作为事件通道
248
+ const eventChannel = this.editorRef.document.createElement('div');
249
+ eventChannel.id = 'diagnosis-event-channel';
250
+ eventChannel.style.display = 'none';
251
+ this.editorRef.document.body.appendChild(eventChannel);
252
+ // 2. 在iframe文档中监听自定义事件
253
+ const that = this;
254
+ this.editorRef.document.addEventListener('diagnosis-selected', function(e) {
255
+ if (e && e.detail) {
256
+ that.$emit('selected', { item: e.detail, editor: that.editorRef });
257
+ that.codeData = { ...that.codeData, ...{[e.detail.codeKey]: e.detail.code} }
258
+ }
259
+ });
260
+
261
+ for (const param of dropDownBoxParams) {
262
+ if (param.identificationCode && param.dataLogic) {
263
+ try {
264
+ let preliDiagnoData = null
265
+ // 保留获取后端数据的逻辑
266
+ await runLogic(param.dataLogic,
267
+ {}, 'af-his').then(res => {
268
+ preliDiagnoData = res
269
+ })
270
+
271
+ // 创建脚本元素
272
+ const scriptElement = this.editorRef.document.createElement('script')
273
+
274
+ // 注入自定义事件触发函数和初始化代码
275
+ scriptElement.textContent = `
276
+ // 定义一个函数来触发自定义事件
277
+ function triggerDiagnosisSelected(data) {
278
+ const event = new CustomEvent('diagnosis-selected', {
279
+ detail: data,
280
+ bubbles: true
281
+ });
282
+ document.dispatchEvent(event);
283
+ }
284
+
285
+ // 初始化诊断下拉菜单,使用自定义事件触发函数
286
+ (${initDiagnosisDropdown.toString()})(
287
+ editor,
288
+ ${JSON.stringify(preliDiagnoData)},
289
+ '${param.identificationCode}',
290
+ triggerDiagnosisSelected
291
+ );
292
+ `;
293
+
294
+ this.editorRef.document.body.appendChild(scriptElement);
295
+ } catch (error) {
296
+ console.error('初始化诊断自动完成失败:', error);
297
+ }
298
+ }
299
+ }
300
+ },
301
+ showSaveModal (type) {
302
+ this.saveType = type // 记录当前保存类型
303
+ if (type === 'template') {
304
+ this.saveVisible = true
305
+ }else {
306
+ if (this.resId !== -1 || this.resId !== undefined) {
307
+ this.save()
308
+ } else {
309
+ this.openAddResModal()
310
+ }
311
+ }
312
+
313
+ },
314
+ handleSaveConfirm () {
315
+ if (!this.fileName.trim()) {
316
+ this.$message.error('文件名不能为空')
317
+ return
318
+ }
319
+ this.saveAsTemplate()
320
+ },
321
+ /* eslint-disable */
322
+ // 初始化文档
323
+ onload (e) {
324
+ if (e && e.target && e.target.contentWindow) {
325
+ this.editorRef = e.target.contentWindow.editor
326
+ // 等待文档加载完成
327
+ this.$emit('init', {})
328
+ }
329
+ },
330
+ init (params) {
331
+ const {
332
+ fileUrl,
333
+ resId,
334
+ currResData = {},
335
+ bindObject,
336
+ saveDataLogicName,
337
+ logicExtraParams,
338
+ dropDownBoxParams,
339
+ serviceName,
340
+ showModeChoose = true,
341
+ modeType = 'form'
342
+ } = params
343
+ this.resId = resId
344
+ if (bindObject) {
345
+ this.dataMode = 'data'
346
+ this.bindObject = bindObject
347
+ } else {
348
+ this.dataMode = 'template'
349
+ }
350
+ if (logicExtraParams?.admissionId !== undefined && logicExtraParams?.templateId !== undefined) {
351
+ this.admissionId = logicExtraParams.admissionId
352
+ this.templateId = logicExtraParams.templateId
353
+ } else {
354
+ console.warn('病例id:admissionId不存在或模板id:templateId不存在')
355
+ }
356
+ this.saveDataLogicName = saveDataLogicName
357
+ this.logicExtraParams = logicExtraParams
358
+ this.serviceName = serviceName
359
+ this.showModeChoose = showModeChoose
360
+ this.modeType = (modeType === "readonly!" ? "readonly" :modeType)
361
+ this.readonly = (modeType !== "readonly!")
362
+ this.ready = true
363
+ // 先加载文件
364
+ this.loadFile(fileUrl, bindObject, currResData).then(async () => {
365
+ // 文件加载完成后再初始化自动完成
366
+ await this.initDiagnosisAutocomplete(dropDownBoxParams)
367
+ })
368
+ this.loadResList()
369
+ },
370
+ // 加载文档
371
+ loadFile (fileUrl, bindObject, currResData) {
372
+ this.loading = true
373
+ return new Promise((resolve) => {
374
+ this.editorRef.loadUrl(fileUrl).then(() => {
375
+ if (bindObject) {
376
+ this.editorRef.setBindObject(bindObject)
377
+ if (bindObject.template) {
378
+ for (const key of Object.keys(bindObject.template)) {
379
+ this.editorRef.bindDataList(key, bindObject.template[key])
380
+ }
381
+ }
382
+ }
383
+ // 拿取多于模板中的数据
384
+ const diff = this.bindObject? Object.fromEntries(
385
+ Object.entries(this.bindObject)
386
+ .filter(([key]) => !(key in this.editorRef.getBindObject()))
387
+ ) : {}
388
+ this.codeData = {...this.codeData,...diff}
389
+ this.changeMode()
390
+ this.fileUrl = fileUrl
391
+ if (!currResData.f_file_name) {
392
+ currResData.f_file_name = '未命名'
393
+ }
394
+ this.currResData = currResData
395
+ this.loading = false
396
+ this.$emit('afterLoadFile', {})
397
+ resolve()
398
+ })
399
+ })
400
+ },
401
+ // 保存并作为模板
402
+ saveAsTemplate () {
403
+ this.isTemplate = 1
404
+ this.save()
405
+ },
406
+ // 加载文档列表
407
+ loadResList () {
408
+ runLogic('getTemplateListLogic', this.logicExtraParams, this.serviceName).then(res => {
409
+ this.resList = res
410
+ this.toggleResId = this.resId
411
+ })
412
+ },
413
+ // 修改模式
414
+ changeMode (e) {
415
+ this.editorRef.execCommand(this.modeType)
416
+ },
417
+ // 打开文档信息修改面板
418
+ openRenameModal () {
419
+ this.resDataModalMode = 'modify'
420
+ this.modifyResModel = {
421
+ f_file_name: this.currResData.f_file_name
422
+ }
423
+ this.resDataModalVisible = true
424
+ },
425
+ // 提交文档信息修改
426
+ onSubmit () {
427
+ this.$refs.resModifyForm.validate(valid => {
428
+ if (valid) {
429
+ if (this.resDataModalMode === 'modify' && this.modifyResModel.f_file_name === this.currResData.f_file_name) {
430
+ this.$message.warn('新文档名不能与原文档名一致!')
431
+ return false
432
+ }
433
+ this.save()
434
+ return true
435
+ } else {
436
+ return false
437
+ }
438
+ })
439
+ },
440
+ // 打开文档新建面板
441
+ openAddResModal () {
442
+ this.resDataModalMode = 'add'
443
+ this.modifyResModel = {
444
+ f_file_name: undefined
445
+ }
446
+ this.resDataModalVisible = true
447
+ },
448
+ // 新建文档
449
+ addRes () {
450
+ this.$emit('add', {})
451
+ // const params = Object.assign({
452
+ // isAddForce: true
453
+ // }, this.logicExtraParams)
454
+ // this.reload(params)
455
+ },
456
+ // 重新加载
457
+ reload (params) {
458
+ runLogic('getFileInformation', params, this.serviceName).then(res => {
459
+ this.resDataModalVisible = false
460
+ this.assignBindObject = this.assignTemplates(this.bindObject, res.bindObject)
461
+ this.useTemplateData()
462
+ // this.init({
463
+ // modeType: this.modeType,
464
+ // fileUrl: res.url,
465
+ // resId: res.id,
466
+ // currResData: res.currResData,
467
+ // bindObject: res.bindObject,
468
+ // saveDataLogicName: this.saveDataLogicName,
469
+ // serviceName: this.serviceName,
470
+ // logicExtraParams: this.logicExtraParams,
471
+ // dropDownBoxParams: this.dropDownBoxParams
472
+ // })
473
+ })
474
+ },
475
+ // 合并模板数据
476
+ assignTemplates (newBindObject, templateData) {
477
+ // 检查templates数组是否存在
478
+ if (!templateData.templates || !Array.isArray(templateData.templates)) {
479
+ console.warn('templateData.templates不存在或不是数组')
480
+ return newBindObject
481
+ }
482
+ // 遍历templates数组中的每个属性名
483
+ templateData.templates.forEach(propName => {
484
+ // 检查templateData是否有该属性
485
+ if (propName in templateData) {
486
+ // 无论newBindObject是否有该属性,都进行赋值/添加
487
+ newBindObject[propName] = templateData[propName]
488
+ } else {
489
+ console.warn(`templateData中不存在属性: ${propName}`)
490
+ }
491
+ })
492
+ return newBindObject
493
+ },
494
+ useTemplateData () {
495
+ // 确认是否有合并后的模板数据
496
+ if (!this.assignBindObject) {
497
+ this.$message.warning('没有可用的模板数据');
498
+ return;
499
+ }
500
+ this.editorRef.setBindObject(this.assignBindObject)
501
+ // console.log('resId', this.resId)
502
+ },
503
+ // 切换文档
504
+ changeRes (value) {
505
+ console.log('value', value)
506
+ let params = {
507
+ resId: value
508
+ }
509
+ if (value === -1) {
510
+ params = {
511
+ ...params,
512
+ admissionId: this.admissionId,
513
+ f_template_id: this.templateId
514
+ }
515
+ const that = this
516
+ this.$confirm({
517
+ title: '确认切换文档吗?',
518
+ content: '您有尚未保存的文档,切换文档将丢失所有的修改',
519
+ onOk () {
520
+ that.reload(params)
521
+ // that.userTemplateVisible = true
522
+ },
523
+ onCancel () {
524
+ that.toggleResId = that.resId
525
+ },
526
+ })
527
+ } else {
528
+ this.reload(params)
529
+ }
530
+ },
531
+ // 保存文档
532
+ save () {
533
+ // 验证必须输入项
534
+ if (this.editorRef.validate()) {
535
+ // 获取HTML文档和结构化数据(JSON)
536
+ console.log('save',this.editorRef.getBindObject())
537
+ const data = {
538
+ doc: this.editorRef.getHtml(),
539
+ dataObject: {
540
+ ...this.editorRef.getBindObject(),
541
+ ...this.codeData // 合并 codeData 数据
542
+ },
543
+ dataMode: this.dataMode,
544
+ resId: this.resId,
545
+ modifyResModel: this.modifyResModel,
546
+ logicExtraParams: this.logicExtraParams,
547
+ is_template: this.isTemplate,
548
+ f_file_name: this.fileName
549
+ }
550
+ // 保存HTML文档和结构化数据到后端服务
551
+ runLogic(this.saveDataLogicName, data, this.serviceName).then(res => {
552
+ this.$message.success('保存成功')
553
+ this.changeRes(res.currResData.id)
554
+ this.$emit('saveafter', data.dataObject)
555
+ }).finally(() => {
556
+ this.resDataModalVisible = false
557
+ this.saveVisible = false
558
+ })
559
+ } else {
560
+ this.$message.error('请检查未填写的项目')
561
+ }
562
+ },
563
+ // 打印文档
564
+ print () {
565
+ this.editorRef.execCommand('print')
566
+ },
567
+ // 关闭编辑器
568
+ close () {
569
+ this.ready = false
570
+ },
571
+ // 刷新文档
572
+ refresh () {
573
+ this.loadFile(this.fileUrl, this.bindObject, this.currResData)
574
+ },
575
+ // 导出下拉菜单
576
+ handleExportMenuClick (e) {
577
+ const key = e.key
578
+ this.editorRef.execCommand(key)
579
+ }
580
+ }
581
+ }
582
+ </script>
583
+ <style scoped lang="less">
584
+ .editor-action-container {
585
+ height: 40px;
586
+ }
587
+ :deep(.ant-divider-horizontal) {
588
+ margin: 4px 0;
589
+ }
590
+ /* 组合按钮容器 - 关键修正 */
591
+ .combined-save-btn {
592
+ display: inline-flex;
593
+ height: 32px;
594
+ }
595
+
596
+ /* 主保存按钮 - 保持原有样式 */
597
+ .save-btn-main {
598
+ border-top-right-radius: 0 !important;
599
+ border-bottom-right-radius: 0 !important;
600
+ border-right: none !important;
601
+ height: 32px;
602
+ padding: 0 15px;
603
+ display: inline-flex;
604
+ align-items: center;
605
+ justify-content: center;
606
+ margin-right: -1px; /* 关键:负边距消除间距 */
607
+ }
608
+
609
+ /* 下拉按钮 - 仅调整间距 */
610
+ .dropdown-trigger-btn {
611
+ height: 32px !important;
612
+ width: 24px !important;
613
+ min-width: 24px !important;
614
+ padding: 0 !important;
615
+ border-top-left-radius: 0 !important;
616
+ border-bottom-left-radius: 0 !important;
617
+ border-left: 1px solid rgba(255, 255, 255, 0.3) !important;
618
+ display: inline-flex;
619
+ align-items: center;
620
+ justify-content: center;
621
+ margin-left: 0px;
622
+ }
623
+
624
+ /* 下拉图标保持原样 */
625
+ .dropdown-trigger-btn .anticon {
626
+ font-size: 12px;
627
+ margin: 0 !important;
628
+ }
629
+ </style>