@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.
@@ -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
+ }
@@ -0,0 +1,9 @@
1
+ import config from '@yy-common/shared/config/config'
2
+
3
+ export * from './basic-routes'
4
+ export * from './guard'
5
+
6
+ export const routerOptions = {
7
+ mode: 'history',
8
+ base: config.routerBase,
9
+ }
@@ -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,8 @@
1
+ import { axios } from './request/index'
2
+ import config from '../config/config'
3
+
4
+ const CONTEXT = config.ismAmServerContext
5
+
6
+ export function listComTreeApi(params) {
7
+ return axios.get(`${CONTEXT}/tree/com/listComTree`, { params })
8
+ }
@@ -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
+ }