@yy-common/shared 1.0.0-beta.6
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/.versionrc +23 -0
- package/CHANGELOG.md +42 -0
- package/api/dict.js +60 -0
- package/api/index.js +1 -0
- package/config/config.js +65 -0
- package/config/index.js +1 -0
- package/directive/directives.js +9 -0
- package/directive/index.js +26 -0
- package/directive/module/draggable.js +44 -0
- package/directive/module/permission.js +15 -0
- package/index.js +4 -0
- package/package.json +26 -0
- package/router/basic-routes.js +28 -0
- package/router/generator-routers.js +260 -0
- package/router/guard.js +283 -0
- package/router/index.js +9 -0
- package/utils/column-setting.js +72 -0
- package/utils/com.js +8 -0
- package/utils/dict-cache.js +11 -0
- package/utils/dynamicSetting.js +45 -0
- package/utils/enum.js +137 -0
- package/utils/errorLog.js +39 -0
- package/utils/excel.js +789 -0
- package/utils/index.js +26 -0
- package/utils/is-type.js +164 -0
- package/utils/item.js +14 -0
- package/utils/metric.js +135 -0
- package/utils/number.js +12 -0
- package/utils/request/axiosN.js +142 -0
- package/utils/request/content-type.js +19 -0
- package/utils/request/index.js +2 -0
- package/utils/request/interceptors.js +156 -0
- package/utils/request/url-params.js +12 -0
- package/utils/router.js +27 -0
- package/utils/storage.js +51 -0
- package/utils/table.js +348 -0
- package/utils/token.js +51 -0
- package/utils/tree.js +39 -0
- package/utils/user.js +8 -0
- package/utils/wps.js +16 -0
package/router/guard.js
ADDED
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import LamboDesign from "@lambo-design/core";
|
|
2
|
+
const { LoadingBar, Message, Spin } = LamboDesign;
|
|
3
|
+
|
|
4
|
+
import config from "@lambo-design/shared/config/config";
|
|
5
|
+
// import { getToken } from "@lambo-design/shared/utils/platform";
|
|
6
|
+
import { getToken } from "../utils/token";
|
|
7
|
+
import _ from "lodash";
|
|
8
|
+
import { PageLayout } from "../../components";
|
|
9
|
+
import {
|
|
10
|
+
constantRouterComponents,
|
|
11
|
+
generator,
|
|
12
|
+
getPermissionType,
|
|
13
|
+
generatorRouteByPermission,
|
|
14
|
+
permission2Router,
|
|
15
|
+
} from "./generator-routers";
|
|
16
|
+
import { getPermissionCache } from "@lambo-design/shared/utils/n/permission-cache.js";
|
|
17
|
+
import { filterMicroPermissionList } from "@lambo-design/shared/utils/n-generator-routers.js";
|
|
18
|
+
|
|
19
|
+
const isAdded = (router, route) => {
|
|
20
|
+
let rlt = router.resolve(route);
|
|
21
|
+
return !!rlt?.resolved?.matched?.length;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const pageRoute = {
|
|
25
|
+
path: "/page",
|
|
26
|
+
name: "page",
|
|
27
|
+
meta: { hideInMenu: true, notCache: true },
|
|
28
|
+
component: PageLayout,
|
|
29
|
+
children: [],
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* 根据权限及微应用类型,组织动态路由表
|
|
34
|
+
*
|
|
35
|
+
* @param {DynamicRouterByPermissionOptions} params
|
|
36
|
+
* @param {VueRouter} params.router VueRouter实例
|
|
37
|
+
* @param {VueX.Store} params.store Store实例
|
|
38
|
+
* @param {string} microType 微应用类型
|
|
39
|
+
* @param {Array} allowPermissionList 不需要权限控制的权限数据
|
|
40
|
+
* @param {Object} routerOptionsBak 原始基础路由
|
|
41
|
+
*/
|
|
42
|
+
async function renderRoutes({
|
|
43
|
+
router,
|
|
44
|
+
store,
|
|
45
|
+
microType,
|
|
46
|
+
allowPermissionList,
|
|
47
|
+
routerOptionsBak,
|
|
48
|
+
to,
|
|
49
|
+
}) {
|
|
50
|
+
// 是否首次调用
|
|
51
|
+
let isInitilaze = !store.state.user.userName;
|
|
52
|
+
|
|
53
|
+
// 已经加入到路由中,直接返回
|
|
54
|
+
if (isAdded(router, to) && !isInitilaze) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// 首次组织路由,系统初始化的逻辑
|
|
59
|
+
if (isInitilaze) {
|
|
60
|
+
// store.dispatch('getIndexInfo') // 获取指标描述信息
|
|
61
|
+
await store.dispatch("getUserInfo");
|
|
62
|
+
await store.dispatch("getAppListData");
|
|
63
|
+
await store.dispatch("getPermissionData", {
|
|
64
|
+
constantRouterComponents,
|
|
65
|
+
permissionStoreKeyParams: "ibp-sc-permission",
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
// 只有首次调用重置路由,后面只往里添加路由了
|
|
69
|
+
router.options = _.cloneDeep(routerOptionsBak);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// 获取权限缓存数据,第二次组织路由的时候,不要dispatch了
|
|
73
|
+
const permissionData = getPermissionCache();
|
|
74
|
+
const microPermissionData = filterMicroPermissionList(
|
|
75
|
+
microType,
|
|
76
|
+
permissionData
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
const rootRoute = router.options.routes.find((item) => item.path === "/");
|
|
80
|
+
if (isInitilaze) {
|
|
81
|
+
// 把pageRoute加入到根路由下,不然keepalive不起效果
|
|
82
|
+
router.addRoute(rootRoute.name, pageRoute);
|
|
83
|
+
rootRoute.children.push(pageRoute);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// 未加入路由
|
|
87
|
+
if (!isAdded(router, to)) {
|
|
88
|
+
//获取跳转权限类型
|
|
89
|
+
let tempPer = microPermissionData.find((item) => {
|
|
90
|
+
return item.permissionValue == to.name || item.name == to.name;
|
|
91
|
+
});
|
|
92
|
+
if (!tempPer && to.path != "/") {
|
|
93
|
+
tempPer = microPermissionData.find((item) => {
|
|
94
|
+
// 有在uri里加参数的场景,需要兼容一下,至于为什么不都用includes,忘了。。。,好像是有什么问题
|
|
95
|
+
return item?.uri?.includes("?")
|
|
96
|
+
? item?.uri?.includes(to.path)
|
|
97
|
+
: item?.uri?.endsWith(to.path);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
const perType = getPermissionType(tempPer.type || "");
|
|
101
|
+
let tmpRoute = generatorRouteByPermission(
|
|
102
|
+
permission2Router([tempPer], microType)[0]
|
|
103
|
+
);
|
|
104
|
+
//跳转的是页面
|
|
105
|
+
if (perType == "PAGE") {
|
|
106
|
+
router.addRoute(pageRoute.name, {
|
|
107
|
+
...tmpRoute,
|
|
108
|
+
meta: { ...tmpRoute.meta, notCache: true },
|
|
109
|
+
});
|
|
110
|
+
pageRoute.children.push(tmpRoute);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
//跳转的是菜单
|
|
114
|
+
if (perType == "MENU") {
|
|
115
|
+
router.addRoute(rootRoute.name, tmpRoute);
|
|
116
|
+
rootRoute.children.push(tmpRoute);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// }
|
|
120
|
+
|
|
121
|
+
// 首次组织路由,系统初始化的逻辑
|
|
122
|
+
if (isInitilaze) {
|
|
123
|
+
// TODO 这里有必要吗
|
|
124
|
+
// 明细页面不加权限控制,如果没有权限,加上去
|
|
125
|
+
// 保证只有本微应用的路由
|
|
126
|
+
const microAllowPermissionList = filterMicroPermissionList(
|
|
127
|
+
microType,
|
|
128
|
+
allowPermissionList
|
|
129
|
+
);
|
|
130
|
+
const needAddRoutes = microAllowPermissionList.filter((permission) => {
|
|
131
|
+
return (
|
|
132
|
+
router.options.routes.findIndex(
|
|
133
|
+
(route) => permission.name === route.name
|
|
134
|
+
) === -1
|
|
135
|
+
);
|
|
136
|
+
});
|
|
137
|
+
needAddRoutes.forEach((item) => {
|
|
138
|
+
item.component = item.name;
|
|
139
|
+
item.meta = {
|
|
140
|
+
hideInMenu: true,
|
|
141
|
+
title: item.label,
|
|
142
|
+
activeName: item.name,
|
|
143
|
+
};
|
|
144
|
+
});
|
|
145
|
+
const dynamicDetailRouters = generator(needAddRoutes);
|
|
146
|
+
// 加到根路由的子路由里去
|
|
147
|
+
for (const item of dynamicDetailRouters) {
|
|
148
|
+
router.addRoute(config.rootRouteName, item);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// 路由统一处理
|
|
154
|
+
export function addRouterGuards({
|
|
155
|
+
router,
|
|
156
|
+
store,
|
|
157
|
+
microType,
|
|
158
|
+
allowPermissionList,
|
|
159
|
+
}) {
|
|
160
|
+
const LOGIN_PAGE_NAME = config.loginRouteName;
|
|
161
|
+
const routerOptionsBak = _.cloneDeep(router.options);
|
|
162
|
+
|
|
163
|
+
// 会话失效钩子,@indfnd/utils里axios拦截器调用
|
|
164
|
+
window.sessionNotValidHandler = function () {
|
|
165
|
+
// 在登录页就不用再跳转了
|
|
166
|
+
let url = location.href;
|
|
167
|
+
const searchIdx = url.indexOf("?");
|
|
168
|
+
if (searchIdx !== -1) {
|
|
169
|
+
url = url.substring(0, searchIdx);
|
|
170
|
+
}
|
|
171
|
+
if (url.endsWith("/login")) return;
|
|
172
|
+
|
|
173
|
+
if (window.confirm("会话已失效,是否重新登录?")) {
|
|
174
|
+
top.location = "/ibp-sc/login";
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
// 接口报错钩子,@indfnd/utils里axios拦截器调用
|
|
179
|
+
window.apiErrorHandler = function (msg) {
|
|
180
|
+
Message.error({ content: msg, duration: 10, closable: true });
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
window.getQueryVariable = function getQueryVariable(variable) {
|
|
184
|
+
var query = window.location.search.substring(1);
|
|
185
|
+
var vars = query.split("&");
|
|
186
|
+
for (let i = 0; i < vars.length; i++) {
|
|
187
|
+
let pair = vars[i].split("=");
|
|
188
|
+
if (pair[0] == variable) {
|
|
189
|
+
return pair.slice(1).join("=");
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
let routeHash = window.location.hash.substring(2);
|
|
193
|
+
if (routeHash.includes("?")) {
|
|
194
|
+
query = routeHash.split("?")[1];
|
|
195
|
+
}
|
|
196
|
+
vars = query.split("&");
|
|
197
|
+
for (let i = 0; i < vars.length; i++) {
|
|
198
|
+
let pair = vars[i].split("=");
|
|
199
|
+
if (pair[0] == variable) {
|
|
200
|
+
return pair.slice(1).join("=");
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return false;
|
|
204
|
+
};
|
|
205
|
+
// 前置逻辑,判断会话是否失效,判断动态路由是否已初始化
|
|
206
|
+
router.beforeEach(async (to, from, next) => {
|
|
207
|
+
//from有isTodo to没有isTodo, 从代办返回
|
|
208
|
+
LoadingBar.start();
|
|
209
|
+
let token = getToken();
|
|
210
|
+
let search = location.search;
|
|
211
|
+
//杰哥说token赋true影响编译 换个变量试试
|
|
212
|
+
let tempToken = false;
|
|
213
|
+
if (search) {
|
|
214
|
+
let rlt = getQueryVariable("token");
|
|
215
|
+
if (rlt) {
|
|
216
|
+
// 如果已经单点登录过了,这里不应再重新初始化状态了
|
|
217
|
+
if (token !== rlt) {
|
|
218
|
+
token = rlt;
|
|
219
|
+
store.dispatch("loginSuccess", token);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
let ssoToken =
|
|
224
|
+
getQueryVariable("sso_token") || sessionStorage.getItem("sso_token");
|
|
225
|
+
if (ssoToken) {
|
|
226
|
+
tempToken = true; // token只是标识有会话,并不作为会话的凭证了
|
|
227
|
+
sessionStorage.setItem("sso_token", ssoToken);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
let isInitilaze = !store.state.user.userName;
|
|
232
|
+
if (!tempToken && !token && to.name !== LOGIN_PAGE_NAME) {
|
|
233
|
+
// 未登录且要跳转的页面不是登录页,跳转到登录页
|
|
234
|
+
next({ name: LOGIN_PAGE_NAME });
|
|
235
|
+
} else if (to.name === LOGIN_PAGE_NAME) {
|
|
236
|
+
// 要跳转的页面是登录页
|
|
237
|
+
next();
|
|
238
|
+
} else if (
|
|
239
|
+
isInitilaze ||
|
|
240
|
+
top !== self ||
|
|
241
|
+
location.href.includes("imarket-analysis")
|
|
242
|
+
) {
|
|
243
|
+
Spin.show();
|
|
244
|
+
try {
|
|
245
|
+
// 去处理动态路由
|
|
246
|
+
await renderRoutes({
|
|
247
|
+
router,
|
|
248
|
+
store,
|
|
249
|
+
microType,
|
|
250
|
+
allowPermissionList,
|
|
251
|
+
routerOptionsBak,
|
|
252
|
+
to,
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
if (isInitilaze || !to.matched?.length) {
|
|
256
|
+
console.log("路由没有匹配到", to);
|
|
257
|
+
if (to.name && to.path == "/") {
|
|
258
|
+
next({ name: to.name, query: to.query /*, replace: true*/ });
|
|
259
|
+
} else {
|
|
260
|
+
console.log("路由匹配到,跳", to);
|
|
261
|
+
next({ ...to /*, replace: true */ });
|
|
262
|
+
}
|
|
263
|
+
} else {
|
|
264
|
+
console.log("路由匹配到,跳2", to);
|
|
265
|
+
next();
|
|
266
|
+
}
|
|
267
|
+
} catch (error) {
|
|
268
|
+
console.log("router.beforeeach err", error);
|
|
269
|
+
next({ name: LOGIN_PAGE_NAME });
|
|
270
|
+
}
|
|
271
|
+
Spin.hide();
|
|
272
|
+
} else {
|
|
273
|
+
next();
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
// 后置逻辑
|
|
278
|
+
router.afterEach((to) => {
|
|
279
|
+
// setTitle(to)
|
|
280
|
+
LoadingBar.finish();
|
|
281
|
+
window.scrollTo(0, 0);
|
|
282
|
+
});
|
|
283
|
+
}
|
package/router/index.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import _ from "lodash";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 处理表格列配置
|
|
5
|
+
* @param {Array} tableColumns - 业务定义的原始列配置
|
|
6
|
+
* @param {Array} columns - 用户自定义的列配置
|
|
7
|
+
* @returns {Array} - 处理后的列配置数组
|
|
8
|
+
*/
|
|
9
|
+
export function processColumns(tableColumns, columns) {
|
|
10
|
+
let copyColumns = _.cloneDeep(tableColumns)
|
|
11
|
+
// 创建业务组件列的映射表,以key或field为键
|
|
12
|
+
const businessColumnsMap = new Map()
|
|
13
|
+
copyColumns.forEach((col) => {
|
|
14
|
+
const key = col.key || col.field || col.title
|
|
15
|
+
if (key) {
|
|
16
|
+
businessColumnsMap.set(key, col)
|
|
17
|
+
}
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
let disabledColumnType = ['checkbox', 'radio', 'index', 'button']
|
|
21
|
+
const orderedColumns = columns
|
|
22
|
+
.map((col) => {
|
|
23
|
+
if (disabledColumnType.includes(col.type)) {
|
|
24
|
+
let businessCol = copyColumns.find((businessCol) => col.type === businessCol.type)
|
|
25
|
+
if (businessCol) {
|
|
26
|
+
businessCol.pinned = col.pinned
|
|
27
|
+
businessCol.fixed = col.fixed
|
|
28
|
+
businessCol.width = col.width
|
|
29
|
+
businessCol.checked = col.checked
|
|
30
|
+
businessCol.hide = col.hide
|
|
31
|
+
// 如果有子节点,递归处理
|
|
32
|
+
if (col.children && businessCol.children) {
|
|
33
|
+
businessCol.children = processColumns(businessCol.children, col.children)
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return businessCol
|
|
37
|
+
} else {
|
|
38
|
+
const key = col.key || col.field || col.title
|
|
39
|
+
let businessCol = businessColumnsMap.get(key)
|
|
40
|
+
if (businessCol) {
|
|
41
|
+
businessCol.pinned = col.pinned
|
|
42
|
+
businessCol.fixed = col.fixed
|
|
43
|
+
businessCol.width = col.width
|
|
44
|
+
businessCol.checked = col.checked
|
|
45
|
+
businessCol.hide = col.hide
|
|
46
|
+
// 如果有子节点,递归处理
|
|
47
|
+
if (col.children && businessCol.children) {
|
|
48
|
+
businessCol.children = processColumns(businessCol.children, col.children)
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return businessCol
|
|
52
|
+
}
|
|
53
|
+
})
|
|
54
|
+
.filter((col) => col !== undefined)
|
|
55
|
+
|
|
56
|
+
copyColumns.forEach((col, index) => {
|
|
57
|
+
const key = col.field || col.key || col.title
|
|
58
|
+
if (!key) {
|
|
59
|
+
return
|
|
60
|
+
}
|
|
61
|
+
// 检查是否已在 orderedColumns 中
|
|
62
|
+
const isInOrdered = orderedColumns.some(
|
|
63
|
+
(orderedCol) => (orderedCol.field || orderedCol.key || orderedCol.title) === key,
|
|
64
|
+
)
|
|
65
|
+
// 如果不在 orderedColumns 中,放在原位置
|
|
66
|
+
if (!isInOrdered) {
|
|
67
|
+
orderedColumns.splice(index, 0, col)
|
|
68
|
+
}
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
return orderedColumns
|
|
72
|
+
}
|
package/utils/com.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { getSessionStorage, setSessionStorage } from './storage'
|
|
2
|
+
|
|
3
|
+
const DICT_KEY = 'ind-dict_'
|
|
4
|
+
|
|
5
|
+
export function getDictCache(dictId) {
|
|
6
|
+
return getSessionStorage(`${DICT_KEY}${dictId}`)
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function setDictCache(dictId, data) {
|
|
10
|
+
setSessionStorage(`${DICT_KEY}${dictId}`, data)
|
|
11
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import _ from 'lodash'
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 统一处理表单字段props属性定义配置
|
|
6
|
+
*
|
|
7
|
+
* @param fieldList 表单项字段定义
|
|
8
|
+
* @param fieldProps 需要修改的表单项字段属性配置,支持多个字段,格式为 { userId: { maxlength: 32 }, userType: { maxlength: 32 } }
|
|
9
|
+
* @returns 新的表单定义
|
|
10
|
+
*/
|
|
11
|
+
export function renderFieldProps(fieldList = [], fieldProps = {}) {
|
|
12
|
+
const rlt = _.cloneDeep(fieldList)
|
|
13
|
+
const fieldKeys = Object.keys(fieldProps)
|
|
14
|
+
rlt.forEach((field) => {
|
|
15
|
+
const key = field.formKey
|
|
16
|
+
if (fieldKeys.includes(key)) {
|
|
17
|
+
const props = fieldProps[key]
|
|
18
|
+
field.props = {
|
|
19
|
+
...field.props,
|
|
20
|
+
...props,
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
})
|
|
24
|
+
return rlt
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* 统一处理表单字段定义配置
|
|
29
|
+
*
|
|
30
|
+
* @param fieldList 表单项字段定义
|
|
31
|
+
* @param fields 需要修改的表单项字段配置,支持多个字段,格式为 { userId: { disabled: true }, userType: {disabled: true , enumList: [{ K: '01', V: '省级' }, {K: '02', V: '市级' }]}}
|
|
32
|
+
* @returns 新的表单定义
|
|
33
|
+
*/
|
|
34
|
+
export function renderFields(fieldList = [], fields = {}) {
|
|
35
|
+
const rlt = _.cloneDeep(fieldList)
|
|
36
|
+
const fieldKeys = Object.keys(fields)
|
|
37
|
+
rlt.forEach((field) => {
|
|
38
|
+
const key = field.formKey
|
|
39
|
+
if (fieldKeys.includes(key)) {
|
|
40
|
+
const props = fields[key]
|
|
41
|
+
Object.assign(field, props)
|
|
42
|
+
}
|
|
43
|
+
})
|
|
44
|
+
return rlt
|
|
45
|
+
}
|
package/utils/enum.js
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { isArray } from './is-type'
|
|
2
|
+
import _ from 'lodash'
|
|
3
|
+
|
|
4
|
+
/** 是否枚举的key */
|
|
5
|
+
export const IS_OR_NOT_ENUM_KEY = 'IS_ENUM'
|
|
6
|
+
/** 是否枚举的map形式 */
|
|
7
|
+
export const IS_OR_NOT_ENUM = { '1': '是', '0': '否' }
|
|
8
|
+
/** 是否枚举的list形式 */
|
|
9
|
+
export const IS_OR_NOT_ENUM_LIST = [
|
|
10
|
+
{ K: '1', V: '是' },
|
|
11
|
+
{ K: '0', V: '否' },
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
// 中台相关枚举,暂时写死
|
|
15
|
+
export const UC_ENUM = {
|
|
16
|
+
MANAGE_UNIT_ID: '00000000000000000000000020370001', // 管理单元Id
|
|
17
|
+
ORG_CODE_ADMIN: 'default', // 行政树类型
|
|
18
|
+
ORG_CODE_MKT: '08', // 营销业务树类型
|
|
19
|
+
ORG_CODE_LOG: '08', // 物流业务树类型,之前说要分开建的,现在和营销一个树
|
|
20
|
+
ORG_CODE_ACTIVITY: '08', // 宣促业务树类型,之前说要分开建的,现在和营销一个树
|
|
21
|
+
ADMIN_LEVEL_IND: '01', // 行政树组织级别 - 工业公司
|
|
22
|
+
ADMIN_LEVEL_CENTER: '02', // 行政树组织级别 - 营销中心
|
|
23
|
+
ADMIN_LEVEL_FAC: '03', // 行政树组织级别 - 卷烟厂
|
|
24
|
+
ADMIN_LEVEL_DIST: '04', // 行政树组织级别 - 区域
|
|
25
|
+
ADMIN_LEVEL_COMMON_DEPT: '08', // 行政树组织级别 - 普通部门
|
|
26
|
+
ADMIN_LEVEL_COMMON_POST: '80', // 行政树组织级别 - 普通岗位
|
|
27
|
+
LEVEL_IND: '01', // 业务树组织级别 - 工业公司
|
|
28
|
+
LEVEL_CENTER: '02', // 业务树组织级别 - 营销中心
|
|
29
|
+
LEVEL_FAC: '02', // 业务树组织级别 - 卷烟厂
|
|
30
|
+
LEVEL_DIST: '04', // 业务树组织级别 - 普通卷烟营销的区域
|
|
31
|
+
LEVEL_CIGAR_DIST: '05', // 业务树组织级别 - 雪茄片区
|
|
32
|
+
LEVEL_COMMON_DEPT: '03', // 业务树组织级别 - 普通部门
|
|
33
|
+
LEVEL_COMMON_POST: '80', // 业务树组织级别 - 普通岗位
|
|
34
|
+
LEVEL_DIST_MANAGE_POST: '81', // 业务树组织级别 - 区域经理岗位
|
|
35
|
+
LEVEL_CUST_MANAGE_POST: '82', // 业务树组织级别 - 客户经理岗位
|
|
36
|
+
LEVEL_CIGAR_DIST_MANAGE_POST: '83', // 业务树组织级别 - 雪茄片区经理岗位
|
|
37
|
+
LEVEL_CIGAR_CUST_MANAGE_POST: '84', // 业务树组织级别 - 雪茄客户经理岗位
|
|
38
|
+
LEVEL_INTERNAL_POST: '85', // 业务树组织级别 - 内勤岗位
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* 将自定义的列表转换为枚举列表格式,如
|
|
43
|
+
* ```
|
|
44
|
+
* let list = [{ brandId: '0916', brandName: '泰山' }]
|
|
45
|
+
* renderEnumList(list, 'brandId', 'brandName') // 返回 [{ K: '0916', V: '泰山' }]
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* @param list 枚举列表
|
|
49
|
+
* @param kProp key对应属性名
|
|
50
|
+
* @param vProp value对应属性名
|
|
51
|
+
* @returns 公共组件可直接使用的枚举列表
|
|
52
|
+
*/
|
|
53
|
+
export function renderEnumList(list = [], kProp = 'K', vProp = 'V') {
|
|
54
|
+
return list.map((item) => ({ K: item[kProp], V: item[vProp] }))
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* 将自定义的列表转换为枚举对象格式,如
|
|
59
|
+
* ```
|
|
60
|
+
* let list = [{ brandId: '0916', brandName: '泰山' }]
|
|
61
|
+
* renderEnumData(list, 'brandId', 'brandName') // 返回 { '0916': '泰山' }
|
|
62
|
+
* ```
|
|
63
|
+
* @param list 枚举列表
|
|
64
|
+
* @param kProp key对应属性名
|
|
65
|
+
* @param vProp value对应属性名
|
|
66
|
+
* @returns 公共组件可直接使用的枚举对象
|
|
67
|
+
*/
|
|
68
|
+
export function renderEnumData(list = [], kProp = 'K', vProp = 'V') {
|
|
69
|
+
return list.reduce((item) => ({ ...item, [item[kProp]]: item[vProp] }), {})
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* 统一处理表格列定义的枚举列
|
|
74
|
+
* - 由于表格组件不方便获取枚举数据,需要各业务先获取枚举数据后,重新组织列定义
|
|
75
|
+
* - 需通过特定接口获取的数据可以经 `renderEnumList` 或 `renderEnumData` 处理成枚举后使用
|
|
76
|
+
*
|
|
77
|
+
* @param columns 列定义,对type为 `enum` 或 `select` 的列进行处理
|
|
78
|
+
* @param enumRelation 枚举数据,支持多个枚举,格式为 `{ '枚举Id1': [{ K: '', V: ''}] }` 或 `{ '枚举Id1': { 'K': 'V' } }`
|
|
79
|
+
* @returns 新的列定义
|
|
80
|
+
*/
|
|
81
|
+
export function renderColumnEnums(columns = [], enumRelation = {}) {
|
|
82
|
+
const rlt = _.cloneDeep(columns)
|
|
83
|
+
const enumKeys = Object.keys(enumRelation)
|
|
84
|
+
|
|
85
|
+
rlt.forEach((column) => {
|
|
86
|
+
const key = column.field || column.key
|
|
87
|
+
const isType = ['enum', 'select'].includes(column.type)
|
|
88
|
+
if (enumKeys.includes(key) && isType) {
|
|
89
|
+
if (!column.cellRendererParams) {
|
|
90
|
+
column.cellRendererParams = {}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const enums = enumRelation[key]
|
|
94
|
+
if (column.type === 'enum') {
|
|
95
|
+
if (isArray(enums)) {
|
|
96
|
+
column.cellRendererParams.enumList = enums
|
|
97
|
+
} else {
|
|
98
|
+
column.cellRendererParams.enumData = enums
|
|
99
|
+
}
|
|
100
|
+
} else if (column.type === 'select') {
|
|
101
|
+
column.cellRendererParams.datas = enums
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (column.children && column.children.length) {
|
|
106
|
+
column.children = renderColumnEnums(column.children, enumRelation)
|
|
107
|
+
}
|
|
108
|
+
})
|
|
109
|
+
return rlt
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* 统一处理表单的类枚举列
|
|
114
|
+
* - 用于处理需特定接口获取数据的列表
|
|
115
|
+
* - 获取数据后可以经 `renderEnumList` 或 `renderEnumData` 处理成枚举后使用
|
|
116
|
+
*
|
|
117
|
+
* @param fieldList 表单项定义,其中对 `formKey` 和 `enumRelation` 的属性匹配上的表单项进行处理
|
|
118
|
+
* @param enumRelation 枚举数据,支持多个枚举,格式为 `{ '枚举Id1': [{ K: '', V: ''}] }` 或 `{ '枚举Id1': { 'K': 'V' } }`
|
|
119
|
+
* @returns 新的表单定义
|
|
120
|
+
*/
|
|
121
|
+
export function renderFieldEnums(fieldList = [], enumRelation = {}) {
|
|
122
|
+
const rlt = _.cloneDeep(fieldList)
|
|
123
|
+
const enumKeys = Object.keys(enumRelation)
|
|
124
|
+
|
|
125
|
+
rlt.forEach((field) => {
|
|
126
|
+
const key = field.formKey
|
|
127
|
+
if (enumKeys.includes(key)) {
|
|
128
|
+
const enums = enumRelation[key]
|
|
129
|
+
if (isArray(enums)) {
|
|
130
|
+
field.enumList = enums
|
|
131
|
+
} else {
|
|
132
|
+
field.enumData = enums
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
})
|
|
136
|
+
return rlt
|
|
137
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import _ from 'lodash'
|
|
2
|
+
import { axios } from '@yy-common/shared/utils'
|
|
3
|
+
import { config } from "@lambo-design/shared/config/config"
|
|
4
|
+
|
|
5
|
+
export function axiosResponse2Str(resp) {
|
|
6
|
+
let headerTxt = resp?.headers?.toString()
|
|
7
|
+
let responseText = resp?.request?.responseText
|
|
8
|
+
return JSON.stringify({
|
|
9
|
+
status: resp?.status,
|
|
10
|
+
headerTxt,
|
|
11
|
+
responseText,
|
|
12
|
+
})
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function errorLog(params) {
|
|
16
|
+
if(config.disableErrorLog){
|
|
17
|
+
return
|
|
18
|
+
}
|
|
19
|
+
let defaultParams = {
|
|
20
|
+
imsysLogsFunction: 'responseInterceptors',
|
|
21
|
+
imsysLogsInput: '',
|
|
22
|
+
imsysLogsModule: '网络请求',
|
|
23
|
+
imsysLogsRepair: '',
|
|
24
|
+
imsysLogsTitle: '网络请求错误',
|
|
25
|
+
imsysLogsType: '1',
|
|
26
|
+
}
|
|
27
|
+
let imsysErrorLogsREQ = _.merge({}, defaultParams, params)
|
|
28
|
+
// 兼容湖北企业微信
|
|
29
|
+
let preFixUrl = location.pathname.includes('scyxweb') ? '/scyxgateway' : ''
|
|
30
|
+
axios
|
|
31
|
+
.post(`${preFixUrl}/ddd-imsys-manage-server/manage/error-log/saveErrorLog`, imsysErrorLogsREQ)
|
|
32
|
+
.then((resp) => {
|
|
33
|
+
if (resp.data.code === 1) {
|
|
34
|
+
/* empty */
|
|
35
|
+
} else {
|
|
36
|
+
/* empty */
|
|
37
|
+
}
|
|
38
|
+
})
|
|
39
|
+
}
|