????

Your IP : 3.137.161.250


Current Path : C:/inetpub/vhost/sdoc.gdtsolutions.vn/package/app/controllers/
Upload File :
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;