????

Your IP : 3.139.86.128


Current Path : C:/inetpub/vhost/sdoc.gdtsolutions.vn/package/app/routes/sohoa/
Upload File :
Current File : C:/inetpub/vhost/sdoc.gdtsolutions.vn/package/app/routes/sohoa/taovanban.js

var {existsSync, statSync} = require('fs');
var fsp = require('fs/promises');
var path = require('path');
var multer = require('multer');
var vanbanCtrl = require('../../controllers/tailieu/vanban').create();
var { useLayout } = require('../../controllers/middleware');
var { scanPath } = require('../../appconfig');
var {decodePath} = require('../../utils');
module.exports = function () {
  var router = require('express').Router();
  //GET
  router.get('/', useLayout, function (req, res, _next) {
    res.render('sohoa/taovanban.eta', {title: 'Tạo văn bản'});
  });
  //POST
  //Hỗ trợ tạo văn bản
  router.get('/thumuc', async function (req, res, _next) {
    let folder = decodePath(req.query.path);
    let result = {
      root: folder ? path.normalize(folder) : '',
      folders: [],
      files: []
    }
    try {
      let dir = scanPath;
      if (!existsSync(dir)) await fsp.mkdir(dir, {recursive: true});
      if (req.query.path) dir = path.join(dir, folder);
      if (await fsp.access(dir).then(() => true).catch(() => false)) {
        let files = await fsp.readdir(dir);
        let sortFiles = files.filter(function (x) {
          try {
            let stat = statSync(path.join(dir, x));
            return path.extname(x).toLowerCase() == '.pdf' && !stat.isDirectory();
          }
          catch { return false; }
        }).map(function (y) {
          try {
            let stat = statSync(path.join(dir, y));
            return { name: y, size: stat.size }
          }
          catch { return null; }
        }).filter(f => f);
        sortFiles.sort(function (a, b) {
          let arrA = a.name.split('.');
          let arrB = b.name.split('.');
          if (parseInt(arrA[0]) > parseInt(arrB[0])) return 1;
          else if (parseInt(arrA[0]) < parseInt(arrB[0])) return - 1;
          else if (parseInt(arrA[0]) == parseInt(arrB[0]) && arrA[0] > arrB[0]) return 1;
          else if (parseInt(arrA[0]) == parseInt(arrB[0]) && arrA[0] < arrB[0]) return -1;
          else if (parseInt(arrA[0]) == parseInt(arrB[0]) && arrA[0] == arrB[0]) {
            if (parseInt(arrA[1]) > parseInt(arrB[1])) return 1;
            else if (parseInt(arrA[1]) < parseInt(arrB[1])) return -1;
            else if (parseInt(arrA[1]) == parseInt(arrB[1])) return 0;
          }
        });
        result.folders = files.filter(function (x) {
          try {
            let stat = statSync(path.join(dir, x));
            return stat.isDirectory();
          } catch {return false;}
        });
        result.files = sortFiles;
        res.status(200).send(result);
      }
      else res.status(400).send({ 'Lỗi': 'Đường dẫn không tồn tại' });
    } catch (err) { res.status(400).send(err.message) }
  });
  router.post('/thumuc', async function (req, res, _next) {
    try {
      var folder = path.join(scanPath, req.body.dir, req.body.name);
      if (existsSync(folder)) res.status(400).send(`Đã tồn tại thư mục tên "${req.body.name}"`)
      else {
        await fsp.mkdir(folder, {recursive:true});
        res.status(200).send('Tạo thư mục thành công')
      }
    } catch (err) { res.statusMessage = err.message; res.status(400).end() }
  });
  router.post('/thumuc/delete', async function (req, res, _next) {
    try {
      await fsp.rm(path.join(scanPath, req.body.path), {recursive:true,force:true});
      res.end();
    } catch (err) { console.log(err); res.status(400).send(err) }
  });
  router.post('/upload', async function (req, res, _next) {
    var rootFolder = decodePath(req.query.root);
    var uploadDir = path.join(scanPath, rootFolder);
    try {
      if (!existsSync()) await fsp.mkdir(uploadDir, {recursive:true});
      var storage = multer.diskStorage({
        destination: function (req, file, cb) {
          cb(null, uploadDir);
        },
        filename: function (req, file, cb) {
          cb(null, decodeURI(req.body.encFilename));
        }
      });
      var upload = multer({ storage: storage }).single('file');
      upload(req, res, function (err) {
        if (err) res.status(400).send(err);
        else res.status(200).send(req.file.name);
      });
    }
    catch (err) { res.status(400).send(err) }
  });
  router.get('/hoso', function (req, res, _next) {
    var userId = req.user.UUID;
    var where = [];
    if (req.query.fond) {
      where.push(`FondCode = '${req.query.fond}'`);
      where.push('[State] = 1');
      //where.push(`(EditedBy is null OR (EditedBy = '${userId}' AND JobState = 0))`);
      if (req.query.search) where.push(`(FileNumber LIKE '${req.query.search}%')`);
      var query = `SELECT UUID,FileCode,Title,FileCatalog,BoxNumber,FileNumber,StartDate,EndDate FROM [File] WHERE ${where.join(' AND ')} ORDER BY FileCatalog,BoxNumber,FileNumber offset ${((req.query.page || 1) - 1) * 10} rows fetch next 10 rows only`;
      vanbanCtrl.select(query)
        .then(function (recordset) {
          var result = { results: recordset.map(function (x) { x.id = x.FileCode; return x }) };
          if (recordset.length == 10) result.pagination = { more: true };
          res.json(result);
        })
        .catch(function (err) { res.status(400).json(err) })
    }
    else res.json(null);
  });
  router.get('/scan/:path', function (req, res, _next) {
    var filePath = path.join(scanPath, decodePath(req.params.path));
    if (!existsSync(filePath)) res.status(404).end('Văn bản tạm thời đã không còn tồn tại');
    else {
      res.status(200).sendFile(filePath);
    }
  });
  router.get('/coquan', function (req, res, _next) {
    if (req.query.filter && req.query.filter.filters) {
      let select1 = 'SELECT OrganName FROM Organization';
      let select2 = 'SELECT OrganName FROM Document WHERE OrganName is not null';
      let filter = req.query.filter.filters[0];
      let input = { contains: `"${filter['value']}*"` }
      select1 += ' WHERE Contains(OrganName, @contains)';
      select2 += ' AND Contains(OrganName, @contains)';
      let query = `SELECT * FROM (${select1} UNION ${select2}) as temp`;
      vanbanCtrl.select(query, input)
        .then(function (recordset) { res.json(recordset).end() })
        .catch(function (err) { res.status(400).send(err) })
    } else { res.status(400).json(null) }
  });
  return router;
}