contactApply.controller.ts 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import { Body, Controller, Get, Inject, Param, Post, Query } from '@midwayjs/core';
  2. import { ApiQuery, ApiTags } from '@midwayjs/swagger';
  3. import { ContactApplyService } from '../../service/users/contactApply.service';
  4. import { get, isArray, omit, pick } from 'lodash';
  5. import { Validate } from '@midwayjs/validate';
  6. import { ServiceError, ErrorCode } from '../../error/service.error';
  7. import { MessageService } from '../../service/system/message.service';
  8. import { Context } from '@midwayjs/koa';
  9. import { ESService } from '../../service/elasticsearch/es.service';
  10. const namePrefix = '联系方式';
  11. @ApiTags(['联系方式'])
  12. @Controller('/contactApply', { tagName: namePrefix })
  13. export class ContactApplyController {
  14. @Inject()
  15. ctx: Context;
  16. @Inject()
  17. service: ContactApplyService;
  18. @Inject()
  19. msgService: MessageService;
  20. @Inject()
  21. esService: ESService;
  22. /**
  23. * 根据申请信息,找到联系人进行填充
  24. * @param id 申请id
  25. */
  26. @Get('/contacts/:id')
  27. async getContacts(@Param('id') id: number) {
  28. const data = await await this.service.fetch({ id });
  29. if (!data) throw new ServiceError(ErrorCode.DATA_NOT_FOUND); // 抛出异常,未找到要审核的数据
  30. const source = get(data, 'source');
  31. const source_id = get(data, 'source_id');
  32. const otherData = await this.service.searchCompleteData(source, source_id);
  33. const contacts = await this.service.getContactObject(otherData, source);
  34. return contacts;
  35. }
  36. @Post('/examine', { routerName: `审核${namePrefix}` })
  37. @ApiTags('信息审核')
  38. @ApiQuery({ name: 'examine' })
  39. async examine(@Body('id') id: number, @Body('status') status: string, @Body('contacts') inputContacts: object) {
  40. if (!id || !status) throw new ServiceError(ErrorCode.BODY_ERROR);
  41. const originData = await this.service.fetch({ id });
  42. if (!originData) throw new ServiceError(ErrorCode.DATA_NOT_FOUND); // 抛出异常,未找到要审核的数据
  43. const user = get(this.ctx, 'user');
  44. const exam_admin = get(user, 'id');
  45. if (!exam_admin) throw new ServiceError(ErrorCode.ADMIN_NOT_LOGIN); // 抛出异常,无管理员
  46. // 需要查询当前管理员所在部门是否有审核的能力,再查询可见的数据
  47. const source = await this.service.checkUserSourceRange();
  48. const hasPermission = source.find(f => f === get(originData, 'source'));
  49. if (!hasPermission) throw new ServiceError(ErrorCode.CONTACTAPPLY_ADMIN_NO_PERMISSION); // 抛出异常,当前管理人员无审核该数据的权限
  50. const result = await this.service.update({ id }, { status, exam_admin });
  51. if (status === '1') {
  52. try {
  53. // 审核成功的发送通知, 生成message,然后发送消息
  54. const messageData = await this.service.successMessage(id, inputContacts);
  55. /**创建消息数据 */
  56. const messageResult = await this.msgService.create(messageData);
  57. const msgId = get(messageResult, 'id');
  58. this.msgService.toSendMsg(msgId);
  59. } catch (error) {
  60. console.error('审核联系方式 消息创建失败');
  61. }
  62. }
  63. return result;
  64. }
  65. @Get('/')
  66. @ApiTags('列表查询')
  67. @ApiQuery({ name: 'query' })
  68. async index(@Query() query: object) {
  69. const qobj: any = omit(query, ['skip', 'limit']);
  70. const others = pick(query, ['skip', 'limit']);
  71. // 需要查询当前管理员所在部门是否有审核的能力,再查询可见的数据
  72. const source = await this.service.checkUserSourceRange();
  73. if (isArray(source) && source.length > 0) qobj.source = source;
  74. const { data, total } = await this.service.query(qobj, others, { source: this.service.Opera.In });
  75. const nd = await this.service.dealData(data);
  76. return { data: nd, total };
  77. }
  78. @Post('/', { routerName: `申请${namePrefix}` })
  79. @ApiTags('创建数据')
  80. @Validate()
  81. async create(@Body() data: object) {
  82. const skipCheckList = this.service.skipCheckList;
  83. /**
  84. * 根据keyword去查询 来源数据 与 当前用户 填写的数据 是否有达到4星匹配度的数据,没有直接拒绝
  85. * 因为词库很少,所以很简单就能达到.要是没达到,那就说是真的差太多了
  86. */
  87. const source = get(data, 'source');
  88. let source_id: any = get(data, 'source_id');
  89. if (source_id) source_id = parseInt(source_id);
  90. // 检查当前 来源数据是否是当前用户的.是当前用户的也不需要继续了,自己找自己么?
  91. const otherData = await this.service.searchCompleteData(source, source_id);
  92. const sourceData = get(otherData, 'sourceData');
  93. const source_user = get(sourceData, 'user');
  94. const user_id = get(this.ctx, 'user.id');
  95. if (user_id === source_user) throw new ServiceError(ErrorCode.CONTACTAPPLY_IS_THIS_USER_DATA); // 抛出异常: 来源数据是当前用户的数据
  96. /**组织数据,填充联系方式申请表:将被申请方的id填充 */
  97. const userData = get(otherData, 'userData');
  98. // 如果是在跳过检查列表中的申请,则不需要target_user.直接由管理员审核
  99. if (!skipCheckList.includes(source)) {
  100. if (!userData) throw new ServiceError(ErrorCode.CONTACTAPPLY_TARGET_USER_NOT_FOUND);
  101. const target_user = get(userData, 'id');
  102. data['target_user'] = target_user;
  103. }
  104. // 检查是否有未审核的申请
  105. await this.service.checkHasApply(data);
  106. // 判断是否是 跳过检查列表 中的数据,如果在跳过检查列表,则不需要计算匹配度,就是单纯要信息
  107. if (!skipCheckList.includes(source)) {
  108. // 需求,供给,项目,成果都是用name去查询匹配度
  109. const keyword = get(sourceData, 'name');
  110. // 没有keyword,无法计算匹配度,不用继续往下了.
  111. if (!keyword) throw new ServiceError(ErrorCode.CONTACTAPPLY_NO_KEYWORD); //抛出异常: 无关键词,无法进行匹配计算
  112. // 查询匹配度
  113. const result = await this.esService.getCS(keyword, source);
  114. if (!result) throw new ServiceError(ErrorCode.CONTACTAPPLY_MATCHING_NOT_ENOUGH); // 抛出异常,无匹配度到4星,无法进行预约
  115. }
  116. /**创建申请数据 */
  117. const dbData = await this.service.create(data);
  118. /**找到应该接收该消息的管理员:通过消息类型分配的部门,发送给部门下的所有管理员
  119. * 1.找到 管该类型数据的部门下的管理员id
  120. */
  121. const adminIds = await this.service.getSourceDept(source);
  122. // TODO: 需要确认,超级管理员是否需要处理这个问题,或者指定管理员兜底. 如果出现指定部门下没有人员的情况.没有兜底管理员则此数据不会有任何通知
  123. if (!adminIds) return; // 部门下无管理人员,请联系平台维护人员
  124. try {
  125. /**给这些管理员发送消息,通知他们去个人审核这个信息 */
  126. const messageData = await this.service.getAdminToExamData(data, adminIds);
  127. /**创建消息数据 */
  128. const messageResult = await this.msgService.create(messageData);
  129. const msgId = get(messageResult, 'id');
  130. this.msgService.toSendMsg(msgId);
  131. } catch (error) {
  132. console.error('申请联系方式 消息创建失败');
  133. }
  134. return dbData;
  135. }
  136. }