Просмотр исходного кода

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

zhangweicheng 7 лет назад
Родитель
Сommit
80c0ad7dfb

+ 0 - 4
modules/pm/models/project_model.js

@@ -283,10 +283,6 @@ ProjectsDAO.prototype.copyUserProjects = function (userId, datas, callback) {
 
 ProjectsDAO.prototype.rename = async function (userId, compilationId, data, callback){
     try {
-        console.log("------------------------------------");
-        console.log(userId) ;
-        console.log("------------------------------------");
-        console.log(compilationId) ;
         if (data.id === undefined || data.id === '') {
             throw '数据错误!';
         }

+ 36 - 25
modules/reports/util/rpt_construct_data_util.js

@@ -735,33 +735,39 @@ function ext_getFee(feeKey, dtlFeeKey) {
     let dtObj = parentObj["myOwnRawDataObj"];
     if (feeKey && dtObj) {
         for (let dItem of dtObj.data) {
-            let hasValue = false;
-            if (dItem.hasOwnProperty("fees")) {
-                for (let fee of dItem["fees"]) {
-                    if (fee["fieldName"] === feeKey) {
-                        if (dtlFeeKey) {
-                            rst.push(fee[dtlFeeKey]);
-                        } else {
-                            rst.push(fee["unitFee"]);
-                        }
-                        hasValue = true;
-                        break;
-                    }
+            rst.push(pri_getFee(dItem, feeKey, dtlFeeKey));
+        }
+    }
+    for (let i = 0; i < rst.length; i++) {
+        rst[i] = parseFloat(rst[i]);
+    }
+    return rst;
+}
+
+function pri_getFee(dItem, feeKey, dtlFeeKey) {
+    let rst = 0;
+    let hasValue = false;
+    if (dItem.hasOwnProperty("fees")) {
+        for (let fee of dItem["fees"]) {
+            if (fee["fieldName"] === feeKey) {
+                if (dtlFeeKey) {
+                    rst = fee[dtlFeeKey];
+                } else {
+                    rst = fee["unitFee"];
                 }
-            } else if (dItem.hasOwnProperty(feeKey)) {
-                hasValue = true;
-                rst.push(dItem[feeKey]);
-            } else {
                 hasValue = true;
-                rst.push(0);
-            }
-            if (!hasValue) {
-                rst.push(0);
+                break;
             }
         }
+    } else if (dItem.hasOwnProperty(feeKey)) {
+        hasValue = true;
+        rst = dItem[feeKey];
+    } else {
+        hasValue = true;
+        rst = 0;
     }
-    for (let i = 0; i < rst.length; i++) {
-        rst[i] = parseFloat(rst[i]);
+    if (!hasValue) {
+        rst = 0;
     }
     return rst;
 }
@@ -868,7 +874,7 @@ function ext_getPropertyByFlag(flagVal, rstKey, dftValIfEmpty) {
     if (flagVal && rstKey && dtObj) {
         let isArr = (flagVal instanceof Array);
         for (let dItem of dtObj.data) {
-            let doc = (dItem._doc === null || dItem._doc === undefined)?dItem:dItem._doc;
+            let doc = (dItem._doc)?dItem._doc:dItem;
             if (doc.hasOwnProperty("flags")) {
                 let bFlag = false;
                 for (let flagItem of doc.flags) {
@@ -882,13 +888,18 @@ function ext_getPropertyByFlag(flagVal, rstKey, dftValIfEmpty) {
                     if (bFlag) break;
                 }
                 if (bFlag) {
-                    rst.push(doc[rstKey]);
+                    let keys = rstKey.split(".");
+                    if (keys[0] === "fees") {
+                        rst.push(pri_getFee(doc, "common", keys[1]));
+                    } else {
+                        //其他,比如名称什么
+                    }
                     break;
                 }
             }
         }
     }
-    if (rst.length === 0 && dftValIfEmpty) {
+    if (rst.length === 0 && dftValIfEmpty !== null) {
         rst.push(dftValIfEmpty);
     }
     return rst;

+ 115 - 0
test/unit/reports/test_cover_02.js

@@ -0,0 +1,115 @@
+/**
+ * Created by Tony on 2017/12/18.
+ */
+
+let test = require('tape');
+import JpcEx from "../../../modules/reports/rpt_component/jpc_ex";
+import JV from "../../../modules/reports/rpt_component/jpc_value_define";
+let mongoose = require("mongoose");
+let fileUtils = require("../../../modules/common/fileUtils");
+let path = require('path');
+let dbm = require("../../../config/db/db_manager");
+let rpt_cfg = require('./rpt_cfg');
+dbm.connect();
+let consts = require('../../../modules/main/models/project_consts');
+let projectConsts = consts.projectConst;
+fileUtils.getGlobbedFiles('../../../modules/complementary_glj_lib/models/*.js').forEach(function(modelPath) {
+    require(path.resolve(modelPath));
+});
+
+fileUtils.getGlobbedFiles('../../../modules/ration_glj/models/*.js').forEach(function(modelPath) {
+    require(path.resolve(modelPath));
+});
+
+//引入报表模块
+fileUtils.getGlobbedFiles('../../../modules/reports/models/*.js').forEach(function(modelPath) {
+    require(path.resolve(modelPath));
+})
+
+//暂时引入其它模块的model
+require('../../../modules/fee_rates/models/fee_rates');
+// 引入人工系数模块
+require('../../../modules/main/models/labour_coe_model');
+require('../../../modules/main/models/calc_program_model');
+
+let fsUtil = require("../../../public/fsUtil");
+
+let prjMdl = require('../../../modules/pm/models/project_model');
+let projectDataMdl = require('../../../modules/main/models/project');
+let demoPrjId = - 1;
+let demoRptId = 229, pagesize = "A4";
+
+let userId_Leng = 1142; //小冷User Id
+demoPrjId = 1296; //QA:
+//*/
+ let userId_Dft = userId_Leng;
+ /*/
+let userId_Dft = 76075;
+//*/
+
+let rptTplFacade = require("../../../modules/reports/facade/rpt_template_facade");
+let rptTplDataFacade = require("../../../modules/reports/facade/rpt_tpl_data_facade");
+
+import rptDataExtractor from "../../../modules/reports/util/rpt_construct_data_util";
+
+let fs = require('fs');
+//设置Date Format函数
+fs.readFile(__dirname.slice(0, __dirname.length - 18) + '/public/web/date_util.js', 'utf8', 'r', function (err, data) {
+    eval(data);
+});
+
+//*
+test('测试 - 打开模板: 封-1 ', function (t) {
+    rptTplFacade.getRptTemplate(demoRptId).then(function(rptTpl) {
+        let rptDataUtil = new rptDataExtractor();
+        rptDataUtil.initialize(rptTpl._doc);
+        let filter = rptDataUtil.getDataRequestFilter();
+        // console.log(filter);
+        //正常应该根据报表模板定义的数据类型来请求数据
+        rptTplDataFacade.prepareProjectData(userId_Dft, demoPrjId, filter, function (err, msg, rawDataObj) {
+            if (!err) {
+                try {
+                    // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/rptTplRawDataObject.js");
+                    let tplData = rptDataUtil.assembleData(rawDataObj);
+                    //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);
+                    let maxPages = printCom.totalPages;
+                    let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
+                    if (pageRst) {
+                        fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult.js");
+                    } 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();
+            } else {
+                console.log(msg);
+                t.pass('pass with error!');
+                t.end();
+            }
+        })
+    });
+});
+//*/
+
+test('close the connection', function (t) {
+    setTimeout(function () {
+        mongoose.disconnect();
+        t.pass('closing db connection');
+        t.end();
+    }, 3000);
+    // mongoose.disconnect();
+    // t.pass('closing db connection');
+    // t.end();
+});

+ 39 - 14
web/building_saas/main/js/models/calc_program.js

@@ -854,8 +854,6 @@ class CalcProgram {
         }
         else if (me.isLeafBill(treeNode)) {
             if (treeNode.children && treeNode.children.length > 0){
-                // me.calcLeafBillChildren(treeNode);
-
                 // 清单单价计算模式下的叶子清单:取自己的计算程序ID,找到自己的计算程序计算。(汇总清单所有定额的工料机)
                 if (me.project.property.billsCalcMode === leafBillGetFeeType.billsPrice)
                     treeNode.calcType = treeNodeCalcType.ctBillCalcProgram;
@@ -891,7 +889,7 @@ class CalcProgram {
         me.saveNodes(nodesArr);
     };
 
-    // 多个树结点入库存储,刷新界面显示。
+    // 存储、刷新零散的多个树结点
     saveNodes(treeNodes){
         if (treeNodes.length < 1) return;
 
@@ -937,14 +935,14 @@ class CalcProgram {
         };
     };
 
-/*    计算所有树结点(分3种情况),并将发生计算改动的结点入库存储
+/*    计算所有树结点(分3种情况),并返回发生变动的零散的多个树结点
     参数取值如下:
     calcAllType.catAll       计算所有树结点 (不指定参数时的默认值)
     calcAllType.catBills     计算所有清单 (改变项目属性中清单取费算法时会用到)
     calcAllType.catRations   计算所有定额、工料机形式的定额、量价,因为它们都走自己的计算程序 (改变人工系数、费率值、工料机单价时会用到) */
     calcAllNodes(calcType = calcAllType.catAll){
         let me = this;
-        let needSaveNodes = [];
+        let changedNodes = [];
 
         function calcNodes(nodes) {
             for (let node of nodes) {
@@ -954,31 +952,58 @@ class CalcProgram {
 
                 if ((calcType == calcAllType.catAll) || (calcType == node.sourceType)) {
                     me.calculate(node, false);
-                    if (node.changed) needSaveNodes.push(node);
+                    if (node.changed) changedNodes.push(node);
                 };
             }
         };
 
         calcNodes(me.project.mainTree.roots);
-        // me.saveNodes(needSaveNodes);   保存要与计算分离,否则实际应用场景中,会产生多次通讯。
-        return needSaveNodes;
+        // me.saveNodes(changedNodes);   保存要与计算分离,否则实际应用场景中,会产生多次通讯。
+        return changedNodes;
     };
 
-    // 重新计算叶子清单下的所有子结点:如定额、工料机定额等(calculate算法基于定额、工料机定额的计算结果是正确的,实际上有时它们的计算结果并不是最新的)
-    calcLeafBillChildren(treeNode){
+    // 计算叶子清单下的所有子结点(如定额、量价、工料机定额等), 并计算自身和所有父结点。最后打包存储。
+    calcLeafAndSave(treeNode){
         let me = this;
         if(!me.isLeafBill(treeNode)) return;
         if (treeNode.children && treeNode.children.length > 0) {
-            let needSaveNodes = [];
+            let changedNodes = [];
             for (let child of treeNode.children){
                 me.calculate(child, false);
-                if (child.changed) needSaveNodes.push(child);
+                if (child.changed) changedNodes.push(child);
+            };
+
+            me.calculate(treeNode);
+            let cur = treeNode;
+            while (cur) {
+                if (cur.changed) changedNodes.push(cur);
+                cur = cur.parent;
             };
-            me.saveNodes(needSaveNodes);
+
+            me.saveNodes(changedNodes);
         };
     };
-    calcRationsAndSave(nodes){//计算批量替换工料机后受影响的定额,同时将结果打包保存
 
+    // 计算多条零散的定额,并计算他们所属的清单、父级清单,然后打包存储。如:批量替换工料机后受影响的定额。
+    calcRationsAndSave(rationNodes){
+        let me = this, leafBills = [], changedNodes = [];
+        for (let node of rationNodes) {
+            me.calculate(node, false);
+            if (node.changed) changedNodes.push(node);
+            let leafBill = node.parent;
+            if (leafBill && leafBills.indexOf(leafBill) < 0) leafBills.push(leafBill);      // 多条定额同属一条叶子清单时,避免叶子清单重复计算
+        };
+
+        for (let node of leafBills){
+            me.calculate(node);
+            let cur = node;
+            while (cur) {
+                if (cur.changed && changedNodes.indexOf(cur) < 0) changedNodes.push(cur);
+                cur = cur.parent;
+            };
+        };
+
+        me.saveNodes(changedNodes);
     };
 
 }

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

@@ -365,6 +365,7 @@ var Ration = {
             ration.unit = std.unit;
             ration.libID = std.rationRepId;
             ration.content = std.jobContent;
+            ration.adjustState = '';
             if (std.chapter) {
                 ration.comments = std.chapter.explanation;
                 ration.ruleText = std.chapter.ruleText;

+ 1 - 1
web/building_saas/main/js/models/ration_glj.js

@@ -495,7 +495,7 @@ var ration_glj = {
                     ProjectController.syncDisplayNewNode(projectObj.mainController, newNode);
                 }
                 let parentNode = project.mainTree.nodes[project.mainTree.prefix+parentNodeID];
-                project.calcProgram.calcLeafBillChildren(parentNode);//计算父级清单的所有子节点
+                project.calcProgram.calcLeafAndSave(parentNode);//计算父级清单的所有子节点
                 //this.nodes[this.prefix + parentID];
                 callback();
                 $.bootstrapLoading.end();

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

@@ -1104,7 +1104,7 @@ var gljOprObj = {
           if(node){
               node.data.adjustState=s.adjustState;
               nodes.push(node);
-              rationNode.push(node);
+              rationNodes.push(node);
           }
         });
         gljNodes.length>0?nodes = nodes.concat(gljNodes):"";

+ 17 - 7
web/building_saas/main/js/views/project_property_bills_quantity_decimal.js

@@ -61,7 +61,7 @@ let billsDecimalView = {
     },
     
     setComboBox: function (sheet, items) {
-        let combo = new GC.Spread.Sheets.CellTypes.ComboBox();
+        let combo = sheetCommonObj.getDynamicCombo();
         combo.items(items);
         combo.editable(true);
         sheet.getRange(-1, 1, -1, 1).cellType(combo);
@@ -94,10 +94,12 @@ let billsDecimalView = {
     bindEvent: function (workBook) {
         const _events = GC.Spread.Sheets.Events;
         let sheet = workBook.getActiveSheet();
-        sheet.bind(_events.EditStarting, this.onEditStarting);
-        sheet.bind(_events.EditEnded, this.onEditEnded);
-        sheet.bind(_events.ClipboardPasting, this.onClipboardPasting);
-        sheet.bind(_events.ClipboardPasted, this.onClipboardPasted);
+        let me = billsDecimalView;
+        sheet.bind(_events.EnterCell, me.onEnterCell);
+        sheet.bind(_events.EditStarting, me.onEditStarting);
+        sheet.bind(_events.EditEnded, me.onEditEnded);
+        sheet.bind(_events.ClipboardPasting, me.onClipboardPasting);
+        sheet.bind(_events.ClipboardPasted, me.onClipboardPasted);
     },
 
     showData(datas){
@@ -116,6 +118,10 @@ let billsDecimalView = {
         this.renderSheetFuc(sheet, fuc);
     },
 
+    onEnterCell: function (sender, args) {
+        args.sheet.repaint();
+    },
+
     onEditStarting: function (sender, args) {
         if(args.col === 0 && args.row === 0){//其他未列单位不可编辑
             args.cancel = true;
@@ -123,13 +129,16 @@ let billsDecimalView = {
     },
 
     onEditEnded: function (sender, args) {
+        console.log('enter');
         let me = billsDecimalView;
-        let v =  args.editingText ? args.editingText.toString().trim() : '';
+        console.log(args);
+        let v =  args.editingText !== undefined && args.editingText !== null ? args.editingText.toString().trim() : '';
+        console.log(v);
         if(v.length === 0){
             return;
         }
         if(args.col === 0){
-            if(me.hasUnit(me.cache, v)){
+            if(v !== me.cache[args.row].unit && me.hasUnit(me.cache, v)){
                 alert('已存在此计量单位');
                 args.sheet.setValue(args.row, args.col, me.isDef(me.cache[args.row]) ? me.cache[args.row].unit : '');
             }
@@ -150,6 +159,7 @@ let billsDecimalView = {
                 me.cache[args.row].decimal = v;
             }
         }
+        console.log(me.cache[args.row]);
     },
 
     onClipboardPasting: function (sender, args) {

+ 15 - 3
web/building_saas/main/js/views/project_property_labour_coe_view.js

@@ -56,7 +56,20 @@ let labourCoeView = {
         var me = labourCoeView;
         if (args.propertyName !== "value"){return;};
         let cell = me.sheet.getCell(args.row, args.col);
-        me.addNeedUpdateData({ID: cell.tag(), coe: cell.value()});
+        let value = args.newValue;
+        let oValue = args.oldValue;
+        if (number_util.isNumber(value)) {
+            value = value.toDecimal(3);
+            me.sheet.suspendEvent();
+            cell.value(value);
+            me.sheet.resumeEvent();
+            me.addNeedUpdateData({ID: cell.tag(), coe: value});
+        } else {
+            me.sheet.suspendEvent();
+            cell.value(oValue);  // 屏蔽事件,否则这句会导致死循环
+            me.sheet.resumeEvent();
+            alert('当前输入的数据类型不正确,请重新输入。');
+        }
     },
 
     addNeedUpdateData: function (data) {
@@ -131,9 +144,8 @@ let labourCoeView = {
         me.loadData(datas);
     },
 
-    refresh(data){
+    refresh(){
         let me = this;
-        projectObj.project.labourCoe.refreshData(data);
         me.needUpdateDatas.splice(0, me.needUpdateDatas.length);
         $("#std_labour_coe_files").val('');
         calcProgramManage.buildSheet();

+ 11 - 9
web/building_saas/main/js/views/project_view.js

@@ -752,12 +752,14 @@ $('#property_ok').click(function () {
     //清单工程量精度
     let newBillsDecimalDatas = billsDecimalView.toBillsDecimalDatas(billsDecimalView.cache);
     if(billsDecimalView.toUpdate(billsQuanDecimal.datas, newBillsDecimalDatas)){
+        billsQuanDecimal.datas = newBillsDecimalDatas;
         reCalcBills = true;
         properties['property.billsQuantityDecimal'] = newBillsDecimalDatas;
     }
     //小数位数
     let updateDecimal = m_getDecimalData($('input', '#poj-settings-decimal'));
     if(toUpdateDecimal(decimalObj, updateDecimal)){
+        setDecimal(decimalObj, updateDecimal);
         reCalcRations = true;
         reCalcBills = true;
         properties['property.decimal'] = updateDecimal;
@@ -767,16 +769,15 @@ $('#property_ok').click(function () {
 
     // 人工系数
     if (labourCoeView.needSave()){
-        reCalcRations = true;
-        reCalcBills = true;
-        project.calcProgram.compileAllTemps();
-
         let libID = $("#std_labour_coe_files").children("option:selected").val();
         let libName = $("#std_labour_coe_files").children("option:selected").text();
 
         labourCoes.updateData = {libID: libID, libName: libName, newItemArr: labourCoeView.needUpdateDatas};
+        project.labourCoe.refreshData(labourCoes.updateData);  // 全编译所用到的人工系数来自project.labourCoe,所以必须先刷新project.labourCoe
+        project.calcProgram.compileAllTemps();
+        reCalcRations = true;
+        reCalcBills = true;
     };
-
     // 重新计算树节点
     let changedNodes = [];
     if (reCalcRations)    // 定额动,全部计算。
@@ -807,18 +808,19 @@ $('#property_ok').click(function () {
     };
 
     console.log(mixDatas);
+    // return;   // for test.
     function hasMixData() {
         return Object.keys(mixDatas.properties).length > 0 ||
             mixDatas.labourCoes.updateData || mixDatas.rations.length > 0 || mixDatas.bills.length > 0;
     }
 
-    if(hasMixData){
+/*    if(hasMixData()){
         CommonAjax.post('/pm/api/updateMixDatas', {user_id: userID, mixDataArr: mixDatas}, function (rstData) {
-/*            if (changedNodes.length > 0) {
+/!*            if (changedNodes.length > 0) {
                 for (let node of changedNodes){delete node.changed};
             };
-            if (mixDatas.labourCoes.updateData) labourCoeView.refresh(mixDatas.labourCoes.updateData);*/
+            if (mixDatas.labourCoes.updateData) labourCoeView.refresh();*!/
             window.location.href = '/main?project=' + projectID;
         });
-    }
+    }*/
 });

+ 1 - 1
web/building_saas/pm/js/pm_ajax.js

@@ -45,7 +45,7 @@ var UpdateProjectData = function (updateData, callback) {
     });
 };
 // 重命名项目
-var RenameProject = function(projId, newName, callback) {
+var RenameProject_ajax = function(projId, newName, callback) {
     $.ajax({
         type: "POST",
         url: '/pm/api/renameProject',

+ 0 - 1
web/building_saas/pm/js/pm_main.js

@@ -1443,7 +1443,6 @@ function GetNewProjectId(count, callback) {
  * @return {void}
  */
 function RenameProject(projectId, newName, parentID, callback) {
-    console.log(parentID);
     $.ajax({
         type: "POST",
         url: '/pm/api/renameProject',