@bytenew/bn-bus-ui 1.1.461 → 1.1.463

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 (167) hide show
  1. package/install.js +134 -0
  2. package/package.json +20 -4
  3. package/packages/BnAddress/index.vue +141 -0
  4. package/packages/BnAddressParse/index.vue +75 -0
  5. package/packages/BnAdvancedFilter/BnFilterView.vue +145 -0
  6. package/packages/BnAdvancedFilter/index.vue +345 -0
  7. package/packages/BnAdvancedFilter/util.js +171 -0
  8. package/packages/BnCascader/BnCascader.vue +543 -0
  9. package/packages/BnCascader/BnCascaderPanel.vue +1331 -0
  10. package/packages/BnCascader/cascaderDisplay.js +102 -0
  11. package/packages/BnCheck/BnCheck.vue +253 -0
  12. package/packages/BnColumnConfig/columnConfigDialog.vue +134 -0
  13. package/packages/BnColumnConfig/component/childrenFormSetting/assocTable.vue +143 -0
  14. package/packages/BnColumnConfig/component/childrenFormSetting/assocTableSearch.vue +314 -0
  15. package/packages/BnColumnConfig/component/childrenFormSetting/index.vue +243 -0
  16. package/packages/BnColumnConfig/component/defaultSet/defaultSet.vue +114 -0
  17. package/packages/BnColumnConfig/component/defaultSet/stringDefault.vue +210 -0
  18. package/packages/BnColumnConfig/component/funcExprDialog/funcExprDialog.vue +126 -0
  19. package/packages/BnColumnConfig/component/packageFilter/index.vue +141 -0
  20. package/packages/BnColumnConfig/component/paraExplainSet/index.vue +156 -0
  21. package/packages/BnColumnConfig/component/setOption/setOption.vue +321 -0
  22. package/packages/BnColumnConfig/component/setRelationOption/ConditionList.vue +277 -0
  23. package/packages/BnColumnConfig/component/setRelationOption/LevelHeader.vue +144 -0
  24. package/packages/BnColumnConfig/component/setRelationOption/setRelationOption.vue +642 -0
  25. package/packages/BnColumnConfig/data.js +129 -0
  26. package/packages/BnColumnConfig/index.scss +23 -0
  27. package/packages/BnColumnConfig/index.vue +309 -0
  28. package/packages/BnCondVal/BnCondVal.vue +112 -0
  29. package/packages/BnCondVal/itemVal/dateRegVal.vue +39 -0
  30. package/packages/BnCondVal/itemVal/dateVal.vue +39 -0
  31. package/packages/BnCondVal/itemVal/numRegVal.vue +67 -0
  32. package/packages/BnCondVal/itemVal/numVal.vue +44 -0
  33. package/packages/BnCondVal/itemVal/relationVal.vue +73 -0
  34. package/packages/BnCondVal/itemVal/selectColumnVal.vue +58 -0
  35. package/packages/BnCondVal/itemVal/selectVal.vue +59 -0
  36. package/packages/BnCondVal/itemVal/stringVal.vue +156 -0
  37. package/packages/BnCondition/index.vue +551 -0
  38. package/packages/BnCondition/util.js +232 -0
  39. package/packages/BnDatePicker/BnDatePicker.vue +194 -0
  40. package/packages/BnDrop/BnDrop.vue +917 -0
  41. package/packages/BnEmptyTip/BnEmptyTip.vue +107 -0
  42. package/packages/BnExportOrder/BnExportOrder.vue +241 -0
  43. package/packages/BnExportOrder/validatorCode.vue +94 -0
  44. package/packages/BnFileView/BnFileView.vue +271 -0
  45. package/packages/BnFileView/FileDetail.vue +125 -0
  46. package/packages/BnFileView/videoPreview.vue +70 -0
  47. package/packages/BnFilterOption/BnFilterOption.vue +160 -0
  48. package/packages/BnFunExpr/BnFunExpr.vue +608 -0
  49. package/packages/BnImportOrder/BnImportOrder.vue +323 -0
  50. package/packages/BnImportTemplate/BnImportTemplate.vue +866 -0
  51. package/packages/BnImportTemplate/assets/merge_tip_img.png +0 -0
  52. package/packages/BnImportTemplate/assets/sheet_tip.png +0 -0
  53. package/packages/BnImportTemplate/assets/xls.png +0 -0
  54. package/packages/BnImportTemplate/components/ImportTemplateTrigger.vue +198 -0
  55. package/packages/BnImportTemplate/components/TemplateEditDialog.vue +340 -0
  56. package/packages/BnImportTemplate/components/TemplateFieldsConfig.vue +401 -0
  57. package/packages/BnImportTemplate/components/TemplateListDialog.vue +297 -0
  58. package/packages/BnInpNum/BnInpNum.vue +165 -0
  59. package/packages/BnMenus/BnMenus.vue +502 -0
  60. package/packages/BnMenus/MenuItem.vue +321 -0
  61. package/packages/BnOrderCard/BnOrderCard.vue +389 -0
  62. package/packages/BnOrderCard/orderRemark.vue +178 -0
  63. package/packages/BnOrderCard/util.js +94 -0
  64. package/packages/BnOrderDetail/BnOrderDetail.vue +338 -0
  65. package/packages/BnOrderDetail/filterLogByUser.vue +108 -0
  66. package/packages/BnOrderDetail/orderLogs.vue +53 -0
  67. package/packages/BnOrderDetail/showSubForm/index.vue +41 -0
  68. package/packages/BnOrderDetail/showSubForm/showChildTable.vue +61 -0
  69. package/packages/BnOrderDetail/showSubForm/showTimeLine.vue +131 -0
  70. package/packages/BnOrderDetail/showSubForm/tableCellCopy.vue +84 -0
  71. package/packages/BnOrderShare/index.vue +378 -0
  72. package/packages/BnOrderShare/shareUrlInp.vue +54 -0
  73. package/packages/BnRadio/BnRadio.vue +181 -0
  74. package/packages/BnRelation/BnRelation.vue +120 -0
  75. package/packages/BnSelect/BnSelect.vue +485 -0
  76. package/packages/BnSmartForm/BnBatchForm.vue +334 -0
  77. package/packages/BnSmartForm/BnBatchFormDialog.vue +423 -0
  78. package/packages/BnSmartForm/BnSmartElf/elfLog/index.vue +57 -0
  79. package/packages/BnSmartForm/BnSmartElf/index.vue +95 -0
  80. package/packages/BnSmartForm/BnSmartFormPsychic.js +629 -0
  81. package/packages/BnSmartForm/BnSmartFormUtil.js +524 -0
  82. package/packages/BnSmartForm/addressForm/index.vue +73 -0
  83. package/packages/BnSmartForm/checkboxForm/index.vue +99 -0
  84. package/packages/BnSmartForm/childrenForm/childFormFile.vue +237 -0
  85. package/packages/BnSmartForm/childrenForm/childrenFormBody.vue +260 -0
  86. package/packages/BnSmartForm/childrenForm/index.vue +110 -0
  87. package/packages/BnSmartForm/childrenForm/searchInventory.vue +115 -0
  88. package/packages/BnSmartForm/chooseAssocTable/chooseAssocTable.vue +451 -0
  89. package/packages/BnSmartForm/chooseAssocTable/chooseChildGood.vue +229 -0
  90. package/packages/BnSmartForm/chooseAssocTable/tableCellCopy.vue +84 -0
  91. package/packages/BnSmartForm/chooseChildOrder/chooseChildOrder.vue +158 -0
  92. package/packages/BnSmartForm/chooseIPaasData/chooseIPaasData.vue +307 -0
  93. package/packages/BnSmartForm/chooseIPaasData/tableCellCopy.vue +84 -0
  94. package/packages/BnSmartForm/choosePackage/choosePackage.vue +361 -0
  95. package/packages/BnSmartForm/dateDualForm/index.vue +37 -0
  96. package/packages/BnSmartForm/dateForm/index.vue +38 -0
  97. package/packages/BnSmartForm/fileForm/fileFormData.js +50 -0
  98. package/packages/BnSmartForm/fileForm/index.vue +240 -0
  99. package/packages/BnSmartForm/formItemFooter/formItemFooter.vue +38 -0
  100. package/packages/BnSmartForm/formItemTop/formItemTop.vue +42 -0
  101. package/packages/BnSmartForm/index.vue +1201 -0
  102. package/packages/BnSmartForm/numberForm/index.vue +63 -0
  103. package/packages/BnSmartForm/radioForm/index.vue +72 -0
  104. package/packages/BnSmartForm/receiveForm/index.vue +112 -0
  105. package/packages/BnSmartForm/relationForm/index.vue +82 -0
  106. package/packages/BnSmartForm/scoreForm/index.vue +39 -0
  107. package/packages/BnSmartForm/selectForm/index.vue +55 -0
  108. package/packages/BnSmartForm/showValForm/index.vue +42 -0
  109. package/packages/BnSmartForm/showValForm/showValFormTable.vue +104 -0
  110. package/packages/BnSmartForm/smartFormsCommon.scss +43 -0
  111. package/packages/BnSmartForm/stringForm/index.vue +170 -0
  112. package/packages/BnVirtPopover/index.vue +319 -0
  113. package/packages/BnWebLog/BnWebLog.vue +140 -0
  114. package/packages/BnWorkSettingDrop/advancedOptions.js +112 -0
  115. package/packages/BnWorkSettingDrop/benBenAIUtil.js +89 -0
  116. package/packages/BnWorkSettingDrop/index.vue +292 -0
  117. package/packages/font/iconfont.css +243 -0
  118. package/packages/font/iconfont.ttf +0 -0
  119. package/packages/font/iconfont.woff +0 -0
  120. package/packages/font/iconfont.woff2 +0 -0
  121. package/utils/addressParse-old.js +645 -0
  122. package/utils/addressParse.js +735 -0
  123. package/utils/config.js +68 -0
  124. package/utils/index.js +1171 -0
  125. package/dist/assocTableSearch-C14i_zJO.js +0 -349
  126. package/dist/assocTableSearch.css +0 -1
  127. package/dist/bn-bus-ui.es.js +0 -65
  128. package/dist/bn-bus-ui.umd.js +0 -49
  129. package/dist/chooseIPaasData-Cl_5qkFA.js +0 -391
  130. package/dist/chooseIPaasData.css +0 -1
  131. package/dist/defaultSet-I4xpf8a4.js +0 -297
  132. package/dist/defaultSet.css +0 -1
  133. package/dist/fileFormData-D_Q1vylE.js +0 -53
  134. package/dist/formItemFooter-CTA7rDtV.js +0 -108
  135. package/dist/formItemFooter.css +0 -1
  136. package/dist/funcExprDialog-Cm5BiRM3.js +0 -139
  137. package/dist/funcExprDialog.css +0 -1
  138. package/dist/index-B6b4uj8v.js +0 -51
  139. package/dist/index-BWdkDTbz.js +0 -109
  140. package/dist/index-BdZ1zOap.js +0 -89
  141. package/dist/index-BdzNjjMC.js +0 -64
  142. package/dist/index-BfpZqab2.js +0 -66
  143. package/dist/index-BmkiB4hr.js +0 -66
  144. package/dist/index-Br1sqCoo.js +0 -58
  145. package/dist/index-C9qrl-yc.js +0 -183
  146. package/dist/index-CXFJXCn5.js +0 -746
  147. package/dist/index-DF114jZq.js +0 -135
  148. package/dist/index-DFPfZ_Il.js +0 -178
  149. package/dist/index-DSEtu7TN.js +0 -44
  150. package/dist/index-Did0UUWV.js +0 -221
  151. package/dist/index-DrPj-tmI.js +0 -45
  152. package/dist/index-DzDf9s2W.js +0 -89
  153. package/dist/index-LnjudNEI.js +0 -118
  154. package/dist/index-ObCfCmDT.js +0 -45
  155. package/dist/index.css +0 -1
  156. package/dist/index2.css +0 -1
  157. package/dist/index3.css +0 -1
  158. package/dist/index4.css +0 -1
  159. package/dist/index5.css +0 -1
  160. package/dist/index6.css +0 -1
  161. package/dist/index7.css +0 -1
  162. package/dist/install-C-scqkds.js +0 -23103
  163. package/dist/install.css +0 -1
  164. package/dist/setOption-CSnWzOny.js +0 -329
  165. package/dist/setOption.css +0 -1
  166. package/dist/setRelationOption-CJcHdfaa.js +0 -5217
  167. package/dist/setRelationOption.css +0 -1
@@ -0,0 +1,866 @@
1
+ <template>
2
+ <div class="BnImportTemplate">
3
+ <!-- 导入模板触发器 -->
4
+ <ImportTemplateTrigger
5
+ v-model="importTaskVisible"
6
+ :import-template-list="importTemplateList"
7
+ @showTemplatePopover="getImportTemplageData"
8
+ @openTemplateList="openTemplateList"
9
+ @selectTemplate="openImportOrderByTemplate"
10
+ >
11
+ <template #icon>
12
+ <slot name="icon" />
13
+ </template>
14
+ </ImportTemplateTrigger>
15
+
16
+ <!-- 批量导入弹窗 -->
17
+ <BnImportOrder
18
+ ref="importOrder"
19
+ :post-func="postFunc"
20
+ :post-data="importOrderPostData"
21
+ />
22
+ <!-- 导入模板列表弹窗 -->
23
+ <TemplateListDialog
24
+ v-model="templateListModalShow"
25
+ v-model:page-num="pageNum"
26
+ v-model:page-size="pageSize"
27
+ :modal-list-data="modalListData"
28
+ :loading="listLoading"
29
+ :total="total"
30
+ @addTemplate="addTemplate"
31
+ @editTemplate="editTemplate"
32
+ @copyTemplate="copyThisTemplate"
33
+ @deleteTemplate="deleteThisTemplate"
34
+ @pageChange="getTemplateList"
35
+ @sizeChange="getTemplateList"
36
+ />
37
+ <!-- 编辑导入模板弹窗 -->
38
+ <TemplateEditDialog
39
+ v-model="templateEditShow"
40
+ v-model:filter-var="filterVar"
41
+ v-model:all-show="allShow"
42
+ v-model:all-check-must="allCheckMust"
43
+ v-model:all-key="allKey"
44
+ :loading="editLoading"
45
+ :modal-detail="modalDetail"
46
+ :edit-column-list="editColumnList"
47
+ :is-workflow="isWorkflowTable"
48
+ :sheet-tip-img="sheetTipImg"
49
+ @opened="setEditData"
50
+ @closed="clearEditData"
51
+ @validateSheetName="validateSheetName"
52
+ @checkAllShow="checkAllShow"
53
+ @checkAllCheckMust="checkAllCheckMust"
54
+ @checkAllKey="checkAllKey"
55
+ @itemCheckChange="itemCheckChange"
56
+ @toggleChild="showOrCloseChildList"
57
+ @confirm="editImportModal"
58
+ />
59
+ </div>
60
+ </template>
61
+
62
+ <script>
63
+ import { cloneDeep } from "lodash";
64
+ import ImportTemplateTrigger from "./components/ImportTemplateTrigger.vue";
65
+ import TemplateListDialog from "./components/TemplateListDialog.vue";
66
+ import TemplateEditDialog from "./components/TemplateEditDialog.vue";
67
+ import BnImportOrder from "../BnImportOrder/BnImportOrder.vue";
68
+ import sheetTipImg from "./assets/sheet_tip.png";
69
+
70
+ // 组件库脱离 bytenew-app-html 的 Vuex store 使用,默认值必须是真实后端接口。
71
+ // 带 {xxx} 的路径会在 request 前由 resolvePath 按当前请求参数替换。
72
+ const defaultPaths = {
73
+ // 查询导入模板管理列表。
74
+ list: "/excelImportTemplate/{appId}/{tableId}/{pageNum}/{pageSize}?source={source}",
75
+ // 查询单个导入模板详情,编辑模板前先拉取完整字段配置。
76
+ detail: "/excelImportTemplate/info/{tableId}/{appId}/{templateId}",
77
+ // 新增或编辑导入模板,后端根据 body 中是否存在 id 区分新增/更新。
78
+ edit: "/excelImportTemplate/edit/{tableId}/{appId}",
79
+ // 删除指定导入模板。
80
+ delete: "/excelImportTemplate/delete/{tableId}/{appId}",
81
+ // 复制指定导入模板。
82
+ copy: "/excelImportTemplate/copy/{tableId}/{appId}",
83
+ };
84
+
85
+ export default {
86
+ name: "BnImportTemplate",
87
+ components: {
88
+ ImportTemplateTrigger,
89
+ BnImportOrder,
90
+ TemplateListDialog,
91
+ TemplateEditDialog,
92
+ },
93
+ props: {
94
+ // 外部传入的统一请求函数,组件内部会调用 postFunc(url, data, method) 发起所有业务接口。
95
+ postFunc: Function,
96
+ // 工作表基础查询参数,组件会基于 appId/tableId/tableCode 自行拉取工作表字段。
97
+ postData: {
98
+ type: Object,
99
+ default() {
100
+ return {
101
+ tableCode: "",
102
+ appId: "",
103
+ tableId: "",
104
+ };
105
+ },
106
+ },
107
+ },
108
+ emits: [
109
+ // Popover 模板名称列表接口成功返回后抛出,外部可获取当前模板列表。
110
+ "templateList",
111
+ // 新增或编辑模板成功后抛出。
112
+ "templateEdit",
113
+ // 删除模板成功后抛出。
114
+ "templateDelete",
115
+ // 复制模板成功后抛出。
116
+ "templateCopy",
117
+ ],
118
+ data() {
119
+ return {
120
+ // Sheet 名称说明图,传给模板编辑弹窗内的提示气泡展示。
121
+ sheetTipImg,
122
+ // 导入入口 Popover 显隐状态,控制导入按钮右侧模板选择浮层。
123
+ importTaskVisible: false,
124
+ // Popover 中展示的自定义导入模板名称列表,点击模板名称可打开批量导入弹框并预选模板。
125
+ importTemplateList: [],
126
+ // Popover 模板名称列表分页信息,使用较大 pageSize 一次拉取更多模板名称。
127
+ itPagination: {
128
+ // Popover 模板名称列表每页条数。
129
+ pageSize: 80,
130
+ // Popover 模板名称列表当前页码。
131
+ pageNum: 1,
132
+ // Popover 模板名称列表总条数。
133
+ total: 0,
134
+ // Popover 模板名称列表总页数。
135
+ totalPageNum: 1,
136
+ },
137
+ // 模板管理列表弹窗显隐状态。
138
+ templateListModalShow: false,
139
+ // 模板管理列表数据。
140
+ modalListData: [],
141
+ // 模板管理列表 loading。
142
+ listLoading: false,
143
+ // 模板管理列表当前页码。
144
+ pageNum: 1,
145
+ // 模板管理列表每页条数。
146
+ pageSize: 10,
147
+ // 模板管理列表总条数。
148
+ total: 0,
149
+ // 新增/编辑模板弹窗显隐状态。
150
+ templateEditShow: false,
151
+ // 新增/编辑模板提交 loading。
152
+ editLoading: false,
153
+ // 当前正在编辑的模板详情,新增时使用空模板结构。
154
+ modalDetail: this.getEmptyModalDetail(),
155
+ // 模板字段配置列表,编辑弹窗内的勾选、筛选、全选都会基于该数组更新。
156
+ editColumnList: [],
157
+ // 字段筛选关键字,用于在模板编辑弹窗中快速过滤字段。
158
+ filterVar: "",
159
+ // “是否导入”列的全选状态。
160
+ allShow: false,
161
+ // “必填校验”列的全选状态。
162
+ allCheckMust: false,
163
+ // “相同合并”列的全选状态。
164
+ allKey: false,
165
+ // 组件内部通过 postData 拉取并整理出的工作表上下文。
166
+ innerProjectInfo: {},
167
+ };
168
+ },
169
+ computed: {
170
+ /**
171
+ * 获取当前组件使用的真实接口路径集合,集中放在计算属性中方便模板和方法统一读取。
172
+ *
173
+ * @return 导入模板相关接口路径配置。
174
+ */
175
+ mergedPaths() {
176
+ return defaultPaths;
177
+ },
178
+ /**
179
+ * 获取当前工作表 ID;兼容 tableId 和旧业务里等价的 id 字段。
180
+ *
181
+ * @return 当前工作表 ID。
182
+ */
183
+ tableId() {
184
+ return this.innerProjectInfo?.tableId || this.innerProjectInfo?.id || this.postData?.tableId || "";
185
+ },
186
+ /**
187
+ * 获取当前应用 ID,模板列表、详情、编辑、删除、复制和下载接口都会用到。
188
+ *
189
+ * @return 当前应用 ID。
190
+ */
191
+ appId() {
192
+ return this.innerProjectInfo?.appId || this.postData?.appId || "";
193
+ },
194
+ /**
195
+ * 获取当前工作表字段配置,新增模板时会基于 columns 生成可勾选的导入字段。
196
+ *
197
+ * @return 当前工作表字段配置数组。
198
+ */
199
+ worksheetComponents() {
200
+ return Array.isArray(this.innerProjectInfo?.columns) ? this.innerProjectInfo.columns : [];
201
+ },
202
+ /**
203
+ * 判断当前工作表是否为工作流表;工作流表隐藏更新类导入方式。
204
+ *
205
+ * @return 当前工作表是否为工作流表。
206
+ */
207
+ isWorkflowTable() {
208
+ return this.innerProjectInfo?.isWorkflow === true || `${this.innerProjectInfo?.workFlowTable}` === "1";
209
+ },
210
+ /**
211
+ * 获取批量导入弹框使用的基础请求参数,优先使用组件内部初始化后的工作表上下文。
212
+ *
213
+ * @return 批量导入组件使用的 postData。
214
+ */
215
+ importOrderPostData() {
216
+ return {
217
+ ...this.postData,
218
+ tableCode: this.innerProjectInfo?.tableCode || this.postData?.tableCode || "",
219
+ appId: this.appId,
220
+ tableId: this.tableId,
221
+ };
222
+ },
223
+ },
224
+ mounted() {
225
+ // 初始化组件内部工作表上下文。
226
+ this.initProjectInfo();
227
+ },
228
+ watch: {
229
+ /**
230
+ * 外部传入的工作表基础参数变化时,重新初始化组件内部工作表上下文。
231
+ *
232
+ * @return 无返回值。
233
+ */
234
+ postData: {
235
+ handler() {
236
+ this.initProjectInfo();
237
+ },
238
+ deep: true,
239
+ },
240
+ /**
241
+ * 导入方式变化时同步主键ID列、主键等字段规则。
242
+ *
243
+ * @return 无返回值。
244
+ */
245
+ "modalDetail.type"() {
246
+ this.handleImportTypeChange();
247
+ },
248
+ /**
249
+ * 合并多行设置变化时同步主键列可用状态和默认选中状态。
250
+ *
251
+ * @return 无返回值。
252
+ */
253
+ "modalDetail.mergeCells"() {
254
+ this.handleMergeCellsChange();
255
+ },
256
+ },
257
+ methods: {
258
+ /**
259
+ * 根据外部 postData 拉取工作表字段,并整理为组件内部工作表上下文。
260
+ *
261
+ * @return 请求完成后无显式返回值。
262
+ */
263
+ async initProjectInfo() {
264
+ if (!this.postFunc || !this.postData?.appId || !this.postData?.tableId || !this.postData?.tableCode) {
265
+ return;
266
+ }
267
+ const tableRes = await this.postFunc(`/biztable/definition/table?tableCode=${this.postData.tableCode}&columns=1`, null, "get");
268
+ const tableInfo = tableRes?.data || {};
269
+ this.innerProjectInfo = {
270
+ id: tableInfo.tableId || this.postData.tableId,
271
+ tableId: tableInfo.tableId || this.postData.tableId,
272
+ appId: tableInfo.appId || this.postData.appId,
273
+ tableCode: tableInfo.tableCode || this.postData.tableCode,
274
+ name: tableInfo.name || "",
275
+ columns: Array.isArray(tableInfo.columns) ? tableInfo.columns : [],
276
+ workFlowTable: tableInfo.workFlowTable || "0",
277
+ projectType: tableInfo.projectType || 10,
278
+ };
279
+ },
280
+ /**
281
+ * 获取新增模板时使用的空模板详情结构。
282
+ *
283
+ * @return 空模板详情对象。
284
+ */
285
+ getEmptyModalDetail() {
286
+ return {
287
+ templateName: "",
288
+ sheetName: "",
289
+ type: 1,
290
+ mergeCells: false,
291
+ columnList: [],
292
+ };
293
+ },
294
+ /**
295
+ * 生成所有导入模板接口都会依赖的基础请求参数。
296
+ *
297
+ * @return 包含 tableId 和 appId 的基础请求参数。
298
+ */
299
+ requestBaseData() {
300
+ return {
301
+ tableId: this.tableId,
302
+ appId: this.appId,
303
+ };
304
+ },
305
+ /**
306
+ * 将 /path/{tableId}/{appId} 这类路径模板替换成真实可请求 URL。
307
+ *
308
+ * @param path 带占位符的接口路径模板。
309
+ * @param data 用于替换路径占位符的参数对象。
310
+ * @return 替换占位符后的接口路径。
311
+ */
312
+ resolvePath(path, data = {}) {
313
+ if (typeof path !== "string") {
314
+ return path;
315
+ }
316
+ return path.replace(/\{(\w+)\}/g, (match, key) => {
317
+ const value = data?.[key];
318
+ if (value === undefined || value === null) {
319
+ return "";
320
+ }
321
+ return encodeURIComponent(value);
322
+ });
323
+ },
324
+ /**
325
+ * 查询导入模板名称列表,用于入口 Popover 展示当前工作表已有模板并支持点击导入。
326
+ *
327
+ * @return 请求完成后无显式返回值。
328
+ */
329
+ async getImportTemplageData() {
330
+ // Popover 打开时查询已新增的模板名称,列表项点击后会打开批量导入弹框。
331
+ const postData = {
332
+ tableId: this.tableId,
333
+ appId: this.appId,
334
+ pageNum: this.itPagination.pageNum,
335
+ pageSize: this.itPagination.pageSize,
336
+ source: "biztable",
337
+ };
338
+ const res = await this.postFunc(this.resolvePath(this.mergedPaths.list, postData), postData, "get");
339
+ if (!res?.code) {
340
+ const data = res.data || {};
341
+ this.itPagination = {
342
+ pageSize: this.itPagination.pageSize,
343
+ pageNum: data.pageNum || this.itPagination.pageNum,
344
+ total: data.total || 0,
345
+ totalPageNum: data.totalPageNum || 1,
346
+ };
347
+ this.importTemplateList = data.results || [];
348
+ this.$emit("templateList", this.importTemplateList, res);
349
+ }
350
+ },
351
+ /**
352
+ * 从入口 Popover 切换到自定义导入模板管理列表弹窗。
353
+ *
354
+ * @return 无返回值。
355
+ */
356
+ openTemplateList() {
357
+ this.importTaskVisible = false;
358
+ this.templateListModalShow = true;
359
+ this.getTemplateList(1);
360
+ },
361
+ /**
362
+ * 根据入口 Popover 中点击的模板打开批量导入弹框,并将该模板作为默认选中项。
363
+ *
364
+ * @param template 用户点击的导入模板项。
365
+ * @return 无返回值。
366
+ */
367
+ openImportOrderByTemplate(template) {
368
+ this.importTaskVisible = false;
369
+ this.$refs.importOrder?.open(template);
370
+ },
371
+ /**
372
+ * 查询模板管理弹窗中的分页列表数据。
373
+ *
374
+ * @param page 需要查询的页码;不传时使用当前页码。
375
+ * @return 请求完成后无显式返回值。
376
+ */
377
+ async getTemplateList(page) {
378
+ // 管理弹窗使用独立分页,不复用 Popover 的大分页,避免两个入口互相覆盖页码。
379
+ this.modalListData = [];
380
+ this.listLoading = true;
381
+ this.pageNum = page || this.pageNum;
382
+ const postData = {
383
+ tableId: this.tableId,
384
+ appId: this.appId,
385
+ pageNum: this.pageNum,
386
+ pageSize: this.pageSize,
387
+ source: "biztable",
388
+ };
389
+ const res = await this.postFunc(this.resolvePath(this.mergedPaths.list, postData), postData, "get");
390
+ this.listLoading = false;
391
+ if (!res?.code) {
392
+ this.total = res.data?.total || 0;
393
+ this.modalListData = res.data?.results || [];
394
+ }
395
+ },
396
+ /**
397
+ * 打开新增导入模板弹窗。
398
+ *
399
+ * @return 无返回值。
400
+ */
401
+ addTemplate() {
402
+ this.openEdit();
403
+ },
404
+ /**
405
+ * 拉取指定模板详情,并打开编辑弹窗回显模板配置。
406
+ *
407
+ * @param modalItem 列表中选中的模板行数据。
408
+ * @return 请求完成后无显式返回值。
409
+ */
410
+ async editTemplate(modalItem) {
411
+ const postData = {
412
+ tableId: this.tableId,
413
+ appId: this.appId,
414
+ templateId: modalItem.id,
415
+ };
416
+ const res = await this.postFunc(this.resolvePath(this.mergedPaths.detail, postData), postData, "get");
417
+ if (!res?.code) {
418
+ this.openEdit(res.data);
419
+ }
420
+ },
421
+ /**
422
+ * 打开新增/编辑弹窗,并在打开前过滤不可导入字段、初始化编辑数据。
423
+ *
424
+ * @param modalItem 待编辑的模板详情;不传表示新增模板。
425
+ * @return 无返回值。
426
+ */
427
+ openEdit(modalItem) {
428
+ this.templateListModalShow = false;
429
+ const needFilterIds = [1, 3, 4, 6, 8, 9];
430
+ let detail = modalItem;
431
+ if (!detail) {
432
+ // 新增模板时从工作表字段生成初始列配置,并过滤掉创建人、状态等不允许导入的系统字段。
433
+ detail = this.worksheetComponents.filter(item => !needFilterIds.includes(item.id));
434
+ } else if (detail.columnList) {
435
+ // 编辑模板也要再过滤一次,兼容旧模板数据中残留了不可导入字段的情况。
436
+ detail = cloneDeep(detail);
437
+ detail.columnList = detail.columnList.filter(item => !needFilterIds.includes(item.columnId || item.id));
438
+ }
439
+ this.prepareEditData(detail);
440
+ this.templateEditShow = true;
441
+ },
442
+ /**
443
+ * 将后端模板详情或工作表字段数组整理成编辑弹窗需要的 modalDetail 和 editColumnList。
444
+ *
445
+ * @param detail 后端模板详情对象,或新增模板时的工作表字段数组。
446
+ * @return 无返回值。
447
+ */
448
+ prepareEditData(detail) {
449
+ // detail 可能来自后端模板详情,也可能是新增时的工作表字段数组;这里统一成编辑弹窗可消费的数据结构。
450
+ this.modalDetail = this.getEmptyModalDetail();
451
+ if (detail && detail.id) {
452
+ this.modalDetail = {
453
+ ...this.getEmptyModalDetail(),
454
+ ...cloneDeep(detail),
455
+ mergeCells: Boolean(detail.mergeCells === 1 || detail.mergeCells === true),
456
+ };
457
+ } else if (Array.isArray(detail)) {
458
+ this.modalDetail.columnList = detail.map(item => this.formatColumnForEdit(item));
459
+ }
460
+ this.editColumnList = cloneDeep(this.modalDetail.columnList || []);
461
+ this.syncAllChecks();
462
+ },
463
+ /**
464
+ * 将工作表字段接口返回的字段对象整理为模板编辑字段。
465
+ *
466
+ * @param item 工作表字段接口返回的字段对象。
467
+ * @param options 需要覆盖的勾选状态。
468
+ * @return 模板编辑字段对象。
469
+ */
470
+ formatColumnForEdit(item, options = {}) {
471
+ const columnId = item.id;
472
+ const columnName = item.name || "";
473
+ const modalItem = {
474
+ behaviorType: item.behaviorType,
475
+ columnId,
476
+ columnName,
477
+ show: Boolean(options.show),
478
+ checkMust: Boolean(options.checkMust),
479
+ key: Boolean(options.key),
480
+ };
481
+ if (item.behaviorType === 13 && item.moduleDefinition?.length) {
482
+ // 子表单字段以 childColumns 形式挂在父字段下,方便字段配置组件做展开和父子联动。
483
+ modalItem.childColumns = item.moduleDefinition.map(mdItem => this.formatColumnForEdit(mdItem, {
484
+ ...options,
485
+ key: false,
486
+ parentColumn: columnId,
487
+ }));
488
+ }
489
+ if (options.parentColumn !== undefined) {
490
+ modalItem.parentColumn = options.parentColumn;
491
+ }
492
+ return modalItem;
493
+ },
494
+ /**
495
+ * 从工作表字段接口中获取主键ID字段,并套用更新导入的固定勾选规则。
496
+ *
497
+ * @param options 需要覆盖的勾选状态。
498
+ * @return 主键ID编辑字段对象。
499
+ */
500
+ getPrimaryIdColumnForEdit(options = {}) {
501
+ const primaryIdColumn = this.worksheetComponents.find(item => item.id === 0) || {
502
+ id: 0,
503
+ name: "主键ID",
504
+ behaviorType: 1,
505
+ };
506
+ return this.formatColumnForEdit(primaryIdColumn, {
507
+ show: true,
508
+ checkMust: true,
509
+ key: Boolean(options.key),
510
+ });
511
+ },
512
+ /**
513
+ * 将主键ID字段固定放在第一行,并复用更新导入下原定位字段的勾选规则。
514
+ *
515
+ * @param options 需要覆盖的主键状态。
516
+ * @return 无返回值。
517
+ */
518
+ ensurePrimaryIdColumnFirst(options = {}) {
519
+ const primaryIdColumn = this.getPrimaryIdColumnForEdit(options);
520
+ const currentIndex = this.editColumnList.findIndex(item => item.columnId === 0);
521
+ if (currentIndex > -1) {
522
+ const currentColumn = this.editColumnList.splice(currentIndex, 1)[0];
523
+ this.editColumnList.unshift({
524
+ ...currentColumn,
525
+ ...primaryIdColumn,
526
+ });
527
+ return;
528
+ }
529
+ this.editColumnList.unshift(primaryIdColumn);
530
+ },
531
+ /**
532
+ * 编辑弹窗打开后按旧业务类型做二次字段过滤。
533
+ *
534
+ * @return 无返回值。
535
+ */
536
+ setEditData() {
537
+ if (this.innerProjectInfo?.projectType === 20) {
538
+ // projectType=20 的旧业务场景需要额外屏蔽这些系统列,保留源组件逻辑。
539
+ this.editColumnList = this.editColumnList.filter(item => ![2, 5, 7, 8, 9].includes(item.columnId));
540
+ }
541
+ },
542
+ /**
543
+ * 编辑弹窗关闭后清空模板详情、字段列表、筛选词和表头全选状态。
544
+ *
545
+ * @return 无返回值。
546
+ */
547
+ clearEditData() {
548
+ this.modalDetail = this.getEmptyModalDetail();
549
+ this.editColumnList = [];
550
+ this.filterVar = "";
551
+ this.allShow = false;
552
+ this.allCheckMust = false;
553
+ this.allKey = false;
554
+ },
555
+ /**
556
+ * 校验并提交新增/编辑导入模板表单,成功后刷新管理列表。
557
+ *
558
+ * @return 请求完成后无显式返回值。
559
+ */
560
+ async editImportModal() {
561
+ if (!this.modalDetail.templateName) {
562
+ this.$message.warning('请输入模板名称')
563
+ return;
564
+ }
565
+ // 后端编辑接口使用 tableId/appId 作为路径参数,body 内也统一使用 tableId。
566
+ const postData = {
567
+ tableId: this.tableId,
568
+ appId: this.appId,
569
+ ...this.modalDetail,
570
+ source: "biztable",
571
+ tableCode: this.innerProjectInfo.tableCode,
572
+ mergeCells: this.modalDetail.mergeCells ? 1 : 0,
573
+ columnList: cloneDeep(this.editColumnList),
574
+ };
575
+ if (!this.modalDetail.sheetName) {
576
+ delete postData.sheetName;
577
+ }
578
+ this.editLoading = true;
579
+ const res = await this.postFunc(this.resolvePath(this.mergedPaths.edit, postData), postData);
580
+ this.editLoading = false;
581
+ if (!res?.code) {
582
+ this.$message?.success(`${postData.id ? "编辑" : "新增"}模板成功`)
583
+ this.$emit("templateEdit", postData, res);
584
+ this.templateEditShow = false;
585
+ this.templateListModalShow = true;
586
+ this.getTemplateList();
587
+ }
588
+ },
589
+ /**
590
+ * 弹出删除确认框,确认后删除指定导入模板并刷新列表。
591
+ *
592
+ * @param template 需要删除的模板数据。
593
+ * @return 请求完成后无显式返回值。
594
+ */
595
+ async deleteTemplage(template) {
596
+ await this.$msgbox.confirm(`确定要删除模板 ${template.templateName} 吗?`, "提示", {
597
+ confirmButtonText: "确定",
598
+ cancelButtonText: "取消",
599
+ type: "warning",
600
+ });
601
+ const postData = {
602
+ tableId: this.tableId,
603
+ appId: this.appId,
604
+ id: template.id,
605
+ };
606
+ const res = await this.postFunc(this.resolvePath(this.mergedPaths.delete, postData), postData);
607
+ if (!res?.code) {
608
+ this.$message?.success('删除成功')
609
+ this.$emit("templateDelete", template, res);
610
+ this.getTemplateList();
611
+ }
612
+ },
613
+ /**
614
+ * 复制指定导入模板,复制成功后刷新管理列表。
615
+ *
616
+ * @param template 需要复制的模板数据。
617
+ * @return 无返回值。
618
+ */
619
+ copyTemplate(template) {
620
+ const postData = {
621
+ tableId: this.tableId,
622
+ appId: this.appId,
623
+ id: template.id,
624
+ };
625
+ this.postFunc(this.resolvePath(this.mergedPaths.copy, postData), postData).then(res => {
626
+ if (!res?.code) {
627
+ this.$message?.success('复制成功')
628
+ this.$emit("templateCopy", template, res);
629
+ this.getTemplateList();
630
+ }
631
+ });
632
+ },
633
+ /**
634
+ * 响应列表弹窗的复制事件,转调用真实复制逻辑。
635
+ *
636
+ * @param item 列表中选中的模板行数据。
637
+ * @return 无返回值。
638
+ */
639
+ copyThisTemplate(item) {
640
+ this.copyTemplate(item);
641
+ },
642
+ /**
643
+ * 响应列表弹窗的删除事件,吞掉取消确认产生的 Promise reject。
644
+ *
645
+ * @param item 列表中选中的模板行数据。
646
+ * @return 无返回值。
647
+ */
648
+ deleteThisTemplate(item) {
649
+ this.deleteTemplage(item).catch(() => {});
650
+ },
651
+ /**
652
+ * 清理 Sheet 名称中 Excel 不允许使用的特殊字符。
653
+ *
654
+ * @return 无返回值。
655
+ */
656
+ validateSheetName() {
657
+ // Excel Sheet 名称不能包含这些字符,源组件在输入变化时直接清理。
658
+ const pattern = /[\\?*[\] ]/g;
659
+ this.modalDetail.sheetName = this.modalDetail.sheetName.replace(pattern, "");
660
+ },
661
+ /**
662
+ * 根据导入方式维护主键ID列:更新类导入自动插入,纯新增时移除。
663
+ *
664
+ * @return 无返回值。
665
+ */
666
+ handleImportTypeChange() {
667
+ if (this.modalDetail.type === 2 || this.modalDetail.type === 3) {
668
+ // 更新类导入必须依赖主键ID定位数据,所以切到“更新/更新和新增”时自动插入主键ID列。
669
+ this.ensurePrimaryIdColumnFirst({
670
+ key: this.modalDetail.type === 3 || (this.modalDetail.type === 2 && this.modalDetail.mergeCells),
671
+ });
672
+ }
673
+ if (this.modalDetail.type === 1 && this.editColumnList[0]?.columnId === 0) {
674
+ this.editColumnList.shift();
675
+ }
676
+ this.syncAllChecks();
677
+ },
678
+ /**
679
+ * 根据“导入未合并的多行数据”开关同步主键选择和主键ID主键规则。
680
+ *
681
+ * @return 无返回值。
682
+ */
683
+ handleMergeCellsChange() {
684
+ if (!this.modalDetail.mergeCells) {
685
+ // 不合并多行数据时主键合并规则不生效,需要清空所有主键选择。
686
+ this.editColumnList = this.editColumnList.map(item => ({
687
+ ...item,
688
+ key: false,
689
+ }));
690
+ }
691
+ if (this.modalDetail.type === 2 && this.modalDetail.mergeCells) {
692
+ // “仅更新 + 合并多行”时主键ID固定作为合并主键。
693
+ this.ensurePrimaryIdColumnFirst({
694
+ key: true,
695
+ });
696
+ }
697
+ this.syncAllChecks();
698
+ },
699
+ /**
700
+ * 展开或收起子表单字段列表。
701
+ *
702
+ * @param item 当前点击的字段配置项。
703
+ * @return 无返回值。
704
+ */
705
+ showOrCloseChildList(item) {
706
+ if (item.behaviorType !== 13) {
707
+ return;
708
+ }
709
+ this.editColumnList = this.editColumnList.map(column => {
710
+ if (column.columnId === item.columnId) {
711
+ return {
712
+ ...column,
713
+ childOpen: !column.childOpen,
714
+ };
715
+ }
716
+ return column;
717
+ });
718
+ },
719
+ /**
720
+ * 批量切换所有字段的“模板显示”状态,并同步子表单子字段。
721
+ *
722
+ * @return 无返回值。
723
+ */
724
+ checkAllShow() {
725
+ this.editColumnList = this.editColumnList.map(item => {
726
+ item.show = this.allShow;
727
+ if (item.behaviorType === 13 && item.childColumns) {
728
+ item.childColumns = item.childColumns.map(childItem => ({
729
+ ...childItem,
730
+ show: this.allShow,
731
+ }));
732
+ }
733
+ return item;
734
+ });
735
+ },
736
+ /**
737
+ * 批量切换所有字段的“必填校验”状态,必填字段会自动设为模板显示。
738
+ *
739
+ * @return 无返回值。
740
+ */
741
+ checkAllCheckMust() {
742
+ if (this.allCheckMust) {
743
+ this.allShow = true;
744
+ }
745
+ this.editColumnList = this.editColumnList.map(item => {
746
+ item.checkMust = this.allCheckMust;
747
+ if (item.checkMust) {
748
+ item.show = true;
749
+ }
750
+ if (item.behaviorType === 13 && item.childColumns) {
751
+ item.childColumns = item.childColumns.map(childItem => {
752
+ childItem.checkMust = this.allCheckMust;
753
+ if (childItem.checkMust) {
754
+ childItem.show = true;
755
+ }
756
+ return childItem;
757
+ });
758
+ }
759
+ return item;
760
+ });
761
+ },
762
+ /**
763
+ * 批量切换普通字段的“相同合并主键”状态,子表单字段不允许设为主键。
764
+ *
765
+ * @return 无返回值。
766
+ */
767
+ checkAllKey() {
768
+ this.editColumnList = this.editColumnList.map(item => {
769
+ if (item.behaviorType !== 13) {
770
+ item.key = this.allKey;
771
+ }
772
+ return item;
773
+ });
774
+ },
775
+ /**
776
+ * 处理单个字段勾选变化,并维护父子字段、显示、必填、主键之间的联动关系。
777
+ *
778
+ * @param checkItem 当前发生勾选变化的字段配置项。
779
+ * @param type 勾选类型,可取 show、checkMust、key。
780
+ * @return 无返回值。
781
+ */
782
+ itemCheckChange(checkItem, type) {
783
+ // 字段配置存在父子联动:子字段被显示/必填时,父级子表单字段也必须同步显示/必填。
784
+ if (type === "show") {
785
+ this.allShow = !this.editColumnList.find(item => !item.show);
786
+ if (checkItem.parentColumn) {
787
+ this.editColumnList = this.editColumnList.map(item => {
788
+ if (item.columnId === checkItem.parentColumn && checkItem.show) {
789
+ item.show = true;
790
+ }
791
+ return item;
792
+ });
793
+ }
794
+ }
795
+ if (type === "checkMust") {
796
+ this.allCheckMust = !this.editColumnList.find(item => !item.checkMust);
797
+ this.editColumnList = this.editColumnList.map(item => {
798
+ if (item.checkMust) {
799
+ item.show = true;
800
+ }
801
+ return item;
802
+ });
803
+ if (checkItem.parentColumn) {
804
+ this.editColumnList = this.editColumnList.map(item => {
805
+ if (item.columnId === checkItem.parentColumn && checkItem.checkMust) {
806
+ item.checkMust = true;
807
+ item.show = true;
808
+ item.childColumns = item.childColumns.map(childItem => {
809
+ if (childItem.columnId === checkItem.columnId) {
810
+ childItem.show = true;
811
+ }
812
+ return childItem;
813
+ });
814
+ }
815
+ return item;
816
+ });
817
+ }
818
+ }
819
+ if (type === "key") {
820
+ this.allKey = !this.editColumnList.find(item => !item.key && item.behaviorType !== 13);
821
+ }
822
+ if (checkItem.behaviorType === 13 && !checkItem.parentColumn) {
823
+ this.editColumnList = this.editColumnList.map(item => {
824
+ if (item.columnId === checkItem.columnId && item.childColumns) {
825
+ item.childColumns = item.childColumns.map(childItem => {
826
+ if (type === "show") {
827
+ childItem.show = item.show;
828
+ }
829
+ if (type === "checkMust") {
830
+ childItem.checkMust = item.checkMust;
831
+ if (childItem.checkMust) {
832
+ childItem.show = true;
833
+ }
834
+ }
835
+ if (type === "key") {
836
+ childItem.key = item.key;
837
+ }
838
+ return childItem;
839
+ });
840
+ }
841
+ return item;
842
+ });
843
+ }
844
+ this.syncAllChecks();
845
+ },
846
+ /**
847
+ * 根据当前字段列表重新计算表头三个全选复选框的状态。
848
+ *
849
+ * @return 无返回值。
850
+ */
851
+ syncAllChecks() {
852
+ // 任何单项或批量操作后都重新计算表头复选框,避免只改子项时表头状态滞后。
853
+ this.allShow = this.editColumnList.length > 0 && !this.editColumnList.find(item => !item.show);
854
+ this.allCheckMust = this.editColumnList.length > 0 && !this.editColumnList.find(item => !item.checkMust);
855
+ this.allKey = this.editColumnList.length > 0 && !this.editColumnList.find(item => !item.key && item.behaviorType !== 13);
856
+ },
857
+ },
858
+ };
859
+ </script>
860
+
861
+ <style scoped lang="scss">
862
+ .BnImportTemplate {
863
+ display: inline-flex;
864
+ align-items: center;
865
+ }
866
+ </style>