diff --git a/src/client/client.mapper.ts b/src/client/client.mapper.ts index baf5fca..4baf8bc 100644 --- a/src/client/client.mapper.ts +++ b/src/client/client.mapper.ts @@ -33,15 +33,11 @@ class ClientMapper { async queryHccChildNum({ areaCode }) { // const obj: any = {}; - if (areaCode) { - // obj.areaCode = Like(`${areaCode}%`); - // return UserNum.find({ - // where: { - // areaCode: Like(`${areaCode}%`), - // }, - // }); + // 省级筛选 + if (areaCode && areaCode.length == 2) { return UserNum.createQueryBuilder() .where(`areaCode like :areaCode`, { areaCode: `${areaCode}%` }) + .andWhere(`length(areaCode) = 4`) .select('areaCode') .addSelect('areaName') .addSelect('totalNum') @@ -49,7 +45,20 @@ class ClientMapper { .addSelect('totalUserNum') .orderBy('totalUserNum', 'DESC') .getRawMany(); - } else { + } else if (areaCode && areaCode.length == 4) { + // 市级筛选 + return UserNum.createQueryBuilder() + .where(`areaCode like :areaCode`, { areaCode: `${areaCode}%` }) + .andWhere(`length(areaCode) = 6`) + .select('areaCode') + .addSelect('areaName') + .addSelect('totalNum') + .addSelect('onlineNum') + .addSelect('totalUserNum') + .orderBy('totalUserNum', 'DESC') + .getRawMany(); + } + else { return UserNum.createQueryBuilder() .where(`length(areaCode) = 2`) .select('areaCode') @@ -80,29 +89,38 @@ class ClientMapper { } } - async queryMp({ areaCode, topLimit, startTime, endTime }) { + async queryMp({ areaCode, topLimit }) { + const sql = MpInfo.createQueryBuilder(); if (areaCode) { - const sql = MpInfo.createQueryBuilder(); sql.where(`areaCode like :areaCode`, { areaCode: `${areaCode}%` }); - if (startTime && endTime) { - sql.andWhere(`date between ${startTime} and ${endTime}`); + if (areaCode.length == 2) { + sql.andWhere(`length(areaCode) = 4`) + } else { + sql.andWhere(`length(areaCode) = 6`) } - return sql.select('id', 'id').groupBy('id').take(6).getRawMany(); + // if (startTime && endTime) { + // sql.andWhere(`date between ${startTime} and ${endTime}`); + // } } else { - const sql = MpInfo.createQueryBuilder(); - if (startTime && endTime) { - sql.where(`date between ${startTime} and ${endTime}`); - } - return sql - .andWhere(`length(areaCode) = 2`) - .select('id', 'id') - .groupBy('id') - .take(6) - .getRawMany(); + sql.where(`length(areaCode) = 2`); } + + // return sql + // return sql + // .andWhere(`length(areaCode) = 2`) + return sql + .andWhere(`length(areaCode) = 2`) + .select('id', 'id') + .addSelect('name', 'name') + .addSelect('icon', 'icon') + .addSelect('sum(num)', 'sum') + .groupBy('id') + .orderBy('sum') + .take(topLimit) + .getRawMany(); } - async queryMpInfo({ id }) { + async queryMpInfo({ id, startTime, endTime }) { const obj: any = {}; // if (id) { obj.id = id; @@ -111,12 +129,12 @@ class ClientMapper { // take: topLimit, // }); // 计算最近7天的起始时间 - const toData = new Date(new Date().toLocaleDateString()).getTime(); - const startTime = moment(new Date(toData - 7 * 3600 * 24 * 1000)).format( - 'YYYY-MM-DD', + // const toData = new Date(new Date().toLocaleDateString()).getTime(); + startTime = moment(startTime).format( + 'YYYY-MM-DD 00:00:00', ); - const endTime = moment(new Date(toData + 24 * 60 * 60 * 1000 - 1)).format( - 'YYYY-MM-DD', + endTime = moment(endTime).format( + 'YYYY-MM-DD 23:59:59', ); const sql = MpInfo.createQueryBuilder().where('id in (:...id)', { id, @@ -130,6 +148,7 @@ class ClientMapper { .addSelect('id') .addSelect('num') .addSelect('date') + .groupBy('date') .orderBy('date', 'DESC') .getRawMany(); // } else { @@ -262,16 +281,22 @@ class ClientMapper { }); } - async queryDataUseNum({ areaCode, startTime, endTime, limit, dateRange }) { + async queryDataUseNum({ areaCode, startTime, limit, dateRange }) { let sql; if (areaCode) { sql = HomeInfo.createQueryBuilder().where(`areaCode like '${areaCode}%'`); - // if (startTime && endTime) { - // sql.andWhere(`date between '${startTime}' and '${endTime}'`); - // } + if (areaCode.length == 2) { + sql.andWhere(`length(areaCode) = 4`) + } else { + sql.andWhere(`length(areaCode) = 6`) + } } else { sql = HomeInfo.createQueryBuilder().where(`length(areaCode) = 2`); } + + if (startTime) { + sql.andWhere(`date >= '${startTime}' `); + } switch (dateRange) { case 1: sql.select(`DATE_FORMAT(date,'%Y%m%d') time`); diff --git a/src/client/client.service.ts b/src/client/client.service.ts index cdb0b75..32d12cc 100644 --- a/src/client/client.service.ts +++ b/src/client/client.service.ts @@ -4,6 +4,7 @@ import clientMapper from './client.mapper'; import { UserNum } from 'src/entities/user-num.entity'; import axios from 'axios'; import { ConnectedSocket } from '@nestjs/websockets'; +import Time from '../utils/time' const moment = require('moment'); moment.locale('zh_CN'); @Injectable() @@ -97,41 +98,53 @@ export class ClientService { */ async queryMpNum({ areaCode, topLimit = 6, type = 0 }) { console.log('queryMpNum'); - const { startTime, endTime } = this.dealTime(type); + const { startTime, endTime } = Time.dealTime(type); const count = await clientMapper.queryMp({ areaCode, - topLimit, - startTime, - endTime, + topLimit }); + const obj: any = {}; + count.forEach(e => { + obj[e.id] = { + name: e.name, + icon: e.icon, + id: e.id, + liveNum: e.sum, + dayNumList: [], + } + }) const id = count.map((e) => e.id); - const info = await clientMapper.queryMpInfo({ id }); + const info = await clientMapper.queryMpInfo({ id, startTime, endTime }); // const [count, info] = await Promise.all([ // clientMapper.queryMpNum({ areaCode ,startTime, endTime}), // clientMapper.queryMpInfo({ areaCode, topLimit, startTime, endTime }), // ]); - const obj: any = {}; info.forEach((e) => { - if (!obj[e.id]) { - obj[e.id] = { - name: e.name, - icon: e.icon, - id: e.id, - liveNum: e.num, - dayNumList: [ - { - date: moment(e.date).format('YYYY-MM-DD'), - num: e.num, - }, - ], - }; - } else { - obj[e.id].liveNum += e.num; + if (obj[e.id]) { obj[e.id].dayNumList.push({ date: moment(e.date).format('YYYY-MM-DD'), num: e.num, }); } + // obj[e.id] = { + // name: e.name, + // icon: e.icon, + // id: e.id, + // liveNum: e.num, + // dayNumList: [ + // { + // date: moment(e.date).format('YYYY-MM-DD'), + // num: e.num, + // }, + // ], + // }; + // } else { + // obj[e.id].liveNum += e.num; + // obj[e.id].dayNumList.push({ + // date: moment(e.date).format('YYYY-MM-DD'), + // num: e.num, + // }); + // } }); const data = { totalNum: topLimit, @@ -143,110 +156,6 @@ export class ClientService { return data; } - dealTime(type) { - let startTime: Date, endTime: Date; - switch (type) { - case 0: - break; - case 1: - startTime = new Date(this.startTime(new Date())); - endTime = new Date(this.endTime(new Date())); - break; - case 2: - const data = this.getCurrentWeekStartTimeAndEndTime(); - startTime = data.startTime; - endTime = data.endTime; - break; - case 3: - startTime = new Date(this.getCurrentMonthFirst(new Date())); - endTime = new Date(this.getCurrentMonthLast(new Date())); - break; - case 4: - startTime = new Date(this.getCurrentYearFirst(new Date())); - endTime = new Date(this.getCurrentYearLast(new Date())); - break; - default: - break; - } - return { startTime, endTime }; - } - - startTime(time) { - const nowTimeDate = new Date(time); - return nowTimeDate.setHours(0, 0, 0, 0); - } - - endTime(time) { - const nowTimeDate = new Date(time); - return nowTimeDate.setHours(23, 59, 59, 999); - } - - getCurrentWeekStartTimeAndEndTime(time?) { - const current = time ? time : new Date(); - // current是本周的第几天 - let nowDayOfWeek = current.getDay(); - if (nowDayOfWeek === 0) nowDayOfWeek = 7; - const dayNum = 1 * 24 * 60 * 60 * 1000; - // 获取本周星期一的时间,星期一作为一周的第一天 - const firstDate = new Date(current.valueOf() - (nowDayOfWeek - 1) * dayNum); - // 获取本周星期天的时间,星期天作为一周的最后一天 - const lastDate = new Date(new Date(firstDate).valueOf() + 6 * dayNum); - return { - startTime: new Date(this.startTime(firstDate)), - endTime: new Date(this.endTime(lastDate)), - }; - } - - /** - * 获取本月的第一天 - * @param time - * @returns - */ - getCurrentMonthFirst(time) { - const date = time ? time : new Date(); - date.setDate(1); - return this.startTime(date); - } - - /** - * 获取本月最后一天 - * @param time - * @returns - */ - getCurrentMonthLast(time) { - const date = time ? time : new Date(); - const currentMonth = date.getMonth(); - const nextMonth = currentMonth + 1; - const nextMonthFirstDay = new Date(date.getFullYear(), nextMonth, 1); - const oneDay = 24 * 60 * 60 * 1000; - return this.endTime(new Date(nextMonthFirstDay.valueOf() - oneDay)); - } - - /** - * 获取本年的第一天 - * @param date - * @returns - */ - getCurrentYearFirst(date) { - date = date ? date : new Date(); - date.setDate(1); - date.setMonth(0); - return this.startTime(date); - } - - /** - * 获取本年的最后一天 - * @param date - * @returns - */ - getCurrentYearLast(date) { - date = date ? date : new Date(); - date.setFullYear(date.getFullYear() + 1); // 设置到明年 - date.setMonth(0); // 明年的0月,也就是对应到1月,是存在的哦,不是不存在的0 - date.setDate(0); // 明年的0日 - return this.endTime(date); - } - /** * 4.5获取用户档案列表 */ @@ -356,55 +265,6 @@ export class ClientService { */ async queryWarnList({ code, type, time, page }) { console.log('queryWarnList'); - // let pageSize, pageIndex; - // if (!page) { - // pageSize = 10; - // pageIndex = 0; - // } - // let result; - // // 为空查询当月 - // if (!time) { - // const { startTime, endTime } = this.dealTime(3); - // result = await clientMapper.queryWarnList({ - // code, - // type, - // startTime, - // endTime, - // pageSize, - // pageIndex, - // status: 1, - // time: null, - // }); - // } else { - // result = await clientMapper.queryWarnList({ - // code, - // type, - // time, - // pageSize, - // pageIndex, - // startTime: null, - // endTime: null, - // status: 0, - // }); - // } - // result[0].forEach((e) => { - // e.typeName = e.dataTypeName; - // e.time = moment(e.time).format('YYYY-MM-DD'); - // delete e.dataTypeName; - // }); - // const data = { - // page: { - // totalNum: result[1], - // totalPage: - // result[1] / pageSize > 1 && result[1] % pageSize != 0 - // ? (pageIndex + 1) * pageSize + 1 - // : pageIndex + 1, - // pageSize, - // pageIndex, - // }, - // alarmList: result[0], - // }; - // return data; if (!page) { page = { pageSize: 10, @@ -472,11 +332,27 @@ export class ClientService { */ async queryDataUseNum({ areaCode, dateRange = 1, limit = 7 }) { console.log('queryDataUseNum'); - const { startTime, endTime } = this.dealTime(dateRange); + // const { startTime, endTime } = this.dealTime(dateRange); + //获取时间开始节点 + let startTime; + limit -= 1 + if (dateRange == 1) { + // 日 + startTime = Time.getRecentDays(limit) + } else if (dateRange == 2) { + // 周 + startTime = Time.getRecentWeeks(limit) + } else if (dateRange == 3) { + // 月 + startTime = Time.getRecentMonths(limit) + } else { + //年 + startTime = Time.getRecentYears(limit) + } const result = await clientMapper.queryDataUseNum({ areaCode, - startTime: moment(startTime).format('YYYY-MM-DD HH:mm:ss'), - endTime: moment(endTime).format('YYYY-MM-DD HH:mm:ss'), + startTime, + // endTime: moment(endTime).format('YYYY-MM-DD HH:mm:ss'), limit, dateRange, }); diff --git a/src/utils/time.ts b/src/utils/time.ts new file mode 100644 index 0000000..d72952e --- /dev/null +++ b/src/utils/time.ts @@ -0,0 +1,171 @@ +const moment = require('moment'); +moment.locale('zh_CN'); +class Time { + dealTime(type) { + let startTime: Date, endTime: Date; + switch (type) { + case 0: + break; + case 1: + startTime = new Date(this.startTime(new Date())); + endTime = new Date(this.endTime(new Date())); + break; + case 2: + const data = this.getCurrentWeekStartTimeAndEndTime(); + startTime = data.startTime; + endTime = data.endTime; + break; + case 3: + startTime = new Date(this.getCurrentMonthFirst(new Date())); + endTime = new Date(this.getCurrentMonthLast(new Date())); + break; + case 4: + startTime = new Date(this.getCurrentYearFirst(new Date())); + endTime = new Date(this.getCurrentYearLast(new Date())); + break; + default: + break; + } + return { startTime, endTime }; + } + + startTime(time) { + const nowTimeDate = new Date(time); + return nowTimeDate.setHours(0, 0, 0, 0); + } + + endTime(time) { + const nowTimeDate = new Date(time); + return nowTimeDate.setHours(23, 59, 59, 999); + } + + getCurrentWeekStartTimeAndEndTime(time?) { + const current = time ? time : new Date(); + // current是本周的第几天 + let nowDayOfWeek = current.getDay(); + if (nowDayOfWeek === 0) nowDayOfWeek = 7; + const dayNum = 1 * 24 * 60 * 60 * 1000; + // 获取本周星期一的时间,星期一作为一周的第一天 + const firstDate = new Date(current.valueOf() - (nowDayOfWeek - 1) * dayNum); + // 获取本周星期天的时间,星期天作为一周的最后一天 + const lastDate = new Date(new Date(firstDate).valueOf() + 6 * dayNum); + return { + startTime: new Date(this.startTime(firstDate)), + endTime: new Date(this.endTime(lastDate)), + }; + } + + /** + * 获取本月的第一天 + * @param time + * @returns + */ + getCurrentMonthFirst(time) { + const date = time ? time : new Date(); + date.setDate(1); + return this.startTime(date); + } + + /** + * 获取本月最后一天 + * @param time + * @returns + */ + getCurrentMonthLast(time) { + const date = time ? time : new Date(); + const currentMonth = date.getMonth(); + const nextMonth = currentMonth + 1; + const nextMonthFirstDay = new Date(date.getFullYear(), nextMonth, 1); + const oneDay = 24 * 60 * 60 * 1000; + return this.endTime(new Date(nextMonthFirstDay.valueOf() - oneDay)); + } + + /** + * 获取本年的第一天 + * @param date + * @returns + */ + getCurrentYearFirst(date) { + date = date ? date : new Date(); + date.setDate(1); + date.setMonth(0); + return this.startTime(date); + } + + /** + * 获取本年的最后一天 + * @param date + * @returns + */ + getCurrentYearLast(date) { + date = date ? date : new Date(); + date.setFullYear(date.getFullYear() + 1); // 设置到明年 + date.setMonth(0); // 明年的0月,也就是对应到1月,是存在的哦,不是不存在的0 + date.setDate(0); // 明年的0日 + return this.endTime(date); + } + + /** + * 获取最近几天的开始时间 + * @param limit + * @returns + */ + getRecentDays(limit = 7) { + // 当天开始时间 + // const toData = new Date(new Date().toLocaleDateString()).getTime() + + // //今天 + // let todayStart = toData //开始时间 + // let todayEnd = todayStart + 24 * 60 * 60 * 1000 - 1 //结束时间 + // //昨天 + // let yesterdayStart = toData - 3600 * 24 * 1000 + // let yesterdayEnd = (yesterdayStart) + 24 * 60 * 60 * 1000 - 1 + // //最近7天 + // let past7daysStart = toData - (limit - 1) * 3600 * 24 * 1000 + // let past7daysEnd = (past7daysStart) + 24 * 60 * 60 * 1000 - 1 + // return new Date(past7daysStart) + return moment().subtract(limit, 'days').format('YYYY-MM-DD 00:00:00') + } + + /** + * 获取最近几周的开始时间 + * @param limit + */ + getRecentWeeks(limit = 7) { + const current = new Date(); + // current是本周的第几天 + let nowDayOfWeek = current.getDay(); + if (nowDayOfWeek === 0) nowDayOfWeek = 7; + const dayNum = 1 * 24 * 60 * 60 * 1000; + // 获取本周星期一的时间,星期一作为一周的第一天 + const firstDate = new Date(current.valueOf() - (nowDayOfWeek - 1) * dayNum); + // const firstDate = current.valueOf() - (nowDayOfWeek - 1) * dayNum; + // const recentWeek = firstDate - (limit - 1) * 7 * 24 * 3600 * 1000 + // return new Date(recentWeek) + return moment(firstDate).subtract(limit, 'weeks').format('YYYY-MM-DD 00:00:00') + } + + getRecentMonths(limit = 6) { + const current = new Date(); + current.setDate(1); + // 获取当月第一天 + const firstDay = this.startTime(current); + const recentDay = moment(new Date(firstDay)).subtract(limit, 'months').format('YYYY-MM-DD 00:00:00') + return recentDay + } + + /** + * 获取最近几年的开始时间 + * @param limit + * @returns + */ + getRecentYears(limit = 3) { + return moment().subtract(limit, 'years').format('YYYY-MM-DD 00:00:00') + // const year = new Date().getFullYear() + // const recent = year - limit + 1 + // const date = new Date(`${recent}-01-01 00:00:00`).valueOf() / 1000 + // return date + } +} + +export default new Time() \ No newline at end of file