@utogether/udp-core 2.0.0-beta.27 → 2.0.0-beta.28
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.
- package/dist/{403-gdcH0-Bo.js → 403-CyoOD-Ik.js} +1 -1
- package/dist/{404-Se2SF97M.js → 404-Ch_OHTw0.js} +1 -1
- package/dist/{500-B6j9AqLo.js → 500-Cf9am7HK.js} +1 -1
- package/dist/{AuthorityInfo-CQ8ydZvr.js → AuthorityInfo-BJ427cqG.js} +1 -1
- package/dist/{AuthorityInfo.vue_vue_type_style_index_0_lang-C4NRvS8p.js → AuthorityInfo.vue_vue_type_style_index_0_lang-D9y7AwbB.js} +11 -12
- package/dist/{Company-BzSVBSC4.js → Company-qo-lKPkv.js} +3 -3
- package/dist/{CompanyPanel-DBjZB4aJ.js → CompanyPanel-DkKWAKvY.js} +7 -7
- package/dist/{Department-BkgseHo8.js → Department-CHUQByKX.js} +3 -3
- package/dist/{DepartmentPanel-Sen93_2M.js → DepartmentPanel-C742dfOO.js} +27 -28
- package/dist/{DesignPanel-pqDcwaFC.js → DesignPanel-D9oE5R7m.js} +1 -1
- package/dist/{DesignPanel.vue_vue_type_style_index_0_lang-BjtYyEw7.js → DesignPanel.vue_vue_type_style_index_0_lang-hYldVEbo.js} +192 -108
- package/dist/{DictView-CJLG4LlE.js → DictView-CrFXprP9.js} +1 -1
- package/dist/{InvOrganization-D0Jq1IAa.js → InvOrganization-Cz8SzIgs.js} +6 -7
- package/dist/{Org-CO_1WT39.js → Org-Bzt6yKox.js} +9 -10
- package/dist/{Preview-DLI4Bwel.js → Preview-jonigfMQ.js} +1 -1
- package/dist/{ReportDefine-Cw46OnJ_.js → ReportDefine-BpiM5Ovq.js} +1 -1
- package/dist/{ReportDesign-D4sHTXT7.js → ReportDesign-fp09cXJ7.js} +24 -25
- package/dist/{ReportQuery-DtOCvQSN.js → ReportQuery-52ZP1PYP.js} +1 -1
- package/dist/{ReportQueryFrom-QjL-ETPq.js → ReportQueryFrom-DSYavJb1.js} +1 -1
- package/dist/{ReportQueryFrom.vue_vue_type_style_index_0_lang-Dj9ne87n.js → ReportQueryFrom.vue_vue_type_style_index_0_lang-DBGYEp0u.js} +4 -4
- package/dist/{ReportTemplate-BxAgc_Aj.js → ReportTemplate-CA_UW0eD.js} +3 -3
- package/dist/{Role-Df77BBD-.js → Role-DqOt8Bk0.js} +3 -3
- package/dist/{RoleAssign-BrunouML.js → RoleAssign-BdxhefhQ.js} +3 -3
- package/dist/{RolePanel-HLA7XBlN.js → RolePanel-2gZ3H0ET.js} +1 -1
- package/dist/{RolePanel-DSVwqhiD.js → RolePanel-BsNd0svJ.js} +1 -1
- package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-CN0rUxKz.js → RolePanel.vue_vue_type_script_setup_true_lang-DLOwgF99.js} +9 -9
- package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-CKlbqRa5.js → RolePanel.vue_vue_type_script_setup_true_lang-DmzD9kab.js} +26 -27
- package/dist/{ScrollPanel.vue_vue_type_style_index_0_lang-D_FeSXKv.js → ScrollPanel.vue_vue_type_style_index_0_lang-B9ptUMeI.js} +7 -7
- package/dist/{Staff-BeL1xcRf.js → Staff-D3L8fEoY.js} +3 -3
- package/dist/{StaffInfo-CIfnltyX.js → StaffInfo-DYRw6ZYJ.js} +1 -1
- package/dist/{StaffInfo.vue_vue_type_script_setup_true_lang-DbLFwWfG.js → StaffInfo.vue_vue_type_script_setup_true_lang-xqEOQnMs.js} +1 -1
- package/dist/{StaffPanel-BV2CHWac.js → StaffPanel-DkrNH6Px.js} +1 -1
- package/dist/{StaffPanel.vue_vue_type_script_setup_true_lang-CvT-Vp2G.js → StaffPanel.vue_vue_type_script_setup_true_lang-BPBMnliy.js} +8 -9
- package/dist/{SysUser-DPfNvthk.js → SysUser-Bl1-cIpJ.js} +2 -2
- package/dist/{SysUserPanel-CoLKYlQE.js → SysUserPanel-yxNLaBwt.js} +1 -1
- package/dist/{SysUserPanel.vue_vue_type_script_setup_true_lang-lcO3Cjbq.js → SysUserPanel.vue_vue_type_script_setup_true_lang-BDcsgSl5.js} +11 -12
- package/dist/{SystemMenu-sdj1dRDA.js → SystemMenu-C4_Arn12.js} +9 -10
- package/dist/{UserInfo-CTX4hhFl.js → UserInfo-QcNwJCUR.js} +1 -1
- package/dist/{UserInfo.vue_vue_type_style_index_0_lang-ClhCd_8z.js → UserInfo.vue_vue_type_style_index_0_lang-DLIeUphX.js} +5 -6
- package/dist/{childView-BDmWwJO5.js → childView-B23DEO2u.js} +1 -1
- package/dist/{childView-Dx3ACtHa.js → childView-saDZQv9x.js} +1 -1
- package/dist/{childView.vue_vue_type_style_index_0_lang-CfKq_0FN.js → childView.vue_vue_type_style_index_0_lang-RsKR6CAC.js} +14 -15
- package/dist/{childView.vue_vue_type_style_index_0_lang-DxZNtkhd.js → childView.vue_vue_type_style_index_0_lang-ZFEfavUY.js} +11 -12
- package/dist/{code-rule-cvN4gYC_.js → code-rule-2_Ihx_by.js} +12 -13
- package/dist/core.es.js +21 -19
- package/dist/{cron-task-B0TkxFdp.js → cron-task-BFOPJQIk.js} +3 -4
- package/dist/{frameView-5cy5BSgS.js → frameView-f7Ya0Knj.js} +1 -1
- package/dist/img/minicolors.png +0 -0
- package/dist/{index-C5WRTwvI.js → index-BpdTDaTk.js} +811 -604
- package/dist/{layout-home-DrARg-3o.js → layout-home-v3DPJ7rB.js} +12 -13
- package/dist/{layoutView-25v_ngk5.js → layoutView-DZHoQDH1.js} +186 -187
- package/dist/{log-in-Bmz5Uhbt.js → log-in-BPAMJTwH.js} +4 -5
- package/dist/{log-out-B-8m3oNj.js → log-out-DZACF0jg.js} +8 -9
- package/dist/{login-Cmp2RvvW.js → login-B8cwozax.js} +22 -23
- package/dist/{lov-view-BATtzw2X.js → lov-view-Ba7Y7xy0.js} +4 -5
- package/dist/{menuInfo-BIvrE7nm.js → menuInfo-BpRKFYK8.js} +1 -1
- package/dist/{menuInfo.vue_vue_type_style_index_0_lang-B6USomit.js → menuInfo.vue_vue_type_style_index_0_lang-DJ5sUC6m.js} +17 -18
- package/dist/{pda-app-CzHVyeEa.js → pda-app-C0jJecrL.js} +7 -8
- package/dist/{resource-Y5lGB38n.js → resource-BG22Cw4P.js} +4 -4
- package/dist/su-welcome-DaxhbrC6.js +879 -0
- package/dist/{sys-config-CqO03LeC.js → sys-config-CG2fMtak.js} +22 -23
- package/dist/udp-core.css +1 -1
- package/dist/{useNav-C-rCgubt.js → useNav-_u2UAQWk.js} +24 -24
- package/index.ts +54 -51
- package/package.json +21 -21
- package/src/api/http.ts +10 -4
- package/src/api/index.ts +51 -51
- package/src/api/user.ts +64 -64
- package/src/components/udp/content/index.vue +93 -93
- package/src/components/udp/form-upload/form-upload.vue +496 -496
- package/src/components/udp/grid/index.vue +643 -544
- package/src/components/udp/index.ts +2 -1
- package/src/components/udp/modal-form/index.vue +326 -0
- package/src/components/udp/utils.ts +420 -420
- package/src/layout/components/lay-navbar/index.vue +240 -240
- package/src/layout/components/lay-search/components/SearchModal.vue +185 -185
- package/src/layout/components/lay-sidebar/mixNav.vue +261 -261
- package/src/layout/components/lay-sidebar/sidebarItem.vue +199 -195
- package/src/layout/components/lay-sidebar/vertical.vue +92 -92
- package/src/layout/layoutView.vue +1 -0
- package/src/main.ts +111 -111
- package/src/plugins/i18n/zh.ts +5 -1
- package/src/plugins/vxe-table/index.ts +116 -116
- package/src/router/index.ts +158 -156
- package/src/router/utils.ts +434 -430
- package/src/store/modules/permission.ts +1 -1
- package/src/store/modules/system.ts +193 -193
- package/src/style/print-lock.css +380 -375
- package/src/style/suprint.css +990 -985
- package/src/utils/authority/index.ts +46 -46
- package/src/utils/dataFormat/index.ts +309 -222
- package/src/utils/udp/http/index.ts +19 -11
- package/src/views/uhome/components/home-todo.vue +15 -3
- package/src/views/uhome/dynamic-card.vue +31 -31
- package/src/views/uhome/su-welcome.vue +310 -310
- package/src/views/ulogin/login.vue +292 -292
- package/src/views/urpt/design/DesignPanel.vue +538 -507
- package/src/views/urpt/design/print-data.ts +39 -59
- package/dist/await-to-js.es5-Bv3Eu4mi.js +0 -10
- package/dist/su-welcome-CXA6OzBw.js +0 -878
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* @Author: wei.li
|
|
3
|
-
* @Date: 2021-11-17 16:26:34
|
|
4
|
-
* @LastEditors: levi7754 levi7754@163.com
|
|
5
|
-
* @LastEditTime: 2026-07-01 13:55:44
|
|
6
|
-
* @Description: file content
|
|
7
|
-
*/
|
|
8
|
-
import { usePermissionStoreHook } from '../../store/modules/permission';
|
|
9
|
-
import { isArray } from 'xe-utils';
|
|
10
|
-
import { router } from '../../router';
|
|
11
|
-
export const hasAuthority = auth => {
|
|
12
|
-
if (!auth) return true;
|
|
13
|
-
const permissionCode = router.currentRoute.value.meta?.permissionCode;
|
|
14
|
-
if (!permissionCode) return true;
|
|
15
|
-
if (!isArray(auth)) {
|
|
16
|
-
auth = [auth];
|
|
17
|
-
}
|
|
18
|
-
const buttonAuth = usePermissionStoreHook().getButtonAuth;
|
|
19
|
-
if (!buttonAuth) return true;
|
|
20
|
-
let hasAuth = false;
|
|
21
|
-
auth.forEach(item => {
|
|
22
|
-
if (!hasAuth) {
|
|
23
|
-
const authRoles = `${permissionCode}.${item}`;
|
|
24
|
-
hasAuth = buttonAuth.includes(authRoles);
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
return hasAuth;
|
|
28
|
-
};
|
|
29
|
-
/**
|
|
30
|
-
* @description: 只能查看权限
|
|
31
|
-
* @param {*} queryAuth 查询权限
|
|
32
|
-
* @param {*} editAuth 编辑权限
|
|
33
|
-
* @return {*} 是否仅有查询权限
|
|
34
|
-
*/
|
|
35
|
-
export const isViewonly = (queryAuth = 'fetch', editAuth = 'edit') => {
|
|
36
|
-
if (!queryAuth) return true;
|
|
37
|
-
const permissionCode = router.currentRoute.value.meta?.permissionCode;
|
|
38
|
-
if (!permissionCode) return true;
|
|
39
|
-
const buttonAuth = usePermissionStoreHook().getButtonAuth;
|
|
40
|
-
if (!buttonAuth) return true;
|
|
41
|
-
|
|
42
|
-
const fetchAuth = `${permissionCode}.${queryAuth}`;
|
|
43
|
-
const hasAuth = buttonAuth.includes(fetchAuth) && !buttonAuth.includes(`${permissionCode}.${editAuth}`);
|
|
44
|
-
return hasAuth;
|
|
45
|
-
};
|
|
46
|
-
export default hasAuthority;
|
|
1
|
+
/*
|
|
2
|
+
* @Author: wei.li
|
|
3
|
+
* @Date: 2021-11-17 16:26:34
|
|
4
|
+
* @LastEditors: levi7754 levi7754@163.com
|
|
5
|
+
* @LastEditTime: 2026-07-01 13:55:44
|
|
6
|
+
* @Description: file content
|
|
7
|
+
*/
|
|
8
|
+
import { usePermissionStoreHook } from '../../store/modules/permission';
|
|
9
|
+
import { isArray } from 'xe-utils';
|
|
10
|
+
import { router } from '../../router';
|
|
11
|
+
export const hasAuthority = auth => {
|
|
12
|
+
if (!auth) return true;
|
|
13
|
+
const permissionCode = router.currentRoute.value.meta?.permissionCode;
|
|
14
|
+
if (!permissionCode) return true;
|
|
15
|
+
if (!isArray(auth)) {
|
|
16
|
+
auth = [auth];
|
|
17
|
+
}
|
|
18
|
+
const buttonAuth = usePermissionStoreHook().getButtonAuth;
|
|
19
|
+
if (!buttonAuth) return true;
|
|
20
|
+
let hasAuth = false;
|
|
21
|
+
auth.forEach(item => {
|
|
22
|
+
if (!hasAuth) {
|
|
23
|
+
const authRoles = `${permissionCode}.${item}`;
|
|
24
|
+
hasAuth = buttonAuth.includes(authRoles);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
return hasAuth;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* @description: 只能查看权限
|
|
31
|
+
* @param {*} queryAuth 查询权限
|
|
32
|
+
* @param {*} editAuth 编辑权限
|
|
33
|
+
* @return {*} 是否仅有查询权限
|
|
34
|
+
*/
|
|
35
|
+
export const isViewonly = (queryAuth = 'fetch', editAuth = 'edit') => {
|
|
36
|
+
if (!queryAuth) return true;
|
|
37
|
+
const permissionCode = router.currentRoute.value.meta?.permissionCode;
|
|
38
|
+
if (!permissionCode) return true;
|
|
39
|
+
const buttonAuth = usePermissionStoreHook().getButtonAuth;
|
|
40
|
+
if (!buttonAuth) return true;
|
|
41
|
+
|
|
42
|
+
const fetchAuth = `${permissionCode}.${queryAuth}`;
|
|
43
|
+
const hasAuth = buttonAuth.includes(fetchAuth) && !buttonAuth.includes(`${permissionCode}.${editAuth}`);
|
|
44
|
+
return hasAuth;
|
|
45
|
+
};
|
|
46
|
+
export default hasAuthority;
|
|
@@ -1,222 +1,309 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* @Author: wei.li
|
|
3
|
-
* @Date: 2022-06-23 17:29:11
|
|
4
|
-
* @LastEditors: levi7754 levi7754@163.com
|
|
5
|
-
* @LastEditTime:
|
|
6
|
-
* @Description: file content
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { clone, isArray, isString, isEmpty, toDateString } from 'xe-utils';
|
|
10
|
-
import { useRender } from '@utogether/utils';
|
|
11
|
-
|
|
12
|
-
const renderHook = useRender();
|
|
13
|
-
|
|
14
|
-
export const rulesFormat = (records, rule, t) => {
|
|
15
|
-
records
|
|
16
|
-
.filter(colunm => colunm.required)
|
|
17
|
-
.forEach(colunm => {
|
|
18
|
-
const { field, title } = colunm;
|
|
19
|
-
rule[field] = [
|
|
20
|
-
{
|
|
21
|
-
required: true,
|
|
22
|
-
message: `${t('message.required')}${title ? t(title) : t(`message.${field}`)}`
|
|
23
|
-
}
|
|
24
|
-
];
|
|
25
|
-
});
|
|
26
|
-
return rule;
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
export const columnFormat = columns => {
|
|
30
|
-
return columns.map(m => {
|
|
31
|
-
if (m.type) return m;
|
|
32
|
-
m.title = m.title || `message.${m.field}`;
|
|
33
|
-
return m;
|
|
34
|
-
});
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
const searchBtn: IFormItemProps = {
|
|
38
|
-
span: 6,
|
|
39
|
-
align: 'right',
|
|
40
|
-
collapseNode: false,
|
|
41
|
-
itemRender: {
|
|
42
|
-
name: 'VxeButtonGroup',
|
|
43
|
-
options: [
|
|
44
|
-
{
|
|
45
|
-
type: 'submit',
|
|
46
|
-
submit: 'submit',
|
|
47
|
-
content: 'message.btn.search',
|
|
48
|
-
status: 'primary',
|
|
49
|
-
icon: 'ri-search-line'
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
type: 'reset',
|
|
53
|
-
name: 'reset',
|
|
54
|
-
content: 'message.btn.reset',
|
|
55
|
-
status: 'info',
|
|
56
|
-
icon: 'ri-refresh-line'
|
|
57
|
-
}
|
|
58
|
-
],
|
|
59
|
-
events: null
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
if (
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
1
|
+
/*
|
|
2
|
+
* @Author: wei.li
|
|
3
|
+
* @Date: 2022-06-23 17:29:11
|
|
4
|
+
* @LastEditors: levi7754 levi7754@163.com
|
|
5
|
+
* @LastEditTime: 2026-07-28 08:39:51
|
|
6
|
+
* @Description: file content
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { clone, isArray, isString, isEmpty, toDateString } from 'xe-utils';
|
|
10
|
+
import { useRender } from '@utogether/utils';
|
|
11
|
+
|
|
12
|
+
const renderHook = useRender();
|
|
13
|
+
|
|
14
|
+
export const rulesFormat = (records, rule, t) => {
|
|
15
|
+
records
|
|
16
|
+
.filter(colunm => colunm.required)
|
|
17
|
+
.forEach(colunm => {
|
|
18
|
+
const { field, title } = colunm;
|
|
19
|
+
rule[field] = [
|
|
20
|
+
{
|
|
21
|
+
required: true,
|
|
22
|
+
message: `${t('message.required')}${title ? t(title) : t(`message.${field}`)}`
|
|
23
|
+
}
|
|
24
|
+
];
|
|
25
|
+
});
|
|
26
|
+
return rule;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export const columnFormat = columns => {
|
|
30
|
+
return columns.map(m => {
|
|
31
|
+
if (m.type) return m;
|
|
32
|
+
m.title = m.title || `message.${m.field}`;
|
|
33
|
+
return m;
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const searchBtn: IFormItemProps = {
|
|
38
|
+
span: 6,
|
|
39
|
+
align: 'right',
|
|
40
|
+
collapseNode: false,
|
|
41
|
+
itemRender: {
|
|
42
|
+
name: 'VxeButtonGroup',
|
|
43
|
+
options: [
|
|
44
|
+
{
|
|
45
|
+
type: 'submit',
|
|
46
|
+
submit: 'submit',
|
|
47
|
+
content: 'message.btn.search',
|
|
48
|
+
status: 'primary',
|
|
49
|
+
icon: 'ri-search-line'
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
type: 'reset',
|
|
53
|
+
name: 'reset',
|
|
54
|
+
content: 'message.btn.reset',
|
|
55
|
+
status: 'info',
|
|
56
|
+
icon: 'ri-refresh-line'
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
events: null
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/** 根据屏幕宽度获取每行可放置的表单项数量 */
|
|
64
|
+
const getItemsPerRow = (): number => {
|
|
65
|
+
const width = window.innerWidth;
|
|
66
|
+
if (width >= 1800) return 6;
|
|
67
|
+
if (width >= 1400) return 4;
|
|
68
|
+
return 3;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
export const formatGridItems1 = (records, favorite) => {
|
|
72
|
+
const formItems = records.filter(f => f.visible !== false);
|
|
73
|
+
const len = formItems.length;
|
|
74
|
+
// 前3个存在时间范围 或者 存在span = 12
|
|
75
|
+
const isDateRange = len > 2 && formItems.some((f, idx) => idx < 3 && (f.span > 6 || getDateRange(f)));
|
|
76
|
+
// 需要展示折叠按钮
|
|
77
|
+
const isCollapse = isDateRange || len > 3;
|
|
78
|
+
|
|
79
|
+
const defaultCollapse = { collapseTags: true, collapseTagsTooltip: true, multiple: true };
|
|
80
|
+
const items = formItems.map((item, idx) => {
|
|
81
|
+
item.folding = isDateRange ? isCollapse && idx > 1 : isCollapse && idx > 2;
|
|
82
|
+
item.span = getDateRange(item) ? 12 : item.span || 6;
|
|
83
|
+
if (item.code && !item.itemRender) {
|
|
84
|
+
item.itemRender = renderHook.renderDict(item.code);
|
|
85
|
+
}
|
|
86
|
+
item.itemRender = item.itemRender || { name: '$input' };
|
|
87
|
+
item.title = item.title || `message.${item.field}`;
|
|
88
|
+
if (item.multiple || item.itemRender?.props?.multiple) {
|
|
89
|
+
item.itemRender.props = Object.assign(defaultCollapse, item.itemRender?.props || {});
|
|
90
|
+
}
|
|
91
|
+
return item;
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
const btn = clone(searchBtn, true);
|
|
95
|
+
btn.collapseNode = isCollapse;
|
|
96
|
+
favorite && btn.itemRender.options.length < 3 && btn.itemRender.options.push(favorite);
|
|
97
|
+
|
|
98
|
+
if (isCollapse) {
|
|
99
|
+
// 按钮设置为 折叠节点
|
|
100
|
+
// 折叠时将搜索按钮插入到第一列的最后
|
|
101
|
+
const idx = isDateRange ? 2 : 3;
|
|
102
|
+
items.splice(idx, 0, btn);
|
|
103
|
+
} else {
|
|
104
|
+
items.push(btn);
|
|
105
|
+
}
|
|
106
|
+
return items;
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* 格式化查询表单的表单项
|
|
111
|
+
* - 根据屏幕宽度动态计算每项span,保证单行最多放置 itemsPerRow 个表单项
|
|
112
|
+
* - 日期范围组件(#SuDateRange)占2列
|
|
113
|
+
* - 搜索按钮(searchBtn)始终作为第一行末位
|
|
114
|
+
* - 超出第一行的表单项自动折叠
|
|
115
|
+
*/
|
|
116
|
+
export const formatGridItems = (records, options: any = {}) => {
|
|
117
|
+
const formItems = records.filter(f => f.visible !== false);
|
|
118
|
+
// 根据屏幕宽度计算每行项数
|
|
119
|
+
const itemsPerRow = getItemsPerRow();
|
|
120
|
+
// 每项默认span(24栅格 / 每行项数)
|
|
121
|
+
const span = Math.floor(24 / itemsPerRow);
|
|
122
|
+
const defaultCollapse = { collapseTags: true, collapseTagsTooltip: true, multiple: true };
|
|
123
|
+
|
|
124
|
+
const items = formItems.map(item => {
|
|
125
|
+
// 日期范围占2列,普通项占1列
|
|
126
|
+
item.span = getDateRange(item) ? span * 2 : item.span || span;
|
|
127
|
+
if (item.code && !item.itemRender) {
|
|
128
|
+
item.itemRender = renderHook.renderDict({ code: item.code }, options.callback);
|
|
129
|
+
} else if (
|
|
130
|
+
['#select', '#SuSelect', 'VxeRadioGroup', 'VxeCheckboxGroup', 'VxeSwitch'].includes(item.itemRender?.name)
|
|
131
|
+
) {
|
|
132
|
+
item.itemRender.events = { change: options.callback };
|
|
133
|
+
}
|
|
134
|
+
// console.log(item);
|
|
135
|
+
item.itemRender = item.itemRender || { name: '$input' };
|
|
136
|
+
item.title = item.title || `message.${item.field}`;
|
|
137
|
+
if (item.multiple || item.itemRender?.props?.multiple) {
|
|
138
|
+
item.itemRender.props = Object.assign(defaultCollapse, item.itemRender?.props || {});
|
|
139
|
+
}
|
|
140
|
+
return item;
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
const btn = clone(searchBtn, true);
|
|
144
|
+
// 搜索按钮占1列,与普通项一致
|
|
145
|
+
btn.span = span;
|
|
146
|
+
options.favorite && btn.itemRender.options.length < 3 && btn.itemRender.options.push(options.favorite);
|
|
147
|
+
|
|
148
|
+
// 所有项span总和 + 按钮span <= 24 时,全部放第一行
|
|
149
|
+
const totalSpan = items.reduce((sum, item) => sum + (item.span || span), 0);
|
|
150
|
+
|
|
151
|
+
if (totalSpan + span <= 24) {
|
|
152
|
+
// 无需折叠,按钮追加到末尾
|
|
153
|
+
btn.collapseNode = false;
|
|
154
|
+
items.forEach(item => {
|
|
155
|
+
item.folding = false;
|
|
156
|
+
});
|
|
157
|
+
items.push(btn);
|
|
158
|
+
} else {
|
|
159
|
+
// 贪心遍历:计算第一行能放下多少个项(需为按钮预留span空间)
|
|
160
|
+
let firstRowSpan = 0;
|
|
161
|
+
// 列占用计数:普通项占1列,日期范围占2列
|
|
162
|
+
let firstRowCount = 0;
|
|
163
|
+
let insertIdx = items.length;
|
|
164
|
+
for (let i = 0; i < items.length; i++) {
|
|
165
|
+
const itemSpan = items[i].span || span;
|
|
166
|
+
const dateRangeCols = getDateRange(items[i]) ? 2 : 1;
|
|
167
|
+
// span溢出 或 列数达到上限时,截断第一行
|
|
168
|
+
if (firstRowSpan + itemSpan + span > 24 || firstRowCount + dateRangeCols > itemsPerRow) {
|
|
169
|
+
insertIdx = i;
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
firstRowSpan += itemSpan;
|
|
173
|
+
firstRowCount += dateRangeCols;
|
|
174
|
+
}
|
|
175
|
+
// 存在折叠项时,按钮显示折叠节点
|
|
176
|
+
btn.collapseNode = insertIdx < items.length;
|
|
177
|
+
items.forEach((item, idx) => {
|
|
178
|
+
item.folding = idx >= insertIdx;
|
|
179
|
+
});
|
|
180
|
+
// 将搜索按钮插入到第一行末位
|
|
181
|
+
items.splice(insertIdx, 0, btn);
|
|
182
|
+
}
|
|
183
|
+
return items;
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
const getDateRange = item => {
|
|
187
|
+
if (item.itemRender?.name === '#SuDateRange') {
|
|
188
|
+
return item.itemRender?.props?.type === 'daterange' || !item.itemRender?.props?.type;
|
|
189
|
+
}
|
|
190
|
+
return false;
|
|
191
|
+
};
|
|
192
|
+
export const formatButton = (buttons, auth?) => {
|
|
193
|
+
buttons.forEach(btn => {
|
|
194
|
+
btn.auth = auth ? auth[btn.code] || btn.auth : btn.auth;
|
|
195
|
+
if (!btn.name) {
|
|
196
|
+
btn.name = `message.${btn.name || btn.code}`;
|
|
197
|
+
} else if (!btn.name.includes('message.')) {
|
|
198
|
+
btn.name = `message.${btn.name}`;
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
return buttons;
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
export const queryAll = (props, http, form, fetchParam) => {
|
|
205
|
+
const params = { pageNum: 1, pageSize: 100000 };
|
|
206
|
+
Object.assign(params, form, fetchParam || {});
|
|
207
|
+
const query = formatDateRange(params, props.formItems);
|
|
208
|
+
const ajax = props.version === 'v2' ? http.get : http.post;
|
|
209
|
+
return new Promise((resolve, reject) => {
|
|
210
|
+
ajax(props.serviceCode.fetch, query)
|
|
211
|
+
.then((response: IResponseData) => {
|
|
212
|
+
resolve(response.list);
|
|
213
|
+
})
|
|
214
|
+
.catch((e: any) => {
|
|
215
|
+
reject(e);
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
/** 查询服务 */
|
|
221
|
+
export const query = (props, form, page, http, fetchParam) => {
|
|
222
|
+
for (const i in form) {
|
|
223
|
+
if (form[i] && isString(form[i])) {
|
|
224
|
+
form[i] = form[i].trim();
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
const params = {
|
|
228
|
+
pageNum: page.currentPage,
|
|
229
|
+
pageSize: page.pageSize
|
|
230
|
+
};
|
|
231
|
+
Object.assign(params, form, fetchParam || {});
|
|
232
|
+
const query = formatDateRange(params, props.formItems);
|
|
233
|
+
const {
|
|
234
|
+
version,
|
|
235
|
+
serviceCode: { fetch }
|
|
236
|
+
} = props;
|
|
237
|
+
if (!fetch) return null;
|
|
238
|
+
if (version === 'v2') {
|
|
239
|
+
return http.get(fetch, query);
|
|
240
|
+
}
|
|
241
|
+
return http.post(fetch, query);
|
|
242
|
+
};
|
|
243
|
+
/** 删除服务 */
|
|
244
|
+
export const del = (http, removeRecords, props) => {
|
|
245
|
+
const { serviceCode, version, isSingleSubmit } = props;
|
|
246
|
+
const { del } = serviceCode;
|
|
247
|
+
if (!del) return null;
|
|
248
|
+
if (version === 'v2') {
|
|
249
|
+
return http.delete(del, !isSingleSubmit ? removeRecords : removeRecords[0]);
|
|
250
|
+
}
|
|
251
|
+
return http.post(del, !isSingleSubmit ? removeRecords : removeRecords[0]);
|
|
252
|
+
};
|
|
253
|
+
/** 更新服务 */
|
|
254
|
+
export const save = (http, body, props, confirmParam) => {
|
|
255
|
+
const allService = [];
|
|
256
|
+
const { serviceCode, isSingleSubmit, version, multiField } = props;
|
|
257
|
+
const { add, update } = serviceCode;
|
|
258
|
+
const { insertRecords, updateRecords } = body;
|
|
259
|
+
|
|
260
|
+
if (!isEmpty(insertRecords) && add) {
|
|
261
|
+
insertRecords.forEach(m => {
|
|
262
|
+
!isEmpty(confirmParam) && Object.assign(m, confirmParam);
|
|
263
|
+
m = !isEmpty(multiField) ? setMultiField(props, m, confirmParam) : m;
|
|
264
|
+
});
|
|
265
|
+
const service = http.post(add, !isSingleSubmit ? insertRecords : insertRecords[0]);
|
|
266
|
+
allService.push(service);
|
|
267
|
+
}
|
|
268
|
+
if (!isEmpty(updateRecords) && update) {
|
|
269
|
+
const records = !isEmpty(multiField)
|
|
270
|
+
? updateRecords.map(m => setMultiField(props, m, confirmParam))
|
|
271
|
+
: updateRecords;
|
|
272
|
+
let service = null;
|
|
273
|
+
if (version === 'v2') {
|
|
274
|
+
service = http.put(update, !isSingleSubmit ? records : records[0]);
|
|
275
|
+
} else {
|
|
276
|
+
service = http.post(update, !isSingleSubmit ? records : records[0]);
|
|
277
|
+
}
|
|
278
|
+
allService.push(service);
|
|
279
|
+
}
|
|
280
|
+
return allService;
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
const formatDateRange = (listQuery: any, formItems) => {
|
|
284
|
+
const dateRanges = formItems.filter(f => f.itemRender?.name === '#SuDateRange');
|
|
285
|
+
if (isEmpty(dateRanges)) return listQuery;
|
|
286
|
+
const query = clone(listQuery, true);
|
|
287
|
+
dateRanges.forEach((element: any) => {
|
|
288
|
+
const val = query[element.field];
|
|
289
|
+
if (val && element.toField) {
|
|
290
|
+
query[element.fromField] = toDateString(val[0], 'yyyy-MM-dd 00:00:00');
|
|
291
|
+
query[element.toField] = toDateString(val[1], 'yyyy-MM-dd 23:59:59');
|
|
292
|
+
delete query[element.field];
|
|
293
|
+
} else if (val) {
|
|
294
|
+
query[`${element.field}From`] = toDateString(val[0], 'yyyy-MM-dd 00:00:00');
|
|
295
|
+
query[`${element.field}To`] = toDateString(val[1], 'yyyy-MM-dd 23:59:59');
|
|
296
|
+
delete query[element.field];
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
return query;
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
const setMultiField = (props, source: any, confirmParam) => {
|
|
303
|
+
const { multiField } = props;
|
|
304
|
+
multiField.forEach(field => {
|
|
305
|
+
source[field] = isArray(source[field]) ? source[field].join(',') : source[field];
|
|
306
|
+
});
|
|
307
|
+
Object.assign(source, confirmParam || {});
|
|
308
|
+
return source;
|
|
309
|
+
};
|