Bläddra i källkod

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

chenshilong 7 år sedan
förälder
incheckning
40e422b1c7

+ 4 - 2
modules/pm/controllers/pm_controller.js

@@ -471,7 +471,8 @@ module.exports = {
         try {
         try {
             let userID = req.session.sessionUser.id;
             let userID = req.session.sessionUser.id;
             let rst = {receive: [], share: []}//接收的、由我分享的
             let rst = {receive: [], share: []}//接收的、由我分享的
-            let shareProjects = await projectModel.find({userID: userID, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}], 'shareInfo.0': {$exists: true}});
+            let shareProjects = await projectModel.find({userID: userID,
+                $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}], compilation: req.session.sessionCompilation._id, 'shareInfo.0': {$exists: true}});
             //项目类型为分享给别人
             //项目类型为分享给别人
             let shareToUserIDs = [];
             let shareToUserIDs = [];
             for(let proj of shareProjects){
             for(let proj of shareProjects){
@@ -499,7 +500,8 @@ module.exports = {
                 }
                 }
             }
             }
             rst.share = shareProjects;
             rst.share = shareProjects;
-            let receiveProjects = await projectModel.find({$or: [{deleteInfo: null}, {'deleteInfo.deleted': false}], 'shareInfo.userID': userID});
+            let receiveProjects = await projectModel.find({
+                $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}], compilation: req.session.sessionCompilation._id, 'shareInfo.userID': userID});
             //设置原项目用户信息
             //设置原项目用户信息
             if(receiveProjects.length > 0){
             if(receiveProjects.length > 0){
                 let orgUserIDs = [];
                 let orgUserIDs = [];

+ 1 - 1
modules/pm/models/project_property_template.js

@@ -6,7 +6,7 @@
 const defaultDecimal = {
 const defaultDecimal = {
     bills: {unitPrice: 2, totalPrice: 2},
     bills: {unitPrice: 2, totalPrice: 2},
     ration: {quantity: 4, unitPrice: 2, totalPrice: 2},
     ration: {quantity: 4, unitPrice: 2, totalPrice: 2},
-    glj: {quantity: 4, unitPrice: 3},
+    glj: {quantity: 4, unitPriceHasMix: 2, unitPrice: 3},
     feeRate: 2,
     feeRate: 2,
     quantity_detail: 4,
     quantity_detail: 4,
     material:5,//三材系数
     material:5,//三材系数

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

@@ -224,7 +224,8 @@ function getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, custo
                     let tplData = rptDataUtil.assembleData(rawDataObj);
                     let tplData = rptDataUtil.assembleData(rawDataObj);
                     let printCom = JpcEx.createNew();
                     let printCom = JpcEx.createNew();
                     if (pageSize) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
                     if (pageSize) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
-                    if (orientation) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] = orientation;
+                    //console.log("orientation: " + (orientation === 'null'));
+                    if (orientation !== 'null') rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] = orientation;
                     let defProperties = rptUtil.getReportDefaultCache();
                     let defProperties = rptUtil.getReportDefaultCache();
                     if (customizeCfg) setupCustomizeCfg(customizeCfg, rptTpl, defProperties);
                     if (customizeCfg) setupCustomizeCfg(customizeCfg, rptTpl, defProperties);
                     let dftOption = option||JV.PAGING_OPTION_NORMAL;
                     let dftOption = option||JV.PAGING_OPTION_NORMAL;
@@ -331,7 +332,7 @@ module.exports = {
         let dftOption = option||JV.PAGING_OPTION_NORMAL;
         let dftOption = option||JV.PAGING_OPTION_NORMAL;
         getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, null, dftOption, function(err, pageRst){
         getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, null, dftOption, function(err, pageRst){
             try {
             try {
-                rpt_xl_util.exportExcel(pageRst, pageSize, rptName, isOneSheet, null, function(newName){
+                rpt_xl_util.exportExcel(pageRst, pageSize, rptName, isOneSheet, null, null, function(newName){
                     res.setHeader('Content-Type', 'application/vnd.openxmlformats');
                     res.setHeader('Content-Type', 'application/vnd.openxmlformats');
                     let rptNameURI = encodeURI(rptName);
                     let rptNameURI = encodeURI(rptName);
                     res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + ".xlsx\"; filename*=utf-8''" + rptNameURI + '.xlsx' );
                     res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + ".xlsx\"; filename*=utf-8''" + rptNameURI + '.xlsx' );
@@ -400,7 +401,7 @@ module.exports = {
         getAllPagesCommonOrg(rpt_id, pageSize, dftOption, function(err, pageRst){
         getAllPagesCommonOrg(rpt_id, pageSize, dftOption, function(err, pageRst){
             fs.writeFileSync('D:/GitHome/ConstructionOperation/tmp/testRpt.js', JSON.stringify(pageRst));
             fs.writeFileSync('D:/GitHome/ConstructionOperation/tmp/testRpt.js', JSON.stringify(pageRst));
             try {
             try {
-                rpt_xl_util.exportExcel(pageRst, pageSize, rptName, isOneSheet, null, function(newName){
+                rpt_xl_util.exportExcel(pageRst, pageSize, rptName, isOneSheet, null, null, function(newName){
                     res.setHeader('Content-Type', 'application/vnd.openxmlformats');
                     res.setHeader('Content-Type', 'application/vnd.openxmlformats');
                     res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".xlsx");
                     res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".xlsx");
                     let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.xlsx');
                     let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.xlsx');

+ 16 - 8
modules/reports/util/rpt_excel_util.js

@@ -287,7 +287,7 @@ function writeSharedString(sharedStrList){
     }
     }
     return rst;
     return rst;
 }
 }
-function writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage){
+function writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage, custSheetMergeBands){
     let rst = [];
     let rst = [];
     let private_pushDftFont = function(){
     let private_pushDftFont = function(){
         let font = {};
         let font = {};
@@ -329,15 +329,19 @@ function writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage
     private_pushDftFont();
     private_pushDftFont();
     private_buildFirstDftStyle();
     private_buildFirstDftStyle();
     if (isSinglePage) {
     if (isSinglePage) {
-        rst.push(writeSheet(pageData, null, paperSize, sharedStrList, stylesObj));
+        rst.push(writeSheet(pageData, null, paperSize, sharedStrList, stylesObj, null));
     } else {
     } else {
         for (let i = 0; i < pageData.items.length; i++) {
         for (let i = 0; i < pageData.items.length; i++) {
-            rst.push(writeSheet(pageData, pageData.items[i], paperSize, sharedStrList, stylesObj));
+            let appointedMergeBand = null;
+            if (custSheetMergeBands && custSheetMergeBands.length > i) {
+                appointedMergeBand = custSheetMergeBands[i];
+            }
+            rst.push(writeSheet(pageData, pageData.items[i], paperSize, sharedStrList, stylesObj, appointedMergeBand));
         }
         }
     }
     }
     return rst;
     return rst;
 }
 }
-function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
+function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, appointedMergeBand){
     let rst = [], xPos = [], yPos = [], yMultiPos = [], headerStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
     let rst = [], xPos = [], yPos = [], yMultiPos = [], headerStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
     let currentPageMergePos = null; //在 JV.PAGING_OPTION_INFINITY 场合应用
     let currentPageMergePos = null; //在 JV.PAGING_OPTION_INFINITY 场合应用
     let private_pre_analyze_pos = function(){
     let private_pre_analyze_pos = function(){
@@ -501,6 +505,9 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
             mergeBorder = (sheetData)?sheetData[JV.PROP_PAGE_MERGE_BORDER]:pageData[JV.BAND_PROP_MERGE_BAND],
             mergeBorder = (sheetData)?sheetData[JV.PROP_PAGE_MERGE_BORDER]:pageData[JV.BAND_PROP_MERGE_BAND],
             mergeBand = pageData[JV.BAND_PROP_MERGE_BAND]
             mergeBand = pageData[JV.BAND_PROP_MERGE_BAND]
         ;
         ;
+        if (appointedMergeBand !== null) {
+            mergeBand = appointedMergeBand;
+        }
         if (sheetBorder[borderStr] && sheetBorder[borderStr][JV.PROP_LINE_WEIGHT] !== undefined) {
         if (sheetBorder[borderStr] && sheetBorder[borderStr][JV.PROP_LINE_WEIGHT] !== undefined) {
             rst = sheetBorder[borderStr][JV.PROP_LINE_WEIGHT];
             rst = sheetBorder[borderStr][JV.PROP_LINE_WEIGHT];
         }
         }
@@ -809,7 +816,7 @@ function mergeProperties(orgObj, newObj) {
 }
 }
 
 
 module.exports = {
 module.exports = {
-    exportExcel: function (pageData, paperSize, fName, options, custSheetNames, callback) {
+    exportExcel: function (pageData, paperSize, fName, options, custSheetNames, custSheetMergeBands, callback) {
         let rptOptions = ({singlePage: false, fileName: 'report'});
         let rptOptions = ({singlePage: false, fileName: 'report'});
         if (options === 'true') {
         if (options === 'true') {
             rptOptions.singlePage = true;
             rptOptions.singlePage = true;
@@ -864,7 +871,7 @@ module.exports = {
         //6.
         //6.
         let zip_worksheets = zip_xl.folder('worksheets');
         let zip_worksheets = zip_xl.folder('worksheets');
         let sharedStrList = [], stylesObj = {};
         let sharedStrList = [], stylesObj = {};
-        data = writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage);
+        data = writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage, custSheetMergeBands);
         if (isSinglePage) {
         if (isSinglePage) {
             for (let i = 0; i < 1; i++) {
             for (let i = 0; i < 1; i++) {
                 file = 'sheet' + (i + 1) + '.xml';
                 file = 'sheet' + (i + 1) + '.xml';
@@ -906,7 +913,7 @@ module.exports = {
         //   -- 简单来说,就是重新包装数据
         //   -- 简单来说,就是重新包装数据
         try {
         try {
             // 1.1 newPageData外围属性
             // 1.1 newPageData外围属性
-            let newContrl = {}, newFont = {}, newStyle = {};
+            let newContrl = {}, newFont = {}, newStyle = {}, custMergeBands = [];
             for (let i = 0; i < pageDataArray.length; i++) {
             for (let i = 0; i < pageDataArray.length; i++) {
                 mergeProperties(newContrl, pageDataArray[i][JV.NODE_CONTROL_COLLECTION]);
                 mergeProperties(newContrl, pageDataArray[i][JV.NODE_CONTROL_COLLECTION]);
                 mergeProperties(newFont, pageDataArray[i][JV.NODE_FONT_COLLECTION]);
                 mergeProperties(newFont, pageDataArray[i][JV.NODE_FONT_COLLECTION]);
@@ -923,6 +930,7 @@ module.exports = {
             for (let i = 0; i < pageDataArray.length; i++) {
             for (let i = 0; i < pageDataArray.length; i++) {
                 let offsetY = 0;
                 let offsetY = 0;
                 let mergeBand = {};
                 let mergeBand = {};
+                custMergeBands.push(pageDataArray[i][JV.BAND_PROP_MERGE_BAND]);
                 mergeBand[JV.PROP_LEFT] = [];
                 mergeBand[JV.PROP_LEFT] = [];
                 mergeBand[JV.PROP_RIGHT] = [];
                 mergeBand[JV.PROP_RIGHT] = [];
                 mergeBand[JV.PROP_TOP] = [];
                 mergeBand[JV.PROP_TOP] = [];
@@ -976,7 +984,7 @@ module.exports = {
                 newPageData.items.push(pageItem);
                 newPageData.items.push(pageItem);
             }
             }
             //3. everything is ok, then call me
             //3. everything is ok, then call me
-            me.exportExcel(newPageData, paperSize, fName, 'false', sheetNames, callback);
+            me.exportExcel(newPageData, paperSize, fName, 'false', sheetNames, custMergeBands, callback);
             // fsUtil.writeObjToFile(newPageData, 'D:/GitHome/ConstructionOperation/tmp/combinedHeader.js');
             // fsUtil.writeObjToFile(newPageData, 'D:/GitHome/ConstructionOperation/tmp/combinedHeader.js');
         } catch (e) {
         } catch (e) {
             console.log(e);
             console.log(e);

+ 1 - 1
test/unit/excel_export/rpt_excel_export_test.js

@@ -14,7 +14,7 @@ test('check real function.', function(t){
     eval(data);
     eval(data);
     var pageObj = testReport08_2;
     var pageObj = testReport08_2;
     //console.log(pageObj.items[0].cells.length);
     //console.log(pageObj.items[0].cells.length);
-    rpt_xl_util.exportExcel(pageObj, fName, null);
+    rpt_xl_util.exportExcel(pageObj, fName, 'false', null, null, null);
     t.pass('pass exportExcel');
     t.pass('pass exportExcel');
     t.end();
     t.end();
 });
 });

+ 11 - 5
web/building_saas/main/html/main.html

@@ -621,15 +621,21 @@
                                             </div>
                                             </div>
                                             <h5 class="mt-3">人材机</h5>
                                             <h5 class="mt-3">人材机</h5>
                                             <div class="row m-0">
                                             <div class="row m-0">
-                                                <div class="col-sm-3">
-                                                    <div class="input-group input-group-sm mb-2">
+                                                <div style="width: 23.3%;">
+                                                    <div style="width:120px;" class="input-group input-group-sm mb-2">
                                                         <div class="input-group-addon">消耗量</div>
                                                         <div class="input-group-addon">消耗量</div>
                                                         <input type="number" name="glj-quantity" class="form-control" value="2" step="1" max="6" min="0">
                                                         <input type="number" name="glj-quantity" class="form-control" value="2" step="1" max="6" min="0">
                                                     </div>
                                                     </div>
                                                 </div>
                                                 </div>
-                                                <div class="col-sm-3">
-                                                    <div class="input-group input-group-sm mb-2">
-                                                        <div class="input-group-addon">单价</div>
+                                                <div  style="width: 38.3%;">
+                                                    <div style="width:190px;" class="input-group input-group-sm mb-2">
+                                                        <div class="input-group-addon">单价(有组成物)</div>
+                                                        <input type="number" name="glj-unitPriceHasMix" class="form-control" value="2" step="1" max="6" min="0">
+                                                    </div>
+                                                </div>
+                                                <div style="width: 38.3%;">
+                                                    <div  style="width:190px;" class="input-group input-group-sm mb-2">
+                                                        <div class="input-group-addon">单价(无组成物)</div>
                                                         <input type="number" name="glj-unitPrice" class="form-control" value="2" step="1" max="6" min="0">
                                                         <input type="number" name="glj-unitPrice" class="form-control" value="2" step="1" max="6" min="0">
                                                     </div>
                                                     </div>
                                                 </div>
                                                 </div>

+ 1 - 0
web/building_saas/main/js/controllers/project_controller.js

@@ -145,6 +145,7 @@ ProjectController = {
     addFX:function(project, sheetController) {//添加分项
     addFX:function(project, sheetController) {//添加分项
         if (!project || !sheetController) { return null; }
         if (!project || !sheetController) { return null; }
         let selected = project.mainTree.selected;
         let selected = project.mainTree.selected;
+        console.log(selected);
         if(selected.data.type==billType.FB||(selected.parent==null&&isFlag(selected.data)&&selected.data.flagsIndex.fixed.flag==fixedFlag.SUB_ENGINERRING)){//选中的是分部或者是分部分项工程,则插入做为最后一个子项
         if(selected.data.type==billType.FB||(selected.parent==null&&isFlag(selected.data)&&selected.data.flagsIndex.fixed.flag==fixedFlag.SUB_ENGINERRING)){//选中的是分部或者是分部分项工程,则插入做为最后一个子项
             this.addSpecialBill(project, sheetController,selected, null,true,billType.FX);
             this.addSpecialBill(project, sheetController,selected, null,true,billType.FX);
         }
         }

+ 24 - 0
web/building_saas/main/js/models/calc_base.js

@@ -239,6 +239,30 @@ let cbTools = {
             //根据基数和行引用获取清单ID
             //根据基数和行引用获取清单ID
             for(let i = 0, len = bases.length; i < len; i++){
             for(let i = 0, len = bases.length; i < len; i++){
                 //基数是跟清单直接关联的
                 //基数是跟清单直接关联的
+                /*if(bases[i]['type'] === 'base' && cbTools.isDef(calcBase.baseFigures[bases[i]['value']])){
+                    //税前工程造价算法用了分部分项、项目措施、其他项目、规费里的底层价格,相当于引用了4条固定清单,特殊处理
+                    if(bases[i]['value'] === '税前工程造价'){
+                        let subEngineering = cbTools.findBill(calcBase.fixedFlag.SUB_ENGINERRING),
+                            measure = cbTools.findBill(calcBase.fixedFlag.MEASURE),
+                            other = cbTools.findBill(calcBase.fixedFlag.OTHER),
+                            charge = cbTools.findBill(calcBase.fixedFlag.CHARGE);
+                        if(subEngineering){
+                            block.push(subEngineering.ID);
+                        }
+                        if(measure){
+                            block.push(measure.ID);
+                        }
+                        if(other){
+                            block.push(other.ID);
+                        }
+                        if(charge){
+                            block.push(charge.ID);
+                        }
+                    }
+                    else if(cbTools.isDef(calcBase.baseFigures[bases[i]['value']]['fixedBill'])){
+                        block.push(calcBase.baseFigures[bases[i]['value']]['fixedBill']['bill']['ID']);
+                    }
+                }*/
                 if(bases[i]['type'] === 'base' && cbTools.isDef(calcBase.baseFigures[bases[i]['value']])
                 if(bases[i]['type'] === 'base' && cbTools.isDef(calcBase.baseFigures[bases[i]['value']])
                     && cbTools.isDef(calcBase.baseFigures[bases[i]['value']]['fixedBill'])){
                     && cbTools.isDef(calcBase.baseFigures[bases[i]['value']]['fixedBill'])){
                     block.push(calcBase.baseFigures[bases[i]['value']]['fixedBill']['bill']['ID']);
                     block.push(calcBase.baseFigures[bases[i]['value']]['fixedBill']['bill']['ID']);

+ 0 - 1
web/building_saas/main/js/models/project.js

@@ -361,7 +361,6 @@ var PROJECT = {
         };
         };
         //清单是否属于锁定范围(分部分项、措施项目)
         //清单是否属于锁定范围(分部分项、措施项目)
         project.prototype.withinBillsLocked = function (node) {
         project.prototype.withinBillsLocked = function (node) {
-            console.log(node);
             const lockedFixFlag = [fixedFlag.SUB_ENGINERRING, fixedFlag.MEASURE];
             const lockedFixFlag = [fixedFlag.SUB_ENGINERRING, fixedFlag.MEASURE];
             while(node){
             while(node){
                 if(!node.parent){
                 if(!node.parent){

+ 6 - 1
web/building_saas/main/js/views/main_tree_col.js

@@ -484,10 +484,15 @@ let colSettingObj = {
         for(let i = 0; i < cols.length; i++){
         for(let i = 0; i < cols.length; i++){
             let colSetting = cols[i];
             let colSetting = cols[i];
             if(colSetting.data.field === field){
             if(colSetting.data.field === field){
-                return i
+                return i;
             }
             }
         }
         }
         return null;
         return null;
+    },
+    getFieldByCol: function (col) {
+        let cols = projectObj.project.projSetting.main_tree_col.cols;
+        let colSetting = cols[col];
+        return colSetting ? colSetting.data.field : null;
     }
     }
 
 
 };
 };

+ 40 - 2
web/building_saas/main/js/views/project_property_decimal_view.js

@@ -8,7 +8,7 @@ let defaultDecimal = {
     _def: {//editable: 开放给用户编辑的
     _def: {//editable: 开放给用户编辑的
         bills: {editable: true, data: {unitPrice: 2, totalPrice: 2}},
         bills: {editable: true, data: {unitPrice: 2, totalPrice: 2}},
         ration: {editable: true, data: {quantity: 4, unitPrice: 2, totalPrice: 2}},
         ration: {editable: true, data: {quantity: 4, unitPrice: 2, totalPrice: 2}},
-        glj: {editable: true, data: {quantity: 4, unitPrice: 3}},
+        glj: {editable: true, data: {quantity: 4, unitPriceHasMix: 2, unitPrice: 3}},
         material: {editable: false, data: 5},
         material: {editable: false, data: 5},
         feeRate: {editable: true, data: 2},
         feeRate: {editable: true, data: 2},
         quantity_detail: {editable: false, data: 4},
         quantity_detail: {editable: false, data: 4},
@@ -20,6 +20,42 @@ let decimalObj = Object.create(null);
 
 
 decimalObj.decimal = function (field, node) {
 decimalObj.decimal = function (field, node) {
     if(isDef(field)){
     if(isDef(field)){
+        if(field.sameText('unitFee')){
+            field = 'unitPrice';
+        }
+        else if(field.sameText('totalFee')){
+            field = 'totalPrice';
+        }
+    }
+    if(!isDef(node)){
+        if(!isDef(field)){
+            return this.process;
+        }
+        let fields = field.split('.');
+        let fieldDecimal = fields.length === 2 ? this[fields[0]][fields[1]] : this[fields[0]];
+        return  fieldDecimal ? fieldDecimal : this.process;
+    }
+    else {
+        if(node.sourceType === projectObj.project.Bills.getSourceType()){
+            if(field === 'quantity'){
+                return billsQuanDecimal.decimal(node.data.unit);
+            }
+            else {
+                return returnV(this['bills'][field], this.process);
+            }
+        }
+        else if(node.sourceType === projectObj.project.Ration.getSourceType()){
+            return returnV(this['ration'][field], this.process);
+        }
+        else if(node.sourceType === projectObj.project.ration_glj.getSourceType()){
+            return returnV(this['glj'][field], this.process);
+        }
+    }
+    return  this[field]? this[field] : this.process;
+};
+
+/*decimalObj.decimal = function (field, node) {
+    if(isDef(field)){
         if(field === 'feeRate'||field==="quantity_detail"){
         if(field === 'feeRate'||field==="quantity_detail"){
             return this[field];
             return this[field];
         }
         }
@@ -44,7 +80,7 @@ decimalObj.decimal = function (field, node) {
         }
         }
     }
     }
     return  this[field]?this[field]:this.process;
     return  this[field]?this[field]:this.process;
-};
+};*/
 
 
 function returnV(v, r){
 function returnV(v, r){
     if(isDef(v)){
     if(isDef(v)){
@@ -104,6 +140,8 @@ function toUpdateDecimal(orgV, newV){
 }
 }
 
 
 function setDecimal(_digits, data){
 function setDecimal(_digits, data){
+    console.log(_digits);
+    console.log(data)
     if(isDef(data)){
     if(isDef(data)){
         for(let attr in data){
         for(let attr in data){
             _digits[attr] = returnV(data[attr], defaultDecimal['_def'][attr]['data']);
             _digits[attr] = returnV(data[attr], defaultDecimal['_def'][attr]['data']);

+ 149 - 2
web/building_saas/main/js/views/project_view.js

@@ -695,14 +695,16 @@ var projectObj = {
                 that.mainController.bind('refreshBaseActn', that.refreshBaseActn);
                 that.mainController.bind('refreshBaseActn', that.refreshBaseActn);
                 that.mainController.bind(TREE_SHEET_CONTROLLER.eventName.beforeTreeSelectedChange, that.beforeMainTreeSelectedChange);
                 that.mainController.bind(TREE_SHEET_CONTROLLER.eventName.beforeTreeSelectedChange, that.beforeMainTreeSelectedChange);
                 that.mainController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, that.treeSelectedChanged);
                 that.mainController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, that.treeSelectedChanged);
-
+                if(!projectReadOnly){
+                    that.bindEnterKey(that.mainSpread, 'mainEnterKey', that.mainSpreadEnterKey);
+                }
                 setTimeout(function () {
                 setTimeout(function () {
                     that.mainSpread.getActiveSheet().startEdit();//这两句需要挺多时间,而又需要在editend 事件前触发,而这些又不影响计算,所以这里用异步的方法
                     that.mainSpread.getActiveSheet().startEdit();//这两句需要挺多时间,而又需要在editend 事件前触发,而这些又不影响计算,所以这里用异步的方法
                     that.mainSpread.getActiveSheet().endEdit();
                     that.mainSpread.getActiveSheet().endEdit();
 
 
                     that.mainSpread.bind(GC.Spread.Sheets.Events.EditEnded, that.mainSpreadEditEnded);
                     that.mainSpread.bind(GC.Spread.Sheets.Events.EditEnded, that.mainSpreadEditEnded);
                 },100);
                 },100);
-                that.mainSpread.bind(GC.Spread.Sheets.Events.SelectionChanged, that.amountAreaNumber);
+                that.mainSpread.bind(GC.Spread.Sheets.Events.SelectionChanged, that.amountAreaNumber);//选中统计专用,节点相关操作在treeSelectedChanged里些
                 that.mainSpread.bind(GC.Spread.Sheets.Events.LeaveCell, that.mainSpreadLeaveCell);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.LeaveCell, that.mainSpreadLeaveCell);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.EnterCell, that.mainSpreadEnterCell);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.EnterCell, that.mainSpreadEnterCell);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.EditStarting, that.mainSpreadEditStarting);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.EditStarting, that.mainSpreadEditStarting);
@@ -733,6 +735,7 @@ var projectObj = {
                 if(projectReadOnly){
                 if(projectReadOnly){
                     disableSpread(that.mainSpread);
                     disableSpread(that.mainSpread);
                 }
                 }
+                console.log(decimalObj.decimal());
                 $.bootstrapLoading.end();
                 $.bootstrapLoading.end();
             }
             }
             else {
             else {
@@ -741,6 +744,150 @@ var projectObj = {
         });
         });
 
 
     },
     },
+    mainSpreadEnterKey: function () {
+        let me = projectObj;
+        let sheet = me.mainSpread.getActiveSheet();
+        let orgRow = sheet.getActiveRowIndex();
+        let orgCol = sheet.getActiveColumnIndex();
+        let orgField = colSettingObj.getFieldByCol(orgCol);
+        let selected = me.project.mainTree.items[orgRow];
+        if(sheet.isEditing()){
+            sheet.endEdit();
+        }
+        //正常情况,焦点应该是在下一行的同一列
+        let newRow = orgRow + 1, newCol = orgCol;
+        //getColByField getVisible都不提出来,减少调用次数
+        if(selected){
+            //在分项/补项的编码单元格回车,焦点应跳动至本行的工程量单元格
+            if(orgField && orgField === 'code' && selected.sourceType === me.project.Bills.getSourceType() && [billType.FX, billType.BX].includes(selected.data.type)){
+                let quantityCol = colSettingObj.getColByField('quantity');
+                let quantityVisible = colSettingObj.getVisible('quantity');
+                if(quantityCol !== null && quantityVisible !== false){
+                    newRow = orgRow;
+                    newCol = quantityCol;
+                }
+            }
+            else if(orgField && orgField === 'quantity' && selected.sourceType === me.project.Bills.getSourceType() && [billType.FX, billType.BX].includes(selected.data.type)){
+                //在分项/补项的工程量单元格回车,如果其下有定额/量价/人材机,焦点应跳动至其下第一条定额/量价/人材机的工程量,如果是空行,则跳到至第一条定额xx的编码;
+                if(selected.children.length !== 0 && !(isDef(selected.children[0].data.code) && selected.children[0].data.code.toString().trim() !== '')){
+                    let codeCol = colSettingObj.getColByField('code');
+                    let codeVisible = colSettingObj.getVisible('code');
+                    newRow = orgRow + 1;
+                    if(codeCol !== null && codeVisible !== false){
+                        newCol = codeCol;
+                    }
+                }
+                //如果其下没有定额/量价/人材机,则自动在其下插入一条定额空行,在其后自动插入一条分项空行,焦点跳动至定额空行的编码单元格。
+                else if(selected.children.length === 0){
+                    //在其后插入分项
+                    if(!(projectInfoObj.projectInfo.property.lockBills && projectObj.project.withinBillsLocked(projectObj.project.mainTree.selected))){
+                        ProjectController.addFX(me.project, me.mainController);
+                        //将焦点行设置成原本的行,以插入定额
+                        me.mainController.setTreeSelected(me.project.mainTree.items[orgRow]);
+                    }
+                    //插入定额
+                    me.project.Ration.addNewRation(null, rationType.ration, function () {
+                        newRow = sheet.getActiveRowIndex();
+                        let codeCol = colSettingObj.getColByField('code');
+                        let codeVisible = colSettingObj.getVisible('code');
+                        if(codeCol !== null && codeVisible !== false){
+                            newCol = codeCol;
+                        }
+                        sheet.setActiveCell(newRow, newCol);
+                    });
+                }
+            }
+            //在定额/量价/人材机的编码单元格回车,焦点应跳动至本行的工程量单元格
+            else if(orgField && orgField === 'code' && selected.sourceType === me.project.Ration.getSourceType()){
+                let quantityCol = colSettingObj.getColByField('quantity');
+                let quantityVisible = colSettingObj.getVisible('quantity');
+                if(quantityCol !== null && quantityVisible !== false){
+                    newRow = orgRow;
+                    newCol = quantityCol;
+                }
+            }
+            //在定额/量价/人材机的工程量单元格回车
+            else if(orgField && orgField === 'quantity' && selected.sourceType === me.project.Ration.getSourceType()){
+                let nextSibling = selected.nextSibling;
+                //如果其后有定额/量价/人材机(空行:编码为空不算),焦点应跳动至下一行定额/量价/人材机的工程量,不需处理
+
+                //如果其后没有定额/量价/人材机(空行也没有),则自动在其后插入一行定额空行,焦点跳动至定额空行的编码单元格
+                if(!nextSibling){
+                    let codeCol = colSettingObj.getColByField('code');
+                    let codeVisible = colSettingObj.getVisible('code');
+                    me.project.Ration.addNewRation(null, rationType.ration, function () {
+                        newRow = sheet.getActiveRowIndex();
+                        if(codeCol !== null && codeVisible !== false){
+                            newCol = codeCol;
+                        }
+                        sheet.setActiveCell(newRow, newCol);
+                    });
+                }
+                //如果其后有定额空行,焦点跳动至定额空行的编码单元格
+                else if(nextSibling && !(isDef(nextSibling.data.code) && nextSibling.data.code.toString().trim() !== '')) {
+                    let codeCol = colSettingObj.getColByField('code');
+                    let codeVisible = colSettingObj.getVisible('code');
+                    if(codeCol !== null && codeVisible !== false){
+                        newRow = orgRow + 1;
+                        newCol = codeCol;
+                    }
+                }
+            }
+            //在清单的编码单元格回车,如果清单是叶子节点,焦点跳动至本行的工程量单元格
+            else if(orgField && orgField === 'code' && selected.sourceType === me.project.Bills.getSourceType()
+                && selected.data.type === billType.BILL && selected.source.children.length === 0){
+                let quantityCol = colSettingObj.getColByField('quantity');
+                let quantityVisible = colSettingObj.getVisible('quantity');
+                if(quantityCol && quantityVisible){
+                    newRow = orgRow;
+                    newCol = quantityCol;
+                }
+            }
+
+
+        }
+        //设置焦点
+        sheet.setActiveCell(newRow, newCol);
+        //触发表格事件
+        me.mainController.setTreeSelected(me.project.mainTree.items[newRow]);//SelectionChanged
+        me.mainSpreadLeaveCell({type: 'LeaveCell'}, {sheet: sheet, sheetName: sheet.name(), cancel: false, row: orgRow, col: orgCol});
+        me.mainSpreadEnterCell({type: 'EnterCell'}, {sheet: sheet, sheetName: sheet.name(), cancel: false, row: newRow, col: newCol});
+
+    },
+    //注册自定义回车键事件
+    bindEnterKey: function (workBook, registerName, operation) {
+        let me = this;
+        let sheet = workBook.getActiveSheet();
+        workBook.commandManager().register(registerName, operation);
+       /* workBook.commandManager().register(registerName, function(){
+            operation();
+           /!* let orgRow = sheet.getActiveRowIndex();
+            let orgCol = sheet.getActiveColumnIndex();
+            if(sheet.isEditing()){
+                sheet.endEdit();
+            }
+            let code = sheet.getValue(orgRow, 0);
+            let newRow, newCol;
+            if(!me.currentCache[orgRow] && code !== undefined && code !== null && orgCol !== me.setting.header.length - 1){
+                newRow = orgRow;
+                newCol = orgCol + 1;
+                sheet.setActiveCell(newRow, newCol);
+            }
+            else{
+                newRow = orgRow + 1;
+                newCol = me.currentCache[orgRow + 1] ? orgCol : 0;
+                sheet.setActiveCell(newRow, newCol);
+            }*!/
+            //触发事件
+            /!*me.onLeaveCell({type: 'LeaveCell'}, {sheet: sheet, sheetName: sheet.name(), cancel: false, row: orgRow, col: orgCol});
+            me.onEnterCell({type: 'EnterCell'}, {sheet: sheet, sheetName: sheet.name(), cancel: false, row: newRow, col: newCol});
+            let newSels = [{row: newRow, rowCount: 1, col: newCol, colCount: 1}];
+            let oldSels = [{row: orgRow, rowCount: 1, col: orgRow, colCount: 1}];
+            me.onSelectionChanged({type: 'SelectionChanged'}, {sheet: sheet, sheetName: sheet.name(), newSelections: newSels, oldSelections: oldSels});*!/
+        });*/
+        workBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.enter, false, false, false, false);
+        workBook.commandManager().setShortcutKey(registerName, GC.Spread.Commands.Key.enter, false, false, false, false);
+    },
     loadMainSpreadContextMenu: function () {
     loadMainSpreadContextMenu: function () {
         var project = this.project, spread = this.mainSpread, controller = this.mainController;
         var project = this.project, spread = this.mainSpread, controller = this.mainController;
         $.contextMenu({
         $.contextMenu({

+ 12 - 19
web/building_saas/report/html/rpt_print.html

@@ -41,15 +41,15 @@
         if (sessionStorage.multiRptsData) {
         if (sessionStorage.multiRptsData) {
             let multiRptData = JSON.parse(sessionStorage.multiRptsData);
             let multiRptData = JSON.parse(sessionStorage.multiRptsData);
             let scaleFactor = parseInt(sessionStorage.scaleFactor);
             let scaleFactor = parseInt(sessionStorage.scaleFactor);
-            let svgArr = [];
             for (let idx = 0; idx < multiRptData.length; idx++) {
             for (let idx = 0; idx < multiRptData.length; idx++) {
                 let pageData = multiRptData[idx];
                 let pageData = multiRptData[idx];
                 if (idx === 0) {
                 if (idx === 0) {
                     $(document).attr("title", pageData[JV.NODE_PAGE_INFO][JV.NODE_MAIN_INFO_RPT_NAME]);
                     $(document).attr("title", pageData[JV.NODE_PAGE_INFO][JV.NODE_MAIN_INFO_RPT_NAME]);
                 }
                 }
-                svgArr = svgArr.concat(rptPrintHelper.buildSvgArr(pageData, -30, -30));
+                let svgArr = rptPrintHelper.buildSvgArr(pageData, -30, -30);
+                let orientation = (pageData[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE][0] < pageData[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE][1])?"纵向":"横向";
+                showPreviewData(svgArr, scaleFactor, sessionStorage.pageSize, orientation);
             }
             }
-            showPreviewData(svgArr, scaleFactor, sessionStorage.pageSize, sessionStorage.orientation);
             window.print();
             window.print();
         } else if (sessionStorage.currentPageData) {
         } else if (sessionStorage.currentPageData) {
             let pageData = JSON.parse(sessionStorage.currentPageData);
             let pageData = JSON.parse(sessionStorage.currentPageData);
@@ -70,36 +70,29 @@
 
 
     function showPreviewData(svgArr, scaleFactor, pageSize, orientation) {
     function showPreviewData(svgArr, scaleFactor, pageSize, orientation) {
         let orgHeight = 793, orgWidth = 1122;
         let orgHeight = 793, orgWidth = 1122;
-        let pageHeight = orgHeight * scaleFactor, pageWidth = orgWidth * scaleFactor;
         if (pageSize === 'A3') {
         if (pageSize === 'A3') {
-            pageHeight = orgWidth * scaleFactor;
-            pageWidth = orgHeight * 2 * scaleFactor;
             orgHeight = 1122;
             orgHeight = 1122;
             orgWidth = 793 * 2;
             orgWidth = 793 * 2;
-        } else if (pageSize === '自定义') {
+        } else if (pageSize.indexOf('自定义') >= 0) {
             //自定义
             //自定义
+        } else {
+            //其他size(LEGAL, 16K etc.)
         }
         }
+        let pageHeight = orgHeight * scaleFactor, pageWidth = orgWidth * scaleFactor;
         if (orientation === "纵向") {
         if (orientation === "纵向") {
-            let tmpInt = pageHeight;
-            pageHeight = pageWidth;
-            pageWidth = tmpInt;
-
-            tmpInt = orgWidth;
-            orgWidth = orgHeight;
-            orgHeight = tmpInt;
+            pageHeight = orgWidth * scaleFactor;
+            pageWidth = orgHeight * scaleFactor;
         }
         }
 
 
         for (let i = 0; i < svgArr.length; i++) {
         for (let i = 0; i < svgArr.length; i++) {
             let div = $('<div class="pageBreak"></div>');
             let div = $('<div class="pageBreak"></div>');
             div.append($(svgArr[i].join("")));
             div.append($(svgArr[i].join("")));
-            $("body").append(div);
-        }
-        $(document.body).find("div").each(function(index,element){
-            $(element).find("svg").each(function(cIdx,elementSvg){
+            $(div).find("svg").each(function(cIdx,elementSvg){
                 elementSvg.setAttribute('height', pageHeight);
                 elementSvg.setAttribute('height', pageHeight);
                 elementSvg.setAttribute('width', pageWidth);
                 elementSvg.setAttribute('width', pageWidth);
             });
             });
-        });
+            $("body").append(div);
+        }
     }
     }
 
 
     function closing() {
     function closing() {

+ 4 - 2
web/building_saas/report/js/rpt_main.js

@@ -333,10 +333,11 @@ let rptControlObj = {
         } else if ($("#excelExportType_IndividualBook").get(0).checked) {
         } else if ($("#excelExportType_IndividualBook").get(0).checked) {
             if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
             if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
                 let urls = [];
                 let urls = [];
+                let orientation = ((zTreeOprObj.checkedRptTplNodes.length > 1)?null:me.getCurrentOrientation());
                 for (let tplNode of zTreeOprObj.checkedRptTplNodes) {
                 for (let tplNode of zTreeOprObj.checkedRptTplNodes) {
                     let orgRptName = tplNode.name;
                     let orgRptName = tplNode.name;
                     let url =  "/report_api/getExcel/" + projectInfoObj.projectInfo.ID + "/" + tplNode.refId + "/" +
                     let url =  "/report_api/getExcel/" + projectInfoObj.projectInfo.ID + "/" + tplNode.refId + "/" +
-                        me.getCurrentPageSize() + "/" + me.getCurrentOrientation() + "/" + orgRptName + "/" + true + "/" + 'normal';
+                        me.getCurrentPageSize() + "/" + orientation + "/" + orgRptName + "/" + true + "/" + 'normal';
                     urls.push(url);
                     urls.push(url);
                 }
                 }
                 downloadReport(urls);
                 downloadReport(urls);
@@ -347,10 +348,11 @@ let rptControlObj = {
         let me = rptControlObj;
         let me = rptControlObj;
         if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
         if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
             let urls = [];
             let urls = [];
+            let orientation = ((zTreeOprObj.checkedRptTplNodes.length > 1)?null:me.getCurrentOrientation());
             for (let tplNode of zTreeOprObj.checkedRptTplNodes) {
             for (let tplNode of zTreeOprObj.checkedRptTplNodes) {
                 let orgRptName = tplNode.name;
                 let orgRptName = tplNode.name;
                 let url =  "/report_api/getPDF/" + projectInfoObj.projectInfo.ID + "/" + tplNode.refId + "/" +
                 let url =  "/report_api/getPDF/" + projectInfoObj.projectInfo.ID + "/" + tplNode.refId + "/" +
-                    me.getCurrentPageSize() + "/" + me.getCurrentOrientation() + "/" + orgRptName;
+                    me.getCurrentPageSize() + "/" + orientation + "/" + orgRptName;
                 urls.push(url);
                 urls.push(url);
             }
             }
             downloadReport(urls);
             downloadReport(urls);

+ 2 - 1
web/building_saas/report/js/rpt_print.js

@@ -58,7 +58,8 @@ let rptPrintHelper = {
             let page = pagesData.items[idx];
             let page = pagesData.items[idx];
             let svgPageArr = [], pixelSize = getPixelSize(pagesData);
             let svgPageArr = [], pixelSize = getPixelSize(pagesData);
             svgPageArr.push("<svg width='" + pixelSize[0] + "' height='" + pixelSize[1] + "'>");
             svgPageArr.push("<svg width='" + pixelSize[0] + "' height='" + pixelSize[1] + "'>");
-            let adjustY = 0.5 * ((idx + 1) % 2);
+            // let adjustY = 0.5 * ((idx + 1) % 2);
+            let adjustY = 0.5;
             for (let cell of page.cells) {
             for (let cell of page.cells) {
                 svgPageArr.push(buildCellSvg(cell, fonts, styles, controls, page[JV.PROP_PAGE_MERGE_BORDER], pagesData[JV.BAND_PROP_MERGE_BAND], offsetX, offsetY, adjustY, canvas));
                 svgPageArr.push(buildCellSvg(cell, fonts, styles, controls, page[JV.PROP_PAGE_MERGE_BORDER], pagesData[JV.BAND_PROP_MERGE_BAND], offsetX, offsetY, adjustY, canvas));
             }
             }