sysUserService.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. 'use strict';
  2. const uuid = require('uuid/v1');
  3. const md5 = require('md5');
  4. const Service = require('../service/baseService');
  5. const mongoose = require("mongoose");
  6. class SysUserService extends Service {
  7. tag() {
  8. return this.ctx.model.SysUserModel;
  9. }
  10. async login(data) {
  11. const { model } = this.ctx;
  12. const pop = this.ctx.getUserPop();
  13. const result = await model.SysUserModel
  14. .find({ loginName: data.loginName, loginPwd: data.loginPwd })
  15. .populate(pop);
  16. if (result.length === 1) {
  17. const newUser = JSON.parse(JSON.stringify(result[0]));
  18. newUser.sessionId = uuid()
  19. .replace(/-/g, '');
  20. delete newUser.loginPwd;
  21. await this.app.redis.set(newUser.sessionId, JSON.stringify(newUser), 'EX',
  22. this.ctx.app.config.sessionTimeOut);
  23. return newUser.sessionId;
  24. }
  25. return null;
  26. }
  27. async updatePwdWithOpenId(query) {
  28. const { ctx, service } = this;
  29. const { oldPwd, pwd } = query;
  30. const users = await service.sysUserService.list({ openId: ctx.openId, loginPwd: md5(oldPwd) });
  31. if (users.length === 1) {
  32. return await service.sysUserService.update(users[0]._id, { loginPwd: md5(pwd) });
  33. }
  34. return null;
  35. }
  36. async bing(query) {
  37. const { service, ctx } = this;
  38. const { name, pwd, openId } = query;
  39. const user = ctx.user;
  40. const result = await service.sysUserService.oneData({ loginName: name, loginPwd: pwd });
  41. if (result) {
  42. if ('' + result.role._id === this.app.config.defaultUserRoleId) { // 采集员
  43. if (user && user.loginName === name) {
  44. console.log('user.loginName === name' + name);
  45. return null;
  46. }
  47. if (!result.openId || result.openId === '') {
  48. if (result.file && result.file !== '') {
  49. if (result.userName && result.sex
  50. && result.company && result.job
  51. && result.politicalOutlook && result.phone) {
  52. const res = await service.sysUserService.update(result._id, { openId: ctx.get('openId') });
  53. // const res = await service.sysUserService.update(result._id, { openId });
  54. console.log('result._id=======' + result._id);
  55. console.log('openId===========' + ctx.get('openId'));
  56. console.log('updateRes========' + JSON.stringify(res));
  57. return null;
  58. }
  59. return '请管理员到后台完善资料方可登录!';
  60. }
  61. return '请管理员到后台上传认证文件方可登录!';
  62. }
  63. return '该账号已被其他用户绑定!';
  64. }
  65. return '请使用采集员账号!';
  66. }
  67. return '用户名或者密码错误,请联系管理员!';
  68. }
  69. async deleteWithSub(data) {
  70. const { ctx, service } = this;
  71. const { model } = ctx;
  72. const infoList = await service.infoService.list({ userid: data.id });
  73. if (infoList.length > 0) {
  74. return ' 账号下已有采集数据,禁止删除 ';
  75. }
  76. const visitList = await service.visitService.list({ userid: data.id });
  77. if (visitList.length > 0) {
  78. return ' 账号下已有探访数据,禁止删除 ';
  79. }
  80. const user = await this.one(data.id, ctx.getUserPop());
  81. if (user.role._id == this.app.config.defaultAdminRoleId) {
  82. return '没有权限,不能删除';
  83. }
  84. if (data.userId == data.id) {
  85. return '不能删除自己';
  86. }
  87. await model.SysUserModel.deleteOne({ _id: data.id });
  88. return null;
  89. }
  90. async batchAdd(data) {
  91. const { model } = this.ctx;
  92. // 通过传来的 deptId 获取当前code
  93. const dept = await model.SysDeptModel.find({ _id: data.deptId });
  94. const code = dept[0].code;
  95. const level = dept[0].level;
  96. // dept1 - 5 前端传入 type 前端传入 admin 是管理员 user 是采集员
  97. if (data.type == 'admin') {
  98. delete data.type;
  99. // 生成管理员
  100. const users = await model.SysUserModel.find({
  101. loginName: code,
  102. role: this.app.config.defaultManagerRoleId, dept: data.deptId,
  103. });
  104. if (users.length > 0) {
  105. return { code: 1, data: {}, message: '当前地区已存在管理员' };
  106. }
  107. data.dept = data.deptId;
  108. data.role = this.app.config.defaultManagerRoleId;
  109. data.loginName = code;
  110. data.loginPwd = md5(this.app.config.defaultPassword);
  111. await model.SysUserModel.create(data);
  112. // 生成地区自主上报员
  113. if (level === '5') {
  114. const ownerCode = code + '000';
  115. const ownerUser = await model.SysUserModel.find({
  116. loginName: ownerCode,
  117. role: this.app.config.defaultOwnerManagerRoleId, dept: data.deptId,
  118. });
  119. if (ownerUser.length === 0) {
  120. data.role = this.app.config.defaultOwnerManagerRoleId;
  121. data.loginName = ownerCode;
  122. data.loginPwd = md5(this.app.config.defaultPassword);
  123. await model.SysUserModel.create(data);
  124. }
  125. }
  126. return { code: 0, data: {}, message: code };
  127. } else if (data.type == 'user' && data.deptId == data.dept5) {
  128. delete data.type;
  129. let str = '';
  130. const userCodes = [];
  131. let userNum = data.userNum || 1;
  132. userNum = parseInt(userNum) > 20 ? '20' : userNum;
  133. for (let i = 0; i < userNum; i++) {
  134. const users = await model.SysUserModel.find({
  135. role: this.app.config.defaultUserRoleId, dept: data.deptId,
  136. })
  137. .sort({ loginName: 1 });
  138. if (users.length > 0) {
  139. // 如果存在 就取最后一个
  140. let number = users[users.length - 1].loginName.replace(code, '');
  141. number = parseInt(number);
  142. number++;
  143. let num = '' + number;
  144. while (num.length < 3) {
  145. num = '0' + num;
  146. }
  147. data.dept = data.deptId;
  148. data.role = this.app.config.defaultUserRoleId;
  149. data.loginName = code + num;
  150. data.loginPwd = md5(this.app.config.defaultPassword);
  151. await model.SysUserModel.create(data);
  152. userCodes.push(code + num);
  153. } else {
  154. data.dept = data.deptId;
  155. data.role = this.app.config.defaultUserRoleId;
  156. data.loginName = code + '001';
  157. data.loginPwd = md5(this.app.config.defaultPassword);
  158. await model.SysUserModel.create(data);
  159. userCodes.push(code + '001');
  160. }
  161. }
  162. str += userCodes.join(',');
  163. // 生成采集员
  164. return { code: 0, data: {}, message: str };
  165. }
  166. return { code: 1, data: {}, message: '参数错误' };
  167. }
  168. // async valueByUser(data) {
  169. // const { ctx } = this;
  170. // const { model } = ctx;
  171. //
  172. // const result = await this.listForPage(data, ctx.getUserPop());
  173. // // const result = await this.listForPage(data);
  174. // const newResult = [];
  175. // for (const item of result.list) {
  176. // const valueInfoCount = await model.ValueModel.find({ userid: item._id, type: '0' })
  177. // .countDocuments();
  178. // const valueVisitCount = await model.ValueModel.find({ userid: item._id, type: '1' })
  179. // .countDocuments();
  180. // newResult.push({ _id: item._id,
  181. // loginName: item.loginName,
  182. // userName: item.userName,
  183. // dept: item.dept1.name + item.dept2.name + item.dept3.name + item.dept4.name + item.dept5.name,
  184. // valueInfoCount, valueVisitCount });
  185. // }
  186. //
  187. // return { list: newResult, count: result.count };
  188. // }
  189. // 积分数据列表查询---倒序显示
  190. async valueByUser(data) {
  191. const { ctx } = this;
  192. const { model } = ctx;
  193. // const page = parseInt(data.page);
  194. // const rows = parseInt(data.rows);
  195. const page = data.page || 1;
  196. const rows = Number.parseInt(data.rows) || this.app.config.defaultPageSize;
  197. const where = {};
  198. if (data.dept1) {
  199. where.dept1 = this.app.mongoose.Types.ObjectId(data.dept1);// 省
  200. }
  201. if (data.dept2) {
  202. where.dept2 = this.app.mongoose.Types.ObjectId(data.dept2); // 市
  203. }
  204. if (data.dept3) {
  205. where.dept3 = this.app.mongoose.Types.ObjectId(data.dept3); // 区
  206. }
  207. if (data.dept4) {
  208. where.dept4 = this.app.mongoose.Types.ObjectId(data.dept4); // 乡
  209. }
  210. if (data.dept5) {
  211. where.dept5 = this.app.mongoose.Types.ObjectId(data.dept5); // 社区
  212. }
  213. if (data.queryName) {
  214. const oneUser = await model.SysUserModel.find({ loginName: data.queryName });
  215. if (oneUser.length > 0) {
  216. where.userid = oneUser[0]._id;
  217. }
  218. }
  219. if (data.userName) {
  220. const oneUser = await model.SysUserModel.find({ userName: data.userName });
  221. if (oneUser.length > 0) {
  222. where.userid = oneUser[0]._id;
  223. }
  224. }
  225. const restltList = await this.ctx.model.ValueModel.aggregate([
  226. {
  227. $match: where,
  228. },
  229. { $group:
  230. {
  231. _id: '$userid',
  232. dept1: { $first: '$dept1' },
  233. dept2: { $first: '$dept2' },
  234. dept3: { $first: '$dept3' },
  235. dept4: { $first: '$dept4' },
  236. dept5: { $first: '$dept5' },
  237. type0: { $sum: {
  238. $cond: [{ $eq: [ '$type', '0' ] }, 1, 0 ], // 采集审核通过数
  239. } },
  240. type1: { $sum: {
  241. $cond: [{ $eq: [ '$type', '1' ] }, 1, 0 ], // 探访数
  242. } },
  243. },
  244. },
  245. { $project: {
  246. _id: 1,
  247. dept1: 1,
  248. dept2: 1,
  249. dept3: 1,
  250. dept4: 1,
  251. dept5: 1,
  252. type0: 1,
  253. type1: 1,
  254. totalValue: { $add: [{ $multiply: [ '$type0', 5 ] }, { $multiply: [ '$type1', 1 ] }] },
  255. } },
  256. { $sort: { totalValue: -1 } },
  257. {
  258. $skip: rows * (parseInt(page) - 1),
  259. },
  260. {
  261. $limit: rows,
  262. },
  263. { $lookup: { from: 'sys_user', localField: '_id', foreignField: '_id', as: 'user' } },
  264. { $unwind: { path: '$user', preserveNullAndEmptyArrays: true } },
  265. { $lookup: { from: 'sys_dept', localField: 'dept1', foreignField: '_id', as: 'dept1' } },
  266. { $unwind: { path: '$dept1', preserveNullAndEmptyArrays: true } },
  267. { $lookup: { from: 'sys_dept', localField: 'dept2', foreignField: '_id', as: 'dept2' } },
  268. { $unwind: { path: '$dept2', preserveNullAndEmptyArrays: true } },
  269. { $lookup: { from: 'sys_dept', localField: 'dept3', foreignField: '_id', as: 'dept3' } },
  270. { $unwind: { path: '$dept3', preserveNullAndEmptyArrays: true } },
  271. { $lookup: { from: 'sys_dept', localField: 'dept4', foreignField: '_id', as: 'dept4' } },
  272. { $unwind: { path: '$dept4', preserveNullAndEmptyArrays: true } },
  273. { $lookup: { from: 'sys_dept', localField: 'dept5', foreignField: '_id', as: 'dept5' } },
  274. { $unwind: { path: '$dept5', preserveNullAndEmptyArrays: true } },
  275. { $project: {
  276. _id: 1,
  277. loginName: '$user.loginName',
  278. userName: '$user.userName',
  279. valueInfoCount: '$type0',
  280. valueVisitCount: '$type1',
  281. totalValue: '$totalValue',
  282. dept: { $concat: [ '$dept1.name', '$dept2.name', '$dept3.name', '$dept4.name', '$dept5.name' ] },
  283. } },
  284. ]).allowDiskUse(true);// 允许使用磁盘缓存
  285. const countList = await this.ctx.model.ValueModel.aggregate([
  286. {
  287. $match: where,
  288. },
  289. { $group:
  290. {
  291. _id: '$userid',
  292. },
  293. },
  294. ]).allowDiskUse(true);// 允许使用磁盘缓存
  295. return { list: restltList, count: countList.length };
  296. }
  297. async valueByUserOne() {
  298. const { ctx } = this;
  299. const { model } = ctx;
  300. const user = ctx.user;
  301. const valueInfoCount = await model.ValueModel.find({ userid: user._id, type: '0' })
  302. .countDocuments();
  303. const valueVisitCount = await model.ValueModel.find({ userid: user._id, type: '1' })
  304. .countDocuments();
  305. return { _id: user._id, loginName: user.loginName, valueInfoCount, valueVisitCount };
  306. }
  307. // 个人积分排名
  308. async sumUserOne() {
  309. const { ctx } = this;
  310. const { model } = ctx;
  311. const user = ctx.user;
  312. // const infoCount = await model.InfoModel.aggregate([
  313. // { $match: { dept1: user.dept1._id, userid: user._id, status: '3' } },
  314. // { $group: { _id: '$_id', count: { $sum: 1 } } },
  315. // { $count: 'count' },
  316. // ]).allowDiskUse(true);
  317. const totalCount = await model.VisitModel.find({ userid: user._id }).countDocuments();
  318. const visitCount = await model.VisitModel.aggregate([
  319. { $match: { dept1: user.dept1._id, userid: user._id } },
  320. { $group: { _id: '$infoId', count: { $sum: 1 } } },
  321. { $count: 'count' },
  322. ]).allowDiskUse(true);
  323. const visitOrder = await model.VisitModel.aggregate([
  324. { $match: { dept1: user.dept1._id } },
  325. { $group: { _id: '$userid', count: { $sum: 1 } } }, // 地区下所有采集员的探访次数
  326. { $group: { _id: '$count', rank: { $sum: 1 } } }, // 探访次数 统计
  327. { $match: { _id: { $gt: totalCount } } }, // 排名
  328. { $group: { _id: null, count: { $sum: '$rank' } } },
  329. { $project: { _id: 0, count: 1 } },
  330. ]).allowDiskUse(true);
  331. if (visitOrder.length == 0) {
  332. const arr = { count: 0 };
  333. visitOrder.push(arr);
  334. }
  335. return { _id: user._id, loginName: user.loginName, userName: user.userName, totalCount, visitCount, visitOrder };
  336. }
  337. // getUserCond(data, page, rows, sort) {
  338. // const cond = [];
  339. //
  340. // cond.push({ $match: data });
  341. // console.log('提交件', data);
  342. //
  343. // if (sort) {
  344. // cond.push({ $sort: sort });
  345. // }
  346. // cond.push({ $skip: (page - 1) * rows });
  347. // cond.push({ $limit: rows });
  348. // cond.push({
  349. // $lookup:
  350. // {
  351. // from: 'value',
  352. // localField: '_id',
  353. // foreignField: 'userid',
  354. // as: 'values',
  355. // },
  356. // });
  357. // cond.push({ $unwind: { path: '$values', preserveNullAndEmptyArrays: true } });
  358. // cond.push({ $group:
  359. // {
  360. // _id: { id: '$_id', type: '$values.type' },
  361. // loginName: { $first: '$loginName' },
  362. // counter: { $sum: {
  363. // $cond: [ '$values', 1, 0 ],
  364. // } },
  365. // },
  366. // });
  367. // cond.push({
  368. // $group:
  369. // {
  370. // _id: { id: '$_id.id' },
  371. // loginName: { $first: '$loginName' },
  372. // number: { $push: { counter: '$counter', type: '$_id.type' } },
  373. // },
  374. // });
  375. // cond.push({
  376. // $project: {
  377. // _id: '$_id.id',
  378. // loginName: 1,
  379. // number: 1,
  380. // },
  381. // });
  382. // return cond;
  383. //
  384. // }
  385. async findAdminUser(){
  386. return await this.ctx.model.SysUserModel.findOne({ loginName: 'admin' });
  387. }
  388. async findUser(deptName, level,userName, parentName){
  389. const { ctx } = this;
  390. const { model } = ctx;
  391. ctx.logger.error("level",deptName,level,parentName)
  392. if (level >3){
  393. const res = await model.SysUserModel.aggregate([
  394. { $lookup: { from: 'sys_dept', localField: 'dept', foreignField: '_id', as: 'deptName' } },
  395. { $lookup: { from: 'sys_dept', localField: `dept${level-1}`, foreignField: '_id', as: `dept${level-1}Name` } },
  396. { $unwind: { path:'$deptName' , preserveNullAndEmptyArrays: true }},
  397. { $unwind: { path:'$dept'+(level-1)+'Name' , preserveNullAndEmptyArrays: true }},
  398. {$match:{
  399. 'deptName.name':deptName,
  400. ['dept'+(level-1)+'Name.name']:parentName,
  401. role:this.app.mongoose.Types.ObjectId(this.app.config.defaultManagerRoleId),
  402. }},
  403. ]).allowDiskUse(true);
  404. if (res.length > 0){
  405. let filters = res.filter(item => item.loginName == userName || userName.indexOf(item.loginName) == 0 );
  406. if (filters.length > 0){
  407. return filters[0];
  408. } else{
  409. return res[0];
  410. }
  411. }
  412. }else{
  413. const res = await model.SysUserModel.aggregate([
  414. { $lookup: { from: 'sys_dept', localField: 'dept', foreignField: '_id', as: 'deptName' } },
  415. { $unwind: { path:'$deptName' , preserveNullAndEmptyArrays: true }},
  416. {$match:{
  417. 'deptName.name':deptName,
  418. loginName:{$ne:'admin'},
  419. role:this.app.mongoose.Types.ObjectId(this.app.config.defaultManagerRoleId),
  420. }},
  421. ]).allowDiskUse(true);
  422. if (res.length > 0){
  423. let filters = res.filter(item => item.loginName == userName || userName.indexOf(item.loginName) == 0 );
  424. if (filters.length > 0){
  425. return filters[0];
  426. }else{
  427. return res[0];
  428. }
  429. }
  430. }
  431. return null;
  432. }
  433. }
  434. module.exports = SysUserService;