| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 | /**标准清单操作相关 * Created by Zhong on 2017/8/2. */let billsController = require("./bills_lib_controllers");let billsLibDao = require("./../models/bills_lib_interfaces");import baseController from "../../common/base/base_controller";import fs from 'fs';import path from 'path';import multiparty from 'multiparty';const excel = require("node-xlsx");const uuidV1 = require('uuid/v1');const shareDir = 'public/share/images';const imgTriggers = ['billsRecharge', 'rationExplanation', 'rationRuleText'];class billsPermContr extends baseController{    getCurrentUniqId(req, res){        billsController.getCurrentUniqId(req, res);    }    getBills(req, res){        billsController.getBills(req, res);    }    createBills(req, res){        billsController.createBills(req, res);    }    updatePNId(req, res){        billsController.updatePNId(req, res);    }    upMove(req, res){        billsController.upMove(req, res);    }    downMove(req, res){        billsController.downMove(req, res);    }    upLevel(req, res){        billsController.upLevel(req, res);    }    downLevel(req, res){        billsController.downLevel(req, res);    }    updateBills(req, res){        billsController.updateBills(req, res);    }    updateSectionInfo(req, res){        billsController.updateSectionInfo(req, res);    }    updateBillsArr(req, res){        billsController.updateBillsArr(req, res);    }    removeTotal(req, res){        billsController.removeTotal(req, res);    }    updateSerialNo(req, res){        billsController.updateSerialNo(req, res);    }    pasteBills(req, res){        billsController.pasteBills(req, res);    }    updateRecharge(req, res){        billsController.updateRecharge(req, res);    }    pasteRel(req, res){        billsController.pasteRel(req, res);    }    deleteBills(req, res){        billsController.deleteBills(req, res);    }    isUsed(req, res){        billsController.isUsed(req, res);    }    /*     * 导入标准清单(确定节点结构:深度数组)     * */    importBills(req, res){        let form = new multiparty.Form({uploadDir: './public'});        const allowHeader = ['application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'];        let uploadFullName;        form.parse(req, async function (err, fields, files) {            try {                const file = typeof files.file !== 'undefined' ? files.file[0] : null;                if (err || !file) {                    throw '上传失败。';                }                if (file.headers['content-type'] === undefined || allowHeader.indexOf(file.headers['content-type']) < 0) {                    throw '不支持该类型';                }                const billsLibId = typeof fields.billsLibId !== 'undefined' && fields.billsLibId.length > 0 ? fields.billsLibId[0] : null;                if (!billsLibId) {                    throw '请选择一个清单库。';                }                let hasData = await billsLibDao.hasData(billsLibId);                if (hasData) {                    throw '请新建一个新的清单库,或删除库中的清单后再导入。';                }                // 重命名文件名                uploadFullName = './public/' + file.originalFilename;                fs.renameSync(file.path, uploadFullName);                const sheet = excel.parse(uploadFullName);                if (sheet[0] === undefined || sheet[0].data === undefined || sheet[0].data.length <= 0) {                    throw 'excel没有对应数据';                }                //插入清单                await billsLibDao.importBills(billsLibId, sheet[0].data);                // 删除文件                if(uploadFullName && fs.existsSync(uploadFullName)){                    fs.unlinkSync(uploadFullName);                }                res.json({error: 0, data: null, msg: ''});            } catch (err) {                console.log(err);                // 删除文件                if(uploadFullName && fs.existsSync(uploadFullName)){                    fs.unlinkSync(uploadFullName);                }                res.json({error: 1, data: null, msg: err});            }        });    }    /*    *上传图片    * */    uploadImg(req, res){        let uploadDir = path.join(req.app.locals.rootDir, shareDir);        let form = new multiparty.Form({uploadDir: uploadDir});        form.parse(req, async function(err, fields, files){            try {                const file = typeof files.file !== 'undefined' ? files.file[0] : null;                if(err || !file) {                    throw '上传失败';                }                //触发上传图片的地方                const trigger = typeof fields.trigger !== 'undefined' && fields.trigger.length > 0 ? fields.trigger[0] : null;                if (!trigger || !imgTriggers.includes(trigger)) {                    throw '该操作没有上传权限'                }                //根据触发源放置文件到相关文件夹                let triggerPath = path.join(uploadDir, trigger);                if (!fs.existsSync(triggerPath)) {                    fs.mkdirSync(triggerPath);                }                //文件后缀                let px = file.originalFilename.split('.').pop();                //时间戳重命名图片并移动文件                let newFileName = Date.now() + '.' + px;                if (fs.existsSync(newPath)) {                    newFileName += uuidV1();                }                let newPath = path.join(triggerPath, newFileName);                fs.renameSync(file.path, newPath);                //返回图片域名后的url                res.json({error: 0, data: `${shareDir}/${trigger}/${newFileName}`, message: 'success'});            } catch (err) {                console.log(err);                res.json({error: 1, data: null, message: err});            }        });    }    /*    * 删除图片    * */    delImg(req, res){        try {            let data = JSON.parse(req.body.data),                trigger = data.trigger,                url = data.url;            if (!imgTriggers.includes(trigger)) {                throw '该操作没有权限';            }            //拼接完整的删除路径            let delUrl = path.join(req.app.locals.rootDir, url);            fs.unlinkSync(delUrl);            res.json({error: 0, data: null, message: 'success'});        } catch(err) {            res.json({error: 1, data: null, message: err});        }    }    /*     *  根据页码加载图片     *  返回总页码和当前页码的图片信息     * */    loadImgs(req, res){        try {            let data = JSON.parse(req.body.data),                trigger = data.trigger,                page = data.page;            if (!imgTriggers.includes(trigger)) {                throw '该操作没有权限';            }            //每页显示的图片数            const perImgs = 3;            //总的图片信息            let triggerPath = path.join(req.app.locals.rootDir, shareDir, trigger);            if (!fs.existsSync(triggerPath)) {                fs.mkdirSync(triggerPath);            }            let allImgs = fs.readdirSync(triggerPath);            //将图片按照时间排序,降序            allImgs.sort(function (a, b) {                let aV = a.split('.')[0],                    bV = b.split('.')[0];                    if(aV > bV) {                        return -1;                    } else if(aV < bV) {                        return 1;                    }                    return 0;            });            let pageCount = Math.ceil(allImgs.length / perImgs) || 1;            //当前页图片信息            let startIdx = (page - 1) * perImgs,                endIdx = startIdx + 3,                currentPageArr = allImgs.slice(startIdx, endIdx),                currentImgsUrl = [];            for (let img of currentPageArr){                currentImgsUrl.push(`${shareDir}/${trigger}/${img}`);            }            res.json({error: 0, data: {pageCount: pageCount, currentImgsUrl: currentImgsUrl}, message: 'success'});        } catch (err) {            console.log(err);            res.json({error: 1, data: {pageCount: 1, currentImgsUrl: []}, message: err});        }    }}export default billsPermContr;
 |