vue2-client 1.8.310 → 1.8.311

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 (215) 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/LowCodeEditorModal.vue +108 -108
  45. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorPanel.vue +350 -350
  46. package/src/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue +502 -502
  47. package/src/base-client/components/common/LowCodeComponent/LowCodeRender.vue +699 -699
  48. package/src/base-client/components/common/LowCodeComponent/LowCodeRenderEnter.vue +29 -29
  49. package/src/base-client/components/common/LowCodeComponent/LowCodeUIStore.vue +162 -162
  50. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeAddPageModal.vue +117 -117
  51. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeCustomJSModal.vue +80 -80
  52. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeEventEditorModal.vue +398 -398
  53. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLifeCycleModal.vue +65 -65
  54. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicCallbackModal.vue +64 -64
  55. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicParamModal.vue +73 -73
  56. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeRunFunctionParamModal.vue +76 -76
  57. package/src/base-client/components/common/PersonSetting/PersonSetting.vue +208 -208
  58. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  59. package/src/base-client/components/common/Tree/Tree.vue +149 -149
  60. package/src/base-client/components/common/Tree/index.js +2 -2
  61. package/src/base-client/components/common/Upload/Upload.vue +239 -239
  62. package/src/base-client/components/common/Upload/index.js +3 -3
  63. package/src/base-client/components/common/XAddForm/XAddForm.vue +105 -105
  64. package/src/base-client/components/common/XAddNativeForm/XAddNativeForm.vue +807 -807
  65. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  66. package/src/base-client/components/common/XAddNativeForm/lowcodeEditorRegister.js +16 -16
  67. package/src/base-client/components/common/XAddNativeFormOA/XAddNativeFormOA.vue +303 -303
  68. package/src/base-client/components/common/XAddNativeFormOA/index.js +3 -3
  69. package/src/base-client/components/common/XAddNativeFormOA/index.md +146 -146
  70. package/src/base-client/components/common/XBadge/XBadge.vue +78 -78
  71. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  72. package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
  73. package/src/base-client/components/common/XDataDrawer/index.js +3 -3
  74. package/src/base-client/components/common/XDataDrawer/index.md +41 -41
  75. package/src/base-client/components/common/XDescriptions/XDescriptions.vue +187 -187
  76. package/src/base-client/components/common/XDescriptions/XDescriptionsGroup.vue +306 -306
  77. package/src/base-client/components/common/XDescriptions/demo.vue +50 -50
  78. package/src/base-client/components/common/XDescriptions/index.js +3 -3
  79. package/src/base-client/components/common/XDescriptions/index.md +83 -83
  80. package/src/base-client/components/common/XDescriptions/lowcodeEditorRegister.js +31 -31
  81. package/src/base-client/components/common/XDetailsView/XDetailsView.vue +214 -214
  82. package/src/base-client/components/common/XDetailsView/index.js +3 -3
  83. package/src/base-client/components/common/XForm/XForm.vue +294 -294
  84. package/src/base-client/components/common/XForm/XFormItem.vue +911 -911
  85. package/src/base-client/components/common/XForm/XTreeSelect.vue +207 -207
  86. package/src/base-client/components/common/XForm/index.md +178 -178
  87. package/src/base-client/components/common/XFormCol/XFormCol.vue +36 -36
  88. package/src/base-client/components/common/XFormGroup/XFormGroup.vue +241 -241
  89. package/src/base-client/components/common/XFormGroup/demo.vue +40 -40
  90. package/src/base-client/components/common/XFormGroup/index.js +3 -3
  91. package/src/base-client/components/common/XFormGroup/index.md +38 -38
  92. package/src/base-client/components/common/XFormGroupDetails/XFormGroupDetails.vue +72 -72
  93. package/src/base-client/components/common/XFormGroupDetails/index.js +3 -3
  94. package/src/base-client/components/common/XFormTable/XFormTable.vue +539 -539
  95. package/src/base-client/components/common/XFormTable/demo.vue +72 -72
  96. package/src/base-client/components/common/XFormTable/index.md +98 -98
  97. package/src/base-client/components/common/XFormTable/lowcodeEditorRegister.js +30 -30
  98. package/src/base-client/components/common/XImportExcel/XImportExcel.vue +147 -147
  99. package/src/base-client/components/common/XReport/XReport.vue +858 -858
  100. package/src/base-client/components/common/XReport/XReportDemo.vue +266 -266
  101. package/src/base-client/components/common/XReport/XReportDesign.vue +509 -509
  102. package/src/base-client/components/common/XReport/XReportJsonRender.vue +295 -295
  103. package/src/base-client/components/common/XReport/XReportTrGroup.vue +801 -801
  104. package/src/base-client/components/common/XReport/index.js +3 -3
  105. package/src/base-client/components/common/XReport/index.md +44 -44
  106. package/src/base-client/components/common/XReportSlot/XReportSlot.vue +110 -110
  107. package/src/base-client/components/common/XReportSlot/index.js +3 -3
  108. package/src/base-client/components/common/XReportSlot/index.md +48 -48
  109. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  110. package/src/base-client/components/common/XStepView/index.js +3 -3
  111. package/src/base-client/components/common/XStepView/index.md +31 -31
  112. package/src/base-client/components/common/XTable/XTable.vue +676 -676
  113. package/src/base-client/components/common/XTable/index.md +255 -255
  114. package/src/base-client/components/common/XTree/XTree.vue +423 -423
  115. package/src/base-client/components/common/XTree/index.js +3 -3
  116. package/src/base-client/components/common/XTree/index.md +36 -36
  117. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +114 -114
  118. package/src/base-client/components/common/XTreeOne/lowcodeEditorRegister.js +11 -11
  119. package/src/base-client/components/index.js +51 -51
  120. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  121. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -281
  122. package/src/base-client/plugins/AppData.js +121 -121
  123. package/src/base-client/plugins/Config.js +19 -19
  124. package/src/base-client/plugins/GetLoginInfoService.js +183 -183
  125. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  126. package/src/bootstrap.js +39 -39
  127. package/src/components/FilePreview/FilePreview.vue +166 -166
  128. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  129. package/src/components/STable/index.js +361 -361
  130. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  131. package/src/components/checkbox/ImgCheckbox.vue +163 -163
  132. package/src/components/menu/SideMenu.vue +75 -75
  133. package/src/components/menu/menu.js +273 -273
  134. package/src/components/tool/AStepItem.vue +60 -60
  135. package/src/config/default/antd.config.js +89 -89
  136. package/src/config/default/setting.config.js +55 -55
  137. package/src/font-style/font.css +4 -4
  138. package/src/layouts/CommonLayout.vue +56 -56
  139. package/src/layouts/PageLayout.vue +151 -151
  140. package/src/layouts/SinglePageView.vue +138 -138
  141. package/src/layouts/header/AdminHeader.vue +132 -132
  142. package/src/layouts/header/HeaderNotice.vue +177 -177
  143. package/src/layouts/tabs/TabsHead.vue +189 -189
  144. package/src/layouts/tabs/TabsView.vue +387 -387
  145. package/src/lib.js +1 -1
  146. package/src/main.js +26 -26
  147. package/src/mock/extend/index.js +84 -84
  148. package/src/mock/goods/index.js +108 -108
  149. package/src/pages/AMisDemo/AMisDemo.vue +325 -325
  150. package/src/pages/AMisDemo/AMisDemo2.vue +74 -74
  151. package/src/pages/DynamicStatistics/ChartSelector.vue +331 -331
  152. package/src/pages/DynamicStatistics/DataTabs.vue +83 -83
  153. package/src/pages/DynamicStatistics/DynamicTable.vue +128 -128
  154. package/src/pages/DynamicStatistics/EvaluationArea.vue +69 -69
  155. package/src/pages/DynamicStatistics/FavoriteList.vue +51 -51
  156. package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +591 -591
  157. package/src/pages/DynamicStatistics/SearchBar.vue +192 -192
  158. package/src/pages/DynamicStatistics/index.vue +282 -282
  159. package/src/pages/Example/index.vue +33 -33
  160. package/src/pages/ServiceReview/index.vue +284 -284
  161. package/src/pages/XReportView/index.vue +62 -62
  162. package/src/pages/login/Login.vue +378 -378
  163. package/src/pages/login/LoginV3.vue +389 -389
  164. package/src/pages/lowCode/lowCodeEditor.vue +1030 -1030
  165. package/src/pages/lowCode/lowCodeRenderPage.vue +43 -43
  166. package/src/pages/resourceManage/orgListManage.vue +98 -98
  167. package/src/pages/system/dictionary/index.vue +44 -44
  168. package/src/pages/system/monitor/loginInfor/index.vue +37 -37
  169. package/src/pages/system/monitor/operLog/index.vue +37 -37
  170. package/src/pages/system/settings/modifyPassword.vue +117 -117
  171. package/src/pages/system/ticket/index.vue +480 -480
  172. package/src/pages/system/ticket/submitTicketSuccess.vue +484 -484
  173. package/src/router/async/config.async.js +34 -34
  174. package/src/router/async/router.map.js +104 -104
  175. package/src/router/guards.js +223 -223
  176. package/src/router/index.js +27 -27
  177. package/src/router.js +19 -19
  178. package/src/services/api/TicketDetailsViewApi.js +46 -46
  179. package/src/services/api/cas.js +79 -79
  180. package/src/services/api/common.js +307 -307
  181. package/src/services/api/entity.js +18 -18
  182. package/src/services/api/index.js +17 -17
  183. package/src/services/api/restTools.js +46 -46
  184. package/src/services/apiService.js +14 -14
  185. package/src/services/user.js +71 -71
  186. package/src/services/v3Api.js +81 -81
  187. package/src/store/modules/index.js +5 -5
  188. package/src/store/modules/lowCode.js +33 -33
  189. package/src/store/modules/setting.js +119 -119
  190. package/src/theme/default/style.less +58 -58
  191. package/src/theme/global.less +139 -139
  192. package/src/utils/authority-utils.js +85 -85
  193. package/src/utils/errorCode.js +6 -6
  194. package/src/utils/formatter.js +80 -80
  195. package/src/utils/htmlToPDF.js +108 -108
  196. package/src/utils/htmlToPDFApi.js +5 -5
  197. package/src/utils/indexedDB.js +258 -258
  198. package/src/utils/login.js +188 -188
  199. package/src/utils/lowcode/lowcodeComponentMixin.js +120 -120
  200. package/src/utils/lowcode/lowcodeLog.js +29 -29
  201. package/src/utils/lowcode/lowcodeUtils.js +373 -373
  202. package/src/utils/lowcode/registerComponentForEditor.js +11 -11
  203. package/src/utils/lowcode/registerComponentForRender.js +11 -11
  204. package/src/utils/map-utils.js +47 -47
  205. package/src/utils/reg.js +95 -95
  206. package/src/utils/request.js +347 -347
  207. package/src/utils/routerUtil.js +435 -435
  208. package/src/utils/runEvalFunction.js +6 -6
  209. package/src/utils/util.js +241 -241
  210. package/src/utils/waterMark.js +31 -31
  211. package/test/Amis.spec.js +163 -163
  212. package/test/Tree.spec.js +167 -167
  213. package/test/myDialog.spec.js +46 -46
  214. package/vue.config.js +181 -181
  215. 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>