vue2-client 1.8.259 → 1.8.261

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 (210) hide show
  1. package/.env +19 -19
  2. package/.eslintrc.js +90 -90
  3. package/CHANGELOG.md +824 -824
  4. package/Components.md +60 -60
  5. package/babel.config.js +21 -21
  6. package/docs/index.md +30 -30
  7. package/docs/lowcode.md +188 -188
  8. package/docs/lowcodeForDeveloper.md +200 -192
  9. package/index.js +31 -31
  10. package/jest-transform-stub.js +8 -8
  11. package/jest.config.js +21 -21
  12. package/jest.setup.js +7 -7
  13. package/package.json +95 -95
  14. package/public/index.html +27 -27
  15. package/src/App.vue +188 -188
  16. package/src/ReportView.js +19 -19
  17. package/src/assets/img/querySlotDemo.svg +15 -15
  18. package/src/assets/svg/badtwo.svg +1 -1
  19. package/src/assets/svg/goodtwo.svg +1 -1
  20. package/src/base-client/components/common/AMisRender/index.js +3 -3
  21. package/src/base-client/components/common/AMisRender/index.vue +263 -263
  22. package/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox.vue +413 -413
  23. package/src/base-client/components/common/AddressSearchCombobox/demo.vue +36 -36
  24. package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
  25. package/src/base-client/components/common/CitySelect/CitySelect.vue +348 -348
  26. package/src/base-client/components/common/CitySelect/index.js +3 -3
  27. package/src/base-client/components/common/CitySelect/index.md +109 -109
  28. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +669 -669
  29. package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +1014 -1014
  30. package/src/base-client/components/common/CreateQuery/index.js +3 -3
  31. package/src/base-client/components/common/CreateQuery/index.md +42 -42
  32. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +452 -452
  33. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQueryItem.vue +511 -511
  34. package/src/base-client/components/common/CreateSimpleFormQuery/index.js +3 -3
  35. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
  36. package/src/base-client/components/common/FormGroupEdit/FormGroupEdit.vue +149 -149
  37. package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
  38. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  39. package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +166 -166
  40. package/src/base-client/components/common/FormGroupQuery/index.js +3 -3
  41. package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
  42. package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
  43. package/src/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue +394 -355
  44. package/src/base-client/components/common/LowCodePageRender/LowCodePageRender.vue +29 -29
  45. package/src/base-client/components/common/LowCodePageRender/editorPageRender.vue +533 -467
  46. package/src/base-client/components/common/LowCodePageRender/index.js +3 -3
  47. package/src/base-client/components/common/PersonSetting/PersonSetting.vue +208 -208
  48. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  49. package/src/base-client/components/common/Tree/Tree.vue +149 -149
  50. package/src/base-client/components/common/Tree/index.js +2 -2
  51. package/src/base-client/components/common/Upload/Upload.vue +197 -197
  52. package/src/base-client/components/common/Upload/index.js +3 -3
  53. package/src/base-client/components/common/XAddForm/XAddForm.vue +98 -98
  54. package/src/base-client/components/common/XAddNativeForm/XAddNativeForm.vue +732 -732
  55. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  56. package/src/base-client/components/common/XAddNativeForm/lowcodeEditorRegister.js +16 -12
  57. package/src/base-client/components/common/XAddNativeFormOA/XAddNativeFormOA.vue +303 -303
  58. package/src/base-client/components/common/XAddNativeFormOA/index.js +3 -3
  59. package/src/base-client/components/common/XAddNativeFormOA/index.md +146 -146
  60. package/src/base-client/components/common/XBadge/XBadge.vue +78 -78
  61. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  62. package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
  63. package/src/base-client/components/common/XDataDrawer/index.js +3 -3
  64. package/src/base-client/components/common/XDataDrawer/index.md +41 -41
  65. package/src/base-client/components/common/XDescriptions/XDescriptions.vue +167 -167
  66. package/src/base-client/components/common/XDescriptions/XDescriptionsGroup.vue +299 -299
  67. package/src/base-client/components/common/XDescriptions/demo.vue +50 -50
  68. package/src/base-client/components/common/XDescriptions/index.js +3 -3
  69. package/src/base-client/components/common/XDescriptions/index.md +83 -83
  70. package/src/base-client/components/common/XDescriptions/lowcodeEditorRegister.js +15 -5
  71. package/src/base-client/components/common/XDetailsView/XDetailsView.vue +214 -214
  72. package/src/base-client/components/common/XDetailsView/index.js +3 -3
  73. package/src/base-client/components/common/XForm/XForm.vue +281 -281
  74. package/src/base-client/components/common/XForm/XFormItem.vue +807 -807
  75. package/src/base-client/components/common/XForm/XTreeSelect.vue +206 -206
  76. package/src/base-client/components/common/XForm/index.md +178 -178
  77. package/src/base-client/components/common/XFormCol/XFormCol.vue +36 -36
  78. package/src/base-client/components/common/XFormGroup/XFormGroup.vue +241 -241
  79. package/src/base-client/components/common/XFormGroup/demo.vue +40 -40
  80. package/src/base-client/components/common/XFormGroup/index.js +3 -3
  81. package/src/base-client/components/common/XFormGroup/index.md +38 -38
  82. package/src/base-client/components/common/XFormGroupDetails/XFormGroupDetails.vue +72 -72
  83. package/src/base-client/components/common/XFormGroupDetails/index.js +3 -3
  84. package/src/base-client/components/common/XFormTable/XFormTable.vue +519 -519
  85. package/src/base-client/components/common/XFormTable/index.md +98 -98
  86. package/src/base-client/components/common/XFormTable/lowcodeEditorRegister.js +16 -12
  87. package/src/base-client/components/common/XImportExcel/XImportExcel.vue +147 -147
  88. package/src/base-client/components/common/XReport/XReport.vue +843 -843
  89. package/src/base-client/components/common/XReport/XReportDemo.vue +2233 -2233
  90. package/src/base-client/components/common/XReport/XReportDesign.vue +470 -470
  91. package/src/base-client/components/common/XReport/XReportJsonRender.vue +267 -267
  92. package/src/base-client/components/common/XReport/XReportTrGroup.vue +745 -742
  93. package/src/base-client/components/common/XReport/index.js +3 -3
  94. package/src/base-client/components/common/XReport/index.md +44 -44
  95. package/src/base-client/components/common/XReportSlot/XReportSlot.vue +110 -110
  96. package/src/base-client/components/common/XReportSlot/index.js +3 -3
  97. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  98. package/src/base-client/components/common/XStepView/index.js +3 -3
  99. package/src/base-client/components/common/XStepView/index.md +31 -31
  100. package/src/base-client/components/common/XTable/XTable.vue +636 -636
  101. package/src/base-client/components/common/XTable/index.md +255 -255
  102. package/src/base-client/components/common/XTree/XTree.vue +318 -318
  103. package/src/base-client/components/common/XTree/index.js +3 -3
  104. package/src/base-client/components/common/XTree/index.md +36 -36
  105. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +114 -114
  106. package/src/base-client/components/common/XTreeOne/lowcodeEditorRegister.js +11 -9
  107. package/src/base-client/components/index.js +51 -51
  108. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  109. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -281
  110. package/src/base-client/plugins/AppData.js +115 -115
  111. package/src/base-client/plugins/Config.js +19 -19
  112. package/src/base-client/plugins/GetLoginInfoService.js +183 -183
  113. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  114. package/src/bootstrap.js +39 -39
  115. package/src/components/CodeMirror/inedx.vue +118 -118
  116. package/src/components/CodeMirror/setting.js +40 -40
  117. package/src/components/FilePreview/FilePreview.vue +166 -166
  118. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  119. package/src/components/STable/index.js +323 -323
  120. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  121. package/src/components/checkbox/ImgCheckbox.vue +163 -163
  122. package/src/components/menu/SideMenu.vue +75 -75
  123. package/src/components/menu/menu.js +273 -273
  124. package/src/components/tool/AStepItem.vue +60 -60
  125. package/src/config/CreateQueryConfig.js +322 -322
  126. package/src/config/default/antd.config.js +89 -89
  127. package/src/config/default/setting.config.js +55 -55
  128. package/src/font-style/font.css +4 -4
  129. package/src/layouts/CommonLayout.vue +56 -56
  130. package/src/layouts/PageLayout.vue +151 -151
  131. package/src/layouts/SinglePageView.vue +138 -138
  132. package/src/layouts/header/AdminHeader.vue +132 -132
  133. package/src/layouts/header/HeaderNotice.vue +177 -177
  134. package/src/layouts/tabs/TabsHead.vue +189 -189
  135. package/src/layouts/tabs/TabsView.vue +387 -387
  136. package/src/lib.js +1 -1
  137. package/src/main.js +26 -26
  138. package/src/mock/extend/index.js +84 -84
  139. package/src/mock/goods/index.js +108 -108
  140. package/src/pages/AMisDemo/AMisDemo.vue +325 -325
  141. package/src/pages/AMisDemo/AMisDemo2.vue +74 -74
  142. package/src/pages/DynamicStatistics/ChartSelector.vue +331 -331
  143. package/src/pages/DynamicStatistics/DataTabs.vue +83 -83
  144. package/src/pages/DynamicStatistics/DynamicTable.vue +128 -128
  145. package/src/pages/DynamicStatistics/EvaluationArea.vue +69 -69
  146. package/src/pages/DynamicStatistics/FavoriteList.vue +51 -51
  147. package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +591 -591
  148. package/src/pages/DynamicStatistics/SearchBar.vue +192 -192
  149. package/src/pages/DynamicStatistics/index.vue +282 -282
  150. package/src/pages/Example/index.vue +32 -32
  151. package/src/pages/NewDynamicStatistics/ChartSelector.vue +331 -331
  152. package/src/pages/NewDynamicStatistics/DataTabs.vue +122 -122
  153. package/src/pages/NewDynamicStatistics/DynamicTable.vue +128 -128
  154. package/src/pages/NewDynamicStatistics/EvaluationArea.vue +69 -69
  155. package/src/pages/NewDynamicStatistics/FavoriteList.vue +51 -51
  156. package/src/pages/NewDynamicStatistics/QuestionHistoryAndFavorites.vue +289 -289
  157. package/src/pages/NewDynamicStatistics/SearchBar.vue +193 -193
  158. package/src/pages/NewDynamicStatistics/index.vue +258 -258
  159. package/src/pages/ServiceReview/index.vue +284 -284
  160. package/src/pages/XReportView/index.vue +62 -62
  161. package/src/pages/login/Login.vue +378 -378
  162. package/src/pages/login/LoginV3.vue +389 -389
  163. package/src/pages/lowCode/lowCodeEditor.vue +1501 -1285
  164. package/src/pages/lowCode/lowCodeRender.vue +39 -39
  165. package/src/pages/resourceManage/orgListManage.vue +98 -98
  166. package/src/pages/system/dictionary/index.vue +44 -44
  167. package/src/pages/system/monitor/loginInfor/index.vue +37 -37
  168. package/src/pages/system/monitor/operLog/index.vue +37 -37
  169. package/src/pages/system/settings/modifyPassword.vue +117 -117
  170. package/src/pages/system/ticket/index.vue +480 -480
  171. package/src/pages/system/ticket/submitTicketSuccess.vue +484 -484
  172. package/src/router/async/config.async.js +33 -33
  173. package/src/router/async/router.map.js +107 -107
  174. package/src/router/guards.js +220 -220
  175. package/src/router/index.js +27 -27
  176. package/src/router.js +19 -19
  177. package/src/services/api/TicketDetailsViewApi.js +46 -46
  178. package/src/services/api/cas.js +79 -79
  179. package/src/services/api/common.js +284 -284
  180. package/src/services/api/entity.js +18 -18
  181. package/src/services/api/index.js +17 -17
  182. package/src/services/api/restTools.js +46 -46
  183. package/src/services/apiService.js +14 -14
  184. package/src/services/user.js +71 -71
  185. package/src/store/modules/setting.js +119 -119
  186. package/src/theme/default/style.less +57 -57
  187. package/src/theme/global.less +130 -130
  188. package/src/utils/authority-utils.js +85 -85
  189. package/src/utils/errorCode.js +6 -6
  190. package/src/utils/htmlToPDF.js +108 -108
  191. package/src/utils/htmlToPDFApi.js +5 -5
  192. package/src/utils/indexedDB.js +201 -201
  193. package/src/utils/login.js +144 -144
  194. package/src/utils/lowcode/lowcodeComponentMixin.js +112 -78
  195. package/src/utils/lowcode/lowcodeLog.js +29 -29
  196. package/src/utils/lowcode/lowcodeUtils.js +276 -129
  197. package/src/utils/lowcode/registerComponentForEditor.js +11 -11
  198. package/src/utils/lowcode/registerComponentForRender.js +11 -11
  199. package/src/utils/map-utils.js +47 -47
  200. package/src/utils/reg.js +19 -19
  201. package/src/utils/request.js +343 -343
  202. package/src/utils/routerUtil.js +435 -435
  203. package/src/utils/runEvalFunction.js +6 -6
  204. package/src/utils/util.js +241 -241
  205. package/src/utils/waterMark.js +31 -31
  206. package/test/Amis.spec.js +163 -163
  207. package/test/Tree.spec.js +167 -167
  208. package/test/myDialog.spec.js +46 -46
  209. package/vue.config.js +177 -177
  210. package//350/277/201/347/247/273/346/227/245/345/277/227.md +15 -15
@@ -1,636 +1,636 @@
1
- <template>
2
- <div v-show="tableColumns.length > 0">
3
- <a-row :gutter="48">
4
- <a-col>
5
- <span :style="{ float: 'left', overflow: 'hidden', marginBottom: '8px' }">
6
- <a-space>
7
- <slot name="leftButton" :selectedRowKeys="selectedRowKeys" :selectedRows="selectedRows"></slot>
8
- <a-button v-if="!buttonState || buttonState.add" type="primary" @click="add">
9
- <a-icon type="plus"/>新增
10
- </a-button>
11
- <a-button
12
- v-if="!buttonState || buttonState.edit"
13
- :disabled="!isModify"
14
- :loading="editLoading"
15
- class="btn-success"
16
- type="dashed"
17
- @click="edit()">
18
- <a-icon :style="iconStyle" type="edit"/>修改
19
- </a-button>
20
- <a-button v-if="!buttonState || buttonState.delete" :disabled="!isDelete" type="danger" @click="deleteItem">
21
- <a-icon :style="iconStyle" type="delete"/>删除
22
- </a-button>
23
- <a-button v-if="!buttonState || buttonState.import" type="dashed" @click="importData">
24
- <a-icon :style="iconStyle" type="import"/>导入
25
- </a-button>
26
- <a-dropdown v-if="!buttonState || buttonState.export">
27
- <a-menu slot="overlay">
28
- <a-menu-item :disabled="selectedRowKeys.length === 0" key="1" @click="handleExport(true)"><a-icon
29
- :style="iconStyle"
30
- type="ordered-list"/>导出选中数据</a-menu-item>
31
- <a-menu-item key="2" @click="handleExport(false)"><a-icon :style="iconStyle" type="snippets"/>导出本页数据</a-menu-item>
32
- <a-menu-item key="3" @click="handleExportByQuery"><a-icon :style="iconStyle" type="download"/>导出所有符合条件的数据</a-menu-item>
33
- </a-menu>
34
- <a-button>导出 <a-icon type="down" :style="iconStyle"/> </a-button>
35
- </a-dropdown>
36
- <slot name="button" :selectedRowKeys="selectedRowKeys" :selectedRows="selectedRows"></slot>
37
- </a-space>
38
- </span>
39
- </a-col>
40
- <a-col>
41
- <span :style="{ float: 'right', overflow: 'hidden', marginBottom: '8px' }">
42
- <a-button-group>
43
- <slot name="rightBtnExpand" :selectedRowKeys="selectedRowKeys" :selectedRows="selectedRows"></slot>
44
- <a-tooltip title="重新查询">
45
- <a-button @click="refresh(true)">
46
- <a-icon :style="iconStyle" type="reload"/>
47
- </a-button>
48
- </a-tooltip>
49
- <a-tooltip title="列展示/排序">
50
- <table-setting v-if="columnSelectLoaded" v-model="tableColumns"/>
51
- </a-tooltip>
52
- </a-button-group>
53
- </span>
54
- </a-col>
55
- </a-row>
56
- <s-table
57
- ref="table"
58
- :id="uniqueId"
59
- :alert="true"
60
- :columns="tableColumns"
61
- :data="loadData"
62
- :rowKey="rowKey"
63
- :rowSelection="rowSelection"
64
- :scroll="{ x: scrollXWidth, y: scrollYHeight }"
65
- :showPagination="showPagination"
66
- size="default"
67
- >
68
- <template
69
- v-for="(item, index) in tableColumns"
70
- :slot="item.dataIndex"
71
- slot-scope="text, record">
72
- <!-- 文本溢出省略(ellipsis) -->
73
- <span v-if="item.slotType === 'ellipsis'" :key="index">
74
- <ellipsis :length="item.slotValue" tooltip>{{ text === '' ? '--' : text }}</ellipsis>
75
- </span>
76
- <!-- 徽标(badge) -->
77
- <span v-else-if="item.slotType === 'badge'" :key="index">
78
- <x-badge v-if="text !== null && text !== undefined" :badge-key="item.slotKeyMap" :value="text"/>
79
- </span>
80
- <!-- 日期(date) -->
81
- <span v-else-if="item.slotType === 'date'" :key="index">
82
- {{ format(text, 'yyyy-MM-dd') }}
83
- </span>
84
- <!-- 日期时间(datetime) -->
85
- <span v-else-if="item.slotType === 'dateTime'" :key="index">
86
- {{ format(text, 'yyyy-MM-dd hh:mm:ss') }}
87
- </span>
88
- <!-- 操作列(action) -->
89
- <span v-else-if="item.slotType === 'action'" :key="index">
90
- <template v-if="item.actionArr && item.actionArr.length > 0">
91
- <a-dropdown>
92
- <a class="ant-dropdown-link" @click="e => e.preventDefault()">
93
- {{ item.scopedSlots?.customRender || item.slotValue }} <a-icon type="down"/>
94
- </a>
95
- <a-menu slot="overlay" style="min-width: 60px">
96
- <a-menu-item
97
- v-for="(action_item, index) in item.actionArr"
98
- :key="index"
99
- v-if="!action_item.customFunction || executeStrFunction( action_item.customFunction,[record,index])">
100
- <a
101
- style="text-align: center"
102
- @click="action(record, item.dataIndex, action_item.func)"
103
- >{{ action_item.text }}</a>
104
- </a-menu-item>
105
- </a-menu>
106
- </a-dropdown>
107
- </template>
108
- <template v-if="!item.actionArr || item.actionArr.length === 0">
109
- <a @click="action(record, item.dataIndex)">{{ item.slotValue }}</a>
110
- </template>
111
- </span>
112
- </template>
113
- <template slot="footer">
114
- <slot name="footer" :selectedRowKeys="selectedRowKeys" :selectedRows="selectedRows"></slot>
115
- </template>
116
- </s-table>
117
- <!-- 上传文件 -->
118
- <x-import-excel
119
- ref="importExcel"
120
- @ok="refresh(true)"
121
- :title="title"
122
- :service-name="serviceName"
123
- :query-params-name="queryParamsName"
124
- >
125
- <template #importExcelSlot>
126
- <slot name="importExcelSlot"></slot>
127
- </template>
128
- </x-import-excel>
129
- </div>
130
- </template>
131
- <script>
132
- import { Ellipsis, STable } from '@vue2-client/components'
133
- import { formatDate } from '@vue2-client/utils/util'
134
- import XBadge from '@vue2-client/base-client/components/common/XBadge'
135
- import TableSetting from '@vue2-client/components/TableSetting/TableSetting'
136
- import { exportJson } from '@vue2-client/utils/excel/Export2Excel'
137
- import { exportData, query, queryWithResource, remove } from '@vue2-client/services/api/common'
138
- import XImportExcel from '@vue2-client/base-client/components/common/XImportExcel'
139
- import { Modal } from 'ant-design-vue'
140
- import { post } from '@vue2-client/services/api'
141
- import { CommonTempTable } from '@vue2-client/services/api/commonTempTable'
142
- import { mapState } from 'vuex'
143
- import executeStrFunction from '@vue2-client/utils/runEvalFunction'
144
- import debounce from 'lodash.debounce'
145
-
146
- export default {
147
- name: 'XTable',
148
- components: {
149
- TableSetting,
150
- STable,
151
- Ellipsis,
152
- XBadge,
153
- XImportExcel
154
- },
155
- data () {
156
- return {
157
- uniqueId: `x-table-${this._uid}`, // 使用 _uid 生成唯一 ID
158
- // 筛选列加载状态
159
- columnSelectLoaded: false,
160
- // 预览模式
161
- viewMode: false,
162
- // 加载数据方法 必须为 Promise 对象
163
- loadData: parameter => {
164
- // 取到表格携带的表单参数
165
- const requestParameters = Object.assign({}, parameter)
166
- // 取到父组件传入的表单参数
167
- const conditionParams = {}
168
- Object.assign(conditionParams, this.fixedQueryForm)
169
- Object.assign(conditionParams, this.form)
170
- // 如果传了燃气公司字段,则进行数据处理
171
- if (conditionParams.orgName) {
172
- requestParameters.orgName = conditionParams.orgName
173
- delete conditionParams.orgName
174
- }
175
- requestParameters.conditionParams = conditionParams
176
- requestParameters.queryParamsName = this.queryParamsName
177
- requestParameters.queryParams = this.queryParams
178
- // 加载数据
179
- return this.loadTableData(requestParameters)
180
- },
181
- rowKey: undefined,
182
- // x滚动条宽度
183
- scrollXWidth: 1600,
184
- // y滚动条高度
185
- scrollYHeight: 'calc(100vh - 31rem)',
186
- // 表格选择列Key集合
187
- selectedRowKeys: [],
188
- // 表格选择Row集合
189
- selectedRows: [],
190
- // 禁止表格选择Row集合
191
- selectedDisableRows: [],
192
- // 业务标题
193
- title: '',
194
- // 数据列
195
- tableColumns: [],
196
- // 查询用表单
197
- form: {},
198
- // 是否允许修改
199
- isModify: false,
200
- // 是否允许删除
201
- isDelete: false,
202
- // 服务名称
203
- serviceName: undefined,
204
- // 选中用于修改的id
205
- selectId: undefined,
206
- // 是否为临时表
207
- isTableTemp: false,
208
- // 是否显示展示列抽屉
209
- visible: false,
210
- // 编辑按钮加载状态
211
- editLoading: false,
212
- // 按钮状态
213
- buttonState: {},
214
- // 图标样式
215
- iconStyle: {
216
- position: 'relative',
217
- top: '1px'
218
- },
219
- // 当前环境
220
- env: 'prod'
221
- }
222
- },
223
- props: {
224
- // 查询配置文件名
225
- queryParamsName: {
226
- type: String,
227
- default: () => {
228
- return ''
229
- }
230
- },
231
- // 查询配置文件Json
232
- queryParamsJson: {
233
- type: Object,
234
- default: null
235
- },
236
- // 固定查询表单
237
- fixedQueryForm: {
238
- type: Object,
239
- default: () => {
240
- return {}
241
- }
242
- },
243
- // 数据只有一页时是否展示分页,true:展示,auto:隐藏
244
- showPagination: {
245
- type: Boolean,
246
- default: true
247
- },
248
- // 是否自定义删除功能
249
- customDelete: {
250
- type: Boolean,
251
- default: false
252
- },
253
- // 自适应底部编剧
254
- extraHeight: {
255
- type: Number,
256
- default: 80
257
- }
258
- },
259
- computed: {
260
- rowSelection () {
261
- return {
262
- selectedRowKeys: this.selectedRowKeys,
263
- onChange: this.onSelectChange,
264
- getCheckboxProps: record => ({
265
- props: {
266
- disabled: this.selectedDisableRows.includes(record[this.rowKey]), // Column configuration not to be checked
267
- name: record.name,
268
- },
269
- }),
270
- }
271
- },
272
- ...mapState('account', { currUser: 'user' }),
273
- ...mapState('setting', ['compatible'])
274
- },
275
- mounted () {
276
- this.setScrollYHeight({}) // 初始化时也调用一次,确保加载时高度正确
277
- window.addEventListener('resize', this.handleResize)
278
- },
279
- beforeDestroy () {
280
- window.removeEventListener('resize', this.handleResize)
281
- },
282
- methods: {
283
- handleResize () {
284
- debounce(() => {
285
- this.setScrollYHeight({})
286
- }, 100)()
287
- },
288
- isInAModal () {
289
- let parent = this.$parent
290
- while (parent) {
291
- // 检查组件名称,这里假设a-modal组件的名称为AModal,根据实际情况可能需要调整
292
- if (parent.$options.name === 'AModal') {
293
- return true
294
- }
295
- parent = parent.$parent
296
- }
297
- return false
298
- },
299
- executeStrFunction,
300
- /**
301
- * 初始化表格参数
302
- */
303
- init (params) {
304
- const {
305
- // 查询参数对象, 用于没有对应查询配置文件名时
306
- queryParams,
307
- tableColumns,
308
- buttonState,
309
- title,
310
- form,
311
- serviceName,
312
- viewMode,
313
- env = 'prod'
314
- } = params
315
- this.queryParams = queryParams
316
- this.tableColumns = JSON.parse(JSON.stringify(tableColumns))
317
- if (this.tableColumns.length === 0) {
318
- return
319
- }
320
- this.buttonState = buttonState
321
- this.title = title
322
- this.serviceName = serviceName
323
- this.viewMode = viewMode
324
- this.env = env
325
- this.rowKey = this.tableColumns[0].dataIndex
326
- let totalWidth = 0
327
- for (let i = 0; i < this.tableColumns.length; i++) {
328
- const item = this.tableColumns[i]
329
- // 设置操作列
330
- if (item.slotType === 'action') {
331
- item.fixed = 'right'
332
- item.width = 70
333
- }
334
- // 设置表格宽度
335
- if (item.width) {
336
- totalWidth = totalWidth + item.width
337
- } else {
338
- totalWidth = totalWidth + 180
339
- }
340
- }
341
- // 横向滚动长度大于所有宽度,才能实现固定表头
342
- this.scrollXWidth = totalWidth
343
- // 加载筛选列完成
344
- this.columnSelectLoaded = true
345
- this.setQueryForm(form || {})
346
- },
347
- /**
348
- * 加载表格数据
349
- * @param requestParameters 请求参数
350
- */
351
- loadTableData (requestParameters) {
352
- let result = {}
353
- if (this.queryParamsJson) {
354
- if (this.queryParamsJson.tableName.startsWith('##')) {
355
- this.isTableTemp = true
356
- result = this.initTempTable(requestParameters)
357
- }
358
- }
359
- if (!this.isTableTemp) {
360
- result = query(Object.assign(requestParameters, { userId: this.currUser?.id }), this.serviceName, this.env === 'dev')
361
- }
362
- this.clearRowKeys()
363
- this.$emit('afterQuery', result, requestParameters.conditionParams)
364
- // 设置表格高度为固定值
365
- this.setScrollYHeight({ type: 'default' })
366
- return result
367
- },
368
- /**
369
- * 操作列事件
370
- * @param record 本条数据
371
- * @param actionType 操作类型
372
- * @param func 事件默认 action
373
- */
374
- action (record, actionType, func = 'action') {
375
- this.$emit('action', record, record[this.getPrimaryKeyName()], actionType, func)
376
- },
377
- /**
378
- * 选择列事件
379
- * @param selectedRowKeys 被选择的列Key集合
380
- * @param selectedRows 被选择的列集合
381
- */
382
- onSelectChange (selectedRowKeys, selectedRows) {
383
- this.selectedRowKeys = selectedRowKeys
384
- this.selectedRows = selectedRows
385
- this.isModify = this.selectedRowKeys.length === 1
386
- this.isDelete = this.selectedRowKeys.length > 0
387
- this.$emit('selectRow', selectedRowKeys, selectedRows)
388
- },
389
- /**
390
- * 清除表格选中项
391
- */
392
- clearRowKeys () {
393
- this.$refs.table.clearSelected()
394
- },
395
- /**
396
- * 为表格附加查询条件
397
- */
398
- setQueryForm (form = {}) {
399
- this.form = form
400
- this.refresh(true)
401
- },
402
- /**
403
- * 表格重新加载方法
404
- * 如果参数为 true, 则强制刷新到第一页
405
- */
406
- refresh (bool) {
407
- this.$nextTick(() => {
408
- this.$refs.table.refresh(bool)
409
- })
410
- },
411
- setScrollYHeight ({ extraHeight = this.extraHeight, id = this.uniqueId, type = '' }) {
412
- this.$nextTick(() => {
413
- if (typeof extraHeight == 'undefined') {
414
- // 默认底部分页32 + 边距48
415
- extraHeight = 48 + 32
416
- }
417
- let tHeader = null
418
- if (id) {
419
- tHeader = document.getElementById(id) ? document.getElementById(id).getElementsByClassName('ant-table-thead')[0] : null
420
- } else {
421
- tHeader = document.getElementsByClassName('ant-table-thead')[0]
422
- }
423
- // 表格内容距离顶部的距离
424
- let tHeaderBottom = 0
425
- if (tHeader) {
426
- tHeaderBottom = tHeader.getBoundingClientRect().bottom
427
- }
428
- if (tHeaderBottom === 0) {
429
- this.scrollYHeight = 'calc(100vh - 31rem)'
430
- if (window.__MICRO_APP_ENVIRONMENT__) {
431
- this.scrollYHeight = 'calc(100vh - 28.5rem)'
432
- }
433
- return
434
- }
435
-
436
- // 判断是否在 modal 中
437
- if (this.isInAModal()) {
438
- const modalElement = document.querySelector('.ant-modal-content') // Adjust the selector as needed
439
- if (modalElement) {
440
- const modalRect = modalElement.getBoundingClientRect()
441
- // 24 是 modal 通常的边距
442
- extraHeight = window.innerHeight - modalRect.bottom + modalRect.top + 80 + 24
443
- }
444
- }
445
- // 窗体高度-表格内容顶部的高度-表格内容底部的高度
446
- // this.scrollYHeight = document.body.clientHeight - tHeaderBottom - extraHeight
447
- this.scrollYHeight = `calc(100vh - ${tHeaderBottom + extraHeight}px)`
448
- })
449
- },
450
- /**
451
- * 格式化日期
452
- * @param date 日期字符串
453
- * @param format 格式化方式
454
- */
455
- format (date, format) {
456
- return formatDate(date, format)
457
- },
458
- /**
459
- * 获取主键列名称
460
- */
461
- getPrimaryKeyName () {
462
- return this.tableColumns[0].dataIndex
463
- },
464
- // 导出选中或本页数据
465
- handleExport (isSelected) {
466
- const tHeader = this.tableColumns.filter(res => res.slotType !== 'action').map(res => res.title)
467
- const filterVal = this.tableColumns.map(res => res.dataIndex)
468
- let exportData
469
- if (isSelected) {
470
- exportData = this.selectedRows
471
- } else {
472
- exportData = this.$refs.table.localDataSource
473
- }
474
- exportJson(tHeader, exportData.map(v => filterVal.map(j => v[j])), this.title + `数据_${new Date().toLocaleString()}`)
475
- },
476
- // 导出符合条件的数据
477
- handleExportByQuery () {
478
- const that = this
479
- const conditionParams = Object.assign(that.form, that.fixedQueryForm)
480
- this.$confirm({
481
- title: '是否确认导出?',
482
- content: '此操作将导出当前条件下所有数据而非选中数据',
483
- onOk () {
484
- exportData({
485
- queryParamsName: that.queryParamsName,
486
- queryParams: that.queryParams,
487
- form: conditionParams,
488
- userId: that.currUser.id
489
- }, that.serviceName, that.env === 'dev').then(res => {
490
- let value = res
491
- if (that.compatible === 'V4') {
492
- value = res.value
493
- }
494
- window.open('/res/excel/export/' + value)
495
- })
496
- },
497
- onCancel () {
498
- }
499
- })
500
- },
501
- // 新增业务
502
- add () {
503
- this.$emit('add')
504
- },
505
- // 编辑业务
506
- edit (id) {
507
- this.editLoading = true
508
- this.getEditData(id).then(modifyModelData => {
509
- this.$emit('edit', modifyModelData)
510
- this.editLoading = false
511
- })
512
- },
513
- // 获取被编辑的数据
514
- getEditData (id) {
515
- const requestParameters = {
516
- queryParamsName: this.queryParamsName,
517
- queryParams: this.queryParams,
518
- conditionParams: {},
519
- pageNo: 1,
520
- pageSize: 1
521
- }
522
- if (!id) {
523
- this.selectId = this.selectedRowKeys[0]
524
- } else {
525
- this.selectId = id
526
- }
527
- const primaryKeyName = this.getPrimaryKeyName()
528
- requestParameters.conditionParams[primaryKeyName] = this.selectId
529
- requestParameters.f_businessid = this.selectId
530
- if (this.isTableTemp) {
531
- this.$emit('tempTableEdit', requestParameters)
532
- return
533
- }
534
- return queryWithResource(requestParameters, this.serviceName, this.env === 'dev').then(res => {
535
- // 将更新需要的主键值加入到primaryKeyData中
536
- const primaryKeyData = {}
537
- primaryKeyData[primaryKeyName] = this.selectId
538
- return { data: res.data[0], primaryKeyData: primaryKeyData, images: res.images, files: res.files }
539
- })
540
- },
541
- // 删除业务
542
- deleteItem () {
543
- if (this.viewMode) {
544
- this.$message.info('预览模式禁止删除')
545
- return
546
- }
547
- Modal.confirm({
548
- title: '提示',
549
- content: '您本次要删除共' + this.selectedRowKeys.length + '条数据,确定操作吗?',
550
- zIndex: 1001,
551
- onOk: () => {
552
- return new Promise((resolve, reject) => {
553
- if (this.customDelete) {
554
- this.$emit('del', this.selectedRows, resolve)
555
- } else {
556
- const requestParameters = {
557
- queryParamsName: this.queryParamsName,
558
- idList: this.selectedRowKeys
559
- }
560
- remove(requestParameters, this.serviceName, this.env === 'dev').then(res => {
561
- resolve(res)
562
- this.$message.success('删除成功!')
563
- this.refresh(true)
564
- // afterDelete
565
- this.$emit('afterDelete', requestParameters)
566
- }).catch(e => {
567
- reject(e)
568
- this.$message.error('删除失败!')
569
- })
570
- }
571
- })
572
- },
573
- onCancel () {
574
- }
575
- })
576
- },
577
- // 导入业务
578
- importData () {
579
- this.$refs.importExcel.importExcelHandleOpen()
580
- },
581
- // 初始化临时表
582
- async initTempTable (json) {
583
- await this.createTempTable(this.queryParamsJson)
584
- await this.insertTempTableData(this.queryParamsJson)
585
- let result = {}
586
- await post(CommonTempTable.initApplySubTable, {
587
- define: json
588
- }).then(res => {
589
- console.log('子表临时表已创建')
590
- result = res
591
- })
592
- return result
593
- },
594
- // 创建临时表sql生成
595
- createTempTable (defineJson) {
596
- const tableName = defineJson.tableName
597
- const define = defineJson.column
598
- return post(CommonTempTable.createTempTable, {
599
- define: define,
600
- tableName: tableName
601
- }).then(res => {
602
- return res
603
- }, err => {
604
- console.log(err)
605
- })
606
- },
607
- // 插入临时表数据sql生成
608
- insertTempTableData (defineJson) {
609
- const tableName = defineJson.tableName
610
- const params = {}
611
- params.define = defineJson.column
612
- params.applyId = defineJson.applyId
613
- params.stepName = defineJson.stepName
614
- params.tableName = tableName
615
- return post(CommonTempTable.insertDataToTempTable, {
616
- tempTableData: params
617
- }).then(res => {
618
- return res
619
- })
620
- }
621
- }
622
- }
623
- </script>
624
- <style lang="less" scoped>
625
- :deep(.ant-table-thead > tr > th) {
626
- font-weight: 600;
627
- }
628
-
629
- :deep(.ant-table-pagination.ant-pagination) {
630
- margin-bottom: 0;
631
- }
632
-
633
- :deep(.ant-table td) {
634
- white-space: nowrap;
635
- }
636
- </style>
1
+ <template>
2
+ <div v-show="tableColumns.length > 0">
3
+ <a-row :gutter="48">
4
+ <a-col>
5
+ <span :style="{ float: 'left', overflow: 'hidden', marginBottom: '8px' }">
6
+ <a-space>
7
+ <slot name="leftButton" :selectedRowKeys="selectedRowKeys" :selectedRows="selectedRows"></slot>
8
+ <a-button v-if="!buttonState || buttonState.add" type="primary" @click="add">
9
+ <a-icon type="plus"/>新增
10
+ </a-button>
11
+ <a-button
12
+ v-if="!buttonState || buttonState.edit"
13
+ :disabled="!isModify"
14
+ :loading="editLoading"
15
+ class="btn-success"
16
+ type="dashed"
17
+ @click="edit()">
18
+ <a-icon :style="iconStyle" type="edit"/>修改
19
+ </a-button>
20
+ <a-button v-if="!buttonState || buttonState.delete" :disabled="!isDelete" type="danger" @click="deleteItem">
21
+ <a-icon :style="iconStyle" type="delete"/>删除
22
+ </a-button>
23
+ <a-button v-if="!buttonState || buttonState.import" type="dashed" @click="importData">
24
+ <a-icon :style="iconStyle" type="import"/>导入
25
+ </a-button>
26
+ <a-dropdown v-if="!buttonState || buttonState.export">
27
+ <a-menu slot="overlay">
28
+ <a-menu-item :disabled="selectedRowKeys.length === 0" key="1" @click="handleExport(true)"><a-icon
29
+ :style="iconStyle"
30
+ type="ordered-list"/>导出选中数据</a-menu-item>
31
+ <a-menu-item key="2" @click="handleExport(false)"><a-icon :style="iconStyle" type="snippets"/>导出本页数据</a-menu-item>
32
+ <a-menu-item key="3" @click="handleExportByQuery"><a-icon :style="iconStyle" type="download"/>导出所有符合条件的数据</a-menu-item>
33
+ </a-menu>
34
+ <a-button>导出 <a-icon type="down" :style="iconStyle"/> </a-button>
35
+ </a-dropdown>
36
+ <slot name="button" :selectedRowKeys="selectedRowKeys" :selectedRows="selectedRows"></slot>
37
+ </a-space>
38
+ </span>
39
+ </a-col>
40
+ <a-col>
41
+ <span :style="{ float: 'right', overflow: 'hidden', marginBottom: '8px' }">
42
+ <a-button-group>
43
+ <slot name="rightBtnExpand" :selectedRowKeys="selectedRowKeys" :selectedRows="selectedRows"></slot>
44
+ <a-tooltip title="重新查询">
45
+ <a-button @click="refresh(true)">
46
+ <a-icon :style="iconStyle" type="reload"/>
47
+ </a-button>
48
+ </a-tooltip>
49
+ <a-tooltip title="列展示/排序">
50
+ <table-setting v-if="columnSelectLoaded" v-model="tableColumns"/>
51
+ </a-tooltip>
52
+ </a-button-group>
53
+ </span>
54
+ </a-col>
55
+ </a-row>
56
+ <s-table
57
+ ref="table"
58
+ :id="uniqueId"
59
+ :alert="true"
60
+ :columns="tableColumns"
61
+ :data="loadData"
62
+ :rowKey="rowKey"
63
+ :rowSelection="rowSelection"
64
+ :scroll="{ x: scrollXWidth, y: scrollYHeight }"
65
+ :showPagination="showPagination"
66
+ size="default"
67
+ >
68
+ <template
69
+ v-for="(item, index) in tableColumns"
70
+ :slot="item.dataIndex"
71
+ slot-scope="text, record">
72
+ <!-- 文本溢出省略(ellipsis) -->
73
+ <span v-if="item.slotType === 'ellipsis'" :key="index">
74
+ <ellipsis :length="item.slotValue" tooltip>{{ text === '' ? '--' : text }}</ellipsis>
75
+ </span>
76
+ <!-- 徽标(badge) -->
77
+ <span v-else-if="item.slotType === 'badge'" :key="index">
78
+ <x-badge v-if="text !== null && text !== undefined" :badge-key="item.slotKeyMap" :value="text"/>
79
+ </span>
80
+ <!-- 日期(date) -->
81
+ <span v-else-if="item.slotType === 'date'" :key="index">
82
+ {{ format(text, 'yyyy-MM-dd') }}
83
+ </span>
84
+ <!-- 日期时间(datetime) -->
85
+ <span v-else-if="item.slotType === 'dateTime'" :key="index">
86
+ {{ format(text, 'yyyy-MM-dd hh:mm:ss') }}
87
+ </span>
88
+ <!-- 操作列(action) -->
89
+ <span v-else-if="item.slotType === 'action'" :key="index">
90
+ <template v-if="item.actionArr && item.actionArr.length > 0">
91
+ <a-dropdown>
92
+ <a class="ant-dropdown-link" @click="e => e.preventDefault()">
93
+ {{ item.scopedSlots?.customRender || item.slotValue }} <a-icon type="down"/>
94
+ </a>
95
+ <a-menu slot="overlay" style="min-width: 60px">
96
+ <a-menu-item
97
+ v-for="(action_item, index) in item.actionArr"
98
+ :key="index"
99
+ v-if="!action_item.customFunction || executeStrFunction( action_item.customFunction,[record,index])">
100
+ <a
101
+ style="text-align: center"
102
+ @click="action(record, item.dataIndex, action_item.func)"
103
+ >{{ action_item.text }}</a>
104
+ </a-menu-item>
105
+ </a-menu>
106
+ </a-dropdown>
107
+ </template>
108
+ <template v-if="!item.actionArr || item.actionArr.length === 0">
109
+ <a @click="action(record, item.dataIndex)">{{ item.slotValue }}</a>
110
+ </template>
111
+ </span>
112
+ </template>
113
+ <template slot="footer">
114
+ <slot name="footer" :selectedRowKeys="selectedRowKeys" :selectedRows="selectedRows"></slot>
115
+ </template>
116
+ </s-table>
117
+ <!-- 上传文件 -->
118
+ <x-import-excel
119
+ ref="importExcel"
120
+ @ok="refresh(true)"
121
+ :title="title"
122
+ :service-name="serviceName"
123
+ :query-params-name="queryParamsName"
124
+ >
125
+ <template #importExcelSlot>
126
+ <slot name="importExcelSlot"></slot>
127
+ </template>
128
+ </x-import-excel>
129
+ </div>
130
+ </template>
131
+ <script>
132
+ import { Ellipsis, STable } from '@vue2-client/components'
133
+ import { formatDate } from '@vue2-client/utils/util'
134
+ import XBadge from '@vue2-client/base-client/components/common/XBadge'
135
+ import TableSetting from '@vue2-client/components/TableSetting/TableSetting'
136
+ import { exportJson } from '@vue2-client/utils/excel/Export2Excel'
137
+ import { exportData, query, queryWithResource, remove } from '@vue2-client/services/api/common'
138
+ import XImportExcel from '@vue2-client/base-client/components/common/XImportExcel'
139
+ import { Modal } from 'ant-design-vue'
140
+ import { post } from '@vue2-client/services/api'
141
+ import { CommonTempTable } from '@vue2-client/services/api/commonTempTable'
142
+ import { mapState } from 'vuex'
143
+ import executeStrFunction from '@vue2-client/utils/runEvalFunction'
144
+ import debounce from 'lodash.debounce'
145
+
146
+ export default {
147
+ name: 'XTable',
148
+ components: {
149
+ TableSetting,
150
+ STable,
151
+ Ellipsis,
152
+ XBadge,
153
+ XImportExcel
154
+ },
155
+ data () {
156
+ return {
157
+ uniqueId: `x-table-${this._uid}`, // 使用 _uid 生成唯一 ID
158
+ // 筛选列加载状态
159
+ columnSelectLoaded: false,
160
+ // 预览模式
161
+ viewMode: false,
162
+ // 加载数据方法 必须为 Promise 对象
163
+ loadData: parameter => {
164
+ // 取到表格携带的表单参数
165
+ const requestParameters = Object.assign({}, parameter)
166
+ // 取到父组件传入的表单参数
167
+ const conditionParams = {}
168
+ Object.assign(conditionParams, this.fixedQueryForm)
169
+ Object.assign(conditionParams, this.form)
170
+ // 如果传了燃气公司字段,则进行数据处理
171
+ if (conditionParams.orgName) {
172
+ requestParameters.orgName = conditionParams.orgName
173
+ delete conditionParams.orgName
174
+ }
175
+ requestParameters.conditionParams = conditionParams
176
+ requestParameters.queryParamsName = this.queryParamsName
177
+ requestParameters.queryParams = this.queryParams
178
+ // 加载数据
179
+ return this.loadTableData(requestParameters)
180
+ },
181
+ rowKey: undefined,
182
+ // x滚动条宽度
183
+ scrollXWidth: 1600,
184
+ // y滚动条高度
185
+ scrollYHeight: 'calc(100vh - 31rem)',
186
+ // 表格选择列Key集合
187
+ selectedRowKeys: [],
188
+ // 表格选择Row集合
189
+ selectedRows: [],
190
+ // 禁止表格选择Row集合
191
+ selectedDisableRows: [],
192
+ // 业务标题
193
+ title: '',
194
+ // 数据列
195
+ tableColumns: [],
196
+ // 查询用表单
197
+ form: {},
198
+ // 是否允许修改
199
+ isModify: false,
200
+ // 是否允许删除
201
+ isDelete: false,
202
+ // 服务名称
203
+ serviceName: undefined,
204
+ // 选中用于修改的id
205
+ selectId: undefined,
206
+ // 是否为临时表
207
+ isTableTemp: false,
208
+ // 是否显示展示列抽屉
209
+ visible: false,
210
+ // 编辑按钮加载状态
211
+ editLoading: false,
212
+ // 按钮状态
213
+ buttonState: {},
214
+ // 图标样式
215
+ iconStyle: {
216
+ position: 'relative',
217
+ top: '1px'
218
+ },
219
+ // 当前环境
220
+ env: 'prod'
221
+ }
222
+ },
223
+ props: {
224
+ // 查询配置文件名
225
+ queryParamsName: {
226
+ type: String,
227
+ default: () => {
228
+ return ''
229
+ }
230
+ },
231
+ // 查询配置文件Json
232
+ queryParamsJson: {
233
+ type: Object,
234
+ default: null
235
+ },
236
+ // 固定查询表单
237
+ fixedQueryForm: {
238
+ type: Object,
239
+ default: () => {
240
+ return {}
241
+ }
242
+ },
243
+ // 数据只有一页时是否展示分页,true:展示,auto:隐藏
244
+ showPagination: {
245
+ type: Boolean,
246
+ default: true
247
+ },
248
+ // 是否自定义删除功能
249
+ customDelete: {
250
+ type: Boolean,
251
+ default: false
252
+ },
253
+ // 自适应底部编剧
254
+ extraHeight: {
255
+ type: Number,
256
+ default: 80
257
+ }
258
+ },
259
+ computed: {
260
+ rowSelection () {
261
+ return {
262
+ selectedRowKeys: this.selectedRowKeys,
263
+ onChange: this.onSelectChange,
264
+ getCheckboxProps: record => ({
265
+ props: {
266
+ disabled: this.selectedDisableRows.includes(record[this.rowKey]), // Column configuration not to be checked
267
+ name: record.name,
268
+ },
269
+ }),
270
+ }
271
+ },
272
+ ...mapState('account', { currUser: 'user' }),
273
+ ...mapState('setting', ['compatible'])
274
+ },
275
+ mounted () {
276
+ this.setScrollYHeight({}) // 初始化时也调用一次,确保加载时高度正确
277
+ window.addEventListener('resize', this.handleResize)
278
+ },
279
+ beforeDestroy () {
280
+ window.removeEventListener('resize', this.handleResize)
281
+ },
282
+ methods: {
283
+ handleResize () {
284
+ debounce(() => {
285
+ this.setScrollYHeight({})
286
+ }, 100)()
287
+ },
288
+ isInAModal () {
289
+ let parent = this.$parent
290
+ while (parent) {
291
+ // 检查组件名称,这里假设a-modal组件的名称为AModal,根据实际情况可能需要调整
292
+ if (parent.$options.name === 'AModal') {
293
+ return true
294
+ }
295
+ parent = parent.$parent
296
+ }
297
+ return false
298
+ },
299
+ executeStrFunction,
300
+ /**
301
+ * 初始化表格参数
302
+ */
303
+ init (params) {
304
+ const {
305
+ // 查询参数对象, 用于没有对应查询配置文件名时
306
+ queryParams,
307
+ tableColumns,
308
+ buttonState,
309
+ title,
310
+ form,
311
+ serviceName,
312
+ viewMode,
313
+ env = 'prod'
314
+ } = params
315
+ this.queryParams = queryParams
316
+ this.tableColumns = JSON.parse(JSON.stringify(tableColumns))
317
+ if (this.tableColumns.length === 0) {
318
+ return
319
+ }
320
+ this.buttonState = buttonState
321
+ this.title = title
322
+ this.serviceName = serviceName
323
+ this.viewMode = viewMode
324
+ this.env = env
325
+ this.rowKey = this.tableColumns[0].dataIndex
326
+ let totalWidth = 0
327
+ for (let i = 0; i < this.tableColumns.length; i++) {
328
+ const item = this.tableColumns[i]
329
+ // 设置操作列
330
+ if (item.slotType === 'action') {
331
+ item.fixed = 'right'
332
+ item.width = 70
333
+ }
334
+ // 设置表格宽度
335
+ if (item.width) {
336
+ totalWidth = totalWidth + item.width
337
+ } else {
338
+ totalWidth = totalWidth + 180
339
+ }
340
+ }
341
+ // 横向滚动长度大于所有宽度,才能实现固定表头
342
+ this.scrollXWidth = totalWidth
343
+ // 加载筛选列完成
344
+ this.columnSelectLoaded = true
345
+ this.setQueryForm(form || {})
346
+ },
347
+ /**
348
+ * 加载表格数据
349
+ * @param requestParameters 请求参数
350
+ */
351
+ loadTableData (requestParameters) {
352
+ let result = {}
353
+ if (this.queryParamsJson) {
354
+ if (this.queryParamsJson.tableName.startsWith('##')) {
355
+ this.isTableTemp = true
356
+ result = this.initTempTable(requestParameters)
357
+ }
358
+ }
359
+ if (!this.isTableTemp) {
360
+ result = query(Object.assign(requestParameters, { userId: this.currUser?.id }), this.serviceName, this.env === 'dev')
361
+ }
362
+ this.clearRowKeys()
363
+ this.$emit('afterQuery', result, requestParameters.conditionParams)
364
+ // 设置表格高度为固定值
365
+ this.setScrollYHeight({ type: 'default' })
366
+ return result
367
+ },
368
+ /**
369
+ * 操作列事件
370
+ * @param record 本条数据
371
+ * @param actionType 操作类型
372
+ * @param func 事件默认 action
373
+ */
374
+ action (record, actionType, func = 'action') {
375
+ this.$emit('action', record, record[this.getPrimaryKeyName()], actionType, func)
376
+ },
377
+ /**
378
+ * 选择列事件
379
+ * @param selectedRowKeys 被选择的列Key集合
380
+ * @param selectedRows 被选择的列集合
381
+ */
382
+ onSelectChange (selectedRowKeys, selectedRows) {
383
+ this.selectedRowKeys = selectedRowKeys
384
+ this.selectedRows = selectedRows
385
+ this.isModify = this.selectedRowKeys.length === 1
386
+ this.isDelete = this.selectedRowKeys.length > 0
387
+ this.$emit('selectRow', selectedRowKeys, selectedRows)
388
+ },
389
+ /**
390
+ * 清除表格选中项
391
+ */
392
+ clearRowKeys () {
393
+ this.$refs.table.clearSelected()
394
+ },
395
+ /**
396
+ * 为表格附加查询条件
397
+ */
398
+ setQueryForm (form = {}) {
399
+ this.form = form
400
+ this.refresh(true)
401
+ },
402
+ /**
403
+ * 表格重新加载方法
404
+ * 如果参数为 true, 则强制刷新到第一页
405
+ */
406
+ refresh (bool) {
407
+ this.$nextTick(() => {
408
+ this.$refs.table.refresh(bool)
409
+ })
410
+ },
411
+ setScrollYHeight ({ extraHeight = this.extraHeight, id = this.uniqueId, type = '' }) {
412
+ this.$nextTick(() => {
413
+ if (typeof extraHeight == 'undefined') {
414
+ // 默认底部分页32 + 边距48
415
+ extraHeight = 48 + 32
416
+ }
417
+ let tHeader = null
418
+ if (id) {
419
+ tHeader = document.getElementById(id) ? document.getElementById(id).getElementsByClassName('ant-table-thead')[0] : null
420
+ } else {
421
+ tHeader = document.getElementsByClassName('ant-table-thead')[0]
422
+ }
423
+ // 表格内容距离顶部的距离
424
+ let tHeaderBottom = 0
425
+ if (tHeader) {
426
+ tHeaderBottom = tHeader.getBoundingClientRect().bottom
427
+ }
428
+ if (tHeaderBottom === 0) {
429
+ this.scrollYHeight = 'calc(100vh - 31rem)'
430
+ if (window.__MICRO_APP_ENVIRONMENT__) {
431
+ this.scrollYHeight = 'calc(100vh - 28.5rem)'
432
+ }
433
+ return
434
+ }
435
+
436
+ // 判断是否在 modal 中
437
+ if (this.isInAModal()) {
438
+ const modalElement = document.querySelector('.ant-modal-content') // Adjust the selector as needed
439
+ if (modalElement) {
440
+ const modalRect = modalElement.getBoundingClientRect()
441
+ // 24 是 modal 通常的边距
442
+ extraHeight = window.innerHeight - modalRect.bottom + modalRect.top + 80 + 24
443
+ }
444
+ }
445
+ // 窗体高度-表格内容顶部的高度-表格内容底部的高度
446
+ // this.scrollYHeight = document.body.clientHeight - tHeaderBottom - extraHeight
447
+ this.scrollYHeight = `calc(100vh - ${tHeaderBottom + extraHeight}px)`
448
+ })
449
+ },
450
+ /**
451
+ * 格式化日期
452
+ * @param date 日期字符串
453
+ * @param format 格式化方式
454
+ */
455
+ format (date, format) {
456
+ return formatDate(date, format)
457
+ },
458
+ /**
459
+ * 获取主键列名称
460
+ */
461
+ getPrimaryKeyName () {
462
+ return this.tableColumns[0].dataIndex
463
+ },
464
+ // 导出选中或本页数据
465
+ handleExport (isSelected) {
466
+ const tHeader = this.tableColumns.filter(res => res.slotType !== 'action').map(res => res.title)
467
+ const filterVal = this.tableColumns.map(res => res.dataIndex)
468
+ let exportData
469
+ if (isSelected) {
470
+ exportData = this.selectedRows
471
+ } else {
472
+ exportData = this.$refs.table.localDataSource
473
+ }
474
+ exportJson(tHeader, exportData.map(v => filterVal.map(j => v[j])), this.title + `数据_${new Date().toLocaleString()}`)
475
+ },
476
+ // 导出符合条件的数据
477
+ handleExportByQuery () {
478
+ const that = this
479
+ const conditionParams = Object.assign(that.form, that.fixedQueryForm)
480
+ this.$confirm({
481
+ title: '是否确认导出?',
482
+ content: '此操作将导出当前条件下所有数据而非选中数据',
483
+ onOk () {
484
+ exportData({
485
+ queryParamsName: that.queryParamsName,
486
+ queryParams: that.queryParams,
487
+ form: conditionParams,
488
+ userId: that.currUser.id
489
+ }, that.serviceName, that.env === 'dev').then(res => {
490
+ let value = res
491
+ if (that.compatible === 'V4') {
492
+ value = res.value
493
+ }
494
+ window.open('/res/excel/export/' + value)
495
+ })
496
+ },
497
+ onCancel () {
498
+ }
499
+ })
500
+ },
501
+ // 新增业务
502
+ add () {
503
+ this.$emit('add')
504
+ },
505
+ // 编辑业务
506
+ edit (id) {
507
+ this.editLoading = true
508
+ this.getEditData(id).then(modifyModelData => {
509
+ this.$emit('edit', modifyModelData)
510
+ this.editLoading = false
511
+ })
512
+ },
513
+ // 获取被编辑的数据
514
+ getEditData (id) {
515
+ const requestParameters = {
516
+ queryParamsName: this.queryParamsName,
517
+ queryParams: this.queryParams,
518
+ conditionParams: {},
519
+ pageNo: 1,
520
+ pageSize: 1
521
+ }
522
+ if (!id) {
523
+ this.selectId = this.selectedRowKeys[0]
524
+ } else {
525
+ this.selectId = id
526
+ }
527
+ const primaryKeyName = this.getPrimaryKeyName()
528
+ requestParameters.conditionParams[primaryKeyName] = this.selectId
529
+ requestParameters.f_businessid = this.selectId
530
+ if (this.isTableTemp) {
531
+ this.$emit('tempTableEdit', requestParameters)
532
+ return
533
+ }
534
+ return queryWithResource(requestParameters, this.serviceName, this.env === 'dev').then(res => {
535
+ // 将更新需要的主键值加入到primaryKeyData中
536
+ const primaryKeyData = {}
537
+ primaryKeyData[primaryKeyName] = this.selectId
538
+ return { data: res.data[0], primaryKeyData: primaryKeyData, images: res.images, files: res.files }
539
+ })
540
+ },
541
+ // 删除业务
542
+ deleteItem () {
543
+ if (this.viewMode) {
544
+ this.$message.info('预览模式禁止删除')
545
+ return
546
+ }
547
+ Modal.confirm({
548
+ title: '提示',
549
+ content: '您本次要删除共' + this.selectedRowKeys.length + '条数据,确定操作吗?',
550
+ zIndex: 1001,
551
+ onOk: () => {
552
+ return new Promise((resolve, reject) => {
553
+ if (this.customDelete) {
554
+ this.$emit('del', this.selectedRows, resolve)
555
+ } else {
556
+ const requestParameters = {
557
+ queryParamsName: this.queryParamsName,
558
+ idList: this.selectedRowKeys
559
+ }
560
+ remove(requestParameters, this.serviceName, this.env === 'dev').then(res => {
561
+ resolve(res)
562
+ this.$message.success('删除成功!')
563
+ this.refresh(true)
564
+ // afterDelete
565
+ this.$emit('afterDelete', requestParameters)
566
+ }).catch(e => {
567
+ reject(e)
568
+ this.$message.error('删除失败!')
569
+ })
570
+ }
571
+ })
572
+ },
573
+ onCancel () {
574
+ }
575
+ })
576
+ },
577
+ // 导入业务
578
+ importData () {
579
+ this.$refs.importExcel.importExcelHandleOpen()
580
+ },
581
+ // 初始化临时表
582
+ async initTempTable (json) {
583
+ await this.createTempTable(this.queryParamsJson)
584
+ await this.insertTempTableData(this.queryParamsJson)
585
+ let result = {}
586
+ await post(CommonTempTable.initApplySubTable, {
587
+ define: json
588
+ }).then(res => {
589
+ console.log('子表临时表已创建')
590
+ result = res
591
+ })
592
+ return result
593
+ },
594
+ // 创建临时表sql生成
595
+ createTempTable (defineJson) {
596
+ const tableName = defineJson.tableName
597
+ const define = defineJson.column
598
+ return post(CommonTempTable.createTempTable, {
599
+ define: define,
600
+ tableName: tableName
601
+ }).then(res => {
602
+ return res
603
+ }, err => {
604
+ console.log(err)
605
+ })
606
+ },
607
+ // 插入临时表数据sql生成
608
+ insertTempTableData (defineJson) {
609
+ const tableName = defineJson.tableName
610
+ const params = {}
611
+ params.define = defineJson.column
612
+ params.applyId = defineJson.applyId
613
+ params.stepName = defineJson.stepName
614
+ params.tableName = tableName
615
+ return post(CommonTempTable.insertDataToTempTable, {
616
+ tempTableData: params
617
+ }).then(res => {
618
+ return res
619
+ })
620
+ }
621
+ }
622
+ }
623
+ </script>
624
+ <style lang="less" scoped>
625
+ :deep(.ant-table-thead > tr > th) {
626
+ font-weight: 600;
627
+ }
628
+
629
+ :deep(.ant-table-pagination.ant-pagination) {
630
+ margin-bottom: 0;
631
+ }
632
+
633
+ :deep(.ant-table td) {
634
+ white-space: nowrap;
635
+ }
636
+ </style>