????
Current Path : C:/inetpub/vhost/sdoc.gdtsolutions.vn/package/app/controllers/baocao/ |
Current File : C:/inetpub/vhost/sdoc.gdtsolutions.vn/package/app/controllers/baocao/ReportController.js |
const Database = require('../../models/Database'); const queryBuilder = require('../../repositories/QueryBuilder'); class ReportController extends Database { constructor(params) { super(params); } static create(params) { return new ReportController(params); } //for report fonds async getFileGroup() { var query = 'SELECT Id, UPPER(GroupName) AS GroupName FROM [FileGroup]'; return await this.select(query); } async getFondCode() { var query = 'SELECT DISTINCT FondCode FROM Fond'; return await this.select(query); } async getFondName() { var query = 'SELECT DISTINCT FondCode, FondName FROM Fond'; return await this.select(query); } async getFondToReport(group, fondCode) { const withQuery = queryBuilder.with('tkHoSo', qb => qb.columns([ 'File.UUID', 'File.FondCode', { startDate: queryBuilder.min('File.FileYear') }, { endDate: queryBuilder.max('File.FileYear') }, { soVanBan: queryBuilder.raw('COUNT(Document.UUID)') }, { soTrang: queryBuilder.raw('SUM(Document.PageAmount)') }, ]).select().from('File') .leftJoin('Document', 'Document.FileId', 'File.UUID') .whereNotNull('File.EditedBy').andWhere('File.State', 1) .andWhere(function () { if (group) this.where('File.GroupId', group); if (fondCode) this.where('File.FondCode', fondCode); }) .groupBy('File.UUID', 'File.FondCode') ) const query = withQuery.columns([ 'FondName', 'Fond.FondCode', 'Fond.FondNumber', { startYear: queryBuilder.min('tkHoSo.startDate') }, { endYear: queryBuilder.max('tkHoSo.endDate') }, { tongSoHS: queryBuilder.raw('COUNT(tkHoSo.UUID)') }, { tongSoTrang: queryBuilder.raw('SUM(tkHoSo.soTrang)') }, { tongSoVB: queryBuilder.raw('SUM(tkHoSo.soVanBan)') }, ]).select().from('Fond') .rightJoin('tkHoSo', 'tkHoSo.FondCode', 'Fond.FondCode') .groupBy('FondName', 'Fond.FondCode', 'Fond.FondNumber') .orderBy('Fond.FondNumber') return await query; } async reportFiles(reqBody) { //#region rebuild query using knex const { start, length, jobState, fondCode, boxNumber1, boxNumber2, fileNumber1, fileNumber2, startDate1, startDate2, endDate1, endDate2 } = reqBody; const withQuery = queryBuilder.with('ReportFile', qb => { qb.column(['File.UUID', 'File.FondCode', 'FondName', 'File.FileCatalog', 'File.BoxNumber', 'File.FileNumber', 'File.Title', 'File.StartDate', 'File.EndDate', 'File.SheetNumber', 'File.Maintenance', 'File.Description', 'File.Format', { PageNumber: queryBuilder('Document').sum('PageAmount').whereRaw('Document.FileId = [File].UUID') }, { totalDoc: queryBuilder('Document').count('UUID').whereRaw('Document.FileId = [File].UUID') }, { EditedBy: 'editAcc.FullName' } ]).select() .rowNumber('RowNum', ['Fond.FondCode', 'File.FileCatalog', 'File.BoxNumber', 'File.FileNumber']) .from('File') .innerJoin('Fond', 'Fond.FondCode', 'File.FondCode') .leftJoin({ editAcc: 'Account' }, 'editAcc.UUID', 'File.EditedBy') .where('File.State', 1).whereRaw(`[File].EditedBy is ${jobState ? 'Not ' : ''}NULL`) .andWhere(b => { if (fondCode) b.where('File.FondCode', fondCode) if (boxNumber1) b.where('File.BoxNumber', '>=', boxNumber1) if (boxNumber2) b.where('File.BoxNumber', '<=', boxNumber2) if (fileNumber1) b.whereRaw('[dbo].getFileNumber([File].FileNumber) >= ?', fileNumber1) if (fileNumber2) b.whereRaw('[dbo].getFileNumber([File].FileNumber) <= ?', fileNumber2) if (startDate1) b.where('File.StartDate', '>=', startDate1) if (startDate2) b.where('File.StartDate', '<=', startDate2) if (endDate1) b.where('File.EndDate', '>=', endDate1) if (endDate2) b.where('File.EndDate', '<=', endDate2) }) }) const countQuery = withQuery.clone().count('UUID', { as: 'recordsTotal' }).from('ReportFile'); const dataQuery = withQuery .column(['*', { docsTotal: queryBuilder.raw('SUM(totalDoc) OVER()') }, { pagesTotal: queryBuilder.raw('SUM(PageNumber) OVER()') }] ).select().from('ReportFile').orderBy('RowNum').offset(+start).limit(+length || undefined) //#endregion return await Promise.all([dataQuery, countQuery])//this.select(query, reqBody); } async reportDocuments(reqBody) { var condition = ['[File].[State] = 1']; if (reqBody.state == 2) { condition.push('Document.PageAmount > 0'); } else if (reqBody['state'] == 1) { condition.push('(Document.PageAmount = 0 OR Document.PageAmount is null)'); } if (reqBody.fondCode) condition.push('Fond.FondCode = @fondCode'); if (reqBody.boxNumber1) condition.push('[File].BoxNumber >= @boxNumber1'); if (reqBody.boxNumber2) condition.push('[File].BoxNumber <= @boxNumber2'); if (reqBody.fileNumber1) condition.push('[dbo].getFileNumber([File].FileNumber) >= @fileNumber1'); if (reqBody.fileNumber2) condition.push('[dbo].getFileNumber([File].FileNumber) <= @fileNumber2'); if (reqBody.issuedDate1) condition.push('[Document].IssuedDate >= @issuedDate1'); if (reqBody.issuedDate2) condition.push('[Document].IssuedDate <= @issuedDate2'); let docTable = 'SELECT ROW_NUMBER() OVER(ORDER BY Fond.FondCode,[File].FileCatalog,[File].BoxNumber,[File].FileNumber,Document.DocOrdinal) as RowNum,Document.UUID,Document.DocOrdinal,DocType.TypeName,Document.CodeNumber,Document.CodeNotation,Document.IssuedDate,Document.OrganName,Document.[Subject],Document.SheetIndex,Document.SheetAmount,Document.PageAmount,Mode.ModeName,Document.[Description],Fond.FondName,Fond.FondCode,[File].FileCatalog,[File].BoxNumber,[File].FileNumber,Document.[Format],Account.FullName as CreatedBy FROM Document '; docTable += 'LEFT JOIN Mode ON Document.ModeId = Mode.Id '; docTable += 'LEFT JOIN DocType ON DocType.Id = Document.DocType '; docTable += 'LEFT JOIN Account ON Account.UUID = Document.CreatedBy '; docTable += 'INNER JOIN [File] ON [File].UUID = Document.FileId '; docTable += 'INNER JOIN Fond ON Fond.FondCode = [File].FondCode '; docTable += `WHERE ${condition.join(' AND ')}`; var query = `WITH ReportDoc AS (${docTable}) SELECT *, COUNT(UUID) OVER() as recordsTotal, SUM(PageAmount) OVER() as tongSoTrang FROM ReportDoc ORDER BY RowNum`; if (reqBody.length) query += ' OFFSET @start rows FETCH NEXT @length rows only'; return await this.select(query, reqBody); } } module.exports = ReportController;