소스 검색

Merge branch '1.0.0_online' of http://smartcost.f3322.net:3000/SmartCost/ConstructionCost into 1.0.0_online

zhangweicheng 6 년 전
부모
커밋
1c43f22e56

+ 33 - 2
modules/main/facade/block_lib_facade.js

@@ -31,8 +31,39 @@ async function getLibNamesAndFirstLib(data) {
     return {libNames: libNames, firstLib: firstLib};
 };
 
-// libID
+/*------------------------------------------------------------------------------
+data参数示例:
+        {
+            libID: 3,
+            nodeID: 5,
+            create: {node}
+            delete: true
+            update: {nodeName: 'xxx', children: [...]}
+        }
+说明:   libID、nodeID 必须。 create|update|delete三选一。
+        create属性值是完整的node节点数据。
+        delete属性值是true。
+        update属性值是要修改的属性键值对组成的对象。
+------------------------------------------------------------------------------*/
 async function saveBlock(data) {
-    await blModel.update({libID: data.libID}, {"$addToSet": {"datas": data}});
+    if (data.create) {
+        await blModel.update({libID: data.libID}, {$addToSet: {datas: data.create}});
+    }
+    if (data.delete) {
+        await blModel.update({libID: data.libID}, {$pull: {datas: {ID: data.nodeID}}});
+    }
+    else if (data.update){
+        let doc = await blModel.findOne({libID: data.libID});
+        let datas = doc._doc.datas;
+        for (let i = 0; i < datas.length; i++) {
+            if (datas[i].ID == data.nodeID) {
+                for (let pn in data.update){
+                    datas[i][pn] = data.update[pn];
+                };
+                await doc.save();
+                break;
+            }
+        };
+    };
     return 'saveBlock.OK';
 };

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

@@ -104,10 +104,10 @@ test('测试 - 测试模板啦: ', function (t) {
                     let customizeCfg = {"fillZero": true};
                     let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties, customizeCfg);
                     if (pageRst) {
-                        // fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult_测试模板.jsp");
-                        rpt_xl_util.exportExcel(pageRst, pagesize, "local_test_rpt_excel", true, null, null, function(uuidName){
-                            console.log("excel uuid: " + uuidName);
-                        });
+                        fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult_测试模板.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);
                         // });

+ 10 - 14
web/building_saas/complementary_glj_lib/js/glj.js

@@ -114,7 +114,7 @@ let repositoryGljObj = {
         let me = this;
         let distType;
         let distTypeTree = {
-            prefix : 'gljType',
+            prefix: 'gljType',
             distTypes: {},
             comboDatas: [],
             distTypesArr: []
@@ -124,24 +124,20 @@ let repositoryGljObj = {
                 data: typeData,
                 children: [],
                 parent: null
-            };
-            if(allowGljType.includes(typeData.ID)){
-                distTypeTree.distTypes[distTypeTree.prefix + typeData.ID] = typeObj;
-                distTypeTree.distTypesArr.push(typeObj);
             }
+            distTypeTree.distTypes[distTypeTree.prefix + typeData.ID] = typeObj;
+            distTypeTree.distTypesArr.push(typeObj);
         });
         gljDistType.forEach(function (typeData) {
-            if(allowGljType.includes(typeData.ID)){
-                distType = distTypeTree.distTypes[distTypeTree.prefix + typeData.ID];
-                let parent = distTypeTree.distTypes[distTypeTree.prefix + typeData.ParentID];
-                if(parent){
-                    distType.parent = parent;
-                    parent.children.push(distType);
-                }
+            distType = distTypeTree.distTypes[distTypeTree.prefix + typeData.ID];
+            let parent = distTypeTree.distTypes[distTypeTree.prefix + typeData.ParentID];
+            if (parent) {
+                distType.parent = parent;
+                parent.children.push(distType);
             }
         });
         distTypeTree.distTypesArr.forEach(function (distTypeObj) {
-            if(distTypeObj.data.fullName !== '材料' && distTypeObj.data.fullName !== '机械'){
+            if (distTypeObj.data.fullName !== '材料' && distTypeObj.data.fullName !== '机械') {
                 distTypeTree.comboDatas.push({text: distTypeObj.data.fullName, value: distTypeObj.data.ID});
             }
         });
@@ -1128,7 +1124,7 @@ let repositoryGljObj = {
         // }
     },
     updateRationBasePrcRq: function (basePrcArr) {
-        CommonAjax.post('complementartGlj/api/updateRationBasePrc', {basePrcArr: basePrcArr}, function (rstData) {
+        CommonAjax.post('/complementartGlj/api/updateRationBasePrc', {basePrcArr: basePrcArr}, function (rstData) {
         });
     },
   /*  getRationGljIds: function (repId) {

+ 5 - 4
web/building_saas/complementary_ration_lib/html/dinge.html

@@ -518,12 +518,13 @@
             </div>
             <div class="modal-body" style="padding-left: 0; padding-right: 3px; margin-left: 0;">
                 <div style="width: 36%; float: left;">
+                    &nbsp;
+                    <input type="radio" class="glj-radio" name="glj" value="stdGljs">标准&nbsp;&nbsp;
+                    <input type="radio" class="glj-radio" name="glj" value="complementaryGljs">补充&nbsp;&nbsp;
                     <div  class="modal-auto-height" id="gljSelTreeDiv" style="overflow: hidden">
-                        <!--<div class="print-list">-->
                         <div style="width: 100%; height: 100%; overflow: auto">
                             <ul id="selGljTree" class="ztree"></ul>
                         </div>
-                        <!--</div>-->
                     </div>
                 </div>
                 <div style="width: 64%; padding-left: 3px; float: left;">
@@ -531,9 +532,9 @@
                         <div class="col-12" id="gljRadios">
                             <div class="row">
                                 <div class="col-7" style="margin-top: 5px;">
-                                    <input type="radio" class="glj-radio" name="glj" value="allGljs">所有&nbsp;&nbsp;
+                                  <!--  <input type="radio" class="glj-radio" name="glj" value="allGljs">所有&nbsp;&nbsp;
                                     <input type="radio" class="glj-radio" name="glj" value="stdGljs">标准&nbsp;&nbsp;
-                                    <input type="radio" class="glj-radio" name="glj" value="complementaryGljs">补充&nbsp;&nbsp;
+                                    <input type="radio" class="glj-radio" name="glj" value="complementaryGljs">补充&nbsp;&nbsp;-->
                                 </div>
                                 <div class="input-group col-5" style="margin-bottom: 5px;">
                                     <input type="text" class="form-control form-control-sm" placeholder="请输入筛选编码或名称" value="" id="gljSearchKeyword">

+ 34 - 14
web/building_saas/complementary_ration_lib/js/gljSelect.js

@@ -39,7 +39,7 @@ let gljSelOprObj = {
             delete glj.ID;
         }
     },
-    /*getSelGljItems: function(stdGljLibId, callback) {
+    getSelGljItems: function(stdGljLibId, callback) {
         let me = this;
         CommonAjax.post('/complementartGlj/api/getGljItems', {stdGljLibId: stdGljLibId}, function (rstData) {
             me.stdGljList = rstData.stdGljs;
@@ -61,18 +61,33 @@ let gljSelOprObj = {
                 callback();
             }
         });
-    },*/
+    },
+    initClassTree: function (type, treeData) {
+        let me = this;
+        if (me.treeObj) {
+            me.treeObj.destroy();
+            me.parentNodeIds = {};
+        }
+        zTreeHelper.createTree(treeData, gljSelTreeOprObj.setting, "selGljTree", me);
+        let rootNode = me.treeObj.getNodes()[0];
+        if(rootNode && rootNode.isParent && rootNode.isFirstNode){
+            me.rootNode = rootNode;
+        }
+        if(me.rootNode){
+            me.treeObj.selectNode(me.rootNode);
+            if ((me.stdGljList && me.stdGljList.length > 0) ||
+                (me.complementaryGljList && me.complementaryGljList.length > 0)) {
+                gljSelTreeOprObj.setting.callback.onClick(null, 'selGljTree', me.rootNode);
+            }
+        }
+    },
     getGljClassTree: function (gljLibId, callback) {
-        console.log('enter2');
         let me = this;
-        let url = '/complementartGlj/api/getGljTree';
+        let url = '/complementartGlj/api/getMixedTree';
         let postData = {gljLibId: gljLibId};
         let sucFunc = function (rstData) {
-            zTreeHelper.createTree(rstData, gljSelTreeOprObj.setting, "selGljTree", gljSelOprObj);
-            let rootNode = gljSelOprObj.treeObj.getNodes()[0];
-            if(rootNode && rootNode.isParent && rootNode.isFirstNode){
-                gljSelOprObj.rootNode = rootNode;
-            }
+            me.treeData = rstData;
+            me.initClassTree('std', me.treeData.std);
             gljSelOprObj.buildSheet($('#gljSelSheet')[0]);
             if(callback){
                 callback();
@@ -167,13 +182,13 @@ let gljSelOprObj = {
         if(typeof $("input[name='glj']:checked")[0] !== 'undefined'){
             $("input[name='glj']:checked")[0].checked = false;
         }
-        $("input[value = 'allGljs']")[0].checked = true;
-        me.radiosSelected = 'allGljs';
-        //初始为所有工料机
+        $("input[value = 'stdGljs']")[0].checked = true;
+        me.radiosSelected = 'stdGljs';
+        //初始为标准工料机
         me.showGljList = [];
-        if(me.radiosSelected === 'allGljs'){
+        if(me.radiosSelected === 'stdGljs'){
             me.setShowGljList(me.stdGljList, true);
-            me.setShowGljList(me.complementaryGljList, true);
+            //me.setShowGljList(me.complementaryGljList, true);
             me.sortGlj(me.showGljList);
         }
     },
@@ -220,6 +235,11 @@ let gljSelOprObj = {
     radiosChange: function () {
         let me = gljSelOprObj;
         $('.glj-radio').change(function () {
+            if($(this).val() === 'stdGljs') {
+                me.initClassTree('std', me.treeData.std);
+            } else {
+                me.initClassTree('comple', me.treeData.comple);
+            }
             me.filterDatasAndShow();
         });
     },

+ 1 - 5
web/building_saas/complementary_ration_lib/js/ration_glj.js

@@ -136,11 +136,7 @@ var rationGLJOprObj = {
                                 //默认radio所有工料机
                                 gljSelOprObj.initRadio();
                                 gljSelOprObj.gljCurTypeId = null;
-                                //默认点击树根节点
-                                if(gljSelOprObj.rootNode){
-                                    gljSelOprObj.treeObj.selectNode(gljSelOprObj.rootNode);
-                                    gljSelTreeOprObj.setting.callback.onClick(null, 'componentTree', gljSelOprObj.rootNode);
-                                }
+                                gljSelOprObj.initClassTree('std', gljSelOprObj.treeData.std);
                                 //弹出窗口
                                 $('#selGlj').modal('show');
                             }},

+ 8 - 0
web/building_saas/css/custom.css

@@ -287,4 +287,12 @@ input.text-right{
 }
 .more{
     padding-left:.25rem!important
+}
+.bottom-tznrTools {
+    height: 30px;
+    line-height: 30px;
+    background:#efefef;
+    bottom:30px;
+    left:0px;
+    z-index: 999
 }

+ 20 - 20
web/building_saas/main/html/main.html

@@ -299,29 +299,29 @@
                                       <div id="tzjnrCon" class="container-fluid main-data-bottom" style="background: #F1F1F1; overflow: hidden">
                                           <div class="row" style="overflow: hidden">
                                               <div class="p-0" id="contentDiv" style="width: 90%; float: left">
-                                                  <div id="jobDiv" style="width: 25%; height: 100%; position:relative; float: left">
-                                                      <div class="main-data-bottom ovf-hidden" id="jobSpread" style="width: 99%; float: left">
+                                                  <div id="jobDiv" style="width: 25%; height: 100%;float: left">
+                                                      <div class="main-data-bottom ovf-hidden" id="jobSpread" style="width: 99%; float: left; position: relative">
+                                                          <!--工具栏-->
+                                                          <div class="bottom-tznrTools btn-group position-absolute">
+                                                              <a href="javascript:void(0);" id="jobInsert" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="插入"><i class="fa fa-sign-in" aria-hidden="true"></i></a>
+                                                              <a href="javascript:void(0);" id="jobAdd" class="btn btn-sm " data-toggle="tooltip" data-placement="bottom" title="" data-original-title="添加"><i class="fa fa-plus" aria-hidden="true"></i></a>
+                                                              <a href="javascript:void(0);" id="jobDel" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="删除"><i class="fa fa-remove" aria-hidden="true"></i></a>
+                                                              <a href="javascript:void(0);" id="jobDown" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a>
+                                                              <a href="javascript:void(0);" id="jobUp" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a>
+                                                          </div>
                                                       </div>
                                                       <div class="resize-x" id="TZJNRResize"></div>
-                                                      <!--工具栏-->
-                                                      <div class="bottom-tools btn-group position-absolute">
-                                                          <a href="javascript:void(0);" id="jobInsert" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="插入"><i class="fa fa-sign-in" aria-hidden="true"></i></a>
-                                                          <a href="javascript:void(0);" id="jobAdd" class="btn btn-sm " data-toggle="tooltip" data-placement="bottom" title="" data-original-title="添加"><i class="fa fa-plus" aria-hidden="true"></i></a>
-                                                          <a href="javascript:void(0);" id="jobDel" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="删除"><i class="fa fa-remove" aria-hidden="true"></i></a>
-                                                          <a href="javascript:void(0);" id="jobDown" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a>
-                                                          <a href="javascript:void(0);" id="jobUp" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a>
-                                                      </div>
                                                   </div>
-                                                  <div id="itemDiv" style="width: 75%; height: 100%; position:relative; float: left;">
-                                                      <div class="main-data-bottom ovf-hidden"  id="itemSpread">
-                                                      </div>
-                                                      <!--工具栏-->
-                                                      <div class="bottom-tools btn-group position-absolute">
-                                                          <a href="javascript:void(0);" id="itemInsert" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="插入"><i class="fa fa-sign-in" aria-hidden="true"></i></a>
-                                                          <a href="javascript:void(0);" id="itemAdd" class="btn btn-sm " data-toggle="tooltip" data-placement="bottom" title="" data-original-title="添加"><i class="fa fa-plus" aria-hidden="true"></i></a>
-                                                          <a href="javascript:void(0);" id="itemDel" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="删除"><i class="fa fa-remove" aria-hidden="true"></i></a>
-                                                          <a href="javascript:void(0);" id="itemDown" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a>
-                                                          <a href="javascript:void(0);" id="itemUp" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a>
+                                                  <div id="itemDiv" style="width: 75%; height: 100%; float: left;">
+                                                      <div class="main-data-bottom ovf-hidden" id="itemSpread" style="position: relative;">
+                                                          <!--工具栏-->
+                                                          <div class="bottom-tznrTools btn-group position-absolute">
+                                                              <a href="javascript:void(0);" id="itemInsert" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="插入"><i class="fa fa-sign-in" aria-hidden="true"></i></a>
+                                                              <a href="javascript:void(0);" id="itemAdd" class="btn btn-sm " data-toggle="tooltip" data-placement="bottom" title="" data-original-title="添加"><i class="fa fa-plus" aria-hidden="true"></i></a>
+                                                              <a href="javascript:void(0);" id="itemDel" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="删除"><i class="fa fa-remove" aria-hidden="true"></i></a>
+                                                              <a href="javascript:void(0);" id="itemDown" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a>
+                                                              <a href="javascript:void(0);" id="itemUp" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a>
+                                                          </div>
                                                       </div>
                                                   </div>
                                               </div>

+ 17 - 15
web/building_saas/main/js/views/billsElf.js

@@ -465,26 +465,28 @@ const BillsElf = (function() {
             let $editInput = $(`<div style="height: ${height}px; background: ${cellStyle.backColor};overflow: hidden; white-space: nowrap; text-overflow: ellipsis">${node.data.options}</div>`),
                 $optDiv = $(`<div style="position: fixed; width: ${cellRect.width}px; top: ${top}px;background: ${cellStyle.backColor};border: 1px solid; overflow: auto; height: ${options.length > 6 ? height*6+5 : height*options.length+5}px; font-size: 0.9rem;"></div>`);
             for(let opt of options){
-                let $opt = $(`<div title="${opt.name ? opt.name : ''}" class="elf-options" style="height: ${height}px;overflow: hidden; white-space: nowrap; text-overflow: ellipsis"></div>`),
-                    $optInput = $(`<input rank="${opt.rank}" value="${opt.ID}" style="margin-left: 5px; vertical-align: middle" type="checkbox" 
-                    ${node.data.optionChecked && _.find(node.data.optionChecked, {ID: opt.ID}) ? 'checked' : ''}>`);
+                let $opt = $(`<div title="${opt.name ? opt.name : ''}" class="elf-options" style="cursor: pointer; height: ${height}px;overflow: hidden; white-space: nowrap; text-overflow: ellipsis"></div>`),
+                    $optInput = $(`<input rank="${opt.rank}" value="${opt.ID}" style="cursor: pointer; margin-left: 5px; vertical-align: middle" type="checkbox" 
+                    ${node.data.optionChecked && _.find(node.data.optionChecked, {ID: opt.ID}) ? 'checked' : ''} ${projectReadOnly ? 'disabled' : ''}>`);
                 $opt.text(`${opt.name ? opt.name : ''}`);
                 $opt.prepend($optInput);
                 $optDiv.append($opt);
                 //选项复选框点击监听
-                $opt.click(function () {
-                    //单选
-                    if(billsGuidanceSelMode === 0){
-                        let $allInput = $optDiv.find('input');
-                        for(let input of $allInput){
-                            $(input).prop('checked', false);
-                        }
-                        $($optInput).prop('checked', 'checked');
-                        elfItem.workBook.getSheet(0).endEdit();
-                    } else {//多选
+                if (!projectReadOnly) {
+                    $opt.click(function () {
+                        //单选
+                        if(billsGuidanceSelMode === 0){
+                            let $allInput = $optDiv.find('input');
+                            for(let input of $allInput){
+                                $(input).prop('checked', false);
+                            }
+                            $($optInput).prop('checked', 'checked');
+                            elfItem.workBook.getSheet(0).endEdit();
+                        } else {//多选
 
-                    }
-                });
+                        }
+                    });
+                }
             }
             $editor.append($editInput);
             $editor.append($optDiv);

+ 20 - 3
web/building_saas/main/js/views/block_lib.js

@@ -383,7 +383,12 @@ var blockLibObj = {
             blockLibObj.assignData(temp, source);
 
         try {
-            await ajaxPost('/blockLib/saveBlock', temp.data);
+            let obj = {
+                libID: blockLibObj.activeLib.libID,
+                nodeID: temp.data.ID,
+                create: temp.data
+            };
+            await ajaxPost('/blockLib/saveBlock', obj);
             let newN = tree.insertByID(ID, pID, nID);
             newN.data = temp.data;
             tree.selected = newN;
@@ -427,8 +432,14 @@ var blockLibObj = {
             delete r.feesIndex;
         };
     },
-    reName: function (node, newName){
+    reName: async function (node, newName){
         if (newName == '') return;
+        let obj = {
+            libID: blockLibObj.activeLib.libID,
+            nodeID: node.data.ID,
+            update: {nodeName: newName}
+        };
+        await ajaxPost('/blockLib/saveBlock', obj);
         node.data.nodeName = newName;
         let idx = blockLibObj.mainTree.items.indexOf(node);
         blockLibObj.mainSheet.setValue(idx, 0, newName);
@@ -436,7 +447,13 @@ var blockLibObj = {
     moveBlock: function (parentID) {
         // this.mainTreeController.moveTo(parentID);
     },
-    delete: function () {
+    delete: async function () {
+        let obj = {
+            libID: blockLibObj.activeLib.libID,
+            nodeID: blockLibObj.mainTree.selected.data.ID,
+            delete: true
+        };
+        await ajaxPost('/blockLib/saveBlock', obj);
         this.mainTreeController.delete();
     },
     getCategories: function () {

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

@@ -1095,6 +1095,7 @@ var gljOprObj = {
                 distTypeTree.comboDatas.push({text: distTypeObj.data.fullName, value: distTypeObj.data.ID});
             }
         });
+        console.log(distTypeTree);
         return distTypeTree;
     },
     doInsertGLJ: function () {

+ 3 - 0
web/building_saas/main/js/views/mbzm_view.js

@@ -483,6 +483,9 @@ $('#createLocation').change(function(){
 
 
 $('#next_mbzm').click(function () {
+    if (projectReadOnly) {
+        return;
+    }
     let mainSheet = projectObj.mainSpread.getActiveSheet();
     let selection = mainSheet.getSelections()[0];
     let node =  projectObj.project.mainTree.selected;

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

@@ -3162,6 +3162,9 @@ function disableTools(){
     //清单精灵
     $('#elfInsertRation').addClass('disabled');
     $('#elfInsertSingle').addClass('disabled');
+    //模板子目:应用、下一条
+    $('#apply_mbzm').addClass('disabled');
+    $('#next_mbzm').addClass('disabled');
     //特征及内容
     $('#add-rule').find('select').prop('disabled', 'disabled');
     $('#use-to-current').addClass('disabled');
@@ -3176,9 +3179,9 @@ function disableTools(){
     $('#compleRationLib').addClass('disabled');
     $('#compleGljLib').addClass('disabled')
     //库
-    $('#stdBillsGuidanceTab').addClass('disabled');
+    //$('#stdBillsGuidanceTab').addClass('disabled');
     $('#stdBillsTab').addClass('disabled');
-    $('#stdRationTab').addClass('disabled');
+    //$('#stdRationTab').addClass('disabled');
     $('#blockLibTab').addClass('disabled');
     //人材机汇总,选择其他、另存使用
     $('a[data-target="#change-unitFile"]').remove();

+ 4 - 5
web/building_saas/main/js/views/std_billsGuidance_lib.js

@@ -105,10 +105,7 @@ const billsGuidance = (function () {
                 if(!node){
                     return;
                 }
-                if(node.children.length === 0){
-                    billsLibObj.insertBills(stdBillsJobData, stdBillsFeatureData, node);
-                }
-                else {
+                if(node.children.length > 0){
                     node.setExpanded(!node.expanded);
                     //设置展开收起状态
                     sessionStorage.setItem('stdBillsGuidanceExpState', bills.tree.getExpState(bills.tree.items));
@@ -121,6 +118,8 @@ const billsGuidance = (function () {
                         args.sheet.invalidateLayout();
                     });
                     args.sheet.repaint();
+                } else if(!projectReadOnly) {
+                    billsLibObj.insertBills(stdBillsJobData, stdBillsFeatureData, node);
                 }
             }
         }
@@ -737,7 +736,7 @@ const billsGuidance = (function () {
     function bindBtn(){
         //打开清单指引库
         $('#stdBillsGuidanceTab').click(function () {
-            if(libSel.children().length === 0 && !projectReadOnly && !$(this).hasClass('disabled')){
+            if(libSel.children().length === 0 && !$(this).hasClass('disabled')){
                 initLibs(projectInfoObj.projectInfo.engineeringInfo.billsGuidance_lib);
             }
         });

+ 18 - 11
web/building_saas/main/js/views/std_ration_lib.js

@@ -27,8 +27,9 @@ var rationLibObj = {
         if (!this.sectionRationsSpread) {
             this.sectionRationsSpread = SheetDataHelper.createNewSpread($('#stdSectionRations')[0]);
             sheetCommonObj.spreadDefaultStyle(this.sectionRationsSpread);
-
-            this.sectionRationsSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick, this.onRationSpreadCellDoubleClick);
+            if (!projectReadOnly) {
+                this.sectionRationsSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick, this.onRationSpreadCellDoubleClick);
+            }
             this.refreshSettingForHint();
         }
     },
@@ -280,6 +281,9 @@ var rationLibObj = {
                 "insertStdRation": {
                     name: "插入定额",
                     icon: 'fa-sign-in',
+                    disabled: function () {
+                        return projectReadOnly;
+                    },
                     callback: function (key, opt) {
                         let select = $('#stdRationLibSelect'), rationSelect = rationSheet.getSelections();
                         let rationCode = rationSelect.length > 0 ? rationSheet.getText(rationSelect[0].row, 0) : '';
@@ -292,6 +296,9 @@ var rationLibObj = {
                 "replaceStdRation": {
                     name: "替换定额",
                     icon: 'fa-sign-in',
+                    disabled: function () {
+                        return projectReadOnly
+                    },
                     callback: function (key, opt) {
                         let select = $('#stdRationLibSelect'), rationSelect = rationSheet.getSelections();
                         let rationCode = rationSelect.length > 0 ? rationSheet.getText(rationSelect[0].row, 0) : '';
@@ -533,14 +540,12 @@ if($('#stdRationChapter').height() === 0 || $('#stdSectionRations').height() ===
 }
 
 $('#stdRationTab').bind('click', function () {
-    if(!projectReadOnly){
-        var select = $('#stdRationLibSelect');
-        rationLibObj.checkSpread();
-        if (select[0].options.length === 0) {
-            rationLibObj.loadStdRationLibs();
-            rationLibObj.loadStdRationContextMenu();
-        };
-    }
+    var select = $('#stdRationLibSelect');
+    rationLibObj.checkSpread();
+    if (select[0].options.length === 0) {
+        rationLibObj.loadStdRationLibs();
+        rationLibObj.loadStdRationContextMenu();
+    };
 });
 $('#stdRationLibSelect').change(function () {
     var select = $(this);
@@ -694,7 +699,9 @@ function seachRation(){
             rationLibObj.resultSpread = resultSpread;
             bindContextmenuOpr(resultSpread.getActiveSheet());
             SheetDataHelper.loadSheetHeader(rationLibObj.sectionRationsSetting, resultSpread.getActiveSheet());
-            resultSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick, rationLibObj.onRationSpreadCellDoubleClick);
+            if (!projectReadOnly) {
+                resultSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick, rationLibObj.onRationSpreadCellDoubleClick);
+            }
             resultSpread.bind(GC.Spread.Sheets.Events.TopRowChanged, rationLibObj.onRationSpreadTopRowChanged);
         }else {
             rationLibObj.resultSpread.refresh();

+ 6 - 3
web/building_saas/report/html/rpt_print.html

@@ -47,7 +47,8 @@
                     $(document).attr("title", pageData[JV.NODE_PAGE_INFO][JV.NODE_MAIN_INFO_RPT_NAME]);
                 }
                 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])?"纵向":"横向";
+                //let orientation = (pageData[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE][0] < pageData[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE][1])?"纵向":"横向";
+                let orientation = "纵向";
                 showPreviewData(svgArr, scaleFactor, sessionStorage.pageSize, orientation);
             }
             window.print();
@@ -56,12 +57,14 @@
             let scaleFactor = parseInt(sessionStorage.scaleFactor);
             let svgArr = rptPrintHelper.buildSvgArr(pageData, -30, -30);
             $(document).attr("title", pageData[JV.NODE_PAGE_INFO][JV.NODE_MAIN_INFO_RPT_NAME]);
-            showPreviewData(svgArr, scaleFactor, sessionStorage.pageSize, sessionStorage.orientation);
+            //showPreviewData(svgArr, scaleFactor, sessionStorage.pageSize, sessionStorage.orientation);
+            showPreviewData(svgArr, scaleFactor, sessionStorage.pageSize, "纵向");
             window.print();
         } else if (sessionStorage.currentPageSvgData) {
             let svgArr = JSON.parse(sessionStorage.currentPageSvgData);
             let scaleFactor = 1;
-            showPreviewData(svgArr, scaleFactor, sessionStorage.pageSize, sessionStorage.orientation);
+            //showPreviewData(svgArr, scaleFactor, sessionStorage.pageSize, sessionStorage.orientation);
+            showPreviewData(svgArr, scaleFactor, sessionStorage.pageSize, "纵向");
             window.print();
         } else {
             //alert("没有报表数据!");

+ 159 - 6
web/building_saas/report/js/rpt_print.js

@@ -56,14 +56,20 @@ let rptPrintHelper = {
         ;
         let rst = [];
         let canvas = document.getElementById("chkCanvas");
+        let pixelSize = getPixelSize(pagesData);
+        let isHtoV = false;
+        if (pixelSize[0] > pixelSize[1]) {
+            // changeHtoV(pagesData, pixelSize);
+            // isHtoV = true;
+        }
         for (let idx = 0; idx < pagesData.items.length; idx++) {
             let page = pagesData.items[idx];
-            let svgPageArr = [], pixelSize = getPixelSize(pagesData);
+            let svgPageArr = [];
             svgPageArr.push("<svg width='" + pixelSize[0] + "' height='" + pixelSize[1] + "'>");
             // let adjustY = 0.5 * ((idx + 1) % 2);
             let adjustY = 0.5;
             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, isHtoV));
             }
             svgPageArr.push("</svg>");
             rst.push(svgPageArr);
@@ -72,6 +78,36 @@ let rptPrintHelper = {
     }
 };
 
+function changeHtoV(pagesData, pixelSize) {
+    //坐标从横向变纵向
+    if (pixelSize[0] > pixelSize[1]) {
+        let tmpP = pixelSize[0];
+        pixelSize[0] = pixelSize[1];
+        pixelSize[1] = tmpP;
+    }
+    let offsetX = pixelSize[0];
+    // let RotAngF = (90 * Math.PI / 180); //这里默认就是90度旋转
+    let sinVal = 1; //sin 90度 = 1 不用算了
+    let cosVal = 0; //cos 90度 = 0 不用算了
+    for (let page of pagesData.items) {
+        for (let cell of page.cells) {
+            rotateCellArea(cell[JV.PROP_AREA], sinVal, cosVal, offsetX);
+        }
+    }
+}
+
+function rotateCellArea(area, sinVal, cosVal, offsetX) {
+    let Nx, Ny;
+    Nx = (area[JV.PROP_LEFT] * cosVal - area[JV.PROP_TOP] * sinVal);
+    Ny = (area[JV.PROP_TOP] * cosVal + area[JV.PROP_LEFT] * sinVal);
+    area[JV.PROP_LEFT] = Nx + offsetX;
+    area[JV.PROP_TOP] = Ny;
+    Nx = (area[JV.PROP_RIGHT] * cosVal - area[JV.PROP_BOTTOM] * sinVal);
+    Ny = (area[JV.PROP_BOTTOM] * cosVal + area[JV.PROP_RIGHT] * sinVal);
+    area[JV.PROP_RIGHT] = Nx + offsetX;
+    area[JV.PROP_BOTTOM] = Ny;
+}
+
 function getActualBorderStyle(cell, styles, mergeBorderStyle, pageBorderArea, borderStr) {
     let rst = styles[cell[JV.PROP_STYLE]][borderStr];
     if (mergeBorderStyle) {
@@ -92,7 +128,7 @@ function getActualBorderStyle(cell, styles, mergeBorderStyle, pageBorderArea, bo
     return rst;
 }
 
-function buildCellSvg(cell, fonts, styles, controls, pageMergeBorder, rptMergeBorder, offsetX, offsetY, adjustY, canvas) {
+function buildCellSvg(cell, fonts, styles, controls, pageMergeBorder, rptMergeBorder, offsetX, offsetY, adjustY, canvas, isHtoV) {
     let rst = [];
     let style = styles[cell[JV.PROP_STYLE]];
     let mergeBandStyle = null;
@@ -142,12 +178,129 @@ function buildCellSvg(cell, fonts, styles, controls, pageMergeBorder, rptMergeBo
     if (typeof control === 'string') {
         control = controls[cell[JV.PROP_CONTROL]];
     }
-    buildText(rst, cell, font, control, offsetX, offsetY, adjustY, canvas);
+    buildText(rst, cell, font, control, offsetX, offsetY, adjustY, canvas, isHtoV);
 
     return rst.join("");
 }
 
-function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canvas) {
+function buildTextHtoV(destRst, cell, font, control, offsetX, offsetY, adjustY, canvas, isHtoV) {
+    let orgFontHeight = parseInt(font[JV.FONT_PROPS[JV.FONT_PROP_IDX_HEIGHT]]);
+    let fontWeight = (font[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]] === 'T')?"bold":"normal";
+    let fontStyle = (font[JV.FONT_PROPS[JV.FONT_PROP_IDX_ITALIC]] === 'T')?"italic":"normal";
+    let fontUnderline = (font[JV.FONT_PROPS[JV.FONT_PROP_IDX_UNDERLINE]] === 'T')?"underline":"normal";
+    let left = parseInt(cell[JV.PROP_AREA][JV.PROP_LEFT]) + offsetX + 0.5,
+        right = parseInt(cell[JV.PROP_AREA][JV.PROP_RIGHT]) + offsetX + 0.5,
+        top = parseInt(cell[JV.PROP_AREA][JV.PROP_TOP]) + offsetY + adjustY,
+        bottom = parseInt(cell[JV.PROP_AREA][JV.PROP_BOTTOM]) + offsetY + adjustY,
+        x = left, y = top,
+        text_anchor = "start"
+    ;
+    let value = cell[JV.PROP_VALUE];
+    if (!(value)) {
+        value = "";
+    }
+    let values = null;
+    if (typeof value === "string") {
+        values = value.split("|");
+    } else {
+        values = [value];
+    }
+    // let stepHeight = (parseInt(cell[JV.PROP_AREA][JV.PROP_BOTTOM]) - parseInt(cell[JV.PROP_AREA][JV.PROP_TOP])) / values.length;
+    if (control) {
+        if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]] === "left") {
+            text_anchor = "start";
+            x = left + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT];
+        } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]] === "right") {
+            text_anchor = "end";
+            x = right - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT];
+        } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]] === "center") {
+            text_anchor = "middle";
+            x = Math.round((left + right) / 2);
+        }
+    }
+
+    let area = [0,0,0,0];
+    area[JV.IDX_TOP] = top;
+    area[JV.IDX_BOTTOM] = bottom;
+    area[JV.IDX_LEFT] = left;
+    area[JV.IDX_RIGHT] = right;
+    let height = bottom - top;
+    let ctx = canvas.getContext("2d");
+    let inner_draw_text = function (textValue) {
+        let dftFontHeight = orgFontHeight;
+        ctx.font = ((font[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]] === 'T')?"bold ":"") + ((font[JV.FONT_PROPS[JV.FONT_PROP_IDX_ITALIC]] === 'T')?"italic":"") + dftFontHeight + "px " + font[JV.PROP_NAME];
+        function inner_build_text(innerTxt, innerArea) {
+            let innerDftFontHeight = (dftFontHeight * 3 / 4); //SVG的字体与canvas的字体大小的切换, 不用考虑取整
+            if (control) {
+                if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === "top") {
+                    y = innerArea[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.IDX_TOP];
+                } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === "bottom") {
+                    y = innerArea[JV.IDX_BOTTOM] - JV.OUTPUT_OFFSET[JV.IDX_BOTTOM];
+                } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === "center") {
+                    y = Math.round((innerArea[JV.IDX_TOP] + innerArea[JV.IDX_BOTTOM] + innerDftFontHeight) / 2 );
+                }
+            } else {
+                y = innerArea[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.IDX_TOP];
+            }
+            if (font[JV.PROP_NAME] === "宋体") {
+                y--;
+            }
+            destRst.push("<text style='fill:black;font-family:" + font[JV.PROP_NAME] +
+                ";font-weight:" + fontWeight +
+                ";font-style:" + fontStyle +
+                ";text-decoration:" + fontUnderline +
+                // ";text-decoration:normal" +
+                ";font-size:" + innerDftFontHeight + "pt' x='" +
+                x +"' y='" + y + "' text-anchor='" + text_anchor + "' xml:space='preserve'>" + innerTxt + "</text>");
+        }
+        let actLines = private_splitString(textValue, (area[JV.IDX_RIGHT] - area[JV.IDX_LEFT]), 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;
+                    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;
+                        if ((aH * actLines.length) < (area[JV.IDX_BOTTOM] - area[JV.IDX_TOP]) && (control && control.Vertical !== 'top')) {
+                            if (control.Vertical === 'bottom') {
+                                area[JV.IDX_TOP] = area[JV.IDX_BOTTOM] - (aH * actLines.length);
+                            } else {
+                                area[JV.IDX_TOP] = (area[JV.IDX_TOP] + area[JV.IDX_BOTTOM]) / 2 - (aH * actLines.length) / 2
+                                area[JV.IDX_BOTTOM] = area[JV.IDX_TOP] + (aH * actLines.length);
+                            }
+                        }
+                        let newArea = [], baseTop = area[JV.IDX_TOP];
+                        for (let ai = 0; ai < area.length; ai++) {
+                            newArea[ai] = area[ai];
+                        }
+                        for (let lIdx = 0; lIdx < actLines.length; lIdx++) {
+                            newArea[JV.IDX_TOP] = Math.round(aH * lIdx + baseTop);
+                            newArea[JV.IDX_BOTTOM] = Math.round(aH * (lIdx + 1) + baseTop);
+                            inner_build_text(actLines[lIdx], newArea);
+                        }
+                        break;
+                    } else {
+                        dftFontHeight--;
+                        ctx.font = ((font[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]] === 'T')?"bold ":"") + ((font[JV.FONT_PROPS[JV.FONT_PROP_IDX_ITALIC]] === 'T')?"italic":"") + dftFontHeight + "px " + font[JV.PROP_NAME];
+                    }
+                } else {
+                    inner_build_text(textValue, area);
+                    break;
+                }
+            }
+        }
+    };
+    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);
+        inner_draw_text(values[vidx]);
+    }
+}
+
+function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canvas, isHtoV) {
     let orgFontHeight = parseInt(font[JV.FONT_PROPS[JV.FONT_PROP_IDX_HEIGHT]]);
     let fontWeight = (font[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]] === 'T')?"bold":"normal";
     let fontStyle = (font[JV.FONT_PROPS[JV.FONT_PROP_IDX_ITALIC]] === 'T')?"italic":"normal";
@@ -169,7 +322,7 @@ function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canv
     } else {
         values = [value];
     }
-    let stepHeight = (parseInt(cell[JV.PROP_AREA][JV.PROP_BOTTOM]) - parseInt(cell[JV.PROP_AREA][JV.PROP_TOP])) / values.length;
+    // let stepHeight = (parseInt(cell[JV.PROP_AREA][JV.PROP_BOTTOM]) - parseInt(cell[JV.PROP_AREA][JV.PROP_TOP])) / values.length;
     if (control) {
         if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]] === "left") {
             text_anchor = "start";