Forráskód Böngészése

Merge branch 'master' of http://smartcost.f3322.net:3000/SmartCost/YangHuCost

zhangweicheng 6 éve
szülő
commit
4a3664b300

+ 56 - 3
modules/reports/controllers/rpt_controller.js

@@ -403,7 +403,7 @@ function getMultiRptsCommon(user_id, prj_id, rpt_ids, pageSize, orientation, cus
     });
 }
 
-function getSummaryReportPages(user_id, prjIds, rpt_id, pageSize, orientation, customizeCfg, option, outputType, cb) {
+function getBillsSummaryReportPages(user_id, prjIds, rpt_id, pageSize, orientation, customizeCfg, option, outputType, cb) {
     let rptTpl = null;
     rptTplDataFacade.getBudgetSummayDatas(prjIds).then(function(summaryRawDataRst) {
         rptTplFacade.getRptTemplate(rpt_id).then(function(rptTpl) {
@@ -442,6 +442,45 @@ function getSummaryReportPages(user_id, prjIds, rpt_id, pageSize, orientation, c
     });
 }
 
+function getGljSummaryReportPages(user_id, prjIds, rpt_id, pageSize, orientation, customizeCfg, option, outputType, cb) {
+    let rptTpl = null;
+    rptTplDataFacade.getGLJSummayDatas(prjIds).then(function(summaryRawDataRst) {
+        rptTplFacade.getRptTemplate(rpt_id).then(function(rptTpl) {
+            let rptDataUtil = new rptDataExtractor();
+            rptDataUtil.initialize((rptTpl._doc)?rptTpl._doc:rptTpl);
+            try {
+                let tplData = rptDataUtil.assembleData(summaryRawDataRst);
+                let printCom = JpcEx.createNew();
+                if (pageSize) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
+                //console.log("orientation: " + (orientation === 'null'));
+                if (orientation && (orientation !== 'null')) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] = orientation;
+                let defProperties = rptUtil.getReportDefaultCache();
+                if (customizeCfg) setupCustomizeCfg(customizeCfg, rptTpl, defProperties);
+                let dftOption = option||JV.PAGING_OPTION_NORMAL;
+                printCom.initialize(rptTpl);
+                printCom.analyzeData(rptTpl, tplData, defProperties, dftOption, outputType);
+                let maxPages = printCom.totalPages;
+                let pageRst = null;
+                if (maxPages > 0) {
+                    pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties, customizeCfg);
+                } else {
+                    pageRst = printCom.outputAsPreviewPage(rptTpl, defProperties);
+                }
+                if (pageRst) {
+                    cb(null, pageRst);
+                } else {
+                    cb('Have errors while on going...', null);
+                }
+            } catch (ex) {
+                console.log("报表数据异常: userId " + user_id + ", project id: " + prj_id);
+                console.log(ex);
+                cb('Exception occurs while on going...', null);
+            }
+        });
+
+    });
+}
+
 module.exports = {
     getReportAllPages: function (req, res) {
         let params = JSON.parse(req.body.params),
@@ -511,7 +550,21 @@ module.exports = {
         });
     },
 
-    getSummaryReportPages: function (req, res) {
+    getBillSummaryReportPages: function (req, res) {
+        let params = JSON.parse(req.body.params),
+            rpt_id = params.rpt_tpl_id,
+            prjIds = params.prjIds,
+            pageSize = params.pageSize,
+            orientation = params.orientation,
+            customizeCfg = params.custCfg
+        ;
+        let user_id = req.session.sessionUser.id;
+        getBillsSummaryReportPages(user_id, prjIds, rpt_id, pageSize, orientation, customizeCfg, null, JV.OUTPUT_TYPE_NORMAL, function (err, pageRst) {
+            callback(req, res, err, pageRst);
+        });
+    },
+
+    getGljSummaryReportPages: function (req, res) {
         let params = JSON.parse(req.body.params),
             rpt_id = params.rpt_tpl_id,
             prjIds = params.prjIds,
@@ -520,7 +573,7 @@ module.exports = {
             customizeCfg = params.custCfg
         ;
         let user_id = req.session.sessionUser.id;
-        getSummaryReportPages(user_id, prjIds, rpt_id, pageSize, orientation, customizeCfg, null, JV.OUTPUT_TYPE_NORMAL, function (err, pageRst) {
+        getGljSummaryReportPages(user_id, prjIds, rpt_id, pageSize, orientation, customizeCfg, null, JV.OUTPUT_TYPE_NORMAL, function (err, pageRst) {
             callback(req, res, err, pageRst);
         });
     },

+ 7 - 2
modules/reports/facade/rpt_tpl_data_facade.js

@@ -11,7 +11,8 @@ let projectFacade = require('../../../modules/main/facade/project_facade');
 
 module.exports = {
     prepareProjectData: prepareProjectData,
-    getBudgetSummayDatas: getBudgetSummayDatas
+    getBudgetSummayDatas: getBudgetSummayDatas,
+    getGLJSummayDatas: getGLJSummayDatas
 };
 
 function prepareProjectData(userId, prjId, filter, callback) {
@@ -44,4 +45,8 @@ function prepareProjectData(userId, prjId, filter, callback) {
 
 async function getBudgetSummayDatas(prjIds) {
     return await projectFacade.getBudgetSummayDatas(prjIds);
-}
+}
+
+async function getGLJSummayDatas(prjIds) {
+    return await projectFacade.getGLJSummayDatas(prjIds);
+}

+ 2 - 1
modules/reports/routes/report_router.js

@@ -30,7 +30,8 @@ module.exports =function (app) {
     rptRouter.post('/createExcelFiles', reportController.createExcelFiles);
     rptRouter.post('/createExcelFilesInOneBook', reportController.createExcelFilesInOneBook);
     rptRouter.post('/createPdfFiles', reportController.createPdfFiles);
-    rptRouter.post('/getBillsSummaryReport', reportController.getSummaryReportPages);
+    rptRouter.post('/getBillsSummaryReport', reportController.getBillSummaryReportPages);
+    rptRouter.post('/getGljSummaryReport', reportController.getGljSummaryReportPages);
 
     rptRouter.get('/getExcelInOneBook/:prj_id/:rpt_ids/:size/:rptName/:option', reportController.getExcelInOneBook);
     rptRouter.get('/getExcel/:prj_id/:rpt_id/:size/:orientation/:rptName/:isOneSheet/:option', reportController.getExcel);

+ 2 - 2
modules/reports/rpt_component/jpc_flow_tab.js

@@ -1310,13 +1310,13 @@ function setupControl(mergeCell, controls) {
             "ShowZero": orgCtrl.ShowZero,
             "Horizon": orgCtrl.Horizon,
             "Vertical": orgCtrl.Vertical,
-            "Wrap": "T",
+            "Wrap": (mergeCell[JV.PROP_IS_AUTO_HEIGHT])?'T':'F',
             "VerticalForExcel": "center"
         };
     } else {
         mergeCell[JV.PROP_CONTROL].Shrink = "T";
         mergeCell[JV.PROP_CONTROL].Vertical = "top";
-        mergeCell[JV.PROP_CONTROL].Wrap = "T";
+        mergeCell[JV.PROP_CONTROL].Wrap = (mergeCell[JV.PROP_IS_AUTO_HEIGHT])?'T':'F',
         mergeCell[JV.PROP_CONTROL].VerticalForExcel = "center";
         orgCtrl = mergeCell[JV.PROP_CONTROL];
     }

+ 22 - 3
modules/reports/util/rpt_pdf_util.js

@@ -84,7 +84,7 @@ function export_pdf_file (pageData, paperSize, fName, callback) {
 
     function private_drawCell(cell, fonts, styles, controls, mergedBand) {
         doc.save();
-        //doc.translate(0.5,0.5);
+        // doc.translate(0.5,0.5); //跟H5的canvas不同,不需要这样切换
         let style = styles[cell[JV.PROP_STYLE]];
         if (style) {
             let isNeedMergeBand = private_chkIfInMergedBand(mergedBand, cell);
@@ -133,9 +133,28 @@ function export_pdf_file (pageData, paperSize, fName, callback) {
             }
             let height = cell[JV.PROP_AREA][JV.PROP_BOTTOM] - cell[JV.PROP_AREA][JV.PROP_TOP];
             let area = [cell[JV.PROP_AREA][JV.PROP_LEFT] + offsetX, cell[JV.PROP_AREA][JV.PROP_TOP] + offsetY, cell[JV.PROP_AREA][JV.PROP_RIGHT] + offsetX, cell[JV.PROP_AREA][JV.PROP_BOTTOM] + offsetY];
+            let ah = height;
+            let restTopH = 0, restBottomH = 0;
+            if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_CLOSE_OUTPUT]] === 'T') {
+                ah = (parseFloat(font[JV.FONT_PROPS[1]]) + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP] + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM]) * values.length;
+                let restH = height - ah;
+                if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'center') {
+                    restTopH = restH / 2;
+                    restBottomH = restH / 2;
+                } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'bottom') {
+                    restBottomH = restH;
+                } else {
+                    restTopH = restH;
+                }
+            }
             for (let i = 0; i < values.length; i++) {
-                area[JV.IDX_TOP] = cell[JV.PROP_AREA][JV.PROP_TOP] + i * (height / values.length) + offsetY;
-                area[JV.IDX_BOTTOM] = cell[JV.PROP_AREA][JV.PROP_TOP] + (i + 1) * (height / values.length) + offsetY;
+                // area[JV.IDX_TOP] = cell[JV.PROP_AREA][JV.PROP_TOP] + i * (height / values.length) + offsetY;
+                // area[JV.IDX_BOTTOM] = cell[JV.PROP_AREA][JV.PROP_TOP] + (i + 1) * (height / values.length) + offsetY;
+                area[JV.IDX_TOP] = cell[JV.PROP_AREA][JV.PROP_TOP] + i * (ah / values.length) + offsetY + restTopH;
+                area[JV.IDX_BOTTOM] = cell[JV.PROP_AREA][JV.PROP_TOP] + (i + 1) * (ah / values.length) + offsetY + restTopH;
+                if (values[i] === null || values[i] === undefined || values[i] === 'null') {
+                    values[i] = "";
+                }
                 private_drawText(values[i], area, font, control);
             }
         }

+ 14 - 1
modules/users/controllers/cld_controller.js

@@ -148,6 +148,19 @@ class CLDController {
             response.json({error: 1, msg: err});
         }
     }
+
+    /**
+     * 获取编办列表
+     *
+     * @param request
+     * @param response
+     * @return {Promise.<void>}
+     */
+    async getCompilationList (request, response) {
+        let compilationModel = new CompilationModel();
+        const compilationList = await compilationModel.getList();
+        response.json({error: 0, msg: 'success', data: compilationList});
+    }
 }
 
-export default CLDController;
+export default CLDController;

+ 82 - 5
modules/users/controllers/login_controller.js

@@ -22,12 +22,89 @@ class LoginController {
      * @return {void}
      */
     async index(request, response) {
-        let sessionUser = request.session.sessionUser;
-        if (sessionUser !== undefined && sessionUser.ssoId >= 0) {
-            return response.redirect("/pm");
-        }
+        // 判断是否有带token和ssoID参数
+        if (request.query.ssoID !== undefined && request.query.token !== undefined) {
+            let ssoID = request.query.ssoID;
+            let token = request.query.token;
+            let preferenceSetting = {};
+            let compilationList = [];
+            try {
+                let userModel = new UserModel();
+                // 调用接口验证登录信息
+                let responseData = await userModel.getInfoFromSSO2(ssoID, token);
+                // 先判断返回值是否为未激活状态
+                if ( responseData === '-3') {
+                    throw '因邮箱未完成认证,账号未激活;去<a href="https://sso.smartcost.com.cn" target="_blank">激活</a>。';
+                }
+                if ( responseData === '-2') {
+                    throw 'token已过期,请重新登录Z+获取';
+                }
+                responseData = JSON.parse(responseData);
+                if (typeof responseData !== 'object') {
+                    throw 'ssoId错误或token过期';
+                }
+
+                if (responseData.length <= 0) {
+                    throw '接口返回数据错误';
+                }
+                let userData = responseData[0];
+                let sessionUser = {
+                    ssoId: userData.id,
+                    username: userData.username,
+                    email: userData.useremail,
+                    mobile: userData.mobile,
+                };
+
+                request.session.sessionUser = sessionUser;
+                // 记录用户数据到数据库
+                let result = await userModel.markUser(sessionUser, request);
+
+                // 获取偏好设置
+                let settingModel = new SettingModel();
+                preferenceSetting = await settingModel.getPreferenceSetting(request.session.sessionUser.id);
+                if (!result) {
+                    throw '标记用户信息失败!';
+                }
+                let compilationModel = new CompilationModel();
+                if (preferenceSetting.login_ask === 1 || preferenceSetting.select_version === ''){
+                    preferenceSetting.login_ask = 1;
+                    compilationList = await  compilationModel.getList();
+                } else {
+                    compilationList = [];
+                }
+                // 获取编办信息
+                let sessionCompilation = request.session.sessionCompilation;
 
-        response.render('users/html/login', {});
+                if (preferenceSetting.login_ask === 0 && !sessionCompilation &&
+                    preferenceSetting.select_version !== '') {
+                    let compilationData = await compilationModel.getCompilationById(preferenceSetting.select_version);
+                    // 判断当前用户的是使用免费版还是专业版
+                    let compilationVersion = await userModel.getVersionFromUpgrade(sessionUser.ssoId, preferenceSetting.select_version);
+                    request.session.compilationVersion = compilationVersion;
+                    request.session.sessionCompilation = compilationData;
+                    if(request.session.sessionUser.latest_used !== preferenceSetting.select_version) await userModel.updateLatestUsed(request.session.sessionUser.id,preferenceSetting.select_version);
+                }
+                console.log(`${request.session.sessionUser.real_name}--id:${request.session.sessionUser.id}--登录了系统`);
+                if (preferenceSetting.login_ask === 1 || preferenceSetting.select_version === '') {
+                    let renderData = {
+                        versionData: compilationList,
+                    };
+                    response.render('users/html/login-ver', renderData);
+                } else {
+                    return response.redirect("/pm");
+                }
+            } catch (error) {
+                console.log(error)
+                return response.redirect("/login");
+            }
+        } else {
+            let sessionUser = request.session.sessionUser;
+            if (sessionUser !== undefined && sessionUser.ssoId >= 0) {
+                return response.redirect("/pm");
+            } else {
+                response.render('users/html/login', {});
+            }
+        }
     }
 
     /**

+ 32 - 0
modules/users/models/user_model.js

@@ -81,6 +81,38 @@ class UserModel extends BaseModel {
     }
 
     /**
+     * 根据用户id和token调用SSO接口获取信息
+     *
+     * @param {string} username
+     * @param {string} password
+     * @return {object}
+     */
+    async getInfoFromSSO2(ssoID, token) {
+        let postData = {
+            url: 'http://sso.smartcost.com.cn/building/api/login/auth',
+            form: {ssoID: ssoID, token: token},
+            encoding: 'utf8'
+        };
+        return new Promise(function (resolve, reject) {
+            try {
+                // 请求接口
+                Request.post(postData, function (err, postResponse, body) {
+                    if (err) {
+                        console.log('111');
+                        throw '请求错误';
+                    }
+                    if (postResponse.statusCode !== 200) {
+                        throw '通行证验证失败!';
+                    }
+                    resolve(body);
+                });
+            } catch (error) {
+                reject([]);
+            }
+        });
+    }
+
+    /**
      * 标记用户
      *
      * @param {object} userData

+ 3 - 1
modules/users/routes/cld_route.js

@@ -20,7 +20,9 @@ module.exports = function (app) {
 
     router.get('/getUsersAndCompilation', cldController.getUsersAndCompilationList);
 
+    router.get('/getCompilationList', cldController.getCompilationList);
+
     router.post('/setUserUpgrade', cldController.setUsersUpgrade);
 
     app.use('/cld',router)
-};
+};

+ 2 - 0
public/web/common_util.js

@@ -58,9 +58,11 @@ function seqString(num,length){
 };
 
 function customRowHeader(sheet, dataLength) {
+    sheet.suspendPaint();   //提升焦点变换性能 2019年4月15日
     for (let i = 0; i < dataLength; i++) {
         sheet.setValue(i, 0, `F${i + 1}`, GC.Spread.Sheets.SheetArea.rowHeader);
     }
+    sheet.resumePaint();   //提升焦点变换性能 2019年4月12日
 };
 
 function changePropNames(object, oldNames, newNames) {

+ 6 - 0
public/web/rpt_value_define.js

@@ -250,6 +250,12 @@ const JV = {
         H: ["left", "center", "right"],
         V: ["top", "center", "bottom"]
     },
+    H_ALIGN_IDX_LEFT : 0,
+    H_ALIGN_IDX_CENTER : 1,
+    H_ALIGN_IDX_RIGHT : 2,
+    V_ALIGN_IDX_TOP : 0,
+    V_ALIGN_IDX_CENTER : 1,
+    V_ALIGN_IDX_BOTTOM : 2,
 
     CAL_TYPE:["percentage","abstract"],
     CAL_TYPE_PERCENTAGE: 0,

+ 18 - 11
server.js

@@ -64,19 +64,26 @@ app.use(async function (req, res, next) {
         next();
     } else {
         try {
-            // 判断session
-            let sessionUser = req.session.sessionUser;
-            if (!sessionUser) {
-                //处理 ajax 请求 session 过期问题
-                if (req.headers["x-requested-with"] != null
-                    && req.headers["x-requested-with"] == "XMLHttpRequest"
-                    && req.url != "/login") {
-                    return res.json({ret_code: 99, ret_msg: '登录信息失效,请您重新登录'});
-                }else {
-                    throw 'session error';
+            if (req.query.ssoID !== undefined && req.query.ssoID !== null && req.query.token !== undefined && req.query.token !== null) {
+                delete req.session.sessionUser;
+                delete req.session.sessionCompilation;
+                return res.redirect('/login' + url);
+            } else {
+                // 判断session
+                let sessionUser = req.session.sessionUser;
+                if (!sessionUser) {
+
+                    //处理 ajax 请求 session 过期问题
+                    if (req.headers["x-requested-with"] != null
+                        && req.headers["x-requested-with"] == "XMLHttpRequest"
+                        && req.url != "/login") {
+                        return res.json({ret_code: 99, ret_msg: '登录信息失效,请您重新登录'});
+                    } else {
+                        throw 'session error';
+                    }
                 }
+                res.locals.sessionUser = sessionUser;
             }
-            res.locals.sessionUser = sessionUser;
         } catch (error) {
             // 最后一个页面存入session
             req.session.lastPage = url;

+ 4 - 4
test/unit/reports/test_rpt_test_template.js

@@ -102,7 +102,7 @@ test('测试 - 测试模板啦: ', function (t) {
             if (!err) {
                 try {
                     let dt = new Date();
-                    fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/YangHuCost/tmp/rptTplRawDataObject_测试模板.jsp");
+                    // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/YangHuCost/tmp/rptTplRawDataObject_测试模板.jsp");
                     let tplData = rptDataUtil.assembleData(rawDataObj);
                     // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/YangHuCost/tmp/rptTplRawDataAfterCacl_测试模板.jsp");
                     // fsUtil.writeObjToFile(tplData, "D:/GitHome/YangHuCost/tmp/rptTplAssembledData_测试模板.jsp");
@@ -123,9 +123,9 @@ test('测试 - 测试模板啦: ', function (t) {
                     }
                     if (pageRst) {
                         // fsUtil.writeObjToFile(pageRst, "D:/GitHome/YangHuCost/tmp/testBuiltPageResult_测试模板" + dt.getTime() + ".jsp");
-                        // rpt_xl_util.exportExcel(pageRst, pagesize, "local_test_rpt_excel", true, null, null, function(uuidName){
-                        //     console.log("excel uuid: " + uuidName);
-                        // });
+                        rpt_xl_util.exportExcel(pageRst, pagesize, "local_test_rpt_excel", true, null, null, function(uuidName){
+                            console.log("excel uuid: " + uuidName);
+                        });
                         // rpt_pdf_util.export_pdf_file(pageRst, pagesize, 'local_test_rpt_pdf', function(uuidName){
                         //     console.log("pdf uuid: " + uuidName);
                         // });

+ 51 - 3
test/unit/reports/test_summary_multi_prjs.js

@@ -14,9 +14,10 @@ let dbm = require("../../../config/db/db_manager");
 let rpt_cfg = require('./rpt_cfg');
 dbm.connect(process.env.NODE_ENV);
 
-let demoPrjs = [618, 635]; //
+let demoPrjs = [1510, 1511]; //
 // let demoRptId = 68; //01-2
-let demoRptId = 72; //01-1
+// let demoRptId = 72; //01-1
+let demoRptId = 73; //02-2
 let pagesize = "A4";
 let userId_Leng = "5c3ffa9aa0a92732f41216e0"; //小冷User Id (养护的)
 // let userId_me = "5b6a60b1c4ba33000dd417c0"; //我的
@@ -44,7 +45,8 @@ fs.readFile(__dirname.slice(0, __dirname.length - 18) + '/public/web/date_util.j
     eval(data);
 });
 
-test('测试 - 测试模板啦: ', function (t) {
+/*
+test('测试 - 测试清单汇总: ', function (t) {
     rptTplDataFacade.getBudgetSummayDatas(demoPrjs).then(function(summaryRst) {
         //console.log(summaryRst);
         rptTplFacade.getRptTemplate(demoRptId).then(function(rptTpl) {
@@ -88,6 +90,52 @@ test('测试 - 测试模板啦: ', function (t) {
         });
     });
 });
+/*/
+test('测试 - 测试工料机汇总: ', function (t) {
+    rptTplDataFacade.getGLJSummayDatas(demoPrjs).then(function(summaryRst) {
+        // console.log(summaryRst);
+        rptTplFacade.getRptTemplate(demoRptId).then(function(rptTpl) {
+            try {
+                let dt = new Date();
+                // fsUtil.writeObjToFile(summaryRst, "D:/GitHome/YangHuCost/tmp/02_2原始数据.jsp");
+                let rptDataUtil = new rptDataExtractor();
+                rptDataUtil.initialize(rptTpl._doc);
+                let tplData = rptDataUtil.assembleData(summaryRst);
+                // fsUtil.writeObjToFile(summaryRst, "D:/GitHome/YangHuCost/tmp/多清单汇总表(01_2)整理后数据.jsp");
+                // fsUtil.writeObjToFile(tplData, "D:/GitHome/YangHuCost/tmp/rptTplAssembledData_测试模板.jsp");
+                //it's time to build the report!!!
+                let printCom = JpcEx.createNew();
+                rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pagesize;
+                let defProperties = rpt_cfg;
+                let dftOption = JV.PAGING_OPTION_NORMAL;
+                printCom.initialize(rptTpl);
+                printCom.analyzeData(rptTpl, tplData, defProperties, dftOption, JV.OUTPUT_TYPE_EXCEL);
+                let maxPages = printCom.totalPages;
+                let customizeCfg = {"fillZero": true};
+                let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties, customizeCfg);
+                if (pageRst) {
+                    fsUtil.writeObjToFile(pageRst, "D:/GitHome/YangHuCost/tmp/多清单汇总表(02_2)page数据" + dt.getTime() + ".jsp");
+                    // rpt_xl_util.exportExcel(pageRst, pagesize, "local_test_rpt_excel", true, null, null, function(uuidName){
+                    //     console.log("excel uuid: " + uuidName);
+                    // });
+                    // rpt_pdf_util.export_pdf_file(pageRst, pagesize, 'local_test_rpt_pdf', function(uuidName){
+                    //     console.log("pdf uuid: " + uuidName);
+                    // });
+                } else {
+                    console.log("oh! no pages were created!");
+                }
+            } catch (ex) {
+                console.log(ex);
+                t.pass('pass with exception!');
+                t.end();
+            }
+
+            t.pass('pass succeeded!');
+            t.end();
+        });
+    });
+});
+//*/
 
 test('close the connection', function (t) {
     setTimeout(function () {

+ 15 - 1
web/building_saas/css/main.css

@@ -36,6 +36,9 @@ a{
 .modal-footer{
     padding:.8rem 1rem;
 }
+.form-check .form-check-label,.form-radio .form-check-label{
+    cursor: pointer;
+}
 /*自定义css*/
 .login-body,.login-html{
     height:100%;
@@ -59,6 +62,10 @@ a{
     background:#fff;
     box-shadow:#333 1px 1px 5px
 }
+.ver-panel {
+    width:100%;
+    top:10%;
+}
 .header {
     border-bottom: 1px solid #ccc
 }
@@ -194,6 +201,9 @@ a{
     overflow: hidden;
     width:100%
 }
+.main-data-top-side{
+    overflow: hidden
+}
 .main-content.col-lg-8{
     width:66.666667%
 }
@@ -531,6 +541,7 @@ a{
 }
 .box-text-style {
     font-size: 12px;
+    font-family:"Microsoft YaHei"
 }
 .box-text-style p{
     margin:0 0 2px 0;
@@ -546,6 +557,9 @@ a{
 .box-text-style table p{
     text-align: left;
 }
+.sys-setting-nav .nav-link{
+    padding:.3rem 1rem;
+}
 /*快捷切换单位工程*/
 .navbar-crumb{
     position: relative;
@@ -633,4 +647,4 @@ a{
         white-space: nowrap;
         max-width:80px;
     }
-}
+}

+ 1 - 1
web/building_saas/main/js/controllers/material_controller.js

@@ -181,7 +181,7 @@ let MaterialController = {
         $("#subSpread").removeClass("ration_glj_spread");
         $("#subSpread").css("width",""); //左右拖动调整表格大小的时候会设置css属性,所以隐藏这个div的时候也要把这个属性给去掉
         $("#replaceM").hide();
-        refreshSubSpread();
+        //refreshSubSpread();   //提升焦点变换性能 2019年4月15日
     },
     showReplaceSpread:function(node){
         $("#replaceM").addClass("ovf-hidden");

+ 1 - 0
web/building_saas/main/js/views/glj_view.js

@@ -16,6 +16,7 @@ var gljOprObj = {
     GLJSelection: [],
     selectedGLJClass: null,
     parentNodeIds: {},
+    preActiveTab: '', //提升焦点变换性能 2019年4月15日
     activeTab: '#linkGLJ',
     rationTab:'#linkGLJ',
     billsTab:'#linkGCLMX',

+ 18 - 4
web/building_saas/main/js/views/sub_view.js

@@ -9,6 +9,7 @@
 
 let subSpread = null;
 let subObj = {
+    fisrtLinked: true,  //提升焦点变换性能 2019年4月15日
     TZJNRrePercent:null,
     showGljSubTab:false,
     initSubSpread:function () {
@@ -124,7 +125,9 @@ let subObj = {
     showGljSubTabData:function () {
         this.initGljSubTab();
         zmhs_obj.showDatas();
-        refreshSubSpread();
+        if (gljOprObj.activeTab !== gljOprObj.preActiveTab) {   //提高焦点变换性能 2019年4月15日
+            refreshSubSpread();
+        }
     }
 };
 
@@ -134,13 +137,19 @@ $("#linkGLJ").click(function(){
     $("#subItems").children().hide();//控制显示subSpread,隐藏特征及内容spread
     //show
     //MaterialController.showReplaceDiv();
-    subObj.showGljSubTabData();
+    //subObj.showGljSubTabData();   //提升焦点变换性能 2019年4月15日
     $("#subSpread").show();
     $("#itemTextDiv").show();
     $("#gljItemTab").show();
     subSpread.options.allowUserDragFill = false;
-    refreshSubSpread();
+    //refreshSubSpread();   //提升焦点变换性能 2019年4月15日
     subSpread.setActiveSheetIndex(0);
+    //提高焦点变换性能 2019年4月15日--
+    if (!subObj.fisrtLinked) {
+        gljOprObj.preActiveTab = gljOprObj.activeTab;
+    }
+    subObj.fisrtLinked = false;
+    //--
     gljOprObj.activeTab='#linkGLJ';
     gljOprObj.setNodeShowTab();
 });
@@ -161,8 +170,9 @@ $("#linkGCLMX").click(function(){
     MaterialController.hideReplaceDiv();
     $("#subSpread").show();
     subSpread.options.allowUserDragFill = true;
-    refreshSubSpread();
+    //refreshSubSpread(); //提升焦点变换性能 2019年4月15日
     subSpread.setActiveSheetIndex(1);
+    gljOprObj.preActiveTab = gljOprObj.activeTab;   //提升焦点变换性能 2019年4月15日
     gljOprObj.activeTab='#linkGCLMX';
     gljOprObj.setNodeShowTab();
 });
@@ -179,6 +189,7 @@ $("#linkJSCX").click(function(){        // 计算程序
         projectObj.mainController.tree.selected = projectObj.mainController.tree.firstNode();
     let sel = projectObj.mainController.tree.selected;
     calcProgramObj.refreshCalcProgram(sel, 3);
+    gljOprObj.preActiveTab = gljOprObj.activeTab;   //提升焦点变换性能 2019年4月15日
     gljOprObj.activeTab='#linkJSCX';
     gljOprObj.setNodeShowTab();
 });
@@ -190,6 +201,7 @@ $("#linkZMHS").click(function(){        // 子目换算
     $("#tabZMHS").show();
     zmhs_obj.loadSideResize();
     refreshSubSpread();
+    gljOprObj.preActiveTab = gljOprObj.activeTab;   //提升焦点变换性能 2019年4月15日
     gljOprObj.activeTab='#linkZMHS';
     gljOprObj.setNodeShowTab();
 });
@@ -197,12 +209,14 @@ $("#linkMBZM").click(function(){        // 模板子目
     $("#subItems").children().hide();
     $("#tabMBZM").show();
     refreshSubSpread();
+    gljOprObj.preActiveTab = gljOprObj.activeTab;   //提升焦点变换性能 2019年4月15日
     gljOprObj.activeTab='#linkMBZM';
     gljOprObj.setNodeShowTab();
 });
 
 //清单精灵
 $('#linkQDJL').click(function () {
+    gljOprObj.preActiveTab = gljOprObj.activeTab;   //提升焦点变换性能 2019年4月15日
     gljOprObj.activeTab='#linkQDJL';
     $("#subItems").children().hide();
     $('#qdjl').show();

+ 5 - 1
web/building_saas/report/html/rpt_select_projects.html

@@ -12,10 +12,14 @@
                     <ul id="prjFolderTree" class="ztree"></ul>
                 </div>
             </div>
-            <div class="modal-footer">
+            <div class="modal-footer" id="divReqBillSummary" style="display:none">
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
                 <a onclick="zTreeOprObj.requestBillsSummaryRpt()" class="btn btn-primary" data-dismiss="modal">确定</a>
             </div>
+            <div class="modal-footer" id="divReqGljSummary" style="display:none">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <a onclick="zTreeOprObj.requestGljSummaryRpt()" class="btn btn-primary" data-dismiss="modal">确定</a>
+            </div>
         </div>
     </div>
 </div>

+ 18 - 2
web/building_saas/report/js/jpc_output.js

@@ -263,9 +263,25 @@ let JpcCanvasOutput = {
                 }
                 let height = cell[JV.PROP_AREA][JV.PROP_BOTTOM] - cell[JV.PROP_AREA][JV.PROP_TOP];
                 let area = [cell[JV.PROP_AREA][JV.PROP_LEFT] + me.offsetX, cell[JV.PROP_AREA][JV.PROP_TOP] + me.offsetY, cell[JV.PROP_AREA][JV.PROP_RIGHT] + me.offsetX, cell[JV.PROP_AREA][JV.PROP_BOTTOM] + me.offsetY];
+                let ah = height;
+                let restTopH = 0, restBottomH = 0;
+                if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_CLOSE_OUTPUT]] === 'T') {
+                    ah = (parseFloat(font[JV.FONT_PROPS[1]]) + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP] + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM]) * values.length;
+                    let restH = height - ah;
+                    if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'center') {
+                        restTopH = restH / 2;
+                        restBottomH = restH / 2;
+                    } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'bottom') {
+                        restBottomH = restH;
+                    } else {
+                        restTopH = restH;
+                    }
+                }
                 for (let i = 0; i < values.length; i++) {
-                    area[JV.IDX_TOP] = cell[JV.PROP_AREA][JV.PROP_TOP] + i * (height / values.length) + me.offsetY;
-                    area[JV.IDX_BOTTOM] = cell[JV.PROP_AREA][JV.PROP_TOP] + (i + 1) * (height / values.length) + me.offsetY;
+                    // area[JV.IDX_TOP] = cell[JV.PROP_AREA][JV.PROP_TOP] + i * (height / values.length) + me.offsetY;
+                    // area[JV.IDX_BOTTOM] = cell[JV.PROP_AREA][JV.PROP_TOP] + (i + 1) * (height / values.length) + me.offsetY;
+                    area[JV.IDX_TOP] = cell[JV.PROP_AREA][JV.PROP_TOP] + i * (ah / values.length) + me.offsetY + restTopH;
+                    area[JV.IDX_BOTTOM] = cell[JV.PROP_AREA][JV.PROP_TOP] + (i + 1) * (ah / values.length) + me.offsetY + restTopH;
                     if (values[i] === null || values[i] === undefined || values[i] === 'null') {
                         values[i] = "";
                     }

+ 4 - 1
web/building_saas/report/js/jpc_output_value_define.js

@@ -33,12 +33,15 @@ let JV = {
     IDX_RIGHT: 2,
     IDX_BOTTOM: 3,
 
-    CONTROL_PROPS: ["Shrink", "ShowZero", "Horizon", "Vertical", "Wrap"],
+    CONTROL_PROPS: ["Shrink", "ShowZero", "Horizon", "Vertical", "Wrap", "VerticalForExcel", "ShrinkFirst", "CloseOutput"],
     CONTROL_PROP_IDX_SHRINK: 0,
     CONTROL_PROP_IDX_SHOW_ZERO: 1,
     CONTROL_PROP_IDX_HORIZON: 2,
     CONTROL_PROP_IDX_VERTICAL: 3,
     CONTROL_PROP_IDX_WRAP: 4,
+    CONTROL_PROP_IDX_VERTICAL_EXCEL: 5,
+    CONTROL_PROP_IDX_SHRINK_FIRST: 6,
+    CONTROL_PROP_IDX_CLOSE_OUTPUT: 7,
     BORDER_STYLE_PROPS: ["LineWeight", "DashStyle", "Color"],
     PROP_LINE_WEIGHT: "LineWeight",
     PROP_DASH_STYLE: "DashStyle",

+ 66 - 9
web/building_saas/report/js/rpt_main.js

@@ -215,11 +215,13 @@ let zTreeOprObj = {
     onClick: function(event,treeId,treeNode) {
         let me = zTreeOprObj;
         if (treeNode.nodeType === TPL_TYPE_TEMPLATE && treeNode.refId > 0) {
-            if (treeNode.hasOwnProperty('flags') && treeNode.flags.hasOwnProperty('reportType')
-                && treeNode['flags']['reportType'] === 'billSummary') {
-                me.currentNode = treeNode;
-                me.requestPrjFolder();
-                me.countChkedRptTpl();
+            me.currentNode = treeNode;
+            if (treeNode.hasOwnProperty('flags') && treeNode.flags.hasOwnProperty('reportType') && treeNode['flags']['reportType'] !== 'NA') {
+                if (treeNode['flags']['reportType'] === 'billSummary') {
+                    me.requestPrjFolderForBillsSummary();
+                } else if (treeNode['flags']['reportType'] === 'gljSummary') {
+                    me.requestPrjFolderForGljSummary();
+                }
             } else {
                 let params = {};
                 let pageSize = rptControlObj.getCurrentPageSize();
@@ -227,10 +229,9 @@ let zTreeOprObj = {
                 params.rpt_tpl_id = treeNode.refId;
                 params.prj_id = projectObj.project.projectInfo.ID;
                 params.custCfg = me.reportPageCfg;
-                me.currentNode = treeNode;
                 me.requestReport(params);
-                me.countChkedRptTpl();
             }
+            me.countChkedRptTpl();
         }
     },
     changePageSize: function(dom) {
@@ -304,8 +305,7 @@ let zTreeOprObj = {
             }
         );
     },
-    requestPrjFolder: function () {
-        //$("#show_project_folder").trigger("click");
+    requestPrjFolderCommon: function () {
         let me = zTreeOprObj;
         hintBox.waitBox();
         $.ajax({
@@ -339,6 +339,18 @@ let zTreeOprObj = {
             }
         });
     },
+    requestPrjFolderForBillsSummary: function () {
+        let me = zTreeOprObj;
+        $("#divReqBillSummary")[0].style.display = "";
+        $("#divReqGljSummary")[0].style.display = "none";
+        me.requestPrjFolderCommon();
+    },
+    requestPrjFolderForGljSummary: function () {
+        let me = zTreeOprObj;
+        $("#divReqBillSummary")[0].style.display = "none";
+        $("#divReqGljSummary")[0].style.display = "";
+        me.requestPrjFolderCommon();
+    },
     requestBillsSummaryRpt: function () {
         let me = zTreeOprObj;
         let nodes = me.prjFolderTreeObj.getCheckedNodes(true);
@@ -384,6 +396,51 @@ let zTreeOprObj = {
             );
         }
     },
+    requestGljSummaryRpt: function () {
+        let me = zTreeOprObj;
+        let nodes = me.prjFolderTreeObj.getCheckedNodes(true);
+        if (nodes.length > 0) {
+            hintBox.waitBox();
+            let params = {};
+            params.pageSize = rptControlObj.getCurrentPageSize();
+            params.rpt_tpl_id = me.currentNode.refId;
+            params.custCfg = me.reportPageCfg;
+            params.prjIds = [];
+            for (let node of nodes) {
+                params.prjIds.push(node.ID);
+            }
+            CommonAjax.postEx("report_api/getGljSummaryReport", params, 26000, true,
+                function(result){
+                    hintBox.unWaitBox();
+                    let pageRst = result;
+                    let canvas = document.getElementById("rptCanvas");
+                    if (pageRst && pageRst.items && pageRst.items.length > 0) {
+                        me.resetAfter(pageRst);
+                        me.currentRptPageRst = pageRst;
+                        me.maxPages = pageRst.items.length;
+                        me.currentPage = 1;
+                        me.displayPageValue();
+                        let size = JpcCanvasOutput.getReportSizeInPixel(me.currentRptPageRst, getScreenDPI());
+                        canvas.width = size[0] + 20;
+                        if (size[1] > size[0]) {
+                            canvas.height = size[1] + 100;
+                        } else {
+                            canvas.height = size[1] + 50;
+                        }
+                        me.showPage(1, canvas);
+                    } else {
+                        //返回了无数据表
+                        JpcCanvasOutput.cleanCanvas(canvas);
+                        JpcCanvasOutput.drawPageBorder(me.currentRptPageRst, canvas, getScreenDPI());
+                    }
+                }, function(err){
+                    hintBox.unWaitBox();
+                }, function(ex){
+                    hintBox.unWaitBox();
+                }
+            );
+        }
+    },
     showPage: function (pageNum, canvas) {
         let me = zTreeOprObj;
         if (pageNum >= 1 && pageNum <= me.maxPages) {

+ 20 - 4
web/building_saas/report/js/rpt_print.js

@@ -243,14 +243,14 @@ function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canv
                 ";font-size:" + innerDftFontHeight + "pt' x='" +
                 x +"' y='" + y + "' text-anchor='" + text_anchor + "' xml:space='preserve'" + HtoVStr + ">" + innerTxt + "</text>");
         }
-        let actLines = private_splitString(textValue, (area[JV.IDX_RIGHT] - area[JV.IDX_LEFT]), ctx);
+        let actLines = private_splitString(textValue, (area[JV.IDX_RIGHT] - area[JV.IDX_LEFT] - JV.OUTPUT_OFFSET[JV.IDX_LEFT] - JV.OUTPUT_OFFSET[JV.IDX_RIGHT]), ctx);
         if (actLines.length === 1 || (control && control.Shrink !== 'T')) {
             inner_build_text(textValue, area);
         } else {
             while (true) {
                 if (dftFontHeight > 6) {
                     let lines = Math.floor((area[JV.IDX_BOTTOM] - area[JV.IDX_TOP]) / (dftFontHeight + JV.OUTPUT_OFFSET[JV.IDX_BOTTOM] + JV.OUTPUT_OFFSET[JV.IDX_TOP] + 4));
-                    lines = (lines === 0)?1:lines;
+                    lines = (lines === 0 || (control.Shrink === 'T' && control.ShrinkFirst === 'T'))?1:lines;
                     actLines = private_splitString(textValue, (area[JV.IDX_RIGHT] - area[JV.IDX_LEFT] - JV.OUTPUT_OFFSET[JV.IDX_LEFT] - JV.OUTPUT_OFFSET[JV.IDX_RIGHT]), ctx);
                     if (lines >= actLines.length) {
                         let aH = dftFontHeight + JV.OUTPUT_OFFSET[JV.IDX_BOTTOM] + JV.OUTPUT_OFFSET[JV.IDX_TOP] + 4;
@@ -283,9 +283,25 @@ function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canv
             }
         }
     };
+    let ah = height;
+    let restTopH = 0, restBottomH = 0;
+    if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_CLOSE_OUTPUT]] === 'T') {
+        ah = (parseFloat(font[JV.FONT_PROPS[1]]) + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP] + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM]) * values.length;
+        let restH = height - ah;
+        if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'center') {
+            restTopH = restH / 2;
+            restBottomH = restH / 2;
+        } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'bottom') {
+            restBottomH = restH;
+        } else {
+            restTopH = restH;
+        }
+    }
     for (let vidx = 0; vidx < values.length; vidx++) {
-        area[JV.IDX_TOP] = top + vidx * (height / values.length);
-        area[JV.IDX_BOTTOM] = top + (vidx + 1) * (height / values.length);
+        // area[JV.IDX_TOP] = top + vidx * (height / values.length);
+        // area[JV.IDX_BOTTOM] = top + (vidx + 1) * (height / values.length);
+        area[JV.IDX_TOP] = top + vidx * (ah / values.length) + restTopH;
+        area[JV.IDX_BOTTOM] = top + (vidx + 1) * (ah / values.length) + restTopH;
         inner_draw_text(values[vidx]);
     }
 }

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 53 - 0
web/users/html/login-ver.html