@gingkoo/base-server 0.0.1-alpha.0 → 0.0.1-alpha.1
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/README.md +7 -0
- package/app.js +32 -40
- package/backend/common/entity.js +55 -0
- package/backend/common/enum.js +247 -0
- package/backend/common/fss/index.js +18 -0
- package/backend/common/fss/routers/attachment.js +45 -0
- package/backend/common/fss/routers/download.js +43 -0
- package/backend/common/fss/routers/import_export.js +113 -0
- package/backend/common/fss/routers/resources.js +149 -0
- package/backend/common/fss/routers/upload.js +81 -0
- package/backend/common/fss/services/import_export.js +159 -0
- package/backend/common/fss/services/index.js +92 -0
- package/backend/common/fss/utils.js +39 -0
- package/backend/common/ginfo/config.js +5 -0
- package/backend/common/ginfo/index.js +62 -0
- package/backend/common/index_template.html +28 -0
- package/backend/common/logger/index.js +96 -0
- package/backend/common/mapping.js +98 -0
- package/backend/common/middleware/auth.js +97 -0
- package/backend/common/middleware/cors.js +13 -0
- package/backend/common/middleware/response.js +25 -0
- package/backend/common/page_engine.js +487 -0
- package/backend/common/schedule.js +45 -0
- package/backend/common/services/dataCombine.js +67 -0
- package/backend/common/services/dept.js +37 -0
- package/backend/common/services/dict.js +487 -0
- package/backend/common/services/email.js +49 -0
- package/backend/common/services/generalConfig.js +137 -0
- package/backend/common/services/login.js +18 -0
- package/backend/common/services/notice.js +260 -0
- package/backend/common/services/permission.js +500 -0
- package/backend/common/services/roles.js +57 -0
- package/backend/common/services/send-notice.js +86 -0
- package/backend/common/services/task.js +259 -0
- package/backend/common/services/user.js +673 -0
- package/backend/common/socket.js +18 -0
- package/backend/common/sse/index.js +81 -0
- package/backend/common/sse/router.js +30 -0
- package/backend/common/task.js +75 -0
- package/backend/common/wechat/index.js +9 -0
- package/backend/common/wechat/routers/auth.js +238 -0
- package/{modules/user/frontend → backend/common/wechat/routers}/index.html +14 -7
- package/backend/common/wechat/services/auth.js +209 -0
- package/backend/common/wechat/services/notice.js +171 -0
- package/backend/config/index.js +63 -0
- package/backend/config/path.js +3 -0
- package/backend/router.js +96 -0
- package/backend/routers/app.js +222 -0
- package/backend/routers/automate.js +276 -0
- package/backend/routers/dict.js +370 -0
- package/backend/routers/email.js +85 -0
- package/backend/routers/generalConfig.js +276 -0
- package/backend/routers/idm.js +245 -0
- package/backend/routers/module.js +357 -0
- package/backend/routers/notice.js +138 -0
- package/backend/routers/pages.js +46 -0
- package/backend/routers/permission.js +985 -0
- package/backend/routers/setting.js +184 -0
- package/backend/routers/team/index.js +22 -0
- package/backend/routers/team/routers/mapping.js +29 -0
- package/backend/routers/team/routers/member.js +72 -0
- package/backend/routers/team/routers/membermanage.js +289 -0
- package/backend/routers/team/routers/pages.js +47 -0
- package/backend/routers/team/routers/roles.js +92 -0
- package/backend/routers/team/routers/teaminfo.js +27 -0
- package/backend/routers/team/routers/usergroup.js +213 -0
- package/backend/routers/team/services/mapping.js +101 -0
- package/backend/routers/team/services/member.js +206 -0
- package/backend/routers/team/services/roles.js +71 -0
- package/backend/routers/team/services/teaminfo.js +20 -0
- package/backend/routers/team/services/usergroup.js +128 -0
- package/backend/routers/user.js +436 -0
- package/backend/services/automate.js +60 -0
- package/backend/services/config.js +14 -0
- package/backend/services/module.js +298 -0
- package/backend/services/permission.js +192 -0
- package/backend/services/services.js +115 -0
- package/backend/services/setting.js +190 -0
- package/backend/services/token.js +42 -0
- package/backend/space.js +52 -0
- package/backend/space_mapping.js +15 -0
- package/backend/utils/avatar.js +48 -0
- package/backend/utils/color_gen_helper.js +20 -0
- package/backend/utils/date.js +66 -0
- package/backend/utils/excel.js +446 -0
- package/backend/utils/fs/doc.md +64 -0
- package/backend/utils/fs/index.js +127 -0
- package/backend/utils/jwt.js +54 -0
- package/backend/utils/modules/sequence.js +93 -0
- package/backend/utils/object.js +31 -0
- package/backend/utils/page-query-helper/index.js +61 -0
- package/backend/utils/path.js +123 -0
- package/backend/utils/run.js +25 -0
- package/backend/utils/tokenize.js +82 -0
- package/backend/utils/typeof.js +5 -0
- package/backend/utils/util.js +153 -0
- package/backend/views/api/index.js +32 -0
- package/backend/views/api/index.xml +49 -0
- package/backend/views/dict/index.js +80 -0
- package/backend/views/dict/index.xml +52 -0
- package/backend/views/index.js +32 -0
- package/backend/views/members_manage/index.js +68 -0
- package/backend/views/members_manage/index.xml +68 -0
- package/backend/views/roles/index.js +17 -0
- package/backend/views/roles/index.xml +47 -0
- package/backend/views/usergroup/index.js +68 -0
- package/backend/views/usergroup/index.xml +65 -0
- package/dist/assets/css/index-cc834b52.css +3 -0
- package/dist/assets/css/index-cc834b52.css.gz +0 -0
- package/dist/assets/js/index-9eef7474.js +762 -0
- package/dist/assets/js/index-9eef7474.js.gz +0 -0
- package/dist/assets/js/react-cropper.es-d3337769.js +10 -0
- package/dist/assets/js/react-cropper.es-d3337769.js.gz +0 -0
- package/dist/assets/png/u9-2348c304.png +0 -0
- package/dist/assets/woff2/materialicons-83be7b2f.woff2 +0 -0
- package/dist/index.html +162 -0
- package/package.json +60 -5
- package/common/router.js +0 -42
- package/modules/user/backend/index.js +0 -19
- package/modules/user/backend/routers/user.js +0 -11
- package/modules/user/frontend/index.js +0 -1
- package/serve.js +0 -9
|
@@ -0,0 +1,673 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const { v4: uuidv4 } = require('uuid');
|
|
3
|
+
const dayjs = require('dayjs');
|
|
4
|
+
const {
|
|
5
|
+
sqlExecutor,
|
|
6
|
+
queryBaseSqlBuilder,
|
|
7
|
+
insertSqlBuilder,
|
|
8
|
+
queryNamedParamsBuilder,
|
|
9
|
+
updateSqlBuilder,
|
|
10
|
+
pageQuery,
|
|
11
|
+
deleteSqlBuilder,
|
|
12
|
+
queryParamsBuilder,
|
|
13
|
+
checkTableFilterFields,
|
|
14
|
+
} = require('@gingkoo/node-tools');
|
|
15
|
+
const { logger } = require('../logger/index');
|
|
16
|
+
const entity = require('../entity');
|
|
17
|
+
|
|
18
|
+
const userService = {
|
|
19
|
+
// 更新用户信息
|
|
20
|
+
async update(params, where) {
|
|
21
|
+
where = where || {};
|
|
22
|
+
where.ORG_ID = global.orgid;
|
|
23
|
+
|
|
24
|
+
let { sql, params: _params } = updateSqlBuilder(entity.IDM_USERS, params, where);
|
|
25
|
+
|
|
26
|
+
let { error } = await sqlExecutor(sql, _params);
|
|
27
|
+
if (error) {
|
|
28
|
+
logger.error('更新用户信息', error);
|
|
29
|
+
}
|
|
30
|
+
return [error];
|
|
31
|
+
},
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* ❤ 根据 userid 查找用户信息
|
|
35
|
+
* @param {string} userid 用户id
|
|
36
|
+
*/
|
|
37
|
+
async getUserInfo(userid) {
|
|
38
|
+
let { error, results } = await sqlExecutor(
|
|
39
|
+
`select USER_ID, USER_NAME, USER_TYPE, EN_NAME, NIKE_NAME, GENDER, EMAIL, MOBILE, TEL, TITLE, DEPT_NO,
|
|
40
|
+
AVATAR, ADDR, POSITION, STATUS, STAFF_NO, DATA_CRT_DATE, MEMBER_STATUS, BACKGROUND, NAME_COLOR, FRAME_TYPE
|
|
41
|
+
,MAIN_THEME, MINOR_THEME, BACKBANNER
|
|
42
|
+
from ${entity.IDM_USERS} where ORG_ID=? and USER_ID=?`,
|
|
43
|
+
[global.orgid, userid],
|
|
44
|
+
);
|
|
45
|
+
if (error || !results.length) {
|
|
46
|
+
error && logger.error(error);
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return results[0];
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* ❤ 查询用户列表
|
|
55
|
+
* @param {object} filter 过滤条件
|
|
56
|
+
* @param {string} suffix 附加sql
|
|
57
|
+
*/
|
|
58
|
+
async getUsers(filter, suffix) {
|
|
59
|
+
filter = filter || {};
|
|
60
|
+
filter.ORG_ID = global.orgid;
|
|
61
|
+
let { sql, params } = await queryBaseSqlBuilder(entity.IDM_USERS, filter, suffix);
|
|
62
|
+
let { error, results } = await sqlExecutor(sql, params);
|
|
63
|
+
if (error) {
|
|
64
|
+
logger.error(error);
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return results;
|
|
69
|
+
},
|
|
70
|
+
/**
|
|
71
|
+
* ❤ 查询用户列表
|
|
72
|
+
* @param {Array[string]} touser
|
|
73
|
+
*/
|
|
74
|
+
async getEmail(touser) {
|
|
75
|
+
let sql = `select * from ${entity.IDM_USERS} where ORG_ID={ORG_ID} AND USER_ID IN ({USERS})`;
|
|
76
|
+
let sqlResult = queryNamedParamsBuilder(sql, {
|
|
77
|
+
ORG_ID: global.orgid,
|
|
78
|
+
USERS: touser,
|
|
79
|
+
});
|
|
80
|
+
let { error, results } = await sqlExecutor(sqlResult.sql, sqlResult.params);
|
|
81
|
+
if (error) {
|
|
82
|
+
logger.error(error);
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
return results;
|
|
86
|
+
},
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* 获取指定项目的成员列表
|
|
90
|
+
* @param {string} PROJECT_ID 项目id
|
|
91
|
+
*/
|
|
92
|
+
async getProjectUsers(PROJECT_ID) {
|
|
93
|
+
let sql = `select USER_ID, USER_NAME, AVATAR FROM ${entity.IDM_USERS} a where ORG_ID=? AND (USER_ID IN (SELECT USER_ID FROM ${entity.PROJECT_MEMBERS} x where x.ORG_ID=a.ORG_ID AND PROJECT_ID=?))`;
|
|
94
|
+
let { error, results } = await sqlExecutor(sql, [global.orgid, PROJECT_ID]);
|
|
95
|
+
if (error) {
|
|
96
|
+
logger.error(error);
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return results;
|
|
101
|
+
},
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* 获取指定项目 和角色的成员列表
|
|
105
|
+
*
|
|
106
|
+
* @param {string} PROJECT_ID 项目id
|
|
107
|
+
* @param {string} ROLE_ID 项目id
|
|
108
|
+
*/
|
|
109
|
+
async getProjectRouleUsers(PROJECT_ID, ROLE_ID) {
|
|
110
|
+
let sql = `select USER_ID, USER_NAME, AVATAR FROM ${entity.IDM_USERS} a where ORG_ID=? AND (USER_ID IN (SELECT USER_ID FROM ${entity.PROJECT_MEMBERS} x where x.ORG_ID=a.ORG_ID AND PROJECT_ID=? AND MEM_ROLE=? ))`;
|
|
111
|
+
let { error, results } = await sqlExecutor(sql, [global.orgid, PROJECT_ID, ROLE_ID]);
|
|
112
|
+
if (error) {
|
|
113
|
+
logger.error(error);
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return results;
|
|
118
|
+
},
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
*
|
|
122
|
+
* @param {*} filters
|
|
123
|
+
* @param {*} pageInfo
|
|
124
|
+
* @param {*} sql
|
|
125
|
+
* @param {*} sqlParams
|
|
126
|
+
*/
|
|
127
|
+
async getUsersBySql(filters, pageInfo, sql, sqlParams) {
|
|
128
|
+
let pageSize = pageInfo.pageSize;
|
|
129
|
+
let pageIndex = pageInfo.pageIndex;
|
|
130
|
+
let spSqlOps = {};
|
|
131
|
+
if (filters['USER_NAME']) {
|
|
132
|
+
spSqlOps['USER_NAME'] = 'like';
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (Object.keys(filters).length > 0) {
|
|
136
|
+
let queryParam = queryParamsBuilder(filters, 'a', {}, spSqlOps);
|
|
137
|
+
sql = sql + ' and ' + queryParam.sql;
|
|
138
|
+
sqlParams = sqlParams.concat(queryParam.params);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
sql = sql + ' order by a.USER_ID DESC';
|
|
142
|
+
let dbResult = await pageQuery(sql, sqlParams, pageSize, pageIndex);
|
|
143
|
+
|
|
144
|
+
return dbResult;
|
|
145
|
+
},
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
*
|
|
149
|
+
* @param {*} userid
|
|
150
|
+
* @param {*} filters
|
|
151
|
+
* @param {*} pageInfo
|
|
152
|
+
* @returns
|
|
153
|
+
*/
|
|
154
|
+
async getUserList(filters, pageInfo) {
|
|
155
|
+
//查询用列表最多20条
|
|
156
|
+
pageInfo.pageSize = 20;
|
|
157
|
+
let sql =
|
|
158
|
+
"select USER_ID, USER_NAME, DEPT_NO, AVATAR from IDM_USERS a where a.ORG_ID=? and STATUS='00'";
|
|
159
|
+
let dbResult = await this.getUsersBySql(filters, pageInfo, sql, [global.orgid]);
|
|
160
|
+
return dbResult;
|
|
161
|
+
},
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* 获取团队成员列表
|
|
165
|
+
* @param {*} userid
|
|
166
|
+
* @param {*} filters
|
|
167
|
+
* @param {*} pageInfo
|
|
168
|
+
* @returns
|
|
169
|
+
*/
|
|
170
|
+
async getTeamUsers(userid, filters, pageInfo) {
|
|
171
|
+
let sql =
|
|
172
|
+
"select USER_ID, USER_NAME, USER_TYPE, EN_NAME, NIKE_NAME, GENDER, DEPT_NO, AVATAR, ADDR, POSITION, STATUS, EDUCATION, ADMISSION_DATE, JOINED_DATE from IDM_USERS a where a.ORG_ID=? and STATUS='00' and USER_STATUS='normal'";
|
|
173
|
+
sql =
|
|
174
|
+
sql +
|
|
175
|
+
' and ((a.DEPT_NO in (select DEPT_NO from IDM_DEPTS y where y.ORG_ID=a.ORG_ID and y.DEPT_LEADER=?))';
|
|
176
|
+
sql =
|
|
177
|
+
sql +
|
|
178
|
+
' or a.USER_ID in (select USER_ID from IDM_GROUP_MEMBERS o where o.ORG_ID=a.ORG_ID and GROUP_ID in (select GROUP_ID from IDM_GROUPS p where p.ORG_ID=a.ORG_ID and p.GROUP_LEADER=?)))';
|
|
179
|
+
let dbResult = await this.getUsersBySql(filters, pageInfo, sql, [global.orgid, userid, userid]);
|
|
180
|
+
return dbResult;
|
|
181
|
+
},
|
|
182
|
+
|
|
183
|
+
async syncUserInfo(userId, params) {
|
|
184
|
+
params.ORG_ID = global.orgid;
|
|
185
|
+
let dbResult = await sqlExecutor(
|
|
186
|
+
`select * from ${entity.IDM_USERS} where ORG_ID=? and USER_ID=?`,
|
|
187
|
+
[params['ORG_ID'], userId],
|
|
188
|
+
);
|
|
189
|
+
if (dbResult.error) {
|
|
190
|
+
logger.error(dbResult.error);
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (dbResult.results.length > 0) {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
let sqlResult = insertSqlBuilder(entity.IDM_USERS, params);
|
|
199
|
+
dbResult = await sqlExecutor(sqlResult.sql, sqlResult.params);
|
|
200
|
+
if (dbResult.error) {
|
|
201
|
+
logger.error(dbResult.error);
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
return true;
|
|
206
|
+
},
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* 同步用户数据
|
|
210
|
+
*/
|
|
211
|
+
async syncUserOAuth(userId, params) {
|
|
212
|
+
params.ORG_ID = global.orgid;
|
|
213
|
+
let dbResult = await sqlExecutor(
|
|
214
|
+
`select * from ${entity.IDM_USER_OAUTH} where ORG_ID=? and USER_ID=? and OAUTH_VENDOR=?`,
|
|
215
|
+
[params['ORG_ID'], userId, params['OAUTH_VENDOR']],
|
|
216
|
+
);
|
|
217
|
+
if (dbResult.error) {
|
|
218
|
+
logger.error(dbResult.error);
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (dbResult.results.length > 0) {
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
let sqlResult = insertSqlBuilder(entity.IDM_USER_OAUTH, params);
|
|
227
|
+
dbResult = await sqlExecutor(sqlResult.sql, sqlResult.params);
|
|
228
|
+
if (dbResult.error) {
|
|
229
|
+
logger.error(dbResult.error);
|
|
230
|
+
return null;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return true;
|
|
234
|
+
},
|
|
235
|
+
|
|
236
|
+
async getOrgData() {
|
|
237
|
+
let sql = `select * from ${entity.IDM_ORGS} where ORG_ID = ?`;
|
|
238
|
+
let dbResult = await sqlExecutor(sql, [global.orgid]);
|
|
239
|
+
if (dbResult.error) {
|
|
240
|
+
console.log(dbResult.error);
|
|
241
|
+
return null;
|
|
242
|
+
}
|
|
243
|
+
if (!dbResult.results.length) {
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
return dbResult.results[0];
|
|
247
|
+
},
|
|
248
|
+
|
|
249
|
+
async getDeptData() {
|
|
250
|
+
let sql = `select * from ${entity.IDM_DEPTS} where ORG_ID = ? order by ISNULL(DATA_CRT_TIME),DATA_CRT_TIME DESC `;
|
|
251
|
+
let dbResult = await sqlExecutor(sql, [global.orgid]);
|
|
252
|
+
if (dbResult.error) {
|
|
253
|
+
logger.error(dbResult.error);
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
return dbResult.results;
|
|
257
|
+
},
|
|
258
|
+
|
|
259
|
+
async getGroupData() {
|
|
260
|
+
let sql = `select * from ${entity.IDM_GROUPS} where ORG_ID = ? order by ISNULL(DATA_CRT_TIME),DATA_CRT_TIME DESC`;
|
|
261
|
+
let dbResult = await sqlExecutor(sql, [global.orgid]);
|
|
262
|
+
if (dbResult.error) {
|
|
263
|
+
logger.error(dbResult.error);
|
|
264
|
+
return null;
|
|
265
|
+
}
|
|
266
|
+
return dbResult.results;
|
|
267
|
+
},
|
|
268
|
+
|
|
269
|
+
async insertTeamMember(userid, memberType, teamId) {
|
|
270
|
+
let dbResult = await sqlExecutor(
|
|
271
|
+
`select * from ${memberType[0]} where ORG_ID=? and USER_ID=? and ${memberType[1]}=?`,
|
|
272
|
+
[global.orgid, userid, teamId],
|
|
273
|
+
);
|
|
274
|
+
if (dbResult.error) {
|
|
275
|
+
logger.error(dbResult.error);
|
|
276
|
+
return null;
|
|
277
|
+
}
|
|
278
|
+
let sqlResult = {};
|
|
279
|
+
if (!dbResult.results.length) {
|
|
280
|
+
let params =
|
|
281
|
+
memberType[1] === 'GROUP_ID'
|
|
282
|
+
? { ORG_ID: global.orgid, GROUP_ID: teamId, USER_ID: userid, STATUS: '00' }
|
|
283
|
+
: { ORG_ID: global.orgid, DEPT_ID: teamId, USER_ID: userid, STATUS: 'normal' };
|
|
284
|
+
sqlResult = insertSqlBuilder(memberType[0], params);
|
|
285
|
+
} else {
|
|
286
|
+
let params =
|
|
287
|
+
memberType[1] === 'GROUP_ID'
|
|
288
|
+
? { GROUP_ID: teamId, STATUS: '00' }
|
|
289
|
+
: { DEPT_ID: teamId, STAUTS: 'normal' };
|
|
290
|
+
sqlResult = updateSqlBuilder(memberType[0], params, {
|
|
291
|
+
ORG_ID: global.orgid,
|
|
292
|
+
USER_ID: userid,
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
dbResult = await sqlExecutor(sqlResult.sql, sqlResult.params);
|
|
296
|
+
if (dbResult.error) {
|
|
297
|
+
console.log(dbResult.error);
|
|
298
|
+
return null;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
return true;
|
|
302
|
+
},
|
|
303
|
+
|
|
304
|
+
async operTeamMember(userid, params) {
|
|
305
|
+
let dbResult = await sqlExecutor(
|
|
306
|
+
`select * from ${entity.IDM_USERS} where ORG_ID=? and USER_ID=?`,
|
|
307
|
+
[global.orgid, userid],
|
|
308
|
+
);
|
|
309
|
+
if (dbResult.error) {
|
|
310
|
+
console.log(dbResult.error);
|
|
311
|
+
return null;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
if (!dbResult.results.length) {
|
|
315
|
+
return null;
|
|
316
|
+
}
|
|
317
|
+
let filters = {
|
|
318
|
+
ORG_ID: global.orgid,
|
|
319
|
+
USER_ID: userid,
|
|
320
|
+
};
|
|
321
|
+
|
|
322
|
+
let sqlResult = updateSqlBuilder(entity.IDM_USERS, params, filters);
|
|
323
|
+
dbResult = await sqlExecutor(sqlResult.sql, sqlResult.params);
|
|
324
|
+
if (dbResult.error) {
|
|
325
|
+
console.log(dbResult.error);
|
|
326
|
+
return null;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
return true;
|
|
330
|
+
},
|
|
331
|
+
|
|
332
|
+
async deleteTeamMember(id, memberType, teamId) {
|
|
333
|
+
let dbResult = await sqlExecutor(
|
|
334
|
+
`select * from ${memberType[0]} where ORG_ID=? and USER_ID=? and ${memberType[1]}=?`,
|
|
335
|
+
[global.orgid, id, teamId],
|
|
336
|
+
);
|
|
337
|
+
if (dbResult.error) {
|
|
338
|
+
console.log(dbResult.error);
|
|
339
|
+
return null;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
if (!dbResult.results.length) {
|
|
343
|
+
return null;
|
|
344
|
+
}
|
|
345
|
+
let sql = `update ${memberType[0]} set STATUS='01' where ${memberType[1]}=? and USER_ID=?`;
|
|
346
|
+
let sqlParams = [teamId, id];
|
|
347
|
+
dbResult = await sqlExecutor(sql, sqlParams);
|
|
348
|
+
if (dbResult.error) {
|
|
349
|
+
console.log(dbResult.error);
|
|
350
|
+
return null;
|
|
351
|
+
}
|
|
352
|
+
return true;
|
|
353
|
+
},
|
|
354
|
+
|
|
355
|
+
async getMember(memberType, id, filters, pageInfo) {
|
|
356
|
+
let { orderBy, orderDir, pageSize, pageIndex } = pageInfo;
|
|
357
|
+
let sql = `select * from ${entity.IDM_USERS} a where USER_ID in (select USER_ID from ${memberType[0]} where ${memberType[1]}=? and STATUS ='00 '`;
|
|
358
|
+
let sqlParams = [id];
|
|
359
|
+
delete filters['cat'];
|
|
360
|
+
let spSqlOps = {};
|
|
361
|
+
if (filters['USER_NAME']) {
|
|
362
|
+
spSqlOps['USER_NAME'] = 'like';
|
|
363
|
+
}
|
|
364
|
+
if (Object.keys(filters).length > 0) {
|
|
365
|
+
let queryParam = queryParamsBuilder(filters, 'a', {}, spSqlOps);
|
|
366
|
+
sql = sql + ' and ' + queryParam.sql;
|
|
367
|
+
sqlParams = sqlParams.concat(queryParam.params);
|
|
368
|
+
}
|
|
369
|
+
if (orderBy) {
|
|
370
|
+
sql += ` order by ${orderBy} ${orderDir.toLocaleUpperCase()}`;
|
|
371
|
+
} else {
|
|
372
|
+
sql += ' order by DATA_CRT_TIME DESC';
|
|
373
|
+
}
|
|
374
|
+
let dbResult = await pageQuery(sql, sqlParams, pageSize, pageIndex);
|
|
375
|
+
if (dbResult.error) {
|
|
376
|
+
console.log(dbResult.error);
|
|
377
|
+
return null;
|
|
378
|
+
}
|
|
379
|
+
return dbResult;
|
|
380
|
+
},
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* 通过teams 用户id 获取各渠道用户id
|
|
384
|
+
* @param {string[]} users 用户ids
|
|
385
|
+
* @return {
|
|
386
|
+
* wei.wang1: {
|
|
387
|
+
* workwx: 'WagnWei'
|
|
388
|
+
* dingding: ''
|
|
389
|
+
* }
|
|
390
|
+
* }
|
|
391
|
+
*/
|
|
392
|
+
async userChannel(users) {
|
|
393
|
+
let sql = `select * from ${entity.IDM_USER_OAUTH} where ORG_ID={ORG_ID} AND USER_ID IN ({USERS})`;
|
|
394
|
+
let sqlResult = queryNamedParamsBuilder(sql, {
|
|
395
|
+
ORG_ID: global.orgid,
|
|
396
|
+
USERS: users,
|
|
397
|
+
});
|
|
398
|
+
let { error, results } = await sqlExecutor(sqlResult.sql, sqlResult.params);
|
|
399
|
+
if (error) {
|
|
400
|
+
logger.error(error);
|
|
401
|
+
return null;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
if (results.length == 0) {
|
|
405
|
+
return null;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
let usersMap = {};
|
|
409
|
+
results.forEach((it) => {
|
|
410
|
+
let { USER_ID, OAUTH_VENDOR, VENDOR_USER_ID } = it;
|
|
411
|
+
if (!Reflect.has(usersMap, USER_ID)) {
|
|
412
|
+
usersMap[USER_ID] = {};
|
|
413
|
+
}
|
|
414
|
+
usersMap[USER_ID][OAUTH_VENDOR] = VENDOR_USER_ID;
|
|
415
|
+
});
|
|
416
|
+
|
|
417
|
+
return usersMap;
|
|
418
|
+
},
|
|
419
|
+
|
|
420
|
+
/* *
|
|
421
|
+
* 查询部门负责人
|
|
422
|
+
* */
|
|
423
|
+
async getTeamInfo(memberType, teamId) {
|
|
424
|
+
let { error, results } = await sqlExecutor(
|
|
425
|
+
`select * from ${memberType[0]} where ${memberType[1]}=?`,
|
|
426
|
+
[teamId],
|
|
427
|
+
);
|
|
428
|
+
if (error || !results.length) {
|
|
429
|
+
error && logger.error(error);
|
|
430
|
+
return null;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
return results[0];
|
|
434
|
+
},
|
|
435
|
+
|
|
436
|
+
async getMemberlist(memberType, id, filters, pageInfo) {
|
|
437
|
+
let { orderBy, orderDir, pageSize, pageIndex } = pageInfo;
|
|
438
|
+
let sql = `select * from ${entity.IDM_USERS} a where USER_ID in (select USER_ID from ${memberType[0]} where ${memberType[1]}=? and STATUS in ('00', 'normal')) and USER_STATUS='normal'`;
|
|
439
|
+
let sqlParams = [id];
|
|
440
|
+
delete filters['cat'];
|
|
441
|
+
delete filters['type'];
|
|
442
|
+
delete filters['parentId'];
|
|
443
|
+
let spSqlOps = {};
|
|
444
|
+
if (filters['USER_NAME']) {
|
|
445
|
+
spSqlOps['USER_NAME'] = 'like';
|
|
446
|
+
} else if (filters['MOBILE']) {
|
|
447
|
+
spSqlOps['MOBILE'] = 'like';
|
|
448
|
+
} else if (filters['EMAIL']) {
|
|
449
|
+
spSqlOps['EMAIL'] = 'like';
|
|
450
|
+
}
|
|
451
|
+
if (Object.keys(filters).length > 0) {
|
|
452
|
+
let queryParam = queryParamsBuilder(filters, 'a', {}, spSqlOps);
|
|
453
|
+
sql = sql + ' and ' + queryParam.sql;
|
|
454
|
+
sqlParams = sqlParams.concat(queryParam.params);
|
|
455
|
+
}
|
|
456
|
+
if (orderBy) {
|
|
457
|
+
sql += ` order by ${orderBy} ${orderDir.toLocaleUpperCase()}`;
|
|
458
|
+
} else {
|
|
459
|
+
sql += ' order by DATA_CRT_TIME DESC';
|
|
460
|
+
}
|
|
461
|
+
let dbResult = await pageQuery(sql, sqlParams, pageSize, pageIndex);
|
|
462
|
+
if (dbResult.error) {
|
|
463
|
+
logger.error(dbResult.error);
|
|
464
|
+
return null;
|
|
465
|
+
}
|
|
466
|
+
return dbResult;
|
|
467
|
+
},
|
|
468
|
+
|
|
469
|
+
/**
|
|
470
|
+
* 批量删除团队成员
|
|
471
|
+
* @param USER_ID 人员id
|
|
472
|
+
* @param GROUP_ID 组id
|
|
473
|
+
*/
|
|
474
|
+
async batchDelMember(USER_ID, GROUP_ID) {
|
|
475
|
+
const { sql, params } = await deleteSqlBuilder(entity.IDM_GROUP_MEMBERS, {
|
|
476
|
+
USER_ID,
|
|
477
|
+
ORG_ID: global.orgid,
|
|
478
|
+
GROUP_ID,
|
|
479
|
+
});
|
|
480
|
+
let result = await sqlExecutor(sql, params);
|
|
481
|
+
if (result.error) {
|
|
482
|
+
return null;
|
|
483
|
+
}
|
|
484
|
+
return true;
|
|
485
|
+
},
|
|
486
|
+
|
|
487
|
+
/**
|
|
488
|
+
* 删除用户
|
|
489
|
+
* */
|
|
490
|
+
async delUserMember(filter) {
|
|
491
|
+
let filters = filter || {};
|
|
492
|
+
filters.ORG_ID = global.orgid;
|
|
493
|
+
const { sql, params } = await updateSqlBuilder(
|
|
494
|
+
entity.IDM_USERS,
|
|
495
|
+
{
|
|
496
|
+
STATUS: '01',
|
|
497
|
+
},
|
|
498
|
+
filters,
|
|
499
|
+
);
|
|
500
|
+
let result = await sqlExecutor(sql, params);
|
|
501
|
+
if (result.error) return null;
|
|
502
|
+
return true;
|
|
503
|
+
},
|
|
504
|
+
|
|
505
|
+
/**
|
|
506
|
+
* 查询三方认证用户
|
|
507
|
+
* */
|
|
508
|
+
async getIdmUserOauth() {
|
|
509
|
+
let sql = `SELECT USER_ID,VENDOR_USER_ID FROM ${entity.IDM_USER_OAUTH} WHERE ORG_ID =?`;
|
|
510
|
+
const result = await sqlExecutor(sql, [global.orgid]);
|
|
511
|
+
if (result.error || result.results.length == 0) return null;
|
|
512
|
+
return result.results;
|
|
513
|
+
},
|
|
514
|
+
|
|
515
|
+
/***
|
|
516
|
+
* 更新用户状态
|
|
517
|
+
* */
|
|
518
|
+
async updateUser(userlist) {
|
|
519
|
+
let userGroup = '';
|
|
520
|
+
if (userlist.length == 0) return;
|
|
521
|
+
userlist.map((v, i) => {
|
|
522
|
+
if (i == userlist.length - 1) {
|
|
523
|
+
userGroup += '"' + v + '"';
|
|
524
|
+
} else {
|
|
525
|
+
userGroup += '"' + v + '"' + ',';
|
|
526
|
+
}
|
|
527
|
+
});
|
|
528
|
+
let sql = `UPDATE ${entity.IDM_USERS} SET USER_STATUS = 'leave' WHERE USER_ID in (${userGroup}) and ORG_ID = '${global.orgid}'`;
|
|
529
|
+
const result = await sqlExecutor(sql);
|
|
530
|
+
if (result.error) return null;
|
|
531
|
+
return result.results;
|
|
532
|
+
},
|
|
533
|
+
|
|
534
|
+
/**
|
|
535
|
+
* 新增用户密保
|
|
536
|
+
* @param {*} props
|
|
537
|
+
*/
|
|
538
|
+
async addUserSecurity(props) {
|
|
539
|
+
let newProps = await checkTableFilterFields(props, entity.IDM_USER_SECURITY_PROBLEM);
|
|
540
|
+
if (!newProps || !Object.keys(newProps)) return [true, null];
|
|
541
|
+
const SECUR_ID = uuidv4();
|
|
542
|
+
let data = {
|
|
543
|
+
...newProps,
|
|
544
|
+
ORG_ID: global.orgid,
|
|
545
|
+
SECUR_ID,
|
|
546
|
+
STATUS: '00',
|
|
547
|
+
};
|
|
548
|
+
let { sql, params } = insertSqlBuilder(entity.IDM_USER_SECURITY_PROBLEM, data);
|
|
549
|
+
let { error } = await sqlExecutor(sql, params);
|
|
550
|
+
if (error) {
|
|
551
|
+
logger.error('新增密保失败:', error);
|
|
552
|
+
}
|
|
553
|
+
return [error, SECUR_ID];
|
|
554
|
+
},
|
|
555
|
+
|
|
556
|
+
/**
|
|
557
|
+
* 修改用户密保
|
|
558
|
+
* @param {*} filter
|
|
559
|
+
* @param {*} props
|
|
560
|
+
*/
|
|
561
|
+
async updateUserSecurity(filter, props) {
|
|
562
|
+
let where = await checkTableFilterFields(filter, entity.IDM_USER_SECURITY_PROBLEM);
|
|
563
|
+
if (!where || !Object.keys(where).length) {
|
|
564
|
+
return [true, null];
|
|
565
|
+
}
|
|
566
|
+
let newProps = await checkTableFilterFields(props, entity.IDM_USER_SECURITY_PROBLEM);
|
|
567
|
+
if (!newProps || !Object.keys(newProps)) return [true, null];
|
|
568
|
+
let { sql, params } = updateSqlBuilder(entity.IDM_USER_SECURITY_PROBLEM, newProps, where);
|
|
569
|
+
let { error } = await sqlExecutor(sql, params);
|
|
570
|
+
if (error) {
|
|
571
|
+
logger.error('修改密保失败:', error);
|
|
572
|
+
}
|
|
573
|
+
return [error, true];
|
|
574
|
+
},
|
|
575
|
+
|
|
576
|
+
/**
|
|
577
|
+
* 查询用户密保
|
|
578
|
+
* @param {*} filter
|
|
579
|
+
*/
|
|
580
|
+
async getUserSecurity(filter) {
|
|
581
|
+
let where = await checkTableFilterFields(filter, entity.IDM_USER_SECURITY_PROBLEM);
|
|
582
|
+
let sql = `select * from ${entity.IDM_USER_SECURITY_PROBLEM} where ORG_ID=?`;
|
|
583
|
+
let params = [global.orgid];
|
|
584
|
+
|
|
585
|
+
if (where && Object.keys(where).length) {
|
|
586
|
+
let sqlResult = queryParamsBuilder(where);
|
|
587
|
+
sql = sql + ' and ' + sqlResult.sql;
|
|
588
|
+
params = params.concat(sqlResult.params);
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
let { error, results } = await sqlExecutor(sql, params);
|
|
592
|
+
if (error) {
|
|
593
|
+
logger.error('查询密保失败:', error);
|
|
594
|
+
}
|
|
595
|
+
return [error, results];
|
|
596
|
+
},
|
|
597
|
+
|
|
598
|
+
async getUserHistory(filter, limit) {
|
|
599
|
+
let sql = `select * from ${entity.IDM_HISTORY_LOG} where ORG_ID=? and STATUS='00'`;
|
|
600
|
+
let params = [global.orgid];
|
|
601
|
+
|
|
602
|
+
let where = await checkTableFilterFields(filter, entity.IDM_HISTORY_LOG);
|
|
603
|
+
if (where && Object.keys(where).length) {
|
|
604
|
+
let sqlResult = queryParamsBuilder(where);
|
|
605
|
+
sql = sql + ' and ' + sqlResult.sql;
|
|
606
|
+
params = params.concat(sqlResult.params);
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
sql += ' order by LOG_LAST_USAGE desc';
|
|
610
|
+
|
|
611
|
+
if (limit && Number(limit)) {
|
|
612
|
+
sql += ` limit ${Number(limit)}`;
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
let { error, results } = await sqlExecutor(sql, params);
|
|
616
|
+
if (error) {
|
|
617
|
+
logger.error('查询历史记录失败:', error);
|
|
618
|
+
}
|
|
619
|
+
return [error, results];
|
|
620
|
+
},
|
|
621
|
+
|
|
622
|
+
async createUserHistory(props, userid) {
|
|
623
|
+
let newProps = await checkTableFilterFields(props, entity.IDM_HISTORY_LOG);
|
|
624
|
+
if (!newProps || !Object.keys(newProps)) return [true, null];
|
|
625
|
+
const LOG_ID = uuidv4();
|
|
626
|
+
let data = {
|
|
627
|
+
ORG_ID: global.orgid,
|
|
628
|
+
LOG_ID,
|
|
629
|
+
USER_ID: userid,
|
|
630
|
+
STATUS: '00',
|
|
631
|
+
LOG_TIME: dayjs().format('YYYYMMDDHHmmss'),
|
|
632
|
+
LOG_LAST_USAGE: dayjs().format('YYYYMMDDHHmmss'),
|
|
633
|
+
LOG_STATUS: '1',
|
|
634
|
+
...newProps,
|
|
635
|
+
};
|
|
636
|
+
let { sql, params } = insertSqlBuilder(entity.IDM_HISTORY_LOG, data);
|
|
637
|
+
let { error } = await sqlExecutor(sql, params);
|
|
638
|
+
if (error) {
|
|
639
|
+
logger.error('创建历史记录失败:', error);
|
|
640
|
+
}
|
|
641
|
+
return [error, LOG_ID];
|
|
642
|
+
},
|
|
643
|
+
|
|
644
|
+
async updateUserHistory(filter, props) {
|
|
645
|
+
let where = await checkTableFilterFields(filter, entity.IDM_HISTORY_LOG);
|
|
646
|
+
if (!where || !Object.keys(where).length) {
|
|
647
|
+
return [true, null];
|
|
648
|
+
}
|
|
649
|
+
let newProps = await checkTableFilterFields(props, entity.IDM_HISTORY_LOG);
|
|
650
|
+
if (!newProps || !Object.keys(newProps)) return [true, null];
|
|
651
|
+
let { sql, params } = updateSqlBuilder(entity.IDM_HISTORY_LOG, newProps, where);
|
|
652
|
+
let { error } = await sqlExecutor(sql, params);
|
|
653
|
+
if (error) {
|
|
654
|
+
logger.error('修改历史记录失败:', error);
|
|
655
|
+
}
|
|
656
|
+
return [error, true];
|
|
657
|
+
},
|
|
658
|
+
|
|
659
|
+
async deleteUserHistory(filter) {
|
|
660
|
+
let where = await checkTableFilterFields(filter, entity.IDM_HISTORY_LOG);
|
|
661
|
+
if (!where || !Object.keys(where).length) {
|
|
662
|
+
return [true, null];
|
|
663
|
+
}
|
|
664
|
+
let { sql, params } = updateSqlBuilder(entity.IDM_HISTORY_LOG, { STATUS: '01' }, where);
|
|
665
|
+
let { error } = await sqlExecutor(sql, params);
|
|
666
|
+
if (error) {
|
|
667
|
+
logger.error('删除历史记录失败:', error);
|
|
668
|
+
}
|
|
669
|
+
return [error, true];
|
|
670
|
+
},
|
|
671
|
+
};
|
|
672
|
+
|
|
673
|
+
module.exports = userService;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const config = require('../config/index');
|
|
2
|
+
|
|
3
|
+
class Socket {
|
|
4
|
+
scokets = config.scoket.files;
|
|
5
|
+
constructor(io) {
|
|
6
|
+
this.io = io;
|
|
7
|
+
this.dispenseNamespace();
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
dispenseNamespace() {
|
|
11
|
+
this.scokets.forEach((s) => {
|
|
12
|
+
const io = this.io.of(s.path);
|
|
13
|
+
new s.Class(io);
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
module.exports = Socket;
|