You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							268 lines
						
					
					
						
							7.6 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							268 lines
						
					
					
						
							7.6 KiB
						
					
					
				
								'use strict';
							 | 
						|
								const { QueryTypes } = require('sequelize');
							 | 
						|
								
							 | 
						|
								async function reportList(ctx) {
							 | 
						|
								    try {
							 | 
						|
								        const models = ctx.fs.dc.models;
							 | 
						|
								        const { limit, page, startTime, endTime, keyword, userId, reportType, isTop, asc, projectType, handleState = '', performerId = '' } = ctx.query
							 | 
						|
								        const { userInfo } = ctx.fs.api
							 | 
						|
								        const sequelize = ctx.fs.dc.orm;
							 | 
						|
								
							 | 
						|
								        let findUsers = []
							 | 
						|
								        if (
							 | 
						|
								            userInfo.loginSource == 'wx'
							 | 
						|
								            && userInfo.isAdmin
							 | 
						|
								            && userInfo.phone != 'SuperAdmin'
							 | 
						|
								            && (!performerId && !handleState)
							 | 
						|
								        ) {
							 | 
						|
								            // 是管理员但不是超管 查自己部门及下级部门的所有用户的信息
							 | 
						|
								            const sqlStr = `
							 | 
						|
								                WITH RECURSIVE sub_departments AS (
							 | 
						|
								                    SELECT id, dependence
							 | 
						|
								                    FROM department
							 | 
						|
								                    WHERE id = 1
							 | 
						|
								                    UNION ALL
							 | 
						|
								                    SELECT d.id, d.dependence
							 | 
						|
								                    FROM sub_departments sd
							 | 
						|
								                    JOIN department d ON sd.id = d.dependence
							 | 
						|
								                )
							 | 
						|
								                SELECT u.id
							 | 
						|
								                FROM "user" AS u
							 | 
						|
								                JOIN sub_departments sd ON u.department_id = sd.id
							 | 
						|
								                WHERE u.delete = false;
							 | 
						|
								            `
							 | 
						|
								
							 | 
						|
								            const res = await sequelize.query(sqlStr, { type: QueryTypes.SELECT })
							 | 
						|
								            findUsers = res.map(item => {
							 | 
						|
								                return item.id
							 | 
						|
								            })
							 | 
						|
								            findUsers.push(-1)
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        let findOption = {
							 | 
						|
								            where: {
							 | 
						|
								
							 | 
						|
								            },
							 | 
						|
								            attributes: ['id', 'road', 'time', 'projectType', 'roadSectionStart', 'performerId', 'roadSectionEnd', 'reportType', 'content', 'longitude', 'latitude', 'projectName', 'handleState'],
							 | 
						|
								            include: [{
							 | 
						|
								                model: models.User,
							 | 
						|
								                attributes: ['name']
							 | 
						|
								            }],
							 | 
						|
								            order: [['time', asc ? 'ASC' : 'DESC']],
							 | 
						|
								        }
							 | 
						|
								        if (limit) {
							 | 
						|
								            findOption.limit = limit
							 | 
						|
								        }
							 | 
						|
								        if (page && limit) {
							 | 
						|
								            findOption.offset = page * limit
							 | 
						|
								        }
							 | 
						|
								        if (startTime && endTime) {
							 | 
						|
								            findOption.where = {
							 | 
						|
								                time: {
							 | 
						|
								                    '$between': [startTime, endTime]
							 | 
						|
								                }
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								        if (keyword) {
							 | 
						|
								            if (reportType == 'road') {
							 | 
						|
								                findOption.where.projectName = {
							 | 
						|
								                    '$like': `%${keyword}%`
							 | 
						|
								                }
							 | 
						|
								            } else {
							 | 
						|
								                findOption.where.road = {
							 | 
						|
								                    '$like': `%${keyword}%`
							 | 
						|
								                }
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								        if (userId) {
							 | 
						|
								            findOption.where.userId = userId
							 | 
						|
								        }
							 | 
						|
								        if (findUsers.length) {
							 | 
						|
								            findOption.where.userId = { $in: findUsers }
							 | 
						|
								        }
							 | 
						|
								        if (reportType) {
							 | 
						|
								            findOption.where.reportType = reportType
							 | 
						|
								        }
							 | 
						|
								        if (projectType) {
							 | 
						|
								            findOption.where.projectType = projectType
							 | 
						|
								        }
							 | 
						|
								        if (performerId) {
							 | 
						|
								            let performerIds = performerId.split(',')
							 | 
						|
								            findOption.where.performerId = { $in: performerIds }
							 | 
						|
								        }
							 | 
						|
								        if (handleState) {
							 | 
						|
								            findOption.where.handleState = handleState
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        let reportRes = null;
							 | 
						|
								
							 | 
						|
								        if (isTop) {
							 | 
						|
								            const sqlStr = 'select * from (SELECT R.*, "row_number"() OVER(PARTITION BY R.user_id ORDER BY R."time" DESC) AS NEWINDEX FROM report AS R ) AS NR WHERE NEWINDEX = 1'
							 | 
						|
								            reportRes = await sequelize.query(sqlStr, { type: QueryTypes.SELECT });
							 | 
						|
								        } else {
							 | 
						|
								            reportRes = await models.Report.findAll(findOption)
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        ctx.status = 200;
							 | 
						|
								        ctx.body = reportRes
							 | 
						|
								    } catch (error) {
							 | 
						|
								        ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
							 | 
						|
								        ctx.status = 400;
							 | 
						|
								        ctx.body = {
							 | 
						|
								            message: typeof error == 'string' ? error : undefined
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								async function reportPosition(ctx) {
							 | 
						|
								    try {
							 | 
						|
								        const models = ctx.fs.dc.models;
							 | 
						|
								        const { startTime, endTime, userId, reportType } = ctx.query
							 | 
						|
								        const sequelize = ctx.fs.dc.ORM;
							 | 
						|
								
							 | 
						|
								        let findMxTimeOption = {
							 | 
						|
								            attributes: [
							 | 
						|
								                'userId',
							 | 
						|
								                [sequelize.fn('MAX', sequelize.col('time')), 'maxTime'],
							 | 
						|
								            ],
							 | 
						|
								            where: {
							 | 
						|
								
							 | 
						|
								            },
							 | 
						|
								            group: ['report.user_id'],
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        if (startTime && endTime) {
							 | 
						|
								            findMxTimeOption.where = {
							 | 
						|
								                time: {
							 | 
						|
								                    '$between': [startTime, endTime]
							 | 
						|
								                }
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        if (userId) {
							 | 
						|
								            findMxTimeOption.where.userId = userId
							 | 
						|
								        }
							 | 
						|
								        if (reportType) {
							 | 
						|
								            findMxTimeOption.where.reportType = reportType
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        const reportMaxTimeRes = await models.Report.findAll(findMxTimeOption)
							 | 
						|
								        const timeArr = reportMaxTimeRes.map(item => item.dataValues.maxTime)
							 | 
						|
								        const reportRes = await models.Report.findAll({
							 | 
						|
								            where: {
							 | 
						|
								                time: { '$in': timeArr }
							 | 
						|
								            }
							 | 
						|
								        })
							 | 
						|
								        ctx.status = 200;
							 | 
						|
								        ctx.body = reportRes
							 | 
						|
								    } catch (error) {
							 | 
						|
								        ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
							 | 
						|
								        ctx.status = 400;
							 | 
						|
								        ctx.body = {
							 | 
						|
								            message: typeof error == 'string' ? error : undefined
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								async function reportDetail(ctx) {
							 | 
						|
								    try {
							 | 
						|
								        const models = ctx.fs.dc.models;
							 | 
						|
								        const { reportId } = ctx.params
							 | 
						|
								
							 | 
						|
								        const reportRes = await models.Report.findOne({
							 | 
						|
								            where: {
							 | 
						|
								                id: reportId
							 | 
						|
								            }
							 | 
						|
								        })
							 | 
						|
								
							 | 
						|
								        ctx.status = 200;
							 | 
						|
								        ctx.body = reportRes
							 | 
						|
								    } catch (error) {
							 | 
						|
								        ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
							 | 
						|
								        ctx.status = 400;
							 | 
						|
								        ctx.body = {
							 | 
						|
								            message: typeof error == 'string' ? error : undefined
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								async function reportHandle(ctx) {
							 | 
						|
								    try {
							 | 
						|
								        const { models } = ctx.fs.dc;
							 | 
						|
								
							 | 
						|
								        const { reportId } = ctx.params
							 | 
						|
								        const { handleState } = ctx.request.body
							 | 
						|
								        const data = ctx.request.body
							 | 
						|
								        /**
							 | 
						|
								         *  data = {
							 | 
						|
								         *      handleState,
							 | 
						|
								         *      handleContent,
							 | 
						|
								         *      handlePic
							 | 
						|
								         *  }
							 | 
						|
								         */
							 | 
						|
								        await models.Report.update(data, {
							 | 
						|
								            where: {
							 | 
						|
								                id: reportId
							 | 
						|
								            }
							 | 
						|
								        })
							 | 
						|
								
							 | 
						|
								        ctx.status = 200;
							 | 
						|
								    } catch (error) {
							 | 
						|
								        ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
							 | 
						|
								        ctx.status = 400;
							 | 
						|
								        ctx.body = {
							 | 
						|
								            message: typeof error == 'string' ? error : undefined
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								async function createReport(ctx) {
							 | 
						|
								    try {
							 | 
						|
								        const { userId } = ctx.fs.api
							 | 
						|
								        const models = ctx.fs.dc.models;
							 | 
						|
								        const data = ctx.request.body;
							 | 
						|
								
							 | 
						|
								        await models.Report.create({
							 | 
						|
								            ...data,
							 | 
						|
								            userId,
							 | 
						|
								            time: new Date(),
							 | 
						|
								        })
							 | 
						|
								
							 | 
						|
								        ctx.status = 204
							 | 
						|
								    } catch (error) {
							 | 
						|
								        ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
							 | 
						|
								        ctx.status = 400;
							 | 
						|
								        ctx.body = {
							 | 
						|
								            message: typeof error == 'string' ? error : undefined
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								async function deleteReport(ctx) {
							 | 
						|
								    try {
							 | 
						|
								        const models = ctx.fs.dc.models;
							 | 
						|
								        const { reportId } = ctx.params;
							 | 
						|
								
							 | 
						|
								        await models.Report.destroy({
							 | 
						|
								            where: {
							 | 
						|
								                id: reportId
							 | 
						|
								            }
							 | 
						|
								        })
							 | 
						|
								
							 | 
						|
								        ctx.status = 204
							 | 
						|
								    } catch (error) {
							 | 
						|
								        ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
							 | 
						|
								        ctx.status = 400;
							 | 
						|
								        ctx.body = {
							 | 
						|
								            message: typeof error == 'string' ? error : undefined
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// TODO 小程序填写道路名称的时候的道路筛选 是一起都返回 还是不断传关键字搜索返回
							 | 
						|
								
							 | 
						|
								module.exports = {
							 | 
						|
								    reportList,
							 | 
						|
								    reportPosition,
							 | 
						|
								    reportDetail, createReport, deleteReport, reportHandle
							 | 
						|
								};
							 |