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

Merge branch 'master' of http://192.168.1.12:3000/SmartCost/ConstructionCost

TonyKang 7 лет назад
Родитель
Сommit
1ebcf20149
56 измененных файлов с 2667 добавлено и 883 удалено
  1. 3 0
      config/gulpConfig.js
  2. 8 3
      modules/complementary_ration_lib/models/searchModel.js
  3. 2 2
      modules/glj/models/glj_list_model.js
  4. 1 1
      modules/glj/models/unit_price_model.js
  5. 2 1
      modules/main/controllers/bills_controller.js
  6. 26 2
      modules/main/controllers/installation_controller.js
  7. 11 0
      modules/main/controllers/project_controller.js
  8. 39 1
      modules/main/controllers/ration_controller.js
  9. 34 1
      modules/main/facade/project_facade.js
  10. 322 0
      modules/main/facade/ration_facade.js
  11. 68 0
      modules/main/facade/ration_installation_facade.js
  12. 2 0
      modules/main/models/project.js
  13. 1 0
      modules/main/models/project_consts.js
  14. 23 0
      modules/main/models/ration_installation.js
  15. 1 1
      modules/main/routes/installation_route.js
  16. 1 1
      modules/main/routes/project_route.js
  17. 2 1
      modules/main/routes/ration_route.js
  18. 4 1
      modules/ration_glj/facade/glj_calculate_facade.js
  19. 9 2
      modules/ration_glj/facade/ration_glj_facade.js
  20. 0 1
      public/web/PerfectLoad.js
  21. 11 1
      public/web/scMathUtil.js
  22. 63 0
      public/web/sheet/sheet_common.js
  23. 7 7
      web/building_saas/complementary_glj_lib/html/tools-gongliaoji.html
  24. 7 7
      web/building_saas/complementary_glj_lib/js/glj.js
  25. 4 4
      web/building_saas/complementary_glj_lib/js/gljComponent.js
  26. 4 4
      web/building_saas/complementary_ration_lib/html/anzhuang.html
  27. 464 445
      web/building_saas/complementary_ration_lib/html/dinge.html
  28. 4 3
      web/building_saas/complementary_ration_lib/html/fuzhu.html
  29. 5 4
      web/building_saas/complementary_ration_lib/html/gongliao.html
  30. 2 3
      web/building_saas/complementary_ration_lib/js/coe.js
  31. 4 5
      web/building_saas/complementary_ration_lib/js/installation.js
  32. 2 3
      web/building_saas/complementary_ration_lib/js/repository_glj.js
  33. 31 4
      web/building_saas/complementary_ration_lib/js/section_tree.js
  34. 27 18
      web/building_saas/glj/js/project_glj_spread.js
  35. 63 14
      web/building_saas/main/html/main.html
  36. 40 10
      web/building_saas/main/js/models/bills.js
  37. 1 0
      web/building_saas/main/js/models/cache_tree.js
  38. 36 36
      web/building_saas/main/js/models/calc_base.js
  39. 84 59
      web/building_saas/main/js/models/calc_program.js
  40. 133 0
      web/building_saas/main/js/models/installation_fee.js
  41. 12 0
      web/building_saas/main/js/models/main_consts.js
  42. 26 0
      web/building_saas/main/js/models/project.js
  43. 32 1
      web/building_saas/main/js/models/project_glj.js
  44. 32 17
      web/building_saas/main/js/models/quantity_detail.js
  45. 126 10
      web/building_saas/main/js/models/ration.js
  46. 13 11
      web/building_saas/main/js/models/ration_coe.js
  47. 21 16
      web/building_saas/main/js/models/ration_glj.js
  48. 70 0
      web/building_saas/main/js/models/ration_installation.js
  49. 68 9
      web/building_saas/main/js/views/glj_view.js
  50. 103 12
      web/building_saas/main/js/views/glj_view_contextMenu.js
  51. 461 108
      web/building_saas/main/js/views/installation_fee_view.js
  52. 27 3
      web/building_saas/main/js/views/main_tree_col.js
  53. 103 26
      web/building_saas/main/js/views/project_view.js
  54. 6 11
      web/building_saas/main/js/views/std_ration_lib.js
  55. 15 13
      web/building_saas/main/js/views/sub_view.js
  56. 1 1
      web/building_saas/main/js/views/zlfb_view.js

+ 3 - 0
config/gulpConfig.js

@@ -41,6 +41,7 @@ module.exports = {
     main_jspaths:[
         'lib/JSExpressionEval_src/*.js',
         '!lib/JSExpressionEval_src/JsHashMap.js',
+        'lib/jquery-ui/jquery-ui.min.js',
         'lib/jquery-ui/jquery-ui-datepickerCN.js',
         'lib/jquery-contextmenu/*.js',
         'lib/lodash/lodash.js',
@@ -78,6 +79,7 @@ module.exports = {
         'web/building_saas/main/js/models/ration_glj.js',
         'web/building_saas/main/js/models/ration_coe.js',
         'web/building_saas/main/js/models/ration_ass.js',
+        'web/building_saas/main/js/models/ration_installation.js',
         // 'web/building_saas/main/js/models/volume_price.js',
         'web/building_saas/main/js/models/labour_coe.js',
         'web/building_saas/main/js/models/installation_fee.js',
@@ -110,6 +112,7 @@ module.exports = {
         'web/building_saas/main/js/views/calc_program_view.js',
         'web/building_saas/main/js/views/confirm_modal.js',
         'web/building_saas/main/js/views/zlfb_view.js',
+        'web/building_saas/main/js/views/installation_fee_view.js',
         'public/web/rpt_tpl_def.js',
         'public/web/treeDataHelper.js',
         'public/web/ztree_common.js',

+ 8 - 3
modules/complementary_ration_lib/models/searchModel.js

@@ -10,8 +10,8 @@ let stdRationModel = require ('../../ration_repository/models/ration_item').Mode
 
 class SearchDao{
     async getRationItem(userId, rationRepId, code, callback){
+        let ration = null;
         try{
-            let ration = null;
             let stdRation = await stdRationModel.findOne({rationRepId: rationRepId, code: code, $or: [{isDeleted: null}, {isDeleted: false}]});
             if(isDef(stdRation)){
                 ration = stdRation._doc;
@@ -36,11 +36,16 @@ class SearchDao{
                     }
                 }
             }
-            callback(0, ration);
+            if(callback){
+                callback(0, ration);
+            }
         }
         catch(err){
-            callback(err, null);
+            if(callback){
+                callback(err, null);
+            }
         }
+        return ration;
     }
 
     async findRation(userId, rationRepId, keyword, callback){

+ 2 - 2
modules/glj/models/glj_list_model.js

@@ -36,7 +36,7 @@ class GLJListModel extends BaseModel {
      * @var {Array}
      */
     ownCompositionTypes = [GLJTypeConst.CONCRETE, GLJTypeConst.MORTAR, GLJTypeConst.MIX_RATIO,
-        GLJTypeConst.COMMERCIAL_CONCRETE, GLJTypeConst.COMMERCIAL_MORTAR, GLJTypeConst.GENERAL_MACHINE,GLJTypeConst.MAIN_MATERIAL];
+        GLJTypeConst.GENERAL_MACHINE,GLJTypeConst.MAIN_MATERIAL];
 
     /**
      * 构造函数
@@ -114,7 +114,7 @@ class GLJListModel extends BaseModel {
             // 整理数据 得到总定额消耗量
             for (let tmp of quantityData) {
                 let tmpNum = parseFloat(tmp.rationQuantity);
-                tmpNum = isNaN(tmpNum) ||tmpNum==0? 1 : tmpNum;
+                tmpNum = isNaN(tmpNum) ||tmpNum==0? 0 : tmpNum;
                 let tmp_con_key = keyMap[tmp.projectGLJID];
 
                 if (quantityList[tmp_con_key] === undefined) {

+ 1 - 1
modules/glj/models/unit_price_model.js

@@ -300,7 +300,7 @@ class UnitPriceModel extends BaseModel {
             let consumption = scMathUtil.roundForObj(mixRatioMap[pk].consumption,quantity_decimal);
             sumPrice +=scMathUtil.roundForObj(price*consumption,price_decimal);
         }
-        sumPrice= scMathUtil.roundForObj(sumPrice,-price_decimal);
+        sumPrice= scMathUtil.roundForObj(sumPrice,price_decimal);
         if(sumPrice<=0){
             return null;
         }

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

@@ -10,7 +10,7 @@ let quantity_detail = require("../facade/quantity_detail_facade");
 let bill_detail = require("../facade/bill_facade");
 let ration_glj = mongoose.model('ration_glj');
 let ration_coe = mongoose.model('ration_coe');
-
+import rationInstallationModel from "../models/ration_installation";
 //统一回调函数
 var callback = function(req, res, err, message, data){
     res.json({error: err, message: message, data: data});
@@ -197,6 +197,7 @@ async function doBillsOrRationsDelete(data) {
     if(sub_query!=null){
         await ration_coe.deleteMany(sub_query);//删除附注条件
         await ration_glj.deleteMany(sub_query);//删除定额工料机
+        await rationInstallationModel.deleteMany(sub_query);//删除安装增加费
     }
     if(rationTask.length>0){
         await  ration_model.model.bulkWrite(rationTask);//删除定额

+ 26 - 2
modules/main/controllers/installation_controller.js

@@ -1,11 +1,32 @@
 /**
  * Created by zhang on 2018/2/5.
  */
-var installation_facade = require('../facade/installation_facade');
+let installation_facade = require('../facade/installation_facade');
+let ration_installation_facade = require('../facade/ration_installation_facade');
+
 let logger = require("../../../logs/log_helper").logger;
 module.exports={
-    updateInstallationFee:updateInstallationFee
+    updateInstallationFee:updateInstallationFee,
+    updateRationInstallation:updateRationInstallation
 }
+
+async function updateRationInstallation(req, res) {
+    let result={
+        error:0
+    }
+    try {
+        let data = req.body.data;
+        data = JSON.parse(data);
+        let datas= await ration_installation_facade.updateRationInstallation(data);
+        result.data=datas;
+    }catch (err){
+        logger.err(err);
+        result.error=1;
+        result.message = err.message;
+    }
+    res.json(result);
+}
+
 async function  updateInstallationFee(req, res) {
     let result={
         error:0
@@ -14,6 +35,9 @@ async function  updateInstallationFee(req, res) {
         let data = req.body.data;
         data = JSON.parse(data);
         let datas= await installation_facade.updateInstallationFee(data.projectID,data.updateData);
+        if(data.hasOwnProperty("rationInstallations")){
+            await ration_installation_facade.updateFromInstallationFee(data.projectID,data.rationInstallations);
+        }
         result.data=datas;
     }catch (err){
         logger.err(err);

+ 11 - 0
modules/main/controllers/project_controller.js

@@ -67,5 +67,16 @@ module.exports = {
             result.message = err.message;
         }
         res.json(result);
+    },
+    updateNodes:function (req,res) {
+        var data = JSON.parse(req.body.data);
+        project_facade.updateNodes(data, function (err, message, result) {
+            if (err) {
+                logger.err(err);
+                callback(req, res, err, message, null);
+            } else {
+                callback(req, res, err, message, result);
+            }
+        });
     }
 };

+ 39 - 1
modules/main/controllers/ration_controller.js

@@ -3,6 +3,7 @@
  */
 var rationData = require('../models/ration');
 var ration_glj_facade = require('../../ration_glj/facade/ration_glj_facade');
+var ration_facade = require('../facade/ration_facade');
 let logger = require("../../../logs/log_helper").logger;
 
 //统一回调函数
@@ -42,9 +43,46 @@ module.exports = {
             }
         });
     },
-    insertGLJAsRation:insertGLJAsRation
+    insertGLJAsRation:insertGLJAsRation,
+    replaceRations:replaceRations,
+    addNewRation:addNewRation
 };
 
+async function addNewRation(req,res) {
+    let result={
+        error:0
+    }
+    try {
+        let data = req.body.data;
+        data = JSON.parse(data);
+        console.log(data);
+        result.data = await ration_facade.addNewRation(data);
+    }catch (err){
+        logger.err(err);
+        result.error=1;
+        result.message = err.message;
+    }
+    res.json(result);
+}
+
+async function replaceRations(req,res) {
+    let result={
+        error:0
+    }
+    try {
+        let data = req.body.data;
+        data = JSON.parse(data);
+        let userID = req.session.sessionUser.ssoId;
+        result.data = await ration_facade.replaceRations(userID,data);
+    }catch (err){
+        logger.err(err);
+        result.error=1;
+        result.message = err.message;
+    }
+    res.json(result);
+};
+
+
 async function insertGLJAsRation(req, res){
     let result={
         error:0

+ 34 - 1
modules/main/facade/project_facade.js

@@ -2,12 +2,45 @@
  * Created by zhang on 2018/1/26.
  */
 let  projectsModel = require("../../pm/models/project_schema");
+let async_n = require("async");
+let ration_model = require('../models/ration');
+let bill_model = require('../models/bills');
+let consts = require('../models/project_consts');
+let projectConsts = consts.projectConst;
 
 module.exports = {
     markUpdateProject:markUpdateProject,
-    removeProjectMark:removeProjectMark
+    removeProjectMark:removeProjectMark,
+    updateNodes:updateNodes
 };
 
+function updateNodes(datas,callback) {
+    let tasks = [];
+    for(let node of datas){
+        tasks.push(updateOne(node))
+    }
+    async_n.parallel(tasks, function(err, results) {
+        if (!err){
+            callback(0, '', results);
+        }
+        else{
+            console.log(err);
+            callback(1, 'save project failed'+err.message, null);
+        }
+    });
+    function updateOne(node) {
+        if(node.type == projectConsts.BILLS){
+            return function (asCallback) {
+                bill_model.model.findOneAndUpdate({projectID: node.data.projectID, ID: node.data.ID,deleteInfo: null}, node.data,{new: true}, asCallback);
+            }
+        }else if(node.type ==projectConsts.RATION){
+            return function (asCallback) {
+                ration_model.model.findOneAndUpdate({projectID: node.data.projectID, ID: node.data.ID,deleteInfo: null}, node.data,{new: true}, asCallback);
+            }
+        }
+    }
+}
+
 //data = {feeRateID:111111,projectID:1245}; type = feeRate
 async function markUpdateProject(data,type) {
     let tasks=[];

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

@@ -0,0 +1,322 @@
+/**
+ * Created by zhang on 2018/2/9.
+ */
+let mongoose = require('mongoose');
+import SearchDao from '../../complementary_ration_lib/models/searchModel';
+const scMathUtil = require('../../../public/scMathUtil').getUtil();
+let ration_glj_facade = require("../../ration_glj/facade/ration_glj_facade")
+let quantity_detail = require("../facade/quantity_detail_facade");
+let ration_glj = mongoose.model('ration_glj');
+let ration_coe = mongoose.model('ration_coe');
+let ration_model = require('../models/ration');
+let bill_model = require('../models/bills');
+let decimal_facade = require('./decimal_facade');
+import installationFeeModel from "../models/installation_fee";
+import rationInstallationModel from "../models/ration_installation";
+const uuidV1 = require('uuid/v1');
+let std_glj_lib_gljList_model = mongoose.model('std_glj_lib_gljList');
+let coeMolde = mongoose.model('std_ration_lib_coe_list');
+let _= require('lodash');
+
+module.exports = {
+    replaceRations: replaceRations,
+    addNewRation:addNewRation
+};
+async function addNewRation(data) {
+    let query = data.itemQuery;
+    let stdRation = null;
+    if(query){
+        let searchDao = new SearchDao();
+        stdRation = await searchDao.getRationItem(query.userID,query.rationRepId,query.code);
+        data.newData.code = query.code;
+    }
+    if(data.brUpdate.length>0){
+        await updateSerialNo(data.brUpdate);
+    }
+    let newRation =await insertNewRation(data.newData,stdRation,data.calQuantity);
+    if(stdRation){
+        return await addRationSubList(stdRation,newRation);
+    }else {
+        return {ration:newRation};
+    }
+}
+
+async function  updateSerialNo(serialNoUpdate){
+    let tasks=[];
+    for(let data of serialNoUpdate){
+        let task={
+            updateOne:{
+                filter:{
+                    ID:data.ID,
+                    projectID:data.projectID
+                },
+                update :{
+                    serialNo:data.serialNo
+                }
+            }
+        };
+        tasks.push(task);
+    }
+    await ration_model.model.bulkWrite(tasks);
+
+}
+
+async function insertNewRation(newData,std,calQuantity) {//插入新的定额
+    if(std){
+        newData.name = std.name;
+        newData.caption = std.caption;
+        newData.unit = std.unit;
+        newData.libID = std.rationRepId;
+        newData.content = std.jobContent;
+        if (std.chapter) {
+            newData.comments = std.chapter.explanation;
+            newData.ruleText = std.chapter.ruleText;
+        }
+        newData.from = std.type === 'complementary' ? 'cpt' : 'std';
+        newData.programID = std.feeType;
+        newData.rationAssList =  createRationAss(std);
+        // calculate ration Quantity
+    }
+    if(calQuantity){
+        await CalculateQuantity(newData,newData.billsItemID,newData.projectID);
+    }
+
+    let newRation = await ration_model.model.create(newData);
+     return newRation;
+
+}
+
+async function replaceRations(userID,data) {
+    let searchDao = new SearchDao();
+    let recodes = [];
+    for(let recode of data.nodeInfo){
+        let stdRation = await searchDao.getRationItem(userID,data.libID,recode.newCode);
+        let newRecode = await replaceRation(recode,stdRation,data.projectID,data.calQuantity);
+        if(newRecode){
+            recodes.push(newRecode);
+        }else {
+            break;
+        }
+    }
+    return recodes;
+}
+
+async function replaceRation(nodeInfo,stdRation,projectID,calQuantity) {
+    if(stdRation){
+        await deleRationSubRecode(projectID,nodeInfo.ID);
+        let newRation = await updateRation(stdRation,nodeInfo.ID,nodeInfo.billsItemID,projectID,calQuantity);//生成并插入新的定额
+        return await addRationSubList(stdRation,newRation);
+    }else {
+        return null;
+    }
+}
+
+async function addRationSubList(stdRation,newRation) {
+    let ration_gljs = await addRationGLJ(stdRation,newRation);
+    let ration_coes = await addRationCoe(stdRation,newRation);
+    let ration_installs =  await addRationInstallFee(stdRation,newRation);
+    return {ration:newRation,ration_gljs:ration_gljs,ration_coes:ration_coes,ration_installs:ration_installs};
+}
+
+async function addRationInstallFee(std,newRation) {
+    let install_fee_list = [];
+    if(std.hasOwnProperty('rationInstList') && std.rationInstList.length > 0){
+        let installFee = await installationFeeModel.findOne({'projectID': newRation.projectID});
+        for(let ri of std.rationInstList){
+            let feeItem = _.find(installFee.installFeeItem,{'ID':ri.feeItemId});
+            let section = _.find(installFee.installSection,{'ID':ri.sectionId});
+            if(feeItem&&section){
+                let tem_r_i = {
+                    libID:installFee.libID,
+                    projectID:newRation.projectID,
+                    rationID:newRation.ID,
+                    feeItemId:feeItem.ID,
+                    sectionId:section.ID,
+                    itemName:feeItem.feeItem,
+                    feeType:feeItem.feeType,
+                    sectionName:section.name,
+                    unifiedSetting:1,
+                    ruleId:''
+                };
+                if(feeItem.isCal==1&&section.feeRuleId&&section.feeRuleId!=''){//勾选记取时并且有规则ID时才读取
+                    let feeRule = _.find(installFee.feeRule,{'ID':section.feeRuleId});
+                    if(feeRule){
+                        tem_r_i.ruleId = feeRule.ID;
+                    }
+                }
+                tem_r_i.ID = uuidV1();
+                install_fee_list.push(tem_r_i);
+            }
+        }
+        if(install_fee_list.length>0){
+            await rationInstallationModel.insertMany(install_fee_list);
+        }
+    }
+
+    return install_fee_list;
+}
+
+async function addRationCoe(std,newRation) {
+    let ration_coe_list = [];
+    let seq = 0;
+    if(std.hasOwnProperty('rationCoeList')&&std.rationCoeList.length>0){//添加标准库的工料机
+        for(let sub of std.rationCoeList){
+            let libCoe = await coeMolde.findOne({'libID':std.rationRepId,'ID':sub.ID,"$or": [{"isDeleted": null}, {"isDeleted": false}]});//std.rationRepId;
+            if(libCoe){
+                let newCoe = {};
+                newCoe.ID = uuidV1();
+                newCoe.coeID = sub.ID;
+                newCoe.seq = seq;
+                newCoe.name = libCoe.name;
+                newCoe.content = libCoe.content;
+                newCoe.isAdjust=0;
+                newCoe.coes = libCoe.coes;
+                newCoe.rationID = newRation.ID;
+                newCoe.projectID = newRation.projectID;
+                seq++;
+                ration_coe_list.push(newCoe);
+            }
+        }
+    }
+    let lastCoe ={
+        coeID:-1,
+        name : '自定义系数',
+        content:'人工×1,材料×1,机械×1,主材×1,设备×1',
+        isAdjust:0,
+        seq:seq,
+        rationID : newRation.ID,
+        projectID : newRation.projectID
+    };
+    lastCoe.ID = uuidV1();
+    lastCoe.coes = getCustomerCoeData();
+    ration_coe_list.push(lastCoe);
+    await ration_coe.insertMany(ration_coe_list);
+    return ration_coe_list;
+
+}
+
+function getCustomerCoeData() {
+    var coeList = [];
+    coeList.push({ amount:1, operator:'*', gljCode:null, coeType:'定额'});
+    coeList.push({ amount:1, operator:'*', gljCode:null, coeType:'人工'});
+    coeList.push({ amount:1, operator:'*', gljCode:null, coeType:'材料'});
+    coeList.push({ amount:1, operator:'*', gljCode:null, coeType:'机械'});
+    coeList.push({ amount:1, operator:'*', gljCode:null, coeType:'主材'});
+    coeList.push({ amount:1, operator:'*', gljCode:null, coeType:'设备'});
+    return coeList;
+};
+
+async function addRationGLJ(std,newRation) {
+    let newRationGLJList = [];
+    let rationGLJShowList = [];
+    if(std.hasOwnProperty('rationGljList') && std.rationGljList.length > 0){
+        for(let sub of std.rationGljList){
+            let newGLJ = {};
+            newGLJ.ID = uuidV1();
+            newGLJ.projectID = newRation.projectID;
+            newGLJ.GLJID = sub.gljId;
+            newGLJ.rationID = newRation.ID;
+            newGLJ.billsItemID = newRation.billsItemID;
+            newGLJ.rationItemQuantity = sub.consumeAmt;
+            newGLJ.quantity = sub.consumeAmt;
+            newGLJ.glj_repository_id = std.rationRepId;
+            let std_glj = await std_glj_lib_gljList_model.findOne({'ID':sub.gljId});
+            if(std_glj){
+                newGLJ.name = std_glj.name;
+                newGLJ.code = std_glj.code;
+                newGLJ.original_code = std_glj.code;
+                newGLJ.unit = std_glj.unit;
+                newGLJ.specs = std_glj.specs;
+                newGLJ.basePrice = std_glj.basePrice;
+                newGLJ.shortName = std_glj.shortName;
+                newGLJ.type = std_glj.gljType;
+                newGLJ.repositoryId = std_glj.repositoryId;
+                newGLJ.adjCoe = std_glj.adjCoe;
+               let info = await  ration_glj_facade.getInfoFromProjectGLJ(newGLJ);
+                newGLJ = ration_glj_facade.createNewRecord(info);
+                newRationGLJList.push(newGLJ);
+                rationGLJShowList.push(info);
+            }
+        }
+    }
+    if(newRationGLJList.length>0){
+        await ration_glj.insertMany(newRationGLJList);
+    }
+    return rationGLJShowList;
+}
+
+async function deleRationSubRecode(projectID,rationID) {//删除挂在定额下的数据,如工程量明细,定额工料机等
+    let delete_query={projectID: projectID, rationID: rationID};
+    //删除工程量明细
+    await quantity_detail.deleteByQuery(delete_query) ;
+    await ration_coe.deleteMany(delete_query);//删除附注条件
+    await ration_glj.deleteMany(delete_query);//删除定额工料机
+    await rationInstallationModel.deleteMany(delete_query);//删除安装增加费
+}
+
+async function  updateRation(std,rationID,billsItemID,projectID,calQuantity) {
+    // insertNewRation
+    let ration ={};
+    ration.code = std.code;
+    ration.name = std.name;
+    ration.caption = std.caption;
+    ration.unit = std.unit;
+    ration.libID = std.rationRepId;
+    ration.content = std.jobContent;
+    ration.adjustState = '';
+    ration.isFromDetail=0;
+    ration.isSubcontract=false;
+    ration.fees=[];
+    if (std.chapter) {
+        ration.comments = std.chapter.explanation;
+        ration.ruleText = std.chapter.ruleText;
+    }
+    ration.from = std.type === 'complementary' ? 'cpt' : 'std';
+    ration.programID = std.feeType;
+    ration.rationAssList = createRationAss(std);//生成辅助定额
+    if(calQuantity){
+       await CalculateQuantity(ration,billsItemID,projectID);
+    }
+
+ let unsetObject = {
+     "marketUnitFee":1,
+     'marketTotalFee':1,
+     "maskName":1
+ }
+    let newRation = await ration_model.model.findOneAndUpdate({ID:rationID,projectID:projectID},{"$set":ration,"$unset":unsetObject},{new: true});//;
+    return newRation;
+}
+
+function createRationAss(std) {
+    let  rationAssList = [];//生成辅助定额
+    if(std.hasOwnProperty('rationAssList')&&std.rationAssList.length>0){
+        for(let i=0;i<std.rationAssList.length;i++){
+            let ass = std.rationAssList[i];
+            ass.actualValue = ass.stdValue;
+            rationAssList.push(ass);
+        }
+    }
+    return rationAssList;
+}
+
+async function CalculateQuantity (ration,billsItemID,projectID) {
+    // calculate ration Quantity
+    let decimalObject =await decimal_facade.getProjectDecimal(projectID);
+    let quantity_decimal = (decimalObject&&decimalObject.ration&&decimalObject.ration.quantity)?decimalObject.ration.quantity:3;
+    let pbill = await bill_model.model.findOne({projectID:projectID,ID:billsItemID});
+    let billsQuantity = pbill.quantity ? pbill.quantity : 0;
+    let bill_decimal = await decimal_facade.getBillsQuantityDecimal(projectID,pbill.unit);
+    billsQuantity=scMathUtil.roundForObj(billsQuantity,bill_decimal);
+    ration.quantityEXP="QDL";
+    ration.quantity = scMathUtil.roundForObj(billsQuantity / FilterNumberFromUnit(ration.unit),quantity_decimal);//不管是否打勾都做转换
+    ration.contain =  scMathUtil.roundForObj(ration.quantity/billsQuantity,6);
+};
+
+function FilterNumberFromUnit (unit) {
+    let reg = new RegExp('^[0-9]+');
+    if (reg.test(unit)) {
+        return parseInt(unit.match(reg)[0]);
+    } else {
+        return 1;
+    }
+};

+ 68 - 0
modules/main/facade/ration_installation_facade.js

@@ -0,0 +1,68 @@
+/**
+ * Created by zhang on 2018/2/24.
+ */
+
+import rationInstallationModel from "../models/ration_installation";
+let consts = require('../models/project_consts');
+let projectConsts = consts.projectConst;
+
+module.exports={
+    updateRationInstallation:updateRationInstallation,
+    updateFromInstallationFee:updateFromInstallationFee,
+    getData:getData,
+    deleteByRation:deleteByRation
+};
+
+async function updateRationInstallation(data){
+    if(data.projectID&&data.ID){
+        let result = await rationInstallationModel.findOneAndUpdate({'projectID':data.projectID,'ID':data.ID},data);
+        return result
+    }else {
+        throw  new Error('项目ID或者ID为空,更新失败!');
+    }
+}
+
+async function updateFromInstallationFee(projectID,rationInstallations) {
+    let tasks = [];
+    for (let ri of rationInstallations){
+        let task = {
+            updateOne:{
+                filter:{
+                    ID:ri.ID,
+                    projectID:projectID
+                },
+                update :ri.doc
+            }
+        };
+        tasks.push(task);
+    }
+    if(tasks.length>0){
+        await rationInstallationModel.bulkWrite(tasks);
+    }
+}
+function deleteByRation(data) {
+    return function (callback) {
+        rationInstallationModel.deleteMany({projectID: data.projectID, rationID: data.ID},(err,result)=>{
+            commonCallback(callback,result,err);
+        });
+    }
+}
+
+function commonCallback(callback,result,err) {
+    if(err){
+        callback(err,'');
+    }else {
+        callback(null,result);
+    }
+}
+
+
+function getData(projectID, callback) {
+    rationInstallationModel.find({'projectID': projectID}, (err, datas) => {
+        if (err) {
+            callback(1, '', null);
+        } else {
+            callback(0, consts.projectConst.RATION_INSTALLATION, datas);
+        }
+    })
+}

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

@@ -7,6 +7,7 @@ var GLJData = require('./glj');
 var ration_glj_data = require('../../ration_glj/facade/ration_glj_facade');
 var ration_coe_data = require('../../ration_glj/facade/ration_coe_facade');
 var ration_ass_data = require('../../ration_glj/facade/ration_ass_facade');
+let ration_installation = require('../facade/ration_installation_facade');
 var quantity_detail_data = require('../facade/quantity_detail_facade');
 var fee_rate_data = require('../../fee_rates/facade/fee_rates_facade');
 let projCounter = require('./proj_counter_model');
@@ -33,6 +34,7 @@ moduleMap[projectConsts.RATION] = rationData;
 moduleMap[projectConsts.RATION_GLJ] = ration_glj_data;
 moduleMap[projectConsts.RATION_COE] = ration_coe_data;
 moduleMap[projectConsts.RATION_ASS] = ration_ass_data;
+moduleMap[projectConsts.RATION_INSTALLATION] = ration_installation;
 moduleMap[projectConsts.QUANTITY_DETAIL] = quantity_detail_data;
 moduleMap[projCounter.collectionName] = projCounter;
 moduleMap[projSetting.collectionName] = projSetting;

+ 1 - 0
modules/main/models/project_consts.js

@@ -8,6 +8,7 @@ let projectConst = {
     RATION_GLJ:'ration_glj',
     RATION_COE:'ration_coe',
     RATION_ASS:'ration_ass',
+    RATION_INSTALLATION:'ration_installation',
     QUANTITY_DETAIL:'quantity_detail',
     PROJECTGLJ: 'projectGLJ',
     GLJLIST: 'GLJList',

+ 23 - 0
modules/main/models/ration_installation.js

@@ -0,0 +1,23 @@
+/**
+ * Created by zhang on 2018/2/8.
+ */
+
+var mongoose = require('mongoose'),
+    Schema = mongoose.Schema;
+
+var ration_installation = new Schema({
+    ID:String,
+    libID:Number,
+    projectID: Number,
+    rationID:String,
+    sectionId: String, //分册章节id
+    feeItemId:String,
+    ruleId:String,
+    itemName:String,
+    sectionName:String,
+    unifiedSetting:{type: Number,default:1},//0:false 1:true  按统一设置
+},{versionKey:false});
+
+let rationInstallationModel = mongoose.model('ration_installation', ration_installation,"ration_installation");
+
+export{ rationInstallationModel as default}

+ 1 - 1
modules/main/routes/installation_route.js

@@ -9,7 +9,7 @@ module.exports = function (app) {
     let installationRouter = express.Router();
 
     installationRouter.post('/updateInstallationFee', installationController.updateInstallationFee);
-
+    installationRouter.post('/updateRationInstallation', installationController.updateRationInstallation);
 
     app.use('/installation',installationRouter);
 };

+ 1 - 1
modules/main/routes/project_route.js

@@ -11,7 +11,7 @@ module.exports = function (app) {
     projectRouter.post('/getData', projectController.getData);
     projectRouter.post('/markUpdateProject', projectController.markUpdateProject);
     projectRouter.post('/removeProjectMark', projectController.removeProjectMark);
-
+    projectRouter.post('/updateNodes', projectController.updateNodes);
 
     app.use('/project',projectRouter);
 };

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

@@ -10,7 +10,8 @@ module.exports = function (app) {
     rationRouter.post('/getItemTemplate', rationController.getItemTemplate);
     rationRouter.post('/allocIDs', rationController.allocIDs);
     rationRouter.post('/insertGLJAsRation', rationController.insertGLJAsRation);
-
+    rationRouter.post('/replaceRations', rationController.replaceRations);
+    rationRouter.post('/addNewRation', rationController.addNewRation);
 
     app.use('/ration', rationRouter);
 };

+ 4 - 1
modules/ration_glj/facade/glj_calculate_facade.js

@@ -41,6 +41,9 @@ async function calculateQuantity(query,noNeedCal){
          let assList=[];
          let assRation = null;
          let adjustState=[];
+         if(!impactRation){//如果定额不存在或者已删除,返回空
+             return null;
+         }
          if(impactRation._doc.hasOwnProperty("rationAssList")&&impactRation.rationAssList.length>0){
              for(let i=0;i<impactRation.rationAssList.length;i++){
                  let times = calculateTimes(impactRation.rationAssList[i]);
@@ -48,8 +51,8 @@ async function calculateQuantity(query,noNeedCal){
                      assRation = await  std_ration_lib_ration_items.findOne({rationRepId:impactRation.libID,code:impactRation.rationAssList[i].assistCode});
                      assList.push({times:times,assRation:assRation})
                      adjustState.push({index:stateSeq.ass,content:impactRation.rationAssList[i].name+" "+impactRation.rationAssList[i].actualValue+" : +"+impactRation.rationAssList[i].assistCode+"x"+times});
-                     }
                  }
+             }
          }
          for(let i =0;i<gljList.length;i++ ){
              let r = await calculateQuantityPerGLJ(gljList[i],i,coeList,assList,adjustState,noNeedCal);

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

@@ -18,6 +18,7 @@ let std_ration_lib_ration_items = mongoose.model('std_ration_lib_ration_items');
 let glj_calculate_facade = require('./glj_calculate_facade');
 let glj_type_util = require('../../../public/cache/std_glj_type_util');
 let quantity_detail_facade = require('../../main/facade/quantity_detail_facade');
+let ration_installation_facade = require('../../main/facade/ration_installation_facade');
 let logger = require("../../../logs/log_helper").logger;
 import stdgljutil  from "../../../public/cache/std_glj_type_util";
 import EngineeringLibModel from "../../users/models/engineering_lib_model";
@@ -39,7 +40,9 @@ module.exports = {
     updateRationGLJByEdit: updateRationGLJByEdit,
     getGLJClass: getGLJClass,
     insertGLJAsRation: insertGLJAsRation,
-    getRationTypeGLJQuantity:getRationTypeGLJQuantity
+    getRationTypeGLJQuantity:getRationTypeGLJQuantity,
+    getInfoFromProjectGLJ:getInfoFromProjectGLJ,
+    createNewRecord:createNewRecord
 }
 
 let operationMap = {
@@ -328,6 +331,7 @@ function deleteByRation(datas, callback) {
     tasks.push(deleteGLJList(data));
     tasks.push(ration_coe_facade.delete_ration_coe(data));
     tasks.push(quantity_detail_facade.deleteByRation(data));
+    tasks.push(ration_installation_facade.deleteByRation(data));
     async_n.parallel(tasks, function (err, result) {
         commonCallback(callback, result, err)
     })
@@ -454,6 +458,7 @@ function deleteByMultiRations(datas) {
             delete_tasks.push(deleteOne(rations[i]._doc));
             delete_tasks.push(ration_coe_facade.delete_ration_coe(rations[i]._doc));
             delete_tasks.push(quantity_detail_facade.deleteByRation(rations[i]._doc));
+            delete_tasks.push(ration_installation_facade.deleteByRation(rations[i]._doc));
         }
         delete_tasks.push(quantity_detail_facade.deleteByBill(datas.updateData));
         async_n.parallel(delete_tasks, (err, results) => {
@@ -798,7 +803,9 @@ async function changAdjustState(data, rationList) {
             projectID: data.query.projectID,
             rationID: r
         }, true);
-        stateList.push({rationID: r, adjustState: stateResult.adjustState});
+        if(stateResult){
+            stateList.push({rationID: r, adjustState: stateResult.adjustState});
+        }
     }
     return stateList;
 }

Разница между файлами не показана из-за своего большого размера
+ 0 - 1
public/web/PerfectLoad.js


+ 11 - 1
public/web/scMathUtil.js

@@ -2,6 +2,9 @@
  * Created by jimiz on 2017/3/28.
  * 经验证:10000次四舍五入,用num.toFixed为15毫秒,用roundTo为47毫秒,速度低一些,但可以接受
  * 另:经手工验证,用num.toString(2)将十进制浮点数转换为二进制浮点数时,最后一位有错误的情况出现,例子(10.0311)
+ *
+ * zhangyin 2018-02-28
+ * 采用重复一次四舍五入解决浮点精度误差后,10000次roundTo的时间为94毫秒。
  */
 
 let scMathUtil = {
@@ -152,10 +155,17 @@ let scMathUtil = {
         };
         return result;
     },
-    roundTo: function(num, digit){
+    reRoundTo: function(num, digit){
         let me = this;
         return me.innerRoundTo(me.binToFloat(me.incMantissa(me.floatToBin(num))), digit);
     },
+    // zhangyin 2018-02-28
+    // 经过运算后的浮点数,误差可能更大,加尾数也不能消除。目前采用笨办法,将有效位数加一位再四舍五入一次,以消除浮点误差。
+    // 此办法效率较低,没有别的更好办法时暂时用着
+    roundTo: function(num, digit){
+        let me = this;
+        return me.reRoundTo(me.reRoundTo(num, digit - 1), digit);
+    },
     isNumber : function (obj) {
         return obj === +obj;
     },

+ 63 - 0
public/web/sheet/sheet_common.js

@@ -392,5 +392,68 @@ var sheetCommonObj = {
             sheet.getCell(beginRow + i, col).cellType(combo);
         }
         sheet.resumePaint();
+    },
+    //设置系统粘贴板数据,需要用户触发事件,直接调用会失败
+    copyTextToClipboard: function(text) {
+        var textArea = document.createElement("textarea");
+        textArea.style.position = 'fixed';
+        textArea.style.top = 0;
+        textArea.style.left = 0;
+        textArea.style.width = '2em';
+        textArea.style.height = '2em';
+        textArea.style.padding = 0;
+        textArea.style.border = 'none';
+        textArea.style.outline = 'none';
+        textArea.style.boxShadow = 'none';
+        textArea.style.background = 'transparent';
+        textArea.value = text;
+        document.body.appendChild(textArea);
+        textArea.select();
+        try {
+            var successful = document.execCommand('copy');
+            var msg = successful ? 'successful' : 'unsuccessful';
+            console.log('Copying text command was ' + msg);
+        } catch (err) {
+            console.log('Oops, unable to copy');
+        }
+        document.body.removeChild(textArea);
+    },
+    //获取选中区域的表格类型数据(可粘贴到excel)
+    getTableData: function (sheet, colSettings = null) {
+        let rst = '';
+        let sel = sheet.getSelections()[0];
+        let vRows = [];
+        for(let i = sel.row, len = sel.row + sel.rowCount; i < len; i++){
+            if(sheet.getCell(i, -1).visible()){
+                vRows.push(i);
+            }
+        }
+        for(let row of vRows){
+            rst += '\n';
+            for(let j = 0, jLen = sel.colCount; j <jLen; j++){
+                let col = sel.col + j;
+                if(sheet.getCell(-1, col).visible()){
+                    let v = '';
+                    if(colSettings && (colSettings[col]['data']['field'] === 'itemCharacterText' || colSettings[col]['data']['field'] === 'jobContentText')){
+                       // v += sheet.getText(row, col) ? sheet.getText(row, col).replace(new RegExp('\n', 'g'), '\v') : '';
+                        v += sheet.getText(row, col) ? `"${sheet.getText(row, col)}"` : '';
+                        if(j !== jLen - 1){
+                            v += '\t';
+                        }
+                    }
+                    else {
+                        if(j === jLen - 1){
+                            v += sheet.getText(row, col) ? sheet.getText(row, col).replace('\n', '') : '';
+                        }
+                        else {
+                            v += sheet.getText(row, col) ? sheet.getText(row, col).replace('\n', '') + '\t' : '\t';
+                        }
+                    }
+                    rst += v;
+                }
+            }
+        }
+        rst = rst.replace('\n', '');
+        return rst;
     }
 }

+ 7 - 7
web/building_saas/complementary_glj_lib/html/tools-gongliaoji.html

@@ -22,7 +22,7 @@
 <body>
     <div class="header">
         <%include ../../../common/html/header.html %>
-        <nav class="navbar navbar-expand-lg justify-content-between navbar-light p-0">
+    <!--    <nav class="navbar navbar-expand-lg justify-content-between navbar-light p-0">
             <ul class="nav navbar-nav px-1">
                 <li class="nav-item">
                     <a class="nav-link" href="#" aria-expanded="false"><i class="fa fa-sliders"></i> 选项</a>
@@ -53,26 +53,26 @@
             <form class="form-inline">
                 <input class="form-control form-control-sm mr-1" type="text" placeholder="告诉我你想做什么">
             </form>
-        </nav>
+        </nav>-->
     </div>
     <div class="main">
-        <div class="main-nav">
+     <!--   <div class="main-nav">
             <ul class="nav flex-column">
               <li><a href="#">定额库编辑器</a></li>
               <li><a href="/complementaryGlj" class="active">工料机库编辑器</a></li>
             </ul>
-        </div>
-        <div class="content">
+        </div>-->
+        <div class="content" style="margin-left: 0px;">
             <div class="container-fluid">
                 <div class="row">
-                    <div class="col-lg-2 p-0">
+                    <div class="col-lg-3 p-0">
                         <div class="print-list">
                             <div class="form-list">
                                 <div id="gljClassSpread" style="height: 100%; width: 100%;"></div>
                             </div>
                         </div>
                     </div>
-                    <div id="GLJListSheet" class="col-lg-7 p-0">
+                    <div id="GLJListSheet" class="col-lg-6 p-0">
 
                     </div>
                     <div id="gljComponentSheet" class="col-lg-3 p-0">

+ 7 - 7
web/building_saas/complementary_glj_lib/js/glj.js

@@ -44,13 +44,13 @@ let repositoryGljObj = {
     setting: {
 
         header:[
-            {headerName:"编码",headerWidth:140,dataCode:"code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
-            {headerName:"名称",headerWidth:280,dataCode:"name", dataType: "String", hAlign: "left", vAlign: "center"},
-            {headerName:"规格型号",headerWidth:180,dataCode:"specs", dataType: "String", hAlign: "left", vAlign: "center"},
-            {headerName:"单位",headerWidth:120,dataCode:"unit", dataType: "String", hAlign: "center", vAlign: "center"},
-            {headerName:"定额价",headerWidth:120,dataCode:"basePrice", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center"},
-            {headerName:"类型",headerWidth:120,dataCode:"gljType", dataType: "String", hAlign: "center", vAlign: "center"},
-            {headerName:"是否新增",headerWidth:80,dataCode:"isComplementary", hAlign: "center", vAlign: "center"}
+            {headerName:"编码",headerWidth:80,dataCode:"code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
+            {headerName:"名称",headerWidth:160,dataCode:"name", dataType: "String", hAlign: "left", vAlign: "center"},
+            {headerName:"规格型号",headerWidth:120,dataCode:"specs", dataType: "String", hAlign: "left", vAlign: "center"},
+            {headerName:"单位",headerWidth:45,dataCode:"unit", dataType: "String", hAlign: "center", vAlign: "center"},
+            {headerName:"定额价",headerWidth:80,dataCode:"basePrice", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center"},
+            {headerName:"类型",headerWidth:90,dataCode:"gljType", dataType: "String", hAlign: "center", vAlign: "center"},
+            {headerName:"是否新增",headerWidth:60,dataCode:"isComplementary", hAlign: "center", vAlign: "center"}
         ],
         view:{
             comboBox:[

+ 4 - 4
web/building_saas/complementary_glj_lib/js/gljComponent.js

@@ -8,10 +8,10 @@ let gljComponentOprObj = {
         owner: "gljComponent",
         header:[
             {headerName:"编码",headerWidth:80,dataCode:"code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
-            {headerName:"名称",headerWidth:110,dataCode:"name", dataType: "String", hAlign: "left", vAlign: "center"},
-            {headerName:"单位",headerWidth:80,dataCode:"unit", dataType: "String", hAlign: "center", vAlign: "center"},
-            {headerName:"单价",headerWidth:80,dataCode:"basePrice", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center"},
-            {headerName:"消耗量",headerWidth:80,dataCode:"consumeAmt", dataType: "Number", formatter: "0.000", hAlign: "right", vAlign: "center"}
+            {headerName:"名称",headerWidth:90,dataCode:"name", dataType: "String", hAlign: "left", vAlign: "center"},
+            {headerName:"单位",headerWidth:45,dataCode:"unit", dataType: "String", hAlign: "center", vAlign: "center"},
+            {headerName:"单价",headerWidth:60,dataCode:"basePrice", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center"},
+            {headerName:"消耗量",headerWidth:70,dataCode:"consumeAmt", dataType: "Number", formatter: "0.000", hAlign: "right", vAlign: "center"}
         ],
         view: {
             lockedCols:[0, 1, 2, 3]

+ 4 - 4
web/building_saas/complementary_ration_lib/html/anzhuang.html

@@ -17,10 +17,11 @@
 
 <body>
     <div class="header">
-        <nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 ">
+        <%include ../../../common/html/header.html %>
+        <!--<nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 ">
             <span class="header-logo px-2">Smartcost</span>
             <div class="navbar-text" id="rationname"><a href="main">定额库</a><i class="fa fa-angle-right fa-fw"></i>XXX定额库</div>
-        </nav>
+        </nav>-->
         <nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0">
               <ul class="nav nav-tabs" role="tablist">
                   <li class="nav-item">
@@ -39,7 +40,7 @@
         </nav>
     </div>
     <div class="main">
-        <div class="content">
+        <div class="content" style="margin-left: 0px;">
             <div class="container-fluid">
               <div class="row">
                 <div class="main-content col-lg-12 p-0">
@@ -154,7 +155,6 @@
     <script src="/lib/bootstrap/bootstrap.min.js"></script>
     <script type="text/javascript" src="/public/web/QueryParam.js"></script>
     <script src="/public/web/uuid.js"></script>
-    <script src="/public/web/scMathUtil.js"></script>
     <script src="/public/web/common_util.js"></script>
     <script src="/public/web/storageUtil.js"></script>
     <script  src="/public/web/id_tree.js"></script>

+ 464 - 445
web/building_saas/complementary_ration_lib/html/dinge.html

@@ -5,506 +5,525 @@
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
-    <title>定额库编辑器</title>'
+    <title>定额库编辑器</title>
     <!--inject:css-->
-    <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
-   <!-- <link rel="stylesheet" href="/lib/css/bootstrap/themes.css">-->
-    <link rel="stylesheet" href="/web/building_saas/css/main.css">
-    <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
-    <link rel="stylesheet" href="/lib/jquery-contextmenu/jquery.contextMenu.css">
+    <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="/web/building_saas/css/main.css" type="text/css">
+    <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css" type="text/css">
+    <link rel="stylesheet" href="/lib/jquery-contextmenu/jquery.contextMenu.css" type="text/css">
     <link rel="stylesheet" href="/lib/spreadjs/sheets/css/gc.spread.sheets.excel2013lightGray.10.0.1.css" type="text/css">
     <!--endinject-->
 </head>
-
 <body>
-    <div class="header">
-        <nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 ">
-            <span class="header-logo px-2">Smartcost</span>
-            <div id="rationname" class="navbar-text"><a href="main">定额库</a><i class="fa fa-angle-right fa-fw"></i>XXX定额库</div>
-        </nav>
-        <nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0">
-              <ul class="nav nav-tabs" role="tablist">
-                  <li class="nav-item">
-                      <a class="nav-link active px-3" id ="dinge" >定额</a>
-                  </li>
-                  <li class="nav-item">
-                      <a class="nav-link px-3" id="gongliao" href="#">工料机</a>
-                  </li>
-                  <li class="nav-item">
-                      <a class="nav-link px-3" id="fuzhu" href="#">附注条件</a>
-                  </li>
-                  <li class="nav-item">
-                      <a class="nav-link px-3" id="anzhuang" href="#">安装增加费</a>
-                  </li>
-              </ul>
-        </nav>
-    </div>
-    <div class="main" style="overflow: hidden">
-        <div class="content">
-            <div class="container-fluid">
-                <div class="row">
-                  <div class="main-side col-lg-3 p-0" style="width: 100%; height: 100%; overflow: hidden">
-                      <div class="tab-bar">
-                          <a href="javascript:void(0);" id="tree_Insert" 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="tree_remove" class="btn btn-sm" 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="tree_upLevel" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="升级"><i class="fa fa-arrow-left" aria-hidden="true"></i></a>
-                          <a href="javascript:void(0);" id="tree_downLevel" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="降级"><i class="fa fa-arrow-right" aria-hidden="true"></i></a>
-                          <a href="javascript:void(0);" id="tree_downMove" 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="tree_upMove" 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 class="header">
+    <%include ../../../common/html/header.html %>
+    <!--<nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 ">
+        <span class="header-logo px-2">Smartcost</span>
+        <div id="rationname" class="navbar-text"><a href="main">定额库</a><i class="fa fa-angle-right fa-fw"></i>XXX定额库</div>
+    </nav>-->
+    <nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0">
+        <ul class="nav nav-tabs" role="tablist">
+            <li class="nav-item">
+                <a class="nav-link active px-3" id ="dinge" >定额</a>
+            </li>
+            <li class="nav-item">
+                <a class="nav-link px-3" id="gongliao" href="#">工料机</a>
+            </li>
+            <li class="nav-item">
+                <a class="nav-link px-3" id="fuzhu" href="#">附注条件</a>
+            </li>
+            <li class="nav-item">
+                <a class="nav-link px-3" id="anzhuang" href="#">安装增加费</a>
+            </li>
+        </ul>
+    </nav>
+</div>
+<div class="main" style="overflow: hidden">
+    <div class="content" style="margin-left: 0px">
+        <div class="container-fluid">
+            <div class="row">
+                <div class="main-side col-lg-3 p-0" style="width: 100%; height: 100%; overflow: hidden">
+                    <div class="tab-bar">
+                        <a href="javascript:void(0);" id="tree_Insert" 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="tree_remove" class="btn btn-sm" 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="tree_upLevel" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="升级"><i class="fa fa-arrow-left" aria-hidden="true"></i></a>
+                        <a href="javascript:void(0);" id="tree_downLevel" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="降级"><i class="fa fa-arrow-right" aria-hidden="true"></i></a>
+                        <a href="javascript:void(0);" id="tree_downMove" 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="tree_upMove" 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 class="tab-content" id="sectionSpread" style="overflow: hidden">
-                      <!--<ul id="rationChapterTree" class="ztree"></ul>-->
+                        <!--<ul id="rationChapterTree" class="ztree"></ul>-->
                     </div>
-                  </div>
-                  <div class="main-content col-lg-9 p-0">
-                      <!-- 右标签 -->
-                      <ul class="nav nav-tabs tools-bar" role="tablist">
-                          <li class="nav-item">
-                              <a class="nav-link active" data-toggle="tab" href="#tde" role="tab">定额</a>
-                          </li>
-                          <li class="nav-item">
-                              <a class="nav-link" data-toggle="tab" href="#tsm" role="tab" id="explanationLink">说明</a>
-                          </li>
-                          <li class="nav-item">
-                              <a class="nav-link" data-toggle="tab" href="#tjs" role="tab">计算规则</a>
-                          </li>
-                          <li class="nav-item">
-                              <a class="nav-link" data-toggle="tab" href="#tgz" role="tab">工作内容</a>
-                          </li>
-                          <li class="nav-item">
-                              <a class="nav-link" data-toggle="tab" href="#tfz" role="tab">附注</a>
-                          </li>
-                      </ul>
-                      <div class="tab-content">
-                          <!--定额-->
-                          <div class="tab-pane active" id="tde" role="tabpanel">
-                              <!--定额top-->
-                              <div id="rationItemsSheet" class="main-data-top"></div>
-                              <!--定额bottom-->
-                              <div class="bottom-content">
-                                  <!-- 标签 -->
-                                  <ul class="nav nav-tabs" role="tablist">
-                                      <li class="nav-item">
-                                          <a class="nav-link active" id="linkGLJ" data-toggle="tab" href="#rDetail" role="tab">工料机</a>
-                                      </li>
-                                      <li class="nav-item">
-                                          <a class="nav-link" id="linkFZDE" data-toggle="tab" href="#rDetail" role="tab">辅助定额调整</a>
-                                      </li>
-                                      <li class="nav-item">
-                                          <a class="nav-link" id="linkFZTJ" data-toggle="tab" href="#rDetail" role="tab">附注条件调整</a>
-                                      </li>
-                                      <li class="nav-item">
-                                          <a class="nav-link px-3" id="linkAZZJ" data-toggle="tab" href="#rDetail" role="tab">安装增加费</a>
-                                      </li>
-                                  </ul>
-                                  <!-- 内容 -->
-                                  <div class="tab-content">
-                                      <div class="tab-pane active" id="rDetail" role="tabpanel">
-                                          <div id="rdSpread" class="main-data-bottom" style="overflow: hidden"></div>
-                                      </div>
-                                  </div>
-                              </div>
-                          </div>
-                          <!--说明-->
-                          <div class="tab-pane" id="tsm" role="tabpanel">
-                              <div class="main-data">
-                                  <div class="main-content m-2">
-                                      <h5>说明</h5>
-                                      <textarea id="explanationShow" class="form-control" disabled="disabled" rows="35" style="background: white;"></textarea>
-                                  </div>
-                              </div>
-                          </div>
-                          <!--计算规则-->
-                          <div class="tab-pane" id="tjs" role="tabpanel">
-                              <div class="main-data">
-                                  <div class="main-content m-2">
-                                      <h5>计算规则</h5>
-                                      <textarea id="ruleTextShow" class="form-control" disabled="disabled"  rows="35" style="background: white;"></textarea>
-                                  </div>
-                              </div>
-                          </div>
-                          <!--工作内容-->
-                          <div class="tab-pane" id="tgz" role="tabpanel">
-                              <div class="main-data">
-                                  <div class="form-check m-2"><label class="form-check-label"><input type="radio"  class="form-check-input" name="optionsRadios" value="ALL" disabled="true"> 适合本项所有定额</label>&nbsp;&nbsp;<label class="form-check-label"><input type="radio" class="form-check-input disabled" name="optionsRadios" value="PARTIAL" disabled="true"> 适合本项部分定额</label></div>
-                                  <!-- <p class="m-2">适合本项所有定额</p> -->
-                                  <table class="table table-sm table-bordered m-0" id="tableAll">
-                                      <tr>
-                                          <td><textarea class="form-control" rows="30" id="txtareaAll" disabled="disabled" style="background: white;"></textarea></td>
-                                      </tr>
-                                  </table>
-                                  <table class="table table-sm table-bordered m-0" id="tablePartial">
-                                  </table>
-                              </div>
-                          </div>
-                          <!--附注-->
-                          <div class="tab-pane" id="tfz" role="tabpanel">
-                              <div class="main-data">
-                                  <div class="form-check m-2"><label class="form-check-label"><input type="radio" class="form-check-input" name="fzRadios" value="ALL" disabled=""> 适合本项所有定额</label>&nbsp;&nbsp;<label class="form-check-label"><input type="radio" class="form-check-input" name="fzRadios" value="PARTIAL" disabled> 适合本项部分定额</label></div>
-                                  <!-- <p class="m-2">适合本项所有定额</p> -->
-                                  <table class="table table-sm table-bordered m-0" id="fzTableAll">
-                                      <tr>
-                                          <td><textarea class="form-control" rows="30" id="fzTxtareaAll" disabled="disabled" style="background: white;"></textarea></td>
-                                      </tr>
-                                  </table>
-                                  <table class="table table-sm table-bordered m-0" id="fzTablePartial">
-                                  </table>
-                              </div>
-                          </div>
-                  </div>
                 </div>
-            </div>
-        </div>
-    </div>
-        <!--弹出添加-->
-        <button id="gznrBtn" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#addNewgznr" style="display: none"></button>
-        <div class="modal fade" id="addNewgznr" data-backdrop="static" style="display: none;" aria-hidden="true">
-            <div class="modal-dialog" role="document">
-                <div class="modal-content">
-                    <div class="modal-header">
-                        <h5 class="modal-title">添加工作内容</h5>
-                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                            <span aria-hidden="true">×</span>
-                        </button>
-                    </div>
-                    <div class="modal-body">
-                        <form>
-                            <div class="form-group">
-                                <label>内容</label>
-                                <textarea class="form-control" rows="5"></textarea>
-                            </div>
-                        </form>
-                        <form>
-                            <div class="form-group">
-                                <label>编码</label>
-                                <div class="form-control">
-                                    <div class="row code">
-                                        <div class="col">
-                                            <label class="form-check-label">
-                                                <input class="form-check-input" type="checkbox" value="option1" checked> AA0017
-                                            </label>
-                                        </div>
-                                        <div class="col">
-                                            <label class="form-check-label">
-                                                <input class="form-check-input" type="checkbox" value="option1" checked> AA0018
-                                            </label>
-                                        </div>
-                                        <div class="col">
-                                            <label class="form-check-label">
-                                                <input class="form-check-input" type="checkbox" value="option1" checked> AA0019
-                                            </label>
-                                        </div>
-                                        <div class="w-100"></div>
-                                        <div class="col">
-                                            <label class="form-check-label">
-                                                <input class="form-check-input" type="checkbox" value="option1"> AA0020
-                                            </label>
-                                        </div>
-                                        <div class="col">
-                                            <label class="form-check-label">
-                                                <input class="form-check-input" type="checkbox" value="option1"> AA0021
-                                            </label>
-                                        </div>
-                                        <div class="col">
-                                            <label class="form-check-label">
-                                                <input class="form-check-input" type="checkbox" value="option1"> AA0022
-                                            </label>
-                                        </div>
+                <div class="main-content col-lg-9 p-0">
+                    <!-- 右标签 -->
+                    <ul class="nav nav-tabs tools-bar" role="tablist">
+                        <li class="nav-item">
+                            <a class="nav-link active" data-toggle="tab" href="#tde" role="tab">定额</a>
+                        </li>
+                        <li class="nav-item">
+                            <a class="nav-link" data-toggle="tab" href="#tsm" role="tab" id="explanationLink">说明</a>
+                        </li>
+                        <li class="nav-item">
+                            <a class="nav-link" data-toggle="tab" href="#tjs" role="tab">计算规则</a>
+                        </li>
+                        <li class="nav-item">
+                            <a class="nav-link" data-toggle="tab" href="#tgz" role="tab">工作内容</a>
+                        </li>
+                        <li class="nav-item">
+                            <a class="nav-link" data-toggle="tab" href="#tfz" role="tab">附注</a>
+                        </li>
+                    </ul>
+                    <div class="tab-content">
+                        <!--定额-->
+                        <div class="tab-pane active" id="tde" role="tabpanel">
+                            <!--定额top-->
+                            <div id="rationItemsSheet" class="main-data-top"></div>
+                            <!--定额bottom-->
+                            <div class="bottom-content">
+                                <!-- 标签 -->
+                                <ul class="nav nav-tabs" role="tablist">
+                                    <li class="nav-item">
+                                        <a class="nav-link active" id="linkGLJ" data-toggle="tab" href="#rDetail" role="tab">工料机</a>
+                                    </li>
+                                    <li class="nav-item">
+                                        <a class="nav-link" id="linkFZDE" data-toggle="tab" href="#rDetail" role="tab">辅助定额调整</a>
+                                    </li>
+                                    <li class="nav-item">
+                                        <a class="nav-link" id="linkFZTJ" data-toggle="tab" href="#rDetail" role="tab">附注条件调整</a>
+                                    </li>
+                                    <li class="nav-item">
+                                        <a class="nav-link px-3" id="linkAZZJ" data-toggle="tab" href="#rDetail" role="tab">安装增加费</a>
+                                    </li>
+                                </ul>
+                                <!-- 内容 -->
+                                <div class="tab-content">
+                                    <div class="tab-pane active" id="rDetail" role="tabpanel">
+                                        <div id="rdSpread" class="main-data-bottom" style="overflow: hidden"></div>
                                     </div>
                                 </div>
                             </div>
-
-                            <div class="form-group">
-                                <label>内容</label>
-                                <textarea class="form-control" rows="5"></textarea>
+                        </div>
+                        <!--说明-->
+                        <div class="tab-pane" id="tsm" role="tabpanel">
+                            <div class="main-data">
+                                <div class="main-content m-2">
+                                    <h5>说明</h5>
+                                    <textarea id="explanationShow" class="form-control" disabled="disabled" rows="35" style="background: white;"></textarea>
+                                </div>
                             </div>
-                        </form>
-                    </div>
-                    <div class="modal-footer">
-                        <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                        <a href="" class="btn btn-primary">确定</a>
+                        </div>
+                        <!--计算规则-->
+                        <div class="tab-pane" id="tjs" role="tabpanel">
+                            <div class="main-data">
+                                <div class="main-content m-2">
+                                    <h5>计算规则</h5>
+                                    <textarea id="ruleTextShow" class="form-control" disabled="disabled"  rows="35" style="background: white;"></textarea>
+                                </div>
+                            </div>
+                        </div>
+                        <!--工作内容-->
+                        <div class="tab-pane" id="tgz" role="tabpanel">
+                            <div class="main-data">
+                                <div class="form-check m-2"><label class="form-check-label"><input type="radio"  class="form-check-input" name="optionsRadios" value="ALL" disabled="true"> 适合本项所有定额</label>&nbsp;&nbsp;<label class="form-check-label"><input type="radio" class="form-check-input disabled" name="optionsRadios" value="PARTIAL" disabled="true"> 适合本项部分定额</label></div>
+                                <!-- <p class="m-2">适合本项所有定额</p> -->
+                                <table class="table table-sm table-bordered m-0" id="tableAll">
+                                    <tr>
+                                        <td><textarea class="form-control" rows="30" id="txtareaAll" disabled="disabled" style="background: white;"></textarea></td>
+                                    </tr>
+                                </table>
+                                <table class="table table-sm table-bordered m-0" id="tablePartial">
+                                </table>
+                            </div>
+                        </div>
+                        <!--附注-->
+                        <div class="tab-pane" id="tfz" role="tabpanel">
+                            <div class="main-data">
+                                <div class="form-check m-2"><label class="form-check-label"><input type="radio" class="form-check-input" name="fzRadios" value="ALL" disabled=""> 适合本项所有定额</label>&nbsp;&nbsp;<label class="form-check-label"><input type="radio" class="form-check-input" name="fzRadios" value="PARTIAL" disabled> 适合本项部分定额</label></div>
+                                <!-- <p class="m-2">适合本项所有定额</p> -->
+                                <table class="table table-sm table-bordered m-0" id="fzTableAll">
+                                    <tr>
+                                        <td><textarea class="form-control" rows="30" id="fzTxtareaAll" disabled="disabled" style="background: white;"></textarea></td>
+                                    </tr>
+                                </table>
+                                <table class="table table-sm table-bordered m-0" id="fzTablePartial">
+                                </table>
+                            </div>
+                        </div>
                     </div>
                 </div>
             </div>
         </div>
-        <!--弹出编辑-->
-        <div class="modal fade" id="editTsm" data-backdrop="static" style="display: none;" aria-hidden="true">
-            <div class="modal-dialog" role="document">
-                <div class="modal-content">
-                    <div class="modal-header">
-                        <h5 class="modal-title">编辑说明</h5>
-                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                            <span aria-hidden="true">×</span>
-                        </button>
+    </div>
+</div>
+<!--弹出添加-->
+<button id="gznrBtn" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#addNewgznr" style="display: none"></button>
+<div class="modal fade" id="addNewgznr" data-backdrop="static" style="display: none;" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">添加工作内容</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">×</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <form>
+                    <div class="form-group">
+                        <label>内容</label>
+                        <textarea class="form-control" rows="5"></textarea>
                     </div>
-                    <div class="modal-body">
-                        <form>
-                            <div class="form-group">
-                                <label>内容</label>
-                                <textarea class="form-control" rows="5" id="explanationAdd"></textarea>
+                </form>
+                <form>
+                    <div class="form-group">
+                        <label>编码</label>
+                        <div class="form-control">
+                            <div class="row code">
+                                <div class="col">
+                                    <label class="form-check-label">
+                                        <input class="form-check-input" type="checkbox" value="option1" checked> AA0017
+                                    </label>
+                                </div>
+                                <div class="col">
+                                    <label class="form-check-label">
+                                        <input class="form-check-input" type="checkbox" value="option1" checked> AA0018
+                                    </label>
+                                </div>
+                                <div class="col">
+                                    <label class="form-check-label">
+                                        <input class="form-check-input" type="checkbox" value="option1" checked> AA0019
+                                    </label>
+                                </div>
+                                <div class="w-100"></div>
+                                <div class="col">
+                                    <label class="form-check-label">
+                                        <input class="form-check-input" type="checkbox" value="option1"> AA0020
+                                    </label>
+                                </div>
+                                <div class="col">
+                                    <label class="form-check-label">
+                                        <input class="form-check-input" type="checkbox" value="option1"> AA0021
+                                    </label>
+                                </div>
+                                <div class="col">
+                                    <label class="form-check-label">
+                                        <input class="form-check-input" type="checkbox" value="option1"> AA0022
+                                    </label>
+                                </div>
                             </div>
-                        </form>
+                        </div>
                     </div>
-                    <div class="modal-footer">
-                        <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                        <a href="javascript:void(0);" class="btn btn-primary" id="explanationBtn" data-dismiss="modal">确定</a>
+
+                    <div class="form-group">
+                        <label>内容</label>
+                        <textarea class="form-control" rows="5"></textarea>
                     </div>
-                </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <a href="" class="btn btn-primary">确定</a>
             </div>
         </div>
-        <div class="modal fade" id="editTjs" data-backdrop="static" style="display: none;" aria-hidden="true">
-            <div class="modal-dialog" role="document">
-                <div class="modal-content">
-                    <div class="modal-header">
-                        <h5 class="modal-title">编辑计算规则</h5>
-                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                            <span aria-hidden="true">×</span>
-                        </button>
-                    </div>
-                    <div class="modal-body">
-                        <form>
-                            <div class="form-group">
-                                <label>内容</label>
-                                <textarea class="form-control" rows="5"></textarea>
-                            </div>
-                        </form>
-                    </div>
-                    <div class="modal-footer">
-                        <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                        <a href="javascript:void(0);" class="btn btn-primary" data-dismiss="modal" id="ruleTextAdd">确定</a>
+    </div>
+</div>
+<!--弹出编辑-->
+<div class="modal fade" id="editTsm" data-backdrop="static" style="display: none;" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">编辑说明</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">×</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <form>
+                    <div class="form-group">
+                        <label>内容</label>
+                        <textarea class="form-control" rows="5" id="explanationAdd"></textarea>
                     </div>
-                </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <a href="javascript:void(0);" class="btn btn-primary" id="explanationBtn" data-dismiss="modal">确定</a>
             </div>
         </div>
-        <div class="modal fade" id="editBianmaQ" data-backdrop="static" style="display: none;" aria-hidden="true">
-            <div class="modal-dialog" role="document">
-                <div class="modal-content">
-                    <div class="modal-header">
-                        <h5 class="modal-title">修改编码</h5>
-                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                            <span aria-hidden="true">×</span>
-                        </button>
+    </div>
+</div>
+<div class="modal fade" id="editTjs" data-backdrop="static" style="display: none;" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">编辑计算规则</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">×</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <form>
+                    <div class="form-group">
+                        <label>内容</label>
+                        <textarea class="form-control" rows="5"></textarea>
                     </div>
-                    <div class="modal-body">
-                        <form>
-                            <div class="form-group">
-                                <label>编码</label>
-                                <div class="form-control">
-                                    <div class="row code" id="updateCon">
-                                    </div>
-                                </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <a href="javascript:void(0);" class="btn btn-primary" data-dismiss="modal" id="ruleTextAdd">确定</a>
+            </div>
+        </div>
+    </div>
+</div>
+<div class="modal fade" id="editBianmaQ" data-backdrop="static" style="display: none;" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">修改编码</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">×</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <form>
+                    <div class="form-group">
+                        <label>编码</label>
+                        <div class="form-control">
+                            <div class="row code" id="updateCon">
                             </div>
-                        </form>
-                    </div>
-                    <div class="modal-footer">
-                        <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                        <a href="javascript: void(0);" class="btn btn-primary" data-dismiss="modal" id="updateConBtn">确定</a>
+                        </div>
                     </div>
-                </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <a href="javascript: void(0);" class="btn btn-primary" data-dismiss="modal" id="updateConBtn">确定</a>
             </div>
         </div>
-        <div class="modal fade" id="editBianma" data-backdrop="static" style="display: none;" aria-hidden="true">
-            <div class="modal-dialog" role="document">
-                <div class="modal-content">
-                    <div class="modal-header">
-                        <h5 class="modal-title">勾选编码</h5>
-                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                            <span aria-hidden="true">×</span>
-                        </button>
-                    </div>
-                    <div class="modal-body">
-                        <form>
-                            <div class="form-group">
-                                <label>编码</label>
-                                <div class="form-control">
-                                    <div class="row code" id="addCon">
-                                    </div>
-                                </div>
+    </div>
+</div>
+<div class="modal fade" id="editBianma" data-backdrop="static" style="display: none;" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">勾选编码</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">×</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <form>
+                    <div class="form-group">
+                        <label>编码</label>
+                        <div class="form-control">
+                            <div class="row code" id="addCon">
                             </div>
-                        </form>
-                    </div>
-                    <div class="modal-footer">
-                        <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                        <a href="javascript: void(0);" class="btn btn-primary" data-dismiss="modal" id="addConBtn">确定</a>
+                        </div>
                     </div>
-                </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <a href="javascript: void(0);" class="btn btn-primary" data-dismiss="modal" id="addConBtn">确定</a>
             </div>
         </div>
-        <!--弹出附注-->
-        <div class="modal fade" id="fzEditBianmaQ" data-backdrop="static" style="display: none;" aria-hidden="true">
-            <div class="modal-dialog" role="document">
-                <div class="modal-content">
-                    <div class="modal-header">
-                        <h5 class="modal-title">修改编码</h5>
-                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                            <span aria-hidden="true">×</span>
-                        </button>
-                    </div>
-                    <div class="modal-body">
-                        <form>
-                            <div class="form-group">
-                                <label>编码</label>
-                                <div class="form-control">
-                                    <div class="row code" id="fzUpdateCon">
-                                    </div>
-                                </div>
+    </div>
+</div>
+<!--弹出附注-->
+<div class="modal fade" id="fzEditBianmaQ" data-backdrop="static" style="display: none;" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">修改编码</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">×</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <form>
+                    <div class="form-group">
+                        <label>编码</label>
+                        <div class="form-control">
+                            <div class="row code" id="fzUpdateCon">
                             </div>
-                        </form>
+                        </div>
                     </div>
-                    <div class="modal-footer">
-                        <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                        <a href="javascript: void(0);" class="btn btn-primary" data-dismiss="modal" id="fzUpdateConBtn">确定</a>
-                    </div>
-                </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <a href="javascript: void(0);" class="btn btn-primary" data-dismiss="modal" id="fzUpdateConBtn">确定</a>
             </div>
         </div>
-        <div class="modal fade" id="fzEditBianma" data-backdrop="static" style="display: none;" aria-hidden="true">
-            <div class="modal-dialog" role="document">
-                <div class="modal-content">
-                    <div class="modal-header">
-                        <h5 class="modal-title">勾选编码</h5>
-                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                            <span aria-hidden="true">×</span>
-                        </button>
-                    </div>
-                    <div class="modal-body">
-                        <form>
-                            <div class="form-group">
-                                <label>编码</label>
-                                <div class="form-control">
-                                    <div class="row code" id="fzAddCon">
-                                    </div>
-                                </div>
+    </div>
+</div>
+<div class="modal fade" id="fzEditBianma" data-backdrop="static" style="display: none;" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">勾选编码</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">×</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <form>
+                    <div class="form-group">
+                        <label>编码</label>
+                        <div class="form-control">
+                            <div class="row code" id="fzAddCon">
                             </div>
-                        </form>
-                    </div>
-                    <div class="modal-footer">
-                        <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                        <a href="javascript: void(0);" class="btn btn-primary" data-dismiss="modal" id="fzAddConBtn">确定</a>
+                        </div>
                     </div>
-                </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <a href="javascript: void(0);" class="btn btn-primary" data-dismiss="modal" id="fzAddConBtn">确定</a>
             </div>
         </div>
-        <!--弹出警告窗-->
-        <button id="rationAlertBtn" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#rationAlert" style="display: none"></button>
-        <div class="modal fade" id="rationAlert" data-backdrop="static" style="display: none;" aria-hidden="true">
-            <input type="hidden" id="gdid" value="123">
-            <div class="modal-dialog" role="document">
-                <div class="modal-content">
-                    <div class="modal-header">
-                        <h5 class="modal-title">取消确认</h5>
-                        <button type="button" id="rationAlertCls" class="close" data-dismiss="modal" aria-label="Close">
-                            <span aria-hidden="true">×</span>
-                        </button>
-                    </div>
-                    <div class="modal-body">
-                        <h5 class="text-danger" id="alertRationTxt">编码不可为空,继续新增定额?</h5>
-                    </div>
-                    <div class="modal-footer">
-                        <button type="button" class="btn btn-secondary" id="rationAlertCac" data-dismiss="modal">取消</button>
-                        <a href="javascript: void(0);" id="rationAlertCof" class="btn btn-danger" data-dismiss="modal">确认</a>
-                    </div>
-                </div>
+    </div>
+</div>
+<!--弹出警告窗-->
+<button id="rationAlertBtn" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#rationAlert" style="display: none"></button>
+<div class="modal fade" id="rationAlert" data-backdrop="static" style="display: none;" aria-hidden="true">
+    <input type="hidden" id="gdid" value="123">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">取消确认</h5>
+                <button type="button" id="rationAlertCls" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">×</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <h5 class="text-danger" id="alertRationTxt">编码不可为空,继续新增定额?</h5>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" id="rationAlertCac" data-dismiss="modal">取消</button>
+                <a href="javascript: void(0);" id="rationAlertCof" class="btn btn-danger" data-dismiss="modal">确认</a>
             </div>
         </div>
-        <button id="alertModalBtn" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#alertModal" style="display: none"></button>
-        <div class="modal fade" id="alertModal" data-backdrop="static" style="display: none;" aria-hidden="true">
-            <input type="hidden" id="codedid" value="123">
-            <div class="modal-dialog" role="document">
-                <div class="modal-content">
-                    <div class="modal-header">
-                        <h5 class="modal-title">警告</h5>
-                        <button type="button" id="alertModalCls" class="close" data-dismiss="modal" aria-label="Close">
-                            <span aria-hidden="true">×</span>
-                        </button>
-                    </div>
-                    <div class="modal-body">
-                        <h5 class="text-danger" id="alertText">输入的编号已存在,请重新输入!</h5>
-                    </div>
-                    <div class="modal-footer">
-                        <button type="button" class="btn btn-danger" id="alertModalCof" data-dismiss="modal">确认</button>
-                    </div>
-                </div>
+    </div>
+</div>
+<button id="alertModalBtn" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#alertModal" style="display: none"></button>
+<div class="modal fade" id="alertModal" data-backdrop="static" style="display: none;" aria-hidden="true">
+    <input type="hidden" id="codedid" value="123">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">警告</h5>
+                <button type="button" id="alertModalCls" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">×</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <h5 class="text-danger" id="alertText">输入的编号已存在,请重新输入!</h5>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-danger" id="alertModalCof" data-dismiss="modal">确认</button>
             </div>
         </div>
-        <!-- JS. -->
-        <script type="text/javascript" src = "/lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
-        <script type="text/javascript" src="/lib/jquery/jquery-3.2.1.min.js"></script>
-        <script type="text/javascript" src="/lib/jquery-contextmenu/jquery.contextMenu.min.js"></script>
-        <script type="text/javascript" src="/lib/jquery-contextmenu/jquery.ui.position.js"></script>
-        <!--inject:js-->
-        <script>GC.Spread.Sheets.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</script>
-        <script type="text/javascript" src="/lib/popper/popper.min.js"></script>
-        <script type="text/javascript" src="/lib/bootstrap/bootstrap.min.js"></script>
-        <script type="text/javascript" src="/web/building_saas/complementary_ration_lib/js/global.js"></script>
-        <script type="text/javascript" src="/public/web/id_tree.js"></script>
-        <script type="text/javascript" src="/public/web/tree_sheet/tree_sheet_controller.js"></script>
-        <script type="text/javascript" src="/public/web/tree_sheet/tree_sheet_helper.js"></script>
-        <script type="text/javascript" src="/public/web/treeDataHelper.js"></script>
-        <script type="text/javascript" src="/public/web/sheet/sheet_common.js"></script>
-        <script type="text/javascript" src="/web/building_saas/complementary_ration_lib/js/sheetsOpr.js"></script>
-        <script type="text/javascript" src="/public/web/QueryParam.js"></script>
-        <script type="text/javascript" src="/public/web/storageUtil.js"></script>
+    </div>
+</div>
+<!--弹出定额库-->
+<div class="modal fade" id="comple-ration" data-backdrop="static">
+    <div class="modal-dialog modal-lg" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">定额库</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-auto-height">
+                <table class="table table-hover table-bordered">
+                    <thead><tr><th>定额库名称</th></tr></thead>
+                    <tbody id="comple_ration_table">
+                    </tbody>
+                </table>
+            </div>
+        </div>
+    </div>
+</div>
+<!-- JS. -->
+<script type="text/javascript" src = "/lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
+<script type="text/javascript" src="/lib/jquery/jquery-3.2.1.min.js"></script>
+<script type="text/javascript" src="/lib/jquery-contextmenu/jquery.contextMenu.min.js"></script>
+<script type="text/javascript" src="/lib/jquery-contextmenu/jquery.ui.position.js"></script>
+<!--inject:js-->
+<script>GC.Spread.Sheets.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</script>
+<script type="text/javascript" src="/lib/popper/popper.min.js"></script>
+<script type="text/javascript" src="/lib/bootstrap/bootstrap.min.js"></script>
+<script type="text/javascript" src="/web/building_saas/complementary_ration_lib/js/global.js"></script>
+<script type="text/javascript" src="/public/web/id_tree.js"></script>
+<script type="text/javascript" src="/public/web/tree_sheet/tree_sheet_controller.js"></script>
+<script type="text/javascript" src="/public/web/tree_sheet/tree_sheet_helper.js"></script>
+<script type="text/javascript" src="/public/web/treeDataHelper.js"></script>
+<script type="text/javascript" src="/public/web/sheet/sheet_common.js"></script>
+<script type="text/javascript" src="/web/building_saas/complementary_ration_lib/js/sheetsOpr.js"></script>
+<script type="text/javascript" src="/public/web/QueryParam.js"></script>
+<script type="text/javascript" src="/public/web/storageUtil.js"></script>
 
-        <script type="text/javascript" src="/web/building_saas/complementary_ration_lib/js/section_tree.js"></script>
-        <script type="text/javascript" src="/web/building_saas/complementary_ration_lib/js/explanatory.js"></script>
-        <script type="text/javascript" src="/web/building_saas/complementary_ration_lib/js/jobContent.js"></script>
-        <script type="text/javascript" src="/web/building_saas/complementary_ration_lib/js/annotation.js"></script>
-        <script type="text/javascript" src="/public/web/scMathUtil.js"></script>
-        <script type="text/javascript" src="/public/web/common_ajax.js"></script>
-        <script type="text/javascript" src="/public/web/ztree_common.js"></script>
-        <script type="text/javascript" src="/web/building_saas/complementary_ration_lib/js/rationUnits.js"></script>
-        <script type="text/javascript" src="/web/building_saas/complementary_ration_lib/js/ration.js"></script>
-        <script type="text/javascript" src="/web/building_saas/complementary_ration_lib/js/ration_glj.js"></script>
-   <!--     <script type="text/javascript" src="/public/web/sheet/sheet_creater.js"></script>-->
-        <script type="text/javascript" src="/web/building_saas/complementary_ration_lib/js/ration_coe.js"></script>
-        <script type="text/javascript" src="/web/building_saas/complementary_ration_lib/js/ration_assist.js"></script>
-        <script type="text/javascript" src="/web/building_saas/complementary_ration_lib/js/ration_installation.js"></script>
-        <!--endinject-->
-        <script type="text/javascript">
-            let userID = '<%=userID %>';
-            $(document).ready(function(){
-                pageOprObj.initPage();
-                rationOprObj.buildSheet($("#rationItemsSheet")[0]);
-               // sheetCommonObj.shieldAllCells(rationOprObj.workBook.getSheet(0), rationOprObj.setting);
+<script type="text/javascript" src="/web/building_saas/complementary_ration_lib/js/section_tree.js"></script>
+<script type="text/javascript" src="/web/building_saas/complementary_ration_lib/js/explanatory.js"></script>
+<script type="text/javascript" src="/web/building_saas/complementary_ration_lib/js/jobContent.js"></script>
+<script type="text/javascript" src="/web/building_saas/complementary_ration_lib/js/annotation.js"></script>
+<!--  <script type="text/javascript" src="/public/web/scMathUtil.js"></script>-->
+<script type="text/javascript" src="/public/web/common_ajax.js"></script>
+<script type="text/javascript" src="/public/web/ztree_common.js"></script>
+<script type="text/javascript" src="/web/building_saas/complementary_ration_lib/js/rationUnits.js"></script>
+<script type="text/javascript" src="/web/building_saas/complementary_ration_lib/js/ration.js"></script>
+<script type="text/javascript" src="/web/building_saas/complementary_ration_lib/js/ration_glj.js"></script>
+<!--     <script type="text/javascript" src="/public/web/sheet/sheet_creater.js"></script>-->
+<script type="text/javascript" src="/web/building_saas/complementary_ration_lib/js/ration_coe.js"></script>
+<script type="text/javascript" src="/web/building_saas/complementary_ration_lib/js/ration_assist.js"></script>
+<script type="text/javascript" src="/web/building_saas/complementary_ration_lib/js/ration_installation.js"></script>
+<!--endinject-->
+<script type="text/javascript">
+    let userID = '<%=userID %>';
+    $(document).ready(function(){
+        pageOprObj.initPage();
+        rationOprObj.buildSheet($("#rationItemsSheet")[0]);
+        // sheetCommonObj.shieldAllCells(rationOprObj.workBook.getSheet(0), rationOprObj.setting);
 
-               // tabPanel 下有多个Spread时,相互之间不能正确显示。改成一个Spread下多个Sheet。
-                var rdSpread = sheetCommonObj.createSpread($("#rdSpread")[0], 4);
-                rationGLJOprObj.buildSheet(rdSpread.getSheet(0));
-               // sheetCommonObj.shieldAllCells(rdSpread.getSheet(0), rationGLJOprObj.setting);
+        // tabPanel 下有多个Spread时,相互之间不能正确显示。改成一个Spread下多个Sheet。
+        var rdSpread = sheetCommonObj.createSpread($("#rdSpread")[0], 4);
+        rationGLJOprObj.buildSheet(rdSpread.getSheet(0));
+        // sheetCommonObj.shieldAllCells(rdSpread.getSheet(0), rationGLJOprObj.setting);
 
-                rationAssistOprObj.buildSheet(rdSpread.getSheet(1));
-             //   sheetCommonObj.shieldAllCells(rdSpread.getSheet(1), rationAssistOprObj.setting);
+        rationAssistOprObj.buildSheet(rdSpread.getSheet(1));
+        //   sheetCommonObj.shieldAllCells(rdSpread.getSheet(1), rationAssistOprObj.setting);
 
-                rationCoeOprObj.buildSheet(rdSpread.getSheet(2));
-              //  sheetCommonObj.shieldAllCells(rdSpread.getSheet(2), rationCoeOprObj.setting);
+        rationCoeOprObj.buildSheet(rdSpread.getSheet(2));
+        //  sheetCommonObj.shieldAllCells(rdSpread.getSheet(2), rationCoeOprObj.setting);
 
-                rationInstObj.getInstallation(parseInt(getQueryString("repository")), function () {
-                    rationInstObj.buildSheet(rdSpread.getSheet(3));
-                });
+        rationInstObj.getInstallation(parseInt(getQueryString("repository")), function () {
+            rationInstObj.buildSheet(rdSpread.getSheet(3));
+        });
 
-                $("#linkGLJ").click(function(){
-                    rationGLJOprObj.bindRationGljDelOpr();
-                    rdSpread.setActiveSheetIndex(0);
-                });
+        $("#linkGLJ").click(function(){
+            rationGLJOprObj.bindRationGljDelOpr();
+            rdSpread.setActiveSheetIndex(0);
+        });
 
-                $("#linkFZDE").click(function(){
-                    rationAssistOprObj.bindRationAssDel();
-                    rdSpread.setActiveSheetIndex(1);
-                });
+        $("#linkFZDE").click(function(){
+            rationAssistOprObj.bindRationAssDel();
+            rdSpread.setActiveSheetIndex(1);
+        });
 
-                $("#linkFZTJ").click(function(){
-                    rationCoeOprObj.bindRationCoeDel();
-                    rdSpread.setActiveSheetIndex(2);
-                });
+        $("#linkFZTJ").click(function(){
+            rationCoeOprObj.bindRationCoeDel();
+            rdSpread.setActiveSheetIndex(2);
+        });
 
-                $("#linkAZZJ").click(function(){
-                    rationInstObj.bindRationInstDel();
-                    rdSpread.setActiveSheetIndex(3);
-                });
-            });
-        </script>
-    </div>
+        $("#linkAZZJ").click(function(){
+            rationInstObj.bindRationInstDel();
+            rdSpread.setActiveSheetIndex(3);
+        });
+    });
+</script>
 </body>
 <script type="text/javascript">
     autoFlashHeight();

+ 4 - 3
web/building_saas/complementary_ration_lib/html/fuzhu.html

@@ -16,10 +16,11 @@
 
 <body>
     <div class="header">
-        <nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 ">
+        <%include ../../../common/html/header.html %>
+       <!-- <nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 ">
             <span class="header-logo px-2">Smartcost</span>
             <div class="navbar-text" id="rationname"><a href="main">定额库</a><i class="fa fa-angle-right fa-fw"></i>XXX定额库</div>
-        </nav>
+        </nav>-->
         <nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0">
               <ul class="nav nav-tabs" role="tablist">
                   <li class="nav-item">
@@ -41,7 +42,7 @@
         </nav>
     </div>
     <div class="main">
-        <div class="content">
+        <div class="content" style="margin-left: 0px;">
             <div class="container-fluid">
                 <div class="row">
                     <div class="main-content col-lg-7 p-0">

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

@@ -21,10 +21,11 @@
 
 <body>
     <div class="header">
-        <nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 ">
+        <%include ../../../common/html/header.html %>
+        <!--<nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 ">
             <span class="header-logo px-2">Smartcost</span>
             <div id="rationname" class="navbar-text"><a href="main">定额库</a><i class="fa fa-angle-right fa-fw"></i>XXX定额库</div>
-        </nav>
+        </nav>-->
         <nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0">
               <ul class="nav nav-tabs" role="tablist">
                   <li class="nav-item">
@@ -43,7 +44,7 @@
         </nav>
     </div>
     <div class="main">
-        <div class="content">
+        <div class="content" style="margin-left: 0px;">
             <div class="container-fluid">
                 <div class="row">
                     <div class="main-side col-lg-3 p-0" style="width: 100%; height: 100%; overflow-y: auto">
@@ -214,12 +215,12 @@
         </div>
     </div>
     <!-- JS. -->
+    <script src="/lib/jquery/jquery-3.2.1.min.js"></script>
     <script src = "/lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
     <script type="text/javascript" src="/lib/ztree/jquery.ztree.core.js"></script>
     <script type="text/javascript" src="/lib/ztree/jquery.ztree.excheck.js"></script>
     <script type="text/javascript" src="/lib/ztree/jquery.ztree.exedit.js"></script>
     <!--inject:js-->
-    <script src="/lib/jquery/jquery-3.2.1.min.js"></script>
     <script type="text/javascript" src="/lib/popper/popper.min.js"></script>
     <script src="/lib/bootstrap/bootstrap.min.js"></script>
     <script type="text/javascript" src="/web/building_saas/complementary_ration_lib/js/global.js"></script>

+ 2 - 3
web/building_saas/complementary_ration_lib/js/coe.js

@@ -22,9 +22,8 @@ var pageObj = {
         var libID = getQueryString("repository");
         var libName = storageUtil.getSessionCache("RationGrp","repositoryID_" + libID);
         if (libName) {
-            var html = $("#rationname")[0].outerHTML;
-            html = html.replace("XXX定额库", libName);
-            $("#rationname")[0].outerHTML = html;
+            let $rationName = $(`<div id='rationname' class='navbar-text'>${libName}</div>`);
+            $('.header-logo').after($rationName);
         };
         this.gljLibID = storageUtil.getSessionCache("gljLib", "repositoryID_" + libID);
         this.libID = libID;

+ 4 - 5
web/building_saas/complementary_ration_lib/js/installation.js

@@ -2,11 +2,11 @@
  * Created by Zhong on 2018/1/19.
  **/
 $("#gongliao").click(function(){
-    $(this).attr('href', "/complementaryRation/lmm" + "?repository=" + getQueryString("repository"))
+    $(this).attr('href', "/complementaryRation/glj" + "?repository=" + getQueryString("repository"))
 });
 
 $("#fuzhu").click(function(){
-    $(this).attr('href', "/complementaryRation/coeList" + "?repository=" + getQueryString("repository"))
+    $(this).attr('href', "/complementaryRation/coe" + "?repository=" + getQueryString("repository"))
 });
 
 $("#dinge").click(function(){
@@ -58,9 +58,8 @@ let feeItemObj = {
             this.rationRepId = parseInt(getQueryString("repository"));
             let libName = storageUtil.getSessionCache("RationGrp","repositoryID_" + this.rationRepId);
             if (libName) {
-                let html = $("#rationname")[0].outerHTML;
-                html = html.replace("XXX定额库", libName);
-                $("#rationname")[0].outerHTML = html;
+                let $rationName = $(`<div id='rationname' class='navbar-text'>${libName}</div>`);
+                $('.header-logo').after($rationName);
             }
             //init sectionSpread
             se.buildSheet();

+ 2 - 3
web/building_saas/complementary_ration_lib/js/repository_glj.js

@@ -22,10 +22,9 @@ var pageOprObj = {
             rationLibName = storageUtil.getSessionCache("RationGrp","repositoryID_" + rationLibId);
         me.rationLibId = rationLibId;
         if (rationLibName) {
-            var html = $("#rationname")[0].outerHTML;
-            html = html.replace("XXX定额库", rationLibName);
-            $("#rationname")[0].outerHTML = html;
             me.rationLibName = rationLibName;
+            let $rationName = $(`<div id='rationname' class='navbar-text'>${me.rationLibName}</div>`);
+            $('.header-logo').after($rationName);
             repositoryGljObj.buildSheet(container);
             //repositoryGljObj.getRationGljIds(rationLibId);
             repositoryGljObj.getGljDistType(function () {

+ 31 - 4
web/building_saas/complementary_ration_lib/js/section_tree.js

@@ -10,10 +10,10 @@ let pageOprObj = {
         me.getRationLibInfo(rationLibId, function (rstData) {
             if(rstData.length > 0){
                 me.rationLibName = rstData[0].dispName;
+                //let $rationName = $(`<div id='rationname' class='navbar-text'><a id='rationLibBtn' href='javascript:void(0);'>定额库</a><i class='fa fa-angle-right fa-fw'></i>${me.rationLibName}</div>`);
+                let $rationName = $(`<div id='rationname' class='navbar-text'>${me.rationLibName}</div>`);
+                $('.header-logo').after($rationName);
                 me.gljLibId = rstData[0].gljLib;
-                let html = $("#rationname")[0].outerHTML;
-                html = html.replace("XXX定额库", me.rationLibName);
-                $("#rationname")[0].outerHTML = html;
                 me.rationLibId = rationLibId;
                 sectionTreeObj.getSectionTree(rationLibId);
                 //job
@@ -31,7 +31,34 @@ let pageOprObj = {
     },
     getRationLibInfo: function (rationLibId, callback) {
         CommonAjax.post('api/getRationLib', {rationRepId: rationLibId}, callback);
-    }
+    },
+    //获取定额库列表
+    /*getRationLibs: function () {
+        let scFunc = function (rstData) {
+            $("#comple_ration_table").empty();
+            for(let i = 0; i < rstData.length; i++){
+                storageUtil.setSessionCache("RationGrp","repositoryID_" + rstData[i].ID, rstData[i].dispName);
+                if(rstData[i].gljLib !== undefined && rstData[i].gljLib && rstData[i].gljLib != -1){
+                    storageUtil.setSessionCache("gljLib","repositoryID_" + rstData[i].ID, rstData[i].gljLib);
+                    let id = rstData[i].ID;
+                    let libName = rstData[i].dispName;
+                    $("#comple_ration_table").append(
+                        "<tr id='tempId'>" +
+                        "<td><a href='/stdGljRepository/glj'>"+libName+"</a></td></tr>"
+                    );
+                    var newHref = "/complementaryRation/ration?repository="+id;
+                    $("#tempId td:first a").attr("href", newHref);
+                    $("#tempId").attr("id", id);
+                }
+            }
+        };
+        let ration_lib = projectInfoObj.projectInfo.engineeringInfo.ration_lib;
+        let ids = [];
+        for(lib of ration_lib){
+            ids.push(parseInt(lib.id));
+        }
+        CommonAjax.post('/complementaryRation/api/getRationLibs', {user_id: userID, ids: ids}, scFunc);
+    }*/
 };
 
 let sectionTreeObj = {

+ 27 - 18
web/building_saas/glj/js/project_glj_spread.js

@@ -18,6 +18,7 @@ function ProjectGLJSpread() {
     this.firstMixRatioRow = -1;
     this.successCallback = null;
     this.supplyType = ['自行采购', '部分甲供', '完全甲供', '甲定乙供'];
+    this.supplyComboMap = [{text:"自行采购",value:0},{text:"完全甲供",value:2},{text:"部分甲供",value:1},{text:"甲定乙供",value:3}];//后来调整了下拉选项的顺序,为了不改之前的业务逻辑,这里的值对换了一下
     // 工料机类型是混凝土、砂浆、配合比、机械(不包括机械组成物)时,供货方式列只读。
     this.supplyReadonlyType = notEditType;
 }
@@ -30,26 +31,23 @@ function ProjectGLJSpread() {
 ProjectGLJSpread.prototype.init = function () {
     // 供货方式类型
     let supplySelect = [];
-    for(let index in this.supplyType) {
+    for(let comM of this.supplyComboMap) {
         supplySelect.push({
-            text: this.supplyType[index],
-            value: index
+            text: comM.text,
+            value: comM.value
         });
     }
     let selectBox = new GC.Spread.Sheets.CellTypes.ComboBox();
     selectBox.items(supplySelect);
-    selectBox.editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.text);
+    selectBox.editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.value);
     let header = [
         {name: '编码', field: 'code', visible: true,width:80},
         {name: '名称', field: 'name', visible: true,width:160},
         {name: '规格型号', field: 'specs', visible: true,width:120},
         {name: '单位', field: 'unit', visible: true,width:45},
         {name: '类型', field: 'short_name', visible: true,width:45},
-        {name: 'ID', field: 'id', visible: false},
         {name: '类型', field: 'unit_price.type', visible: false},
         {name: '总消耗量', field: 'quantity', visible: true,width:100,decimalField:'glj.quantity'},
-        {name: '分部分项总消耗量', field: 'subdivisionQuantity', visible: true,width:100,decimalField:'glj.quantity'},
-        {name: '技术措施项目总消耗量', field: 'techQuantity', visible: true,width:100,decimalField:'glj.quantity'},
         {name: '定额价', field: "base_price", visible: true,width:70,decimalField:"glj.unitPrice",validator: 'number'},//这里feiedID设置是为了在计不计取价差的时候做显示用
         {name: '调整价', field: 'adjust_price', visible: true,width:70,decimalField:"glj.unitPrice"},
         {name: '市场价', field: "unit_price.market_price", visible: true, validator: 'number',width:70,decimalField:"glj.unitPrice"},
@@ -78,6 +76,9 @@ ProjectGLJSpread.prototype.init = function () {
         {name: '组成物消耗量', field: 'consumption', visible: false},
         {name: '父级关联编码', field: 'connect_code', visible: false},
         {name: '组成物信息', field: 'ratio_data', visible: false},
+        {name: '分部分项总消耗量', field: 'subdivisionQuantity', visible: false,width:100,decimalField:'glj.quantity'},
+        {name: '技术措施项目总消耗量', field: 'techQuantity', visible: false,width:100,decimalField:'glj.quantity'},
+        {name: 'ID', field: 'id', visible: false}
     ];
     let sourceData = jsonData;
 
@@ -95,7 +96,13 @@ ProjectGLJSpread.prototype.init = function () {
     let supplyColumn = this.sheetObj.getFieldColumn('supply');
     let shortNameColumn = this.sheetObj.getFieldColumn('unit_price.short_name');
     let supplyQuantity = this.sheetObj.getFieldColumn('supply_quantity');
+    let nameColumn = this.sheetObj.getFieldColumn('name');
+    let specsColumn = this.sheetObj.getFieldColumn('specs');
 
+    //左对齐样式
+    let leftStyleSetting = {hAlign: GC.Spread.Sheets.HorizontalAlign.left};
+    this.sheetObj.setStyle(-1, nameColumn, leftStyleSetting);
+    this.sheetObj.setStyle(-1, specsColumn, leftStyleSetting);
 
     // 居中样式
     let centerStyleSetting = {hAlign: 1};
@@ -214,7 +221,7 @@ ProjectGLJSpread.prototype.updateProjectGLJField = function(info, callback) {
 
     // 如果是供货方式则需要处理数据
     if (field === 'supply') {
-        value = this.supplyType.indexOf(value);
+        // value = this.supplyType.indexOf(value);
         extend.supply_quantity = this.getSupplyQuantity(value, activeSheet, info);
     }
     if(field === 'supply_quantity'){//修改数量需做4舍5入
@@ -305,17 +312,17 @@ ProjectGLJSpread.prototype.specialColumn = function (sourceData) {
             activeSheet.getCell(rowCounter, isEvaluateColumn, GC.Spread.Sheets.SheetArea.viewport).locked(false);
             activeSheet.setValue(rowCounter, isEvaluateColumn, data.is_evaluate);
         }
-        // 设置供货方式列是否可选
+       /* // 设置供货方式列是否可选
         if (this.supplyReadonlyType.indexOf(data.unit_price.type) >= 0) {
             // 锁定该单元格
             activeSheet.getCell(rowCounter, supplyColumn,  GC.Spread.Sheets.SheetArea.viewport).locked(true);
-        }
+        }*/
         // 如果为部分甲供则甲供数量需要可编辑
-        if (data.supply === 1) {
+        if (data.supply == 1) {
             activeSheet.getCell(rowCounter, supplyQuantity,  GC.Spread.Sheets.SheetArea.viewport).locked(false);
         }
         //供货方式为完全甲供时设置甲供数量为总消耗量
-        if (data.supply === 2) {
+        if (data.supply == 2) {
             activeSheet.setValue(rowCounter, supplyQuantity,  data.quantity);
         }
         // 供货方式数据
@@ -323,6 +330,7 @@ ProjectGLJSpread.prototype.specialColumn = function (sourceData) {
         supplyIndex = isNaN(supplyIndex) ? 0 : supplyIndex;
         let supplyText = this.supplyType[supplyIndex] !== undefined ? this.supplyType[supplyIndex] : '自行采购';
         activeSheet.setValue(rowCounter, supplyColumn, supplyText);
+        // activeSheet.setValue(rowCounter, supplyColumn, supplyIndex);
 
         // 如果类型为混凝土、砂浆、配合比、机械,则市场单价和供货方式不能修改
         if (canNotChangeTypeId.indexOf(data.unit_price.type) >= 0) {
@@ -331,11 +339,11 @@ ProjectGLJSpread.prototype.specialColumn = function (sourceData) {
             this.firstMachineRow = this.firstMachineRow === -1 && data.unit_price.type === GLJTypeConst.GENERAL_MACHINE ?
                 rowCounter : this.firstMachineRow;
             // 锁定该单元格
-            if (data.ratio_data  && data.ratio_data.length > 0){//有组成物时,市场单价、定额价不可修改
+            if (data.ratio_data  && data.ratio_data.length > 0){//有组成物时,市场单价、定额价、供货方式不能修改
                 activeSheet.getCell(rowCounter, marketPriceColumn,  GC.Spread.Sheets.SheetArea.viewport).locked(true);
                 activeSheet.getCell(rowCounter, basePriceColumn, GC.Spread.Sheets.SheetArea.viewport).locked(true);
+                activeSheet.getCell(rowCounter, supplyColumn,  GC.Spread.Sheets.SheetArea.viewport).locked(true);
             }
-            activeSheet.getCell(rowCounter, supplyColumn,  GC.Spread.Sheets.SheetArea.viewport).locked(true);
         }
         if(data.unit_price.is_add!=1){//如果不是新增,定额价不可修改。
             activeSheet.getCell(rowCounter, basePriceColumn, GC.Spread.Sheets.SheetArea.viewport).locked(true);
@@ -474,13 +482,14 @@ ProjectGLJSpread.prototype.priceCalculate = function(info) {
  * @return {void}
  */
 ProjectGLJSpread.prototype.changeSupplyType = function(info) {
-    let supply = info.newValue;
-    let supplyNumber = this.supplyType.indexOf(supply) > -1 ? this.supplyType.indexOf(supply) : 0;
+    // let supply = info.newValue;
+    // let supplyNumber = this.supplyType.indexOf(supply) > -1 ? this.supplyType.indexOf(supply) : 0;
+    let supplyNumber = info.newValue;
     let supplyQuantityColumn = this.sheetObj.getFieldColumn('supply_quantity');
     let activeSheet = this.sheetObj.getSheet();
 
     // 部分甲供时可更改甲供数量数据,其余则只读
-    let locked = supplyNumber === 1 ? false : true;
+    let locked = supplyNumber == 1 ? false : true;
     activeSheet.getCell(info.row, supplyQuantityColumn,  GC.Spread.Sheets.SheetArea.viewport).locked(locked);
 
     let supplyQuantity = this.getSupplyQuantity(supplyNumber, activeSheet, info);
@@ -500,7 +509,7 @@ ProjectGLJSpread.prototype.getSupplyQuantity = function(supplyType, activeSheet,
     // 获取总消耗量
     let quantity = activeSheet.getValue(info.row, quantityColumn);
     // 自行采购和甲定乙供则把甲供数量设置为0,其余情况则设置为当前总消耗量
-    let supplyQuantity = supplyType === 0 || supplyType === 3 ? 0 : quantity;
+    let supplyQuantity = supplyType == 0 || supplyType == 3 ? 0 : quantity;
     supplyQuantity = parseFloat(supplyQuantity);
 
     return supplyQuantity;

+ 63 - 14
web/building_saas/main/html/main.html

@@ -622,7 +622,7 @@
     </div>-->
     <div class="modal fade" id="glj_tree_div" data-backdrop="static">
         <div class="modal-dialog modal-lg" role="document" id="modalCon">
-            <div class="modal-content" style="width: 910px;">
+            <div class="modal-content" style="width: 1020px;">
                 <div class="modal-header">
                     <h5 class="modal-title">请选择工料机</h5>
                     <button type="button" class="close" data-dismiss="modal" aria-label="Close">
@@ -643,9 +643,17 @@
                         <div style="width:67%; padding-left: 8px; float: left;">
                             <div class="row">
                                 <div class="col-12" id="gljRadios">
-                                    <input type="radio" class="glj-radio" name="glj" value="allGljs" checked>所有工料机&nbsp;&nbsp;
-                                    <input type="radio" class="glj-radio" name="glj" value="stdGLJ">标准工料机&nbsp;&nbsp;
-                                    <input type="radio" class="glj-radio" name="glj" value="complementaryGLJs">补充工料机&nbsp;&nbsp;
+                                    <div class="row">
+                                        <div class="col-7" style="margin-top: 5px;">
+                                            <input type="radio" class="glj-radio" name="glj" value="allGljs" checked>所有工料机&nbsp;&nbsp;
+                                            <input type="radio" class="glj-radio" name="glj" value="stdGLJ">标准工料机&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">
+                                            <!--  <span class="input-group-btn"><button class="btn btn-secondary btn-sm" type="button" id="gljSearch"><i class="fa fa-search" aria-hidden="true"></i></button></span>-->
+                                        </div>
+                                    </div>
                                     <!-- <div class="form-group"><input id="searchGlj" type="text" class="form-control-sm" placeholder="查询工料机"></div>-->
                                 </div>
                                 <div class="modal-auto-height col-12" style="overflow: hidden" id="gljLibSheet">
@@ -753,10 +761,10 @@
                                     <a id="cb_QTXM" href="javascript:void(0)">其他项目</a>
                                 </li>
                                 <li class="py-1" style="margin-left: 50px;">
-                                    <a id="cb_FBF" href="javascript:void(0)">分包费</a>
+                                    <a id="cb_RCJ" href="javascript:void(0)">人材机</a>
                                 </li>
                                 <li class="py-1" style="margin-left: 50px;">
-                                    <a id="cb_RCJ" href="javascript:void(0)">人材机</a>
+                                    <a id="cb_FBF" href="javascript:void(0)">分包费</a>
                                 </li>
                                 <li class="py-1" style="margin-left: 50px;">
                                     <a id="cb_GF" href="javascript:void(0)">规费</a>
@@ -814,7 +822,9 @@
                 </div>
                 <div class="modal-body">
                     <div class="form-group">
-                        <label id="delete_showinfo">确认要删除当前选中行吗?</label>
+                        <div id="delete_showinfo">
+                            <label>确认要删除当前选中行吗?</label>
+                        </div>
                     </div>
                 </div>
                 <div class="modal-footer" style="justify-content: center">
@@ -844,7 +854,7 @@
                         </label>
                     </div>
                     <div class="form-check">
-                        <input class="form-check-input zlfb-check" type="checkbox" id="bill_second" >
+                        <input class="form-check-input zlfb-check" type="checkbox" checked id="bill_second" >
                         <label class="form-check-label">
                             需要章分部标题
                         </label>
@@ -882,7 +892,7 @@
                                 勾选“需要节分部标题”,表示分部整理时需要添加节标题;</br>
                                 勾选“删除自定义分部标题”,将首先删除已有自定义分部标题,然后再执行分部整理;</br>
                                 勾选“清单排序”,表示分部整理后对每个分部下的清单进行排序;</br>
-                                勾选“清单重新编码”,表示分部整理后对每个分部下的清单重新生成流号;
+                                勾选“清单重新编码”,表示分部整理后对每个分部下的清单重新生成流号;
                             </p>
                         </div>
                     </div>
@@ -906,7 +916,7 @@
                     </button>
                 </div>
                 <div class="modal-body">
-                    <div class="row" style="height:300px"><!--sjs id设置在这个div-->
+                    <div class="row" style="height:250px"><!--sjs id设置在这个div-->
                         <div class=" col-8" style="overflow: hidden" id="feeItemSheet">
                         </div>
                         <div class=" col-4" style="overflow: hidden" id="install_setting">
@@ -945,7 +955,7 @@
     </div>
 
     <!--弹出 指定具体位置(计取安装费用)-->
-    <div class="modal fade" id="calc_position" data-backdrop="static">
+    <div class="modal fade" id="calc_position" data-backdrop="static" style="z-index: 1060">
         <input type="hidden" id ='calc_position_from'>
         <div class="modal-dialog modal-lg"  role="document">
             <div class="modal-content">
@@ -988,6 +998,7 @@
                     <button type="button" class="close" data-dismiss="modal" aria-label="Close" id="more_feeRule_close">
                         <span aria-hidden="true">&times;</span>
                     </button>
+                    <input type="hidden" id="more_from">
                 </div>
                 <div class="modal-body">
                     <div class="modal-fixed-height" id="moreFeeRuleSpread"><!--sjs ID设置此div--->
@@ -1001,6 +1012,27 @@
         </div>
     </div>
 
+    <!--弹出 修改费用规则-->
+    <div class="modal fade" id="modify_feeRule" data-backdrop="static">
+        <div class="modal-dialog " style="max-width: 950px" role="document">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h5 class="modal-title">修改费用规则</h5>
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close" id="modify_feeRule_close">
+                        <span aria-hidden="true">&times;</span>
+                    </button>
+                </div>
+                <div class="modal-body">
+                    <div style="height: 100px" id="modifyFeeRuleSpread"><!--sjs ID设置此div--->
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-secondary" id="modify_feeRule_concel" data-dismiss="modal">取消</button>
+                    <button class="btn btn-primary" id="modify_feeRule_confirm">确定</button>
+                </div>
+            </div>
+        </div>
+    </div>
         <!-- JS. -->
         <script type="text/javascript" src="/lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
 
@@ -1011,9 +1043,6 @@
         <script src="/lib/spreadjs/views/plugins/gc.spread.views.gridlayout.10.0.0.min.js" type="text/javascript"></script>
         <script>GC.Spread.Sheets.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</script>
         <script>GC.Spread.Views.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</script>
-
-
-
         <!-- inject:js -->
         <!--<script type="text/javascript" src="/test/tmp_data/test_ration_calc/ration_calc_base.js"></script>-->
         <script type="text/javascript" src="/web/building_saas/main/js/models/main_consts.js"></script>
@@ -1069,6 +1098,7 @@
         <script type="text/javascript" src="/web/building_saas/main/js/models/ration_glj.js"></script>
         <script type="text/javascript" src="/web/building_saas/main/js/models/ration_coe.js"></script>
         <script type="text/javascript" src="/web/building_saas/main/js/models/ration_ass.js"></script>
+        <script type="text/javascript" src="/web/building_saas/main/js/models/ration_installation.js"></script>
         <!--<script type="text/javascript" src="/web/building_saas/main/js/models/volume_price.js"></script>-->
         <script type="text/javascript" src="/web/building_saas/main/js/models/labour_coe.js"></script>
         <script type="text/javascript" src="/web/building_saas/main/js/models/calc_program.js"></script>
@@ -1178,9 +1208,28 @@
 //                count();
 //            }
 
+
             $(document).ready(function(){
                 //createTree();
 
+
+
+              /*  document.onkeydown=keydown;
+                function keydown(e){
+                   alert('aa');
+                   e.preventDefault();
+                   e.stopPropagation()
+
+                }*/
+
+              /*  $(document).keypress(function(e) {
+                    var code = (e.keyCode ? e.keyCode : e.which);
+                    if (code == 40) {
+                        alert("down pressed");
+                    } else if (code == 38) {
+                        alert("up pressed");
+                    }
+                });*/
                 /*            $("#tab_calc_program").click(function(){
                  location.href = '/web/building_saas/main/html/calc_program.html';
                  });*/

+ 40 - 10
web/building_saas/main/js/models/bills.js

@@ -261,7 +261,19 @@ var Bills = {
                         }
                         newParent=node.preSibling;
                     }else {//没有前兄弟,则子项升一级
-                        let parent = node.nextSibling.parent;
+                        let parent = node.parent;
+                        for(let i=0;i<node.children.length;i++){
+                            updateData[node.children[i].data.ID]={
+                                ParentID:parent.data.ID
+                            };
+                            updateNode[node.children[i].data.ID]=node.children[i];
+                            if(node.nextSibling&&i == node.children.length-1){//最后一个子项,在有后兄弟的情况下,作为后兄弟的前兄弟
+                                updateData[node.children[i].data.ID].NextSiblingID = node.nextSibling.data.ID;
+                            }
+                        }
+
+
+               /*         let parent = node.nextSibling.parent;
                         for(let i=0;i<node.children.length;i++){
                             if(i == node.children.length-1&&node.nextSibling){//最后一个子项,在有后兄弟的情况下,作为后兄弟的前兄弟
                                 updateData[node.children[i].data.ID]={
@@ -274,7 +286,7 @@ var Bills = {
                                 };
                             }
                             updateNode[node.children[i].data.ID]=node.children[i];
-                        }
+                        }*/
                         newParent=parent;
                     }
                 }
@@ -399,11 +411,11 @@ var Bills = {
                 // 说明(补注)
                 node.data.comments = stdBillsData.recharge;
                 // 工作内容
-                node.data.jobContent = stdBillsData.jobContent;
-                node.data.jobContentText = stdBillsData.jobContentText;
+               /* node.data.jobContent = stdBillsData.jobContent;
+                node.data.jobContentText = stdBillsData.jobContentText;*/
                 // 特征
-                node.data.itemCharacter = stdBillsData.itemCharacter;
-                node.data.itemCharacterText = stdBillsData.itemCharacterText;
+               /* node.data.itemCharacter = stdBillsData.itemCharacter;
+                node.data.itemCharacterText = stdBillsData.itemCharacterText;*/
                 node.data.programID = stdBillsData.engineering;
                 node.data.billsLibId = stdBillsData.billsLibId;
             }
@@ -472,7 +484,7 @@ var Bills = {
                 return node;
             }
         };
-        bills.prototype.isFBFX = function (node) {//判读是否属于分部分项
+        bills.prototype.isFBFX = function (node) {//判读是否属于分部分项部分
            let rootNode = this.getRootNode(node);
             if(isFlag(rootNode.data)&&rootNode.data.flagsIndex.fixed.flag==fixedFlag.SUB_ENGINERRING){
                 return true;
@@ -480,6 +492,21 @@ var Bills = {
                 return false;
             }
         };
+        bills.prototype.isTechMeasure = function (node) {//判读是否属于技术措施项目部分
+            let techMeasureCheck = function (checkNode) {
+                if(isFlag(checkNode.data)&&checkNode.data.flagsIndex.fixed.flag==fixedFlag.CONSTRUCTION_TECH){
+                    return true;
+                }else {
+                    if(checkNode.parent){
+                        return techMeasureCheck(checkNode.parent);
+                    }else {
+                        return false;
+                    }
+                }
+            }
+            return techMeasureCheck(node);
+        };
+
         bills.prototype.isEngineeringCost = function (node) {//判断这个节点是否是工程造价节点
             if(isFlag(node.data)&&node.data.flagsIndex.fixed.flag==fixedFlag.ENGINEERINGCOST){
                 return true;
@@ -615,6 +642,7 @@ var Bills = {
                 let ration_datas = project.Ration.datas;
                 let ration_glj_datas = project.ration_glj.datas;
                 let ration_coe_datas = project.ration_coe.datas;
+                let ration_install_datas = project.ration_installation.datas;
                 let nodes = controller.tree.nodes;
                 let prefix = controller.tree.prefix;
                 //更新缓存
@@ -636,13 +664,15 @@ var Bills = {
                         _.remove(quantity_detail_datas,{'rationID':r_key});
                         _.remove(ration_glj_datas,{'rationID':r_key});
                         _.remove(ration_coe_datas,{'rationID':r_key});
+                        _.remove(ration_install_datas,{'rationID':r_key});
                     }
                 }
                 controller.m_delete(mainNodes);//删除树节点
                 me.tree.m_delete(idTreeNodes);
                 //重新计算
-                project.calcProgram.calcBillsAndSave(parentNodes);
-                $.bootstrapLoading.end();
+                project.calcProgram.calcBillsAndSave(parentNodes,function () {
+                    project.projectGLJ.loadData();
+                });
             }, function () {
                 $.bootstrapLoading.end();
             });
@@ -665,7 +695,7 @@ var Bills = {
                 }
             }
         };
-        bills.prototype.deleteAllFBNodes = function(){
+        bills.prototype.deleteAllSubNodes = function(){
             let controller = projectObj.mainController, project = projectObj.project;
             let Bill = project.Bills;
             let FBFX = Bill.getFBFXNode(controller);//取分部分项工程节点;

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

@@ -428,6 +428,7 @@ var cacheTree = {
                             node.parent.addChild(oc);
                         }
                     }else {//都没有的情况
+                         node.parent.children = [];//删除本身节点
                         for(let c of node.children){
                             node.parent.addChild(c);
                         }

+ 36 - 36
web/building_saas/main/js/models/calc_base.js

@@ -507,7 +507,7 @@ let baseFigureTemplate = {
         return projectObj.project.calcProgram.getBeforeTaxTotalFee([node]);
     },
     'RCJJC': function () {//人材机价差
-        return (this['RGJC']() + this['CLJC']() + this['JXJC']()).toDecimal(2);
+        return (this['RGJC']() + this['CLJC']() + this['JXJC']()).toDecimal(decimalObj.bills.totalPrice);
     },
     'RGJC': function () {//人工价差
         let rst = 0;
@@ -518,7 +518,7 @@ let baseFigureTemplate = {
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
                 let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
-                rst = (rst + parseFloat(glj.quantity * dffPrc).toDecimal(2)).toDecimal(2);
+                rst = (rst + parseFloat(glj.quantity * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
@@ -532,7 +532,7 @@ let baseFigureTemplate = {
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
                 let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
-                rst = (rst + parseFloat(glj.quantity * dffPrc).toDecimal(2)).toDecimal(2);
+                rst = (rst + parseFloat(glj.quantity * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
@@ -546,13 +546,13 @@ let baseFigureTemplate = {
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
                 let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
-                rst = (rst + parseFloat(glj.quantity * dffPrc).toDecimal(2)).toDecimal(2);
+                rst = (rst + parseFloat(glj.quantity * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
     },
     'FBFXRCJJC': function () {//分部分项人材机价差
-        return (this['FBFXRGJC']() + this['FBFXCLJC']() + this['FBFXJXJC']()).toDecimal(2);
+        return (this['FBFXRGJC']() + this['FBFXCLJC']() + this['FBFXJXJC']()).toDecimal(decimalObj.bills.totalPrice);
     },
     'FBFXRGJC': function () {//分部分项人工价差
         let rst = 0;
@@ -563,7 +563,7 @@ let baseFigureTemplate = {
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
                 let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
-                rst = (rst + parseFloat(glj.subdivisionQuantity * dffPrc).toDecimal(2)).toDecimal(2);
+                rst = (rst + parseFloat(glj.subdivisionQuantity * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
@@ -577,7 +577,7 @@ let baseFigureTemplate = {
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
                 let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
-                rst = (rst + parseFloat(glj.subdivisionQuantity * dffPrc).toDecimal(2)).toDecimal(2);
+                rst = (rst + parseFloat(glj.subdivisionQuantity * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
@@ -591,13 +591,13 @@ let baseFigureTemplate = {
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
                 let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
-                rst = (rst + parseFloat(glj.subdivisionQuantity * dffPrc).toDecimal(2)).toDecimal(2);
+                rst = (rst + parseFloat(glj.subdivisionQuantity * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
     },
     'JSCSXMRCJJC': function () {//技术措施项目人材机价差
-        return (this['JSCSXMRGJC']() + this['JSCSXMCLJC']() + this['JSCSXMJXJC']()).toDecimal(2);
+        return (this['JSCSXMRGJC']() + this['JSCSXMCLJC']() + this['JSCSXMJXJC']()).toDecimal(decimalObj.bills.totalPrice);
     },
     'JSCSXMRGJC': function () {//技术措施项目人工价差
         let rst = 0;
@@ -608,7 +608,7 @@ let baseFigureTemplate = {
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
                 let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
-                rst = (rst + parseFloat(glj.techQuantity * dffPrc).toDecimal(2)).toDecimal(2);
+                rst = (rst + parseFloat(glj.techQuantity * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
@@ -622,7 +622,7 @@ let baseFigureTemplate = {
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
                 let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
-                rst = (rst + parseFloat(glj.techQuantity * dffPrc).toDecimal(2)).toDecimal(2);
+                rst = (rst + parseFloat(glj.techQuantity * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
@@ -636,7 +636,7 @@ let baseFigureTemplate = {
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
                 let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
-                rst = (rst + parseFloat(glj.techQuantity * dffPrc).toDecimal(2)).toDecimal(2);
+                rst = (rst + parseFloat(glj.techQuantity * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
@@ -646,7 +646,7 @@ let baseFigureTemplate = {
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
             if(glj.type === gljType.LABOUR){
-                rst = (rst + parseFloat(glj.supply_quantity * glj.basePrice).toDecimal(2)).toDecimal(2);
+                rst = (rst + parseFloat(glj.supply_quantity * glj.unit_price.base_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
@@ -656,7 +656,7 @@ let baseFigureTemplate = {
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
             if(baseMaterialTypes.includes(glj.type) && glj.ratio_data.length === 0){
-                rst = (rst + parseFloat(glj.supply_quantity * glj.basePrice).toDecimal(2)).toDecimal(2);
+                rst = (rst + parseFloat(glj.supply_quantity * glj.unit_price.base_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
@@ -666,7 +666,7 @@ let baseFigureTemplate = {
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
             if(baseMachineTypes.includes(glj.type) && glj.ratio_data.length === 0){
-                rst = (rst + parseFloat(glj.supply_quantity * glj.basePrice).toDecimal(2)).toDecimal(2);
+                rst = (rst + parseFloat(glj.supply_quantity * glj.unit_price.base_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
@@ -676,7 +676,7 @@ let baseFigureTemplate = {
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
             if(glj.type === gljType.LABOUR){
-                rst = (rst + parseFloat(glj.supply_quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+                rst = (rst + parseFloat(glj.supply_quantity * glj.unit_price.market_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
@@ -686,7 +686,7 @@ let baseFigureTemplate = {
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
             if(baseMaterialTypes.includes(glj.type) && glj.ratio_data.length === 0){
-                rst = (rst + parseFloat(glj.supply_quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+                rst = (rst + parseFloat(glj.supply_quantity * glj.unit_price.market_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
@@ -696,7 +696,7 @@ let baseFigureTemplate = {
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
             if(baseMachineTypes.includes(glj.type) && glj.ratio_data.length === 0){
-                rst = (rst + parseFloat(glj.supply_quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+                rst = (rst + parseFloat(glj.supply_quantity * glj.unit_price.market_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
@@ -706,7 +706,7 @@ let baseFigureTemplate = {
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
             if(glj.type === gljType.MAIN_MATERIAL && glj.ratio_data.length === 0){
-                rst = (rst + parseFloat(glj.supply_quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+                rst = (rst + parseFloat(glj.supply_quantity * glj.unit_price.market_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
@@ -716,7 +716,7 @@ let baseFigureTemplate = {
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
             if(glj.type === gljType.EQUIPMENT){
-                rst = (rst + parseFloat(glj.supply_quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+                rst = (rst + parseFloat(glj.supply_quantity * glj.unit_price.market_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
@@ -725,8 +725,8 @@ let baseFigureTemplate = {
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
-            if(glj.type === gljType.LABOUR && glj.supply === supplyType.JDYG){
-                rst = (rst + parseFloat(glj.quantity * glj.basePrice).toDecimal(2)).toDecimal(2);
+            if(glj.type === gljType.LABOUR && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
+                rst = (rst + parseFloat(glj.quantity * glj.unit_price.base_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
@@ -735,8 +735,8 @@ let baseFigureTemplate = {
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
-            if(baseMaterialTypes.includes(glj.type) && glj.ratio_data.length === 0 && glj.supply === supplyType.JDYG){
-                rst = (rst + parseFloat(glj.quantity * glj.basePrice).toDecimal(2)).toDecimal(2);
+            if(baseMaterialTypes.includes(glj.type) && glj.ratio_data.length === 0 && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
+                rst = (rst + parseFloat(glj.quantity * glj.unit_price.base_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
@@ -745,8 +745,8 @@ let baseFigureTemplate = {
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
-            if(baseMachineTypes.includes(glj.type) && glj.ratio_data.length === 0 && glj.supply === supplyType.JDYG){
-                rst = (rst + parseFloat(glj.quantity * glj.basePrice).toDecimal(2)).toDecimal(2);
+            if(baseMachineTypes.includes(glj.type) && glj.ratio_data.length === 0 && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
+                rst = (rst + parseFloat(glj.quantity * glj.unit_price.base_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
@@ -755,8 +755,8 @@ let baseFigureTemplate = {
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
-            if(glj.type === gljType.LABOUR && glj.supply === supplyType.JDYG){
-                rst = (rst + parseFloat(glj.quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+            if(glj.type === gljType.LABOUR && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
+                rst = (rst + parseFloat(glj.quantity * glj.unit_price.market_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
@@ -765,8 +765,8 @@ let baseFigureTemplate = {
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
-            if(baseMaterialTypes.includes(glj.type) && glj.ratio_data.length === 0 && glj.supply === supplyType.JDYG){
-                rst = (rst + parseFloat(glj.quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+            if(baseMaterialTypes.includes(glj.type) && glj.ratio_data.length === 0 && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
+                rst = (rst + parseFloat(glj.quantity * glj.unit_price.market_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
@@ -775,8 +775,8 @@ let baseFigureTemplate = {
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
-            if(baseMachineTypes.includes(glj.type) && glj.ratio_data.length === 0 && glj.supply === supplyType.JDYG){
-                rst = (rst + parseFloat(glj.quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+            if(baseMachineTypes.includes(glj.type) && glj.ratio_data.length === 0 && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
+                rst = (rst + parseFloat(glj.quantity * glj.unit_price.market_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
@@ -785,8 +785,8 @@ let baseFigureTemplate = {
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
-            if(glj.type === gljType.MAIN_MATERIAL && glj.supply === supplyType.JDYG){
-                rst = (rst + parseFloat(glj.quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+            if(glj.type === gljType.MAIN_MATERIAL && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
+                rst = (rst + parseFloat(glj.quantity * glj.unit_price.market_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
@@ -795,8 +795,8 @@ let baseFigureTemplate = {
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
-            if(glj.type === gljType.EQUIPMENT && glj.supply === supplyType.JDYG){
-                rst = (rst + parseFloat(glj.quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+            if(glj.type === gljType.EQUIPMENT && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
+                rst = (rst + parseFloat(glj.quantity * glj.unit_price.market_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;

+ 84 - 59
web/building_saas/main/js/models/calc_program.js

@@ -140,6 +140,13 @@ let calcTools = {
             treeNode.data.fees = [];
             treeNode.data.feesIndex = {};
             treeNode.changed = true;
+        }
+        else if (!treeNode.data.feesIndex){
+            treeNode.data.feesIndex = {};
+            for (let fee of treeNode.data.fees){
+                treeNode.data.feesIndex[fee.fieldName] = fee;
+            };
+            treeNode.changed = true;
         };
     },
     initFeeField: function (treeNode, fieldName){
@@ -396,76 +403,73 @@ let calcTools = {
         }
         return result;
     },
-    supplyABFee: function (treeNode, baseName) {
+    partASupplyFee: function (treeNode, baseName) {
         if (!treeNode.data.gljList) return 0;
         let projectGLJ = projectObj.project.projectGLJ;
 
         let supplyT = [];
         if (baseName.includes('甲供'))
-            supplyT = [supplyType.BFJG, supplyType.WQJG]  // 字段中存储的是汉字!
-            // supplyT = ['部分甲供', '完全甲供']
+            supplyT = [supplyType.BFJG, supplyType.WQJG]  // 字段中存储的是汉字、数字混杂!
         else if (baseName.includes('甲定'))
             supplyT = [supplyType.JDYG];
-            // supplyT = ['甲定乙供'];
 
-        let gljT = [], compositionTypesArr = [];
+        let gljT = [], compT = [];
         if (baseName == calcBaseNames.JGDEJJRGF || baseName == calcBaseNames.JDDEJJRGF){
             gljT = [gljType.LABOUR];
         }
         else if (baseName == calcBaseNames.JGDEJJCLF || baseName == calcBaseNames.JDDEJJCLF){
             gljT = baseMaterialTypes;
-            compositionTypesArr = compositionTypes;
+            compT = compositionTypes;
         }
         else if (baseName == calcBaseNames.JGDEJJJXF || baseName == calcBaseNames.JDDEJJJXF){
             gljT = baseMachineTypes;
-            compositionTypesArr = [gljType.GENERAL_MACHINE];
+            compT = [gljType.GENERAL_MACHINE];
         }
         else if (baseName == calcBaseNames.JGZCF || baseName == calcBaseNames.JDZCF){
             gljT = [gljType.MAIN_MATERIAL];
-            compositionTypesArr = [gljType.MAIN_MATERIAL];
+            compT = [gljType.MAIN_MATERIAL];
         }
         else if (baseName == calcBaseNames.JGSBF || baseName == calcBaseNames.JDSBF){
             gljT = [gljType.EQUIPMENT];
         };
-
-        let supplyProjectGLJs = projectGLJ.getGLJsBySupply(supplyT, gljT);
-        if (supplyProjectGLJs.length == 0) return 0;
-
-        let pGLJIdx = {};
-        for (let pglj of supplyProjectGLJs){pGLJIdx[pglj.id] = pglj};
+        // alert(JSON.stringify(projectGLJ.testGLJs()));
+        let supplyGLJs = projectGLJ.getGLJsBySupply(supplyT, gljT);
+        if (supplyGLJs.length == 0) return 0;
+        let supplyGLJsIdx = {};
+        for (let sglj of supplyGLJs){supplyGLJsIdx[sglj.id] = sglj};
+
+        function isSupply(composition, supplies) {
+            for (let supply of supplies){
+                if(supply.code == composition.code && supply.name == composition.name && supply.unit == composition.unit &&
+                    supply.specs == composition.specs && supply.type == composition.type ){
+                    composition.basePrice = supply.unit_price.base_price;
+                    return true;
+                }
+            };
+            return false;
+        };
 
         let sum = 0;
         for (let glj of treeNode.data.gljList){
             // 组成物的母体。母体如果有组成物,则母体无法作为甲供材料,无法设置,此时要看其组成物是否是甲供材料;母体如果没有组成物,则母体有可能成为甲供材料。
-            if (compositionTypesArr.includes(glj.type)) {
-                if (pGLJIdx[glj.projectGLJID]) {  // 组成物的母体是甲供材料
+            if (compT.includes(glj.type)) {
+                if (supplyGLJsIdx[glj.projectGLJID]) {  // 组成物的母体是甲供材料
                     sum = (sum + glj.basePrice * glj.quantity).toDecimal(decimalObj.process);
                 }
                 else{  // 组成物明细
                     let pGLJ = projectGLJ.getDataByID(glj.projectGLJID);
                     let compositions = pGLJ.ratio_data;
                     if (compositions.length > 0){
-                        function isSupply(composition, supplies) {
-                            for (let supply of supplies){
-                                if(supply.code == composition.code && supply.name == composition.name && supply.unit == composition.unit &&
-                                    supply.specs == composition.specs && supply.type == composition.type ){
-                                    composition.basePrice = supply.unit_price.base_price;
-                                    return true;
-                                }
-                            };
-                            return false;
-                        };
-
-                        for (let composition of compositions){
-                            if (isSupply(composition, supplyProjectGLJs)) {
-                                sum = (sum + composition.basePrice * composition.consumption * glj.quantity).toDecimal(decimalObj.process);
+                        for (let c of compositions){
+                            if (isSupply(c, supplyGLJs)) {
+                                sum = (sum + c.basePrice * c.consumption * glj.quantity).toDecimal(decimalObj.process);
                             }
                         };
                     }
                 }
             }
             else {
-                if (pGLJIdx[glj.projectGLJID]) {
+                if (supplyGLJsIdx[glj.projectGLJID]) {
                     sum = (sum + glj.basePrice * glj.quantity).toDecimal(decimalObj.process);
                 }
             };
@@ -628,34 +632,34 @@ const rationCalcBases = {
         return rst.toDecimal(decimalObj.glj.quantity);
     },
     '甲供定额基价人工费': function (node) {
-        return calcTools.supplyABFee(node, calcBaseNames.JGDEJJRGF);
+        return calcTools.partASupplyFee(node, calcBaseNames.JGDEJJRGF);
     },
     '甲供定额基价材料费': function (node) {
-        return calcTools.supplyABFee(node, calcBaseNames.JGDEJJCLF);
+        return calcTools.partASupplyFee(node, calcBaseNames.JGDEJJCLF);
     },
     '甲供定额基价机械费': function (node) {
-        return calcTools.supplyABFee(node, calcBaseNames.JGDEJJJXF);
+        return calcTools.partASupplyFee(node, calcBaseNames.JGDEJJJXF);
     },
     '甲供主材费': function (node) {
-        return calcTools.supplyABFee(node, calcBaseNames.JGZCF);
+        return calcTools.partASupplyFee(node, calcBaseNames.JGZCF);
     },
     '甲供设备费': function (node) {
-        return calcTools.supplyABFee(node, calcBaseNames.JGSBF);
+        return calcTools.partASupplyFee(node, calcBaseNames.JGSBF);
     },
     '甲定定额基价人工费': function (node) {
-        return calcTools.supplyABFee(node, calcBaseNames.JDDEJJRGF);
+        return calcTools.partASupplyFee(node, calcBaseNames.JDDEJJRGF);
     },
     '甲定定额基价材料费': function (node) {
-        return calcTools.supplyABFee(node, calcBaseNames.JDDEJJCLF);
+        return calcTools.partASupplyFee(node, calcBaseNames.JDDEJJCLF);
     },
     '甲定定额基价机械费': function (node) {
-        return calcTools.supplyABFee(node, calcBaseNames.JDDEJJJXF);
+        return calcTools.partASupplyFee(node, calcBaseNames.JDDEJJJXF);
     },
     '甲定主材费': function (node) {
-        return calcTools.supplyABFee(node, calcBaseNames.JDZCF);
+        return calcTools.partASupplyFee(node, calcBaseNames.JDZCF);
     },
     '甲定设备费': function (node) {
-        return calcTools.supplyABFee(node, calcBaseNames.JDSBF);
+        return calcTools.partASupplyFee(node, calcBaseNames.JDSBF);
     },
     '暂估材料费': function (node) {
         return calcTools.estimateFee(node, true);
@@ -1041,14 +1045,14 @@ class CalcProgram {
     };
 
     // 存储、刷新零散的多个结点。
-    saveNodes(treeNodes){
+    saveNodes(treeNodes, callback){
         if (treeNodes.length < 1) {
             $.bootstrapLoading.end();
             return;
         }
 
         let me = this;
-        me.project.beginUpdate('');
+/*        me.project.beginUpdate('');
         for (let node of treeNodes){
             if (node.changed){
                 let data = calcTools.cutNodeForSave(node);
@@ -1056,15 +1060,35 @@ class CalcProgram {
                 me.project.push(node.sourceType, [newData]);
             }
         };
-        me.project.endUpdate();
-
-        for (let node of treeNodes){delete node.changed};
-        projectObj.mainController.refreshTreeNode(treeNodes);
+        me.project.endUpdate();*/
 
-        // 批量树结点计算后,计算程序早已物是人非,所以这里要重新计算一下。
-        if (activeSubSheetIs(subSheetIndex.ssiCalcProgram)) {
-            calcProgramObj.refreshCurNodeCalcItems(me.project.mainTree.selected);
+        let dataArr = [];
+        for (let node of treeNodes){
+            if (node.changed){
+                let data = calcTools.cutNodeForSave(node);
+                let newData = {'type': node.sourceType, 'data': data};
+                dataArr.push(newData);
+            }
+        };
+        if (dataArr.length < 1) {
+            $.bootstrapLoading.end();
+            return;
         };
+
+        me.project.updateNodes(dataArr, function (data) {
+            if(callback){
+                callback(data);
+            };
+
+            for (let node of treeNodes){delete node.changed};
+            projectObj.mainController.refreshTreeNode(treeNodes);
+
+            // 批量树结点计算后,计算程序早已物是人非,所以这里要重新计算一下。
+            if (activeSubSheetIs(subSheetIndex.ssiCalcProgram)) {
+                calcProgramObj.refreshCurNodeCalcItems(me.project.mainTree.selected);
+            };
+            $.bootstrapLoading.end();
+        });
     };
 
     // 只计算treeNode自身。changedArr: 外部传来的一个数组,专门存储发生变动的节点。
@@ -1272,7 +1296,8 @@ class CalcProgram {
             }
             else if (treeNode.calcType == treeNodeCalcType.ctBillCalcProgram) {
                 let rations = me.project.Ration.getBillsSortRation(treeNode.source.getID());
-                treeNode.data.gljList = me.project.ration_glj.getGatherGljArrByRations(rations);
+                let q = calcTools.uiNodeQty(treeNode) ? calcTools.uiNodeQty(treeNode) : 1;
+                treeNode.data.gljList = me.project.ration_glj.getGatherGljArrByRations(rations, q);
 
                 if (treeNode.data.programID == undefined){
                     treeNode.data.programID = projectInfoObj.projectInfo.property.engineering;
@@ -1408,7 +1433,7 @@ class CalcProgram {
     };
 
     // 计算多条零散的定额,并计算他们所属的清单、父级清单,然后打包存储。如:批量替换工料机后受影响的定额。
-    calcRationsAndSave(rationNodes){
+    calcRationsAndSave(rationNodes, callback){
         let me = this, leafBills = [], allChangedNodes = [];
         for (let node of rationNodes) {
             me.innerCalc(node, allChangedNodes);
@@ -1422,30 +1447,30 @@ class CalcProgram {
             mergeArr(allChangedNodes, curChangeds);
         };
 
-        me.saveNodes(allChangedNodes);
+        me.saveNodes(allChangedNodes, callback);
     };
 
     // 计算多条零散的清单,并计算他们的父清单、引用清单,然后打包存储。如:花选删除树结点(如花选清单、定额等,不区分树结点类型)。
-    calcBillsAndSave(billNodes){
+    calcBillsAndSave(billNodes,callback){
         let me = this, allChangedNodes = [];
         for (let node of billNodes) {
             let curChangeds = me.calculate(node, true, false);
             mergeArr(allChangedNodes, curChangeds);
         };
         me.calcFormulaNodes(allChangedNodes);
-        me.saveNodes(allChangedNodes);
+        me.saveNodes(allChangedNodes,callback);
     };
 
     // 计算并保存指定的一个树节点。修改一个树节点,实际上要计算和保存的是一批树结点:层层父结点、被其它结点(的公式)引用的公式结点。
     // 这个方法实际上封装了calculate()和saveNodes()两个方法,主要目的是为了外部调用方便,少写一点累赘代码。
-    calcAndSave(treeNode){
+    calcAndSave(treeNode, callback){
         let changedNodes = this.calculate(treeNode);
-        this.saveNodes(changedNodes);
+        this.saveNodes(changedNodes, callback);
     };
 
-    calcAllNodesAndSave(calcType = calcAllType.catAll){
+    calcAllNodesAndSave(calcType = calcAllType.catAll, callback){
         let changedNodes = this.calcAllNodes(calcType);
-        this.saveNodes(changedNodes);
+        this.saveNodes(changedNodes, callback);
     };
 
     // 排除指定项的综合合价计算(用于带循环计算的情况)

+ 133 - 0
web/building_saas/main/js/models/installation_fee.js

@@ -57,6 +57,139 @@ var installation_fee = {
             let installationFee = this.getInstallationFeeByLibID(libID);
             return _.find(installationFee.feeRule,{'ID':feeRuleID});
         };
+        installation_fee.prototype.updateFeeItem = function(doc,libID,feeItemID,callback){
+            let me = this,ration_install=projectObj.project.ration_installation;
+            let feeItem = me.getFeeItemByID(libID,feeItemID);
+            let temFeeItem = _.cloneDeep(feeItem);//暂时不更新缓存
+            let updateData = [];
+            let rationInstallations = [];
+            for(let d_key in doc){
+                temFeeItem[d_key] = doc[d_key]
+            }
+            updateData.push(me.getFeeItemUpdateData(libID,feeItemID,doc));
+            if(temFeeItem.isCal == 1){//勾选记取的时候要同步更新对应的定额安装费
+                let sections = me.getInstallSectionsByfeeItemID(libID,feeItemID);
+                for (let s of sections){
+                    me.getRIUpdateDataBySectionUpdate(s.ID,s.feeRuleId,rationInstallations);//生成受影响的定额安装增加费并加入到数组中
+                }
+            }
+            $.bootstrapLoading.start();
+            me.submitInstallationUpdate(updateData,rationInstallations,function (data) {
+                //更新缓存
+                for(let d_key in doc){
+                    feeItem[d_key] = doc[d_key]
+                }
+                if(callback){
+                    callback();
+                }
+                $.bootstrapLoading.end();
+            });
+        };
+        installation_fee.prototype.getRIUpdateDataBySectionUpdate = function (sectionID,newRuleID,rationInstallations) {
+            let ration_install=projectObj.project.ration_installation;
+            let ris = ration_install.getBySectionID(sectionID);
+            for(let ri of ris){
+                if(ri.unifiedSetting==1&&ri.ruleId!=newRuleID){//勾选按统一设置并且费率规则选择的不一样
+                    rationInstallations.push({ID:ri.ID,doc:{'ruleId':newRuleID}});
+                }
+            }
+        };
+
+        installation_fee.prototype.updateFeeRule = function (doc,libID,feeRuleID,callback) {
+            let me = this;
+            let itemUpdateData = null;
+            let feeItem=null;
+            let ruleUpdateData=null;
+            let updateData = [];
+            let feeRule = me.getFeeRuleByID(libID,feeRuleID);
+            if(feeRule){
+                if(doc){//如果有需要更新的属性
+                    ruleUpdateData = me.getFeeRuleUpdateData(libID,feeRuleID,doc);
+                    updateData.push(ruleUpdateData);
+                    if(doc.hasOwnProperty("billID")){//改变了选取位置后如果与费用项里的位置不一致的话要清空费用项的选取位置
+                        feeItem = me.getFeeItemByID(libID,feeRule.feeItemId);
+                        if(feeItem.position!=''&&feeItem.billID!=doc.billID){
+                            itemUpdateData = me.getFeeItemUpdateData(libID,feeItem.ID,{position: "", billID:""});
+                            updateData.push(itemUpdateData);
+                        }
+                    }
+                    $.bootstrapLoading.start();
+                    me.submitInstallationUpdate(updateData,null,function (data) {
+                        //更新缓存
+                        let isFeeItemUpdate = false;
+                        if(itemUpdateData){
+                            feeItem.position ="";
+                            feeItem.billID = "";
+                            isFeeItemUpdate= true;
+                        }
+                        for(let ukey in doc){
+                            feeRule[ukey]=doc[ukey];
+                        }
+                        if(callback){//回调
+                            callback(isFeeItemUpdate);
+                        }
+                        $.bootstrapLoading.end();
+                    });
+                }
+            }else {
+                if(callback){
+                    callback(false);
+                }
+            }
+        };
+       installation_fee.prototype.getFeeRuleUpdateData = function (libID,feeRuleID,doc) {
+            let installationFee = this.getInstallationFeeByLibID(libID);
+            let updateData = {
+                ID:installationFee.ID,
+                itemID:feeRuleID,
+                type:"feeRule",
+                doc:doc
+            };
+            return updateData;
+        };
+       installation_fee.prototype.getSectionUpdateData = function (libID,sectionID,doc) {
+           let installationFee = this.getInstallationFeeByLibID(libID);
+           let updateData = {
+               ID:installationFee.ID,
+               itemID:sectionID,
+               type:"installSection",
+               doc:doc
+           };
+           return updateData;
+       };
+       installation_fee.prototype.getFeeItemUpdateData = function (libID,itemID,doc) {
+           let installationFee = this.getInstallationFeeByLibID(libID);
+            let updateData = {
+                ID:installationFee.ID,
+                itemID:itemID,
+                type:'installFeeItem',
+                doc:doc
+            };
+            return updateData;
+        };
+        installation_fee.prototype.submitInstallationUpdate = function (updateData,rationInstallations,callback) {
+            if(updateData){
+                let data = {'projectID':projectInfoObj.projectInfo.ID,'updateData':updateData};
+                if(rationInstallations){//是否附带更新定额安装费
+                    data['rationInstallations'] = rationInstallations;
+                }
+                CommonAjax.post('/installation/updateInstallationFee',data,function (data) {
+                    //更新定额安装费的缓存
+                    if(rationInstallations){
+                        for(let ri of rationInstallations){
+                            let c_ri = project.ration_installation.getByID(ri.ID);
+                            if(c_ri){
+                                for(let rkey in ri.doc){
+                                    c_ri[rkey] = ri.doc[rkey];
+                                }
+                            }
+                        }
+                    }
+                    callback(data);
+                })
+            }
+        };
+
         // 提交数据后返回数据处理
         installation_fee.prototype.doAfterUpdate = function(err, data){
 

+ 12 - 0
web/building_saas/main/js/models/main_consts.js

@@ -10,6 +10,7 @@ const ModuleNames = {
     ration_glj:'ration_glj',
     ration_coe:'ration_coe',
     ration_ass:'ration_ass',
+    ration_installation:'ration_installation',
     quantity_detail:'quantity_detail',
     labour_coe: 'labour_coe',
     calc_program: 'calc_program',
@@ -179,6 +180,17 @@ const supplyType = {
     JDYG: 3
 };
 
+const supplyText = {
+    //自行采购
+    ZXCG: '自行采购',
+    //部分甲供
+    BFJG: '部分甲供',
+    //完全甲供
+    WQJG: '完全甲供',
+    //甲定乙供
+    JDYG: '甲定乙供'
+};
+
 //清单固定行
 const fixedFlag = {
     // 分部分项工程

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

@@ -79,6 +79,7 @@ var PROJECT = {
             this.ration_glj = ration_glj.createNew(this);
             this.ration_coe = ration_coe.createNew(this);
             this.ration_ass = ration_ass.createNew(this);
+            this.ration_installation = ration_installation.createNew(this);
             this.quantity_detail = quantity_detail.createNew(this);
             this.installation_fee = installation_fee.createNew(this);
             this.FeeRate = FeeRate.createNew(this);
@@ -328,6 +329,31 @@ var PROJECT = {
                 });
             }
         };
+        project.prototype.updateNodes = function (datas,callback) {
+          /*  let datas = [
+                {
+                    type:'ration',
+                    data:{
+                        projectID:1605,
+                        ID:"7b962fb0-1131-11e8-b3da-af725dadd7ae",
+                        name:'testRation'
+                    }
+                },
+                {
+                    type:'bills',
+                    data:{
+                        projectID:1605,
+                        ID:"af9f0081-1127-11e8-99a8-2fc02230b6e7",
+                        name:'安全文明施工专项费用123'
+                    }
+                }
+            ]*/
+            CommonAjax.post("/project/updateNodes",datas,function (data) {
+                if(callback){
+                    callback(data);
+                }
+            })
+        };
         /*        project.prototype.setBillsCalcMode = function (calcMode) {
                     this.property.billsCalcMode = calcMode;
                     this.initCalcFields();

+ 32 - 1
web/building_saas/main/js/models/project_glj.js

@@ -70,11 +70,42 @@ ProjectGLJ.prototype.getDataByID = function (ID) {//根据项目工料机ID取
 
 // CSL, 2018-02-08 甲供、甲定。
 ProjectGLJ.prototype.getGLJsBySupply = function (supplyTypeArr, gljTypeArr) {
+    // 项目工料机采用了内部绑定数据源方式,能够双向同步,但同时带来难干预控制问题。supply值存在混杂情况,如:“2”和“部分甲供”同时存在。
+    // 所以这里要合并处理。
+    let mixSupply = [];
+    for (let s of supplyTypeArr){
+        switch (s) {
+            case 1:
+                mixSupply.push('部分甲供');
+                break;
+            case 2:
+                mixSupply.push('完全甲供');
+                break;
+            case 3:
+                mixSupply.push('甲定乙供');
+                break;
+            default:
+                mixSupply.push('自行采购');
+        }
+    };
+    mixSupply = mixSupply.concat(supplyTypeArr);
+
     return _.filter(this.datas.gljList, function (glj) {
-        return supplyTypeArr.includes(glj.supply) && gljTypeArr.includes(glj.type);
+        return mixSupply.includes(glj.supply) && gljTypeArr.includes(glj.type);
     });
 };
 
+ProjectGLJ.prototype.testGLJs = function () {
+    let gljs = [];
+    for (let glj of this.datas.gljList){
+         let o = new Object();
+         o.name = glj.name;
+         o.supply = glj.supply;
+         gljs.push(o);
+    };
+    return gljs;
+};
+
 /**
  * 修改工料机数据
  *

+ 32 - 17
web/building_saas/main/js/models/quantity_detail.js

@@ -454,12 +454,7 @@ var quantity_detail = {
         };
         quantity_detail.prototype.deleteByRation = function(ration){
             var detail_list = this.datas;
-            var newList =_.filter(detail_list,(d)=>{
-                return d.rationID!=ration.ID;
-            });
-            if(newList!=undefined){
-                this.datas = newList;
-            }
+            _.remove(detail_list,{'rationID':ration.ID});
         };
         quantity_detail.prototype.deleteByBills=function(deleteData){
             var detail_list = this.datas;
@@ -527,6 +522,11 @@ var quantity_detail = {
                     }else {//如果表达式是一个计算式,则要加一个括号
                         node.data.quantityEXP = "("+EXPString+") * "+times;
                     }
+                    if(node.data.contain!=0){
+                       let billQuantity = scMathUtil.roundForObj(node.parent.data.quantity,getDecimal("quantity",node.parent));
+                       let temValue = scMathUtil.roundForObj(value*times,getDecimal("quantity",node));
+                        node.data.contain = scMathUtil.roundForObj(temValue/billQuantity,getDecimal("process"));
+                    }
                 }
             }
             return value;
@@ -575,10 +575,19 @@ var quantity_detail = {
             if(node.children.length>0){//如果有子项则
                 for(let rationNode of node.children){
                     let EXPString = rationNode.data.quantityEXP+"";
-                    if(EXPString.indexOf("QDL")!=-1){//如果定额的工程量是通过计算出来的,则应该重新计算。
-                        let tem_contain = scMathUtil.roundForObj(rationNode.data.contain,getDecimal("process"));
-                        let tem_quantity = scMathUtil.roundForObj(value*tem_contain,getDecimal("quantity",rationNode));
-                        rationNode.data.quantity = this.autoTransformQuantity(tem_quantity,rationNode);
+                    if(EXPString.indexOf("QDL")!=-1){
+                        if(EXPString=="QDL"){//定额的工程量是直接通过清单量填进来的;
+                            let times = parseInt(rationNode.data.unit);
+                            if(isNaN(times)){
+                                times = 1;
+                            }
+                            rationNode.data.quantity = scMathUtil.roundForObj(value / times,getDecimal("quantity",rationNode));
+                            rationNode.data.contain = scMathUtil.roundForObj(rationNode.data.quantity/value,getDecimal("process"));
+                        }else {//如果定额的工程量是通过计算出来的,则应该重新计算。
+                            let tem_contain = scMathUtil.roundForObj(rationNode.data.contain,getDecimal("process"));
+                            let tem_quantity = scMathUtil.roundForObj(value*tem_contain,getDecimal("quantity",rationNode)); //this.autoTransformQuantity(tem_quantity,rationNode);
+                            rationNode.data.quantity = tem_quantity;
+                        }
                         rationNode.changed = true;
                         needUpdateChildren.push(rationNode);
                         if (rationNode.children.length>0){//如果有子工料机
@@ -588,7 +597,7 @@ var quantity_detail = {
                         let tem_contain=0;
                         if(value&&value!=0){
                            let children_quantity = scMathUtil.roundForObj(rationNode.data.quantity,getDecimal("quantity"),rationNode);
-                           children_quantity = scMathUtil.roundForObj(this.reverseQuantity(children_quantity,rationNode),getDecimal("quantity",rationNode));
+                            // children_quantity = scMathUtil.roundForObj(this.reverseQuantity(children_quantity,rationNode),getDecimal("quantity",rationNode));  原先是要反算的,现在改成不用反算了
                             tem_contain =scMathUtil.roundForObj(children_quantity/value,getDecimal("process"));
                         }
                         rationNode.data.contain = tem_contain;
@@ -599,10 +608,14 @@ var quantity_detail = {
             }
             if(needUpdateChildren.length>0){
                 node.changed = true;//本身发生了改变,需要存储。
-                project.calcProgram.calcRationsAndSave(needUpdateChildren);
+                project.calcProgram.calcRationsAndSave(needUpdateChildren, function () {
+                    project.projectGLJ.loadData();
+                });
             }else {
                 node.changed = true;
-                project.calcProgram.calcAndSave(node);
+                project.calcProgram.calcAndSave(node, function () {
+                    project.projectGLJ.loadData();
+                });
             }
             if(gljNodes.length>0){
                 projectObj.mainController.refreshTreeNode(gljNodes);
@@ -611,17 +624,19 @@ var quantity_detail = {
         quantity_detail.prototype.updateRationQuantity=function(value,node,quantityEXP,editingText){
             node.data.quantityEXP = quantityEXP?quantityEXP:editingText;
             value = scMathUtil.roundForObj(value,getDecimal("ration.quantity"));
+            value = project.quantity_detail.autoTransformQuantity(value,node);
+            value = scMathUtil.roundForObj(value,decimalObj.decimal("quantity",node))
+            node.data.quantity=value;
             if(node.parent.data.quantity&&node.parent.data.quantity!=0&&node.parent.data.quantity!=""){
                 var billQuantity = scMathUtil.roundForObj(node.parent.data.quantity,getDecimal("quantity",node.parent));
                 node.data.contain = scMathUtil.roundForObj(value/billQuantity,getDecimal("process"));
             }else {
                 node.data.contain=0;
             }
-            value = project.quantity_detail.autoTransformQuantity(value,node);
-            value = scMathUtil.roundForObj(value,decimalObj.decimal("quantity",node))
-            node.data.quantity=value;
             node.changed = true;
-            project.calcProgram.calcAndSave(node);
+            project.calcProgram.calcAndSave(node, function () {
+                project.projectGLJ.loadData();
+            });
             projectObj.mainController.refreshTreeNode(node.children);//刷新子工料机总消耗量
             gljOprObj.showRationGLJSheetData();
         };

+ 126 - 10
web/building_saas/main/js/models/ration.js

@@ -158,7 +158,7 @@ var Ration = {
             let rationNodes = [];
             for (let ration of rations){
                   rationNodes.push(projectObj.project.mainTree.nodes['id_' + ration.ID]);
-            };
+            }
 
             return rationNodes;
         };
@@ -262,6 +262,7 @@ var Ration = {
             project.ration_glj.deleteByRation(ration);
             project.ration_coe.deleteByRation(ration);
             project.quantity_detail.deleteByRation(ration);
+            project.ration_installation.deleteByRation(ration);
             this.datas.splice(this.datas.indexOf(ration), 1);
         };
         ration.prototype.getDeleteDataByBill = function (nodes) {
@@ -356,26 +357,135 @@ var Ration = {
                 let billsNode = this.project.Bills.tree.findNode(ration[this.project.masterField.ration]);
                 let billsQuantity = billsNode.data.quantity ? billsNode.data.quantity : 0;
                 billsQuantity=scMathUtil.roundForObj(billsQuantity,quantity_decimal);
-                ration.contain = 1;
                 ration.quantityEXP="QDL";
-                if (optionsOprObj.getOption(optionsOprObj.optionsTypes.GENERALOPTS, 'rationQuanACToRationUnit')) {
+               /* if (optionsOprObj.getOption(optionsOprObj.optionsTypes.GENERALOPTS, 'rationQuanACToRationUnit')) {
                     ration.quantity = (billsQuantity / this.FilterNumberFromUnit(ration.unit)).toDecimal(quantity_decimal);
                 } else {
                     ration.quantity = billsQuantity.toDecimal(quantity_decimal);
-                }
+                }*/
+                ration.quantity = (billsQuantity / this.FilterNumberFromUnit(ration.unit)).toDecimal(quantity_decimal);//改成不管是否打勾都做转换
+                ration.contain = scMathUtil.roundForObj(ration.quantity/billsQuantity,process_decimal);
             }
         };
+        ration.prototype.updateRationCodes = function (recodes) {
+            let libID = projectInfoObj.projectInfo.engineeringInfo.ration_lib[0].id;
+            let projectID = projectInfoObj.projectInfo.ID;
+            let project = projectObj.project;
+            let mainTree = project.mainTree;
+            let nodeInfo =[];
+            let refershNodes = [];
+            for(let r of recodes){
+                nodeInfo.push({ID:r.node.data.ID,billsItemID:r.node.data.billsItemID,newCode:r.value});
+                refershNodes.push(r.node);
+            }
+            let calQuantity = optionsOprObj.getOption(optionsOprObj.optionsTypes.GENERALOPTS, 'rationQuanACToBillsQuan');
+            $.bootstrapLoading.start();
+            CommonAjax.post("/ration/replaceRations",{nodeInfo:nodeInfo,libID:libID,projectID:projectID,calQuantity:calQuantity},function (data) {
+                for(let recode of data){
+                   let node =  mainTree.getNodeByID(recode.ration.ID);
+                   if(node) {
+                       for(let temkey in recode.ration){//更新缓存
+                           node.data[temkey] = recode.ration[temkey];
+                       }
+                       node.data.feesIndex = {};
+                       project.Ration.deleteSubListOfRation(recode.ration);//删除旧定额下的相关记录
+                       //添加新的记录
+                       project.ration_glj.addDatasToList(recode.ration_gljs);
+                       project.ration_coe.addDatasToList(recode.ration_coes);
+                       //to do 添加增加安装费
+                   }
+                }
+                project.projectGLJ.loadData(function () {
+                    gljOprObj.refreshView();
+                    project.calcProgram.calcRationsAndSave(refershNodes);
+                    projectObj.mainController.refreshTreeNode(refershNodes, true);
+                    $.bootstrapLoading.end();
+                });
 
+                if(data.length<recodes.length){//说明有部分定额编号没找到记录
+                    alert('当前库中找不到定额"' + recodes[data.length-1].value + '"');
+                }
+            })
+        };
+        ration.prototype.addNewRation = function (itemQuery,rationType) {
+            let me = this;
+            let project = projectObj.project, sheetController = projectObj.mainController;
+            let selected = project.mainTree.selected, newSource = null, newNode = null,pre=null,br=null;
+            let billItemID = null,serialNo=1,nextID=null;
+            if (selected === null) { return; }
+            if (selected.sourceType === project.Bills.getSourceType() && selected.depth() > 0) {
+                if (selected.source.children.length > 0) {
+                    alert('当前清单已有清单子项,不能套用定额。');
+                } else if (selected.data.calcBase&&selected.data.calcBase!="") {
+                    alert('当前有基数计算不能插入定额/量价/工料机。');
+                } else {
+                    if(selected.data.type === billType.FB){
+                        return;
+                    }
+                    billItemID = selected.source.getID();
+                    nextID = selected.tree.rootID();
+                    br = this.getBillsSortRation(billItemID);
+                    serialNo = br.length > 0 ? br[br.length - 1].serialNo + 1 : 1
+                }
+            } else if (selected.sourceType === project.Ration.getSourceType()) {
+                billItemID = selected.getParentID();
+                br = this.getBillsSortRation(billItemID);
+                serialNo = selected.data.serialNo+1;
+                nextID = selected.getNextSiblingID();
+                pre = selected.source;
+            };
+            if(billItemID){
+                let newData =  me.getTempRationData(me.getNewRationID(), billItemID, serialNo, rationType);
+                let calQuantity = optionsOprObj.getOption(optionsOprObj.optionsTypes.GENERALOPTS, 'rationQuanACToBillsQuan');
+                let brUpdate = [];
+                //更新兄弟节点的序列号
+                if (pre) {
+                    let preIndex = br.indexOf(pre), i;
+                    for (i = preIndex + 1; i < br.length; i++) {
+                        br[i].serialNo = i < br.length - 1 ? br [i + 1].serialNo : br[i].serialNo + 1;
+                        brUpdate.push({projectID:newData.projectID,ID:br[i].ID,serialNo:br[i].serialNo});
+                    }
+                }
+                $.bootstrapLoading.start();
+                CommonAjax.post("/ration/addNewRation",{itemQuery:itemQuery,newData:newData,calQuantity:calQuantity,brUpdate:brUpdate},function (data) {
+                    //更新缓存
+                    console.log(data);
+                    me.datas.push(data.ration);
+                    project.ration_glj.addDatasToList(data.ration_gljs);
+                    project.ration_coe.addDatasToList(data.ration_coes);
+                    project.ration_installation.addDatasToList(data.ration_installs);
+
+                    //插入树节点
+                    newSource = data.ration;
+                    newNode = project.mainTree.insert(billItemID, nextID, newSource.ID);
+                    newNode.source = newSource;
+                    newNode.sourceType = project.Ration.getSourceType();
+                    newNode.data = newSource;
+                    ProjectController.syncDisplayNewNode(sheetController, newNode);
+                    project.projectGLJ.loadData(function () {
+                        project.ration_glj.addToMainTree(data.ration_gljs);
+                        project.calcProgram.calcAndSave(newNode);
+                        projectObj.mainController.refreshTreeNode([newNode], false);
+                        $.bootstrapLoading.end();
+                    });
+                    console.log(data);
+                })
+            }
+
+        };
+        ration.prototype.deleteSubListOfRation = function(ration){
+            projectObj.project.ration_glj.deleteByRation(ration);
+            projectObj.project.ration_coe.deleteByRation(ration);
+            projectObj.project.quantity_detail.deleteByRation(ration);
+            //to do 删除安装增加费
+        };
         ration.prototype.replaceRation = function (ration, std) {
             this.project.beginUpdate('replaceRation');
             
             // delete
             let ration_glj =projectObj.project.ration_glj;
             this.project.push(this.project.ration_glj.getSourceType(), this.project.ration_glj.getDeleteDataByRation(ration));
-
-            this.project.ration_glj.deleteByRation(ration);
-            this.project.ration_coe.deleteByRation(ration);
-            this.project.quantity_detail.deleteByRation(ration);
+            this.deleteSubListOfRation(ration);
 
             // insertNewRation
             let updateData = [];
@@ -423,9 +533,15 @@ var Ration = {
             node.data.contain = contain;
             node.data.quantityEXP="QDL*"+contain;
             node.data.quantity=scMathUtil.roundForObj(billQuantity*contain,getDecimal("quantity"),node);
-            node.data.quantity = projectObj.project.quantity_detail.autoTransformQuantity(node.data.quantity,node);//按单位做转换
+            let times = parseInt(node.data.unit)
+            if (!isNaN(times)) {
+                node.data.quantityEXP+='*'+times;
+            }
+          //  node.data.quantity = projectObj.project.quantity_detail.autoTransformQuantity(node.data.quantity,node);//按单位做转换
             node.changed = true;
-            project.calcProgram.calcAndSave(node);
+            project.calcProgram.calcAndSave(node, function () {
+                project.projectGLJ.loadData();
+            });
             projectObj.mainController.refreshTreeNode(node.children);//刷新子工料机树节点总消耗量
         };
         ration.prototype.addRationChecking=function(selected){

+ 13 - 11
web/building_saas/main/js/models/ration_coe.js

@@ -37,15 +37,22 @@ var ration_coe = {
             }
         };
         ration_coe.prototype.refreshAfterSave=function(data){
-            if(projectObj.project.ration_coe.datas&&Array.isArray(projectObj.project.ration_coe.datas)){
-                projectObj.project.ration_coe.datas = projectObj.project.ration_coe.datas.concat(data);
-            }else {
-                projectObj.project.ration_coe.datas = data;
-            }
+            projectObj.project.ration_coe.addDatasToList(data);
             gljOprObj.showCoeData(gljOprObj.coeSheet,gljOprObj.coeSetting,data);
             gljOprObj.coeSheetData=data;
             // SheetDataHelper.loadSheetData(setting, rationLibObj.sectionRationsSpread.getActiveSheet(), datas);
         };
+
+        ration_coe.prototype.addDatasToList = function (datas) {
+            let  me = projectObj.project.ration_coe;
+            if(datas&&datas.length>0){
+                if (me.datas && Array.isArray(me.datas)) {
+                    me.datas = me.datas.concat(datas);
+                } else {
+                    me.datas = datas;
+                }
+            }
+        };
         ration_coe.prototype.refreshAfterUpdate=function(data){
             var coe_list = projectObj.project.ration_coe.datas;
             var coe_index= _.findIndex(coe_list,function(coe){
@@ -138,12 +145,7 @@ var ration_coe = {
         };
         ration_coe.prototype.deleteByRation = function(ration){
             var coe_list = projectObj.project.ration_coe.datas;
-            var newList =_.filter(coe_list,(coe)=>{
-                return coe.rationID!=ration.ID;
-            });
-            if(newList!=undefined){
-                projectObj.project.ration_coe.datas = newList;
-            }
+            _.remove(coe_list,{'rationID':ration.ID});
         };
         return new ration_coe(project);
     }

+ 21 - 16
web/building_saas/main/js/models/ration_glj.js

@@ -47,7 +47,7 @@ var ration_glj = {
             result = gljOprObj.combineWithProjectGlj(result);
             return result;
         };
-        ration_glj.prototype.getGatherGljArrByRations = function (rations) {
+        ration_glj.prototype.getGatherGljArrByRations = function (rations, billQuantity) {
             let result = [];
             let clone = function (obj) {
                 if (obj === null) return null;
@@ -79,10 +79,15 @@ var ration_glj = {
                     }
                 }
             }
-            ;
 
             result = gljOprObj.combineWithProjectGlj(result);
-            return result;
+
+            // 上面取的是清单下所有工料机的总量,我要算清单单价,所以要取单位清单的工料机数量,所以下面要除以清单数量。
+            let oneBill = Array.from(result);
+            for (let glj of oneBill){
+                  glj.quantity = (glj.quantity / billQuantity).toDecimal(decimalObj.glj.quantity);
+            };
+            return oneBill;
         }
 
         // 提交数据后返回数据处理
@@ -106,13 +111,7 @@ var ration_glj = {
                 // neRecodes=data.newRecords;//原来是显示和缓存分开的,后来发现会导致数据不一致的问题所以改成统一的了,这里也只是会作为显示。
                 neRecodes = data.showDatas;
                 gljOprObj.sheetData = neRecodes;
-            }
-            if (me.datas && Array.isArray(me.datas)) {
-                if (data) {
-                    me.datas = me.datas.concat(neRecodes);
-                }
-            } else {
-                me.datas = neRecodes;
+                me.addDatasToList(neRecodes);
             }
             project.projectGLJ.loadData(function () {
                 gljOprObj.showRationGLJSheetData(true);
@@ -128,6 +127,16 @@ var ration_glj = {
                 }
             });
         };
+        ration_glj.prototype.addDatasToList = function (datas) {
+            let  me = projectObj.project.ration_glj;
+            if(datas&&datas.length>0){
+                if (me.datas && Array.isArray(me.datas)) {
+                    me.datas = me.datas.concat(datas);
+                } else {
+                    me.datas = datas;
+                }
+            }
+        };
         ration_glj.prototype.addToMainTree = function (datas) {
             datas = sortRationGLJ(datas);
             for (let data of datas) {
@@ -288,12 +297,7 @@ var ration_glj = {
         };
         ration_glj.prototype.deleteByRation = function (ration) {
             var glj_list = projectObj.project.ration_glj.datas;
-            var newList = _.filter(glj_list, (glj) => {
-                return glj.rationID != ration.ID;
-            });
-            if (newList != undefined) {
-                projectObj.project.ration_glj.datas = newList;
-            }
+            _.remove(glj_list,{'rationID':ration.ID});
         };
         ration_glj.prototype.deleteByBills = function (deleteData) {
             var rationList = projectObj.project.Ration.datas;
@@ -311,6 +315,7 @@ var ration_glj = {
                 this.deleteByRation(deleteRationList[i]);
                 projectObj.project.ration_coe.deleteByRation(deleteRationList[i]);
                 projectObj.project.quantity_detail.deleteByRation(deleteRationList[i]);
+                projectObj.project.ration_installation.deleteByRation(deleteRationList[i]);
                 projectObj.project.Ration.datas.splice(projectObj.project.Ration.datas.indexOf(deleteRationList[i]), 1);
             }
         }

+ 70 - 0
web/building_saas/main/js/models/ration_installation.js

@@ -0,0 +1,70 @@
+/**
+ * Created by zhang on 2018/2/24.
+ */
+let ration_installation = {
+    createNew: function (project) {
+        // 用户定义private方法
+        var tools = {};
+
+        // 所有通过this访问的属性,都不应在此单元外部进行写入操作
+        var ration_installation = function (proj) {
+            // this.project = proj;
+            this.datas = [];
+
+            var sourceType = ModuleNames.ration_installation;
+            this.getSourceType = function () {
+                return sourceType;
+            }
+            proj.registerModule(ModuleNames.ration_installation, this);
+        };
+
+        // prototype用于定义public方法
+        ration_installation.prototype.loadData = function (datas) {
+            this.datas = datas;
+        };
+        ration_installation.prototype.addDatasToList = function (datas) {
+            let  me = this;
+            if(datas&&datas.length>0){
+                if (me.datas && Array.isArray(me.datas)) {
+                    me.datas = me.datas.concat(datas);
+                } else {
+                    me.datas = datas;
+                }
+            }
+        };
+        ration_installation.prototype.getBySectionID = function(sectionID){
+            var ri_list = this.datas;
+            return _.filter(ri_list,{'sectionId':sectionID});
+        };
+        ration_installation.prototype.deleteByRation = function(ration){
+            var ri_list = projectObj.project.ration_installation.datas;
+            _.remove(ri_list,{'rationID':ration.ID});
+        };
+        ration_installation.prototype.getByID = function (ID) {
+            let  me = this;
+            let ri = _.find(me.datas,{'ID':ID})
+            return ri;
+        };
+        ration_installation.prototype.update = function (updateData,callback) {
+            let  me = this;
+            $.bootstrapLoading.start();
+            CommonAjax.post('/installation/updateRationInstallation',updateData,function (data) {
+                //更新缓存
+                let ri = _.find(me.datas,{'ID':updateData.ID});
+                if(ri){
+                    for(let key in updateData){
+                        ri[key] = updateData[key];
+                    }
+                }
+                if(callback){
+                    callback();
+                }
+                $.bootstrapLoading.end();
+            },function () {
+                $.bootstrapLoading.end();
+            })
+        };
+
+        return new ration_installation(project);
+    }
+};

+ 68 - 9
web/building_saas/main/js/views/glj_view.js

@@ -249,6 +249,15 @@ var gljOprObj = {
                 dataType: "String",
                 hAlign: "center",
                 vAlign: "center"
+            },
+            {
+                headerName: "是否新增",
+                headerWidth: 80,
+                dataCode: "isComplementary",
+                dataType: "String",
+                hAlign: "center",
+                vAlign: "center",
+                cellType: "checkBox"
             }
         ],
         view: {
@@ -264,6 +273,7 @@ var gljOprObj = {
         me.bindSheetEvent(sheet);
         sheet.bind(GC.Spread.Sheets.Events.CellClick, me.onCellClick);
         sheet.bind(GC.Spread.Sheets.Events.CellDoubleClick, me.onCellDoubleClick);
+        sheet.bind(GC.Spread.Sheets.Events.ClipboardChanged, me.onClipboardChanged);
         gljContextMenu.loadGLJSpreadContextMenu();
     },
     initCoeSheet: function (sheet) {
@@ -290,12 +300,15 @@ var gljOprObj = {
         sheet.name('quantity_detail');
         me.bindSheetEvent(sheet);
         sheet.bind(GC.Spread.Sheets.Events.EditStarting, function (sender, args) {
-            if(args.sheet.getValue(args.row,args.col)==null){//这里是为了解决当单元格里的值是null的时候,在单元格里输入数据,按键盘箭头移动光标的时候,会直接结束编辑,跳到另外的单元格。
-                args.sheet.setValue(args.row,args.col,"");
+             let selected = projectObj.project.mainTree.selected;
+            if(selected&&selected.sourceType == ModuleNames.ration_glj){//是主材或者是设备时只读
+                args.cancel = true;
+            }else {
+                if(args.sheet.getValue(args.row,args.col)==null){//这里是为了解决当单元格里的值是null的时候,在单元格里输入数据,按键盘箭头移动光标的时候,会直接结束编辑,跳到另外的单元格。
+                    args.sheet.setValue(args.row,args.col,"");
+                }
             }
         });
-
-
     },
     showCoeData: function (sheet, setting, datas) {
         sheet.floatingObjects.remove("customerCoe");
@@ -386,11 +399,18 @@ var gljOprObj = {
         }
     },
     onButtonClick: function (sender, args) {
+        if(args.sheet.isEditing()){
+            args.sheet.endEdit();
+        }
         var me = gljOprObj;
         var sheet = args.sheet, row = args.row, col = args.col;
         var cellType = sheet.getCellType(row, col);
         if (cellType instanceof GC.Spread.Sheets.CellTypes.Button) {
-            me.onCusButtonClick(sender, args);
+            if(args.sheetName == 'ration_coe'){
+                me.onCusButtonClick(sender, args);
+            }else if(args.sheetName == 'rationInstallSheet'){
+                installationFeeObj.onPositionButtonClick(sender,args);
+            }
         } else {
             me.onCheckBoxClick(sender, args)
         }
@@ -400,8 +420,11 @@ var gljOprObj = {
         if(selected.sourceType == ModuleNames.ration_glj){//选中的是工料机时不可编辑
             return ;
         }
-        var checkboxValue = args.sheet.getCell(args.row, args.col).value();
-        var newval = 0;
+        let checkboxValue = args.sheet.getCell(args.row, args.col).value();
+        if(args.sheetName == 'rationInstallSheet' && checkboxValue){
+            return;
+        }
+        let newval = 0;
         if (checkboxValue) {
             newval = 0;
             args.sheet.getCell(args.row, args.col).value(newval);
@@ -417,6 +440,9 @@ var gljOprObj = {
             projectObj.project.quantity_detail.isSummationUpdate(args, gljOprObj.detailData, newval);
         } else if (args.sheetName == 'glj_lib') {
             gljOprObj.setGLJSelection(args, newval);
+        }else if(args.sheetName == 'rationInstallSheet'){
+            args.newValue = newval;
+            installationFeeObj.onRationInstallValueChange(sender,args);
         }
     },
     onCusButtonClick: function (sender, args) {
@@ -461,6 +487,11 @@ var gljOprObj = {
             }
         }
     },
+    onClipboardChanged: function (sender, info) {
+        let cDatas = sheetCommonObj.getTableData(info.sheet, null);
+        sheetCommonObj.copyTextToClipboard(cDatas);
+        return;
+    },
     onCoeCellClick: function (sender, args) {
         var me = gljOprObj;
         var floatingObject = me.coeSheet.floatingObjects.get('customerCoe');
@@ -698,6 +729,7 @@ var gljOprObj = {
                     this.showRationGLJData(node);
                     this.showRationCoeData(node);
                     this.showRationAssData(node);
+                    installationFeeObj.showRationInstallationData(node);
                 }
                 isShow = true;
             }
@@ -820,7 +852,7 @@ var gljOprObj = {
             node = node ? node : projectObj.project.mainTree.selected;
             let ration = node.data;
             let quantity = ration.quantity;
-            quantity = (quantity == 0 || quantity == undefined || quantity == null || quantity == "") ? 1 : quantity;
+            quantity = (quantity == 0 || quantity == undefined || quantity == null || quantity == "") ? 0 : quantity;
             for (let glj of this.sheetData) {
                 glj.totalQuantity= this.getTotalQuantity(glj,ration);
             }
@@ -830,7 +862,7 @@ var gljOprObj = {
         ration=ration?ration: _.find(projectObj.project.Ration.datas,{"ID":glj.rationID});
         if(ration){
             let quantity = ration.quantity;
-            quantity = (quantity == 0 || quantity == undefined || quantity == null || quantity == "") ? 1 : quantity;
+            quantity = (quantity == 0 || quantity == undefined || quantity == null || quantity == "") ? 0 : quantity;
             if (glj.isMixRatio == true) {//如果是用于显示的组成物,则不用计算,跳过
                 return;
             }
@@ -1021,10 +1053,13 @@ var gljOprObj = {
         sheetCommonObj.showData(this.sheet, this.setting, []);
         sheetCommonObj.showData(this.coeSheet, this.coeSetting, []);
         sheetCommonObj.showData(this.assSheet, this.assSetting, []);
+        installationFeeObj.rationInstallSheet.setRowCount(0);//清除combobox cell
+        sheetCommonObj.showData(installationFeeObj.rationInstallSheet, installationFeeObj.rationInstallSetting, []);
         //  sheetCommonObj.showData(this.detailSheet,this.detailSetting,[]);
         this.sheetData = [];
         this.coeSheetData = [];
         this.assSheetData = [];
+        installationFeeObj.rationInstallData = [];
         //this.detailData=[];
     },
     /*   lockRationGLJCell:function(){
@@ -1200,6 +1235,14 @@ var gljOprObj = {
         if ($('#actionType').val() == 'replace' || $('#actionType').val() == 'm_replace') {
             me.filterLibGLJByType();
         }
+        //文本筛选
+        let searchStr = $('#gljSearchKeyword').val();
+        if(searchStr && searchStr.trim() != ''){
+            let reg = new RegExp(searchStr);
+            me.gljLibSheetData = _.filter(me.gljLibSheetData, function (data) {
+                return reg.test(data.code) || reg.test(data.name);
+            });
+        }
         if (me.gljCurTypeId == undefined) {
             return;
         }
@@ -1626,6 +1669,10 @@ $(function () {
         gljOprObj.showLibGLJSheetData();
     });
 
+    $('#glj_tree_div').on('hidden.bs.modal', function () {
+        $('#gljSearchKeyword').val('');
+    });
+
     $('.glj-radio').change(function () {
         let val = $("input[name='glj']:checked").val();
         if (val == 'allGljs') {
@@ -1638,6 +1685,18 @@ $(function () {
             gljOprObj.showLibGLJSheetData();
         }
     })
+    //工料机搜索
+    $('#gljSearchKeyword').change(function () {
+        gljOprObj.filterLibGLJSheetData();
+        gljOprObj.showLibGLJSheetData();
+    });
+    $('#gljSearchKeyword').bind('keypress', function (e) {
+        if(e.keyCode === 13){
+            $(this).blur();
+            return false;
+        }
+    });
+
     $('#glj_selected_conf').click(function () {
         if (gljOprObj.GLJSelection.length < 1) {
             return;

+ 103 - 12
web/building_saas/main/js/views/glj_view_contextMenu.js

@@ -26,6 +26,9 @@ var gljContextMenu = {
                         var sheetData = gljOprObj.sheetData;
                         var deleteRow = sheetData[gljContextMenu.selectedRow];
                         projectObj.project.ration_glj.updataOrdelete(deleteRow);
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='ration_glj';
                     }
                 },
                 "add_glj": {
@@ -45,6 +48,9 @@ var gljContextMenu = {
                     },
                     callback:function () {
                         getGLJData('add');
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='ration_glj';
                     }
                 },
                 "replace_glj": {
@@ -60,6 +66,9 @@ var gljContextMenu = {
                     },
                     callback: function () {
                         getGLJData('replace');
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='ration_glj';
                     }
                 },
                 "m_replace_glj": {
@@ -75,6 +84,9 @@ var gljContextMenu = {
                     },
                     callback: function () {
                         getGLJData('m_replace');
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='ration_glj';
                     }
                 },
                 "add_to_lib": {
@@ -93,16 +105,11 @@ var gljContextMenu = {
                         var sheetData = gljOprObj.sheetData;
                         var recode = sheetData[gljContextMenu.selectedRow];
                         showGLJClassTree(recode);
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='ration_glj';
                     }
-                }
-            }
-        });
-    },
-    loadQuantityDetailMenu:function () {
-        $.contextMenu({
-            selector: '#subSpread',
-            build: this.onbuild,
-            items: {
+                },
                 "insert_detail": {
                     name: '插入行',
                     icon: 'fa-sign-in',
@@ -112,6 +119,9 @@ var gljContextMenu = {
                     },
                     callback: function () {
                         projectObj.project.quantity_detail.insertQuantityDetail(gljContextMenu.selectedRow);
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='quantity_detail';
                     }
                 },
                 "delete_detail": {
@@ -123,6 +133,9 @@ var gljContextMenu = {
                     },
                     callback:function () {
                         projectObj.project.quantity_detail.deleteQuantityDetail(gljContextMenu.selectedRow);
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='quantity_detail';
                     }
                 },
                 "move_up": {
@@ -134,6 +147,9 @@ var gljContextMenu = {
                     },
                     callback: function () {
                         projectObj.project.quantity_detail.moveUp(gljContextMenu.selectedRow);
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='quantity_detail';
                     }
                 },
                 "move_down": {
@@ -145,6 +161,9 @@ var gljContextMenu = {
                     },
                     callback: function () {
                         projectObj.project.quantity_detail.moveDown(gljContextMenu.selectedRow);
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='quantity_detail';
                     }
                 },
                 "copy": {
@@ -158,9 +177,12 @@ var gljContextMenu = {
                     },
                     callback: function () {
                         gljContextMenu.clipboard={
-                          row:gljContextMenu.selectedRow,
-                          col:gljContextMenu.selectedCol
+                            row:gljContextMenu.selectedRow,
+                            col:gljContextMenu.selectedCol
                         };
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='quantity_detail';
                     }
                 },
                 "paste": {
@@ -180,11 +202,76 @@ var gljContextMenu = {
                             'editingText':sheet.getCell(c.row,c.col).value()
                         }
                         gljOprObj.onEditDetailSheet(args);
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='quantity_detail';
+                    }
+                },
+                "modify_rule": {
+                    name: '修改规则',
+                    icon: 'fa-sign-in',
+                    disabled: function () {//当选中空行或者ruleID为空的情况下,灰显
+                        let sheetData = installationFeeObj.rationInstallData;
+                        if(gljContextMenu.selectedRow>sheetData.length-1){
+                            return true
+                        }
+                        let ri = sheetData[gljContextMenu.selectedRow];
+                        if(!ri.ruleId||ri.ruleId==''){
+                            return true;
+                        }
+                        return false;
+                    },
+                    callback: function () {
+                        $("#modify_feeRule").modal({show:true});
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='rationInstallSheet';
+                    }
+                },
+                "apply_to_FX": {
+                    name: '应用到当前分项',
+                    icon: 'fa-sign-in',
+                    disabled: function () {
+                        /* var sheetData = gljOprObj.detailData;
+                         return gljContextMenu.selectedRow>sheetData.length-2;*/
+                    },
+                    callback: function () {
+                        //projectObj.project.quantity_detail.moveDown(gljContextMenu.selectedRow);
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='rationInstallSheet';
+                    }
+                },
+                "apply_to_FB": {
+                    name: '应用到当前分部',
+                    icon: 'fa-sign-in',
+                    disabled: function () {
+                        /* var sheetData = gljOprObj.detailData;
+                         return gljContextMenu.selectedRow>sheetData.length-2;*/
+                    },
+                    callback: function () {
+                        //projectObj.project.quantity_detail.moveDown(gljContextMenu.selectedRow);
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='rationInstallSheet';
+                    }
+                },
+                "apply_to_PRO": {
+                    name: '应用到当前项目',
+                    icon: 'fa-sign-in',
+                    disabled: function () {
+                        /* var sheetData = gljOprObj.detailData;
+                         return gljContextMenu.selectedRow>sheetData.length-2;*/
+                    },
+                    callback: function () {
+                        //projectObj.project.quantity_detail.moveDown(gljContextMenu.selectedRow);
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='rationInstallSheet';
                     }
                 }
             }
         });
-
     },
     onbuild:function ($trigger, e) {
         var target = SheetDataHelper.safeRightClickSelection($trigger, e, subSpread);
@@ -204,6 +291,10 @@ function getGLJData(actionType) {
         zTreeHelper.createTree(result.datas.treeData, gljOprObj.gljTreeSetting, "gljTree", gljOprObj);
         gljOprObj.stdGLJ=result.datas.stdGLJ;
         gljOprObj.complementaryGLJs=result.datas.complementaryGLJs;
+        for(let compleGlj of gljOprObj.complementaryGLJs){
+            //是否新增
+            compleGlj.isComplementary = true;
+        }
         gljOprObj.AllRecode=gljOprObj.stdGLJ.concat(gljOprObj.complementaryGLJs);
         gljOprObj.distTypeTree=gljOprObj.getComboData(result.datas.distTypeTree);
         $('#modalCon').width($(window).width()*0.5);

+ 461 - 108
web/building_saas/main/js/views/installation_fee_view.js

@@ -3,15 +3,46 @@
  */
 let installationFeeObj={
     rationInstallSheet:null,
+    rationInstallData:null,
+    rationInstallSetting:{
+        header: [
+            {headerName: "按统一设置", headerWidth: 80, dataCode: "unifiedSetting", dataType: "String",cellType: "checkBox"},
+            {headerName: "费用项", headerWidth: 160, dataCode: "itemName", dataType: "String"},
+            {headerName: "费用规则", headerWidth: 300, dataCode: "ruleId", hAlign: "left", dataType: "String",getText:'forRule'},
+            {headerName: "编码", headerWidth: 70, dataCode: "code", hAlign: "left", dataType: "String"},
+            {headerName: "基数", headerWidth: 150, dataCode: "base", hAlign: "left", dataType: "String",cellType:'comboBox',options:installSectionBase},
+            {headerName: "费率(%)", headerWidth: 70, dataCode: "feeRate", hAlign: "right", dataType: "String"},
+            {headerName: "人工(%)", headerWidth: 70, dataCode: "labour", hAlign: "right", dataType: "String"},
+            {headerName: "材料(%)", headerWidth: 70, dataCode: "material", hAlign: "right", dataType: "String"},
+            {headerName: "机械(%)", headerWidth: 70, dataCode: "machine", hAlign: "right", dataType: "String"},
+            {headerName: "费用类型", headerWidth: 100, dataCode: "feeType", hAlign: "center", dataType: "String",cellType:'comboBox',options:installFeeType},
+            {headerName: "记取位置", headerWidth: 200, dataCode: "position", hAlign: "left", dataType: "String",cellType:'selectButton',getText:'forPosition'}
+        ],
+        view: {
+            lockColumns: [0,1,3,4,5,6,7,8,9]
+        },
+        getText:{
+            forPosition:function (item,val) {//记取位置转换
+               return installationFeeObj.getDisplayText(item);
+            },
+            forRule:function (item,val) {//
+                let feeRule = projectObj.project.installation_fee.getFeeRuleByID(item.libID,val);
+                if(feeRule){
+                    return feeRule.rule;
+                }
+                return val;
+            }
+        }
+    },
     feeItemSpread:null,
     feeItemSheet:null,
     feeItemData:null,
     feeItemSetting:{
         header: [
-            {headerName: "计取", headerWidth: 90, dataCode: "isCal", dataType: "String",cellType: "checkBox"},
+            {headerName: "计取", headerWidth: 50, dataCode: "isCal", dataType: "String",cellType: "checkBox"},
             {headerName: "费用项", headerWidth: 300, dataCode: "feeItem", hAlign: "left", dataType: "String"},
             {headerName: "费用类型", headerWidth: 100, dataCode: "feeType", hAlign: "center", dataType: "String",cellType:'comboBox',options:installFeeType},
-            {headerName: "记取位置", headerWidth: 140, dataCode: "displayPosition", hAlign: "left", dataType: "String",cellType:'selectButton'}
+            {headerName: "记取位置", headerWidth: 180, dataCode: "displayPosition", hAlign: "left", dataType: "String",cellType:'selectButton'}
         ],
         view: {
             lockColumns: [0,1]
@@ -26,11 +57,11 @@ let installationFeeObj={
             {headerName: "费用规则", headerWidth: 220, dataCode: "rule", hAlign: "left", dataType: "String",getText:'forRule'},
             {headerName: "编码", headerWidth: 70, dataCode: "code", hAlign: "left", dataType: "String"},
             {headerName: "基数", headerWidth: 80, dataCode: "base", hAlign: "left", dataType: "String",cellType:'comboBox',options:installSectionBase},
-            {headerName: "费率(%)", headerWidth: 80, dataCode: "feeRate", hAlign: "right", dataType: "String"},
-            {headerName: "其中人工(%)", headerWidth: 100, dataCode: "labour", hAlign: "right", dataType: "String"},
-            {headerName: "其中材料(%)", headerWidth: 100, dataCode: "material", hAlign: "right", dataType: "String"},
-            {headerName: "其中机械(%)", headerWidth: 100, dataCode: "machine", hAlign: "right", dataType: "String"},
-            {headerName: "记取位置", headerWidth: 100, dataCode: "position", hAlign: "left", dataType: "String",cellType:'selectButton'}
+            {headerName: "费率(%)", headerWidth: 70, dataCode: "feeRate", hAlign: "right", dataType: "String"},
+            {headerName: "人工(%)", headerWidth: 70, dataCode: "labour", hAlign: "right", dataType: "String"},
+            {headerName: "材料(%)", headerWidth: 70, dataCode: "material", hAlign: "right", dataType: "String"},
+            {headerName: "机械(%)", headerWidth: 70, dataCode: "machine", hAlign: "right", dataType: "String"},
+            {headerName: "记取位置", headerWidth: 200, dataCode: "position", hAlign: "left", dataType: "String",cellType:'selectButton'}
         ],
         view: {
             lockColumns: [0, 2]
@@ -68,6 +99,31 @@ let installationFeeObj={
             lockColumns: [0,1,2,3,4,5,6]
         }
     },
+    modifyFeeRuleSpread:null,
+    modifyFeeRuleSheet:null,
+    modifyFeeRuleData:null,
+    modifyFeeRuleSetting:{
+        header: [
+            {headerName: "编码", headerWidth: 70, dataCode: "code", hAlign: "left", dataType: "String"},
+            {headerName: "费用规则", headerWidth: 220, dataCode: "rule", hAlign: "left", dataType: "String"},
+            {headerName: "基数", headerWidth: 80, dataCode: "base", hAlign: "left", dataType: "String",cellType:'comboBox',options:installSectionBase},
+            {headerName: "费率(%)", headerWidth: 80, dataCode: "feeRate", hAlign: "right", dataType: "String"},
+            {headerName: "其中人工(%)", headerWidth: 100, dataCode: "labour", hAlign: "right", dataType: "String"},
+            {headerName: "其中材料(%)", headerWidth: 100, dataCode: "material", hAlign: "right", dataType: "String"},
+            {headerName: "其中机械(%)", headerWidth: 100, dataCode: "machine", hAlign: "right", dataType: "String"},
+            {headerName: "记取位置", headerWidth: 100, dataCode: "position", hAlign: "left", dataType: "String",cellType:'selectButton',getText:'forPosition'}
+        ],
+        view: {
+            lockColumns: [0, 1]
+        },
+        getText:{
+            forPosition:function (item,val) {//记取位置转换
+                return installationFeeObj.getDisplayText(item);
+            }
+        },
+        autoFit:true
+    },
+    modifyEditedObj:null,
     selectionTree:null,
     selectionTreeController:null,
     positionSetting:{
@@ -192,8 +248,6 @@ let installationFeeObj={
        this.feeDetailSheet.setRowCount(0);
     },
     onFeeItemSelectionChange:function (e, info) {
-        console.log('fee item selection change');
-        console.log(info);
         let me = installationFeeObj;
         let newSelections = info.newSelections;
         let row = newSelections[0].row;
@@ -212,7 +266,6 @@ let installationFeeObj={
                 me.showFeeDetailData();
             }
         }
-       // me.feeItemSheet.repaint();
     },
     onFeeDetailSelectionChange:function (e,info) {
         console.log('detail selection change');
@@ -247,6 +300,13 @@ let installationFeeObj={
         $('#calc_position_from').val(info.sheetName);
         $('#calc_position').modal({show:true});
     },
+    onModifyFeeRuleEditStarting:function (e,args) {
+        let me = installationFeeObj;
+        let rowData = me.modifyFeeRuleData[args.row];
+        if(me.modifyFeeRuleSetting.header[args.col].dataCode=='feeRate'&&installSectionBase.indexOf(rowData.base)===0){//当基数是分别按人材机乘系数时,费率列只读
+            args.cancel = true;
+        }
+    },
     onCalcCheckBoxClick: function(e,info){
         let me = installationFeeObj;
         var checkboxValue = info.sheet.getCell(info.row, info.col).value();
@@ -292,7 +352,7 @@ let installationFeeObj={
             let feeItem = this.feeItemData[this.feeItemSheet.getSelections()[0].row];
             for(let i =0;i<this.feeDetailData.length;i++){
                 this.feeDetailSheet.autoFitRow(i);
-                this.setDetailRuleCell(i,this.feeDetailData[i]);//设置费用规则下拉选项
+                this.setComboRuleCell(i,1,this.feeDetailData[i],this.feeDetailSheet);//设置费用规则下拉选项
                 this.lockDetailSheet(i,this.feeDetailData[i],feeItem);
             }
             this.feeDetailSheet.resumeEvent();
@@ -306,6 +366,53 @@ let installationFeeObj={
         this.moreFeeRuleSheet.setRowCount(this.moreFeeRuleData.length);
         this.moreFeeRuleSheet.clearSelection();
     },
+    showModifyFeeRule:function () {
+        let riselection = this.rationInstallSheet.getSelections()[0];
+        let ration_install = this.rationInstallData[riselection.row];
+        let feeRule =  _.cloneDeep(projectObj.project.installation_fee.getFeeRuleByID(ration_install.libID,ration_install.ruleId));//不改变原有对象
+        feeRule.libID = ration_install.libID;
+        feeRule.feeType = ration_install.feeType;
+        this.modifyFeeRuleData = [feeRule];
+        this.modifyFeeRuleSheet.setRowCount(0);
+        sheetCommonObj.showData(this.modifyFeeRuleSheet, this.modifyFeeRuleSetting, this.modifyFeeRuleData);
+        this.modifyFeeRuleSheet.setRowCount(this.modifyFeeRuleData.length);
+        let positionCol = _.findIndex(this.modifyFeeRuleSetting.header,{ 'dataCode': "position"});
+        this.modifyFeeRuleSheet.getRange(-1,positionCol, -1, 1, GC.Spread.Sheets.SheetArea.viewport).locked(ration_install.feeType=='子目费用'||ration_install.unifiedSetting==1);//设置选取位置列只读
+    },
+    showRationInstallationData:function (node) {
+        var installationList = [];
+        var ration_installation = projectObj.project.ration_installation;
+        var ration = node.data;
+        if (ration_installation.datas && ration_installation.datas.length > 0) {
+            for(let i =0; i < ration_installation.datas.length;i++){
+                let ri = ration_installation.datas[i];
+                if(ration.projectID == ri.projectID && ration.ID == ri.rationID){
+                   let tem_ri =  _.cloneDeep(ri);
+                   this.getRIShowData(tem_ri.ruleId,tem_ri,tem_ri);
+                   installationList.push(tem_ri);
+                }
+            }
+        }
+        this.rationInstallData = installationList;
+        this.rationInstallSheet.setRowCount(0);
+        sheetCommonObj.showData(this.rationInstallSheet, this.rationInstallSetting,this.rationInstallData);
+        if(this.rationInstallData.length>0){
+            this.rationInstallSheet.suspendPaint();
+            this.rationInstallSheet.suspendEvent();
+            for(let i = 0;i< this.rationInstallData.length;i++){
+                let impactRules = projectObj.project.installation_fee.getFeeRuleBySection({libID:this.rationInstallData[i].libID,ID:this.rationInstallData[i].sectionId});
+                this.setComboRuleCell(i,2,{impactRules:impactRules},this.rationInstallSheet);//设置费用规则下拉选项
+            }
+            this.rationInstallSheet.resumeEvent();
+            this.rationInstallSheet.resumePaint();
+        }
+    },
+    refreshRationInstallationRow:function (row) {
+        let ri = this.rationInstallData[row];
+        let tem_ri = _.cloneDeep(projectObj.project.ration_installation.getByID(ri.ID));
+        this.rationInstallData[row] = this.getRIShowData(tem_ri.ruleId,tem_ri,tem_ri);
+        sheetCommonObj.showRowData(this.rationInstallSheet, this.rationInstallSetting,row,this.rationInstallData);
+    },
     refreshFeeDetailRow:function (row) {
         let detail = this.feeDetailData[row];
         let section = projectObj.project.installation_fee.getInstallSectionByID(detail.libID,detail.ID);
@@ -330,7 +437,7 @@ let installationFeeObj={
             this.feeDetailSheet.getRange(row, 3, 1, this.feeDetailSetting.header.length-3, GC.Spread.Sheets.SheetArea.viewport).locked(true);
         }
     },
-    setDetailRuleCell:function(row,detail){
+    setComboRuleCell:function(row,col,detail,sheet){
         let options=[{text:"无",value:""}];
         for(let ir of detail.impactRules){
             options.push({text:ir.rule,value:ir.ID});
@@ -339,7 +446,7 @@ let installationFeeObj={
         let dynamicCombo = sheetCommonObj.getDynamicCombo();//new GC.Spread.Sheets.CellTypes.ComboBox();
         dynamicCombo.items(options);
         dynamicCombo.editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.value);
-        this.feeDetailSheet.setCellType(row, 1, dynamicCombo, GC.Spread.Sheets.SheetArea.viewport);
+        sheet.setCellType(row, col, dynamicCombo, GC.Spread.Sheets.SheetArea.viewport);
     },
     getFeeItemData:function (datas) {
         let feeItemShowArray = [];
@@ -352,7 +459,7 @@ let installationFeeObj={
             feeItemShowArray.push(tem_Lib);
             if(d.installFeeItem && d.installFeeItem.length > 0){
                 for(let t_if of d.installFeeItem){
-                    t_if.installFeeID = d.ID,
+                    t_if.installFeeID = d.ID;
                     t_if.libID = d.libID;
                     t_if.isMixRatio = true;
                     t_if.displayPosition = this.getDisplayText(t_if);
@@ -363,12 +470,13 @@ let installationFeeObj={
         return feeItemShowArray;
     },
     getDisplayText:function (item) {
-        if(item.billID){
+        if(item.billID&&item.billID!=''){
             let node = projectObj.project.mainTree.getNodeByID(item.billID);
             if(node){
-                return node.data.code +" "+node.data.name;
+                let code = node.data.code?node.data.code:"";
+                let name = node.data.name?node.data.name:"";
+                return code +" "+name;
             }
-
         }
         return  item.position;
     },
@@ -384,11 +492,21 @@ let installationFeeObj={
     },
     getMoreFeeRuleData:function () {
         let me = installationFeeObj;
-        let fee_select = me.feeItemSheet.getSelections()[0];
-        let feeItem = me.feeItemData[fee_select.row];
+        let feeItem = null;
+        let from = $("#more_from").val();
+        if(from =='feeDetail'){//在计取安装费那里点击更多
+            let fee_select = me.feeItemSheet.getSelections()[0];
+            feeItem = me.feeItemData[fee_select.row];
+        }else if(from == 'rationInstallation'){//在定额安装增加费那里点击更多
+            let ri_select = me.rationInstallSheet.getSelections()[0];
+            let ri = me.rationInstallData[ri_select.row];
+            feeItem = {ID:ri.feeItemId,libID:ri.libID};
+        }
         let feeRules =  projectObj.project.installation_fee.getFeeRuleByFeeItem(feeItem);
         return feeRules;
     },
+
+
     getDetailRowDataBySection(is,libID){
         let me = this;
         let tem_detail = {
@@ -436,8 +554,47 @@ let installationFeeObj={
         this.moreFeeRuleSheet.selectionUnit(1);//0 cell,1 row,2 col;
         this.moreFeeRuleSheet.name('moreFeeRuleSheet');
     },
+    initModifyFeeRuleSpread:function () {
+        let me = this;
+        me.modifyFeeRuleSpread = SheetDataHelper.createNewSpread($("#modifyFeeRuleSpread")[0]);
+        me.modifyFeeRuleSheet = me.modifyFeeRuleSpread.getSheet(0);
+        me.initSheet(me.modifyFeeRuleSheet, me.modifyFeeRuleSetting);
+        this.modifyFeeRuleSpread.bind(GC.Spread.Sheets.Events.ButtonClicked, this.onPositionButtonClick);
+        me.modifyFeeRuleSheet.bind(GC.Spread.Sheets.Events.EditStarting, this.onModifyFeeRuleEditStarting);
+        this.modifyFeeRuleSheet.name('modifyFeeRuleSheet');
+    },
+    initRationInstallSheet:function (sheet) {
+        let me = this;
+        this.rationInstallSheet = sheet;
+        this.initSheet( this.rationInstallSheet,this.rationInstallSetting);
+        sheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onRationSheetSelectionChange);
+        sheet.bind(GC.Spread.Sheets.Events.EditStarting, function (sender, args) {
+           if(args.row>=me.rationInstallData.length){
+               args.cancel = true;
+           }
+        });
+        this.rationInstallSheet.name("rationInstallSheet");
+    },
+    onRationSheetSelectionChange: function (sender, args) {
+        let me = installationFeeObj;
+        let row = args.newSelections[0].row;
+        let col = args.newSelections[0].col;
+        let dataCode = me.rationInstallSetting.header[col].dataCode;
+        if(row<me.rationInstallData.length&&dataCode=='position'){
+            let locked = false;
+            if(me.rationInstallData[row].feeType=='子目费用'){
+                locked = true;
+            }else if(me.rationInstallData[row].unifiedSetting==1){
+                locked = true;
+            }else if(!me.rationInstallData[row].ruleId||me.rationInstallData[row].ruleId==''){
+                locked = true;
+            }
+            installationFeeObj.rationInstallSheet.getCell(row,col).locked(locked);
+        }
+        me.rationInstallSheet.repaint();
+    },
     onFeeRuleDoubleClick:function (e,info) {
-        if(info.row){
+        if(info.row!=undefined||info!=null){
             installationFeeObj.updateFeeRuleToSection(info.row);
         }else {
             return;
@@ -518,31 +675,36 @@ let installationFeeObj={
             }
         }
     },
-    getBillDataForSelect:function () {
+    getBillDataForSelect:function () {//这里有四个地方共用
         let controller = projectObj.mainController, project = projectObj.project;
-        let selection = this.feeItemSheet.getSelections()[0];
         let from = $('#calc_position_from').val();
-        let feeItem = this.feeItemData[selection.row];
-        let rootNode = null;
-        let allNodes = [];
-        let datas = [];
-        let billID = null;
-        if(from =="feeItemSheet"){
-            if(feeItem.billID){
-                billID = feeItem.billID;
-            }
-        }
-        if(from =="feeDetailSheet") {
-            let detailSelection = this.feeDetailSheet.getSelections()[0];
-            let detail = this.feeDetailData[detailSelection.row];
-            if(detail.billID){
-                billID = detail.billID;
+        let rootNode = null,allNodes = [],datas = [],billID = null,selectedItem=null;
+        if(from=="rationInstallSheet"){
+            let riSelection = this.rationInstallSheet.getSelections()[0];
+            selectedItem = this.rationInstallData[riSelection.row];
+            billID = selectedItem.billID;
+        }else if(from=="modifyFeeRuleSheet"){
+            let riSelection = this.modifyFeeRuleSheet.getSelections()[0];
+            selectedItem = this.modifyFeeRuleData[riSelection.row];
+            billID = selectedItem.billID;
+        }else {
+            let selection = this.feeItemSheet.getSelections()[0];
+            selectedItem = this.feeItemData[selection.row];
+            if(from =="feeItemSheet"){
+                if(selectedItem.billID){
+                    billID = selectedItem.billID;
+                }
+            }else if(from =="feeDetailSheet") {
+                let detailSelection = this.feeDetailSheet.getSelections()[0];
+                let detail = this.feeDetailData[detailSelection.row];
+                if(detail.billID){
+                    billID = detail.billID;
+                }
             }
         }
-
-        if(feeItem.feeType=='措施费用'){
+        if(selectedItem.feeType=='措施费用'){
             rootNode = project.Bills.getMeasureNode(controller);
-        }else if(feeItem.feeType=='分项费用'){
+        }else if(selectedItem.feeType=='分项费用'){
             rootNode = project.Bills.getFBFXNode(controller);
         }
         allNodes.push(rootNode);
@@ -584,57 +746,129 @@ let installationFeeObj={
                 this.updateFeeItemPosition(pobj.recode);
             }else if(from=='feeDetailSheet'){
                 this.updateFeeRulePosition(pobj.recode);
+            }else if(from=='rationInstallSheet'){
+                this.updateRationInstallPosition(pobj.recode);
+            }else if(from =='modifyFeeRuleSheet'){
+                this.updateModifyFeeRulePosition(pobj.recode);
             }
         }
         $("#calc_position").modal('hide');
     },
+    confirmFeeRuleModify:function () {
+        let me = this,installation_fee = projectObj.project.installation_fee;
+        let modifyRule = me.modifyFeeRuleData[0];
+        let updateMap = null;
+        console.log(me.modifyEditedObj);
+        if(me.modifyEditedObj==null){
+            $("#modify_feeRule").modal('hide');
+            return;
+        }
+        let feeRule = installation_fee.getFeeRuleByID(modifyRule.libID,modifyRule.ID);
+        if(feeRule){
+            for(let mkey in me.modifyEditedObj){
+                if(me.modifyEditedObj[mkey]!=feeRule[mkey]){//说明是值发生了改变
+                    updateMap==null?updateMap={}:"";
+                    updateMap[mkey] =me.modifyEditedObj[mkey];
+                }
+            }
+            if(updateMap){//如果有需要更新的属性
+                if(modifyRule.base&&installSectionBase.indexOf(modifyRule.base)>0){
+                    let sum = modifyRule.labour+modifyRule.material+modifyRule.machine;//三项的和要等于100
+                    if(sum!=100){
+                       alert("人工、材料、机械的和应等于100,请重新输入。");
+                       return;
+                    }
+                }
+                $("#modify_feeRule").modal('hide');
+                installation_fee.updateFeeRule(updateMap,modifyRule.libID,modifyRule.ID,function () {
+                    me.refreshRationInstallationRow(me.rationInstallSheet.getSelections()[0].row);
+                });
+            }
+        }
+    },
+    updateModifyFeeRulePosition:function (recode) {
+        let me = this;
+        let riselection = me.modifyFeeRuleSheet.getSelections()[0];
+        let modifyFee = me.modifyFeeRuleData[riselection.row];
+        let positionCol = _.findIndex(me.modifyFeeRuleSetting.header,{ 'dataCode': "position"});
+        if(modifyFee.billID == recode.ID){//和原来的位置没变
+            return
+        }
+        if(me.modifyEditedObj==null){//初始化
+            me.modifyEditedObj={};
+        }
+        me.modifyEditedObj.position = recode.code;
+        me.modifyEditedObj.billID = recode.ID;
+        modifyFee.position = recode.code;
+        modifyFee.billID = recode.ID;
+        me.modifyFeeRuleSheet.setValue(riselection.row,positionCol,me.getDisplayText(modifyFee));
+        console.log(me.modifyEditedObj);
+    },
+    updateRationInstallPosition:function(recode){
+        let me = this, installation_fee = projectObj.project.installation_fee;
+        let riselection = me.rationInstallSheet.getSelections()[0];
+        let rationInstall = me.rationInstallData[riselection.row];
+        if(rationInstall.billID == recode.ID){//和原来的位置没变
+            return;
+        }
+        installation_fee.updateFeeRule({position:recode.code,billID:recode.ID},rationInstall.libID,rationInstall.ruleId,function (){
+            me.refreshRationInstallationRow(riselection.row);
+        });
+    },
     updateFeeRulePosition:function (recode) {
         let me = this;
         let itemSelection  = this.feeItemSheet.getSelections()[0];
         let feeItem = this.feeItemData[itemSelection.row];
         let detailSelection = this.feeDetailSheet.getSelections()[0];
         let detail = this.feeDetailData[detailSelection.row];
-        let itemUpdateData = null;
-        let updateData = null;
         if(detail.billID ==recode.ID ){//和原来的位置没变
             return;
         }
-        let detailUpdateData = me.getDetailUpdateData(detail,{position:recode.code,billID:recode.ID},'feeRule');
-        if(recode.ID!=feeItem.billID){//不一样的情况下要清空费用项的选取位置
-            itemUpdateData = me.getFeeItemUpdateData(feeItem,{ position: "", billID:""});
-        }
-        itemUpdateData==null?updateData = detailUpdateData:updateData=[detailUpdateData,itemUpdateData];
-        $.bootstrapLoading.start();
-        me.submitInstallationUpdate(updateData,function (data) {
-            //更新缓存
-            if(itemUpdateData){
+        projectObj.project.installation_fee.updateFeeRule({position:recode.code,billID:recode.ID},feeItem.libID,detail.feeRuleId,function (isFeeItemUpdate){
+            if(isFeeItemUpdate){
                 feeItem.position ="";
                 feeItem.billID = "";
                 feeItem.displayPosition = "";
                 me.feeItemSheet.getCell(itemSelection.row, 3).value(feeItem.displayPosition);
             }
-            let feeRule = projectObj.project.installation_fee.getFeeRuleByID(feeItem.libID,detail.feeRuleId);
-            feeRule.position = recode.code;
-            feeRule.billID = recode.ID;
             me.showFeeDetailData(feeItem.libID,feeItem.ID);
-            $.bootstrapLoading.end();
         });
     },
     updateFeeRuleToSection:function (row) {
-        let me = this;
+        let me = this, installation_fee=projectObj.project.installation_fee;
         let feeRule = me.moreFeeRuleData[row];
         let detailSelection = me.feeDetailSheet.getSelections()[0];
         let detail = this.feeDetailData[detailSelection.row];
-        let updateData = me.getDetailUpdateData(detail,{"feeRuleId":feeRule.ID},'installSection');
+        let rationInstallations = [];
+        let updateData = installation_fee.getSectionUpdateData(detail.libID,detail.ID,{"feeRuleId":feeRule.ID});
+        installation_fee.getRIUpdateDataBySectionUpdate(detail.ID,feeRule.ID,rationInstallations);//生成受影响的定额安装增加费并加入到数组中
         $.bootstrapLoading.start();
-        me.submitInstallationUpdate(updateData,function (data) {
-            let install_fee = projectObj.project.installation_fee;
-            let section = install_fee.getInstallSectionByID(detail.libID,detail.ID);
+        installation_fee.submitInstallationUpdate(updateData,rationInstallations,function (data) {
+            let section = installation_fee.getInstallSectionByID(detail.libID,detail.ID);
             section.feeRuleId = feeRule.ID;
             me.refreshFeeDetailRow(detailSelection.row);
             $.bootstrapLoading.end();
         });
     },
+    updateFeeRuleToRInstall:function (row) {
+        let me = this;
+        let feeRule = me.moreFeeRuleData[row];
+        let ri_row = me.rationInstallSheet.getSelections()[0].row;
+        let raInstallation = me.rationInstallData[ri_row];
+        if(feeRule.ID ==raInstallation.ruleId ){
+            me.refreshRationInstallationRow(ri_row);
+            return;
+        }
+        let updateData = {
+            ID:raInstallation.ID,
+            projectID:raInstallation.projectID,
+            ruleId:feeRule.ID,
+            unifiedSetting:0
+        };
+        projectObj.project.ration_installation.update(updateData,function (data) {
+            me.refreshRationInstallationRow(ri_row);
+        });
+    },
     updateFeeItemPosition:function(recode){
         let me = this;
         let selection = this.feeItemSheet.getSelections()[0];
@@ -642,11 +876,11 @@ let installationFeeObj={
         if(feeItem.billID ==recode.ID ){//和原来的位置没变
             return;
         }
-        let updateData = me.getFeeItemUpdateData(feeItem,{ position: recode.code, billID:recode.ID});
-        let [dataArray,impacRules] = me.getFeeRuleUpdateData(feeItem,recode);
+        let updateData =  projectObj.project.installation_fee.getFeeItemUpdateData(feeItem.libID,feeItem.ID,{ position: recode.code, billID:recode.ID});
+        let [dataArray,impacRules] = me.getFeeRuleUpdateDataByFeeItem(feeItem,recode);
         dataArray.push(updateData);
         $.bootstrapLoading.start();
-        me.submitInstallationUpdate(dataArray,function (data) {
+        projectObj.project.installation_fee.submitInstallationUpdate(dataArray,null,function (data) {
             //更新缓存
             feeItem.position =recode.code;
             feeItem.billID = recode.ID;
@@ -660,7 +894,7 @@ let installationFeeObj={
             $.bootstrapLoading.end();
         });
     },
-    getFeeRuleUpdateData : function (feeItem,recode) {
+    getFeeRuleUpdateDataByFeeItem : function (feeItem,recode) {
         let dataArray = [];
         let impacRules = projectObj.project.installation_fee.getFeeRuleByFeeItem(feeItem);
         for(let ir of impacRules){
@@ -681,6 +915,12 @@ let installationFeeObj={
         if(info.sheetName == 'feeDetailSheet'){
             installationFeeObj.onFeeDetailValueChange(e,info);
         }
+        if(info.sheetName == 'rationInstallSheet'){
+            installationFeeObj.onRationInstallValueChange(e,info);
+        }
+        if(info.sheetName == 'modifyFeeRuleSheet'){
+            installationFeeObj.modifyFeeRuleValueChange(e,info);
+        }
     },
     onFeeItemValueChange:function (e,info) {
         let me = installationFeeObj;
@@ -688,30 +928,107 @@ let installationFeeObj={
         let header = this.feeItemSetting.header[info.col];
         let doc={};
         doc[header.dataCode] = info.newValue;
-        let updateData = installationFeeObj.getFeeItemUpdateData(feeItem,doc);
-        $.bootstrapLoading.start();
-        me.submitInstallationUpdate(updateData,function (data) {
-            //更新缓存
-            feeItem[header.dataCode]=info.newValue;
+        projectObj.project.installation_fee.updateFeeItem(doc,feeItem.libID,feeItem.ID,function () {
             me.feeItemSheet.getCell(info.row, info.col).value(info.newValue);
-            $.bootstrapLoading.end();
         });
     },
+    onRationInstallValueChange:function (e,info) {
+        let me = installationFeeObj;
+        if(info.newValue==info.oldValue){
+            return;
+        }
+        let raInstallation = me.rationInstallData[info.row];
+        let fieldID =  me.rationInstallSetting.header[info.col].dataCode;
+        let updateData = {
+            projectID:raInstallation.projectID,
+            ID:  raInstallation.ID
+        };
+        if(fieldID=='ruleId'){//选择新的规则项
+            if(info.newValue=="more"){//选择的是更多
+                $("#more_from").val("rationInstallation");
+                $("#more_feeRule").modal({show:true});
+                return;
+            }
+            if(info.newValue == null){
+                me.refreshRationInstallationRow(info.row);
+            }else if(info.newValue == raInstallation.rule){
+                return;
+            }else {
+                updateData.unifiedSetting = 0;//切换费用规则时去掉统一设置勾选。
+            }
+        }
+        if(fieldID=='unifiedSetting'){//勾选统一设置
+            updateData.ruleId = '';
+            let feeItem =  projectObj.project.installation_fee.getFeeItemByID(raInstallation.libID,raInstallation.feeItemId);
+            let section = projectObj.project.installation_fee.getInstallSectionByID(raInstallation.libID,raInstallation.sectionId);
+            if(section&&feeItem&&feeItem.isCal == 1){
+                updateData.ruleId = section.feeRuleId;
+            }
+        }
+        updateData[fieldID] = info.newValue;
+        projectObj.project.ration_installation.update(updateData,function (data) {
+            me.refreshRationInstallationRow(info.row);
+        });
+    },
+    modifyFeeRuleValueChange:function (e,info) {
+        let me = installationFeeObj;
+        let fieldID = me.modifyFeeRuleSetting.header[info.col].dataCode;
+        let value = info.newValue;
+        if(me.modifyEditedObj==null){//初始化
+            me.modifyEditedObj={};
+        }
+        if(fieldID=="position"){//改变选取位置时不触发
+            return;
+        }
+        if(fieldID == 'base'){//修改基数
+            if(installSectionBase.indexOf(info.newValue)===0){//如果选择的是“人材机乘系数”时,清空“费率(%)”列的值
+                me.modifyEditedObj.feeRate = null;
+                let feeRateCol = _.findIndex(me.modifyFeeRuleSetting.header,{ 'dataCode': "feeRate"});
+                me.modifyFeeRuleSheet.setValue(info.row, feeRateCol, null);
+            }
+        }else if(fieldID=="feeRate"||fieldID=='machine'||fieldID=='material'||fieldID=="labour"){
+            if(value != null){
+                if(number_util.isNumber(value)){
+                    value = scMathUtil.roundForObj(info.newValue,getDecimal("feeRate"));
+                    me.modifyFeeRuleSheet.setValue(info.row, info.col, value);
+                }else {
+                    alert('当前输入的数据类型不正确,请重新输入。');
+                    me.modifyFeeRuleSheet.setValue(info.row, info.col, info.oldValue);
+                    return;
+                }
+            }
+        }
+        me.modifyEditedObj[fieldID] = value;
+        me.modifyFeeRuleData[info.row][fieldID] = value;
+        console.log(me.modifyEditedObj);
+    },
     onFeeDetailValueChange:function (e,info) {
         if(info.newValue==info.oldValue){
             return;
         }
         let me = installationFeeObj;
+        let install_fee = projectObj.project.installation_fee;
         let feeDetail = this.feeDetailData[info.row];
         let header = this.feeDetailSetting.header[info.col];
         let fieldID = header.dataCode;
         let updateData = null;
+        let rationInstallations=null;
         if(fieldID == 'rule'){//选择新的规则项
             if(info.newValue=="more"){//选择的是更多
+                $("#more_from").val("feeDetail");
                 $("#more_feeRule").modal({show:true});
                 return;
             }
-            updateData = me.getDetailUpdateData(feeDetail,{"feeRuleId":info.newValue},'installSection');
+            if(info.newValue == null){
+                me.refreshFeeDetailRow(info.row);
+            }else if(info.newValue == feeDetail.ruleName){
+                return;
+            }else {
+                rationInstallations=[];
+                updateData = install_fee.getSectionUpdateData(feeDetail.libID,feeDetail.ID,{"feeRuleId":info.newValue});
+                install_fee.getRIUpdateDataBySectionUpdate(feeDetail.ID,info.newValue,rationInstallations);//生成受影响的定额安装增加费并加入到数组中
+            }
+
         }else if(fieldID == 'base'){
             if(info.newValue == null){//如果基数为空,重新刷新显示
                 me.refreshFeeDetailRow(info.row);
@@ -720,7 +1037,7 @@ let installationFeeObj={
                 if(installSectionBase.indexOf(info.newValue)===0){//如果选择的是“人材机乘系数”时,清空“费率(%)”列的值
                     doc.feeRate = null;
                 }
-                updateData = me.getDetailUpdateData(feeDetail,doc,'feeRule');
+                updateData = install_fee.getFeeRuleUpdateData(feeDetail.libID,feeDetail.feeRuleId,doc);
             }
 
         }else {
@@ -737,10 +1054,9 @@ let installationFeeObj={
             let doc = {};
             doc[fieldID] = info.newValue;
             feeDetail[fieldID] = info.newValue;
-            updateData = me.getDetailUpdateData(feeDetail,doc,'feeRule');
+            updateData =  install_fee.getFeeRuleUpdateData(feeDetail.libID,feeDetail.feeRuleId,doc);
         }
-        me.submitInstallationUpdate(updateData,function (data) {
-            let install_fee = projectObj.project.installation_fee;
+        install_fee.submitInstallationUpdate(updateData,rationInstallations,function (data) {
             if(updateData){
                 if(updateData.type=="installSection"){
                     let section = install_fee.getInstallSectionByID(feeDetail.libID,feeDetail.ID);
@@ -771,7 +1087,7 @@ let installationFeeObj={
         let me = installationFeeObj;
         let canChange = true;
         let os = null;
-        if(info.newSelections[0].row == info.oldSelections[0].row){//没有换行
+        if(info.oldSelections==undefined||info.newSelections[0].row == info.oldSelections[0].row){//没有换行
             return canChange;
         }
         if(info.sheetName=='feeDetailSheet'){
@@ -785,7 +1101,7 @@ let installationFeeObj={
             if(detail.base&&installSectionBase.indexOf(detail.base)>0){
                 let sum = detail.labour+detail.material+detail.machine;//三项的和要等于100
                 if(sum!=100){
-                    setTimeout(function () {//这里须用延时执行的办法,不然的弹窗确认窗口会和spreadjs 的事件有冲突,造成定额工料机数据不会根据树结点更新的问题
+                    setTimeout(function () {//这里须用延时执行的办法,不然的弹窗确认窗口会和spreadjs 的事件有冲突
                         alert("人工、材料、机械的和应等于100,请重新输入。");
                     }, 200);
                     canChange = false;
@@ -794,32 +1110,42 @@ let installationFeeObj={
         }
         return canChange;
     },
-    getDetailUpdateData : function (detail,doc,type) {//type:installSection/feeRule
-        let installationFee = projectObj.project.installation_fee.getInstallationFeeByLibID(detail.libID);
-        let updateData = {
-            ID:installationFee.ID,
-            itemID:type=="installSection"?detail.ID:detail.feeRuleId,
-            type:type,
-            doc:doc
-        };
-        return updateData;
+    getRIShowData : function (ruleID,rationInstallation,data) {
+        if(ruleID==''){//选择的是无
+            data.code = '';
+            data.rule = '';
+            data.base = '';
+            data.feeRate = '';
+            data.labour = '';
+            data.material = '';
+            data.machine = '';
+            data.position = '';
+            data.billID = '';
+        }
+        let feeRule = projectObj.project.installation_fee.getFeeRuleByID(rationInstallation.libID,ruleID);
+        if(feeRule){
+            data.code = feeRule.code;
+            data.rule = feeRule.rule;
+            data.base = feeRule.base;
+            data.feeRate = feeRule.feeRate;
+            data.labour = feeRule.labour;
+            data.material = feeRule.material;
+            data.machine = feeRule.machine;
+            data.position = feeRule.position;
+            data.billID = feeRule.billID;
+        }
+        let feeItem = projectObj.project.installation_fee.getFeeItemByID(rationInstallation.libID,rationInstallation.feeItemId);
+        if(feeItem){
+            data.feeType = feeItem.feeType;
+        }
+        return data;
     },
-    getFeeItemUpdateData : function (item,doc) {
-        let updateData = {
-            ID:item.installFeeID,
-            itemID:item.ID,
-            type:'installFeeItem',
-            doc:doc
-        };
-        return updateData;
+    calcInstallationFee:function(){//计算定额安装费
+
+
+
+
     },
-    submitInstallationUpdate:function (updateData,callback) {
-        if(updateData){
-            CommonAjax.post('/installation/updateInstallationFee',{'projectID':projectInfoObj.projectInfo.ID,'updateData':updateData},function (data) {
-                callback(data);
-            })
-        }
-    }
 };
 
 
@@ -846,9 +1172,14 @@ $(function () {
         installationFeeObj.showMoreFeeRule();
     });
 
-   /* $('#calc_position').on('hidden.bs.modal',function () {
+    $('#modify_feeRule').on('shown.bs.modal',function () {
+        installationFeeObj.modifyEditedObj=null;//清空已编辑信息
+        if(installationFeeObj.modifyFeeRuleSpread == null){//修改规则表格初始化
+            installationFeeObj.initModifyFeeRuleSpread();
+        }
+        installationFeeObj.showModifyFeeRule();
+    });
 
-    });*/
     $('#positionSheetFilter').click(function (){
         installationFeeObj.positionSelectedObject = null;//清空选中记录
         installationFeeObj.filterSelectionNodes();
@@ -861,6 +1192,9 @@ $(function () {
     $('#select_position_confirm').click(function (){
         installationFeeObj.selectPositionConfirm();
     });
+    $('#modify_feeRule_confirm').click(function (){
+        installationFeeObj.confirmFeeRuleModify();
+    });
     $('#calc_installation_fee_confirm').click(function (){
         let me = installationFeeObj;
         let info = {
@@ -893,20 +1227,39 @@ $(function () {
     $('#more_feeRule_confirm').click(function (){
         let me = installationFeeObj;
         let selections = me.moreFeeRuleSheet.getSelections();
+        let from = $("#more_from").val();
         $('#more_feeRule').modal('hide');
         if(selections.length>0){
-            me.updateFeeRuleToSection(selections[0].row);
+            if(from =='feeDetail'){
+                me.updateFeeRuleToSection(selections[0].row);
+            }else if(from == 'rationInstallation'){//在定额安装增加费那里点击更多
+                me.updateFeeRuleToRInstall(selections[0].row);
+            }
         }else {
-            me.refreshFeeDetailRow(me.feeDetailSheet.getSelections()[0].row);
+            if(from =='feeDetail') {//在计取安装费那里点击更多
+                me.refreshFeeDetailRow(me.feeDetailSheet.getSelections()[0].row);
+            }else if(from == 'rationInstallation'){//在定额安装增加费那里点击更多
+                me.refreshRationInstallationRow(me.rationInstallSheet.getSelections()[0].row);
+            }
         }
     });
     $('#more_feeRule_concel').click(function () {
         let me = installationFeeObj;
-        me.refreshFeeDetailRow(me.feeDetailSheet.getSelections()[0].row);
+        let from = $("#more_from").val();
+        if(from =='feeDetail'){//在计取安装费那里点击更多
+            me.refreshFeeDetailRow(me.feeDetailSheet.getSelections()[0].row);
+        }else if(from == 'rationInstallation'){//在定额安装增加费那里点击更多
+            me.refreshRationInstallationRow(me.rationInstallSheet.getSelections()[0].row);
+        }
     });
+
     $('#more_feeRule_close').click(function () {
         let me = installationFeeObj;
-        me.refreshFeeDetailRow(me.feeDetailSheet.getSelections()[0].row);
+        let from = $("#more_from").val();
+        if(from =='feeDetail') {//在计取安装费那里点击更多
+            me.refreshFeeDetailRow(me.feeDetailSheet.getSelections()[0].row);
+        }else if(from == 'rationInstallation'){//在定额安装增加费那里点击更多
+            me.refreshRationInstallationRow(me.rationInstallSheet.getSelections()[0].row);
+        }
     });
-
 });

+ 27 - 3
web/building_saas/main/js/views/main_tree_col.js

@@ -156,7 +156,15 @@ let MainTreeCol = {
             return !(node.sourceType == ModuleNames.ration || !MainTreeCol.readOnly.billsParent(node));
         },
         forFeeRate: function (node) {
-            return MainTreeCol.readOnly.non_bills(node) || MainTreeCol.readOnly.billsParent(node) || MainTreeCol.readOnly.leafBillsWithDetail(node)
+            let readOnly = true;
+            let Bills = projectObj.project.Bills;
+            //只有当选中节点是清单,并且不属于“分部分项工程”或“技术措施项目”,并且是叶子清单且没有定额/量价/工料机时,费率列才可编辑
+            if(MainTreeCol.readOnly.bills(node)){
+                if(!Bills.isFBFX(node)&&!Bills.isTechMeasure(node)&&node.children.length<=0){//不属于“分部分项工程”或“技术措施项目”,并且是叶子清单且没有定额/量价/工料机
+                    readOnly = false;
+                }
+            }
+            return readOnly;
         },
         forQuantity: function (node) {
             if(node.sourceType === projectObj.project.Bills.getSourceType()){
@@ -185,6 +193,17 @@ let MainTreeCol = {
             }else {
                return calcTools.isRationItem(node);
             }
+        },
+        forContentCharacter: function (node) {
+            return !MainTreeCol.readOnly.bills(node) || (node.data.type !== billType.BILL && node.data.type !== billType.FX);
+        },
+        forRuleText: function (node) {
+            if(MainTreeCol.readOnly.bills(node)){
+                if(node.data.type === billType.FX || (node.data.type === billType.BILL && node.source.children.length === 0)){
+                    return false;
+                }
+            }
+            return true;
         }
     },
     cellType: {
@@ -310,6 +329,8 @@ let colSettingObj = {
     settingSpread: null,
     checkBox: new GC.Spread.Sheets.CellTypes.CheckBox(),
     loadSetting: function (sheet, setting) {
+        sheet.suspendPaint();
+        sheet.suspendEvent();
         sheet.setRowCount(setting.cols.length);
         sheet.setColumnCount(setting.headRows, GC.Spread.Sheets.SheetArea.rowHeader);
         sheet.setColumnCount(1);
@@ -329,14 +350,15 @@ let colSettingObj = {
                     sheet.addSpan(index, iCol, col.head.spanRows[i], col.head.spanCols[i], GC.Spread.Sheets.SheetArea.rowHeader);
                 }
                 iCol += col.head.spanRows[i];
-            }
-            ;
+            };
             let colWidth = sheet.getColumnWidth(index, GC.Spread.Sheets.SheetArea.rowHeader);
             colWidth = colWidth > col.width ? colWidth : col.width;
             //sheet.setColumnWidth(index, colWidth, GC.Spread.Sheets.SheetArea.rowHeader);
             cell = sheet.getCell(index, 0).value(col.visible);
             sheet.autoFitRow(index);
         });
+        sheet.resumeEvent();
+        sheet.resumePaint();
     },
     initSettingSpread: function () {
         this.settingSpread = SheetDataHelper.createNewSpread($('#col_setting_spread')[0], {sheetCount: 1});
@@ -358,6 +380,8 @@ $('#column').on('hide.bs.modal', function () {
         projectObj.project.projSetting.mainGridSetting.cols[iRow].visible = sheet.getValue(iRow, 0);
     }
     SheetDataHelper.refreshColumnVisible(projectObj.project.projSetting.mainGridSetting, projectObj.mainSpread.getActiveSheet());
+    //refresh nodes to autoFitRow
+    projectObj.mainController.refreshTreeNode(projectObj.project.mainTree.roots, true);
     projectObj.project.pushNow('editColSetting', projectObj.project.projSetting.moduleName, {
         projectID: projectObj.project.ID(),
         main_tree_col: projectObj.project.projSetting.main_tree_col

+ 103 - 26
web/building_saas/main/js/views/project_view.js

@@ -38,18 +38,19 @@ var projectObj = {
         // for test interface.  CSLAAAAA
         // projectObj.testDisplay('前四项累计值排除当前选中项' + projectObj.project.calcProgram.getBeforeTaxTotalFee([node]));
 
+        // 公式结果
+        /*        let t = projectObj.project.calcProgram.compiledTemplates[node.data.programID];
+                let c = t.calcItems[7];
+                c.dispExpr = '[定额基价人工费] + [定额基价材料费]  + F6 + [主材费]';
+                let rst = analyzer.analyzeUserExpr(t, c);
+                projectObj.testDisplay('结果', rst);*/
+
         // 基数
-/*        node.data.isSubcontract = true;
-        node.data.gljList = project.ration_glj.getGljArrByRation(node.data.ID);
-        let bname = '甲供定额基价材料费';
+        // node.data.isSubcontract = true;
+        /*node.data.gljList = project.ration_glj.getGljArrByRation(node.data.ID);
+        let bname = '甲定额基价材料费';
         projectObj.testDisplay(bname, rationCalcBases[bname](node));*/
 
-        // 公式结果
-/*        let t = projectObj.project.calcProgram.compiledTemplates[node.data.programID];
-        let c = t.calcItems[7];
-        c.dispExpr = '[定额基价人工费] + [定额基价材料费]  + F6 + [主材费]';
-        let rst = analyzer.analyzeUserExpr(t, c);
-        projectObj.testDisplay('结果', rst);*/
     },
     refreshBaseActn: function (tree) {
         let setButtonValid = function (valid, btn) {
@@ -199,6 +200,46 @@ var projectObj = {
             return this.checkCommonField(editingText, colSetting);
         }
     },
+    getVisibleRows: function (sRow, count) {
+        let rst = [];
+        let nodes = projectObj.project.mainTree.items;
+        for(let i = sRow, len = nodes.length; i < len; i++){
+            if(count <= 0){
+                break;
+            }
+            if(nodes[i].visible){
+                rst.push(i);
+                count--;
+            }
+        }
+        return rst;
+    },
+    //获取粘贴更改的单元格(粘贴时,跳过隐藏行)
+    checkSpreadChangedCells: function (info) {
+        let rst = {refreshRows: [], changedCells: []};
+        //获取显示行号
+        let vRows = projectObj.getVisibleRows(info.row, info.rowCount);
+        let vCount = vRows.length;
+        let lastRow = null, count = 0;
+        for(let cell of info.changedCells){
+            cell.text = info.sheet.getCell(cell.row, cell.col).text();
+            if(cell.row !== lastRow){
+                count++;
+                lastRow = cell.row;
+            }
+            if(count <= vCount){
+                if(vRows[count - 1] !== cell.row){
+                    rst.refreshRows.push(cell.row);
+                }
+                rst.changedCells.push({row: vRows[count - 1], col: cell.col, text: cell.text});
+            }
+            else {
+                rst.refreshRows.push(cell.row);
+            }
+        }
+        rst.refreshRows = Array.from(new Set(rst.refreshRows));
+        return rst;
+    },
     updateBillsCode: function (node, value) {
         let project = projectObj.project;
         let stdMatchCode, formatCode, matchs;
@@ -211,7 +252,9 @@ var projectObj = {
                 let libId = projectInfoObj.projectInfo.engineeringInfo.bill_lib[0].id;
                 CommonAjax.post('/stdBillsEditor/getStdBillsByCode', {userId: userID, billsLibId: libId, code: stdCode}, function (data) {
                     if (data) {
-                        data.itemCharacter = pageCCOprObj.safeItemCharater(data.itemCharacter);
+                        //data.itemCharacter = pageCCOprObj.safeItemCharater(data.itemCharacter);
+                        node.data.name = data.name;
+                        pageCCOprObj.setItemContentNode(node, data.jobContent, data.itemCharacter, node.data.name);
                         if (/\//.test(data.unit)) {
                             ConfirmModal.stdBillsUnit.check(data, function (std) {
                                 project.Bills.replaceBills(node.source, std, formatCode);
@@ -260,7 +303,7 @@ var projectObj = {
             alert('当前项目无定额库,请添加定额库。');
             this.mainController.refreshTreeNode([node], false);
         } else {
-            let libId = projectInfoObj.projectInfo.engineeringInfo.ration_lib[0].id;
+            let libId = parseInt($('#stdRationLibSelect').val());
             CommonAjax.post('/complementaryRation/api/getRationItem', {user_id: userID, rationRepId: libId, code: value}, function (data) {
                 if (data) {
                     projectObj.project.Ration.replaceRation(node.source, data);
@@ -277,7 +320,8 @@ var projectObj = {
         if (node.sourceType === project.Bills.getSourceType()) {
             this.updateBillsCode(node, value);   // 新清单不适合实时计算,下面套什么还不能确定,无数量计算也无意义
         } else if (node.sourceType === project.Ration.getSourceType()) {
-            this.updateRationCode(node, value);  // 新套定额适合实时计算
+            project.Ration.updateRationCodes([{'node':node,value:value}]);
+          //  this.updateRationCode(node, value);  // 新套定额适合实时计算
             // 这里因异步问题暂时缺少工料机价格。该过程移到:ration_glj.js的refreshAfterSave方法中。
             /*project.calcProgram.calcAndSave(node);
             if (activeSubSheetIs(subSheetIndex.ssiCalcProgram)) {
@@ -400,18 +444,38 @@ var projectObj = {
             projectObj.mainSpread.getActiveSheet().autoFitRow(info.row);
         }
     },
+    msClipboardChanged: function (sender, info) {
+        let colSettings = projectObj.mainController.setting.cols;
+        let cDatas = sheetCommonObj.getTableData(info.sheet, colSettings);
+        sheetCommonObj.copyTextToClipboard(cDatas);
+        return;
+    },
     mainSpreadRangeChanged: function (sender, info) {
         let project = projectObj.project, setting = projectObj.mainController.setting;
-        if (info.changedCells.length > 0) {
-            for (let changedCell of info.changedCells) {
-                let cell = info.sheet.getCell(changedCell.row, changedCell.col);
+        let changedObj = projectObj.checkSpreadChangedCells(info);
+        let refreshNodes = [];
+        for(let row of changedObj.refreshRows){
+            refreshNodes.push(project.mainTree.items[row]);
+        }
+        let updateRationCodes = [];//更新定额编码时要用同步的方式
+        if(changedObj.changedCells.length > 0){
+            for (let changedCell of changedObj.changedCells) {
                 let node = project.mainTree.items[changedCell.row];
                 let colSetting = setting.cols[changedCell.col];
-                let value = projectObj.checkSpreadEditingText(cell.text(), colSetting);
-
-                projectObj.updateCellValue(node, value, colSetting);
+                let value = projectObj.checkSpreadEditingText(changedCell.text, colSetting)
+                if(colSetting.data.field=='code'&& node.sourceType == project.Ration.getSourceType()&&node.data.type==rationType.ration){//如果是更新定额的编码
+                    updateRationCodes.push({'node':node,value:value});
+                }else {
+                    projectObj.updateCellValue(node, value, colSetting,changedCell.text);
+                }
             }
         }
+        if(updateRationCodes.length>0){
+            project.Ration.updateRationCodes(updateRationCodes);
+        }
+        if(refreshNodes.length > 0){
+            projectObj.mainController.refreshTreeNode(refreshNodes);
+        }
     },
     checkMainSpread: function () {
         if (!this.mainSpread) {
@@ -499,7 +563,7 @@ var projectObj = {
                 that.mainSpread.bind(GC.Spread.Sheets.Events.EditStarting, that.mainSpreadEditStarting);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.EditEnded, that.mainSpreadEditEnded);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.RangeChanged, that.mainSpreadRangeChanged);
-                that.mainSpread.bind(GC.Spread.Sheets.Events.SelectionChanged, that.amountAreaNumber);
+                that.mainSpread.bind(GC.Spread.Sheets.Events.ClipboardChanged, that.msClipboardChanged);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.ButtonClicked, that.onButtonClick);
                 that.loadMainSpreadContextMenu();
                 that.loadFocusLocation();
@@ -637,7 +701,8 @@ var projectObj = {
                         return project.Ration.addRationChecking(selected);  // Vincent, 2018-01-02
                     },
                     callback: function (key, opt) {
-                        ProjectController.addRation(project, controller, rationType.ration);
+                        project.Ration.addNewRation(null,rationType.ration);
+                       // ProjectController.addRation(project, controller, rationType.ration);
                     },
                     visible: function(key, opt){
                         var selected = project.mainTree.selected;
@@ -659,7 +724,8 @@ var projectObj = {
                         return project.Ration.addRationChecking(selected);  // Vincent, 2018-01-02
                     },
                     callback: function (key, opt) {
-                        ProjectController.addRation(project, controller, rationType.volumePrice);
+                        project.Ration.addNewRation(null,rationType.volumePrice);
+                       // ProjectController.addRation(project, controller, rationType.volumePrice);
                     },
                     visible: function(key, opt){
                         var selected = project.mainTree.selected;
@@ -739,7 +805,12 @@ var projectObj = {
                         return !ifCanDelete();
                     },
                     callback: function () {
-                        $("#delete_row").modal({show:true});//弹出删除提示框;
+                        var selected = project.mainTree.selected;
+                        if(selected.sourceType == project.Bills.getSourceType()&&selected.data.type==billType.FB&&selected.children.length<=0){//选中的是分部,并且没有子项,直接删除
+                            project.Bills.deleteSelectedNode();
+                        }else {
+                            $("#delete_row").modal({show:true});//弹出删除提示框;
+                        }
                     }
                 },
                 "spr2":'--------',
@@ -1019,7 +1090,13 @@ $('#insert').click(function () {
 });
 
 $('#delete').click(function () {
-    $("#delete_row").modal({show:true});//弹出删除提示框;
+    let project = projectObj.project;
+    let selected = project.mainTree.selected;
+    if(selected.sourceType == project.Bills.getSourceType()&&selected.data.type==billType.FB&&selected.children.length<=0){//选中的是分部,并且没有子项,直接删除
+        project.Bills.deleteSelectedNode();
+    }else {
+        $("#delete_row").modal({show:true});//弹出删除提示框;
+    }
 });
 
 $('#upLevel').click(function () {
@@ -1210,17 +1287,17 @@ $('#property_ok').click(function () {
 $('#delete_row').on('shown.bs.modal', function (e) {
     var controller = projectObj.mainController, project = projectObj.project;
     var selected = controller.tree.selected, parent = selected.parent;
-    var showinfo = "确认要删除当前选中行吗?";
+    var showinfo = "<label>确认要删除当前选中行吗?</label>";
     var showN = false;
     var cancelText = "否";
     if(selected.sourceType == project.Bills.getSourceType()&&selected.data.type==billType.FB&&selected.children.length>0){//选中的是分部,并且有子项
         if(isSingleSelect()||selectionChecking()){
-            showinfo = "是否删除其下的子项?";
+            showinfo = "<label>是否删除其下的子项?</label><br><label>【是】则删除分部行及其下的所有子项,</label><br><label>【否】则仅删除当前分部行,子项保留,</label><br><label>【取消】则取消删除</label>";
             showN = true;
             cancelText = "取消";
         }
     }
-    $('#delete_showinfo').text(showinfo);
+    $('#delete_showinfo').html(showinfo);
     showN==true? $('#deleteN').show():$('#deleteN').hide();
     $('#deleteCancel').text(cancelText);
 

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

@@ -99,13 +99,11 @@ var rationLibObj = {
     onRationSpreadCellDoubleClick: function (sender, args) {
         var select = $('#stdRationLibSelect'), rationCode = args.sheet.getText(args.row, 0);
         if (rationCode !== '') {
-            CommonAjax.post('/complementaryRation/api/getRationItem', {user_id: userID, rationRepId: select.val(), code: rationCode}, function (data) {
-                ProjectController.addRation(projectObj.project, projectObj.mainController, rationType.ration, data);
-            });
+            projectObj.project.Ration.addNewRation({userID: userID, rationRepId: select.val(), code: rationCode},rationType.ration);
         }
     },
     loadStdRationContextMenu: function () {
-        let rationSpread = rationLibObj.sectionRationsSpread, rationSheet = rationSpread.getActiveSheet();
+        let rationSpread = rationLibObj.sectionRationsSpread, rationSheet = rationSpread.getActiveSheet(),  rationModel = projectObj.project.Ration;;
         $.contextMenu({
             selector: '#stdSectionRations',
             build: function ($trigger, e) {
@@ -120,9 +118,7 @@ var rationLibObj = {
                         let select = $('#stdRationLibSelect'), rationSelect = rationSheet.getSelections();
                         let rationCode = rationSelect.length > 0 ? rationSheet.getText(rationSelect[0].row, 0) : '';
                         if (rationCode !== '') {
-                            CommonAjax.post('/complementaryRation/api/getRationItem', {user_id: userID, rationRepId: select.val(), code: rationCode}, function (data) {
-                                ProjectController.addRation(projectObj.project, projectObj.mainController, rationType.ration, data);
-                            });
+                            rationModel.addNewRation({userID: userID, rationRepId: select.val(), code: rationCode},rationType.ration);
                         }
                     }
                 },
@@ -132,10 +128,9 @@ var rationLibObj = {
                     callback: function (key, opt) {
                         let select = $('#stdRationLibSelect'), rationSelect = rationSheet.getSelections();
                         let rationCode = rationSelect.length > 0 ? rationSheet.getText(rationSelect[0].row, 0) : '';
-                        if (rationCode !== '') {
-                            CommonAjax.post('/complementaryRation/api/getRationItem', {user_id: userID, rationRepId: select.val(), code: rationCode}, function (data) {
-                                ProjectController.replaceRation(projectObj.project, projectObj.mainController, data);
-                            });
+                        let mainTreeSelected = projectObj.project.mainTree.selected;
+                        if (rationCode !== ''&&mainTreeSelected&&mainTreeSelected.sourceType == rationModel.getSourceType()) {
+                            rationModel.updateRationCodes([{'node':mainTreeSelected,value:rationCode}]);
                         }
                     }
                 },

+ 15 - 13
web/building_saas/main/js/views/sub_view.js

@@ -31,6 +31,10 @@ SheetDataHelper.protectdSheet(subSpread.getSheet(1));
 gljOprObj.initDetailSheet(subSpread.getSheet(3));
 SheetDataHelper.protectdSheet(subSpread.getSheet(3));
 
+//安装增加费
+installationFeeObj.initRationInstallSheet(subSpread.getSheet(5));
+SheetDataHelper.protectdSheet(subSpread.getSheet(5));
+gljContextMenu.loadGLJSpreadContextMenu();
 
 $("#linkGLJ").click(function(){
     $("#subItems").children().hide();//控制显示subSpread,隐藏特征及内容spread
@@ -38,8 +42,6 @@ $("#linkGLJ").click(function(){
     pageCCOprObj.active = false;
     refreshSubSpread();
     subSpread.setActiveSheetIndex(0);
-    $.contextMenu( 'destroy', "#subSpread" );
-    gljContextMenu.loadGLJSpreadContextMenu();
     gljOprObj.activeTab='#linkGLJ';
     // for test
     //subSpread.getActiveSheet().setValue(0, 0, "工料机");
@@ -51,10 +53,7 @@ $("#linkFZDE").click(function(){
     pageCCOprObj.active = false;
     refreshSubSpread();
     subSpread.setActiveSheetIndex(1);
-    $.contextMenu( 'destroy', "#subSpread" );
     gljOprObj.activeTab='#linkFZDE';
-    // for test
-  //  subSpread.getActiveSheet().setValue(0, 0, "辅助定额");
 });
 $("#linkFZTJ").click(function(){
     $("#subItems").children().hide();
@@ -62,10 +61,18 @@ $("#linkFZTJ").click(function(){
     pageCCOprObj.active = false;
     refreshSubSpread();
     subSpread.setActiveSheetIndex(2);
-    $.contextMenu( 'destroy', "#subSpread" );
     gljOprObj.activeTab='#linkFZTJ';
-    // for test
-    //subSpread.getActiveSheet().setValue(0, 0, "附注条件");
+});
+
+
+
+$("#linkAZZJF").click(function(){
+    $("#subItems").children().hide();
+    $("#subSpread").show();
+    pageCCOprObj.active = false;
+    refreshSubSpread();
+    subSpread.setActiveSheetIndex(5);
+    gljOprObj.activeTab='#linkAZZJF';
 });
 
 $("#linkGCLMX").click(function(){
@@ -74,15 +81,10 @@ $("#linkGCLMX").click(function(){
     pageCCOprObj.active = false;
     refreshSubSpread();
     subSpread.setActiveSheetIndex(3);
-    $.contextMenu( 'destroy', "#subSpread" );
-    gljContextMenu.loadQuantityDetailMenu();
     gljOprObj.activeTab='#linkGCLMX';
-    // for test
-    //subSpread.getActiveSheet().setValue(0, 0, "工程量明细");
 });
 
 $("#linkJSCX").click(function(){        // 计算程序
-    $.contextMenu( 'destroy', "#subSpread" );
     $("#subItems").children().hide();
     $("#subSpread").show();
     pageCCOprObj.active = false;

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

@@ -75,8 +75,8 @@ let zlfb_object={
             let first_FX_ID = -1;
             if(FB_nodes.length>0){
                 updateData.delete = me.getDeleteData(FB_nodes);
-                Bill.deleteAllFBNodes();
             }
+            Bill.deleteAllSubNodes();//在造价书树结构上先删除所有节点
             if(resort){
                 FX_nodes = _.sortBy(FX_nodes,'data.code');
             }