vue2-client 1.8.310 → 1.8.312

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 (222) 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/LowCode/lowcode.md +155 -155
  7. package/docs/LowCode/lowcodeForDeveloper.md +230 -230
  8. package/docs/index.md +30 -30
  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 +97 -97
  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 +438 -416
  23. package/src/base-client/components/common/AddressSearchCombobox/demo.vue +36 -36
  24. package/src/base-client/components/common/AddressSearchCombobox/ic_map.svg +6 -6
  25. package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
  26. package/src/base-client/components/common/CitySelect/CitySelect.vue +342 -342
  27. package/src/base-client/components/common/CitySelect/index.js +3 -3
  28. package/src/base-client/components/common/CitySelect/index.md +109 -109
  29. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +669 -669
  30. package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +1014 -1014
  31. package/src/base-client/components/common/CreateQuery/index.js +3 -3
  32. package/src/base-client/components/common/CreateQuery/index.md +42 -42
  33. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +452 -452
  34. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQueryItem.vue +511 -511
  35. package/src/base-client/components/common/CreateSimpleFormQuery/index.js +3 -3
  36. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
  37. package/src/base-client/components/common/FormGroupEdit/FormGroupEdit.vue +149 -149
  38. package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
  39. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  40. package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +166 -166
  41. package/src/base-client/components/common/FormGroupQuery/index.js +3 -3
  42. package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
  43. package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
  44. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorPanel.vue +413 -350
  45. package/src/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue +502 -502
  46. package/src/base-client/components/common/LowCodeComponent/LowCodeRender.vue +728 -699
  47. package/src/base-client/components/common/LowCodeComponent/LowCodeRenderEnter.vue +29 -29
  48. package/src/base-client/components/common/LowCodeComponent/LowCodeUIStore.vue +219 -162
  49. package/src/base-client/components/common/PersonSetting/PersonSetting.vue +208 -208
  50. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  51. package/src/base-client/components/common/Tree/Tree.vue +149 -149
  52. package/src/base-client/components/common/Tree/index.js +2 -2
  53. package/src/base-client/components/common/Upload/Upload.vue +239 -239
  54. package/src/base-client/components/common/Upload/index.js +3 -3
  55. package/src/base-client/components/common/XAddForm/XAddForm.vue +105 -105
  56. package/src/base-client/components/common/XAddNativeForm/XAddNativeForm.vue +807 -807
  57. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  58. package/src/base-client/components/common/XAddNativeForm/lowcodeEditorRegister.js +16 -16
  59. package/src/base-client/components/common/XAddNativeFormOA/XAddNativeFormOA.vue +303 -303
  60. package/src/base-client/components/common/XAddNativeFormOA/index.js +3 -3
  61. package/src/base-client/components/common/XAddNativeFormOA/index.md +146 -146
  62. package/src/base-client/components/common/XBadge/XBadge.vue +78 -78
  63. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  64. package/src/base-client/components/common/XDataCard/XDataCard.vue +355 -0
  65. package/src/base-client/components/common/XDataCard/index.js +3 -0
  66. package/src/base-client/components/common/XDataCard/index.md +1 -0
  67. package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
  68. package/src/base-client/components/common/XDataDrawer/index.js +3 -3
  69. package/src/base-client/components/common/XDataDrawer/index.md +41 -41
  70. package/src/base-client/components/common/XDescriptions/XDescriptions.vue +188 -187
  71. package/src/base-client/components/common/XDescriptions/XDescriptionsGroup.vue +306 -306
  72. package/src/base-client/components/common/XDescriptions/demo.vue +50 -50
  73. package/src/base-client/components/common/XDescriptions/index.js +3 -3
  74. package/src/base-client/components/common/XDescriptions/index.md +83 -83
  75. package/src/base-client/components/common/XDetailsView/XDetailsView.vue +214 -214
  76. package/src/base-client/components/common/XDetailsView/index.js +3 -3
  77. package/src/base-client/components/common/XForm/XForm.vue +294 -294
  78. package/src/base-client/components/common/XForm/XFormItem.vue +911 -911
  79. package/src/base-client/components/common/XForm/XTreeSelect.vue +207 -207
  80. package/src/base-client/components/common/XForm/index.md +178 -178
  81. package/src/base-client/components/common/XFormCol/XFormCol.vue +36 -36
  82. package/src/base-client/components/common/XFormGroup/XFormGroup.vue +241 -241
  83. package/src/base-client/components/common/XFormGroup/demo.vue +40 -40
  84. package/src/base-client/components/common/XFormGroup/index.js +3 -3
  85. package/src/base-client/components/common/XFormGroup/index.md +38 -38
  86. package/src/base-client/components/common/XFormGroupDetails/XFormGroupDetails.vue +72 -72
  87. package/src/base-client/components/common/XFormGroupDetails/index.js +3 -3
  88. package/src/base-client/components/common/XFormTable/XFormTable.vue +545 -539
  89. package/src/base-client/components/common/XFormTable/demo.vue +72 -72
  90. package/src/base-client/components/common/XFormTable/index.md +98 -98
  91. package/src/base-client/components/common/XFormTable/lowcodeEditorRegister.js +30 -30
  92. package/src/base-client/components/common/XImportExcel/XImportExcel.vue +147 -147
  93. package/src/base-client/components/common/XReport/XReport.vue +858 -858
  94. package/src/base-client/components/common/XReport/XReportDemo.vue +266 -266
  95. package/src/base-client/components/common/XReport/XReportDesign.vue +509 -509
  96. package/src/base-client/components/common/XReport/XReportJsonRender.vue +295 -295
  97. package/src/base-client/components/common/XReport/XReportTrGroup.vue +801 -801
  98. package/src/base-client/components/common/XReport/index.js +3 -3
  99. package/src/base-client/components/common/XReport/index.md +44 -44
  100. package/src/base-client/components/common/XReportSlot/XReportSlot.vue +110 -110
  101. package/src/base-client/components/common/XReportSlot/index.js +3 -3
  102. package/src/base-client/components/common/XSimpleDescriptions/XSimpleDescriptions.vue +137 -0
  103. package/src/base-client/components/common/XSimpleDescriptions/index.js +3 -0
  104. package/src/base-client/components/common/XSimpleDescriptions/index.md +7 -0
  105. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  106. package/src/base-client/components/common/XStepView/index.js +3 -3
  107. package/src/base-client/components/common/XStepView/index.md +31 -31
  108. package/src/base-client/components/common/XTable/XTable.vue +715 -676
  109. package/src/base-client/components/common/XTable/index.md +255 -255
  110. package/src/base-client/components/common/XTree/XTree.vue +423 -423
  111. package/src/base-client/components/common/XTree/index.js +3 -3
  112. package/src/base-client/components/common/XTree/index.md +36 -36
  113. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +114 -114
  114. package/src/base-client/components/common/XTreeOne/lowcodeEditorRegister.js +11 -11
  115. package/src/base-client/components/index.js +51 -51
  116. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  117. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -281
  118. package/src/base-client/plugins/AppData.js +121 -121
  119. package/src/base-client/plugins/Config.js +19 -19
  120. package/src/base-client/plugins/GetLoginInfoService.js +183 -183
  121. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  122. package/src/bootstrap.js +39 -39
  123. package/src/components/CodeMirror/inedx.vue +118 -118
  124. package/src/components/CodeMirror/setting.js +40 -40
  125. package/src/components/FilePreview/FilePreview.vue +166 -166
  126. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  127. package/src/components/STable/index.js +361 -361
  128. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  129. package/src/components/checkbox/ImgCheckbox.vue +163 -163
  130. package/src/components/menu/SideMenu.vue +75 -75
  131. package/src/components/menu/menu.js +273 -273
  132. package/src/components/tool/AStepItem.vue +60 -60
  133. package/src/config/CreateQueryConfig.js +322 -322
  134. package/src/config/default/antd.config.js +89 -89
  135. package/src/config/default/setting.config.js +55 -55
  136. package/src/font-style/font.css +4 -4
  137. package/src/layouts/CommonLayout.vue +56 -56
  138. package/src/layouts/PageLayout.vue +151 -151
  139. package/src/layouts/SinglePageView.vue +138 -138
  140. package/src/layouts/header/AdminHeader.vue +132 -132
  141. package/src/layouts/header/HeaderNotice.vue +177 -177
  142. package/src/layouts/tabs/TabsHead.vue +189 -189
  143. package/src/layouts/tabs/TabsView.vue +387 -387
  144. package/src/lib.js +1 -1
  145. package/src/main.js +26 -26
  146. package/src/mock/extend/index.js +84 -84
  147. package/src/mock/goods/index.js +108 -108
  148. package/src/pages/AMisDemo/AMisDemo.vue +325 -325
  149. package/src/pages/AMisDemo/AMisDemo2.vue +74 -74
  150. package/src/pages/DynamicStatistics/ChartSelector.vue +331 -331
  151. package/src/pages/DynamicStatistics/DataTabs.vue +83 -83
  152. package/src/pages/DynamicStatistics/DynamicTable.vue +128 -128
  153. package/src/pages/DynamicStatistics/EvaluationArea.vue +69 -69
  154. package/src/pages/DynamicStatistics/FavoriteList.vue +51 -51
  155. package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +591 -591
  156. package/src/pages/DynamicStatistics/SearchBar.vue +192 -192
  157. package/src/pages/DynamicStatistics/index.vue +282 -282
  158. package/src/pages/Example/index.vue +193 -33
  159. package/src/pages/NewDynamicStatistics/ChartSelector.vue +331 -331
  160. package/src/pages/NewDynamicStatistics/DataTabs.vue +122 -122
  161. package/src/pages/NewDynamicStatistics/DynamicTable.vue +128 -128
  162. package/src/pages/NewDynamicStatistics/EvaluationArea.vue +69 -69
  163. package/src/pages/NewDynamicStatistics/FavoriteList.vue +51 -51
  164. package/src/pages/NewDynamicStatistics/QuestionHistoryAndFavorites.vue +289 -289
  165. package/src/pages/NewDynamicStatistics/SearchBar.vue +193 -193
  166. package/src/pages/NewDynamicStatistics/index.vue +258 -258
  167. package/src/pages/ServiceReview/index.vue +284 -284
  168. package/src/pages/XReportView/index.vue +62 -62
  169. package/src/pages/login/Login.vue +378 -378
  170. package/src/pages/login/LoginV3.vue +389 -389
  171. package/src/pages/lowCode/lowCodeEditor.vue +1219 -1030
  172. package/src/pages/lowCode/lowCodeRenderPage.vue +43 -43
  173. package/src/pages/resourceManage/orgListManage.vue +98 -98
  174. package/src/pages/system/dictionary/index.vue +44 -44
  175. package/src/pages/system/monitor/loginInfor/index.vue +37 -37
  176. package/src/pages/system/monitor/operLog/index.vue +37 -37
  177. package/src/pages/system/settings/modifyPassword.vue +117 -117
  178. package/src/pages/system/ticket/index.vue +480 -480
  179. package/src/pages/system/ticket/submitTicketSuccess.vue +484 -484
  180. package/src/router/async/config.async.js +34 -34
  181. package/src/router/async/router.map.js +104 -104
  182. package/src/router/guards.js +223 -223
  183. package/src/router/index.js +27 -27
  184. package/src/router.js +19 -19
  185. package/src/services/api/TicketDetailsViewApi.js +46 -46
  186. package/src/services/api/cas.js +79 -79
  187. package/src/services/api/common.js +307 -307
  188. package/src/services/api/entity.js +18 -18
  189. package/src/services/api/index.js +17 -17
  190. package/src/services/api/restTools.js +46 -46
  191. package/src/services/apiService.js +14 -14
  192. package/src/services/user.js +71 -71
  193. package/src/services/v3Api.js +81 -81
  194. package/src/store/modules/index.js +5 -5
  195. package/src/store/modules/lowCode.js +33 -33
  196. package/src/store/modules/setting.js +119 -119
  197. package/src/theme/default/style.less +58 -58
  198. package/src/theme/global.less +139 -139
  199. package/src/utils/authority-utils.js +85 -85
  200. package/src/utils/errorCode.js +6 -6
  201. package/src/utils/formatter.js +80 -80
  202. package/src/utils/htmlToPDF.js +108 -108
  203. package/src/utils/htmlToPDFApi.js +5 -5
  204. package/src/utils/indexedDB.js +258 -258
  205. package/src/utils/login.js +188 -188
  206. package/src/utils/lowcode/lowcodeComponentMixin.js +120 -120
  207. package/src/utils/lowcode/lowcodeLog.js +29 -29
  208. package/src/utils/lowcode/lowcodeUtils.js +373 -373
  209. package/src/utils/lowcode/registerComponentForEditor.js +11 -11
  210. package/src/utils/lowcode/registerComponentForRender.js +11 -11
  211. package/src/utils/map-utils.js +47 -47
  212. package/src/utils/reg.js +95 -95
  213. package/src/utils/request.js +347 -347
  214. package/src/utils/routerUtil.js +435 -435
  215. package/src/utils/runEvalFunction.js +6 -6
  216. package/src/utils/util.js +241 -241
  217. package/src/utils/waterMark.js +31 -31
  218. package/test/Amis.spec.js +163 -163
  219. package/test/Tree.spec.js +167 -167
  220. package/test/myDialog.spec.js +46 -46
  221. package/vue.config.js +181 -181
  222. package//350/277/201/347/247/273/346/227/245/345/277/227.md +15 -15
@@ -1,807 +1,807 @@
1
- <template>
2
- <div>
3
- <a-form-model
4
- v-if="loaded"
5
- ref="selectForm"
6
- :zIndex="1001"
7
- :model="form"
8
- v-bind="formItemLayout"
9
- :layout="layout"
10
- :rules="rules">
11
- <a-row :gutter="16" type="flex">
12
- <x-form-item
13
- v-for="(item, index) in realJsonData"
14
- :key="index"
15
- :attr="item"
16
- :disabled="itemDisabled(item)"
17
- :read-only="readonly(item)"
18
- :files="files"
19
- :style="layout ==='inline'?{marginTop:'5px'}:undefined"
20
- :form="form"
21
- :images="images"
22
- :service-name="serviceName"
23
- mode="新增/修改"
24
- :layout="layout"
25
- :get-data-params="getDataParams"
26
- :env="env"
27
- @x-form-item-emit-func="emitFunc"
28
- :setForm="setForm"
29
- />
30
- </a-row>
31
- <a-row :gutter="16" v-for="(groupItem, groupIndex) in groupJsonData" :key="groupIndex">
32
- <a-card v-if="groupItem.groupItems.length > 0" :title="groupItem.name" :bordered="false" size="small">
33
- <x-form-item
34
- v-for="(item, index) in groupItem.groupItems"
35
- :key="index"
36
- :attr="item"
37
- :disabled="itemDisabled(item)"
38
- :readonly="readonly(item)"
39
- :files="files"
40
- :style="layout ==='inline'?{marginTop:'5px'}:undefined"
41
- :form="form[groupItem.model]"
42
- :images="images"
43
- :service-name="serviceName"
44
- mode="新增/修改"
45
- :get-data-params="getDataParams"
46
- :env="env"
47
- :setForm="setForm"
48
- />
49
- </a-card>
50
- <template v-else>
51
- <slot
52
- name="groupFormItems"
53
- :form="form"
54
- :model="groupItem.model"
55
- :rules="rules"
56
- :modifyModelData="modifyModelData"></slot>
57
- </template>
58
- </a-row>
59
- <a-row :gutter="16" v-for="(item, key) in simpleFormJsonData" :key="'row' + key">
60
- <a-card v-if="item.value.length > 0" :title="item.name" :bordered="false" size="small">
61
- <x-form-item
62
- v-for="(formItem, formItemIndex) in item.value"
63
- :key="key + formItemIndex"
64
- :attr="formItem"
65
- :disabled="itemDisabled(formItem)"
66
- :readonly="readonly(formItem)"
67
- :files="files"
68
- :style="layout ==='inline'?{marginTop:'5px'}:undefined"
69
- :form="form[groupItem.model]"
70
- :images="images"
71
- :service-name="serviceName"
72
- mode="新增/修改"
73
- :get-data-params="getDataParams"
74
- :env="env"
75
- :setForm="setForm"
76
- />
77
- </a-card>
78
- </a-row>
79
- </a-form-model>
80
- <a-row type="flex" justify="end">
81
- <a-button v-if="showSubmitBtn" :loading="loading" type="primary" @click="onSubmit()">提交</a-button>
82
- </a-row>
83
- </div>
84
- </template>
85
- <script>
86
- import XFormItem from '@vue2-client/base-client/components/common/XForm/XFormItem'
87
- import { formatDate } from '@vue2-client/utils/util'
88
- import { mapState } from 'vuex'
89
- import { addOrModify, getConfigByName, runLogic } from '@vue2-client/services/api/common'
90
- import lowcodeComponentMixin from '@vue2-client/utils/lowcode/lowcodeComponentMixin'
91
- import { checkIdNumber, REG_EMAIL, REG_LANDLINE, REG_PHONE } from '@vue2-client/utils/reg'
92
- import moment from 'moment/moment'
93
- import executeStrFunction from '@vue2-client/utils/runEvalFunction'
94
-
95
- export default {
96
- name: 'XAddNativeForm',
97
- components: {
98
- XFormItem
99
- },
100
- props: {
101
- configNameForLowCode: {
102
- type: String,
103
- default: undefined
104
- },
105
- systemNameForLowCode: {
106
- type: String,
107
- default: undefined
108
- }
109
- },
110
- mixins: [lowcodeComponentMixin],
111
- data () {
112
- return {
113
- // 预览模式
114
- viewMode: false,
115
- // 是否处理表单Key值
116
- isHandleFormKey: true,
117
- // 内容加载是否完成
118
- loaded: false,
119
- // 业务类型
120
- businessType: '',
121
- // 业务标题
122
- title: '',
123
- // 新增或修改业务是否执行中
124
- loading: false,
125
- // 表单Model
126
- form: {},
127
- // 配置名称
128
- configName: undefined,
129
- // 配置内容,用于查询配置生成器的预览
130
- configContent: undefined,
131
- // 表单项集合
132
- formItems: [],
133
- // 服务名称
134
- serviceName: undefined,
135
- // 是否显示提交按钮
136
- showSubmitBtn: true,
137
- // 修改有文件的表单时使用
138
- files: [],
139
- images: [],
140
- // 校验
141
- rules: {},
142
- // 调用logic获取数据源的追加参数
143
- getDataParams: {},
144
- // 是否为临时表
145
- isTableTemp: false,
146
- // 是否处理表单key
147
- isKeyHandle: true,
148
- // 动态简易表单集合
149
- simpleFormJsonData: {},
150
- // 待修改的数据集
151
- modifyModelData: {},
152
- // 当前环境
153
- env: 'prod',
154
- // 表单模式 horizontal | vertical | inline
155
- layout: 'horizontal'
156
- }
157
- },
158
- computed: {
159
- // 过滤出用于新增/修改场景的表单项
160
- realJsonData: function () {
161
- return this.formItems.filter((item) => {
162
- return item.addOrEdit && item.addOrEdit !== 'no' && item.addOrEdit !== 'silenceAdd' && item.addOrEdit !== 'version' && !this.itemDisabled(item)
163
- })
164
- },
165
- // 过滤出用于新增/修改场景的表单项
166
- groupJsonData: function () {
167
- return this.formItems.filter((item) => {
168
- return item.type === 'group'
169
- }).map((item) => {
170
- item.groupItems = item.groupItems.filter((item) => {
171
- return item.addOrEdit && item.addOrEdit !== 'no' && item.addOrEdit !== 'silenceAdd' && item.addOrEdit !== 'version' && !this.itemDisabled(item)
172
- }).map((groupItem) => {
173
- // 只保留第一个下划线后面的内容
174
- // 多层校验规则需要将prop设置为 key1.key2.....
175
- groupItem.prop = `${item.model}.${groupItem.model.substring(groupItem.model.indexOf('_') + 1)}`
176
- groupItem.model = groupItem.model.substring(groupItem.model.indexOf('_') + 1)
177
- return groupItem
178
- })
179
- return item
180
- }
181
- )
182
- },
183
- // 过滤出用于静默新增场景的表单项
184
- silenceAddJsonData: function () {
185
- return this.formItems.filter(function (item) {
186
- return item.addOrEdit === 'silenceAdd'
187
- })
188
- },
189
- // 过滤出版本号表单项
190
- versionJsonData: function () {
191
- return this.formItems.filter(function (item) {
192
- return item.addOrEdit === 'version'
193
- })
194
- },
195
- formItemLayout () {
196
- if (this.layout === 'horizontal') {
197
- return {
198
- labelCol: { span: 4, offset: 2 },
199
- wrapperCol: { span: 14 },
200
- }
201
- }
202
- if (this.layout === 'vertical') {
203
- return {}
204
- }
205
- return {
206
- labelCol: { span: 6 },
207
- wrapperCol: { span: 18 },
208
- }
209
- },
210
- ...mapState('account', { currUser: 'user' })
211
- },
212
- mounted () {
213
- if (this.configNameForLowCode !== undefined && this.systemNameForLowCode !== undefined) {
214
- getConfigByName(this.configNameForLowCode, this.systemNameForLowCode, (res) => {
215
- this.init({
216
- formItems: res.formJson,
217
- title: this.modalTitle,
218
- businessType: this.businessType,
219
- layout: res.xAddFormLayout,
220
- isKeyHandle: res.isKeyHandle
221
- })
222
- })
223
- }
224
- },
225
- methods: {
226
- init (params) {
227
- const {
228
- configName, configContent, formItems, viewMode, isHandleFormKey = true,
229
- showSubmitBtn = true, serviceName, isTableTemp = false, isKeyHandle = true,
230
- modifyModelData = {}, businessType, title, fixedAddForm = {}, getDataParams = {},
231
- simpleFormJsonData = {}, env = 'prod', layout = 'horizontal'
232
- } = params
233
- this.loaded = false
234
- this.layout = layout
235
- this.configName = configName
236
- this.configContent = configContent
237
- if (typeof formItems === 'string') {
238
- this.formItems = JSON.parse(formItems)
239
- } else {
240
- this.formItems = JSON.parse(JSON.stringify(formItems))
241
- }
242
- this.viewMode = viewMode
243
- this.isHandleFormKey = isHandleFormKey
244
- this.showSubmitBtn = showSubmitBtn
245
- this.serviceName = serviceName
246
- this.businessType = businessType
247
- this.title = title
248
- this.getDataParams = getDataParams
249
- this.simpleFormJsonData = simpleFormJsonData
250
- this.env = env
251
- this.isTableTemp = isTableTemp
252
- this.isKeyHandle = isKeyHandle
253
- // 设置普通表单项的相关参数
254
- const formData = Object.assign({}, fixedAddForm)
255
- for (let i = 0; i < this.realJsonData.length; i++) {
256
- const item = this.realJsonData[i]
257
- this.setFormProps(formData, item, null)
258
- }
259
- // 设置表单分组项目相关参数
260
- for (let i = 0; i < this.groupJsonData.length; i++) {
261
- const groupItem = this.groupJsonData[i]
262
- formData[groupItem.model] = {}
263
- for (let j = 0; j < groupItem.groupItems.length; j++) {
264
- const item = groupItem.groupItems[j]
265
- this.setFormProps(formData[groupItem.model], item, item.prop)
266
- }
267
- }
268
- // 设置动态简易表单项的相关参数
269
- for (const key in this.simpleFormJsonData) {
270
- for (const item of this.simpleFormJsonData[key].value) {
271
- item.model = key + '@' + item.model
272
- this.setFormProps(formData, item, null)
273
- }
274
- }
275
-
276
- this.form = formData
277
- // 修改场景下对表单项赋值
278
- if (modifyModelData && modifyModelData.data) {
279
- this.modifyModelData = modifyModelData
280
- this.files = modifyModelData.files
281
- this.images = modifyModelData.images
282
- if (Object.keys(modifyModelData.data).length > 0) {
283
- this.getModifyModelData(modifyModelData)
284
- }
285
- }
286
- this.loaded = true
287
- },
288
- // 时间组件赋默认值
289
- getDateRange (type, defaultValue) {
290
- // const format = type === 'datePicker' ? 'YYYY-MM-DD' : 'YYYY-MM-DD HH:mm:ss'
291
- const format = 'YYYY-MM-DD HH:mm:ss'
292
- let start
293
- switch (defaultValue) {
294
- case 'curYear':
295
- start = moment().startOf('year').format(format)
296
- break
297
- case 'curMonth':
298
- start = moment().startOf('month').format(format)
299
- break
300
- case 'curDay':
301
- start = moment().startOf('day').format(format)
302
- break
303
- default:
304
- return defaultValue
305
- }
306
- return start
307
- },
308
- setFormProps (formData, item, groupItem) {
309
- if (!formData[item.model]) {
310
- formData[item.model] = undefined
311
- }
312
- if (!formData[item.model] && item.formDefault) {
313
- if (['datePicker', 'rangePicker', 'yearPicker', 'monthPicker'].includes(item.type)) {
314
- formData[item.model] = this.getDateRange(item.type, item.formDefault)
315
- } else if (['treeSelect', 'select', 'checkbox'].includes(item.type) && ['curOrgId', 'curDepId', 'curUserId'].includes(item.queryFormDefault)) {
316
- if (item.queryFormDefault === 'curOrgId') {
317
- formData[item.model] = item.type === 'select' ? this.currUser.orgid : [this.currUser.orgid]
318
- }
319
- if (item.queryFormDefault === 'curDepId') {
320
- formData[item.model] = item.type === 'select' ? this.currUser.depids : [this.currUser.depids]
321
- }
322
- if (item.queryFormDefault === 'curUserId') {
323
- formData[item.model] = item.type === 'select' ? this.currUser.id : [this.currUser.id]
324
- }
325
- } else {
326
- formData[item.model] = item.formDefault
327
- }
328
- }
329
- // 处理表单校验情况
330
- if (item.rule) {
331
- if (groupItem) {
332
- this.rules[groupItem] = []
333
- } else {
334
- this.rules[item.model] = []
335
- }
336
- const required = item.rule.required ? item.rule.required === true || item.rule.required === 'true' : false
337
- let trigger
338
- let message
339
- if (required) {
340
- switch (item.type) {
341
- case 'select':
342
- case 'checkbox':
343
- case 'radio':
344
- case 'treeSelect':
345
- case 'rangePicker':
346
- case 'monthPicker':
347
- case 'yearPicker':
348
- case 'datePicker':
349
- case 'file':
350
- case 'image':
351
- case 'citySelect':
352
- case 'addressSearch':
353
- case 'personSetting':
354
- message = '请选择' + item.name
355
- trigger = 'change'
356
- break
357
- default:
358
- message = '请输入' + item.name
359
- trigger = 'blur'
360
- }
361
- if (groupItem) {
362
- this.rules[groupItem].push({
363
- required: true,
364
- message: message,
365
- trigger: trigger
366
- })
367
- } else {
368
- this.rules[item.model].push({
369
- required: true,
370
- message: message,
371
- trigger: trigger
372
- })
373
- }
374
- }
375
-
376
- switch (item.rule.type) {
377
- case 'number':
378
- case 'integer':
379
- case 'float':
380
- // eslint-disable-next-line no-case-declarations
381
- let defaultValue
382
- // eslint-disable-next-line no-case-declarations
383
- let message
384
- switch (item.rule.type) {
385
- case 'number':
386
- item.numberInput = true
387
- message = '数字'
388
- defaultValue = 0
389
- break
390
- case 'integer':
391
- item.numberInput = true
392
- message = '整数'
393
- defaultValue = 0
394
- break
395
- case 'float':
396
- item.numberInput = true
397
- message = '小数'
398
- defaultValue = 0.0
399
- break
400
- }
401
- if (groupItem) {
402
- this.rules[groupItem].push({
403
- type: item.rule.type,
404
- message: item.name + '必须为' + message,
405
- transform: (value) => {
406
- if (value && value.length !== 0) {
407
- return Number(value)
408
- } else {
409
- return defaultValue
410
- }
411
- },
412
- trigger: 'blur'
413
- })
414
- } else {
415
- this.rules[item.model].push({
416
- type: item.rule.type,
417
- message: item.name + '必须为' + message,
418
- transform: (value) => {
419
- if (value && value.length !== 0) {
420
- return Number(value)
421
- } else {
422
- return defaultValue
423
- }
424
- },
425
- trigger: 'blur'
426
- })
427
- }
428
- break
429
- case 'email': {
430
- const validator = (rule, value, callback) => {
431
- if (value && !REG_EMAIL.test(value)) {
432
- callback(new Error('请输入正确的邮箱地址'))
433
- } else {
434
- callback()
435
- }
436
- }
437
- this.rules[groupItem || item.model].push({
438
- type: 'email',
439
- validator: validator,
440
- message: '请输入正确的邮箱地址',
441
- trigger: 'blur'
442
- })
443
- break
444
- }
445
- case 'userPhone': {
446
- this.rules[groupItem || item.model].push({
447
- type: 'userPhone',
448
- validator: (rule, value, callback) => {
449
- if (value && !REG_PHONE.test(value)) {
450
- callback(new Error('请输入正确的手机号码'))
451
- } else {
452
- callback()
453
- }
454
- },
455
- message: '请输入正确的手机号码',
456
- trigger: 'blur'
457
- })
458
- break
459
- }
460
- case 'idNumber': {
461
- this.rules[groupItem || item.model].push({
462
- validator: (rule, value, callback) => {
463
- if (value && !checkIdNumber(value)) {
464
- callback(new Error('请输入正确的身份证号码'))
465
- } else {
466
- callback()
467
- }
468
- },
469
- trigger: 'blur'
470
- })
471
- break
472
- }
473
- case 'landlineNumber': {
474
- this.rules[item.model].push({
475
- validator: (rule, value, callback) => {
476
- if (value && !REG_LANDLINE.test(value)) {
477
- callback(new Error('请输入正确的座机号码'))
478
- } else {
479
- callback()
480
- }
481
- },
482
- trigger: 'blur'
483
- })
484
- break
485
- }
486
- // 大于0
487
- case 'greaterThanZero': {
488
- item.numberInput = true
489
- this.rules[item.model].push({
490
- validator: (rule, value, callback) => {
491
- if (isNaN(value) || value <= 0) {
492
- callback(new Error('请输入一个大于0的数字'))
493
- } else {
494
- callback()
495
- }
496
- },
497
- trigger: 'blur'
498
- })
499
- break
500
- }
501
- // 大于等于0
502
- case 'greaterThanOrEqualZero': {
503
- item.numberInput = true
504
- this.rules[item.model].push({
505
- validator: (rule, value, callback) => {
506
- if (isNaN(value) || value < 0) {
507
- callback(new Error('请输入一个大于等于0的数字'))
508
- } else {
509
- callback()
510
- }
511
- },
512
- trigger: 'blur'
513
- })
514
- break
515
- }
516
- case 'stringLength': {
517
- this.rules[item.model].push({
518
- validator: (rule, value, callback) => {
519
- if (value && value.length < item.rule.minLen) {
520
- callback(new Error('长度不能少于' + item.rule.minLen + '个字符'))
521
- } else if (value && value.length > item.rule.maxLen) {
522
- callback(new Error('长度不能超过' + item.rule.maxLen + '个字符'))
523
- } else {
524
- callback()
525
- }
526
- },
527
- trigger: 'blur'
528
- })
529
- break
530
- }
531
- case 'customJs': {
532
- this.rules[item.model].push({
533
- validator: (rule, value, callback) => {
534
- this.customJsValidate(rule, value, callback, item)
535
- },
536
- trigger: 'blur'
537
- })
538
- break
539
- }
540
- }
541
- }
542
- },
543
- customJsValidate (rule, value, callback, item) {
544
- if (item.rule.customValidatorFunc) {
545
- executeStrFunction(item.rule.customValidatorFunc, [rule, value, callback, this.form, item, this.util])
546
- } else {
547
- callback()
548
- }
549
- },
550
- itemDisabled (value) {
551
- return (this.businessType === '新增' && value.addOrEdit === 'edit') ||
552
- (this.businessType === '修改' && value.addOrEdit === 'add')
553
- },
554
- readonly (value) {
555
- return value.addOrEdit === 'readonly'
556
- },
557
- async onSubmit () {
558
- const valid = await this.validateForm()
559
- if (!valid) return false
560
- this.loading = true
561
- const requestForm = this.prepareForm()
562
- await this.appendSilenceAddFields(requestForm)
563
-
564
- if (this.isTableTemp) {
565
- this.$emit('tempTableModify', {
566
- valid: valid,
567
- form: requestForm,
568
- businessType: this.businessType
569
- })
570
- return
571
- }
572
-
573
- const realForm = this.handleFormKeys(requestForm)
574
- if (this.viewMode) {
575
- this.$message.info('预览模式禁止新增和修改')
576
- return false
577
- }
578
-
579
- if (this.$listeners.onSubmit || this.$listeners.componentDidMounted) {
580
- this.$lowCodeEmit('onSubmit', {
581
- businessType: this.businessType,
582
- serviceName: this.serviceName,
583
- realForm: realForm,
584
- currUserName: this.currUser.name,
585
- currUserId: this.currUser.id,
586
- orgId: this.currUser.orgid
587
- })
588
- this.$emit('onSubmit', {
589
- businessType: this.businessType,
590
- serviceName: this.serviceName,
591
- realForm: realForm,
592
- currUserName: this.currUser.name,
593
- currUserId: this.currUser.id,
594
- orgId: this.currUser.orgid
595
- })
596
- } else {
597
- this.defaultSubmit(realForm)
598
- }
599
- },
600
-
601
- async asyncSubmit () {
602
- return new Promise((resolve, reject) => {
603
- this.$refs.selectForm.validate(async valid => {
604
- if (!valid) {
605
- reject(new Error('Form validation failed'))
606
- return
607
- }
608
- this.loading = true
609
- const requestForm = this.prepareForm()
610
- await this.appendSilenceAddFields(requestForm)
611
- resolve({
612
- businessType: this.businessType,
613
- serviceName: this.serviceName,
614
- realForm: this.handleFormKeys(requestForm),
615
- currUserName: this.currUser.name,
616
- currUserId: this.currUser.id,
617
- orgId: this.currUser.orgid
618
- })
619
- })
620
- })
621
- },
622
-
623
- validateForm () {
624
- return new Promise((resolve) => {
625
- this.$refs.selectForm.validate(valid => resolve(valid))
626
- })
627
- },
628
-
629
- prepareForm () {
630
- const form = { ...this.form }
631
- for (const key of Object.keys(form)) {
632
- const value = form[key]
633
- if (value === null || value === '' || (typeof value === 'object' && Object.keys(value).length === 0)) {
634
- form[key] = undefined
635
- }
636
- }
637
- return form
638
- },
639
-
640
- async appendSilenceAddFields (form) {
641
- if (this.businessType === '新增') {
642
- for (const item of this.silenceAddJsonData) {
643
- switch (item.silencePurpose) {
644
- case 'createTime':
645
- form[item.model] = formatDate('now')
646
- break
647
- case 'operator':
648
- form[item.model] = this.currUser.name
649
- break
650
- case 'operatorId':
651
- form[item.model] = this.currUser.id
652
- break
653
- case 'orgId':
654
- form[item.model] = this.currUser.orgid
655
- break
656
- case 'orgName':
657
- form[item.model] = this.currUser.orgs
658
- break
659
- case 'depId':
660
- form[item.model] = this.currUser.depids
661
- break
662
- case 'depName':
663
- form[item.model] = this.currUser.deps
664
- break
665
- }
666
- }
667
- for (const item of this.silenceAddJsonData.filter((item) => item.silencePurpose === 'customize')) {
668
- form[item.model] = await runLogic(item.silenceSource, form, this.serviceName)
669
- }
670
- }
671
- },
672
-
673
- handleFormKeys (form) {
674
- const realForm = {}
675
- for (const key of Object.keys(form)) {
676
- const value = form[key]
677
- const extraFormKeyTagIndex = key.indexOf('@')
678
- if (extraFormKeyTagIndex !== -1) {
679
- const extraFormKey = key.substring(0, extraFormKeyTagIndex)
680
- const realKey = key.substring(extraFormKeyTagIndex + 1)
681
- if (!realForm[extraFormKey]) {
682
- realForm[extraFormKey] = {}
683
- }
684
- realForm[extraFormKey][realKey] = value
685
- } else {
686
- const realKey = this.isKeyHandle ? this.getRealKey(key) : key
687
- realForm[realKey] = value
688
- }
689
- }
690
- return realForm
691
- },
692
- // 默认提交事件
693
- defaultSubmit (realForm, callback) {
694
- // 组织请求
695
- const requestParameters = {
696
- queryParamsName: this.configName,
697
- queryParams: this.configContent,
698
- form: realForm,
699
- businessType: this.businessType,
700
- operator: this.currUser.name
701
- }
702
- addOrModify(requestParameters, this.serviceName, this.env === 'dev').then(data => {
703
- this.$message.success(this.businessType + '成功!')
704
- // commit
705
- this.$emit('afterSubmit', { type: this.businessType, id: data.id, form: requestParameters.form })
706
- }).catch(e => {
707
- this.$message.error(this.businessType + '失败:' + e)
708
- }).finally(() => {
709
- this.loading = false
710
- if (callback) {
711
- callback()
712
- }
713
- })
714
- },
715
- // 获取表单字段实际值
716
- getRealKey (key) {
717
- if (this.isHandleFormKey) {
718
- return key.substring(key.indexOf('_') + 1)
719
- } else {
720
- return key
721
- }
722
- },
723
- /**
724
- * 获取被修改记录数据
725
- * @param modifyModelData 被修改记录的数据
726
- */
727
- getModifyModelData (modifyModelData) {
728
- if (modifyModelData.primaryKeyData) {
729
- this.form = Object.assign(this.form, modifyModelData.primaryKeyData)
730
- }
731
- // 对动态简易表单项特殊处理
732
- for (const key in modifyModelData.data) {
733
- const realKey = this.isKeyHandle ? this.getRealKey(key) : key
734
- if (this.simpleFormJsonData[realKey]) {
735
- const extraForm = JSON.parse(modifyModelData.data[key])
736
- for (const key in extraForm) {
737
- const model = realKey + '@' + key
738
- this.form[model] = extraForm[key]
739
- }
740
- }
741
- }
742
- // 对普通表单项处理
743
- for (let i = 0; i < this.realJsonData.length; i++) {
744
- if (['FilesId', 'Images'].includes(this.realJsonData[i])) {
745
- // 附件需要跳过 因为会通过 modifyModelData中的files,images属性给upload赋值
746
- // 新增修改表单每次提交时只会提交最新添加的文件
747
- continue
748
- }
749
- const item = this.realJsonData[i]
750
- if (modifyModelData.data[item.model] || modifyModelData.data[item.model] === 0) {
751
- if (modifyModelData.data[item.model] instanceof Array) {
752
- this.form[item.model] = modifyModelData.data[item.model]
753
- } else {
754
- this.form[item.model] = modifyModelData.data[item.model] + ''
755
- }
756
- }
757
- }
758
- // 对分组表单进行处理
759
- for (let i = 0; i < this.groupJsonData.length; i++) {
760
- const item = this.groupJsonData[i]
761
- try {
762
- if (modifyModelData.data[item.model]) {
763
- this.form[item.model] = JSON.parse(modifyModelData.data[item.model])
764
- }
765
- } catch (e) {
766
- }
767
- }
768
- // 追加版本号信息
769
- for (const item of this.versionJsonData) {
770
- if (!modifyModelData.data[item.model]) {
771
- this.form[item.model] = 0
772
- } else {
773
- this.form[item.model] = modifyModelData.data[item.model] + ''
774
- }
775
- }
776
- },
777
- setForm (obj) {
778
- this.form = Object.assign(this.form, obj)
779
- },
780
- emitFunc (func, data) {
781
- this.$emit('x-form-item-emit-func', func, data)
782
- }
783
- },
784
- watch: {
785
- configNameForLowCode: {
786
- handler () {
787
- this.init()
788
- }
789
- },
790
- systemNameForLowCode: {
791
- handler () {
792
- this.init()
793
- }
794
- },
795
- }
796
- }
797
- </script>
798
-
799
- <style scoped>
800
- :deep(.ant-form-inline .ant-form-item ) {
801
- display: block !important;
802
- }
803
-
804
- :deep(.ant-form-item-with-help) {
805
- margin-bottom: 0;
806
- }
807
- </style>
1
+ <template>
2
+ <div>
3
+ <a-form-model
4
+ v-if="loaded"
5
+ ref="selectForm"
6
+ :zIndex="1001"
7
+ :model="form"
8
+ v-bind="formItemLayout"
9
+ :layout="layout"
10
+ :rules="rules">
11
+ <a-row :gutter="16" type="flex">
12
+ <x-form-item
13
+ v-for="(item, index) in realJsonData"
14
+ :key="index"
15
+ :attr="item"
16
+ :disabled="itemDisabled(item)"
17
+ :read-only="readonly(item)"
18
+ :files="files"
19
+ :style="layout ==='inline'?{marginTop:'5px'}:undefined"
20
+ :form="form"
21
+ :images="images"
22
+ :service-name="serviceName"
23
+ mode="新增/修改"
24
+ :layout="layout"
25
+ :get-data-params="getDataParams"
26
+ :env="env"
27
+ @x-form-item-emit-func="emitFunc"
28
+ :setForm="setForm"
29
+ />
30
+ </a-row>
31
+ <a-row :gutter="16" v-for="(groupItem, groupIndex) in groupJsonData" :key="groupIndex">
32
+ <a-card v-if="groupItem.groupItems.length > 0" :title="groupItem.name" :bordered="false" size="small">
33
+ <x-form-item
34
+ v-for="(item, index) in groupItem.groupItems"
35
+ :key="index"
36
+ :attr="item"
37
+ :disabled="itemDisabled(item)"
38
+ :readonly="readonly(item)"
39
+ :files="files"
40
+ :style="layout ==='inline'?{marginTop:'5px'}:undefined"
41
+ :form="form[groupItem.model]"
42
+ :images="images"
43
+ :service-name="serviceName"
44
+ mode="新增/修改"
45
+ :get-data-params="getDataParams"
46
+ :env="env"
47
+ :setForm="setForm"
48
+ />
49
+ </a-card>
50
+ <template v-else>
51
+ <slot
52
+ name="groupFormItems"
53
+ :form="form"
54
+ :model="groupItem.model"
55
+ :rules="rules"
56
+ :modifyModelData="modifyModelData"></slot>
57
+ </template>
58
+ </a-row>
59
+ <a-row :gutter="16" v-for="(item, key) in simpleFormJsonData" :key="'row' + key">
60
+ <a-card v-if="item.value.length > 0" :title="item.name" :bordered="false" size="small">
61
+ <x-form-item
62
+ v-for="(formItem, formItemIndex) in item.value"
63
+ :key="key + formItemIndex"
64
+ :attr="formItem"
65
+ :disabled="itemDisabled(formItem)"
66
+ :readonly="readonly(formItem)"
67
+ :files="files"
68
+ :style="layout ==='inline'?{marginTop:'5px'}:undefined"
69
+ :form="form[groupItem.model]"
70
+ :images="images"
71
+ :service-name="serviceName"
72
+ mode="新增/修改"
73
+ :get-data-params="getDataParams"
74
+ :env="env"
75
+ :setForm="setForm"
76
+ />
77
+ </a-card>
78
+ </a-row>
79
+ </a-form-model>
80
+ <a-row type="flex" justify="end">
81
+ <a-button v-if="showSubmitBtn" :loading="loading" type="primary" @click="onSubmit()">提交</a-button>
82
+ </a-row>
83
+ </div>
84
+ </template>
85
+ <script>
86
+ import XFormItem from '@vue2-client/base-client/components/common/XForm/XFormItem'
87
+ import { formatDate } from '@vue2-client/utils/util'
88
+ import { mapState } from 'vuex'
89
+ import { addOrModify, getConfigByName, runLogic } from '@vue2-client/services/api/common'
90
+ import lowcodeComponentMixin from '@vue2-client/utils/lowcode/lowcodeComponentMixin'
91
+ import { checkIdNumber, REG_EMAIL, REG_LANDLINE, REG_PHONE } from '@vue2-client/utils/reg'
92
+ import moment from 'moment/moment'
93
+ import executeStrFunction from '@vue2-client/utils/runEvalFunction'
94
+
95
+ export default {
96
+ name: 'XAddNativeForm',
97
+ components: {
98
+ XFormItem
99
+ },
100
+ props: {
101
+ configNameForLowCode: {
102
+ type: String,
103
+ default: undefined
104
+ },
105
+ systemNameForLowCode: {
106
+ type: String,
107
+ default: undefined
108
+ }
109
+ },
110
+ mixins: [lowcodeComponentMixin],
111
+ data () {
112
+ return {
113
+ // 预览模式
114
+ viewMode: false,
115
+ // 是否处理表单Key值
116
+ isHandleFormKey: true,
117
+ // 内容加载是否完成
118
+ loaded: false,
119
+ // 业务类型
120
+ businessType: '',
121
+ // 业务标题
122
+ title: '',
123
+ // 新增或修改业务是否执行中
124
+ loading: false,
125
+ // 表单Model
126
+ form: {},
127
+ // 配置名称
128
+ configName: undefined,
129
+ // 配置内容,用于查询配置生成器的预览
130
+ configContent: undefined,
131
+ // 表单项集合
132
+ formItems: [],
133
+ // 服务名称
134
+ serviceName: undefined,
135
+ // 是否显示提交按钮
136
+ showSubmitBtn: true,
137
+ // 修改有文件的表单时使用
138
+ files: [],
139
+ images: [],
140
+ // 校验
141
+ rules: {},
142
+ // 调用logic获取数据源的追加参数
143
+ getDataParams: {},
144
+ // 是否为临时表
145
+ isTableTemp: false,
146
+ // 是否处理表单key
147
+ isKeyHandle: true,
148
+ // 动态简易表单集合
149
+ simpleFormJsonData: {},
150
+ // 待修改的数据集
151
+ modifyModelData: {},
152
+ // 当前环境
153
+ env: 'prod',
154
+ // 表单模式 horizontal | vertical | inline
155
+ layout: 'horizontal'
156
+ }
157
+ },
158
+ computed: {
159
+ // 过滤出用于新增/修改场景的表单项
160
+ realJsonData: function () {
161
+ return this.formItems.filter((item) => {
162
+ return item.addOrEdit && item.addOrEdit !== 'no' && item.addOrEdit !== 'silenceAdd' && item.addOrEdit !== 'version' && !this.itemDisabled(item)
163
+ })
164
+ },
165
+ // 过滤出用于新增/修改场景的表单项
166
+ groupJsonData: function () {
167
+ return this.formItems.filter((item) => {
168
+ return item.type === 'group'
169
+ }).map((item) => {
170
+ item.groupItems = item.groupItems.filter((item) => {
171
+ return item.addOrEdit && item.addOrEdit !== 'no' && item.addOrEdit !== 'silenceAdd' && item.addOrEdit !== 'version' && !this.itemDisabled(item)
172
+ }).map((groupItem) => {
173
+ // 只保留第一个下划线后面的内容
174
+ // 多层校验规则需要将prop设置为 key1.key2.....
175
+ groupItem.prop = `${item.model}.${groupItem.model.substring(groupItem.model.indexOf('_') + 1)}`
176
+ groupItem.model = groupItem.model.substring(groupItem.model.indexOf('_') + 1)
177
+ return groupItem
178
+ })
179
+ return item
180
+ }
181
+ )
182
+ },
183
+ // 过滤出用于静默新增场景的表单项
184
+ silenceAddJsonData: function () {
185
+ return this.formItems.filter(function (item) {
186
+ return item.addOrEdit === 'silenceAdd'
187
+ })
188
+ },
189
+ // 过滤出版本号表单项
190
+ versionJsonData: function () {
191
+ return this.formItems.filter(function (item) {
192
+ return item.addOrEdit === 'version'
193
+ })
194
+ },
195
+ formItemLayout () {
196
+ if (this.layout === 'horizontal') {
197
+ return {
198
+ labelCol: { span: 4, offset: 2 },
199
+ wrapperCol: { span: 14 },
200
+ }
201
+ }
202
+ if (this.layout === 'vertical') {
203
+ return {}
204
+ }
205
+ return {
206
+ labelCol: { span: 6 },
207
+ wrapperCol: { span: 18 },
208
+ }
209
+ },
210
+ ...mapState('account', { currUser: 'user' })
211
+ },
212
+ mounted () {
213
+ if (this.configNameForLowCode !== undefined && this.systemNameForLowCode !== undefined) {
214
+ getConfigByName(this.configNameForLowCode, this.systemNameForLowCode, (res) => {
215
+ this.init({
216
+ formItems: res.formJson,
217
+ title: this.modalTitle,
218
+ businessType: this.businessType,
219
+ layout: res.xAddFormLayout,
220
+ isKeyHandle: res.isKeyHandle
221
+ })
222
+ })
223
+ }
224
+ },
225
+ methods: {
226
+ init (params) {
227
+ const {
228
+ configName, configContent, formItems, viewMode, isHandleFormKey = true,
229
+ showSubmitBtn = true, serviceName, isTableTemp = false, isKeyHandle = true,
230
+ modifyModelData = {}, businessType, title, fixedAddForm = {}, getDataParams = {},
231
+ simpleFormJsonData = {}, env = 'prod', layout = 'horizontal'
232
+ } = params
233
+ this.loaded = false
234
+ this.layout = layout
235
+ this.configName = configName
236
+ this.configContent = configContent
237
+ if (typeof formItems === 'string') {
238
+ this.formItems = JSON.parse(formItems)
239
+ } else {
240
+ this.formItems = JSON.parse(JSON.stringify(formItems))
241
+ }
242
+ this.viewMode = viewMode
243
+ this.isHandleFormKey = isHandleFormKey
244
+ this.showSubmitBtn = showSubmitBtn
245
+ this.serviceName = serviceName
246
+ this.businessType = businessType
247
+ this.title = title
248
+ this.getDataParams = getDataParams
249
+ this.simpleFormJsonData = simpleFormJsonData
250
+ this.env = env
251
+ this.isTableTemp = isTableTemp
252
+ this.isKeyHandle = isKeyHandle
253
+ // 设置普通表单项的相关参数
254
+ const formData = Object.assign({}, fixedAddForm)
255
+ for (let i = 0; i < this.realJsonData.length; i++) {
256
+ const item = this.realJsonData[i]
257
+ this.setFormProps(formData, item, null)
258
+ }
259
+ // 设置表单分组项目相关参数
260
+ for (let i = 0; i < this.groupJsonData.length; i++) {
261
+ const groupItem = this.groupJsonData[i]
262
+ formData[groupItem.model] = {}
263
+ for (let j = 0; j < groupItem.groupItems.length; j++) {
264
+ const item = groupItem.groupItems[j]
265
+ this.setFormProps(formData[groupItem.model], item, item.prop)
266
+ }
267
+ }
268
+ // 设置动态简易表单项的相关参数
269
+ for (const key in this.simpleFormJsonData) {
270
+ for (const item of this.simpleFormJsonData[key].value) {
271
+ item.model = key + '@' + item.model
272
+ this.setFormProps(formData, item, null)
273
+ }
274
+ }
275
+
276
+ this.form = formData
277
+ // 修改场景下对表单项赋值
278
+ if (modifyModelData && modifyModelData.data) {
279
+ this.modifyModelData = modifyModelData
280
+ this.files = modifyModelData.files
281
+ this.images = modifyModelData.images
282
+ if (Object.keys(modifyModelData.data).length > 0) {
283
+ this.getModifyModelData(modifyModelData)
284
+ }
285
+ }
286
+ this.loaded = true
287
+ },
288
+ // 时间组件赋默认值
289
+ getDateRange (type, defaultValue) {
290
+ // const format = type === 'datePicker' ? 'YYYY-MM-DD' : 'YYYY-MM-DD HH:mm:ss'
291
+ const format = 'YYYY-MM-DD HH:mm:ss'
292
+ let start
293
+ switch (defaultValue) {
294
+ case 'curYear':
295
+ start = moment().startOf('year').format(format)
296
+ break
297
+ case 'curMonth':
298
+ start = moment().startOf('month').format(format)
299
+ break
300
+ case 'curDay':
301
+ start = moment().startOf('day').format(format)
302
+ break
303
+ default:
304
+ return defaultValue
305
+ }
306
+ return start
307
+ },
308
+ setFormProps (formData, item, groupItem) {
309
+ if (!formData[item.model]) {
310
+ formData[item.model] = undefined
311
+ }
312
+ if (!formData[item.model] && item.formDefault) {
313
+ if (['datePicker', 'rangePicker', 'yearPicker', 'monthPicker'].includes(item.type)) {
314
+ formData[item.model] = this.getDateRange(item.type, item.formDefault)
315
+ } else if (['treeSelect', 'select', 'checkbox'].includes(item.type) && ['curOrgId', 'curDepId', 'curUserId'].includes(item.queryFormDefault)) {
316
+ if (item.queryFormDefault === 'curOrgId') {
317
+ formData[item.model] = item.type === 'select' ? this.currUser.orgid : [this.currUser.orgid]
318
+ }
319
+ if (item.queryFormDefault === 'curDepId') {
320
+ formData[item.model] = item.type === 'select' ? this.currUser.depids : [this.currUser.depids]
321
+ }
322
+ if (item.queryFormDefault === 'curUserId') {
323
+ formData[item.model] = item.type === 'select' ? this.currUser.id : [this.currUser.id]
324
+ }
325
+ } else {
326
+ formData[item.model] = item.formDefault
327
+ }
328
+ }
329
+ // 处理表单校验情况
330
+ if (item.rule) {
331
+ if (groupItem) {
332
+ this.rules[groupItem] = []
333
+ } else {
334
+ this.rules[item.model] = []
335
+ }
336
+ const required = item.rule.required ? item.rule.required === true || item.rule.required === 'true' : false
337
+ let trigger
338
+ let message
339
+ if (required) {
340
+ switch (item.type) {
341
+ case 'select':
342
+ case 'checkbox':
343
+ case 'radio':
344
+ case 'treeSelect':
345
+ case 'rangePicker':
346
+ case 'monthPicker':
347
+ case 'yearPicker':
348
+ case 'datePicker':
349
+ case 'file':
350
+ case 'image':
351
+ case 'citySelect':
352
+ case 'addressSearch':
353
+ case 'personSetting':
354
+ message = '请选择' + item.name
355
+ trigger = 'change'
356
+ break
357
+ default:
358
+ message = '请输入' + item.name
359
+ trigger = 'blur'
360
+ }
361
+ if (groupItem) {
362
+ this.rules[groupItem].push({
363
+ required: true,
364
+ message: message,
365
+ trigger: trigger
366
+ })
367
+ } else {
368
+ this.rules[item.model].push({
369
+ required: true,
370
+ message: message,
371
+ trigger: trigger
372
+ })
373
+ }
374
+ }
375
+
376
+ switch (item.rule.type) {
377
+ case 'number':
378
+ case 'integer':
379
+ case 'float':
380
+ // eslint-disable-next-line no-case-declarations
381
+ let defaultValue
382
+ // eslint-disable-next-line no-case-declarations
383
+ let message
384
+ switch (item.rule.type) {
385
+ case 'number':
386
+ item.numberInput = true
387
+ message = '数字'
388
+ defaultValue = 0
389
+ break
390
+ case 'integer':
391
+ item.numberInput = true
392
+ message = '整数'
393
+ defaultValue = 0
394
+ break
395
+ case 'float':
396
+ item.numberInput = true
397
+ message = '小数'
398
+ defaultValue = 0.0
399
+ break
400
+ }
401
+ if (groupItem) {
402
+ this.rules[groupItem].push({
403
+ type: item.rule.type,
404
+ message: item.name + '必须为' + message,
405
+ transform: (value) => {
406
+ if (value && value.length !== 0) {
407
+ return Number(value)
408
+ } else {
409
+ return defaultValue
410
+ }
411
+ },
412
+ trigger: 'blur'
413
+ })
414
+ } else {
415
+ this.rules[item.model].push({
416
+ type: item.rule.type,
417
+ message: item.name + '必须为' + message,
418
+ transform: (value) => {
419
+ if (value && value.length !== 0) {
420
+ return Number(value)
421
+ } else {
422
+ return defaultValue
423
+ }
424
+ },
425
+ trigger: 'blur'
426
+ })
427
+ }
428
+ break
429
+ case 'email': {
430
+ const validator = (rule, value, callback) => {
431
+ if (value && !REG_EMAIL.test(value)) {
432
+ callback(new Error('请输入正确的邮箱地址'))
433
+ } else {
434
+ callback()
435
+ }
436
+ }
437
+ this.rules[groupItem || item.model].push({
438
+ type: 'email',
439
+ validator: validator,
440
+ message: '请输入正确的邮箱地址',
441
+ trigger: 'blur'
442
+ })
443
+ break
444
+ }
445
+ case 'userPhone': {
446
+ this.rules[groupItem || item.model].push({
447
+ type: 'userPhone',
448
+ validator: (rule, value, callback) => {
449
+ if (value && !REG_PHONE.test(value)) {
450
+ callback(new Error('请输入正确的手机号码'))
451
+ } else {
452
+ callback()
453
+ }
454
+ },
455
+ message: '请输入正确的手机号码',
456
+ trigger: 'blur'
457
+ })
458
+ break
459
+ }
460
+ case 'idNumber': {
461
+ this.rules[groupItem || item.model].push({
462
+ validator: (rule, value, callback) => {
463
+ if (value && !checkIdNumber(value)) {
464
+ callback(new Error('请输入正确的身份证号码'))
465
+ } else {
466
+ callback()
467
+ }
468
+ },
469
+ trigger: 'blur'
470
+ })
471
+ break
472
+ }
473
+ case 'landlineNumber': {
474
+ this.rules[item.model].push({
475
+ validator: (rule, value, callback) => {
476
+ if (value && !REG_LANDLINE.test(value)) {
477
+ callback(new Error('请输入正确的座机号码'))
478
+ } else {
479
+ callback()
480
+ }
481
+ },
482
+ trigger: 'blur'
483
+ })
484
+ break
485
+ }
486
+ // 大于0
487
+ case 'greaterThanZero': {
488
+ item.numberInput = true
489
+ this.rules[item.model].push({
490
+ validator: (rule, value, callback) => {
491
+ if (isNaN(value) || value <= 0) {
492
+ callback(new Error('请输入一个大于0的数字'))
493
+ } else {
494
+ callback()
495
+ }
496
+ },
497
+ trigger: 'blur'
498
+ })
499
+ break
500
+ }
501
+ // 大于等于0
502
+ case 'greaterThanOrEqualZero': {
503
+ item.numberInput = true
504
+ this.rules[item.model].push({
505
+ validator: (rule, value, callback) => {
506
+ if (isNaN(value) || value < 0) {
507
+ callback(new Error('请输入一个大于等于0的数字'))
508
+ } else {
509
+ callback()
510
+ }
511
+ },
512
+ trigger: 'blur'
513
+ })
514
+ break
515
+ }
516
+ case 'stringLength': {
517
+ this.rules[item.model].push({
518
+ validator: (rule, value, callback) => {
519
+ if (value && value.length < item.rule.minLen) {
520
+ callback(new Error('长度不能少于' + item.rule.minLen + '个字符'))
521
+ } else if (value && value.length > item.rule.maxLen) {
522
+ callback(new Error('长度不能超过' + item.rule.maxLen + '个字符'))
523
+ } else {
524
+ callback()
525
+ }
526
+ },
527
+ trigger: 'blur'
528
+ })
529
+ break
530
+ }
531
+ case 'customJs': {
532
+ this.rules[item.model].push({
533
+ validator: (rule, value, callback) => {
534
+ this.customJsValidate(rule, value, callback, item)
535
+ },
536
+ trigger: 'blur'
537
+ })
538
+ break
539
+ }
540
+ }
541
+ }
542
+ },
543
+ customJsValidate (rule, value, callback, item) {
544
+ if (item.rule.customValidatorFunc) {
545
+ executeStrFunction(item.rule.customValidatorFunc, [rule, value, callback, this.form, item, this.util])
546
+ } else {
547
+ callback()
548
+ }
549
+ },
550
+ itemDisabled (value) {
551
+ return (this.businessType === '新增' && value.addOrEdit === 'edit') ||
552
+ (this.businessType === '修改' && value.addOrEdit === 'add')
553
+ },
554
+ readonly (value) {
555
+ return value.addOrEdit === 'readonly'
556
+ },
557
+ async onSubmit () {
558
+ const valid = await this.validateForm()
559
+ if (!valid) return false
560
+ this.loading = true
561
+ const requestForm = this.prepareForm()
562
+ await this.appendSilenceAddFields(requestForm)
563
+
564
+ if (this.isTableTemp) {
565
+ this.$emit('tempTableModify', {
566
+ valid: valid,
567
+ form: requestForm,
568
+ businessType: this.businessType
569
+ })
570
+ return
571
+ }
572
+
573
+ const realForm = this.handleFormKeys(requestForm)
574
+ if (this.viewMode) {
575
+ this.$message.info('预览模式禁止新增和修改')
576
+ return false
577
+ }
578
+
579
+ if (this.$listeners.onSubmit || this.$listeners.componentDidMounted) {
580
+ this.$lowCodeEmit('onSubmit', {
581
+ businessType: this.businessType,
582
+ serviceName: this.serviceName,
583
+ realForm: realForm,
584
+ currUserName: this.currUser.name,
585
+ currUserId: this.currUser.id,
586
+ orgId: this.currUser.orgid
587
+ })
588
+ this.$emit('onSubmit', {
589
+ businessType: this.businessType,
590
+ serviceName: this.serviceName,
591
+ realForm: realForm,
592
+ currUserName: this.currUser.name,
593
+ currUserId: this.currUser.id,
594
+ orgId: this.currUser.orgid
595
+ })
596
+ } else {
597
+ this.defaultSubmit(realForm)
598
+ }
599
+ },
600
+
601
+ async asyncSubmit () {
602
+ return new Promise((resolve, reject) => {
603
+ this.$refs.selectForm.validate(async valid => {
604
+ if (!valid) {
605
+ reject(new Error('Form validation failed'))
606
+ return
607
+ }
608
+ this.loading = true
609
+ const requestForm = this.prepareForm()
610
+ await this.appendSilenceAddFields(requestForm)
611
+ resolve({
612
+ businessType: this.businessType,
613
+ serviceName: this.serviceName,
614
+ realForm: this.handleFormKeys(requestForm),
615
+ currUserName: this.currUser.name,
616
+ currUserId: this.currUser.id,
617
+ orgId: this.currUser.orgid
618
+ })
619
+ })
620
+ })
621
+ },
622
+
623
+ validateForm () {
624
+ return new Promise((resolve) => {
625
+ this.$refs.selectForm.validate(valid => resolve(valid))
626
+ })
627
+ },
628
+
629
+ prepareForm () {
630
+ const form = { ...this.form }
631
+ for (const key of Object.keys(form)) {
632
+ const value = form[key]
633
+ if (value === null || value === '' || (typeof value === 'object' && Object.keys(value).length === 0)) {
634
+ form[key] = undefined
635
+ }
636
+ }
637
+ return form
638
+ },
639
+
640
+ async appendSilenceAddFields (form) {
641
+ if (this.businessType === '新增') {
642
+ for (const item of this.silenceAddJsonData) {
643
+ switch (item.silencePurpose) {
644
+ case 'createTime':
645
+ form[item.model] = formatDate('now')
646
+ break
647
+ case 'operator':
648
+ form[item.model] = this.currUser.name
649
+ break
650
+ case 'operatorId':
651
+ form[item.model] = this.currUser.id
652
+ break
653
+ case 'orgId':
654
+ form[item.model] = this.currUser.orgid
655
+ break
656
+ case 'orgName':
657
+ form[item.model] = this.currUser.orgs
658
+ break
659
+ case 'depId':
660
+ form[item.model] = this.currUser.depids
661
+ break
662
+ case 'depName':
663
+ form[item.model] = this.currUser.deps
664
+ break
665
+ }
666
+ }
667
+ for (const item of this.silenceAddJsonData.filter((item) => item.silencePurpose === 'customize')) {
668
+ form[item.model] = await runLogic(item.silenceSource, form, this.serviceName)
669
+ }
670
+ }
671
+ },
672
+
673
+ handleFormKeys (form) {
674
+ const realForm = {}
675
+ for (const key of Object.keys(form)) {
676
+ const value = form[key]
677
+ const extraFormKeyTagIndex = key.indexOf('@')
678
+ if (extraFormKeyTagIndex !== -1) {
679
+ const extraFormKey = key.substring(0, extraFormKeyTagIndex)
680
+ const realKey = key.substring(extraFormKeyTagIndex + 1)
681
+ if (!realForm[extraFormKey]) {
682
+ realForm[extraFormKey] = {}
683
+ }
684
+ realForm[extraFormKey][realKey] = value
685
+ } else {
686
+ const realKey = this.isKeyHandle ? this.getRealKey(key) : key
687
+ realForm[realKey] = value
688
+ }
689
+ }
690
+ return realForm
691
+ },
692
+ // 默认提交事件
693
+ defaultSubmit (realForm, callback) {
694
+ // 组织请求
695
+ const requestParameters = {
696
+ queryParamsName: this.configName,
697
+ queryParams: this.configContent,
698
+ form: realForm,
699
+ businessType: this.businessType,
700
+ operator: this.currUser.name
701
+ }
702
+ addOrModify(requestParameters, this.serviceName, this.env === 'dev').then(data => {
703
+ this.$message.success(this.businessType + '成功!')
704
+ // commit
705
+ this.$emit('afterSubmit', { type: this.businessType, id: data.id, form: requestParameters.form })
706
+ }).catch(e => {
707
+ this.$message.error(this.businessType + '失败:' + e)
708
+ }).finally(() => {
709
+ this.loading = false
710
+ if (callback) {
711
+ callback()
712
+ }
713
+ })
714
+ },
715
+ // 获取表单字段实际值
716
+ getRealKey (key) {
717
+ if (this.isHandleFormKey) {
718
+ return key.substring(key.indexOf('_') + 1)
719
+ } else {
720
+ return key
721
+ }
722
+ },
723
+ /**
724
+ * 获取被修改记录数据
725
+ * @param modifyModelData 被修改记录的数据
726
+ */
727
+ getModifyModelData (modifyModelData) {
728
+ if (modifyModelData.primaryKeyData) {
729
+ this.form = Object.assign(this.form, modifyModelData.primaryKeyData)
730
+ }
731
+ // 对动态简易表单项特殊处理
732
+ for (const key in modifyModelData.data) {
733
+ const realKey = this.isKeyHandle ? this.getRealKey(key) : key
734
+ if (this.simpleFormJsonData[realKey]) {
735
+ const extraForm = JSON.parse(modifyModelData.data[key])
736
+ for (const key in extraForm) {
737
+ const model = realKey + '@' + key
738
+ this.form[model] = extraForm[key]
739
+ }
740
+ }
741
+ }
742
+ // 对普通表单项处理
743
+ for (let i = 0; i < this.realJsonData.length; i++) {
744
+ if (['FilesId', 'Images'].includes(this.realJsonData[i])) {
745
+ // 附件需要跳过 因为会通过 modifyModelData中的files,images属性给upload赋值
746
+ // 新增修改表单每次提交时只会提交最新添加的文件
747
+ continue
748
+ }
749
+ const item = this.realJsonData[i]
750
+ if (modifyModelData.data[item.model] || modifyModelData.data[item.model] === 0) {
751
+ if (modifyModelData.data[item.model] instanceof Array) {
752
+ this.form[item.model] = modifyModelData.data[item.model]
753
+ } else {
754
+ this.form[item.model] = modifyModelData.data[item.model] + ''
755
+ }
756
+ }
757
+ }
758
+ // 对分组表单进行处理
759
+ for (let i = 0; i < this.groupJsonData.length; i++) {
760
+ const item = this.groupJsonData[i]
761
+ try {
762
+ if (modifyModelData.data[item.model]) {
763
+ this.form[item.model] = JSON.parse(modifyModelData.data[item.model])
764
+ }
765
+ } catch (e) {
766
+ }
767
+ }
768
+ // 追加版本号信息
769
+ for (const item of this.versionJsonData) {
770
+ if (!modifyModelData.data[item.model]) {
771
+ this.form[item.model] = 0
772
+ } else {
773
+ this.form[item.model] = modifyModelData.data[item.model] + ''
774
+ }
775
+ }
776
+ },
777
+ setForm (obj) {
778
+ this.form = Object.assign(this.form, obj)
779
+ },
780
+ emitFunc (func, data) {
781
+ this.$emit('x-form-item-emit-func', func, data)
782
+ }
783
+ },
784
+ watch: {
785
+ configNameForLowCode: {
786
+ handler () {
787
+ this.init()
788
+ }
789
+ },
790
+ systemNameForLowCode: {
791
+ handler () {
792
+ this.init()
793
+ }
794
+ },
795
+ }
796
+ }
797
+ </script>
798
+
799
+ <style scoped>
800
+ :deep(.ant-form-inline .ant-form-item ) {
801
+ display: block !important;
802
+ }
803
+
804
+ :deep(.ant-form-item-with-help) {
805
+ margin-bottom: 0;
806
+ }
807
+ </style>