浏览代码

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

zhongzewei 6 年之前
父节点
当前提交
ace6746fb7

+ 11 - 2
modules/main/controllers/bills_controller.js

@@ -457,9 +457,18 @@ function  generateUpdateTasks(data,projectID,user_id) {
             }
         };
         if(updateData[key]===true){
-            task.updateOne.update={
+            //原先是假删除,现在改成真删除
+            task = {
+                deleteOne:{
+                    filter:{
+                        ID:key,
+                        projectID:projectID
+                    }
+                }
+            }
+           /* task.updateOne.update={
                 deleteInfo:deleteInfo
-            };
+            };*/
         }else {
             task.updateOne.update=updateData[key];
         }

+ 11 - 5
modules/main/controllers/ration_controller.js

@@ -1,9 +1,10 @@
 /**
  * Created by jimiz on 2017/4/9.
  */
-var rationData = require('../models/ration');
-var ration_glj_facade = require('../../ration_glj/facade/ration_glj_facade');
-var ration_facade = require('../facade/ration_facade');
+let rationData = require('../models/ration');
+let ration_glj_facade = require('../../ration_glj/facade/ration_glj_facade');
+let ration_ass_facade = require('../../ration_glj/facade/ration_ass_facade');
+let ration_facade = require('../facade/ration_facade');
 let bill_facade = require('../facade/bill_facade');
 let project_facade = require("../facade/project_facade");
 let logger = require("../../../logs/log_helper").logger;
@@ -65,10 +66,15 @@ let controller = {
         if(data.bills.update.length > 0)  prepareUpdateNodes(data.bills.update,updateDatas,"bills");
         applyTasks.push(project_facade.updateNodes(updateDatas));
         let [rationResult,billsResult,updates] = await Promise.all(applyTasks);
-
-
         return {rationResult:rationResult,billsResult:billsResult,updateDatas:updateDatas};
+    },
+    //更新辅助定额
+    updateRationAss:async function(req){
+        let data = req.body.data;
+        data = JSON.parse(data);
+        return ration_ass_facade.updateRationAss(data);
     }
+
 };
 
 function prepareUpdateNodes(datas,nodes,type) {

+ 11 - 2
modules/main/facade/bill_facade.js

@@ -208,7 +208,16 @@ function generateBillTasks(data) {
     let deleteInfo={deleted: true, deleteDateTime: new Date(), deleteBy: user_id};
     if(data.delete && data.delete.length > 0){
         for(let d_ID of data.delete){
-            let task={
+            //原先是假删除,现在改成真删除
+            let task = {
+                deleteOne:{
+                    filter:{
+                        ID:d_ID,
+                        projectID:projectID
+                    }
+                }
+            };
+          /*  let task={
                 updateOne:{
                     filter:{
                         ID:d_ID,
@@ -218,7 +227,7 @@ function generateBillTasks(data) {
                         deleteInfo:deleteInfo
                     }
                 }
-            };
+            };*/
             tasks.push(task);
         }
     }

+ 11 - 2
modules/main/facade/project_facade.js

@@ -99,7 +99,16 @@ function generateTasks(data,userID) {
     let deleteInfo={deleted: true, deleteDateTime: new Date(), deleteBy: userID};
     if(data.delete && data.delete.length > 0){
         for(let bd of data.delete){
-            let task={
+            //原先是假删除,现在改成真删除
+            let task = {
+                deleteOne:{
+                    filter:{
+                        ID:bd.ID,
+                        projectID:bd.projectID
+                    }
+                }
+            };
+           /* let task={
                 updateOne:{
                     filter:{
                         ID:bd.ID,
@@ -109,7 +118,7 @@ function generateTasks(data,userID) {
                         deleteInfo:deleteInfo
                     }
                 }
-            };
+            };*/
             tasks.push(task);
         }
     }

+ 1 - 0
modules/main/facade/ration_facade.js

@@ -562,6 +562,7 @@ function createRationAss(std) {
         for(let i=0;i<std.rationAssList.length;i++){
             let ass = std.rationAssList[i];
             ass._doc.actualValue = ass.stdValue;
+            if(_.isString(ass._doc.assistCode)) ass._doc.assistCode = ass._doc.assistCode.replace("\n","");
             rationAssList.push(ass);
         }
     }

+ 2 - 1
modules/main/models/bills.js

@@ -71,7 +71,8 @@ class billsModel extends baseModel {
                         break;
                     case commonConsts.UT_DELETE:
                         doc.updateData.deleteInfo = {deleted: true, deleteDateTime: new Date(), deleteBy: user_id};
-                        bills.update({projectID: doc.updateData.projectID, ID: doc.updateData.ID}, doc.updateData, cb);
+                       //bills.update({projectID: doc.updateData.projectID, ID: doc.updateData.ID}, doc.updateData, cb);
+                        bills.deleteOne({projectID: doc.updateData.projectID, ID: doc.updateData.ID},cb);
                         break;
                 }
             }

+ 1 - 2
modules/main/models/project.js

@@ -86,8 +86,7 @@ Project.prototype.save = function(datas, callback){
     asyncTool.parallel(functions, function(err, results) {
         if (!err){
             callback(null, '', results)
-        }
-        else{
+        } else{
             console.log(err);
             callback(1, 'save project failed', null)
         }

+ 1 - 0
modules/main/routes/ration_route.js

@@ -16,5 +16,6 @@ module.exports = function (app) {
     rationRouter.post('/getSameSectionRations', rationController.action);
     rationRouter.post('/getDefaultProgramID', rationController.action);
     rationRouter.post('/applyTemplate', rationController.action);
+    rationRouter.post('/updateRationAss', rationController.action);
     app.use('/ration', rationRouter);
 };

+ 18 - 1
modules/ration_glj/facade/ration_ass_facade.js

@@ -13,7 +13,8 @@ let glj_calculate_facade = require('./glj_calculate_facade');
 
 module.exports={
     save:save,
-    getData:getData
+    getData:getData,
+    updateRationAss
 }
 
 let operationMap={
@@ -26,6 +27,22 @@ function create_ration_ass(user_id,datas) {
 
 };
 
+async function updateRationAss(data){
+    let result =await doRationAssAdjust(data.query.ration,data.doc);
+    let ration_glj ={
+        quantityRefresh:true,
+        glj_result:result.cal_result.glj_result
+    }
+    let ration = {
+        ID:result.cal_result.rationID,
+        adjustState:result.cal_result.adjustState,
+        name:result.cal_result.rationName,
+        rationAssList:data.doc.rationAssList
+    };
+    return {ration_glj:ration_glj,ration:ration}
+}
+
+
 function update_ration_ass(user_id,datas) {
     return function (callback) {
         let editAss = datas.query.editAss;

+ 2 - 1
modules/ration_glj/facade/ration_glj_facade.js

@@ -316,7 +316,8 @@ async function doCustomQuantityUpdate(datas) {
 
 function delete_ration_glj(user_id, datas) {
     return function (callback) {
-        callback(new Error("删除子数据失败!"),null)
+        deleteByID(datas, callback);
+        //callback(new Error("删除子数据失败!"),null)
         //这个方法已经不用,先注释,稳定后再删除
        /* if (datas.deleteType == "RATION") {
             deleteByRation(datas, callback);

+ 9 - 2
web/building_saas/main/js/controllers/block_controller.js

@@ -242,8 +242,15 @@ let BlockController = {
         if(blockData.firstNodeType == blockType.RATION){ //复制的是定额,需根据新的父项信息和工程量明细计算工程量
             for(let d of blockData.datas){
                 d.billsItemID = parentID;
-                let billsQuantity = scMathUtil.roundForObj(parent.data.quantity,getDecimal("quantity",parent));
-                this.calcRationQuantityAndContain(billsQuantity,d,parent.data.unit);
+                if (blockData.zeroQuantity){   // 来自克隆块
+                    d.quantity = 0;
+                    d.quantityEXP = '';
+                    d.contain = '';
+                }else{
+                    let billsQuantity = scMathUtil.roundForObj(parent.data.quantity,getDecimal("quantity",parent));
+                    this.calcRationQuantityAndContain(billsQuantity,d,parent.data.unit);
+                }
+
                 //如果粘贴位置不属于分部分项工程,或者不是安装工程,则把安装增加费内容置空
                 if(!Bills.isFBFX(parent)|| !project.isInstall()){
                     d.ration_installations = [];

+ 19 - 6
web/building_saas/main/js/models/calc_program.js

@@ -565,17 +565,25 @@ let calcTools = {
     marketPriceToBase: function (treeNode, baseName, isTender) {
         if (treeNode.data.type != rationType.volumePrice && treeNode.data.type != rationType.gljRation) return;
         let result = 0, me = this;
-        if (
-            (treeNode.data.subType === gljType.LABOUR && calcTools.inBase(baseName, 'RGF')) ||
+
+        let rcj = (treeNode.data.subType === gljType.LABOUR && calcTools.inBase(baseName, 'RGF')) ||
             (baseMaterialTypes.includes(treeNode.data.subType) && calcTools.inBase(baseName, 'CLF')) ||
-            (treeNode.data.subType === gljType.GENERAL_MACHINE && calcTools.inBase(baseName, 'JXF')) ||
+            (treeNode.data.subType === gljType.GENERAL_MACHINE && calcTools.inBase(baseName, 'JXF'));
+
+        if (typeof isJX2017 != 'undefined') {
+            rcj = rcj || (treeNode.data.subType === gljType.LABOUR && calcTools.inBase(baseName, 'SC_RGF')) ||
+                (baseMaterialTypes.includes(treeNode.data.subType) && calcTools.inBase(baseName, 'SC_CLF')) ||
+                (treeNode.data.subType === gljType.GENERAL_MACHINE && calcTools.inBase(baseName, 'SC_JXF'))
+        };
+
+        if (rcj ||
             (treeNode.data.subType === gljType.MAIN_MATERIAL && calcTools.inBase(baseName, 'ZCF')) ||
             (treeNode.data.subType === gljType.EQUIPMENT && calcTools.inBase(baseName, 'SBF'))) {
             if (treeNode.data.type == rationType.volumePrice)
                 result = treeNode.data.marketUnitFee ? parseFloat(treeNode.data.marketUnitFee).toDecimal(decimalObj.ration.unitPrice) : 0
             else if (treeNode.data.type == rationType.gljRation)
-                // result = treeNode.data.basePrice ? parseFloat(treeNode.data.basePrice).toDecimal(decimalObj.ration.unitPrice) : 0;
-                // 这里因为是算基数所以要取基价,但不能直接取basePrice,受限于项目属性的三个选项。
+            // result = treeNode.data.basePrice ? parseFloat(treeNode.data.basePrice).toDecimal(decimalObj.ration.unitPrice) : 0;
+            // 这里因为是算基数所以要取基价,但不能直接取basePrice,受限于项目属性的三个选项。
                 result = gljOprObj.getBasePrice(treeNode);
         }
         else if (treeNode.data.subType === gljType.GENERAL_MACHINE && calcTools.inBase(baseName, 'JSRGF')) {
@@ -927,11 +935,16 @@ let rationCalcBasesNameKinds = {
     QTCLF:      ['定额其他材料费'],
     JXF:        ['定额基价机械费', '定额机械费', '定额施工机具使用费'],
     JSRGF:      ['定额基价机上人工费'],
-    ZCF:        ['主材费'],
+    ZCF:        ['主材费', '市场价主材费'],
     SBF:        ['设备费'],
     RGGR:       ['人工工日'],
     ZGCLF:      ['暂估材料费'],
 
+    // 市场价人工费、市场价材料费、市场价机械费。江西用,跟重庆区分开,概念上不太统一,这里要注意区分。
+    SC_RGF:     ['人工费'],
+    SC_CLF:     ['材料费'],
+    SC_JXF:     ['机械费'],
+
     JC_RGF:     ['人工费价差'],
     JC_CLF:     ['材料费价差'],
     JC_JXF:     ['机械费价差'],

+ 10 - 2
web/building_saas/main/js/models/ration_ass.js

@@ -99,6 +99,7 @@ var ration_ass = {
             return updateData;
         };
         ration_ass.prototype.updateActualValue=function(assList,index,newVal){
+            let me = this;
             var selected = projectObj.project.mainTree.selected;
             assList[index].actualValue=newVal;
             var rationname = selected.data.name;
@@ -116,8 +117,15 @@ var ration_ass = {
             };
 
             var updateData = this.getUpdateData('ut_update',query,doc);
-
-            project.pushNow('updateRationAss',[this.getSourceType()],updateData);
+            $.bootstrapLoading.start();
+            CommonAjax.post("/ration/updateRationAss",updateData[0],function (result) {
+                $.bootstrapLoading.end();
+                let nodes = project.updateNodesCache([{type:ModuleNames.ration,data:result.ration}]);
+                zmhs_obj.showAssData();
+                projectObj.mainController.refreshTreeNode(nodes, false);
+                project.ration_glj.refreshAfterUpdate(result.ration_glj);
+            })
+           // project.pushNow('updateRationAss',[this.getSourceType()],updateData);
 
         };
         return new ration_ass(project);

+ 62 - 38
web/building_saas/main/js/views/block_lib.js

@@ -364,49 +364,48 @@ var blockLibObj = {
             nID = -1;
         }
 
-        let newNode = tree.insert(pID, nID);
-        newNode.data.type = nodeType;
-        newNode.data.nodeName = nodeName;
-        if (nodeType == 2){
-            let bill = source.datas[0];
-            newNode.data.compilationID = source.compilationID;
-            newNode.data.copyTime = source.copyTime;
-            newNode.data.firstNodeType = source.firstNodeType;
-            newNode.data.isFBFX = source.isFBFX;
-
-            newNode.data.code = bill.code;
-            newNode.data.name = bill.name;
-            newNode.data.unit = bill.unit;
-            newNode.data.itemCharacterText = bill.itemCharacterText;
-            newNode.data.unitFee = (bill.feesIndex && bill.feesIndex.common) ? bill.feesIndex.common.unitFee : 0;
-            newNode.data.children = bill.children;
-
-            for (let r of bill.children){
-                r.unitFee =  (r.feesIndex && r.feesIndex.common) ? r.feesIndex.common.unitFee : 0;
-                if (r.programID)
-                    r.programName = projectObj.project.calcProgram.compiledTemplateMaps[r.programID];
-                // delete r.ID;         // 这个不能删!
-                delete r.billsItemID;
-                delete r.fees;
-                delete r.feesIndex;
-            };
-        }
-
-        tree.selected = newNode;
+        let newN = tree.insert(pID, nID);
+        newN.data.type = nodeType;
+        newN.data.nodeName = nodeName;
+        if (nodeType == 2)
+            blockLibObj.assignData(newN, source);
 
+        tree.selected = newN;
         let sheet = blockLibObj.mainSheet;
         sheet.suspendPaint();
         sheet.suspendEvent();
-
-        let idx = tree.items.indexOf(newNode);
+        let idx = tree.items.indexOf(newN);
         sheet.addRows(idx, 1);
         sheet.getRange(idx, 0, 1, 1).locked(true);
-        sheet.setValue(idx, 0, newNode.data.nodeName);
+        sheet.setValue(idx, 0, newN.data.nodeName);
         sheet.setSelection(idx, 0, 1, 1);
-
         sheet.resumeEvent();
         sheet.resumePaint();
     },
+    assignData: function (block, source){
+        block.data.compilationID = source.compilationID;
+        block.data.copyTime = source.copyTime;
+        block.data.firstNodeType = source.firstNodeType;
+        block.data.isFBFX = source.isFBFX;
+
+        let bill = source.datas[0];
+        block.data.code = bill.code;
+        block.data.name = bill.name;
+        block.data.unit = bill.unit;
+        block.data.itemCharacterText = bill.itemCharacterText;
+        block.data.unitFee = (bill.feesIndex && bill.feesIndex.common) ? bill.feesIndex.common.unitFee : 0;
+        block.data.children = bill.children;
+
+        for (let r of bill.children){
+            r.unitFee =  (r.feesIndex && r.feesIndex.common) ? r.feesIndex.common.unitFee : 0;
+            if (r.programID)
+                r.programName = projectObj.project.calcProgram.compiledTemplateMaps[r.programID];
+            // delete r.ID;         // 这个不能删!
+            delete r.billsItemID;
+            delete r.fees;
+            delete r.feesIndex;
+        };
+    },
     reName: function (node, newName){
         if (newName == '') return;
         node.data.nodeName = newName;
@@ -434,6 +433,18 @@ var blockLibObj = {
     curIsCategory: function () {
         return this.mainTree.selected.data.type == 1;
     },
+    getSameNameNode: function(name){
+        let rst = null;
+        let nodes = blockLibObj.mainTree.items;
+        for (let i = 0; i < nodes.length; i++) {
+            let node = nodes[i];
+            if (node.data.nodeName == name){
+                rst = node;
+                break;
+            }
+        }
+        return rst;
+    },
     refreshSpread: function (){
         if (this.mainSpread)
             this.mainSpread.refresh();
@@ -533,17 +544,30 @@ var blockLibObj = {
     onCellDoubleClick: function (sender, args) {
         let projectNode = projectObj.project.mainTree.selected;
         if (!calcTools.isLeafBill(projectNode)) return;
-        $("#blockAdjustOptions").modal({show: true});
+        $("#div_cloneOptions").modal({show: true});
     },
-    oneToOneClone: function (projectNode, block) {
-        // 这里再次封装成伟城的块文件格式,可直接使用伟城的“粘贴块”接口。
-        // 这里结构作出调整:忽略叶子清单层,直接从定额开始(跟粘贴块有区别),始终强制在叶子清单下插入定额。
-        // 该操作前提:当前块文件的全部数据已从后台取到前台。
+    oneToOneClone: function (projectNode, block, options) {
+        // if (options.overwriteRations)
+        //     projectNode.deleteChildren();
+
+        let canClone = true;
+        if (options.checkCode)
+            canClone = canClone && (projectNode.data.code.substr(0, 9) == block.data.code.substr(0, 9));
+        if (options.checkName)
+            canClone = canClone && (projectNode.data.name == block.data.name);
+        if (options.checkUnit)
+            canClone = canClone && (projectNode.data.unit == block.data.unit);
+        if (!canClone) return;
+
+        /*  这里封装成伟城的块文件格式,可直接使用伟城的“粘贴块”接口。
+            但这里结构要作出调整:忽略叶子清单层,直接从定额开始(跟粘贴块有区别),始终强制在叶子清单下插入定额。
+            该操作前提:当前块文件的全部数据已从后台取到前台。  */
         let vBlock_WC = {
             compilationID: block.data.compilationID,
             copyTime: block.data.copyTime,
             firstNodeType: 1,           // 强制改成1 (因为是从清单下的定额开始。清单自身的还是保留,暂不使用使用)。
             isFBFX: block.data.isFBFX,
+            zeroQuantity: options.zeroQuantity,
             datas: block.data.children       // rations
         };
         BlockController.confirmPaste(vBlock_WC, projectNode, 'sub');

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

@@ -1391,7 +1391,7 @@ var projectObj = {
                     callback: function () {
                         var selected = project.mainTree.selected;
                         if(selected.sourceType == project.Bills.getSourceType()&&selected.data.type==billType.FB&&selected.children.length<=0){//选中的是分部,并且没有子项,直接删除
-                            project.Bills.deleteSelectedNode();
+                            project.Bills.deleteSelectedNodes();//project.Bills.deleteSelectedNode();
                         }else {
                             $("#delete_row").modal({show:true});//弹出删除提示框;
                         }
@@ -1512,7 +1512,7 @@ var projectObj = {
                         if (!$("#kmbk").is(":visible")){
                             $('#blockLibTab').click()
                         };
-                        $("#zujiamb").modal({show: true});
+                        $("#div_createBlocks").modal({show: true});
                     },
                     visible: function(key, opt){
                         return G_SHOW_BLOCK_LIB;
@@ -2934,7 +2934,7 @@ $(function () {
 
     });
 
-    $("#zujiamb").on('show.bs.modal', function(){
+    $("#div_createBlocks").on('show.bs.modal', function(){
         function getBlockCategoriesHtml(Categories) {
             let result = '';
             if (Categories.length <= 0) return result;
@@ -2948,17 +2948,22 @@ $(function () {
         let sHtml = getBlockCategoriesHtml(blockLibObj.getCategories());
         $("#select_block_category").html(sHtml);
         $("#select_block_category")[0].selectedIndex = 0;
+        $('#ckb_block_exist_cover').prop("checked", false);
     });
 
-    $("#blockAdjustOptions").on('show.bs.modal', function(){
-
+    $("#div_cloneOptions").on('show.bs.modal', function(){
+        $('#clone_option_code').prop("checked", true);
+        $('#clone_option_name').prop("checked", false);
+        $('#clone_option_unit').prop("checked", true);
+        $('#clone_option_quantity').prop("checked", true);
+        $('#clone_option_noCover').prop("checked", true);
     });
 
     $("#btn_block_createBlocks").click(function () {
         if ($("#select_block_category")[0].options.length < 1) return;
         let cID = $("#select_block_category").val();
         let selected = projectObj.project.mainTree.selected;
-
+        let cover = $('#ckb_block_exist_cover').prop("checked");
         function createBlocks(aNode, categoryID){
             function createBlock(node) {
                 if (node.data.name == undefined || node.data.name == '') return;  // 清单名称为空,不生成块模板文件
@@ -2977,7 +2982,13 @@ $(function () {
 
                 let fileName = node.data.code + ' ' + node.data.name + ' ' + node.data.unit;
                 fileName = fileName.replace(/^\s+|\s+$/g, "");    // 只去两头空格
-                blockLibObj.newNode(2, fileName, categoryID, block_WC);
+
+                let extN = blockLibObj.getSameNameNode(fileName);
+                if (extN){
+                    if (cover) blockLibObj.assignData(extN, block_WC);
+                }
+                else
+                    blockLibObj.newNode(2, fileName, categoryID, block_WC);
             };
 
             function createRecursion(node){
@@ -2997,13 +3008,20 @@ $(function () {
 
         createBlocks(selected, cID);
         blockLibObj.loadDetailDatas(blockLibObj.mainTree.selected);
-        $("#zujiamb").modal("hide");
+        $("#div_createBlocks").modal("hide");
     });
 
     $("#btn_block_clone_ok").click(function () {
         let projectNode = projectObj.project.mainTree.selected;
         let block = blockLibObj.mainTree.selected;
-        blockLibObj.oneToOneClone(projectNode, block);
+        let options = {};
+        if ($('#clone_option_code').prop("checked")) options.checkCode = true;
+        if ($('#clone_option_name').prop("checked")) options.checkName = true;
+        if ($('#clone_option_unit').prop("checked")) options.checkUnit = true;
+        if ($('#clone_option_zeroQuantity').prop("checked")) options.zeroQuantity = true;
+        if ($('#clone_option_overwriteRations').prop("checked")) options.overwriteRations = true;
+
+        blockLibObj.oneToOneClone(projectNode, block, options);
     });
 
 

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

@@ -282,7 +282,7 @@ let zmhs_obj = {
         }
         if (isValidate) {
             newval = scMathUtil.roundTo(newval, -2);
-            projectObj.project.ration_ass.updateActualValue(me.assSheetData, args.row, newval)
+            projectObj.project.ration_ass.updateActualValue(me.assSheetData, args.row, newval);
         } else {
             newval = recode.actualValue;
             me.assSheet.getCell(args.row, args.col).value(newval);

+ 1 - 1
web/users/html/login-infoinput.html

@@ -27,7 +27,7 @@
                 </div>
                 <div class="card-body">
                     <div class="form-group">
-                        <input class="form-control" placeholder="你的姓名" name="real_name" id="name">
+                        <input class="form-control" placeholder="真实姓名" name="real_name" id="name">
                     </div>
                     <div class="form-group">
                         <input class="form-control" placeholder="企业名称" name="company" id="company">

+ 1 - 2
web/users/html/login.html

@@ -16,8 +16,7 @@
 <body>
     <div class="container">
         <form class="form-signin" method="post" onsubmit="return false">
-            <h1 class="d-flex justify-content-center">纵横建筑云计价</h1>
-            <h4 class="d-flex justify-content-center mb-2">用户登录</h4>
+            <h1 class="d-flex justify-content-center mb-5">纵横建筑云计价</h1>
             <div class="form-group">
                 <input id="inputEmail" class="form-control " name="inputEmail" placeholder="通行账号 邮箱/手机" autofocus="" />
             </div>