????
Current Path : C:/inetpub/vhost/sdoc.gdtsolutions.vn/package/app/controllers/ |
Current File : C:/inetpub/vhost/sdoc.gdtsolutions.vn/package/app/controllers/danhmuc.js |
const Database = require('../models/Database'); const { toDate } = require('../utils'); const queryBuilder = require('../repositories/QueryBuilder'); const FTS_PATTERN = /[^\p{L}\p{Nd}]+/gu;// /[\/\-\s]+/g class DanhMucController extends Database { constructor(params) { super(params); } static create(params) { return new DanhMucController(params); } getFonds() { const fileFilter = '[File].FondCode = Fond.FondCode AND [File].[State] = 1 AND [File].EditedBy is not NULL'; return queryBuilder('Fond').columns([ 'UUID', 'FondCode', 'FondNumber', 'FondName', 'FondHistory', 'CopyNumber', 'Description', 'State', { countFile: queryBuilder('File').count('UUID').whereRaw(fileFilter) }, { PaperDigital: queryBuilder('Document').sum('PageAmount') .innerJoin('File', '[File].UUID', 'Document.FileId') .whereRaw(fileFilter) } ]).select().orderBy('FondNumber'); } getFileGroups() { return queryBuilder('FileGroup').select('Id', 'GroupName'); } getDocTypes() { return queryBuilder('DocType') .select('DocType.Id', 'DocType.TypeName', 'DocType.TypeGroup', 'DocTypeGroup.Name as GroupName') .innerJoin('DocTypeGroup', 'DocType.TypeGroup', 'DocTypeGroup.Id') } getOrgans() { return queryBuilder('Organization').select('UUID', 'OrganId', 'OrganName'); } getLanguages() { return queryBuilder('Language').select('LangCode', 'LangName') } getConfidenceLevels() { return queryBuilder('ConfidenceLevel').select('Id', 'Name') } getDocModes() { return queryBuilder('Mode').select('Id', 'ModeName') } getLookupTools() { return queryBuilder('LookupTool').select('Id', 'ToolName') } async getReqPrices() { const prices = await queryBuilder('ReqType').select('Code', 'Name', 'Price', 'Unit'); let data = {}; for (let i = 0; i < prices.length; i++) { let { Code, ...value } = prices[i]; data[Code] = value; } return data; } /** Tìm kiếm văn bản */ async getDocuments(search) { let result = { draw: parseInt(search.draw) || 0, recordsTotal: 0, recordsFiltered: 0 }; let condition = []; let reqInput = {}; let order = '(SELECT NULL)'; let content = search['content'] ? search['content'].split(FTS_PATTERN).filter(x => x) : []; if (content.length > 1) reqInput['search'] = `NEAR((${search['content'].split(FTS_PATTERN).filter(x => x).join(',').trim()}), 5,TRUE)`; else if (content.length == 1) reqInput['search'] = `"${content.toString()}*"` //Tìm kiếm nâng cao reqInput['startDate'] = toDate(search['startDate']); if (reqInput['startDate']) condition.push('DATEDIFF(day, IssuedDate, @startDate) <= 0'); reqInput['endDate'] = toDate(search['endDate']); if (reqInput['endDate']) condition.push('DATEDIFF(day, IssuedDate, @endDate) >= 0'); if (search['type']) { condition.push('(DocType = @type)'); reqInput['type'] = search['type'] } if (search['notation']) { condition.push('CONTAINS(SearchDoc.CodeNotation, @notation)'); reqInput['notation'] = search['notation'].split(FTS_PATTERN).join('+').trim() } if (search['organ']) { condition.push('CONTAINS(OrganName, @organ)'); reqInput['organ'] = search['organ'].split(FTS_PATTERN).join('+').trim() } if (search['subject']) { condition.push('CONTAINS(Subject, @subject)'); reqInput['subject'] = search['subject'].split(FTS_PATTERN).join('+').trim() } if (reqInput['search']) order = 'rankSearch.[RANK] desc'; //Tạo chuỗi truy vấn let query = `SELECT ROW_NUMBER() OVER(ORDER BY ${order}) as RowNum,SearchDoc.UUID,FondName,FileCatalog,BoxNumber,FileNumber,DocType.TypeName,CodeNotation,IssuedDate,OrganName,[Subject],PageAmount,SearchDoc.[Description],Autograph,COUNT(SearchDoc.UUID) OVER() as countDocs FROM SearchDoc LEFT JOIN DocType ON SearchDoc.DocType = DocType.Id`; if (reqInput['search']) query += ' INNER JOIN CONTAINSTABLE(SearchDoc, *, @search) AS rankSearch ON rankSearch.[KEY] = SearchDoc.UUID'; if (condition.length) query += ' WHERE ' + condition.join(' AND '); query += ' ORDER BY RowNum'; reqInput['length'] = parseInt(search['length']) || 0; reqInput['start'] = parseInt(search['start']) || 0; if (reqInput['length']) query += ' OFFSET @start rows FETCH NEXT @length rows ONLY'; let recordset = await this.select(query, reqInput); if (recordset.length) result.recordsFiltered = result.recordsTotal = recordset[0].countDocs; result.data = recordset; return result; } /** Tìm kiếm hồ sơ */ async getFiles(search) { const result = { draw: +search.draw || 0, recordsTotal: 0, recordsFiltered: 0 }; //#region Rebuild query using knex const { content, fond, length, start/*, group */ } = search; const query = queryBuilder('SearchFile').where(b => { if (fond) b.where('FondCode', fond); }); let fts = content ? content.split(FTS_PATTERN).filter(x => x) : []; if (fts.length) { query.joinRaw('INNER JOIN CONTAINSTABLE([File], *, ?) rankedFile ON rankedFile.[KEY] = SearchFile.UUID', [fts.length === 1 ? `"${fts.toString()}*"` : `NEAR((${fts.join(',').trim()}), 5, true)`]) } const countQuery = query.clone().count('SearchFile.UUID', { as: 'countFile' }); const dataQuery = query.select('SearchFile.*') .rowNumber('RowNum', function () { if (fts.length) this.orderBy('rankedFile.[RANK]', 'desc') else this.orderBy(['FondNumber', 'FileCatalog', 'BoxNumber', 'FileNumber']) }) .orderBy('RowNum').offset(+start || 0).limit(+length || undefined); const [data, [{ countFile }]] = await Promise.all([dataQuery, countQuery]); result.data = data; result.recordsFiltered = result.recordsTotal = countFile; //#endregion return result; } /** Chi tiết phông */ async getFondDetail(reqQuery) { var data = { items: [], itemCount: 0 } if (!reqQuery.fondCode) return data; //#region rebuild query using knex const withQuery = queryBuilder.with('AllFile', queryBuilder('File') .column(['UUID', 'FileCatalog', 'BoxNumber', 'FileNumber', 'Title', 'FileNotation', 'Maintenance', 'Description', 'SheetNumber', 'StartDate', 'EndDate', 'EditedBy', 'ApprovedBy', { countDoc: queryBuilder('Document').count('UUID').whereRaw('Document.FileId = [File].UUID') }, { PageNumber: queryBuilder('Document').sum('PageAmount').whereRaw('Document.FileId = [File].UUID') } ]).whereNotNull('EditedBy').andWhere('FondCode', reqQuery.fondCode) ).from('AllFile') const countQuery = withQuery.clone().from('AllFile').count('UUID', { as: 'countFile' }); const dataQuery = withQuery.select('*').orderBy(['FileCatalog', 'BoxNumber', 'FileNumber']) .offset(+reqQuery.skip || 0).limit(+reqQuery.take || undefined); const [files, [{ countFile }]] = await Promise.all([dataQuery, countQuery]) //#endregion data.items = files; data.itemCount = countFile; return data; } } module.exports = DanhMucController;