123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- import { Body, Controller, Get, Inject, Param, Post, Query } from '@midwayjs/core';
- import { ApiQuery, ApiTags } from '@midwayjs/swagger';
- import { ContactApplyService } from '../../service/users/contactApply.service';
- import { get, isArray, omit, pick } from 'lodash';
- import { Validate } from '@midwayjs/validate';
- import { ServiceError, ErrorCode } from '../../error/service.error';
- import { MessageService } from '../../service/system/message.service';
- import { Context } from '@midwayjs/koa';
- import { ESService } from '../../service/elasticsearch/es.service';
- const namePrefix = '联系方式';
- @ApiTags(['联系方式'])
- @Controller('/contactApply', { tagName: namePrefix })
- export class ContactApplyController {
- @Inject()
- ctx: Context;
- @Inject()
- service: ContactApplyService;
- @Inject()
- msgService: MessageService;
- @Inject()
- esService: ESService;
- /**
- * 根据申请信息,找到联系人进行填充
- * @param id 申请id
- */
- @Get('/contacts/:id')
- async getContacts(@Param('id') id: number) {
- const data = await await this.service.fetch({ id });
- if (!data) throw new ServiceError(ErrorCode.DATA_NOT_FOUND); // 抛出异常,未找到要审核的数据
- const source = get(data, 'source');
- const source_id = get(data, 'source_id');
- const otherData = await this.service.searchCompleteData(source, source_id);
- const contacts = await this.service.getContactObject(otherData, source);
- return contacts;
- }
- @Post('/examine', { routerName: `审核${namePrefix}` })
- @ApiTags('信息审核')
- @ApiQuery({ name: 'examine' })
- async examine(@Body('id') id: number, @Body('status') status: string, @Body('contacts') inputContacts: object) {
- if (!id || !status) throw new ServiceError(ErrorCode.BODY_ERROR);
- const originData = await this.service.fetch({ id });
- if (!originData) throw new ServiceError(ErrorCode.DATA_NOT_FOUND); // 抛出异常,未找到要审核的数据
- const user = get(this.ctx, 'user');
- const exam_admin = get(user, 'id');
- if (!exam_admin) throw new ServiceError(ErrorCode.ADMIN_NOT_LOGIN); // 抛出异常,无管理员
- // 需要查询当前管理员所在部门是否有审核的能力,再查询可见的数据
- const source = await this.service.checkUserSourceRange();
- const hasPermission = source.find(f => f === get(originData, 'source'));
- if (!hasPermission) throw new ServiceError(ErrorCode.CONTACTAPPLY_ADMIN_NO_PERMISSION); // 抛出异常,当前管理人员无审核该数据的权限
- const result = await this.service.update({ id }, { status, exam_admin });
- if (status === '1') {
- try {
- // 审核成功的发送通知, 生成message,然后发送消息
- const messageData = await this.service.successMessage(id, inputContacts);
- /**创建消息数据 */
- const messageResult = await this.msgService.create(messageData);
- const msgId = get(messageResult, 'id');
- this.msgService.toSendMsg(msgId);
- } catch (error) {
- console.error('审核联系方式 消息创建失败');
- }
- }
- return result;
- }
- @Get('/')
- @ApiTags('列表查询')
- @ApiQuery({ name: 'query' })
- async index(@Query() query: object) {
- const qobj: any = omit(query, ['skip', 'limit']);
- const others = pick(query, ['skip', 'limit']);
- // 需要查询当前管理员所在部门是否有审核的能力,再查询可见的数据
- const source = await this.service.checkUserSourceRange();
- if (isArray(source) && source.length > 0) qobj.source = source;
- const { data, total } = await this.service.query(qobj, others, { source: this.service.Opera.In });
- const nd = await this.service.dealData(data);
- return { data: nd, total };
- }
- @Post('/', { routerName: `申请${namePrefix}` })
- @ApiTags('创建数据')
- @Validate()
- async create(@Body() data: object) {
- const skipCheckList = this.service.skipCheckList;
- /**
- * 根据keyword去查询 来源数据 与 当前用户 填写的数据 是否有达到4星匹配度的数据,没有直接拒绝
- * 因为词库很少,所以很简单就能达到.要是没达到,那就说是真的差太多了
- */
- const source = get(data, 'source');
- let source_id: any = get(data, 'source_id');
- if (source_id) source_id = parseInt(source_id);
- // 检查当前 来源数据是否是当前用户的.是当前用户的也不需要继续了,自己找自己么?
- const otherData = await this.service.searchCompleteData(source, source_id);
- const sourceData = get(otherData, 'sourceData');
- const source_user = get(sourceData, 'user');
- const user_id = get(this.ctx, 'user.id');
- if (user_id === source_user) throw new ServiceError(ErrorCode.CONTACTAPPLY_IS_THIS_USER_DATA); // 抛出异常: 来源数据是当前用户的数据
- /**组织数据,填充联系方式申请表:将被申请方的id填充 */
- const userData = get(otherData, 'userData');
- // 如果是在跳过检查列表中的申请,则不需要target_user.直接由管理员审核
- if (!skipCheckList.includes(source)) {
- if (!userData) throw new ServiceError(ErrorCode.CONTACTAPPLY_TARGET_USER_NOT_FOUND);
- const target_user = get(userData, 'id');
- data['target_user'] = target_user;
- }
- // 检查是否有未审核的申请
- await this.service.checkHasApply(data);
- // 判断是否是 跳过检查列表 中的数据,如果在跳过检查列表,则不需要计算匹配度,就是单纯要信息
- if (!skipCheckList.includes(source)) {
- // 需求,供给,项目,成果都是用name去查询匹配度
- const keyword = get(sourceData, 'name');
- // 没有keyword,无法计算匹配度,不用继续往下了.
- if (!keyword) throw new ServiceError(ErrorCode.CONTACTAPPLY_NO_KEYWORD); //抛出异常: 无关键词,无法进行匹配计算
- // 查询匹配度
- const result = await this.esService.getCS(keyword, source);
- if (!result) throw new ServiceError(ErrorCode.CONTACTAPPLY_MATCHING_NOT_ENOUGH); // 抛出异常,无匹配度到4星,无法进行预约
- }
- /**创建申请数据 */
- const dbData = await this.service.create(data);
- /**找到应该接收该消息的管理员:通过消息类型分配的部门,发送给部门下的所有管理员
- * 1.找到 管该类型数据的部门下的管理员id
- */
- const adminIds = await this.service.getSourceDept(source);
- // TODO: 需要确认,超级管理员是否需要处理这个问题,或者指定管理员兜底. 如果出现指定部门下没有人员的情况.没有兜底管理员则此数据不会有任何通知
- if (!adminIds) return; // 部门下无管理人员,请联系平台维护人员
- try {
- /**给这些管理员发送消息,通知他们去个人审核这个信息 */
- const messageData = await this.service.getAdminToExamData(data, adminIds);
- /**创建消息数据 */
- const messageResult = await this.msgService.create(messageData);
- const msgId = get(messageResult, 'id');
- this.msgService.toSendMsg(msgId);
- } catch (error) {
- console.error('申请联系方式 消息创建失败');
- }
- return dbData;
- }
- }
|