lyflowchart 1.0.113 → 1.0.130

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 (198) hide show
  1. package/dist/ActionsConfig-BuvSvRbv.js +395 -0
  2. package/dist/ActionsConfig-BuvSvRbv.js.map +1 -0
  3. package/dist/ApprovalEditorModal-DZfXupU3.js +48 -0
  4. package/dist/ApprovalEditorModal-DZfXupU3.js.map +1 -0
  5. package/dist/CancelModal-BUi3ieI8.js +61 -0
  6. package/dist/CancelModal-BUi3ieI8.js.map +1 -0
  7. package/dist/Cell_click_approve-CBh0j--6.js +244 -0
  8. package/dist/Cell_click_approve-CBh0j--6.js.map +1 -0
  9. package/dist/JsonTags-BbWLqghI.js +66 -0
  10. package/dist/JsonTags-BbWLqghI.js.map +1 -0
  11. package/dist/MyProcess-FWGEwQcv.js +26434 -0
  12. package/dist/MyProcess-FWGEwQcv.js.map +1 -0
  13. package/dist/MyProcess.vue.d.ts +991 -0
  14. package/dist/approval-BW2WjPxY.js +167 -0
  15. package/dist/approval-BW2WjPxY.js.map +1 -0
  16. package/dist/approval-CuUNtG9u.js +18 -0
  17. package/dist/approval-CuUNtG9u.js.map +1 -0
  18. package/dist/approvalHistory-B2gpQbFC.js +868 -0
  19. package/dist/approvalHistory-B2gpQbFC.js.map +1 -0
  20. package/dist/approvalHistoryViewModal-DgLpv2ot.js +114 -0
  21. package/dist/approvalHistoryViewModal-DgLpv2ot.js.map +1 -0
  22. package/dist/approvalPageConfig-D0zPXOUf.js +2437 -0
  23. package/dist/approvalPageConfig-D0zPXOUf.js.map +1 -0
  24. package/dist/approveLeftConfig-BOU_UgHp.js +136 -0
  25. package/dist/approveLeftConfig-BOU_UgHp.js.map +1 -0
  26. package/dist/codeHistoryViewModal-BfSjIbEU.js +103 -0
  27. package/dist/codeHistoryViewModal-BfSjIbEU.js.map +1 -0
  28. package/dist/columnTables-DLwtgcC7.js +1272 -0
  29. package/dist/columnTables-DLwtgcC7.js.map +1 -0
  30. package/dist/components/Cell_click_approve.vue.d.ts +5 -0
  31. package/dist/components/Cell_click_data_source.vue.d.ts +6 -0
  32. package/dist/components/Process/common/bpmnUtils.d.ts +8 -0
  33. package/dist/components/Process/common/global.d.ts +16 -0
  34. package/dist/components/Process/common/index.d.ts +5 -0
  35. package/dist/components/Process/component/JsonTags2.vue.d.ts +60 -0
  36. package/dist/components/Process/component/ValueInput2.vue.d.ts +74 -0
  37. package/dist/components/Process/component/columnNameField2.vue.d.ts +51 -0
  38. package/dist/components/Process/component/data.d.ts +157 -0
  39. package/dist/components/Process/customPanel/CustomContextPad.d.ts +31 -0
  40. package/dist/components/Process/customPanel/CustomPalette.d.ts +89 -0
  41. package/dist/components/Process/customPanel/customTranslate.d.ts +1 -0
  42. package/dist/components/Process/customPanel/index.d.ts +8 -0
  43. package/dist/components/Process/designer.vue.d.ts +589 -0
  44. package/dist/components/Process/flowable/init.d.ts +1 -0
  45. package/dist/components/Process/index.vue.d.ts +812 -0
  46. package/dist/components/Process/lang/zh.d.ts +249 -0
  47. package/dist/components/Process/panel/ButtonsPanel.vue.d.ts +24 -0
  48. package/dist/components/Process/panel/PropertiesPanel.vue.d.ts +24 -0
  49. package/dist/components/Process/panel/commonPanel.vue.d.ts +40 -0
  50. package/dist/components/Process/panel/conditionPanel.vue.d.ts +271 -0
  51. package/dist/components/Process/panel/executionListener.vue.d.ts +66 -0
  52. package/dist/components/Process/panel/formPanel.vue.d.ts +7 -0
  53. package/dist/components/Process/panel/multiInstance.vue.d.ts +33 -0
  54. package/dist/components/Process/panel/otherPanel.vue.d.ts +17 -0
  55. package/dist/components/Process/panel/taskListener.vue.d.ts +64 -0
  56. package/dist/components/Process/panel/taskPanel.vue.d.ts +254 -0
  57. package/dist/components/Process/viewer/index.vue.d.ts +41 -0
  58. package/dist/components/approval/ApprovalEditorModal.vue.d.ts +26 -0
  59. package/dist/components/approval/CostCompanySelect.vue.d.ts +29 -0
  60. package/dist/components/approval/CostDepartmentSelect.vue.d.ts +35 -0
  61. package/dist/components/approval/CreateByCascader.vue.d.ts +27 -0
  62. package/dist/components/approval/CreateBySelect.vue.d.ts +35 -0
  63. package/dist/components/approval/PostionCascader.vue.d.ts +26 -0
  64. package/dist/components/approval/SystemTime.vue.d.ts +38 -0
  65. package/dist/components/approval/approvalViewId.d.ts +36 -0
  66. package/dist/components/approval/components/CancelModal.vue.d.ts +25 -0
  67. package/dist/components/approval/components/FormCodeInput.vue.d.ts +33 -0
  68. package/dist/components/approval/components/FormContextInput.vue.d.ts +33 -0
  69. package/dist/components/approval/components/FormFlowOrgInput.vue.d.ts +40 -0
  70. package/dist/components/approval/components/actionsBar.vue.d.ts +17 -0
  71. package/dist/components/approval/components/approvalHistory/approvalHistoryViewModal.vue.d.ts +41 -0
  72. package/dist/components/approval/components/approvalHistory/dataStoreSettingHistory.vue.d.ts +55 -0
  73. package/dist/components/approval/components/approvalHistory/dataStoreSettingHistoryViewModal.vue.d.ts +41 -0
  74. package/dist/components/approval/components/approvalHistory/flowHistoryViewModal.vue.d.ts +41 -0
  75. package/dist/components/approval/components/approvalHistory/flowSettingHistory.vue.d.ts +55 -0
  76. package/dist/components/approval/components/approvalHistory/index.vue.d.ts +212 -0
  77. package/dist/components/approval/components/approvalHistory/pageSettingHistory.vue.d.ts +55 -0
  78. package/dist/components/approval/components/approvalPageConfig/ActionsConfig.vue.d.ts +112 -0
  79. package/dist/components/approval/components/approvalPageConfig/BaseConditions.vue.d.ts +205 -0
  80. package/dist/components/approval/components/approvalPageConfig/CodeEditorWraper.vue.d.ts +51 -0
  81. package/dist/components/approval/components/approvalPageConfig/ColumnConfig.vue.d.ts +145 -0
  82. package/dist/components/approval/components/approvalPageConfig/ConditionFieldMulType.vue.d.ts +137 -0
  83. package/dist/components/approval/components/approvalPageConfig/JsonInput.vue.d.ts +38 -0
  84. package/dist/components/approval/components/approvalPageConfig/JsonTags.vue.d.ts +26 -0
  85. package/dist/components/approval/components/approvalPageConfig/JsonText.vue.d.ts +36 -0
  86. package/dist/components/approval/components/approvalPageConfig/approveLeftConfig.vue.d.ts +6 -0
  87. package/dist/components/approval/components/approvalPageConfig/baseConfig.vue.d.ts +10 -0
  88. package/dist/components/approval/components/approvalPageConfig/cellEdit.vue.d.ts +23 -0
  89. package/dist/components/approval/components/approvalPageConfig/configSync.vue.d.ts +76 -0
  90. package/dist/components/approval/components/approvalPageConfig/confirmInput.vue.d.ts +26 -0
  91. package/dist/components/approval/components/approvalPageConfig/defaultOperatorSelect.vue.d.ts +18 -0
  92. package/dist/components/approval/components/approvalPageConfig/index.vue.d.ts +11 -0
  93. package/dist/components/approval/components/approvalPageConfig/jsonConfig.vue.d.ts +16 -0
  94. package/dist/components/approval/components/approvalPageConfig/layoutSetting.vue.d.ts +9 -0
  95. package/dist/components/approval/components/approvalPageConfig/leftColumn.vue.d.ts +1184 -0
  96. package/dist/components/approval/components/approvalPageConfig/middleColumn.vue.d.ts +145 -0
  97. package/dist/components/approval/components/approvalPageConfig/operatorSelect.vue.d.ts +18 -0
  98. package/dist/components/approval/components/approvalPageConfig/searchConfig.vue.d.ts +166 -0
  99. package/dist/components/approval/components/approvalPageConfig/tableConfig.vue.d.ts +802 -0
  100. package/dist/components/approval/components/codeHistory/codeHistory.vue.d.ts +53 -0
  101. package/dist/components/approval/components/codeHistory/codeHistoryViewModal.vue.d.ts +32 -0
  102. package/dist/components/approval/components/columnDataList.vue.d.ts +454 -0
  103. package/dist/components/approval/components/columnForm.vue.d.ts +26 -0
  104. package/dist/components/approval/components/columnTables.vue.d.ts +502 -0
  105. package/dist/components/approval/components/columnUnknown.vue.d.ts +2 -0
  106. package/dist/components/approval/components/dataStoreConfig/ConditionConfig.vue.d.ts +199 -0
  107. package/dist/components/approval/components/dataStoreConfig/ValueInput.vue.d.ts +37 -0
  108. package/dist/components/approval/components/dataStoreConfig/dataSourceDetial.vue.d.ts +22 -0
  109. package/dist/components/approval/components/dataStoreConfig/dataStoreConfig.vue.d.ts +554 -0
  110. package/dist/components/approval/components/dataStoreConfig/dataStoreConfigItem.vue.d.ts +434 -0
  111. package/dist/components/approval/components/dataStoreConfig/dataStoreTest.vue.d.ts +39 -0
  112. package/dist/components/approval/components/dataStoreConfig/dataStoreTestsItem.vue.d.ts +17 -0
  113. package/dist/components/approval/components/dataStoreConfig/formField.vue.d.ts +28 -0
  114. package/dist/components/approval/components/dataStoreConfig/formFieldMulType.vue.d.ts +96 -0
  115. package/dist/components/approval/components/dataStoreConfig/selectExcelColumn.vue.d.ts +26 -0
  116. package/dist/components/approval/components/dataStoreConfig/selectExcelType.vue.d.ts +28 -0
  117. package/dist/components/approval/components/debugCode/debugCode.vue.d.ts +214 -0
  118. package/dist/components/approval/components/drawerDataList.vue.d.ts +504 -0
  119. package/dist/components/approval/components/drawerTablesList.vue.d.ts +551 -0
  120. package/dist/components/approval/components/flowConfig/flowConfig.vue.d.ts +1097 -0
  121. package/dist/components/approval/components/flowConfig/selectCcGroup.vue.d.ts +9 -0
  122. package/dist/components/approval/components/flowConfig/selectUsers.vue.d.ts +9 -0
  123. package/dist/components/approval/components/modelTablesList.vue.d.ts +551 -0
  124. package/dist/components/approval/components/pageConfigHistory.vue.d.ts +2 -0
  125. package/dist/components/approval/components/search.vue.d.ts +238 -0
  126. package/dist/components/approval/components/searchSummary.vue.d.ts +100 -0
  127. package/dist/components/approval/components/table.vue.d.ts +416 -0
  128. package/dist/components/approval/components/tableModal.vue.d.ts +84 -0
  129. package/dist/components/approval/configs/approval/default.d.ts +11 -0
  130. package/dist/components/approval/configs/approval/recordActions.d.ts +22 -0
  131. package/dist/components/approval/core.vue.d.ts +48 -0
  132. package/dist/components/approval/example_code/example_code.d.ts +11 -0
  133. package/dist/components/approval/index.d.ts +18 -0
  134. package/dist/components/approval/index.vue.d.ts +2 -0
  135. package/dist/components/approval/migrate/index.d.ts +1 -0
  136. package/dist/components/approval/migrate/v0001.d.ts +2 -0
  137. package/dist/components/approval/store/context.d.ts +48 -0
  138. package/dist/components/approval/store/debugCode.d.ts +7 -0
  139. package/dist/components/approval/store/settingsState.d.ts +15 -0
  140. package/dist/components/approval/typing.d.ts +210 -0
  141. package/dist/components/approval/useApprovalRecordActions.d.ts +83 -0
  142. package/dist/components/approval/utils.d.ts +164 -0
  143. package/dist/components/approval_for_details.vue.d.ts +9 -0
  144. package/dist/components/flow/ElInputTag/index.vue.d.ts +46 -0
  145. package/dist/components/flow/Expression/index.vue.d.ts +48 -0
  146. package/dist/components/flow/Role/index.vue.d.ts +68 -0
  147. package/dist/components/flow/User/index.vue.d.ts +76 -0
  148. package/dist/config/packed-config.d.ts +26 -0
  149. package/dist/constants.d.ts +1 -0
  150. package/dist/core-CctSle2c.js +1629 -0
  151. package/dist/core-CctSle2c.js.map +1 -0
  152. package/dist/dataStoreSettingHistoryViewModal-D_so-KLp.js +114 -0
  153. package/dist/dataStoreSettingHistoryViewModal-D_so-KLp.js.map +1 -0
  154. package/dist/debugCode-Cm9-WiUG.js +565 -0
  155. package/dist/debugCode-Cm9-WiUG.js.map +1 -0
  156. package/dist/debugCode-dD1YnQSD.js +11 -0
  157. package/dist/debugCode-dD1YnQSD.js.map +1 -0
  158. package/dist/default-VdDMlY4e.js +560 -0
  159. package/dist/default-VdDMlY4e.js.map +1 -0
  160. package/dist/example_code-C_xF8RRG.js +129 -0
  161. package/dist/example_code-C_xF8RRG.js.map +1 -0
  162. package/dist/flowHistoryViewModal-D8DJP7Te.js +109 -0
  163. package/dist/flowHistoryViewModal-D8DJP7Te.js.map +1 -0
  164. package/dist/index.d.ts +81 -0
  165. package/dist/index.js +507 -26691
  166. package/dist/index.js.map +1 -1
  167. package/dist/init-plugin-fQTSQzui.js +48 -0
  168. package/dist/init-plugin-fQTSQzui.js.map +1 -0
  169. package/dist/init-plugin.d.ts +57 -0
  170. package/dist/leftColumn-CsPjufue.js +209 -0
  171. package/dist/leftColumn-CsPjufue.js.map +1 -0
  172. package/dist/lyflowchart.css +1 -1
  173. package/dist/middleColumn-C7M6-eVo.js +107 -0
  174. package/dist/middleColumn-C7M6-eVo.js.map +1 -0
  175. package/dist/recordActions-BgFlNsGU.js +51 -0
  176. package/dist/recordActions-BgFlNsGU.js.map +1 -0
  177. package/dist/settingsState-CI81PG-i.js +19 -0
  178. package/dist/settingsState-CI81PG-i.js.map +1 -0
  179. package/dist/style.d.ts +3 -0
  180. package/dist/styles.d.ts +7 -0
  181. package/dist/tableConfig-uLXue-BS.js +2408 -0
  182. package/dist/tableConfig-uLXue-BS.js.map +1 -0
  183. package/dist/tableModal-BcYfVL02.js +124 -0
  184. package/dist/tableModal-BcYfVL02.js.map +1 -0
  185. package/dist/useApprovalRecordActions-BQ6MgV2L.js +843 -0
  186. package/dist/useApprovalRecordActions-BQ6MgV2L.js.map +1 -0
  187. package/dist/utils/StrUtil.d.ts +52 -0
  188. package/dist/utils/function.d.ts +8 -0
  189. package/dist/utils-CLet2gLV.js +420 -0
  190. package/dist/utils-CLet2gLV.js.map +1 -0
  191. package/dist/v0001-OaBeBCXI.js +4 -0
  192. package/dist/v0001-OaBeBCXI.js.map +1 -0
  193. package/dist/{Cell_click_data_source-CUVsbkcN.js → viewer-Dv3kQsMf.js} +1551 -2415
  194. package/dist/viewer-Dv3kQsMf.js.map +1 -0
  195. package/dist/vue-print-next-HRweUmNi.js +683 -0
  196. package/dist/vue-print-next-HRweUmNi.js.map +1 -0
  197. package/package.json +39 -8
  198. package/dist/Cell_click_data_source-CUVsbkcN.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useApprovalRecordActions-BQ6MgV2L.js","names":[],"sources":["../src/components/approval_for_details.vue","../src/components/approval_for_details.vue","../src/components/approval/useApprovalRecordActions.ts"],"sourcesContent":["<template>\n <div class=\"form-container\">\n <!--\n 本组件只负责**展示**审批详情(头部 / 基本信息 / 表单渲染 / 流程图 / 审批记录表)。\n 修改 / 删除 / 打印按钮不在这里 —— 由外壳自己渲染(位置随外壳挑),\n 是否显示与点击行为统一走 useApprovalRecordActions(参照 Cell_click_approve 的抽屉 #extra、\n Cell_click_data_source 的 tabs #rightExtra)。\n -->\n <div class=\"header-container\">\n <div class=\"serial-number\">流程编码:{{ record?.number }}</div>\n <div class=\"article-title\">{{ approval_obj?.context }}({{ approval_obj?.flow_name }})</div>\n <div\n v-if=\"approval_obj?.modify_status\"\n class=\"modify-status\"\n >\n <a-tag :color=\"getModifyStatusColor(approval_obj.modify_status)\">\n {{ approval_obj.modify_status }}\n </a-tag>\n </div>\n </div>\n <div\n class=\"form-body descriptions\"\n style=\"padding-bottom: 10px\"\n >\n <div\n class=\"xinxi-title\"\n style=\"margin-top: 0\"\n >\n 基本信息\n </div>\n <a-descriptions bordered>\n <a-descriptions-item label=\"发起人\">\n {{ approval_obj?.send_person__realname }}\n </a-descriptions-item>\n <a-descriptions-item label=\"切换组织\">\n {{ approval_obj?.form_data?.globalData?.cost_company?.name }}\n </a-descriptions-item>\n <a-descriptions-item label=\"切换部门\">\n {{ approval_obj?.form_data?.globalData?.cost_department?.name }}\n </a-descriptions-item>\n <a-descriptions-item label=\"员工职位\">\n {{ approval_obj?.form_data?.globalData?.person_position?.name }}\n </a-descriptions-item>\n <a-descriptions-item label=\"员工组织\">\n {{ approval_obj?.form_data?.globalData?.person_cost_company?.name }}\n </a-descriptions-item>\n <a-descriptions-item label=\"员工部门\">\n {{ approval_obj?.form_data?.globalData?.person_department?.name }}\n </a-descriptions-item>\n <a-descriptions-item label=\"发起时间\">\n {{ getDate(approval_obj?.start_time) }}\n </a-descriptions-item>\n <a-descriptions-item\n :span=\"2\"\n label=\"结束时间\"\n >\n {{ getDate(approval_obj?.finish_time) }}\n </a-descriptions-item>\n <a-descriptions-item label=\"流程主题\">{{ approval_obj?.context }}</a-descriptions-item>\n <a-descriptions-item\n v-if=\"approval_obj?.modify_source__number\"\n label=\"修改来源流水号\"\n >\n {{ approval_obj?.modify_source__number }}\n </a-descriptions-item>\n </a-descriptions>\n <template\n v-for=\"(item, i) in data\"\n :key=\"i\"\n >\n <div class=\"xinxi-title\">\n {{ item?.group_name ? item.group_name : '审批信息' + (i + 1) }}\n </div>\n <a-descriptions\n bordered\n :column=\"item?.column ? item?.column : 3\"\n >\n <template\n v-for=\"(obj, j) in item.children\"\n :key=\"j\"\n >\n <template v-if=\"obj.type !== 'remotetablepro' && obj.type !== 'formtemplate'\">\n <template v-if=\"obj.type === 'textarea'\">\n <a-descriptions-item :label=\"obj.label\">\n <p style=\"white-space: pre-line; margin: 0; color: #909399\">{{ obj.value }}</p>\n </a-descriptions-item>\n </template>\n <template v-else-if=\"obj.type === 'upload'\">\n <a-descriptions-item :label=\"obj.label\">\n <template v-if=\"obj.value && obj.value?.length > 0\">\n <template\n v-for=\"(uploadItem, m) in obj.value\"\n :key=\"m\"\n >\n <br v-if=\"m > 0\" />\n <a-button\n type=\"link\"\n @click=\"look(uploadItem.url)\"\n >\n {{ uploadItem.name }}\n </a-button>\n </template>\n </template>\n </a-descriptions-item>\n </template>\n <template v-else>\n <a-descriptions-item\n :label=\"obj.label\"\n :span=\"1\"\n >\n {{ obj.value }}\n </a-descriptions-item>\n </template>\n </template>\n </template>\n </a-descriptions>\n <a-descriptions\n bordered\n :column=\"item?.column ? item?.column : 3\"\n >\n <template\n v-for=\"(obj, j) in item.children\"\n :key=\"j\"\n >\n <template v-if=\"obj.type === 'remotetablepro'\">\n <a-descriptions-item\n :label=\"obj.label\"\n :span=\"3\"\n >\n <s-table\n :columns=\"getColumns(obj.children)\"\n :data-source=\"getDataSource(obj.children)\"\n :pagination=\"false\"\n :rangeSelection=\"false\"\n :row-key=\"'index'\"\n bordered\n size=\"small\"\n stripe\n >\n <template #bodyCell=\"{ record, column, text, index }\">\n <template v-if=\"column.dataIndex.includes('upload')\">\n <template v-if=\"text && text?.length > 0\">\n <template\n v-for=\"(uploadItem, m) in text\"\n :key=\"m\"\n >\n <br v-if=\"m > 0\" />\n <a-button\n :title=\"uploadItem.name\"\n style=\"padding-left: 1px; width: 100%\"\n type=\"link\"\n @click=\"look(uploadItem.url)\"\n >\n <span\n style=\"\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 100%;\n user-select: text;\n text-align: left;\n \"\n >\n {{ uploadItem.name }}\n </span>\n </a-button>\n </template>\n </template>\n </template>\n <template v-else>{{ text }}</template>\n </template>\n </s-table>\n </a-descriptions-item>\n </template>\n <template v-if=\"obj.type === 'formtemplate'\">\n <a-descriptions-item\n :label=\"obj.label\"\n :span=\"3\"\n >\n <template\n v-for=\"(obj1, k) in obj.children\"\n :key=\"k\"\n >\n <a-descriptions\n bordered\n :column=\"obj?.column ? obj?.column : 3\"\n >\n <template\n v-for=\"(obj2, l) in obj1\"\n :key=\"l\"\n >\n <template\n v-if=\"obj2.type !== 'remotetablepro' && obj2.type !== 'formtemplate'\"\n >\n <template v-if=\"obj2.type === 'textarea' && !obj2.is_hide\">\n <a-descriptions-item :label=\"obj2.label\">\n <p style=\"white-space: pre-line; margin: 0; color: #909399\">\n {{ obj2.value }}\n </p>\n </a-descriptions-item>\n </template>\n <template v-else-if=\"obj2.type === 'upload' && !obj2.is_hide\">\n <a-descriptions-item :label=\"obj2.label\">\n <template v-if=\"obj2.value && obj2.value?.length > 0\">\n <template\n v-for=\"(uploadItem, m) in obj2.value\"\n :key=\"m\"\n >\n <br v-if=\"m > 0\" />\n <a-button\n type=\"link\"\n @click=\"look(uploadItem.url)\"\n >\n {{ uploadItem.name }}\n </a-button>\n </template>\n </template>\n </a-descriptions-item>\n </template>\n <template v-else>\n <a-descriptions-item\n v-if=\"!obj2.is_hide\"\n :label=\"obj2.label\"\n >\n {{ obj2.value }}\n </a-descriptions-item>\n </template>\n </template>\n </template>\n </a-descriptions>\n <a-descriptions\n bordered\n :column=\"obj?.column ? obj?.column : 3\"\n >\n <template\n v-for=\"(obj2, l) in obj1\"\n :key=\"l\"\n >\n <template v-if=\"obj2.type === 'remotetablepro' && !obj2.is_hide\">\n <a-descriptions-item\n :label=\"obj2.label\"\n :span=\"3\"\n >\n <s-table\n :columns=\"getColumns(obj2.children)\"\n :data-source=\"getDataSource(obj2.children)\"\n :pagination=\"false\"\n :rangeSelection=\"false\"\n :row-key=\"'index'\"\n bordered\n size=\"small\"\n stripe\n >\n <template #bodyCell=\"{ record, column, text, index }\">\n <template v-if=\"column.dataIndex.includes('upload')\">\n <template v-if=\"text && text?.length > 0\">\n <template\n v-for=\"(uploadItem, m) in text\"\n :key=\"m\"\n >\n <br v-if=\"m > 0\" />\n <a-button\n :title=\"uploadItem.name\"\n style=\"padding-left: 1px; width: 100%\"\n type=\"link\"\n @click=\"look(uploadItem.url)\"\n >\n <span\n style=\"\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 100%;\n user-select: text;\n text-align: left;\n \"\n >\n {{ uploadItem.name }}\n </span>\n </a-button>\n </template>\n </template>\n </template>\n <template v-else>{{ text }}</template>\n </template>\n </s-table>\n </a-descriptions-item>\n </template>\n <template v-if=\"obj2.type === 'formtemplate' && !obj2.is_hide\">\n <a-descriptions-item\n :label=\"obj2.label\"\n :span=\"3\"\n >\n <template\n v-for=\"(obj3, k) in obj2.children\"\n :key=\"k\"\n >\n <a-descriptions\n bordered\n :column=\"obj2?.column ? obj2?.column : 3\"\n >\n <template\n v-for=\"(obj4, l) in obj3\"\n :key=\"l\"\n >\n <template\n v-if=\"\n obj4.type !== 'remotetablepro' && obj4.type !== 'formtemplate'\n \"\n >\n <template v-if=\"obj4.type === 'textarea' && !obj4.is_hide\">\n <a-descriptions-item :label=\"obj4.label\">\n <p style=\"white-space: pre-line; margin: 0; color: #909399\">\n {{ obj4.value }}\n </p>\n </a-descriptions-item>\n </template>\n <template v-else-if=\"obj4.type === 'upload' && !obj4.is_hide\">\n <a-descriptions-item :label=\"obj4.label\">\n <template v-if=\"obj4.value && obj4.value?.length > 0\">\n <template\n v-for=\"(uploadItem, m) in obj4.value\"\n :key=\"m\"\n >\n <br v-if=\"m > 0\" />\n <a-button\n type=\"link\"\n @click=\"look(uploadItem.url)\"\n >\n {{ uploadItem.name }}\n </a-button>\n </template>\n </template>\n </a-descriptions-item>\n </template>\n <template v-else>\n <a-descriptions-item\n v-if=\"!obj4.is_hide\"\n :label=\"obj4.label\"\n >\n {{ obj4.value }}\n </a-descriptions-item>\n </template>\n </template>\n </template>\n </a-descriptions>\n <a-descriptions\n bordered\n :column=\"obj2?.column ? obj2?.column : 3\"\n >\n <template\n v-for=\"(obj4, l) in obj3\"\n :key=\"l\"\n >\n <template v-if=\"obj4.type === 'remotetablepro'\">\n <a-descriptions-item\n :label=\"obj4.label\"\n :span=\"3\"\n >\n <s-table\n :columns=\"getColumns(obj4.children)\"\n :data-source=\"getDataSource(obj4.children)\"\n :pagination=\"false\"\n :rangeSelection=\"false\"\n :row-key=\"'index'\"\n bordered\n size=\"small\"\n stripe\n >\n <template #bodyCell=\"{ record, column, text, index }\">\n <template v-if=\"column.dataIndex.includes('upload')\">\n <template v-if=\"text && text?.length > 0\">\n <template\n v-for=\"(uploadItem, m) in text\"\n :key=\"m\"\n >\n <br v-if=\"m > 0\" />\n <a-button\n :title=\"uploadItem.name\"\n style=\"padding-left: 1px; width: 100%\"\n type=\"link\"\n @click=\"look(uploadItem.url)\"\n >\n <span\n style=\"\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 100%;\n user-select: text;\n text-align: left;\n \"\n >\n {{ uploadItem.name }}\n </span>\n </a-button>\n </template>\n </template>\n </template>\n <template v-else>{{ text }}</template>\n </template>\n </s-table>\n </a-descriptions-item>\n </template>\n <template v-if=\"obj4.type === 'formtemplate'\">\n <a-descriptions-item\n :label=\"obj4.label\"\n :span=\"3\"\n >\n <template\n v-for=\"(obj5, k) in obj4.children\"\n :key=\"k\"\n >\n <a-descriptions\n bordered\n :column=\"obj4?.column ? obj4?.column : 3\"\n >\n <template\n v-for=\"(obj6, l) in obj5\"\n :key=\"l\"\n >\n <template\n v-if=\"\n obj6.type !== 'remotetablepro' &&\n obj6.type !== 'formtemplate'\n \"\n >\n <template\n v-if=\"obj6.type === 'textarea' && !obj6.is_hide\"\n >\n <a-descriptions-item :label=\"obj6.label\">\n <p\n style=\"\n white-space: pre-line;\n margin: 0;\n color: #909399;\n \"\n >\n {{ obj6.value }}\n </p>\n </a-descriptions-item>\n </template>\n <template\n v-else-if=\"obj6.type === 'upload' && !obj6.is_hide\"\n >\n <a-descriptions-item :label=\"obj6.label\">\n <template\n v-if=\"obj6.value && obj6.value?.length > 0\"\n >\n <template\n v-for=\"(uploadItem, m) in obj6.value\"\n :key=\"m\"\n >\n <br v-if=\"m > 0\" />\n <a-button\n type=\"link\"\n @click=\"look(uploadItem.url)\"\n >\n {{ uploadItem.name }}\n </a-button>\n </template>\n </template>\n </a-descriptions-item>\n </template>\n <template v-else>\n <a-descriptions-item\n v-if=\"!obj6.is_hide\"\n :label=\"obj6.label\"\n >\n {{ obj6.value }}\n </a-descriptions-item>\n </template>\n </template>\n </template>\n </a-descriptions>\n <a-descriptions\n bordered\n :column=\"obj4?.column ? obj4?.column : 3\"\n >\n <template\n v-for=\"(obj6, l) in obj5\"\n :key=\"l\"\n >\n <template v-if=\"obj6.type === 'remotetablepro'\">\n <a-descriptions-item\n :label=\"obj6.label\"\n :span=\"3\"\n >\n <s-table\n :columns=\"getColumns(obj6.children)\"\n :data-source=\"getDataSource(obj6.children)\"\n :pagination=\"false\"\n :rangeSelection=\"false\"\n :row-key=\"'index'\"\n bordered\n size=\"small\"\n stripe\n >\n <template\n #bodyCell=\"{ record, column, text, index }\"\n >\n <template\n v-if=\"column.dataIndex.includes('upload')\"\n >\n <template v-if=\"text && text?.length > 0\">\n <template\n v-for=\"(uploadItem, m) in text\"\n :key=\"m\"\n >\n <br v-if=\"m > 0\" />\n <a-button\n :title=\"uploadItem.name\"\n style=\"padding-left: 1px; width: 100%\"\n type=\"link\"\n @click=\"look(uploadItem.url)\"\n >\n <span\n style=\"\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 100%;\n user-select: text;\n text-align: left;\n \"\n >\n {{ uploadItem.name }}\n </span>\n </a-button>\n </template>\n </template>\n </template>\n <template v-else>{{ text }}</template>\n </template>\n </s-table>\n </a-descriptions-item>\n </template>\n </template>\n </a-descriptions>\n </template>\n </a-descriptions-item>\n </template>\n </template>\n </a-descriptions>\n </template>\n </a-descriptions-item>\n </template>\n </template>\n </a-descriptions>\n </template>\n </a-descriptions-item>\n </template>\n </template>\n </a-descriptions>\n </template>\n <template v-if=\"task_data.length > 0\">\n <div class=\"xinxi-title\">审批记录</div>\n <s-table\n :columns=\"task_columns\"\n :data-source=\"task_data\"\n :pagination=\"false\"\n :rangeSelection=\"false\"\n :scroll=\"{ y: 400 }\"\n :rowKey=\"'id'\"\n bordered\n size=\"small\"\n stripe\n >\n <template #bodyCell=\"{ column, index, text, record }\">\n <template v-if=\"column.dataIndex == 'index'\">\n {{ index + 1 }}\n </template>\n <template v-else>\n {{ text }}\n </template>\n </template>\n </s-table>\n </template>\n <template v-if=\"person_approve.length > 0\">\n <div class=\"xinxi-title\">步骤审批人信息</div>\n <s-table\n :columns=\"person_columns\"\n :data-source=\"person_approve\"\n :pagination=\"false\"\n :rangeSelection=\"false\"\n :scroll=\"{ y: 400 }\"\n :rowKey=\"'id'\"\n bordered\n size=\"small\"\n stripe\n >\n <template #bodyCell=\"{ column, index, text, record }\">\n <template v-if=\"column.dataIndex == 'index'\">\n {{ index + 1 }}\n </template>\n <template v-else-if=\"column.dataIndex == 'jue_se'\">\n <a-tag\n v-if=\"record?.jue_se\"\n color=\"blue\"\n >\n {{ record?.jue_se || '' }}\n </a-tag>\n </template>\n <template v-else-if=\"column.dataIndex == 'list'\">\n <a-tag\n v-for=\"(obj, index) in record.list\"\n :key=\"index\"\n color=\"green\"\n >\n {{ obj.realname }}\n </a-tag>\n </template>\n <template v-else>\n {{ text }}\n </template>\n </template>\n </s-table>\n </template>\n <div style=\"height: 400px; margin-top: 10px\">\n <my-process-viewer\n :flowData=\"flowData\"\n :height=\"400\"\n />\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { onMounted, reactive, ref, watch } from 'vue';\nimport { useGetApiData } from '../init-plugin';\nimport MyProcessViewer from './Process/viewer/index.vue';\n\ndefineOptions({\n name: 'ApprovalForDetails',\n});\n\nconst getApiData = useGetApiData();\n\nconst props = defineProps<{\n /** 审批记录(至少要有 id;权威字段由组件内部再取一次) */\n record: Record<string, any>;\n}>();\n\nconst data = ref([]);\nconst approval_obj: any = reactive({});\nconst flowData = ref({});\nconst task_columns = [\n {\n title: '序号',\n dataIndex: 'index',\n width: 50,\n ellipsis: true,\n fixed: 'left',\n },\n {\n title: '审批步骤',\n dataIndex: 'name',\n minWidth: 150,\n ellipsis: true,\n resizable: true,\n },\n {\n title: '职位',\n dataIndex: 'approval_position__name',\n minWidth: 150,\n ellipsis: true,\n resizable: true,\n },\n {\n title: '审批人',\n dataIndex: 'assignee__realname',\n minWidth: 150,\n ellipsis: true,\n resizable: true,\n },\n {\n title: '操作',\n dataIndex: 'approval_result',\n minWidth: 150,\n ellipsis: true,\n resizable: true,\n },\n {\n title: '审批意见',\n dataIndex: 'comment',\n minWidth: 150,\n ellipsis: true,\n resizable: true,\n },\n {\n title: '时间',\n dataIndex: 'end_time',\n minWidth: 150,\n ellipsis: true,\n resizable: true,\n },\n];\nconst person_columns = [\n {\n title: '序号',\n dataIndex: 'index',\n width: 50,\n ellipsis: true,\n fixed: 'left',\n },\n {\n title: '审批步骤',\n dataIndex: 'name',\n width: 150,\n ellipsis: true,\n resizable: true,\n },\n {\n title: '职位',\n dataIndex: 'jue_se',\n width: 150,\n ellipsis: true,\n resizable: true,\n },\n {\n title: '步骤审批人',\n dataIndex: 'list',\n minWidth: 150,\n ellipsis: true,\n resizable: true,\n },\n];\nconst task_data = ref([]);\nconst isNotEmpty = value => {\n return value !== null && value !== undefined && value !== '';\n};\nconst getData = (list, loaddata, options) => {\n const displayList = [];\n // 递归处理 formtemplate 的子字段\n const processFormTemplate = (formTemplate, formData, formOptions) => {\n if (!formTemplate?.form?.dynamicFieldList) return [];\n return formTemplate.form.dynamicFieldList.flatMap(fieldGroup =>\n fieldGroup.children.map(child => {\n const childObj: any = {\n label: child.label,\n type: child.type,\n value: '',\n column: child?.column || 3,\n is_hide:\n formTemplate?.showType == 'table'\n ? child?.is_table_hide_column || false\n : child?.is_hide || false,\n };\n // 处理不同类型的字段\n if (child.type === 'formtemplate') {\n // 递归处理嵌套的 formtemplate\n if (formData?.[child.name]?.length > 0) {\n childObj.children = [];\n formData[child.name].forEach(item => {\n childObj.children.push(processFormTemplate(child, item, child.form.options));\n });\n }\n } else if (child.type === 'select' || child.type === 'radio') {\n if (isNotEmpty(formData?.[child.name])) {\n const option = formOptions?.[child.name]?.find(\n item => item.value == formData[child.name],\n );\n childObj.value = option?.name || '';\n }\n } else if (child.type === 'checkbox') {\n if (isNotEmpty(formData?.[child.name])) {\n const names = formOptions?.[child.name]\n ?.filter(item => formData[child.name].includes(item.value))\n ?.map(item => item.name)\n ?.filter(Boolean);\n childObj.value = names?.join(',') || '';\n }\n } else if (child.type === 'remoteselectpro') {\n if (isNotEmpty(formData?.[child.name + '.label'])) {\n childObj.value = formData[child.name + '.label'];\n }\n } else if (child.type === 'remotetablepro') {\n childObj.children = [];\n if (formData?.[child.name]?.length > 0) {\n formData[child.name].forEach(tableData => {\n const remotetableproList = [];\n if (child?.children?.length > 0) {\n child.children.forEach(child1 => {\n if (child1?.children?.length > 0) {\n child1.children.forEach(child2 => {\n const remotetableproObj = {\n label: child2.label,\n type: child2.type,\n value: '',\n };\n if (\n child2.type === 'select' ||\n child2.type === 'radio' ||\n child2.type === 'checkbox' ||\n child2.type === 'remoteselectpro'\n ) {\n remotetableproObj.value = tableData?.[child2.name2] || '';\n } else {\n remotetableproObj.value = tableData?.[child2.name] || '';\n }\n remotetableproList.push(remotetableproObj);\n });\n }\n });\n }\n childObj.children.push(remotetableproList);\n });\n }\n } else {\n childObj.value = formData?.[child.name] || '';\n }\n return childObj;\n }),\n );\n };\n\n list.forEach(item => {\n if (item?.children?.length > 0) {\n const obj = {\n group_name: item?.group_name || '',\n children: [],\n column: item?.column || 3,\n };\n\n item.children.forEach(child => {\n const childObj: any = {\n label: child.label,\n type: child.type,\n column: child?.column || 3,\n value: '',\n };\n\n // 处理不同类型的字段\n if (child.type === 'remoteselectpro') {\n if (isNotEmpty(loaddata?.[child.name + '.label'])) {\n childObj.value = loaddata?.[child.name + '.label'];\n }\n } else if (child.type === 'select' || child.type === 'radio') {\n if (isNotEmpty(loaddata?.[child.name])) {\n const option = options?.[child.name]?.find(item => item.value == loaddata[child.name]);\n childObj.value = option?.name || '';\n }\n } else if (child.type === 'checkbox') {\n if (isNotEmpty(loaddata?.[child.name])) {\n const names = options?.[child.name]\n ?.filter(item => loaddata[child.name].includes(item.value))\n ?.map(item => item.name)\n ?.filter(Boolean);\n childObj.value = names?.join(',') || '';\n }\n } else if (child.type === 'remotetablepro') {\n childObj.children = [];\n if (loaddata?.[child.name]?.length > 0) {\n loaddata[child.name].forEach(tableData => {\n const remotetableproList = [];\n if (child?.children?.length > 0) {\n child.children.forEach(child1 => {\n if (child1?.children?.length > 0) {\n child1.children.forEach(child2 => {\n const remotetableproObj = {\n label: child2.label,\n type: child2.type,\n value: '',\n };\n if (\n child2.type === 'select' ||\n child2.type === 'radio' ||\n child2.type === 'checkbox' ||\n child2.type === 'remoteselectpro'\n ) {\n remotetableproObj.value = tableData?.[child2.name2] || '';\n } else {\n remotetableproObj.value = tableData?.[child2.name] || '';\n }\n remotetableproList.push(remotetableproObj);\n });\n }\n });\n }\n childObj.children.push(remotetableproList);\n });\n }\n } else if (child.type === 'formtemplate') {\n // 处理 formtemplate 类型\n if (loaddata?.[child.name]?.length > 0) {\n childObj.children = [];\n loaddata[child.name].forEach(item => {\n childObj.children.push(processFormTemplate(child, item, child.form.options));\n });\n }\n } else {\n childObj.value = loaddata?.[child.name] || '';\n }\n obj.children.push(childObj);\n });\n displayList.push(obj);\n }\n });\n return displayList;\n};\nconst parseBpmnUserTask = (xmlStr: any) => {\n // 1. 创建DOMParser解析XML\n const parser = new DOMParser();\n const xmlDoc = parser.parseFromString(xmlStr, 'text/xml');\n\n // 2. 获取所有userTask标签(处理命名空间)\n const userTasks = xmlDoc.getElementsByTagName('userTask');\n const result = [];\n\n // 3. 遍历每个userTask\n for (const task of userTasks) {\n // 提取name\n const name = task.getAttribute('name') || '';\n // 提取审批类型 userType\n const userType = task.getAttribute('flowable:userType') || '';\n // 根据类型提取对应的值\n let value = '';\n if (userType === 'candidateGroups') {\n value = task.getAttribute('flowable:candidateGroups') || '';\n }\n if (userType === 'assignee') {\n value = task.getAttribute('flowable:assignee') || '';\n }\n if (userType === 'candidateUsers') {\n value = task.getAttribute('flowable:candidateUsers') || '';\n }\n // 组装结果\n result.push({\n name: name,\n type: userType,\n value: value,\n });\n }\n return result;\n};\nconst person_approve = ref([]);\n/**\n * 拉取 / 刷新审批详情。\n *\n * 被两处调用:挂载时,以及「修改保存 / 作废成功」后的 onChange。\n * 所以有两件事必须做:\n * 1. 累积型数组(task_data / person_approve)每次**先清空**,否则重复追加;\n * 2. 用请求序号丢弃过期响应 —— 用户连点刷新时旧请求可能后到,把新数据覆盖掉。\n */\nlet load_seq = 0;\nconst loadDetail = async () => {\n const seq = ++load_seq;\n const approve_record_id = props.record?.id;\n if (!approve_record_id) {\n return;\n }\n task_data.value = [];\n person_approve.value = [];\n data.value = [];\n const res: any = await getApiData(\n { approve_record_id },\n '/approve/get_approve_record_info',\n );\n if (seq !== load_seq) {\n return;\n }\n data.value = getData(\n res.form_definition__data.dynamicFieldList,\n res.form_data,\n res.form_definition__data.options,\n );\n flowData.value = { xmlData: res.xml_data, nodeData: res.node_data };\n const person_list: any = await getApiData(\n {\n is_active: true,\n },\n '/sys/query_person_detail_list',\n );\n const approval_position_list: any = await getApiData(\n {\n is_active: true,\n column_fields: ['approvers_m2m_json', 'name'],\n },\n '/lyapprove/query_approval_position_list',\n );\n person_approve.value = parseBpmnUserTask(res.xml_data);\n person_approve.value = person_approve.value.map((item: any, index: number) => {\n return {\n ...item,\n id: index,\n value: item.value ? item.value.split(',').filter(Boolean).map(Number) : null,\n };\n });\n person_approve.value.forEach((item: any) => {\n if (item.value && item.value.length > 0) {\n item.list = [];\n if (item.type == 'assignee' || item.type == 'candidateUsers') {\n item.value.forEach((item2: any) => {\n person_list.data.forEach((item3: any) => {\n if (item2 == item3.id) {\n item.list.push({\n realname: item3.realname,\n });\n }\n });\n });\n }\n if (item.type == 'candidateGroups') {\n item.value.forEach((item2: any) => {\n approval_position_list.data.forEach((item3: any) => {\n if (item2 == item3.id) {\n item.jue_se = item3.name;\n item.list = item3.approvers_m2m_json;\n }\n });\n });\n }\n }\n });\n Object.assign(approval_obj, res);\n if (res.process_instance_id) {\n task_data.value.push({\n name: '开始',\n id: 0,\n approval_position__name: approval_obj?.form_data?.globalData?.person_position?.name\n ? approval_obj.form_data.globalData.person_position.name\n : '',\n assignee__realname: res.send_person__realname,\n approval_result: '发起',\n comment: '',\n end_time: res.start_time,\n });\n getApiData(\n {\n process_instance_id: res.process_instance_id,\n },\n '/lyapprove/query_task_list',\n ).then((task: any) => {\n if (task && task.data && task.data.length > 0) {\n task.data\n .sort((a: any, b: any) => {\n return a.id - b.id;\n })\n .forEach((item: any) => {\n if (item.status == '完成') {\n task_data.value.push({\n ...item,\n approval_result:\n item.approval_result === 'agree'\n ? '通过'\n : item.approval_result === 'refuse'\n ? '拒绝'\n : '',\n });\n }\n });\n }\n task_data.value = [].concat(task_data.value);\n });\n }\n};\nonMounted(() => {\n loadDetail();\n});\n// 记录 id 变化时重拉(Cell_click_approve 的 cmpObj.record 可能被表格替换)\nwatch(\n () => props.record?.id,\n () => {\n loadDetail();\n },\n);\ndefineExpose({\n /** 供外层在操作完成后刷新详情 */\n reload: loadDetail,\n});\nconst uniqueByTitle = (arr: any) => {\n const seen = new Set();\n return arr.filter(item => !seen.has(item.title) && seen.add(item.title));\n};\nconst getColumns = (list: any) => {\n const columns = [];\n if (list && list.length > 0) {\n list[0].forEach((item: any, index: any) => {\n if (item.type === 'upload') {\n columns.push({\n title: item.label,\n dataIndex: 'upload_' + index,\n minWidth: 150,\n resizable: true,\n autoHeight: true,\n });\n } else {\n columns.push({\n title: item.label,\n dataIndex: 'value_' + index,\n resizable: true,\n autoHeight: true,\n });\n }\n });\n }\n return uniqueByTitle(columns);\n};\nconst getDataSource = (list: any) => {\n const data = [];\n if (list && list.length > 0) {\n list.forEach((item: any, index1: any) => {\n const obj: any = {};\n item.forEach((item1: any, index: any) => {\n if (item1.type === 'upload') {\n obj['upload_' + index] = item1.value;\n } else {\n obj['value_' + index] = item1.value;\n }\n });\n data.push({ ...obj, index: index1 });\n });\n }\n return data;\n};\nconst getDate = time => {\n if (time) {\n time = time.substring(0, 10);\n }\n return time;\n};\nconst getModifyStatusColor = (status: string) => {\n const colorMap: Record<string, string> = {\n 正常: 'green',\n 已修改: 'orange',\n 已删除: 'red',\n };\n return colorMap[status] || 'default';\n};\nconst look = (url: any) => {\n window.open(encodeURI(url), '_blank');\n};\n</script>\n<style lang=\"scss\" scoped>\n.flip-90 {\n transform: rotateY(90deg); /* 绕Y轴旋转90度,元素会垂直倒立 */\n}\n\n.form-container {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n height: 100%;\n padding: 4px;\n\n .form-header {\n display: flex;\n flex: 0 0 auto;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n padding: 4px;\n margin-right: 26px;\n\n .form-title {\n font-size: 15px;\n }\n\n .form-header-right {\n display: flex;\n flex-direction: column;\n }\n\n .right-item {\n padding: 4px;\n // border-left: 1px solid;\n // border-top: 1px solid;\n }\n\n .right-item:first {\n border-top: none;\n }\n }\n\n .form-body {\n flex: 1 1 auto;\n overflow: auto;\n overflow-x: hidden;\n padding: 4px;\n }\n\n .form-footer {\n flex: 0 0 auto;\n padding: 8px;\n border-top: 1px solid #e8e8e8;\n display: flex;\n justify-content: flex-end;\n }\n}\n\n.header-container {\n width: 100%;\n position: relative;\n min-height: 70px; /* 增加最小高度保证布局稳定性 */\n padding: 1px 0; /* 增加上下内边距 */\n}\n\n.serial-number {\n position: absolute;\n left: 0;\n top: 19px;\n transform: translateY(-50%); /* 垂直居中 */\n}\n\n.modify-status {\n position: absolute;\n right: 0;\n top: 19px;\n transform: translateY(-50%); /* 垂直居中 */\n z-index: 1;\n}\n\n.article-title {\n width: 100%;\n padding: 0 200px; /* 左右保留40px距离 */\n box-sizing: border-box; /* 盒模型计算包含内边距 */\n text-align: center; /* 文本整体居中 */\n font-weight: bold;\n font-size: 24px;\n word-wrap: break-word; /* 允许长单词换行 */\n line-height: 1.5; /* 增加行高提高可读性 */\n}\n\n.xinxi-title {\n width: 100%;\n background-color: #dcdcdc;\n padding: 10px 0 10px 20px;\n font-weight: bold;\n border-radius: 3px;\n color: #313131;\n margin: 8px 0 2px 0;\n}\n\n.descriptions {\n :deep(.ant-descriptions .ant-descriptions-row > td) {\n padding: 8px;\n }\n\n :deep(.ant-descriptions .ant-descriptions-row > th) {\n padding: 8px;\n width: 100px;\n }\n}\n</style>\n","<template>\n <div class=\"form-container\">\n <!--\n 本组件只负责**展示**审批详情(头部 / 基本信息 / 表单渲染 / 流程图 / 审批记录表)。\n 修改 / 删除 / 打印按钮不在这里 —— 由外壳自己渲染(位置随外壳挑),\n 是否显示与点击行为统一走 useApprovalRecordActions(参照 Cell_click_approve 的抽屉 #extra、\n Cell_click_data_source 的 tabs #rightExtra)。\n -->\n <div class=\"header-container\">\n <div class=\"serial-number\">流程编码:{{ record?.number }}</div>\n <div class=\"article-title\">{{ approval_obj?.context }}({{ approval_obj?.flow_name }})</div>\n <div\n v-if=\"approval_obj?.modify_status\"\n class=\"modify-status\"\n >\n <a-tag :color=\"getModifyStatusColor(approval_obj.modify_status)\">\n {{ approval_obj.modify_status }}\n </a-tag>\n </div>\n </div>\n <div\n class=\"form-body descriptions\"\n style=\"padding-bottom: 10px\"\n >\n <div\n class=\"xinxi-title\"\n style=\"margin-top: 0\"\n >\n 基本信息\n </div>\n <a-descriptions bordered>\n <a-descriptions-item label=\"发起人\">\n {{ approval_obj?.send_person__realname }}\n </a-descriptions-item>\n <a-descriptions-item label=\"切换组织\">\n {{ approval_obj?.form_data?.globalData?.cost_company?.name }}\n </a-descriptions-item>\n <a-descriptions-item label=\"切换部门\">\n {{ approval_obj?.form_data?.globalData?.cost_department?.name }}\n </a-descriptions-item>\n <a-descriptions-item label=\"员工职位\">\n {{ approval_obj?.form_data?.globalData?.person_position?.name }}\n </a-descriptions-item>\n <a-descriptions-item label=\"员工组织\">\n {{ approval_obj?.form_data?.globalData?.person_cost_company?.name }}\n </a-descriptions-item>\n <a-descriptions-item label=\"员工部门\">\n {{ approval_obj?.form_data?.globalData?.person_department?.name }}\n </a-descriptions-item>\n <a-descriptions-item label=\"发起时间\">\n {{ getDate(approval_obj?.start_time) }}\n </a-descriptions-item>\n <a-descriptions-item\n :span=\"2\"\n label=\"结束时间\"\n >\n {{ getDate(approval_obj?.finish_time) }}\n </a-descriptions-item>\n <a-descriptions-item label=\"流程主题\">{{ approval_obj?.context }}</a-descriptions-item>\n <a-descriptions-item\n v-if=\"approval_obj?.modify_source__number\"\n label=\"修改来源流水号\"\n >\n {{ approval_obj?.modify_source__number }}\n </a-descriptions-item>\n </a-descriptions>\n <template\n v-for=\"(item, i) in data\"\n :key=\"i\"\n >\n <div class=\"xinxi-title\">\n {{ item?.group_name ? item.group_name : '审批信息' + (i + 1) }}\n </div>\n <a-descriptions\n bordered\n :column=\"item?.column ? item?.column : 3\"\n >\n <template\n v-for=\"(obj, j) in item.children\"\n :key=\"j\"\n >\n <template v-if=\"obj.type !== 'remotetablepro' && obj.type !== 'formtemplate'\">\n <template v-if=\"obj.type === 'textarea'\">\n <a-descriptions-item :label=\"obj.label\">\n <p style=\"white-space: pre-line; margin: 0; color: #909399\">{{ obj.value }}</p>\n </a-descriptions-item>\n </template>\n <template v-else-if=\"obj.type === 'upload'\">\n <a-descriptions-item :label=\"obj.label\">\n <template v-if=\"obj.value && obj.value?.length > 0\">\n <template\n v-for=\"(uploadItem, m) in obj.value\"\n :key=\"m\"\n >\n <br v-if=\"m > 0\" />\n <a-button\n type=\"link\"\n @click=\"look(uploadItem.url)\"\n >\n {{ uploadItem.name }}\n </a-button>\n </template>\n </template>\n </a-descriptions-item>\n </template>\n <template v-else>\n <a-descriptions-item\n :label=\"obj.label\"\n :span=\"1\"\n >\n {{ obj.value }}\n </a-descriptions-item>\n </template>\n </template>\n </template>\n </a-descriptions>\n <a-descriptions\n bordered\n :column=\"item?.column ? item?.column : 3\"\n >\n <template\n v-for=\"(obj, j) in item.children\"\n :key=\"j\"\n >\n <template v-if=\"obj.type === 'remotetablepro'\">\n <a-descriptions-item\n :label=\"obj.label\"\n :span=\"3\"\n >\n <s-table\n :columns=\"getColumns(obj.children)\"\n :data-source=\"getDataSource(obj.children)\"\n :pagination=\"false\"\n :rangeSelection=\"false\"\n :row-key=\"'index'\"\n bordered\n size=\"small\"\n stripe\n >\n <template #bodyCell=\"{ record, column, text, index }\">\n <template v-if=\"column.dataIndex.includes('upload')\">\n <template v-if=\"text && text?.length > 0\">\n <template\n v-for=\"(uploadItem, m) in text\"\n :key=\"m\"\n >\n <br v-if=\"m > 0\" />\n <a-button\n :title=\"uploadItem.name\"\n style=\"padding-left: 1px; width: 100%\"\n type=\"link\"\n @click=\"look(uploadItem.url)\"\n >\n <span\n style=\"\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 100%;\n user-select: text;\n text-align: left;\n \"\n >\n {{ uploadItem.name }}\n </span>\n </a-button>\n </template>\n </template>\n </template>\n <template v-else>{{ text }}</template>\n </template>\n </s-table>\n </a-descriptions-item>\n </template>\n <template v-if=\"obj.type === 'formtemplate'\">\n <a-descriptions-item\n :label=\"obj.label\"\n :span=\"3\"\n >\n <template\n v-for=\"(obj1, k) in obj.children\"\n :key=\"k\"\n >\n <a-descriptions\n bordered\n :column=\"obj?.column ? obj?.column : 3\"\n >\n <template\n v-for=\"(obj2, l) in obj1\"\n :key=\"l\"\n >\n <template\n v-if=\"obj2.type !== 'remotetablepro' && obj2.type !== 'formtemplate'\"\n >\n <template v-if=\"obj2.type === 'textarea' && !obj2.is_hide\">\n <a-descriptions-item :label=\"obj2.label\">\n <p style=\"white-space: pre-line; margin: 0; color: #909399\">\n {{ obj2.value }}\n </p>\n </a-descriptions-item>\n </template>\n <template v-else-if=\"obj2.type === 'upload' && !obj2.is_hide\">\n <a-descriptions-item :label=\"obj2.label\">\n <template v-if=\"obj2.value && obj2.value?.length > 0\">\n <template\n v-for=\"(uploadItem, m) in obj2.value\"\n :key=\"m\"\n >\n <br v-if=\"m > 0\" />\n <a-button\n type=\"link\"\n @click=\"look(uploadItem.url)\"\n >\n {{ uploadItem.name }}\n </a-button>\n </template>\n </template>\n </a-descriptions-item>\n </template>\n <template v-else>\n <a-descriptions-item\n v-if=\"!obj2.is_hide\"\n :label=\"obj2.label\"\n >\n {{ obj2.value }}\n </a-descriptions-item>\n </template>\n </template>\n </template>\n </a-descriptions>\n <a-descriptions\n bordered\n :column=\"obj?.column ? obj?.column : 3\"\n >\n <template\n v-for=\"(obj2, l) in obj1\"\n :key=\"l\"\n >\n <template v-if=\"obj2.type === 'remotetablepro' && !obj2.is_hide\">\n <a-descriptions-item\n :label=\"obj2.label\"\n :span=\"3\"\n >\n <s-table\n :columns=\"getColumns(obj2.children)\"\n :data-source=\"getDataSource(obj2.children)\"\n :pagination=\"false\"\n :rangeSelection=\"false\"\n :row-key=\"'index'\"\n bordered\n size=\"small\"\n stripe\n >\n <template #bodyCell=\"{ record, column, text, index }\">\n <template v-if=\"column.dataIndex.includes('upload')\">\n <template v-if=\"text && text?.length > 0\">\n <template\n v-for=\"(uploadItem, m) in text\"\n :key=\"m\"\n >\n <br v-if=\"m > 0\" />\n <a-button\n :title=\"uploadItem.name\"\n style=\"padding-left: 1px; width: 100%\"\n type=\"link\"\n @click=\"look(uploadItem.url)\"\n >\n <span\n style=\"\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 100%;\n user-select: text;\n text-align: left;\n \"\n >\n {{ uploadItem.name }}\n </span>\n </a-button>\n </template>\n </template>\n </template>\n <template v-else>{{ text }}</template>\n </template>\n </s-table>\n </a-descriptions-item>\n </template>\n <template v-if=\"obj2.type === 'formtemplate' && !obj2.is_hide\">\n <a-descriptions-item\n :label=\"obj2.label\"\n :span=\"3\"\n >\n <template\n v-for=\"(obj3, k) in obj2.children\"\n :key=\"k\"\n >\n <a-descriptions\n bordered\n :column=\"obj2?.column ? obj2?.column : 3\"\n >\n <template\n v-for=\"(obj4, l) in obj3\"\n :key=\"l\"\n >\n <template\n v-if=\"\n obj4.type !== 'remotetablepro' && obj4.type !== 'formtemplate'\n \"\n >\n <template v-if=\"obj4.type === 'textarea' && !obj4.is_hide\">\n <a-descriptions-item :label=\"obj4.label\">\n <p style=\"white-space: pre-line; margin: 0; color: #909399\">\n {{ obj4.value }}\n </p>\n </a-descriptions-item>\n </template>\n <template v-else-if=\"obj4.type === 'upload' && !obj4.is_hide\">\n <a-descriptions-item :label=\"obj4.label\">\n <template v-if=\"obj4.value && obj4.value?.length > 0\">\n <template\n v-for=\"(uploadItem, m) in obj4.value\"\n :key=\"m\"\n >\n <br v-if=\"m > 0\" />\n <a-button\n type=\"link\"\n @click=\"look(uploadItem.url)\"\n >\n {{ uploadItem.name }}\n </a-button>\n </template>\n </template>\n </a-descriptions-item>\n </template>\n <template v-else>\n <a-descriptions-item\n v-if=\"!obj4.is_hide\"\n :label=\"obj4.label\"\n >\n {{ obj4.value }}\n </a-descriptions-item>\n </template>\n </template>\n </template>\n </a-descriptions>\n <a-descriptions\n bordered\n :column=\"obj2?.column ? obj2?.column : 3\"\n >\n <template\n v-for=\"(obj4, l) in obj3\"\n :key=\"l\"\n >\n <template v-if=\"obj4.type === 'remotetablepro'\">\n <a-descriptions-item\n :label=\"obj4.label\"\n :span=\"3\"\n >\n <s-table\n :columns=\"getColumns(obj4.children)\"\n :data-source=\"getDataSource(obj4.children)\"\n :pagination=\"false\"\n :rangeSelection=\"false\"\n :row-key=\"'index'\"\n bordered\n size=\"small\"\n stripe\n >\n <template #bodyCell=\"{ record, column, text, index }\">\n <template v-if=\"column.dataIndex.includes('upload')\">\n <template v-if=\"text && text?.length > 0\">\n <template\n v-for=\"(uploadItem, m) in text\"\n :key=\"m\"\n >\n <br v-if=\"m > 0\" />\n <a-button\n :title=\"uploadItem.name\"\n style=\"padding-left: 1px; width: 100%\"\n type=\"link\"\n @click=\"look(uploadItem.url)\"\n >\n <span\n style=\"\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 100%;\n user-select: text;\n text-align: left;\n \"\n >\n {{ uploadItem.name }}\n </span>\n </a-button>\n </template>\n </template>\n </template>\n <template v-else>{{ text }}</template>\n </template>\n </s-table>\n </a-descriptions-item>\n </template>\n <template v-if=\"obj4.type === 'formtemplate'\">\n <a-descriptions-item\n :label=\"obj4.label\"\n :span=\"3\"\n >\n <template\n v-for=\"(obj5, k) in obj4.children\"\n :key=\"k\"\n >\n <a-descriptions\n bordered\n :column=\"obj4?.column ? obj4?.column : 3\"\n >\n <template\n v-for=\"(obj6, l) in obj5\"\n :key=\"l\"\n >\n <template\n v-if=\"\n obj6.type !== 'remotetablepro' &&\n obj6.type !== 'formtemplate'\n \"\n >\n <template\n v-if=\"obj6.type === 'textarea' && !obj6.is_hide\"\n >\n <a-descriptions-item :label=\"obj6.label\">\n <p\n style=\"\n white-space: pre-line;\n margin: 0;\n color: #909399;\n \"\n >\n {{ obj6.value }}\n </p>\n </a-descriptions-item>\n </template>\n <template\n v-else-if=\"obj6.type === 'upload' && !obj6.is_hide\"\n >\n <a-descriptions-item :label=\"obj6.label\">\n <template\n v-if=\"obj6.value && obj6.value?.length > 0\"\n >\n <template\n v-for=\"(uploadItem, m) in obj6.value\"\n :key=\"m\"\n >\n <br v-if=\"m > 0\" />\n <a-button\n type=\"link\"\n @click=\"look(uploadItem.url)\"\n >\n {{ uploadItem.name }}\n </a-button>\n </template>\n </template>\n </a-descriptions-item>\n </template>\n <template v-else>\n <a-descriptions-item\n v-if=\"!obj6.is_hide\"\n :label=\"obj6.label\"\n >\n {{ obj6.value }}\n </a-descriptions-item>\n </template>\n </template>\n </template>\n </a-descriptions>\n <a-descriptions\n bordered\n :column=\"obj4?.column ? obj4?.column : 3\"\n >\n <template\n v-for=\"(obj6, l) in obj5\"\n :key=\"l\"\n >\n <template v-if=\"obj6.type === 'remotetablepro'\">\n <a-descriptions-item\n :label=\"obj6.label\"\n :span=\"3\"\n >\n <s-table\n :columns=\"getColumns(obj6.children)\"\n :data-source=\"getDataSource(obj6.children)\"\n :pagination=\"false\"\n :rangeSelection=\"false\"\n :row-key=\"'index'\"\n bordered\n size=\"small\"\n stripe\n >\n <template\n #bodyCell=\"{ record, column, text, index }\"\n >\n <template\n v-if=\"column.dataIndex.includes('upload')\"\n >\n <template v-if=\"text && text?.length > 0\">\n <template\n v-for=\"(uploadItem, m) in text\"\n :key=\"m\"\n >\n <br v-if=\"m > 0\" />\n <a-button\n :title=\"uploadItem.name\"\n style=\"padding-left: 1px; width: 100%\"\n type=\"link\"\n @click=\"look(uploadItem.url)\"\n >\n <span\n style=\"\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 100%;\n user-select: text;\n text-align: left;\n \"\n >\n {{ uploadItem.name }}\n </span>\n </a-button>\n </template>\n </template>\n </template>\n <template v-else>{{ text }}</template>\n </template>\n </s-table>\n </a-descriptions-item>\n </template>\n </template>\n </a-descriptions>\n </template>\n </a-descriptions-item>\n </template>\n </template>\n </a-descriptions>\n </template>\n </a-descriptions-item>\n </template>\n </template>\n </a-descriptions>\n </template>\n </a-descriptions-item>\n </template>\n </template>\n </a-descriptions>\n </template>\n <template v-if=\"task_data.length > 0\">\n <div class=\"xinxi-title\">审批记录</div>\n <s-table\n :columns=\"task_columns\"\n :data-source=\"task_data\"\n :pagination=\"false\"\n :rangeSelection=\"false\"\n :scroll=\"{ y: 400 }\"\n :rowKey=\"'id'\"\n bordered\n size=\"small\"\n stripe\n >\n <template #bodyCell=\"{ column, index, text, record }\">\n <template v-if=\"column.dataIndex == 'index'\">\n {{ index + 1 }}\n </template>\n <template v-else>\n {{ text }}\n </template>\n </template>\n </s-table>\n </template>\n <template v-if=\"person_approve.length > 0\">\n <div class=\"xinxi-title\">步骤审批人信息</div>\n <s-table\n :columns=\"person_columns\"\n :data-source=\"person_approve\"\n :pagination=\"false\"\n :rangeSelection=\"false\"\n :scroll=\"{ y: 400 }\"\n :rowKey=\"'id'\"\n bordered\n size=\"small\"\n stripe\n >\n <template #bodyCell=\"{ column, index, text, record }\">\n <template v-if=\"column.dataIndex == 'index'\">\n {{ index + 1 }}\n </template>\n <template v-else-if=\"column.dataIndex == 'jue_se'\">\n <a-tag\n v-if=\"record?.jue_se\"\n color=\"blue\"\n >\n {{ record?.jue_se || '' }}\n </a-tag>\n </template>\n <template v-else-if=\"column.dataIndex == 'list'\">\n <a-tag\n v-for=\"(obj, index) in record.list\"\n :key=\"index\"\n color=\"green\"\n >\n {{ obj.realname }}\n </a-tag>\n </template>\n <template v-else>\n {{ text }}\n </template>\n </template>\n </s-table>\n </template>\n <div style=\"height: 400px; margin-top: 10px\">\n <my-process-viewer\n :flowData=\"flowData\"\n :height=\"400\"\n />\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { onMounted, reactive, ref, watch } from 'vue';\nimport { useGetApiData } from '../init-plugin';\nimport MyProcessViewer from './Process/viewer/index.vue';\n\ndefineOptions({\n name: 'ApprovalForDetails',\n});\n\nconst getApiData = useGetApiData();\n\nconst props = defineProps<{\n /** 审批记录(至少要有 id;权威字段由组件内部再取一次) */\n record: Record<string, any>;\n}>();\n\nconst data = ref([]);\nconst approval_obj: any = reactive({});\nconst flowData = ref({});\nconst task_columns = [\n {\n title: '序号',\n dataIndex: 'index',\n width: 50,\n ellipsis: true,\n fixed: 'left',\n },\n {\n title: '审批步骤',\n dataIndex: 'name',\n minWidth: 150,\n ellipsis: true,\n resizable: true,\n },\n {\n title: '职位',\n dataIndex: 'approval_position__name',\n minWidth: 150,\n ellipsis: true,\n resizable: true,\n },\n {\n title: '审批人',\n dataIndex: 'assignee__realname',\n minWidth: 150,\n ellipsis: true,\n resizable: true,\n },\n {\n title: '操作',\n dataIndex: 'approval_result',\n minWidth: 150,\n ellipsis: true,\n resizable: true,\n },\n {\n title: '审批意见',\n dataIndex: 'comment',\n minWidth: 150,\n ellipsis: true,\n resizable: true,\n },\n {\n title: '时间',\n dataIndex: 'end_time',\n minWidth: 150,\n ellipsis: true,\n resizable: true,\n },\n];\nconst person_columns = [\n {\n title: '序号',\n dataIndex: 'index',\n width: 50,\n ellipsis: true,\n fixed: 'left',\n },\n {\n title: '审批步骤',\n dataIndex: 'name',\n width: 150,\n ellipsis: true,\n resizable: true,\n },\n {\n title: '职位',\n dataIndex: 'jue_se',\n width: 150,\n ellipsis: true,\n resizable: true,\n },\n {\n title: '步骤审批人',\n dataIndex: 'list',\n minWidth: 150,\n ellipsis: true,\n resizable: true,\n },\n];\nconst task_data = ref([]);\nconst isNotEmpty = value => {\n return value !== null && value !== undefined && value !== '';\n};\nconst getData = (list, loaddata, options) => {\n const displayList = [];\n // 递归处理 formtemplate 的子字段\n const processFormTemplate = (formTemplate, formData, formOptions) => {\n if (!formTemplate?.form?.dynamicFieldList) return [];\n return formTemplate.form.dynamicFieldList.flatMap(fieldGroup =>\n fieldGroup.children.map(child => {\n const childObj: any = {\n label: child.label,\n type: child.type,\n value: '',\n column: child?.column || 3,\n is_hide:\n formTemplate?.showType == 'table'\n ? child?.is_table_hide_column || false\n : child?.is_hide || false,\n };\n // 处理不同类型的字段\n if (child.type === 'formtemplate') {\n // 递归处理嵌套的 formtemplate\n if (formData?.[child.name]?.length > 0) {\n childObj.children = [];\n formData[child.name].forEach(item => {\n childObj.children.push(processFormTemplate(child, item, child.form.options));\n });\n }\n } else if (child.type === 'select' || child.type === 'radio') {\n if (isNotEmpty(formData?.[child.name])) {\n const option = formOptions?.[child.name]?.find(\n item => item.value == formData[child.name],\n );\n childObj.value = option?.name || '';\n }\n } else if (child.type === 'checkbox') {\n if (isNotEmpty(formData?.[child.name])) {\n const names = formOptions?.[child.name]\n ?.filter(item => formData[child.name].includes(item.value))\n ?.map(item => item.name)\n ?.filter(Boolean);\n childObj.value = names?.join(',') || '';\n }\n } else if (child.type === 'remoteselectpro') {\n if (isNotEmpty(formData?.[child.name + '.label'])) {\n childObj.value = formData[child.name + '.label'];\n }\n } else if (child.type === 'remotetablepro') {\n childObj.children = [];\n if (formData?.[child.name]?.length > 0) {\n formData[child.name].forEach(tableData => {\n const remotetableproList = [];\n if (child?.children?.length > 0) {\n child.children.forEach(child1 => {\n if (child1?.children?.length > 0) {\n child1.children.forEach(child2 => {\n const remotetableproObj = {\n label: child2.label,\n type: child2.type,\n value: '',\n };\n if (\n child2.type === 'select' ||\n child2.type === 'radio' ||\n child2.type === 'checkbox' ||\n child2.type === 'remoteselectpro'\n ) {\n remotetableproObj.value = tableData?.[child2.name2] || '';\n } else {\n remotetableproObj.value = tableData?.[child2.name] || '';\n }\n remotetableproList.push(remotetableproObj);\n });\n }\n });\n }\n childObj.children.push(remotetableproList);\n });\n }\n } else {\n childObj.value = formData?.[child.name] || '';\n }\n return childObj;\n }),\n );\n };\n\n list.forEach(item => {\n if (item?.children?.length > 0) {\n const obj = {\n group_name: item?.group_name || '',\n children: [],\n column: item?.column || 3,\n };\n\n item.children.forEach(child => {\n const childObj: any = {\n label: child.label,\n type: child.type,\n column: child?.column || 3,\n value: '',\n };\n\n // 处理不同类型的字段\n if (child.type === 'remoteselectpro') {\n if (isNotEmpty(loaddata?.[child.name + '.label'])) {\n childObj.value = loaddata?.[child.name + '.label'];\n }\n } else if (child.type === 'select' || child.type === 'radio') {\n if (isNotEmpty(loaddata?.[child.name])) {\n const option = options?.[child.name]?.find(item => item.value == loaddata[child.name]);\n childObj.value = option?.name || '';\n }\n } else if (child.type === 'checkbox') {\n if (isNotEmpty(loaddata?.[child.name])) {\n const names = options?.[child.name]\n ?.filter(item => loaddata[child.name].includes(item.value))\n ?.map(item => item.name)\n ?.filter(Boolean);\n childObj.value = names?.join(',') || '';\n }\n } else if (child.type === 'remotetablepro') {\n childObj.children = [];\n if (loaddata?.[child.name]?.length > 0) {\n loaddata[child.name].forEach(tableData => {\n const remotetableproList = [];\n if (child?.children?.length > 0) {\n child.children.forEach(child1 => {\n if (child1?.children?.length > 0) {\n child1.children.forEach(child2 => {\n const remotetableproObj = {\n label: child2.label,\n type: child2.type,\n value: '',\n };\n if (\n child2.type === 'select' ||\n child2.type === 'radio' ||\n child2.type === 'checkbox' ||\n child2.type === 'remoteselectpro'\n ) {\n remotetableproObj.value = tableData?.[child2.name2] || '';\n } else {\n remotetableproObj.value = tableData?.[child2.name] || '';\n }\n remotetableproList.push(remotetableproObj);\n });\n }\n });\n }\n childObj.children.push(remotetableproList);\n });\n }\n } else if (child.type === 'formtemplate') {\n // 处理 formtemplate 类型\n if (loaddata?.[child.name]?.length > 0) {\n childObj.children = [];\n loaddata[child.name].forEach(item => {\n childObj.children.push(processFormTemplate(child, item, child.form.options));\n });\n }\n } else {\n childObj.value = loaddata?.[child.name] || '';\n }\n obj.children.push(childObj);\n });\n displayList.push(obj);\n }\n });\n return displayList;\n};\nconst parseBpmnUserTask = (xmlStr: any) => {\n // 1. 创建DOMParser解析XML\n const parser = new DOMParser();\n const xmlDoc = parser.parseFromString(xmlStr, 'text/xml');\n\n // 2. 获取所有userTask标签(处理命名空间)\n const userTasks = xmlDoc.getElementsByTagName('userTask');\n const result = [];\n\n // 3. 遍历每个userTask\n for (const task of userTasks) {\n // 提取name\n const name = task.getAttribute('name') || '';\n // 提取审批类型 userType\n const userType = task.getAttribute('flowable:userType') || '';\n // 根据类型提取对应的值\n let value = '';\n if (userType === 'candidateGroups') {\n value = task.getAttribute('flowable:candidateGroups') || '';\n }\n if (userType === 'assignee') {\n value = task.getAttribute('flowable:assignee') || '';\n }\n if (userType === 'candidateUsers') {\n value = task.getAttribute('flowable:candidateUsers') || '';\n }\n // 组装结果\n result.push({\n name: name,\n type: userType,\n value: value,\n });\n }\n return result;\n};\nconst person_approve = ref([]);\n/**\n * 拉取 / 刷新审批详情。\n *\n * 被两处调用:挂载时,以及「修改保存 / 作废成功」后的 onChange。\n * 所以有两件事必须做:\n * 1. 累积型数组(task_data / person_approve)每次**先清空**,否则重复追加;\n * 2. 用请求序号丢弃过期响应 —— 用户连点刷新时旧请求可能后到,把新数据覆盖掉。\n */\nlet load_seq = 0;\nconst loadDetail = async () => {\n const seq = ++load_seq;\n const approve_record_id = props.record?.id;\n if (!approve_record_id) {\n return;\n }\n task_data.value = [];\n person_approve.value = [];\n data.value = [];\n const res: any = await getApiData(\n { approve_record_id },\n '/approve/get_approve_record_info',\n );\n if (seq !== load_seq) {\n return;\n }\n data.value = getData(\n res.form_definition__data.dynamicFieldList,\n res.form_data,\n res.form_definition__data.options,\n );\n flowData.value = { xmlData: res.xml_data, nodeData: res.node_data };\n const person_list: any = await getApiData(\n {\n is_active: true,\n },\n '/sys/query_person_detail_list',\n );\n const approval_position_list: any = await getApiData(\n {\n is_active: true,\n column_fields: ['approvers_m2m_json', 'name'],\n },\n '/lyapprove/query_approval_position_list',\n );\n person_approve.value = parseBpmnUserTask(res.xml_data);\n person_approve.value = person_approve.value.map((item: any, index: number) => {\n return {\n ...item,\n id: index,\n value: item.value ? item.value.split(',').filter(Boolean).map(Number) : null,\n };\n });\n person_approve.value.forEach((item: any) => {\n if (item.value && item.value.length > 0) {\n item.list = [];\n if (item.type == 'assignee' || item.type == 'candidateUsers') {\n item.value.forEach((item2: any) => {\n person_list.data.forEach((item3: any) => {\n if (item2 == item3.id) {\n item.list.push({\n realname: item3.realname,\n });\n }\n });\n });\n }\n if (item.type == 'candidateGroups') {\n item.value.forEach((item2: any) => {\n approval_position_list.data.forEach((item3: any) => {\n if (item2 == item3.id) {\n item.jue_se = item3.name;\n item.list = item3.approvers_m2m_json;\n }\n });\n });\n }\n }\n });\n Object.assign(approval_obj, res);\n if (res.process_instance_id) {\n task_data.value.push({\n name: '开始',\n id: 0,\n approval_position__name: approval_obj?.form_data?.globalData?.person_position?.name\n ? approval_obj.form_data.globalData.person_position.name\n : '',\n assignee__realname: res.send_person__realname,\n approval_result: '发起',\n comment: '',\n end_time: res.start_time,\n });\n getApiData(\n {\n process_instance_id: res.process_instance_id,\n },\n '/lyapprove/query_task_list',\n ).then((task: any) => {\n if (task && task.data && task.data.length > 0) {\n task.data\n .sort((a: any, b: any) => {\n return a.id - b.id;\n })\n .forEach((item: any) => {\n if (item.status == '完成') {\n task_data.value.push({\n ...item,\n approval_result:\n item.approval_result === 'agree'\n ? '通过'\n : item.approval_result === 'refuse'\n ? '拒绝'\n : '',\n });\n }\n });\n }\n task_data.value = [].concat(task_data.value);\n });\n }\n};\nonMounted(() => {\n loadDetail();\n});\n// 记录 id 变化时重拉(Cell_click_approve 的 cmpObj.record 可能被表格替换)\nwatch(\n () => props.record?.id,\n () => {\n loadDetail();\n },\n);\ndefineExpose({\n /** 供外层在操作完成后刷新详情 */\n reload: loadDetail,\n});\nconst uniqueByTitle = (arr: any) => {\n const seen = new Set();\n return arr.filter(item => !seen.has(item.title) && seen.add(item.title));\n};\nconst getColumns = (list: any) => {\n const columns = [];\n if (list && list.length > 0) {\n list[0].forEach((item: any, index: any) => {\n if (item.type === 'upload') {\n columns.push({\n title: item.label,\n dataIndex: 'upload_' + index,\n minWidth: 150,\n resizable: true,\n autoHeight: true,\n });\n } else {\n columns.push({\n title: item.label,\n dataIndex: 'value_' + index,\n resizable: true,\n autoHeight: true,\n });\n }\n });\n }\n return uniqueByTitle(columns);\n};\nconst getDataSource = (list: any) => {\n const data = [];\n if (list && list.length > 0) {\n list.forEach((item: any, index1: any) => {\n const obj: any = {};\n item.forEach((item1: any, index: any) => {\n if (item1.type === 'upload') {\n obj['upload_' + index] = item1.value;\n } else {\n obj['value_' + index] = item1.value;\n }\n });\n data.push({ ...obj, index: index1 });\n });\n }\n return data;\n};\nconst getDate = time => {\n if (time) {\n time = time.substring(0, 10);\n }\n return time;\n};\nconst getModifyStatusColor = (status: string) => {\n const colorMap: Record<string, string> = {\n 正常: 'green',\n 已修改: 'orange',\n 已删除: 'red',\n };\n return colorMap[status] || 'default';\n};\nconst look = (url: any) => {\n window.open(encodeURI(url), '_blank');\n};\n</script>\n<style lang=\"scss\" scoped>\n.flip-90 {\n transform: rotateY(90deg); /* 绕Y轴旋转90度,元素会垂直倒立 */\n}\n\n.form-container {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n height: 100%;\n padding: 4px;\n\n .form-header {\n display: flex;\n flex: 0 0 auto;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n padding: 4px;\n margin-right: 26px;\n\n .form-title {\n font-size: 15px;\n }\n\n .form-header-right {\n display: flex;\n flex-direction: column;\n }\n\n .right-item {\n padding: 4px;\n // border-left: 1px solid;\n // border-top: 1px solid;\n }\n\n .right-item:first {\n border-top: none;\n }\n }\n\n .form-body {\n flex: 1 1 auto;\n overflow: auto;\n overflow-x: hidden;\n padding: 4px;\n }\n\n .form-footer {\n flex: 0 0 auto;\n padding: 8px;\n border-top: 1px solid #e8e8e8;\n display: flex;\n justify-content: flex-end;\n }\n}\n\n.header-container {\n width: 100%;\n position: relative;\n min-height: 70px; /* 增加最小高度保证布局稳定性 */\n padding: 1px 0; /* 增加上下内边距 */\n}\n\n.serial-number {\n position: absolute;\n left: 0;\n top: 19px;\n transform: translateY(-50%); /* 垂直居中 */\n}\n\n.modify-status {\n position: absolute;\n right: 0;\n top: 19px;\n transform: translateY(-50%); /* 垂直居中 */\n z-index: 1;\n}\n\n.article-title {\n width: 100%;\n padding: 0 200px; /* 左右保留40px距离 */\n box-sizing: border-box; /* 盒模型计算包含内边距 */\n text-align: center; /* 文本整体居中 */\n font-weight: bold;\n font-size: 24px;\n word-wrap: break-word; /* 允许长单词换行 */\n line-height: 1.5; /* 增加行高提高可读性 */\n}\n\n.xinxi-title {\n width: 100%;\n background-color: #dcdcdc;\n padding: 10px 0 10px 20px;\n font-weight: bold;\n border-radius: 3px;\n color: #313131;\n margin: 8px 0 2px 0;\n}\n\n.descriptions {\n :deep(.ant-descriptions .ant-descriptions-row > td) {\n padding: 8px;\n }\n\n :deep(.ant-descriptions .ant-descriptions-row > th) {\n padding: 8px;\n width: 100px;\n }\n}\n</style>\n","import { computed, ref, watch } from 'vue';\nimport type { Ref } from 'vue';\nimport { message } from 'ant-design-vue';\nimport { executeScriptInWorker, getApiData } from '@/init-plugin';\nimport { Action } from './typing';\nimport { getApproveRecordActions } from './configs/approval/recordActions';\n// 只引类型(编译期擦除,不会把 vue-print-next 拖进静态闭包;运行时那 37.5KB 走动态 import)\nimport type { PrintAreaOption } from 'vue-print-next';\n\n/**\n * 审批记录在**详情场景**下的两个操作 + 打印。\n *\n * 为什么要有这个 composable:详情按钮的消费方有两个(`Cell_click_approve` 的抽屉 #extra、\n * `Cell_click_data_source` 的 tabs #rightExtra —— 按钮都渲染在外壳上,`approval_for_details`\n * 本体只负责展示),如果各自写一遍「能不能显示」和「点了做什么」,\n * 迟早和列表页行按钮的行为漂移。这里把两件事统一收口:\n *\n * 1. **是否可用的判断**(`canShow`)—— 复用 `default.ts` 里 `row_actions` 的\n * `showCode` / `disableCode`(经 `recordActions.ts` 抽出),与列表页 `actionsBar.vue`\n * 跑的是**同一份代码**、同一个 `executeScriptInWorker` 通道;\n * 2. **点击后的行为**(`runAction`)—— 跑 action 自身的 `code` 取数,再分发:\n * `edit_approve` → 打开全屏编辑模态框;`cancel_agree_approve` → 打开作废(删除)模态框;\n * `print` → 打印详情区域。\n *\n * ── 与列表页 `actionsBar` 的唯一差别(有意为之,别\"对齐\"掉)──\n * 列表页:`showCode` 控**显示**、`disableCode` 控**禁用置灰**(按钮还在,只是点不动)。\n * 详情页:两者合起来控**显示/隐藏** —— 不可用就直接不渲染按钮。这是产品要求\n * (详情页按钮少,摆一排灰色的反而更难用),所以 `canShow()` 返回 false 时外壳应当 `v-if` 掉。\n *\n * ── 为什么必须重新拉一遍记录 ──\n * 详情入口拿到的 `record` 往往是**列表行数据**或 `/approve/get_approve_record_info` 的结果,\n * 它们都**没有** `is_modifiable`(和 `menu_flag`)。少了 `is_modifiable`,\n * `approved && pass && is_modifiable === true` 这一支永远为假 —— 「已通过但可修改」的审批\n * 在详情页会**错误地看不到「修改」按钮**。所以这里统一走 lybase 公共 detail 接口\n * `/approve/get_approve_record`(= `get_basemodel`)取权威记录。\n */\n\n/** 详情页支持的操作键。`print` 不是页面配置里的 action,用同一个入口只是为了外壳写法统一 */\nexport type ApproveDetailActionKey = 'edit_approve' | 'cancel_agree_approve' | 'print';\n\n/** 详情页支持的操作键清单(按展示顺序) */\nexport const APPROVE_DETAIL_ACTION_KEYS: ApproveDetailActionKey[] = [\n 'edit_approve',\n 'cancel_agree_approve',\n 'print',\n];\n\nexport interface UseApproveRecordActionsOptions {\n /** 审批记录 id getter。允许异步到达(详情数据后到时会自动重新判定) */\n recordId: () => number | null | undefined;\n /** 菜单标识 getter。不传则用权威记录里的 `menu_flag` */\n modelType?: () => string | null | undefined;\n /** 覆盖默认 action 配置;不传则用库内 `configs/approval/recordActions.ts` 的那份 */\n actions?: () =>\n | Partial<Record<'edit_approve' | 'cancel_agree_approve', Action>>\n | null\n | undefined;\n /** 打印目标元素 getter。**不传则没有打印**(`canShow('print')` 恒为 false) */\n getPrintElement?: () => HTMLElement | null | undefined;\n /** 打印页眉标题 */\n printTitle?: string;\n /**\n * 打印参数覆盖(合并进 `new VuePrintNext({...})`)。\n * 例:外壳的打印区域若包含按钮所在元素,可用 `{ noPrintSelector: '<按钮容器类名>' }`\n * 把它们从打印内容里剔掉(按钮通常渲染在打印区域之外,多数场景不需要传)。\n */\n printOptions?: () => Partial<PrintAreaOption> | null | undefined;\n /** 保存 / 作废成功后的回调:外壳据此刷新详情与列表 */\n onChange?: () => void;\n}\n\n/** 详情场景下跑 action 代码时的 `context` 形状(与列表页对齐,但没有真实表格实例) */\nconst createDetailContext = () => ({\n tables: {\n // action 代码里常写 `tables['approve-approve_record']` 再解构(见 default.ts 的注释示例),\n // 这里给一份空壳,避免用户把那段示例取消注释后直接 TypeError。\n 'approve-approve_record': {\n searchConditions: [],\n selectedRowKeys: [],\n selectedRecord: [],\n datasource: [],\n },\n },\n formModel: null,\n isEdit: false,\n});\n\nexport const useApproveRecordActions = (options: UseApproveRecordActionsOptions) => {\n const record: Ref<Record<string, any> | null> = ref(null);\n const loading = ref(false);\n /** 权威记录就绪前不留按钮(否则会先闪一下「修改」再消失) */\n const ready = ref(false);\n const availability = ref<Record<ApproveDetailActionKey, boolean>>({\n edit_approve: false,\n cancel_agree_approve: false,\n print: false,\n });\n\n const editorOpen = ref(false);\n const editorRecordId: Ref<number | null> = ref(null);\n const removeOpen = ref(false);\n const removeRecordId: Ref<number | null> = ref(null);\n\n const actions = computed<Partial<Record<string, Action>>>(() => {\n const override = options.actions?.();\n return { ...getApproveRecordActions(), ...(override || {}) };\n });\n const modelType = computed(\n () => options.modelType?.() || record.value?.menu_flag || '',\n );\n\n /** 跑 action 代码(`code` / `showCode` / `disableCode`)的统一入口 */\n const runCode = (code: string, action: Action, target: Record<string, any>) =>\n executeScriptInWorker(code, {\n // table_id 与 default.ts 里 data_list 的表标识保持一致:详情页没有真实表格,\n // 但如果用户自定义了读取 `tables[table_id]` 的代码,至少能命中 createDetailContext 的空壳\n table_id: 'approve-approve_record',\n record: target,\n context: createDetailContext(),\n settings: action.settings || {},\n });\n\n /**\n * 判定单个 action 是否可用。\n * `showCode` 与 `disableCode` 都是「可选脚本」:没配(或 enable 为假)就不参与判定。\n * 任一脚本判定为「不可用」即整体不可用(详情页表现为隐藏)。\n */\n const judgeAvailable = async (action: Action | undefined): Promise<boolean> => {\n if (!action || !record.value) return false;\n try {\n if (action.showCode?.enable && action.showCode?.code) {\n const show = await runCode(action.showCode.code, action, record.value);\n if (!show) return false;\n }\n if (action.disableCode?.enable && action.disableCode?.code) {\n const disabled = await runCode(action.disableCode.code, action, record.value);\n if (disabled) return false;\n }\n return true;\n } catch (e) {\n // 判定脚本自己出错时按「不可用」处理并留日志:详情页不该因为一段自定义脚本异常就把\n // 用户挡在外面,但也不能默认放开(可能误删数据)\n console.error('[useApproveRecordActions] 可用性判定脚本执行失败,按不可用处理', e);\n return false;\n }\n };\n\n /** 拉权威记录 + 重新判定全部按钮的可用性 */\n const reload = async () => {\n const id = options.recordId();\n if (!id) {\n record.value = null;\n ready.value = false;\n availability.value = {\n edit_approve: false,\n cancel_agree_approve: false,\n print: false,\n };\n return;\n }\n loading.value = true;\n try {\n record.value = await getApiData({ approve_record_id: id }, '/approve/get_approve_record');\n ready.value = true;\n const [editAvailable, deleteAvailable] = await Promise.all([\n judgeAvailable(actions.value.edit_approve),\n judgeAvailable(actions.value.cancel_agree_approve),\n ]);\n availability.value = {\n edit_approve: editAvailable,\n cancel_agree_approve: deleteAvailable,\n // 打印只要「有目标元素 + 有记录」就可用,不依赖页面配置(页面配置里也没有打印 action)\n print: !!(options.getPrintElement && record.value),\n };\n } finally {\n // 记录加载失败时不把按钮留在「loading 中」的中间态\n if (!record.value) ready.value = false;\n loading.value = false;\n }\n };\n\n /** 打印:动态 import vue-print-next,避免把它(37.5KB)拖进静态闭包 */\n const print = async () => {\n const el = options.getPrintElement?.();\n if (!el) {\n message.error('未找到可打印的内容区域');\n return;\n }\n const { VuePrintNext } = await import('vue-print-next');\n new VuePrintNext({\n el,\n popTitle: options.printTitle || '审批信息',\n // @page margin 置 0 后浏览器不再渲染页眉(标题)/页脚(网址),用 body padding 补回边距。\n // 与改前 PSM_ApproveSystemPC/src/components/cellComponent/Cell_click_approve.vue 的打印参数一致。\n extraHead:\n '<style>@page { margin: 0mm; } body { padding: 10mm !important; box-sizing: border-box; }</style>',\n ...(options.printOptions?.() || {}),\n });\n };\n\n /**\n * 统一点击入口。外壳只需要 `@click=\"runAction('edit_approve')\"`,不用关心取数与分发。\n *\n * 这里会**再判一次**记录是否就绪:调用方一般已经用 `canShow` 把按钮 `v-if` 掉了,\n * 但兜底一次可以避免程序化调用绕过 UI 直接执行不可用的操作。\n */\n const runAction = async (key: ApproveDetailActionKey) => {\n if (key === 'print') {\n await print();\n return;\n }\n const action = actions.value[key];\n if (!action?.code) {\n message.error(`未配置 ${key} 的执行代码`);\n return;\n }\n if (!record.value) {\n message.error('未获取到审批记录');\n return;\n }\n let res: any;\n try {\n res = await runCode(action.code, action, record.value);\n } catch (e: any) {\n // action 代码里的业务校验都是 throw new Error('...'),原样透出给用户\n message.error(e?.message || '操作失败');\n return;\n }\n if (key === 'edit_approve') {\n const { id } = res || {};\n if (!id) {\n message.error('代码未返回id');\n return;\n }\n editorRecordId.value = id;\n editorOpen.value = true;\n } else if (key === 'cancel_agree_approve') {\n const ids = res?.ids;\n if (!ids?.length) {\n message.error('代码未返回ids');\n return;\n }\n if (ids.length !== 1) {\n message.error('每次仅能作废一个审批单');\n return;\n }\n removeRecordId.value = ids[0];\n removeOpen.value = true;\n }\n };\n\n /** 是否可用(= 详情页应当显示) */\n const canShow = (key: ApproveDetailActionKey): boolean => !!availability.value[key];\n\n /** 编辑模态框的绑定参数:外壳 `<ApprovalEditorModal v-model:open=\"editorOpen\" v-bind=\"editorProps\" />` */\n const editorProps = computed(() => ({\n modelType: modelType.value,\n approveRecordId: editorRecordId.value,\n onSaved: async () => {\n await reload();\n options.onChange?.();\n // ⛔ 保存成功后**不要**关模态框(2026-09-21 用户定案):保存(save_approve)只是\n // 「暂存为待提交」,用户还要在右侧继续操作「提交」;要关闭时点右上角的关闭按钮\n // (a-modal 自带 closable)。也不用担心编辑态残留 —— 外壳的 `v-if=\"open\"`\n // 让每次打开都重新挂载 core.vue,编辑态由记录字段重新派生。\n // 历史:曾经「修改保存成功后自动关闭」(用户是从详情页进来的)——已按上述定案移除。\n },\n }));\n\n /** 作废(删除)模态框的绑定参数 */\n const removeProps = computed(() => ({\n id: removeRecordId.value,\n onDone: async () => {\n await reload();\n options.onChange?.();\n },\n }));\n\n watch(\n () => options.recordId(),\n () => {\n reload();\n },\n { immediate: true },\n );\n\n return {\n // 数据\n record,\n ready,\n loading,\n modelType,\n // 可用性判断(统一的「是否显示」函数)\n availability,\n canShow,\n // 统一点击入口\n runAction,\n // 模态框状态(外壳只负责渲染,参数与回调都在这里封好)\n editorOpen,\n editorProps,\n removeOpen,\n removeProps,\n reload,\n };\n};\n"],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ export namespace StrUtil {
2
+ function isBlank(str: any): boolean;
3
+ function isNotBlank(str: any): boolean;
4
+ function isEmpty(str: any): boolean;
5
+ function isNotEmpty(str: any): boolean;
6
+ function nullToStr(str: any): any;
7
+ function trim(str: any): any;
8
+ function equals(str: any, that: any): boolean;
9
+ function equalsIgnoreCase(str: any, that: any): boolean;
10
+ function split(str: any, sep: any, maxLen: any): string[];
11
+ function sprintf(str: any, ...args: any[]): any;
12
+ function startWith(str: any, start: any): boolean;
13
+ function endWith(str: any, end: any): boolean;
14
+ function containsWhitespace(input: any): any;
15
+ function repeat(ch: any, repeatTimes: any): string;
16
+ function deleteWhitespace(input: any): any;
17
+ function rightPad(input: any, size: any, padStr: any): string;
18
+ function leftPad(input: any, size: any, padStr: any): string;
19
+ function capitalize(input: any): any;
20
+ function uncapitalize(input: any): any;
21
+ function swapCase(input: any): any;
22
+ function countMatches(input: any, sub: any): number;
23
+ function isAlpha(input: any): boolean;
24
+ function isAlphaSpace(input: any): boolean;
25
+ function isAlphanumeric(input: any): boolean;
26
+ function isAlphanumericSpace(input: any): boolean;
27
+ function isNumeric(input: any): boolean;
28
+ function isDecimal(input: any): boolean;
29
+ function isNegativeDecimal(input: any): boolean;
30
+ function isPositiveDecimal(input: any): boolean;
31
+ function isInteger(input: any): boolean;
32
+ function isPositiveInteger(input: any): boolean;
33
+ function isNegativeInteger(input: any): boolean;
34
+ function isNumericSpace(input: any): boolean;
35
+ function isWhitespace(input: any): boolean;
36
+ function isAllLowerCase(input: any): boolean;
37
+ function isAllUpperCase(input: any): boolean;
38
+ function defaultString(input: any, defaultStr: any): any;
39
+ function defaultIfBlank(input: any, defaultStr: any): any;
40
+ function defaultIfEmpty(input: any, defaultStr: any): any;
41
+ function reverse(input: any): any;
42
+ function removeSpecialCharacter(input: any): any;
43
+ function isSpecialCharacterAlphanumeric(input: any): boolean;
44
+ function isPatternMustExcludeSomeStr(input: any, conditions: any): boolean;
45
+ function format(message: string, arr: any[]): string;
46
+ function compressRepeatedStr(input: string, ignoreCase: boolean): string;
47
+ function isPatternMustContainSomeStr(input: string, conditions: any): boolean;
48
+ function isChinese(input: any): boolean;
49
+ function removeChinese(input: any): any;
50
+ function escapeMetacharacter(input: any): any;
51
+ function escapeMetacharacterOfStr(input: any): any;
52
+ }
@@ -0,0 +1,8 @@
1
+ export declare const isNotEmpty: (value: any) => boolean;
2
+ export declare const isEmpty: (value: any) => boolean;
3
+ /** 复制文本到剪贴板并提示。val 允许传 { val, message } 形式自定义提示文案。 */
4
+ export declare const copyValue: (val: any) => void;
5
+ /** 操作符 -> 展示文案,format 为 input 且操作符为 in 时固定展示「等于」 */
6
+ export declare const get_operator_type_map: (format: string, operator: string) => string;
7
+ /** 按 name 去重(保留先出现的节点,同时保留其子树) */
8
+ export declare function removeNestedDuplicates(nodes: any[], seenIds?: Set<any>, parentPath?: any[]): any[];