浏览代码

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

Conflicts:
	web/building_saas/main/js/views/character_content_view.js
zhongzewei 7 年之前
父节点
当前提交
e5c822f0a6
共有 41 个文件被更改,包括 2611 次插入977 次删除
  1. 3 3
      modules/glj/models/glj_list_model.js
  2. 12 6
      modules/glj/models/unit_price_model.js
  3. 18 3
      modules/main/controllers/bills_controller.js
  4. 3 2
      modules/main/models/bills.js
  5. 1 16
      modules/main/models/bills_sub_schemas.js
  6. 173 107
      modules/pm/models/project_model.js
  7. 6 1
      modules/pm/models/project_property_template.js
  8. 441 415
      modules/ration_glj/facade/ration_glj_facade.js
  9. 2 2
      modules/reports/rpt_component/helper/jpc_helper_area.js
  10. 53 3
      modules/reports/rpt_component/jpc_flow_tab.js
  11. 2 2
      modules/reports/util/rpt_construct_data_util.js
  12. 3 0
      test/unit/reports/test_cover_01.js
  13. 3 0
      test/unit/reports/test_cover_02.js
  14. 170 0
      test/unit/reports/test_tpl_09.js
  15. 4 0
      test/unit/reports/test_tpl_09_1.js
  16. 505 0
      web/building_saas/complementary_ration_lib/html/dinge.html
  17. 159 0
      web/building_saas/complementary_ration_lib/html/fuzhu.html
  18. 283 0
      web/building_saas/complementary_ration_lib/html/gongliao.html
  19. 43 0
      web/building_saas/complementary_ration_lib/js/global.js
  20. 33 0
      web/building_saas/complementary_ration_lib/js/main.js
  21. 6 0
      web/building_saas/css/main.css
  22. 26 0
      web/building_saas/glj/js/common_spread.js
  23. 2 2
      web/building_saas/glj/js/composition.js
  24. 8 3
      web/building_saas/glj/js/composition_spread.js
  25. 30 3
      web/building_saas/glj/js/project_glj.js
  26. 69 63
      web/building_saas/glj/js/project_glj_spread.js
  27. 23 4
      web/building_saas/main/html/main.html
  28. 2 2
      web/building_saas/main/js/main.js
  29. 6 7
      web/building_saas/main/js/models/calc_program.js
  30. 9 0
      web/building_saas/main/js/models/main_consts.js
  31. 132 101
      web/building_saas/main/js/models/project_glj.js
  32. 9 10
      web/building_saas/main/js/models/ration_glj.js
  33. 130 158
      web/building_saas/main/js/views/character_content_view.js
  34. 125 35
      web/building_saas/main/js/views/glj_view.js
  35. 44 14
      web/building_saas/main/js/views/project_property_display_view.js
  36. 10 4
      web/building_saas/main/js/views/project_view.js
  37. 2 1
      web/building_saas/main/js/views/std_bills_lib.js
  38. 25 6
      web/building_saas/main/js/views/sub_view.js
  39. 6 4
      web/building_saas/pm/js/pm_main.js
  40. 16 0
      web/building_saas/report/html/rpt_main.html
  41. 14 0
      web/building_saas/report/js/rpt_main.js

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

@@ -163,10 +163,10 @@ class GLJListModel extends BaseModel {
                     }else {
                     }else {
                         mixRationMap[t_index]=[tmp];
                         mixRationMap[t_index]=[tmp];
                     }
                     }
-                    if (mixRatioConnectData[tmp.glj_id] !== undefined) {
-                        mixRatioConnectData[tmp.glj_id].push(tmp.connect_key);
+                    if (mixRatioConnectData[m_index] !== undefined) {
+                        mixRatioConnectData[m_index].push(tmp.connect_key);
                     } else {
                     } else {
-                        mixRatioConnectData[tmp.glj_id] = [tmp.connect_key];
+                        mixRatioConnectData[m_index] = [tmp.connect_key];
                     }
                     }
                 }
                 }
             }
             }

+ 12 - 6
modules/glj/models/unit_price_model.js

@@ -86,10 +86,10 @@ class UnitPriceModel extends BaseModel {
             return [null, false];
             return [null, false];
         }
         }
         // 先查找是否有原始code相同的记录
         // 先查找是否有原始code相同的记录
-        let unitPriceData = await this.findDataByCondition({original_code: data.original_code, unit_price_file_id: unitPriceFileId}, null, false);
+        let unitPriceData = await this.db.model.find({original_code: data.original_code, unit_price_file_id: unitPriceFileId}).sort('code').exec();
         // 如果有记录,判断是否存在一样的名称,单位...等,有则直接返回数据
         // 如果有记录,判断是否存在一样的名称,单位...等,有则直接返回数据
         let unitPrice=null;
         let unitPrice=null;
-        if(operation=='add'){//新增操作时,要把code也一起判断,是否完全一样
+        if(operation=='add'){//新增操作时,要把code也一起判断,是否完全一样。(新增的时候有可能存在编码一样,但是名称规格等不一样的情况,这种情况的话编码不用改变)
             unitPrice =  this.isPropertyInclude(unitPriceData,['code','name','specs','unit','type'],data);
             unitPrice =  this.isPropertyInclude(unitPriceData,['code','name','specs','unit','type'],data);
         }else {//修改操作时,code不用加入判断,因为code是需要改变的
         }else {//修改操作时,code不用加入判断,因为code是需要改变的
             unitPrice =  this.isPropertyInclude(unitPriceData,['name','specs','unit','type'],data);
             unitPrice =  this.isPropertyInclude(unitPriceData,['name','specs','unit','type'],data);
@@ -123,7 +123,7 @@ class UnitPriceModel extends BaseModel {
             insertData.is_add=1;
             insertData.is_add=1;
         }
         }
 
 
-        if (unitPriceData&&unitPriceData.length>0) {// 如果原始编码能找到,但不存在一样的编号,名称,单位.型号等,更改code和添加新增标记
+        if (unitPriceData&&unitPriceData.length>0&&operation!='add') {// 如果原始编码能找到,但不存在一样的编号,名称,单位.型号等,更改code和添加新增标记,新增的时候除外。新增的情况下能到这一步说明有存在编码一致但其它属性不一致的情况,所以不用更改编码
             insertData.code = data.original_code+"-"+unitPriceData.length;
             insertData.code = data.original_code+"-"+unitPriceData.length;
             insertData.is_add=1;
             insertData.is_add=1;
         }
         }
@@ -219,14 +219,20 @@ class UnitPriceModel extends BaseModel {
         // 额外更新数据
         // 额外更新数据
         if (extend !== '') {
         if (extend !== '') {
             extend = JSON.parse(extend);
             extend = JSON.parse(extend);
-            for (let code in extend) {
+            let indexList = ['code','name','specs','unit','type'];
+            for (let conKey in extend) {
                 let extendUpdateData = {
                 let extendUpdateData = {
-                    market_price: extend[code].market_price,
+                    market_price: extend[conKey].market_price,
                 };
                 };
                 let tmpCondition = {
                 let tmpCondition = {
                     unit_price_file_id: unitPriceData.unit_price_file_id,
                     unit_price_file_id: unitPriceData.unit_price_file_id,
-                    code: code
                 };
                 };
+                let keyList = conKey.split("|-|");
+                for(let i = 1;i<keyList.length;i++){
+                    if(keyList[i]!='null'){
+                        tmpCondition[indexList[i]]=keyList[i];
+                    }
+                }
                 let extendResult = await this.db.update(tmpCondition, extendUpdateData);
                 let extendResult = await this.db.update(tmpCondition, extendUpdateData);
                 if (!extendResult) {
                 if (!extendResult) {
                     throw '更新额外数据,编码为' + code + '的数据失败!';
                     throw '更新额外数据,编码为' + code + '的数据失败!';

+ 18 - 3
modules/main/controllers/bills_controller.js

@@ -2,7 +2,7 @@
  * Created by jimiz on 2017/4/7.
  * Created by jimiz on 2017/4/7.
  */
  */
 var billsData = require('../models/bills');
 var billsData = require('../models/bills');
-
+let ProjectsData = require('../../pm/models/project_model').project;
 //统一回调函数
 //统一回调函数
 var callback = function(req, res, err, message, data){
 var callback = function(req, res, err, message, data){
     res.json({error: err, message: message, data: data});
     res.json({error: err, message: message, data: data});
@@ -54,9 +54,24 @@ module.exports = {
         const data = JSON.parse(request.body.data);
         const data = JSON.parse(request.body.data);
         const findSet = data.findSet;
         const findSet = data.findSet;
         const updateData = data.updateData;
         const updateData = data.updateData;
+        let settingData = {};
+        // 筛选出要保存在项目属性的设置
+        for (const index in updateData) {
+            if (updateData[index].field === 'addRule') {
+                settingData = updateData[index].value;
+                delete updateData[index];
+            }
+        }
+        // 更新项目属性
+        const propertyUpdateData = {
+            property: 'addRule',
+            data: settingData
+        };
+        const projectResult = await ProjectsData.updateProjectProperty(findSet.projectID, propertyUpdateData);
+
         const result = await billsData.updateBill(findSet, updateData);
         const result = await billsData.updateBill(findSet, updateData);
-        const message = !result ? '修改失败' : '修改成功';
-        const err = !result ? 1 : 0;
+        const message = !result || !projectResult ? '修改失败' : '修改成功';
+        const err = !result || !projectResult ? 1 : 0;
         callback(request, response, err, message, null);
         callback(request, response, err, message, null);
     }
     }
 
 

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

@@ -61,8 +61,6 @@ let billsSchema = new Schema({
     // 标记字段
     // 标记字段
     flags: [subSchema.flagsSchema],
     flags: [subSchema.flagsSchema],
     deleteInfo: deleteSchema,
     deleteInfo: deleteSchema,
-    // 添加规则
-    addRule: subSchema.addRuleSchema,
 });
 });
 
 
 let bills = db.model("bills", billsSchema);
 let bills = db.model("bills", billsSchema);
@@ -152,6 +150,9 @@ class billsModel extends baseModel {
         }
         }
 
 
         for (const tmp of updateData) {
         for (const tmp of updateData) {
+            if (tmp === undefined) {
+                continue;
+            }
             update[tmp.field] = tmp.value;
             update[tmp.field] = tmp.value;
         }
         }
 
 

+ 1 - 16
modules/main/models/bills_sub_schemas.js

@@ -44,20 +44,5 @@ let itemCharacterSchema = new Schema({
     eigenvalue: [eigenvalueSchema],//特征值
     eigenvalue: [eigenvalueSchema],//特征值
     isChecked: Boolean //是否勾选(输出)
     isChecked: Boolean //是否勾选(输出)
 }, {_id: false});
 }, {_id: false});
-// 添加规则字段
-let addRuleSchema = new Schema({
-    // 添加位置
-    position: Number,
-    // 添加内容
-    addContent: Number,
-    // 显示格式
-    displayFormat: Number,
-    // 特征生成方式
-    characterFormat: Number,
-    // 子目生成方式
-    childDisplayFormat: Number,
-    // 序号格式
-   serialType: Number,
-}, {_id: false});
 
 
-module.exports = {feesSchema: feesSchema, flagsSchema: flagsSchema, jobContentSchema: jobContentSchema, itemCharacterSchema: itemCharacterSchema, addRuleSchema};
+module.exports = {feesSchema: feesSchema, flagsSchema: flagsSchema, jobContentSchema: jobContentSchema, itemCharacterSchema: itemCharacterSchema};

+ 173 - 107
modules/pm/models/project_model.js

@@ -5,7 +5,14 @@ import mongoose from 'mongoose';
 import async_c from 'async';
 import async_c from 'async';
 import UnitPriceFileModel from "../../glj/models/unit_price_file_model";
 import UnitPriceFileModel from "../../glj/models/unit_price_file_model";
 import UnitPriceFiles from '../../glj/models/schemas/unit_price_file';
 import UnitPriceFiles from '../../glj/models/schemas/unit_price_file';
-import {defaultDecimal, billsQuantityDecimal, basicInformation, projectFeature,displaySetting} from './project_property_template';
+import {
+    defaultDecimal,
+    billsQuantityDecimal,
+    basicInformation,
+    projectFeature,
+    displaySetting,
+    calcOptions
+} from './project_property_template';
 import fixedFlag from '../../common/const/bills_fixed';
 import fixedFlag from '../../common/const/bills_fixed';
 let FeeRateFiles = mongoose.model('fee_rate_file');
 let FeeRateFiles = mongoose.model('fee_rate_file');
 let counter = require("../../../public/counter/counter.js");
 let counter = require("../../../public/counter/counter.js");
@@ -30,25 +37,36 @@ let fileType = {
     feeRateFile: 'FeeRateFile'
     feeRateFile: 'FeeRateFile'
 };
 };
 
 
-let ProjectsDAO = function(){};
+let ProjectsDAO = function () {
+};
 
 
-ProjectsDAO.prototype.getUserProjects = async function(userId, compilation, callback){
+ProjectsDAO.prototype.getUserProjects = async function (userId, compilation, callback) {
     try {
     try {
-        let projects = await Projects.find({'$or': [{'userID': userId, 'compilation': compilation, 'deleteInfo': null}, {'userID': userId, 'compilation': compilation, 'deleteInfo.deleted': {'$in': [null, false]}}]}, '-_id');
-        for(let i = 0 , len = projects.length; i < len; i++){
+        let projects = await Projects.find({
+            '$or': [{
+                'userID': userId,
+                'compilation': compilation,
+                'deleteInfo': null
+            }, {'userID': userId, 'compilation': compilation, 'deleteInfo.deleted': {'$in': [null, false]}}]
+        }, '-_id');
+        for (let i = 0, len = projects.length; i < len; i++) {
             let proj = projects[i];
             let proj = projects[i];
-            let engineeringCost = await BillsModel.find({projectID: proj.ID, 'flags.flag': fixedFlag.ENGINEERINGCOST, 'fees.totalFee': {$exists:  true}});
+            let engineeringCost = await BillsModel.find({
+                projectID: proj.ID,
+                'flags.flag': fixedFlag.ENGINEERINGCOST,
+                'fees.totalFee': {$exists: true}
+            });
             proj._doc.engineeringCost = engineeringCost.length > 0 ? engineeringCost[0].fees[0].totalFee : 0;
             proj._doc.engineeringCost = engineeringCost.length > 0 ? engineeringCost[0].fees[0].totalFee : 0;
         }
         }
         callback(0, '', projects);
         callback(0, '', projects);
     }
     }
-    catch (err){
+    catch (err) {
         callback(1, 'Error', null);
         callback(1, 'Error', null);
     }
     }
 };
 };
 
 
 ProjectsDAO.prototype.getUserProject = function (userId, ProjId, callback) {
 ProjectsDAO.prototype.getUserProject = function (userId, ProjId, callback) {
-    Projects.findOne({userID: userId, ID: ProjId}, '-_id', function(err, template){
+    Projects.findOne({userID: userId, ID: ProjId}, '-_id', function (err, template) {
         if (err) {
         if (err) {
             callback(1, '找不到标段数据', null);
             callback(1, '找不到标段数据', null);
         } else {
         } else {
@@ -57,22 +75,22 @@ ProjectsDAO.prototype.getUserProject = function (userId, ProjId, callback) {
     });
     });
 }
 }
 
 
-ProjectsDAO.prototype.updateUserProjects = async function(userId, compilationId, datas, callback){
+ProjectsDAO.prototype.updateUserProjects = async function (userId, compilationId, datas, callback) {
     let data, project, updateLength = 0, hasError = false, deleteInfo = null, i, newProject;
     let data, project, updateLength = 0, hasError = false, deleteInfo = null, i, newProject;
     let updateAll = function (err) {
     let updateAll = function (err) {
-            if (!err){
-                updateLength += 1;
-                if (updateLength === datas.length) {
-                    callback(0, '', datas);
-                }
-            } else {
-                hasError = true;
-                console.log(err);
-                callback(1, '提交数据出错.', null);
+        if (!err) {
+            updateLength += 1;
+            if (updateLength === datas.length) {
+                callback(0, '', datas);
             }
             }
-        };
-    if (datas){
-        for (i = 0; i < datas.length && !hasError; i++){
+        } else {
+            hasError = true;
+            console.log(err);
+            callback(1, '提交数据出错.', null);
+        }
+    };
+    if (datas) {
+        for (i = 0; i < datas.length && !hasError; i++) {
             data = datas[i];
             data = datas[i];
             if (data.updateData.name !== undefined) {
             if (data.updateData.name !== undefined) {
                 data.updateData.name = data.updateData.name.trim();
                 data.updateData.name = data.updateData.name.trim();
@@ -103,7 +121,7 @@ ProjectsDAO.prototype.updateUserProjects = async function(userId, compilationId,
                     }
                     }
                     data.updateData.property.unitPriceFile.id = addResult.id;
                     data.updateData.property.unitPriceFile.id = addResult.id;
                 }
                 }
-                if(data.updateData.projType === projectType.tender){
+                if (data.updateData.projType === projectType.tender) {
                     //小数位数
                     //小数位数
                     data.updateData.property.decimal = defaultDecimal;
                     data.updateData.property.decimal = defaultDecimal;
                     //清单工程量精度
                     //清单工程量精度
@@ -114,10 +132,13 @@ ProjectsDAO.prototype.updateUserProjects = async function(userId, compilationId,
                     //工程特征
                     //工程特征
                     data.updateData.property.projectFeature = projectFeature;
                     data.updateData.property.projectFeature = projectFeature;
                     //呈现选项
                     //呈现选项
-		    data.updateData.property.displaySetting = displaySetting;
-		    
+                    data.updateData.property.displaySetting = displaySetting;
+
                     data.updateData.property.billsCalcMode = 0;
                     data.updateData.property.billsCalcMode = 0;
-		    data.updateData.property.zanguCalcMode = 0;
+                    data.updateData.property.zanguCalcMode = 0;
+                    //计算选项
+                    data.updateData.property.calcOptions = calcOptions
+
                 }
                 }
                 newProject = new Projects(data.updateData);
                 newProject = new Projects(data.updateData);
                 // 查找同级是否存在同名数据
                 // 查找同级是否存在同名数据
@@ -126,9 +147,9 @@ ProjectsDAO.prototype.updateUserProjects = async function(userId, compilationId,
                     callback(1, '同级目录已存在相同名称数据.', null);
                     callback(1, '同级目录已存在相同名称数据.', null);
                     return;
                     return;
                 }
                 }
-                if(data.updateData.projType==='Tender'){
-                    let  feeRateFileID = await feeRateFacade.newFeeRateFile(userId, data.updateData);
-                    newProject.property.feeFile = feeRateFileID?feeRateFileID:-1;
+                if (data.updateData.projType === 'Tender') {
+                    let feeRateFileID = await feeRateFacade.newFeeRateFile(userId, data.updateData);
+                    newProject.property.feeFile = feeRateFileID ? feeRateFileID : -1;
 
 
                     // 新建人工系数文件 CSL, 2017.10.13
                     // 新建人工系数文件 CSL, 2017.10.13
                     let lcFile = await labourCoeFacade.newProjectLabourCoe(data.updateData);
                     let lcFile = await labourCoeFacade.newProjectLabourCoe(data.updateData);
@@ -153,22 +174,28 @@ ProjectsDAO.prototype.updateUserProjects = async function(userId, compilationId,
                 data.updateData['deleteInfo'] = deleteInfo;
                 data.updateData['deleteInfo'] = deleteInfo;
                 //Projects.update({userID: userId, ID: data.updateData.ID}, data.updateData, updateAll);
                 //Projects.update({userID: userId, ID: data.updateData.ID}, data.updateData, updateAll);
                 //update
                 //update
-                try{
-                    if(data.updateData.projType === projectType.project){
+                try {
+                    if (data.updateData.projType === projectType.project) {
                         let engineerings = await Projects.find({userID: userId, ParentID: data.updateData.ID});
                         let engineerings = await Projects.find({userID: userId, ParentID: data.updateData.ID});
                         let isExist = false;
                         let isExist = false;
-                        if(engineerings.length > 0){
-                            for(let j = 0, jLen = engineerings.length; j < jLen; j++){
+                        if (engineerings.length > 0) {
+                            for (let j = 0, jLen = engineerings.length; j < jLen; j++) {
                                 let e_tenders = await Projects.find({userID: userId, ParentID: engineerings[j].ID});
                                 let e_tenders = await Projects.find({userID: userId, ParentID: engineerings[j].ID});
-                                if(e_tenders.length > 0){
+                                if (e_tenders.length > 0) {
                                     isExist = true;
                                     isExist = true;
                                     break;
                                     break;
                                 }
                                 }
                             }
                             }
                         }
                         }
-                        if(isExist){//fake
-                            await UnitPriceFiles.update({user_id: userId, root_project_id: data.updateData.ID}, {$set: {deleteInfo: deleteInfo}}, {multi: true});
-                            await FeeRateFiles.update({userID: userId, rootProjectID: data.updateData.ID}, {$set: {deleteInfo: deleteInfo}}, {multi: true});
+                        if (isExist) {//fake
+                            await UnitPriceFiles.update({
+                                user_id: userId,
+                                root_project_id: data.updateData.ID
+                            }, {$set: {deleteInfo: deleteInfo}}, {multi: true});
+                            await FeeRateFiles.update({
+                                userID: userId,
+                                rootProjectID: data.updateData.ID
+                            }, {$set: {deleteInfo: deleteInfo}}, {multi: true});
                             await Projects.update({userID: userId, ID: data.updateData.ID}, data.updateData, updateAll);
                             await Projects.update({userID: userId, ID: data.updateData.ID}, data.updateData, updateAll);
                         }
                         }
                         else {//true
                         else {//true
@@ -178,9 +205,9 @@ ProjectsDAO.prototype.updateUserProjects = async function(userId, compilationId,
                             await Projects.remove({userID: userId, ID: data.updateData.ID}, updateAll);
                             await Projects.remove({userID: userId, ID: data.updateData.ID}, updateAll);
                         }
                         }
                     }
                     }
-                    else if(data.updateData.projType === projectType.engineering){
+                    else if (data.updateData.projType === projectType.engineering) {
                         let tenders = await Projects.find({userID: userId, ParentID: data.updateData.ID});
                         let tenders = await Projects.find({userID: userId, ParentID: data.updateData.ID});
-                        if(tenders.length > 0){//fake
+                        if (tenders.length > 0) {//fake
                             await Projects.update({userID: userId, ID: data.updateData.ID}, data.updateData, updateAll);
                             await Projects.update({userID: userId, ID: data.updateData.ID}, data.updateData, updateAll);
                         }
                         }
                         else {//true
                         else {//true
@@ -188,15 +215,15 @@ ProjectsDAO.prototype.updateUserProjects = async function(userId, compilationId,
                             await Projects.remove({userID: userId, ID: data.updateData.ID}, updateAll);
                             await Projects.remove({userID: userId, ID: data.updateData.ID}, updateAll);
                         }
                         }
                     }
                     }
-                    else if(data.updateData.projType === projectType.tender){//fake
+                    else if (data.updateData.projType === projectType.tender) {//fake
                         await Projects.update({userID: userId, ID: data.updateData.ID}, data.updateData, updateAll);
                         await Projects.update({userID: userId, ID: data.updateData.ID}, data.updateData, updateAll);
                     }
                     }
-                    else if(data.updateData.projType === projectType.folder){//true
+                    else if (data.updateData.projType === projectType.folder) {//true
                         await Projects.remove({userID: userId, ID: data.updateData.ID}, updateAll);
                         await Projects.remove({userID: userId, ID: data.updateData.ID}, updateAll);
                     }
                     }
                     else throw '未知文件类型,删除失败!';
                     else throw '未知文件类型,删除失败!';
                 }
                 }
-                catch (error){
+                catch (error) {
                     callback(1, error, null);
                     callback(1, error, null);
                 }
                 }
             }
             }
@@ -208,29 +235,38 @@ ProjectsDAO.prototype.updateUserProjects = async function(userId, compilationId,
     }
     }
 };
 };
 
 
-ProjectsDAO.prototype.udpateUserFiles = async function (userId, datas, callback){
+ProjectsDAO.prototype.udpateUserFiles = async function (userId, datas, callback) {
     let updateType = {update: 'update', delete: 'delete'};
     let updateType = {update: 'update', delete: 'delete'};
     let deleteInfo = Object.create(null);
     let deleteInfo = Object.create(null);
     deleteInfo.deleted = true;
     deleteInfo.deleted = true;
     deleteInfo.deleteBy = userId;
     deleteInfo.deleteBy = userId;
     deleteInfo.deleteDateTime = new Date();
     deleteInfo.deleteDateTime = new Date();
-    try{
-        for(let i = 0, len = datas.length; i < len; i++){
+    try {
+        for (let i = 0, len = datas.length; i < len; i++) {
             let data = datas[i];
             let data = datas[i];
-            if(data.updateType === updateType.update && data.fileType === fileType.unitPriceFile){
+            if (data.updateType === updateType.update && data.fileType === fileType.unitPriceFile) {
                 await UnitPriceFiles.update({user_id: userId, id: parseInt(data.updateData.id)}, data.updateData);
                 await UnitPriceFiles.update({user_id: userId, id: parseInt(data.updateData.id)}, data.updateData);
-                await Projects.update({userID: userId, 'property.unitPriceFile.id': data.updateData.id}, {$set: {'property.unitPriceFile.name': data.updateData.name}});
+                await Projects.update({
+                    userID: userId,
+                    'property.unitPriceFile.id': data.updateData.id
+                }, {$set: {'property.unitPriceFile.name': data.updateData.name}});
             }
             }
-            else if(data.updateType === updateType.update && data.fileType === fileType.feeRateFile){
+            else if (data.updateType === updateType.update && data.fileType === fileType.feeRateFile) {
                 await FeeRateFiles.update({userID: userId, ID: data.updateData.ID}, data.updateData);
                 await FeeRateFiles.update({userID: userId, ID: data.updateData.ID}, data.updateData);
-                await Projects.update({userID: userId, 'property.feeFile.id': data.updateData.ID}, {$set: {'property.feeFile.name': data.updateData.name}});
+                await Projects.update({
+                    userID: userId,
+                    'property.feeFile.id': data.updateData.ID
+                }, {$set: {'property.feeFile.name': data.updateData.name}});
             }
             }
-            else if(data.updateType === updateType.delete && data.fileType === fileType.unitPriceFile){
+            else if (data.updateType === updateType.delete && data.fileType === fileType.unitPriceFile) {
                 data.updateData.deleteInfo = deleteInfo;
                 data.updateData.deleteInfo = deleteInfo;
                 await UnitPriceFiles.update({user_id: userId, id: parseInt(data.updateData.id)}, data.updateData);
                 await UnitPriceFiles.update({user_id: userId, id: parseInt(data.updateData.id)}, data.updateData);
-                await Projects.update({userID: userId, 'property.feeFile.id': data.updateData.id}, {$set: {'property.feeFile.name': data.updateData.name}});
+                await Projects.update({
+                    userID: userId,
+                    'property.feeFile.id': data.updateData.id
+                }, {$set: {'property.feeFile.name': data.updateData.name}});
             }
             }
-            else if(data.updateType === updateType.delete && data.fileType === fileType.feeRateFile){
+            else if (data.updateType === updateType.delete && data.fileType === fileType.feeRateFile) {
                 data.updateData.deleteInfo = deleteInfo;
                 data.updateData.deleteInfo = deleteInfo;
                 await FeeRateFiles.update({userID: userId, ID: data.updateData.ID}, data.updateData);
                 await FeeRateFiles.update({userID: userId, ID: data.updateData.ID}, data.updateData);
             }
             }
@@ -238,7 +274,7 @@ ProjectsDAO.prototype.udpateUserFiles = async function (userId, datas, callback)
         }
         }
         callback(false, '删除成功', null);
         callback(false, '删除成功', null);
     }
     }
-    catch(error){
+    catch (error) {
         callback(true, '删除失败', null);
         callback(true, '删除失败', null);
     }
     }
 };
 };
@@ -246,7 +282,7 @@ ProjectsDAO.prototype.udpateUserFiles = async function (userId, datas, callback)
 ProjectsDAO.prototype.copyUserProjects = function (userId, datas, callback) {
 ProjectsDAO.prototype.copyUserProjects = function (userId, datas, callback) {
     let data, project, updateLength = 0, hasError = false, deleteInfo = null, tempType = 1, i;
     let data, project, updateLength = 0, hasError = false, deleteInfo = null, tempType = 1, i;
     let updateAll = function (err) {
     let updateAll = function (err) {
-        if (!err){
+        if (!err) {
             updateLength += 1;
             updateLength += 1;
             if (updateLength === datas.length) {
             if (updateLength === datas.length) {
                 callback(0, '', datas);
                 callback(0, '', datas);
@@ -281,7 +317,7 @@ ProjectsDAO.prototype.copyUserProjects = function (userId, datas, callback) {
     }
     }
 };
 };
 
 
-ProjectsDAO.prototype.rename = async function (userId, compilationId, data, callback){
+ProjectsDAO.prototype.rename = async function (userId, compilationId, data, callback) {
     try {
     try {
         if (data.id === undefined || data.id === '') {
         if (data.id === undefined || data.id === '') {
             throw '数据错误!';
             throw '数据错误!';
@@ -296,8 +332,8 @@ ProjectsDAO.prototype.rename = async function (userId, compilationId, data, call
             throw '同级目录已存在相同名称数据';
             throw '同级目录已存在相同名称数据';
         }
         }
 
 
-        Projects.update({userID: userId, ID: data.id}, {name: data.newName}, function(err){
-            if (err){
+        Projects.update({userID: userId, ID: data.id}, {name: data.newName}, function (err) {
+            if (err) {
                 throw '项目不存在';
                 throw '项目不存在';
             }
             }
         });
         });
@@ -308,10 +344,10 @@ ProjectsDAO.prototype.rename = async function (userId, compilationId, data, call
     callback(0, '');
     callback(0, '');
 };
 };
 
 
-ProjectsDAO.prototype.beforeOpenProject = function (userId, projectId, updateData, callback){
+ProjectsDAO.prototype.beforeOpenProject = function (userId, projectId, updateData, callback) {
     updateData['recentDateTime'] = new Date();
     updateData['recentDateTime'] = new Date();
-    Projects.update({userID: userId, ID: projectId}, updateData, function(err){
-        if (err){
+    Projects.update({userID: userId, ID: projectId}, updateData, function (err) {
+        if (err) {
             callback(1, '项目不存在.');
             callback(1, '项目不存在.');
         } else {
         } else {
             callback(0, '');
             callback(0, '');
@@ -344,28 +380,28 @@ ProjectsDAO.prototype.getProject = function (key, callback) {
     }
     }
 };
 };
 
 
-ProjectsDAO.prototype.getProjectsByIds = async function (userId, compilationId, ids){
+ProjectsDAO.prototype.getProjectsByIds = async function (userId, compilationId, ids) {
     return await Projects.find({userID: userId, compilation: compilationId, ID: {$in: ids}});
     return await Projects.find({userID: userId, compilation: compilationId, ID: {$in: ids}});
 };
 };
 
 
-ProjectsDAO.prototype.getGCFiles = async function (fileType, userID){
+ProjectsDAO.prototype.getGCFiles = async function (fileType, userID) {
     let rst;
     let rst;
-    if(fileType === 'UnitPriceFile'){
+    if (fileType === 'UnitPriceFile') {
         let unitPriceFileModel = new UnitPriceFileModel();
         let unitPriceFileModel = new UnitPriceFileModel();
         rst = await unitPriceFileModel.getGCUnitPriceFiles(userID);
         rst = await unitPriceFileModel.getGCUnitPriceFiles(userID);
     }
     }
-    else if(fileType === 'FeeRateFile'){
+    else if (fileType === 'FeeRateFile') {
         rst = await feeRateFacade.getGCFeeRateFiles(userID);
         rst = await feeRateFacade.getGCFeeRateFiles(userID);
     }
     }
     else {
     else {
         let isExist = false;
         let isExist = false;
-        for(let type in projectType){
-            if(projectType[type] === fileType) {
+        for (let type in projectType) {
+            if (projectType[type] === fileType) {
                 isExist = true;
                 isExist = true;
                 break;
                 break;
             }
             }
         }
         }
-        if(!isExist) throw '不存在此项目类型!';
+        if (!isExist) throw '不存在此项目类型!';
         rst = await Projects.find({userID: userID, projType: fileType, 'deleteInfo.deleted': true});
         rst = await Projects.find({userID: userID, projType: fileType, 'deleteInfo.deleted': true});
     }
     }
     return rst;
     return rst;
@@ -373,55 +409,55 @@ ProjectsDAO.prototype.getGCFiles = async function (fileType, userID){
 
 
 ProjectsDAO.prototype.getFirstNodeID = async function (userID, pid) {
 ProjectsDAO.prototype.getFirstNodeID = async function (userID, pid) {
     let nodes = await Projects.find({userID: userID, ParentID: pid, deleteInfo: null});
     let nodes = await Projects.find({userID: userID, ParentID: pid, deleteInfo: null});
-    if(nodes.length === 0){
+    if (nodes.length === 0) {
         return -1;
         return -1;
     }
     }
     else {
     else {
         let prefix = 'ID_';
         let prefix = 'ID_';
         let chain = Object.create(null);
         let chain = Object.create(null);
-        for(let i = 0, len = nodes.length; i < len; i++){
+        for (let i = 0, len = nodes.length; i < len; i++) {
             let nodeDoc = nodes[i]._doc;
             let nodeDoc = nodes[i]._doc;
             let node = Object.create(null);
             let node = Object.create(null);
             node.ID = nodeDoc.ID;
             node.ID = nodeDoc.ID;
             node.NextSiblingID = nodeDoc.NextSiblingID;
             node.NextSiblingID = nodeDoc.NextSiblingID;
             chain[prefix + node.ID] = node;
             chain[prefix + node.ID] = node;
         }
         }
-        for(let i =0, len = nodes.length; i < len; i++){
+        for (let i = 0, len = nodes.length; i < len; i++) {
             let nodeDoc = nodes[i]._doc;
             let nodeDoc = nodes[i]._doc;
             let next = nodeDoc.NextSiblingID > 0 ? chain[prefix + nodeDoc.NextSiblingID] : null;
             let next = nodeDoc.NextSiblingID > 0 ? chain[prefix + nodeDoc.NextSiblingID] : null;
             chain[prefix + nodeDoc.ID].next = next;
             chain[prefix + nodeDoc.ID].next = next;
-            if(next){
+            if (next) {
                 next.pre = chain[prefix + nodeDoc.ID]
                 next.pre = chain[prefix + nodeDoc.ID]
             }
             }
         }
         }
-        for(let node in chain){
+        for (let node in chain) {
             let pre = chain[node].pre || null;
             let pre = chain[node].pre || null;
-            if(!pre){
+            if (!pre) {
                 return chain[node].ID;
                 return chain[node].ID;
             }
             }
         }
         }
     }
     }
 };
 };
 
 
-ProjectsDAO.prototype.recGC = async function(userID, datas, callback){
+ProjectsDAO.prototype.recGC = async function (userID, datas, callback) {
     let functions = [];
     let functions = [];
     let updateDatas = [];
     let updateDatas = [];
-    for(let i = 0, len = datas.length; i < len; i++){
-        if(datas[i].findData.ParentID !== undefined && datas[i].findData.NextSiblingID === -1 && !datas[i].findData.deleteInfo){//维护项目管理树
+    for (let i = 0, len = datas.length; i < len; i++) {
+        if (datas[i].findData.ParentID !== undefined && datas[i].findData.NextSiblingID === -1 && !datas[i].findData.deleteInfo) {//维护项目管理树
             let findNode = await Projects.find(datas[i].findData);
             let findNode = await Projects.find(datas[i].findData);
-            if(findNode.length > 0){
+            if (findNode.length > 0) {
                 datas[i].findData = Object.create(null);
                 datas[i].findData = Object.create(null);
                 datas[i].findData.ID = findNode[0].ID;
                 datas[i].findData.ID = findNode[0].ID;
                 updateDatas.push(datas[i]);
                 updateDatas.push(datas[i]);
             }
             }
         }
         }
         else {
         else {
-            if(datas[i].updateType === projectType.project && datas[i].updateData.NextSiblingID === undefined){//则为待查询NextSiblingID,前端无法查询
+            if (datas[i].updateType === projectType.project && datas[i].updateData.NextSiblingID === undefined) {//则为待查询NextSiblingID,前端无法查询
                 let projData = await Projects.find({userID: userID, ID: datas[i].findData.ID});//建设项目原本可能属于某文件夹、文件夹的存在需要判断
                 let projData = await Projects.find({userID: userID, ID: datas[i].findData.ID});//建设项目原本可能属于某文件夹、文件夹的存在需要判断
                 let projPid = projData[0].ParentID;
                 let projPid = projData[0].ParentID;
-                if(projPid !== -1){
+                if (projPid !== -1) {
                     let projFolder = await Projects.find({userID: userID, ID: projPid});
                     let projFolder = await Projects.find({userID: userID, ID: projPid});
-                    if(projFolder.length === 0){//文件夹已不存在
+                    if (projFolder.length === 0) {//文件夹已不存在
                         projPid = -1;
                         projPid = -1;
                         datas[i].updateData.ParentID = -1;
                         datas[i].updateData.ParentID = -1;
                     }
                     }
@@ -432,45 +468,50 @@ ProjectsDAO.prototype.recGC = async function(userID, datas, callback){
             updateDatas.push(datas[i])
             updateDatas.push(datas[i])
         }
         }
     }
     }
-    for(let i = 0, len = updateDatas.length; i < len; i ++){
-        functions.push((function(data){
+    for (let i = 0, len = updateDatas.length; i < len; i++) {
+        functions.push((function (data) {
                 return function (cb) {
                 return function (cb) {
-                    if(data.updateType === fileType.unitPriceFile){
+                    if (data.updateType === fileType.unitPriceFile) {
                         UnitPriceFiles.update({id: parseInt(data.findData.id)}, data.updateData, function (err) {
                         UnitPriceFiles.update({id: parseInt(data.findData.id)}, data.updateData, function (err) {
-                            if(err) cb(err);
+                            if (err) cb(err);
                             else {
                             else {
-                                Projects.update({userID: userID, 'property.unitPriceFile.id': data.findData.id}, {$set: {'property.unitPriceFile.name': data.updateData.name}}, function (err) {
-                                    if(err) cb(err);
+                                Projects.update({
+                                    userID: userID,
+                                    'property.unitPriceFile.id': data.findData.id
+                                }, {$set: {'property.unitPriceFile.name': data.updateData.name}}, function (err) {
+                                    if (err) cb(err);
                                     else cb(false);
                                     else cb(false);
                                 });
                                 });
                             }
                             }
                         })
                         })
                     }
                     }
-                    else if(data.updateType === fileType.feeRateFile){
+                    else if (data.updateType === fileType.feeRateFile) {
                         FeeRateFiles.update(data.findData, data.updateData, function (err) {
                         FeeRateFiles.update(data.findData, data.updateData, function (err) {
-                            if(err) cb(err);
+                            if (err) cb(err);
                             else {
                             else {
-                                Projects.update({userID: userID, 'property.feeFile.id': data.findData.ID}, {$set: {'property.feeFile.name': data.updateData.name}}, function (err) {
-                                    if(err) cb(err);
+                                Projects.update({
+                                    userID: userID,
+                                    'property.feeFile.id': data.findData.ID
+                                }, {$set: {'property.feeFile.name': data.updateData.name}}, function (err) {
+                                    if (err) cb(err);
                                     else cb(false);
                                     else cb(false);
                                 });
                                 });
                             }
                             }
                         });
                         });
                     }
                     }
-                    else{
-                        if(data){
+                    else {
+                        if (data) {
                             Projects.update(data.findData, data.updateData, function (err) {
                             Projects.update(data.findData, data.updateData, function (err) {
-                                if(err)cb(err);
+                                if (err) cb(err);
                                 else cb(false);
                                 else cb(false);
                             });
                             });
                         }
                         }
                     }
                     }
                 }
                 }
-            }
-        )(updateDatas[i]));
+            })(updateDatas[i]));
     }
     }
     async_c.parallel(functions, function (err, results) {
     async_c.parallel(functions, function (err, results) {
-        if(err) callback(err, 'fail', null);
+        if (err) callback(err, 'fail', null);
         else callback(0, 'success', null);
         else callback(0, 'success', null);
     });
     });
 };
 };
@@ -481,12 +522,18 @@ ProjectsDAO.prototype.recGC = async function(userID, datas, callback){
  * @param {Object} data
  * @param {Object} data
  * @return {Boolean}
  * @return {Boolean}
  */
  */
-ProjectsDAO.prototype.isExist = async function(userId, compilationId, name, parentID) {
+ProjectsDAO.prototype.isExist = async function (userId, compilationId, name, parentID) {
     parentID = parseInt(parentID);
     parentID = parseInt(parentID);
     if (name === '' || isNaN(parentID)) {
     if (name === '' || isNaN(parentID)) {
         return true;
         return true;
     }
     }
-    let condition = {userID: userId, compilation: compilationId, ParentID: parentID, name: name, "$or":[{deleteInfo: null}, {"deleteInfo.deleted": false}]};
+    let condition = {
+        userID: userId,
+        compilation: compilationId,
+        ParentID: parentID,
+        name: name,
+        "$or": [{deleteInfo: null}, {"deleteInfo.deleted": false}]
+    };
     let count = await Projects.count(condition);
     let count = await Projects.count(condition);
     return count > 0;
     return count > 0;
 };
 };
@@ -497,7 +544,7 @@ ProjectsDAO.prototype.isExist = async function(userId, compilationId, name, pare
  * @param {Number} projectId
  * @param {Number} projectId
  * @return {Promise}
  * @return {Promise}
  */
  */
-ProjectsDAO.prototype.getTenderByProjectId = async function(projectId) {
+ProjectsDAO.prototype.getTenderByProjectId = async function (projectId) {
     let result = [];
     let result = [];
     // 首先获取对应的单位工程id
     // 首先获取对应的单位工程id
     let engineeringData = await Projects.find({ParentID: projectId});
     let engineeringData = await Projects.find({ParentID: projectId});
@@ -506,7 +553,7 @@ ProjectsDAO.prototype.getTenderByProjectId = async function(projectId) {
     }
     }
 
 
     let engineeringIdList = [];
     let engineeringIdList = [];
-    for(let tmp of engineeringData) {
+    for (let tmp of engineeringData) {
         engineeringIdList.push(tmp.ID);
         engineeringIdList.push(tmp.ID);
     }
     }
 
 
@@ -516,7 +563,7 @@ ProjectsDAO.prototype.getTenderByProjectId = async function(projectId) {
         return result;
         return result;
     }
     }
 
 
-    for(let tmp of tenderData) {
+    for (let tmp of tenderData) {
         result.push(tmp.ID);
         result.push(tmp.ID);
     }
     }
 
 
@@ -529,7 +576,7 @@ ProjectsDAO.prototype.getTenderByProjectId = async function(projectId) {
  * @param {Number} unitPriceFileId
  * @param {Number} unitPriceFileId
  * @return {Promise}
  * @return {Promise}
  */
  */
-ProjectsDAO.prototype.getTenderByUnitPriceFileId = async function(unitPriceFileId) {
+ProjectsDAO.prototype.getTenderByUnitPriceFileId = async function (unitPriceFileId) {
     let result = [];
     let result = [];
 
 
     unitPriceFileId = parseInt(unitPriceFileId);
     unitPriceFileId = parseInt(unitPriceFileId);
@@ -549,7 +596,7 @@ ProjectsDAO.prototype.getTenderByUnitPriceFileId = async function(unitPriceFileI
  * @param {Number} projectId
  * @param {Number} projectId
  * @return {Promise}
  * @return {Promise}
  */
  */
-ProjectsDAO.prototype.getUnitPriceFileId = async function(projectId) {
+ProjectsDAO.prototype.getUnitPriceFileId = async function (projectId) {
     let result = 0;
     let result = 0;
     let projectData = await Projects.findOne({ID: projectId});
     let projectData = await Projects.findOne({ID: projectId});
     if (projectData === null) {
     if (projectData === null) {
@@ -566,12 +613,12 @@ ProjectsDAO.prototype.getUnitPriceFileId = async function(projectId) {
  * @param {Number} userId
  * @param {Number} userId
  * @return {Promise}
  * @return {Promise}
  */
  */
-ProjectsDAO.prototype.getUserProjectData = async function(userId) {
+ProjectsDAO.prototype.getUserProjectData = async function (userId) {
     let projectList = await Projects.find({
     let projectList = await Projects.find({
         '$or': [
         '$or': [
             {'userID': userId, 'deleteInfo': null, projType: 'Project'},
             {'userID': userId, 'deleteInfo': null, projType: 'Project'},
             {'userID': userId, 'deleteInfo.deleted': {'$in': [null, false]}, projType: 'Project'}
             {'userID': userId, 'deleteInfo.deleted': {'$in': [null, false]}, projType: 'Project'}
-            ]
+        ]
     }, {_id: 0, name: 1, ID: 1});
     }, {_id: 0, name: 1, ID: 1});
 
 
     return projectList;
     return projectList;
@@ -584,7 +631,7 @@ ProjectsDAO.prototype.getUserProjectData = async function(userId) {
  * @param {Object} changeInfo
  * @param {Object} changeInfo
  * @return {Promise}
  * @return {Promise}
  */
  */
-ProjectsDAO.prototype.changeUnitPriceFileInfo = async function(projectId, changeInfo) {
+ProjectsDAO.prototype.changeUnitPriceFileInfo = async function (projectId, changeInfo) {
     projectId = parseInt(projectId);
     projectId = parseInt(projectId);
     if (isNaN(projectId) || projectId <= 0) {
     if (isNaN(projectId) || projectId <= 0) {
         return false;
         return false;
@@ -594,8 +641,27 @@ ProjectsDAO.prototype.changeUnitPriceFileInfo = async function(projectId, change
     return result.ok === 1;
     return result.ok === 1;
 };
 };
 
 
-module.exports ={
-    project: new ProjectsDAO(),
+
+/**
+ * 更新项目属性
+ *
+ * @param {Number} projectId - 项目id
+ * @param {Object} propertyData - 项目属性数据
+ * @return {Promise}
+ */
+ProjectsDAO.prototype.updateProjectProperty = async function(projectId, propertyData) {
+    projectId = parseInt(projectId);
+    if (isNaN(projectId) || projectId <= 0 || propertyData.property === undefined || propertyData.data === undefined) {
+        return false;
+    }
+    const updateData = {};
+    updateData["property." + propertyData.property] = propertyData.data;
+    let result = await Projects.update({ID: projectId}, updateData);
+
+    return result.ok === 1;
+};
+
+module.exports ={    project: new ProjectsDAO(),
     projType: projectType,
     projType: projectType,
     fileType: fileType
     fileType: fileType
 };
 };

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

@@ -16,6 +16,11 @@ const displaySetting = {
     disPlayMainMaterial:true
     disPlayMainMaterial:true
 }
 }
 
 
+const calcOptions={
+    calc_main:false,
+    calc_add:true,
+    calc_est:true
+}
 /*
 /*
 * 单位工程清单工程量精度模板
 * 单位工程清单工程量精度模板
 * */
 * */
@@ -123,4 +128,4 @@ const projectFeature = [
     {dispName: '门窗材料及装饰', key: 'doorsWindowsMaterial', value: ''}
     {dispName: '门窗材料及装饰', key: 'doorsWindowsMaterial', value: ''}
 ];
 ];
 
 
-export {defaultDecimal, billsQuantityDecimal, basicInformation, projectFeature,displaySetting};
+export {defaultDecimal, billsQuantityDecimal, basicInformation, projectFeature,displaySetting,calcOptions};

文件差异内容过多而无法显示
+ 441 - 415
modules/ration_glj/facade/ration_glj_facade.js


+ 2 - 2
modules/reports/rpt_component/helper/jpc_helper_area.js

@@ -50,12 +50,12 @@ let JpcAreaHelper = {
                 }
                 }
             } else {
             } else {
                 //颗粒度更加细化的控制,可能上下两边的计算坐标方式都不同
                 //颗粒度更加细化的控制,可能上下两边的计算坐标方式都不同
-                if (areaNode[JV.PROP_H_CALCULATION][JV.PROP_TOP] === JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE]) {
+                if (areaNode[JV.PROP_V_CALCULATION][JV.PROP_TOP] === JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE]) {
                     innerTop = (1.0 * areaNode[JV.PROP_TOP] * areaHeight / JV.HUNDRED_PERCENT);
                     innerTop = (1.0 * areaNode[JV.PROP_TOP] * areaHeight / JV.HUNDRED_PERCENT);
                 } else {
                 } else {
                     innerTop = 1.0 * areaNode[JV.PROP_TOP] * unitFactor;
                     innerTop = 1.0 * areaNode[JV.PROP_TOP] * unitFactor;
                 }
                 }
-                if (areaNode[JV.PROP_H_CALCULATION][JV.PROP_BOTTOM] === JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE]) {
+                if (areaNode[JV.PROP_V_CALCULATION][JV.PROP_BOTTOM] === JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE]) {
                     innerBottom = (1.0 * areaNode[JV.PROP_BOTTOM] * areaHeight / JV.HUNDRED_PERCENT);
                     innerBottom = (1.0 * areaNode[JV.PROP_BOTTOM] * areaHeight / JV.HUNDRED_PERCENT);
                 } else {
                 } else {
                     innerBottom = 1.0 * areaNode[JV.PROP_BOTTOM] * unitFactor;
                     innerBottom = 1.0 * areaNode[JV.PROP_BOTTOM] * unitFactor;

+ 53 - 3
modules/reports/rpt_component/jpc_flow_tab.js

@@ -85,6 +85,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
         me.seg_sum_fields_idx = [];
         me.seg_sum_fields_idx = [];
         me.seg_sum_tab_fields = [];
         me.seg_sum_tab_fields = [];
         me.page_sum_fields_idx = [];
         me.page_sum_fields_idx = [];
+        me.page_sum_tab_fields = [];
 
 
         me.group_fields = [];
         me.group_fields = [];
         me.group_sum_fields = [];
         me.group_sum_fields = [];
@@ -95,6 +96,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
         me.pageStatusLst = [];
         me.pageStatusLst = [];
         me.groupSumValLst = [];
         me.groupSumValLst = [];
         me.segSumValLst = [];
         me.segSumValLst = [];
+        me.pageSumValLst = [];
         me.multiCols = 1;
         me.multiCols = 1;
         me.pagesAmt = 0;
         me.pagesAmt = 0;
     };
     };
@@ -102,7 +104,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
         let me = this;
         let me = this;
         let FLOW_NODE_STR = me.isEx?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;
         let FLOW_NODE_STR = me.isEx?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;
         JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_SEG_SUM][JV.PROP_SUM_FIELDS], me.seg_sum_tab_fields, me.seg_sum_fields_idx, me.isEx);
         JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_SEG_SUM][JV.PROP_SUM_FIELDS], me.seg_sum_tab_fields, me.seg_sum_fields_idx, me.isEx);
-        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_PAGE_SUM][JV.PROP_SUM_FIELDS], null, me.page_sum_fields_idx, me.isEx);
+        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_PAGE_SUM][JV.PROP_SUM_FIELDS], me.page_sum_tab_fields, me.page_sum_fields_idx, me.isEx);
         JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_FIELDS], me.group_fields, null, me.isEx);
         JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_FIELDS], me.group_fields, null, me.isEx);
         JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_GROUP][JV.PROP_SUM_FIELDS], me.group_sum_fields, null, me.isEx);
         JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_GROUP][JV.PROP_SUM_FIELDS], me.group_sum_fields, null, me.isEx);
         for (let si = 0; si < dataSeq.length; si++) {
         for (let si = 0; si < dataSeq.length; si++) {
@@ -355,15 +357,18 @@ JpcFlowTabSrv.prototype.createNew = function(){
                     } else {
                     } else {
                         if (currentRecAmt + maxRowRec >= ttlSegRecAmt) {
                         if (currentRecAmt + maxRowRec >= ttlSegRecAmt) {
                             pageStatus[JV.STATUS_SEGMENT_END] = true;
                             pageStatus[JV.STATUS_SEGMENT_END] = true;
+                            pageStatus[JV.STATUS_REPORT_END] = true;
                             private_resetBandArea();
                             private_resetBandArea();
                             let hasAdHocRow = !JpcFlowTabHelper.chkSegEnd(bands, rptTpl, ttlSegRecAmt, currentRecAmt, maxRowRec, me.isEx);
                             let hasAdHocRow = !JpcFlowTabHelper.chkSegEnd(bands, rptTpl, ttlSegRecAmt, currentRecAmt, maxRowRec, me.isEx);
                             if (hasAdHocRow) {
                             if (hasAdHocRow) {
                                 //add page info(pre segment end)
                                 //add page info(pre segment end)
                                 pageStatus[JV.STATUS_SEGMENT_END] = false;
                                 pageStatus[JV.STATUS_SEGMENT_END] = false;
+                                pageStatus[JV.STATUS_REPORT_END] = false;
                                 private_addPage(segIdx, grpSeqInfo, false, false, -1);
                                 private_addPage(segIdx, grpSeqInfo, false, false, -1);
                             }
                             }
                             //add page info
                             //add page info
                             pageStatus[JV.STATUS_SEGMENT_END] = true;
                             pageStatus[JV.STATUS_SEGMENT_END] = true;
+                            pageStatus[JV.STATUS_REPORT_END] = true;
                             private_addPage(segIdx, grpSeqInfo, false, false, -1);
                             private_addPage(segIdx, grpSeqInfo, false, false, -1);
                         } else {
                         } else {
                             private_addPage(segIdx, grpSeqInfo, false, false, -1);
                             private_addPage(segIdx, grpSeqInfo, false, false, -1);
@@ -503,6 +508,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
             // 2.3 Sum Seg
             // 2.3 Sum Seg
             tabRstLst.push(me.outputSegSum(rptTpl, dataObj, page, segIdx, bands, unitFactor, controls));
             tabRstLst.push(me.outputSegSum(rptTpl, dataObj, page, segIdx, bands, unitFactor, controls));
             // 2.4 Sum Page
             // 2.4 Sum Page
+            tabRstLst.push(me.outputPageSum(rptTpl, dataObj, page, segIdx, bands, unitFactor, controls));
             // 2.5 Group
             // 2.5 Group
             // 2.6 Discrete
             // 2.6 Discrete
             tabRstLst.push(JpcDiscreteHelper.outputDiscreteInfo(rptTpl[FLOW_NODE_STR][JV.NODE_DISCRETE_INFO], bands, dataObj, unitFactor, me.pageStatusLst[page - 1], segIdx, 1, 0, $CURRENT_RPT));
             tabRstLst.push(JpcDiscreteHelper.outputDiscreteInfo(rptTpl[FLOW_NODE_STR][JV.NODE_DISCRETE_INFO], bands, dataObj, unitFactor, me.pageStatusLst[page - 1], segIdx, 1, 0, $CURRENT_RPT));
@@ -536,6 +542,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
                 // 2.3 Sum Seg
                 // 2.3 Sum Seg
                 tabRstLst.push(me.outputSegSum(rptTpl, dataObj, actualPage, segIdx, bands, unitFactor, controls));
                 tabRstLst.push(me.outputSegSum(rptTpl, dataObj, actualPage, segIdx, bands, unitFactor, controls));
                 // 2.4 Sum Page
                 // 2.4 Sum Page
+                tabRstLst.push(me.outputPageSum(rptTpl, dataObj, actualPage, segIdx, bands, unitFactor, controls));
                 // 2.5 Group
                 // 2.5 Group
                 // 2.6 Discrete
                 // 2.6 Discrete
                 if (pi === 0) {
                 if (pi === 0) {
@@ -563,6 +570,15 @@ JpcFlowTabSrv.prototype.createNew = function(){
                 let data_details = me.isEx?dataObj[JV.DATA_DETAIL_DATA_EX]:dataObj[JV.DATA_DETAIL_DATA];
                 let data_details = me.isEx?dataObj[JV.DATA_DETAIL_DATA_EX]:dataObj[JV.DATA_DETAIL_DATA];
                 let data_details_ex = $CURRENT_RPT.isFollowMode?dataObj[JV.DATA_DETAIL_DATA_EX]:null;
                 let data_details_ex = $CURRENT_RPT.isFollowMode?dataObj[JV.DATA_DETAIL_DATA_EX]:null;
                 let contentValuesIdx = me.dispValueIdxLst[page - 1];
                 let contentValuesIdx = me.dispValueIdxLst[page - 1];
+                let page_sum_data_fields = [];
+                for (let i = 0; i < me.page_sum_fields_idx.length; i++) {
+                    let data_field = data_details[me.page_sum_fields_idx[i]];
+                    page_sum_data_fields.push(data_field);
+                }
+                let rowGrandTotal = [];
+                for (let di = 0; di < page_sum_data_fields.length; di++) {
+                    rowGrandTotal.push(0.0);
+                }
                 //normal content
                 //normal content
                 for (let rowIdx = 0; rowIdx < contentValuesIdx.length; rowIdx++) {
                 for (let rowIdx = 0; rowIdx < contentValuesIdx.length; rowIdx++) {
                     for (let i = 0; i < tab_fields.length; i++) {
                     for (let i = 0; i < tab_fields.length; i++) {
@@ -603,7 +619,12 @@ JpcFlowTabSrv.prototype.createNew = function(){
                             }
                             }
                         }
                         }
                     }
                     }
+                    //page sum content
+                    for (let di = 0; di < page_sum_data_fields.length; di++) {
+                        rowGrandTotal[di] = rowGrandTotal[di] + 1.0 * JpcFieldHelper.getValue(page_sum_data_fields[di], contentValuesIdx[rowIdx][2]);
+                    }
                 }
                 }
+                me.pageSumValLst.push(rowGrandTotal);
                 //grouping content
                 //grouping content
                 for (let rowIdx = 0; rowIdx < contentValuesIdx.length; rowIdx++) {
                 for (let rowIdx = 0; rowIdx < contentValuesIdx.length; rowIdx++) {
                     if (contentValuesIdx[rowIdx][1] === JV.DISPLAY_VAL_TYPE_GROUP) {
                     if (contentValuesIdx[rowIdx][1] === JV.DISPLAY_VAL_TYPE_GROUP) {
@@ -672,6 +693,35 @@ JpcFlowTabSrv.prototype.createNew = function(){
         }
         }
         return rst;
         return rst;
     };
     };
+    JpcFlowTabResult.outputPageSum = function (rptTpl, dataObj, page, segIdx, bands, unitFactor, controls) {
+        let me = this, rst = [];
+        let FLOW_NODE_STR = me.isEx?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;
+        let tab = rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_PAGE_SUM];
+        let band = bands[tab[JV.PROP_BAND_NAME]];
+        if (band) {
+            let pageStatus = me.pageStatusLst[page - 1];
+            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]]) {
+                let tab_fields = me.page_sum_tab_fields;
+                for (let i = 0; i < tab_fields.length; i++) {
+                    let cellItem = JpcCommonOutputHelper.createCommonOutput(tab_fields[i], me.pageSumValLst[page - 1], controls);
+                    cellItem[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_fields[i][JV.PROP_AREA], band, unitFactor, 1, 0, 1, 0, me.multiCols, 0, true, false);
+                    rst.push(cellItem);
+                }
+                if (tab[JV.PROP_TEXT]) {
+                    rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXT], band, unitFactor, 1, 0, 1, 0, me.multiCols, 0));
+                }
+                if (tab[JV.PROP_TEXTS]) {
+                    for (let j = 0; j < tab[JV.PROP_TEXTS].length; j++) {
+                        rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXTS][j], band, unitFactor, 1, 0, 1, 0, me.multiCols, 0));
+                    }
+                }
+                if (tab[JV.NODE_DISCRETE_INFO]) {
+                    rst = rst.concat(JpcDiscreteHelper.outputDiscreteInfo(tab[JV.NODE_DISCRETE_INFO], bands, dataObj, unitFactor, me.pageStatusLst[page - 1], segIdx, me.multiCols, 0));
+                }
+            }
+        }
+        return rst;
+    };
     JpcFlowTabResult.outputTabField = function (band, tab_field, data_field, valueIdx, serialIdx, rows, rowIdx, cols, colIdx, unitFactor, isRow, controls, multiColIdx) {
     JpcFlowTabResult.outputTabField = function (band, tab_field, data_field, valueIdx, serialIdx, rows, rowIdx, cols, colIdx, unitFactor, isRow, controls, multiColIdx) {
         let me = this,
         let me = this,
             rst = JpcCommonOutputHelper.createCommonOutput(tab_field, JpcFieldHelper.getValue(data_field, valueIdx), controls);
             rst = JpcCommonOutputHelper.createCommonOutput(tab_field, JpcFieldHelper.getValue(data_field, valueIdx), controls);
@@ -695,10 +745,10 @@ JpcFlowTabSrv.prototype.createNew = function(){
             }
             }
         }
         }
         if (grp_line[JV.PROP_DISCRETE_FIELDS]) {
         if (grp_line[JV.PROP_DISCRETE_FIELDS]) {
-            //
+            //暂时不支持
         }
         }
         if (grp_line[JV.PROP_PARAMS]) {
         if (grp_line[JV.PROP_PARAMS]) {
-            //
+            //暂时不支持
         }
         }
         // console.log(rst);
         // console.log(rst);
         return rst;
         return rst;

+ 2 - 2
modules/reports/util/rpt_construct_data_util.js

@@ -747,7 +747,7 @@ function ext_getFee(feeKey, dtlFeeKey) {
 function pri_getFee(dItem, feeKey, dtlFeeKey) {
 function pri_getFee(dItem, feeKey, dtlFeeKey) {
     let rst = 0;
     let rst = 0;
     let hasValue = false;
     let hasValue = false;
-    if (dItem.hasOwnProperty("fees")) {
+    if (dItem["fees"]) {
         for (let fee of dItem["fees"]) {
         for (let fee of dItem["fees"]) {
             if (fee["fieldName"] === feeKey) {
             if (fee["fieldName"] === feeKey) {
                 if (dtlFeeKey) {
                 if (dtlFeeKey) {
@@ -759,7 +759,7 @@ function pri_getFee(dItem, feeKey, dtlFeeKey) {
                 break;
                 break;
             }
             }
         }
         }
-    } else if (dItem.hasOwnProperty(feeKey)) {
+    } else if (dItem[feeKey]) {
         hasValue = true;
         hasValue = true;
         rst = dItem[feeKey];
         rst = dItem[feeKey];
     } else {
     } else {

+ 3 - 0
test/unit/reports/test_cover_01.js

@@ -31,6 +31,9 @@ require('../../../modules/fee_rates/models/fee_rates');
 // 引入人工系数模块
 // 引入人工系数模块
 require('../../../modules/main/models/labour_coe_model');
 require('../../../modules/main/models/labour_coe_model');
 require('../../../modules/main/models/calc_program_model');
 require('../../../modules/main/models/calc_program_model');
+//config.setupCache();
+let cfgCacheUtil = require("../../../config/cacheCfg");
+cfgCacheUtil.setupDftCache();
 
 
 let fsUtil = require("../../../public/fsUtil");
 let fsUtil = require("../../../public/fsUtil");
 
 

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

@@ -31,6 +31,9 @@ require('../../../modules/fee_rates/models/fee_rates');
 // 引入人工系数模块
 // 引入人工系数模块
 require('../../../modules/main/models/labour_coe_model');
 require('../../../modules/main/models/labour_coe_model');
 require('../../../modules/main/models/calc_program_model');
 require('../../../modules/main/models/calc_program_model');
+//config.setupCache();
+let cfgCacheUtil = require("../../../config/cacheCfg");
+cfgCacheUtil.setupDftCache();
 
 
 let fsUtil = require("../../../public/fsUtil");
 let fsUtil = require("../../../public/fsUtil");
 
 

+ 170 - 0
test/unit/reports/test_tpl_09.js

@@ -0,0 +1,170 @@
+/**
+ * Created by Tony on 2017/12/20.
+ */
+
+let test = require('tape');
+import JpcEx from "../../../modules/reports/rpt_component/jpc_ex";
+import JV from "../../../modules/reports/rpt_component/jpc_value_define";
+let mongoose = require("mongoose");
+let fileUtils = require("../../../modules/common/fileUtils");
+let path = require('path');
+let dbm = require("../../../config/db/db_manager");
+let rpt_cfg = require('./rpt_cfg');
+dbm.connect();
+let consts = require('../../../modules/main/models/project_consts');
+let projectConsts = consts.projectConst;
+fileUtils.getGlobbedFiles('../../../modules/complementary_glj_lib/models/*.js').forEach(function(modelPath) {
+    require(path.resolve(modelPath));
+});
+
+fileUtils.getGlobbedFiles('../../../modules/ration_glj/models/*.js').forEach(function(modelPath) {
+    require(path.resolve(modelPath));
+});
+
+//引入报表模块
+fileUtils.getGlobbedFiles('../../../modules/reports/models/*.js').forEach(function(modelPath) {
+    require(path.resolve(modelPath));
+})
+
+//暂时引入其它模块的model
+require('../../../modules/fee_rates/models/fee_rates');
+// 引入人工系数模块
+require('../../../modules/main/models/labour_coe_model');
+require('../../../modules/main/models/calc_program_model');
+//config.setupCache();
+let cfgCacheUtil = require("../../../config/cacheCfg");
+cfgCacheUtil.setupDftCache();
+
+let fsUtil = require("../../../public/fsUtil");
+
+let prjMdl = require('../../../modules/pm/models/project_model');
+let projectDataMdl = require('../../../modules/main/models/project');
+let demoPrjId = - 1;
+let demoRptId = 232, pagesize = "A4";
+
+let userId_Leng = 1142; //小冷User Id
+// demoPrjId = 720; //QA: DW3
+demoPrjId = 1348; //QA:
+/*/
+let userId_Dft = userId_Leng;
+/*/
+ let userId_Dft = 76075;
+ //*/
+
+let rptTplFacade = require("../../../modules/reports/facade/rpt_template_facade");
+let rptTplDataFacade = require("../../../modules/reports/facade/rpt_tpl_data_facade");
+
+import rptDataExtractor from "../../../modules/reports/util/rpt_construct_data_util";
+
+let fs = require('fs');
+//设置Date Format函数
+fs.readFile(__dirname.slice(0, __dirname.length - 18) + '/public/web/date_util.js', 'utf8', 'r', function (err, data) {
+    eval(data);
+});
+
+/*/
+ test('测试 - 获取project数据: ', function (t) {
+ projectDataMdl.getData(demoPrjId, function (err, message, result) {
+ if (!err) {
+ fsUtil.writeObjToFile(result, "D:/GitHome/ConstructionCost/tmp/ProjectDataFullObject.js");
+ t.pass('pass succeeded!');
+ t.end();
+ } else {
+ //callback(req, res, err, message, null);
+ t.pass('pass failed!');
+ t.end();
+ }
+ });
+ });
+ //*/
+/*/
+ test('测试 - 获取project部分数据: ', function (t) {
+ let filter = [];
+ filter.push(projectConsts.BILLS);
+ filter.push(projectConsts.RATION);
+ filter.push(projectConsts.RATION_GLJ);
+ filter.push(projectConsts.PROJECTGLJ);
+ filter.push(projectConsts.FEERATE);
+ filter.push(projectConsts.CALC_PROGRAM);
+ prjMdl.project.getUserProject(userId_Dft, demoPrjId, function(err, msg, prjObj){
+ if (!err) {
+ projectDataMdl.getFilterData(demoPrjId, filter, function (results) {
+ if (results) {
+ // let newData = [];
+ // for (let item of results) {
+ //     newData.push(JSON.stringify(item));
+ // }
+ // fsUtil.writeArrayToFile(newData, "D:/GitHome/ConstructionCost/tmp/getProjectData_partial.js");
+ // fsUtil.writeObjToFile(prjObj, "D:/GitHome/ConstructionCost/tmp/getProjectObjectNew.js");
+ fsUtil.writeObjToFile(results, "D:/GitHome/ConstructionCost/tmp/getProjectData_partialNew.js");
+ t.pass('pass succeeded!');
+ t.end();
+ } else {
+ //callback(req, res, err, message, null);
+ t.pass('get project data failed!');
+ t.end();
+ }
+ });
+ } else {
+ t.pass('get project failed!');
+ t.end();
+ }
+ });
+ });
+ //*/
+
+//*
+test('测试 - 测试模板啦: ', function (t) {
+    rptTplFacade.getRptTemplate(demoRptId).then(function(rptTpl) {
+        let rptDataUtil = new rptDataExtractor();
+        rptDataUtil.initialize(rptTpl._doc);
+        let filter = rptDataUtil.getDataRequestFilter();
+        console.log(filter);
+        //正常应该根据报表模板定义的数据类型来请求数据
+        rptTplDataFacade.prepareProjectData(userId_Dft, demoPrjId, filter, function (err, msg, rawDataObj) {
+            if (!err) {
+                try {
+                    // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/rptTplRawDataObject.js");
+                    let tplData = rptDataUtil.assembleData(rawDataObj);
+                    //it's time to build the report!!!
+                    let printCom = JpcEx.createNew();
+                    rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pagesize;
+                    let defProperties = rpt_cfg;
+                    let dftOption = JV.PAGING_OPTION_NORMAL;
+                    printCom.initialize(rptTpl);
+                    printCom.analyzeData(rptTpl, tplData, defProperties, dftOption);
+                    let maxPages = printCom.totalPages;
+                    let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
+                    if (pageRst) {
+                        // fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult.js");
+                    } else {
+                        console.log("oh! no pages were created!");
+                    }
+                } catch (ex) {
+                    console.log(ex);
+                    t.pass('pass with exception!');
+                    t.end();
+                }
+
+                t.pass('pass succeeded!');
+                t.end();
+            } else {
+                console.log(msg);
+                t.pass('pass with error!');
+                t.end();
+            }
+        })
+    });
+});
+//*/
+
+test('close the connection', function (t) {
+    setTimeout(function () {
+        mongoose.disconnect();
+        t.pass('closing db connection');
+        t.end();
+    }, 3000);
+    // mongoose.disconnect();
+    // t.pass('closing db connection');
+    // t.end();
+});

+ 4 - 0
test/unit/reports/test_tpl_09_1.js

@@ -31,6 +31,10 @@ require('../../../modules/fee_rates/models/fee_rates');
 require('../../../modules/main/models/labour_coe_model');
 require('../../../modules/main/models/labour_coe_model');
 require('../../../modules/main/models/calc_program_model');
 require('../../../modules/main/models/calc_program_model');
 
 
+//config.setupCache();
+let cfgCacheUtil = require("../../../config/cacheCfg");
+cfgCacheUtil.setupDftCache();
+
 let fsUtil = require("../../../public/fsUtil");
 let fsUtil = require("../../../public/fsUtil");
 
 
 let prjMdl = require('../../../modules/pm/models/project_model');
 let prjMdl = require('../../../modules/pm/models/project_model');

+ 505 - 0
web/building_saas/complementary_ration_lib/html/dinge.html

@@ -0,0 +1,505 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <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>
+    <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/spreadjs/sheets/css/gc.spread.sheets.excel2013lightGray.10.0.1.css" type="text/css">
+    <style type="text/css">
+        .ztree li span.button.add{margin-right:2px;background-position:-144px 0;vertical-align:top;*vertical-align:middle}
+    </style>
+</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" 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 " 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 " 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" 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" 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>-->
+                    </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" id="linkAZZJ" data-toggle="tab" href="#" role="tab">安装增加费</a>-->
+                                          <a class="nav-link" href="#">安装增加费</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="m-2"><a href="javacript:void(0);" data-toggle="modal" data-target="#editTsm" title="编辑">编辑说明</a></div>-->
+                                  <div class="main-content m-2">
+                                      <h5>说明</h5>
+                                      <textarea id="explanationShow" class="form-control" rows="35" style="background: white;"></textarea>
+                                  </div>
+                              </div>
+                          </div>
+                          <!--计算规则-->
+                          <div class="tab-pane" id="tjs" role="tabpanel">
+                              <div class="main-data">
+                         <!--         <div class="m-2"><a href="javacript:void(0);" data-toggle="modal" data-target="#editTjs" title="编辑">编辑计算规则</a></div>-->
+                                  <div class="main-content m-2">
+                                      <h5>计算规则</h5>
+                                      <textarea id="ruleTextShow" class="form-control"   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=""> 适合本项所有定额</label>&nbsp;&nbsp;<label class="form-check-label"><input type="radio" class="form-check-input" name="optionsRadios" value="PARTIAL" disabled> 适合本项部分定额</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"></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"></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>
+                                </div>
+                            </div>
+
+                            <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="" class="btn btn-primary">确定</a>
+                    </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 class="modal-body">
+                        <form>
+                            <div class="form-group">
+                                <label>内容</label>
+                                <textarea class="form-control" rows="5" id="explanationAdd"></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" id="explanationBtn" data-dismiss="modal">确定</a>
+                    </div>
+                </div>
+            </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>
+        </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>
+                                </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>
+        </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>
+                        </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>
+        </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>
+                        </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>
+        </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>
+                        </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>
+        </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="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>
+        <!-- JS. -->
+        <script type="text/javascript" src = "/lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
+        <script>GC.Spread.Sheets.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</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>
+        <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">
+            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], 3);
+                rationGLJOprObj.buildSheet(rdSpread.getSheet(0));
+               // sheetCommonObj.shieldAllCells(rdSpread.getSheet(0), rationGLJOprObj.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);
+
+                $("#linkGLJ").click(function(){
+                    rationGLJOprObj.bindRationGljDelOpr();
+                    rdSpread.setActiveSheetIndex(0);
+                });
+
+                $("#linkFZDE").click(function(){
+                    rationAssistOprObj.bindRationAssDel();
+                    rdSpread.setActiveSheetIndex(1);
+                });
+
+                $("#linkFZTJ").click(function(){
+                    rationCoeOprObj.bindRationCoeDel();
+                    rdSpread.setActiveSheetIndex(2);
+                });
+            });
+        </script>
+    </div>
+</body>
+<script type="text/javascript">
+    autoFlashHeight();
+</script>
+
+</html>

+ 159 - 0
web/building_saas/complementary_ration_lib/html/fuzhu.html

@@ -0,0 +1,159 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <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>
+    <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
+    <link rel="stylesheet" href="/web/maintain/ration_repository/css/main.css">
+    <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
+    <link rel="stylesheet" href="/lib/spreadjs/sheets/css/gc.spread.sheets.excel2013lightGray.10.0.1.css" type="text/css">
+    <!--zTree-->
+    <link rel="stylesheet" href="/lib/ztree/css/zTreeStyle.css" type="text/css">
+</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 class="navbar-text" id="rationname"><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 px-3" id="drirect-dinge" href="javascript:void(0);">定额</a>
+                  </li>
+                  <li class="nav-item">
+                      <a class="nav-link px-3" id="gongliao" href="javascript:void(0);">工料机</a>
+                  </li>
+                  <li class="nav-item">
+                      <a class="nav-link active px-3">附注条件</a>
+                  </li>
+                  <li class="nav-item">
+                      <a class="nav-link px-3" href="#maz">安装增加费</a>
+                  </li>
+
+                  <li class="nav-item">
+                  <!--<input type="button" id="btnAddRow" value="Add Row" />-->
+                  <!--<input type="button" id="btnDeleteRow" value="Delete Row" />-->
+                  </li>
+              </ul>
+        </nav>
+    </div>
+   <!-- <div class="main">
+        <div class="content">
+            <div class="container-fluid">
+                <div class="row">
+                  <div class="main-side col-lg-7 p-0">
+                    <div class="main-data" id="mainSpread"  style="height:1000px;"></div>
+                  </div>
+                  <div class="main-content col-lg-5 p-0">
+                      <div class="main-data" id="contentSpread" style="height:1000px;"></div>
+                  </div>
+                </div>
+            </div>
+        </div>
+    </div>-->
+    <div class="main">
+        <div class="content">
+            <div class="container-fluid">
+                <div class="row">
+                    <div class="main-content col-lg-7 p-0">
+                        <div class="main-data" id="mainSpread">
+                        </div>
+                    </div>
+                    <div class="main-side col-lg-5 p-0">
+                        <div class="main-data" id="contentSpread" >
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <!-- JS. -->
+    <script src="/lib/jquery/jquery.min.js"></script>
+    <script src="/lib/tether/tether.min.js"></script>
+    <script src="/lib/bootstrap/bootstrap.min.js"></script>
+    <script type="text/javascript" src="/web/maintain/ration_repository/js/global.js"></script>
+    <!-- zTree -->
+    <script src = "/lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
+    <script>GC.Spread.Sheets.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</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>
+    <script type="text/javascript" src="/public/web/treeDataHelper.js"></script>
+    <script type="text/javascript" src="/public/web/QueryParam.js"></script>
+    <script src="/public/common_util.js"></script>
+    <script src="/public/debug.js"></script>
+    <script type="text/javascript" src="/public/web/sheet/sheet_common.js"></script>
+    <script type="text/javascript" src="/web/maintain/ration_repository/js/sheetsOpr.js"></script>
+    <script type="text/javascript" src="/public/web/storageUtil.js"></script>
+    <script type="text/javascript" src="/web/maintain/ration_repository/js/coe.js"></script>
+    <script type="text/javascript">
+        $(document).ready(function () {
+            pageObj.initPage();
+        });
+    </script>
+   <!-- <SCRIPT type="text/javascript">
+  		&lt;!&ndash;
+  		var setting = {
+  			view: {
+  				showIcon: false
+  			},
+  			data: {
+  				simpleData: {
+  					enable: true
+  				}
+  			}
+  		};
+
+  		var zNodes =[
+  			{ id:1, pId:0, name:"父节点1 - 展开", open:true},
+  			{ id:11, pId:1, name:"父节点11 - 折叠"},
+  			{ id:111, pId:11, name:"叶子节点111"},
+  			{ id:112, pId:11, name:"叶子节点112"},
+  			{ id:113, pId:11, name:"叶子节点113"},
+  			{ id:114, pId:11, name:"叶子节点114"},
+  			{ id:12, pId:1, name:"父节点12 - 折叠"},
+  			{ id:121, pId:12, name:"叶子节点121"},
+  			{ id:122, pId:12, name:"叶子节点122"},
+  			{ id:123, pId:12, name:"叶子节点123"},
+  			{ id:124, pId:12, name:"叶子节点124"},
+  			{ id:13, pId:1, name:"父节点13 - 没有子节点", isParent:true},
+  			{ id:2, pId:0, name:"父节点2 - 折叠"},
+  			{ id:21, pId:2, name:"父节点21 - 展开", open:true},
+  			{ id:211, pId:21, name:"叶子节点211"},
+  			{ id:212, pId:21, name:"叶子节点212"},
+  			{ id:213, pId:21, name:"叶子节点213"},
+  			{ id:214, pId:21, name:"叶子节点214"},
+  			{ id:22, pId:2, name:"父节点22 - 折叠"},
+  			{ id:221, pId:22, name:"叶子节点221"},
+  			{ id:222, pId:22, name:"叶子节点222"},
+  			{ id:223, pId:22, name:"叶子节点223"},
+  			{ id:224, pId:22, name:"叶子节点224"},
+  			{ id:23, pId:2, name:"父节点23 - 折叠"},
+  			{ id:231, pId:23, name:"叶子节点231"},
+  			{ id:232, pId:23, name:"叶子节点232"},
+  			{ id:233, pId:23, name:"叶子节点233"},
+  			{ id:234, pId:23, name:"叶子节点234"},
+  			{ id:3, pId:0, name:"父节点3 - 没有子节点", isParent:true}
+  		];
+
+  		function showIconForTree(treeId, treeNode) {
+  			return !treeNode.isParent;
+  		};
+
+  		$(document).ready(function(){
+  			$.fn.zTree.init($("#treeDemo"), setting, zNodes);
+  		});
+  		//&ndash;&gt;
+  	</SCRIPT>-->
+</body>
+<script type="text/javascript">
+    autoFlashHeight();
+</script>
+
+</html>

+ 283 - 0
web/building_saas/complementary_ration_lib/html/gongliao.html

@@ -0,0 +1,283 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <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>
+    <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
+    <link rel="stylesheet" href="/web/maintain/ration_repository/css/main.css">
+    <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
+    <link rel="stylesheet" href="/lib/spreadjs/sheets/css/gc.spread.sheets.excel2013lightGray.10.0.1.css" type="text/css">
+    <!--zTree-->
+  	<link rel="stylesheet" href="/lib/ztree/css/zTreeStyle.css" type="text/css">
+    <style type="text/css">
+        .ztree li span.button.add{margin-right:2px;background-position:-144px 0;vertical-align:top;*vertical-align:middle}
+    </style>
+</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 px-3" id="drirect-dinge" href="/rationRepository/ration">定额</a>
+                  </li>
+                  <li class="nav-item">
+                      <a class="nav-link active px-3">工料机</a>
+                  </li>
+                  <li class="nav-item">
+                      <a class="nav-link px-3" id="fuzhu" href="javascript:void(0);">附注条件</a>
+                  </li>
+                  <li class="nav-item">
+                      <a class="nav-link px-3" href="#maz">安装增加费</a>
+                  </li>
+              </ul>
+        </nav>
+    </div>
+    <div class="main">
+        <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-y: auto">
+                        <ul id="repositoryTree" class="ztree"></ul>
+                    </div>
+                    <div class="main-content col-lg-9 p-0">
+                        <div id="GLJListSheet" class="main-data"></div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <!--弹出添加-->
+    <div class="modal fade" id="add" 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>
+                      <input class="form-control" id="gljcode" placeholder="输入编码" type="text">
+                    </div>
+                    <div class="form-group">
+                      <label>名称</label>
+                      <input class="form-control" id="gljname" placeholder="输入名称" type="text">
+                    </div>
+                    <div class="form-group">
+                      <label>规格</label>
+                      <input class="form-control" id="gljgg" placeholder="输入规格" type="text">
+                    </div>
+                    <div class="form-group">
+                      <label>单位</label>
+                      <select class="form-control" id = "gljdw"><option>选择单位</option><option>工日</option><option>t</option><option>m3</option></select>
+                    </div>
+                    <div class="form-group">
+                      <label>基价单价</label>
+                      <input class="form-control" id="gljjj" placeholder="输入基价" type="number">
+                    </div>
+                    <div class="form-group">
+                      <label>类型</label>
+                      <select class="form-control" id="gljlx"><option>人工</option><option>材料</option></select>
+                    </div>
+                  </form>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-secondary" id="btadd" data-dismiss="modal">添加</button>
+                    <a   class="btn btn-primary">取消</a>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <!--弹出编辑-->
+    <div class="modal fade" id="edit" 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>
+                      <input class="form-control" placeholder="输入编码" id="Ecode" type="text" value="">
+                    </div>
+                    <div class="form-group">
+                      <label>名称</label>
+                      <input class="form-control" placeholder="输入名称" id ="Ename" type="text" vaule="">
+                    </div>
+                    <div class="form-group">
+                      <label>规格</label>
+                      <input class="form-control" placeholder="输入规格" id="Eguige" type="text">
+                    </div>
+                    <div class="form-group">
+                      <label>单位</label>
+                      <select class="form-control" id="Edanwei"><option>工日</option></select>
+                    </div>
+                    <div class="form-group">
+                      <label>基价单价</label>
+                      <input class="form-control" id="Ejijia" placeholder="输入基价" type="number" value="">
+                    </div>
+                    <div class="form-group">
+                      <label>类型</label>
+                      <select class="form-control" id="Eleixing"><option>人工</option></select>
+                    </div>
+                  </form>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                    <button type="button" class="btn btn-secondary" id="edtglj" data-dismiss="modal">确定</button>
+
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <!--弹出删除-->
+    <div class="modal fade" id="del" data-backdrop="static" style="display: none;" aria-hidden="true">
+        <input type="hidden" id="did" value="">
+        <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">
+                    <h5 class="text-danger">删除后无法恢复,确认是否删除?</h5>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-secondary"   data-dismiss="modal">取消</button>
+                    <button type="button" class="btn btn-secondary" id="deleteGLJ"  data-dismiss="modal">删除</button>
+                   <!-- <a href="" class="btn btn-danger" >删除</a>-->
+                </div>
+            </div>
+        </div>
+    </div>
+    <button id="gljAlertBtn" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#gljAlert" style="display: none"></button>
+    <button id="codeAlertBtn" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#codeAlert" style="display: none"></button>
+    <div class="modal fade" id="gljAlert" 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="gljAleClose" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">×</span>
+                    </button>
+                </div>
+                <div class="modal-body">
+                    <h5 class="text-danger" id="alertGljTxt">编号和类型不可为空!是否取消操作?</h5>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-secondary" id="aleCanceBtn" data-dismiss="modal">取消</button>
+                    <a href="javascript: void(0);" id="aleConfBtn" class="btn btn-danger" data-dismiss="modal">确认</a>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="modal" id="codeAlert" 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="codAleClose" 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="codAleConfBtn" data-dismiss="modal">确认</button>
+                </div>
+            </div>
+        </div>
+    </div>
+    <!-- JS. -->
+    <script src="/lib/jquery/jquery.min.js"></script>
+    <script src="/lib/tether/tether.min.js"></script>
+    <script src="/lib/bootstrap/bootstrap.min.js"></script>
+    <script type="text/javascript" src="/web/maintain/ration_repository/js/global.js"></script>
+    <!-- zTree -->
+    <script src = "/lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
+    <script>GC.Spread.Sheets.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</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>
+    <script type="text/javascript" src="/public/web/treeDataHelper.js"></script>
+    <script type="text/javascript" src="/public/web/QueryParam.js"></script>
+    <script type="text/javascript" src="/web/maintain/ration_repository/js/repository_glj.js"></script>
+    <script type="text/javascript" src="/public/web/ztree_common.js"></script>
+    <script type="text/javascript" src="/public/web/sheet/sheet_common.js"></script>
+    <script type="text/javascript" src="/web/maintain/ration_repository/js/sheetsOpr.js"></script>
+    <script type="text/javascript" src="/public/web/storageUtil.js"></script>
+    <script type="text/javascript">
+        let userAccount = '<%=userAccount %>';
+        var gljSetting = {
+            view: {
+               // addHoverDom: gljTypeTreeOprObj.addHoverDom,
+               // removeHoverDom: gljTypeTreeOprObj.removeHoverDom,
+                expandSpeed: "",
+                selectedMulti: false
+            },
+            edit: {
+                enable: false,
+                editNameSelectAll: true,
+                showRemoveBtn: true,
+                showRenameBtn: true,
+                removeTitle: "删除节点",
+                renameTitle: "更改名称"
+            },
+            data: {
+                keep: {
+                    parent:true,
+                    leaf:true
+                },
+                key: {
+                    children: "items",
+                    name: "Name"
+                },
+                simpleData: {
+                    enable: false,
+                    idKey: "ID",
+                    pIdKey: "ParentID",
+                    rootPId: -1
+                }
+            },
+            callback:{
+               // beforeRename: gljTypeTreeOprObj.beforeRename,
+                //onRename: gljTypeTreeOprObj.onRename,
+               // beforeRemove: gljTypeTreeOprObj.onBeforeRemove,
+                //onRemove: gljTypeTreeOprObj.onRemove,
+                onClick: gljTypeTreeOprObj.onClick
+            }
+        };
+        $(document).ready(function(){
+            pageOprObj.initPage($("#GLJListSheet")[0]);
+            //repositoryGljObj.buildSheet($("#GLJListSheet")[0]);
+        });
+  	</script>
+</body>
+<script type="text/javascript">
+    autoFlashHeight();
+</script>
+
+</html>

+ 43 - 0
web/building_saas/complementary_ration_lib/js/global.js

@@ -0,0 +1,43 @@
+/*全局自适应高度*/
+function autoFlashHeight(){
+    var headerHeight = $(".header").height();
+    var bottomContentHeight = $(".bottom-content").height();
+    var toolsBar = $(".tools-bar").height();
+    $(".content").height($(window).height()-headerHeight);
+    $(".main-side").height($(window).height()-headerHeight-2);
+    $(".fluid-content").height($(window).height()-headerHeight-1);
+    $(".side-content").height($(window).height()-headerHeight );
+    $(".poj-list").height($(window).height()-headerHeight);
+    $(".form-list").height($(window).height()-headerHeight-50 );
+    $(".main-data-top").height($(window).height()-headerHeight-toolsBar-bottomContentHeight-2);
+    $(".main-data").height($(window).height()-headerHeight);
+    $(".main-side .tab-content").height($(window).height()-headerHeight-38);
+};
+$(window).resize(autoFlashHeight);
+/*全局自适应高度结束*/
+$(function(){
+/*侧滑*/
+$(".open-sidebar").click(function(){
+    $(".slide-sidebar").animate({width:"800"}).addClass("open");
+});
+$("body").click(function(event){
+        var e = event || window.event; //浏览器兼容性
+        if(!$(event.target).is('a')) {
+            var elem = event.target || e.srcElement;
+            while (elem) { //循环判断至跟节点,防止点击的是div子元素
+                if (elem.className == "open-sidebar" || elem.className == 'slide-sidebar open') {
+                    return false;
+                }
+                elem = elem.parentNode;
+            }
+            $(".slide-sidebar").animate({width:"0"}).removeClass("open")// 关闭处理
+        }
+
+    });
+/*侧滑*/
+/*工具提示*/
+$('*[data-toggle=tooltip]').mouseover(function() {
+ $(this).tooltip('show');
+  });
+/*工具提示*/
+});

+ 33 - 0
web/building_saas/complementary_ration_lib/js/main.js

@@ -0,0 +1,33 @@
+/**
+ * Created by Zhong on 2017/12/22.
+ */
+
+let compleRationMain = {
+    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){
+                    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);
+            }
+        };
+        CommonAjax.post('/complementaryRation/api/getRationLibs', {user_id: userID}, scFunc);
+    }
+};
+
+$(document).ready(function () {
+    $('#comple-ration').on('shown.bs.modal', function () {
+        compleRationMain.getRationLibs();
+    });
+});

+ 6 - 0
web/building_saas/css/main.css

@@ -328,4 +328,10 @@ label.title{
 
 
 .gc-column-header-cell{
 .gc-column-header-cell{
     text-align: center!important;
     text-align: center!important;
+}
+div.resize{
+    height: 4px;
+    background: #f7f7f9;
+    width: 100%;
+    cursor: s-resize;
 }
 }

+ 26 - 0
web/building_saas/glj/js/common_spread.js

@@ -294,4 +294,30 @@ CommonSpreadJs.prototype.getActiveDataByField = function(field) {
 
 
     result = this.sheet.getValue(activeGLJRow, column);
     result = this.sheet.getValue(activeGLJRow, column);
     return result;
     return result;
+};
+CommonSpreadJs.prototype.setProjectGLJDiffPrice = function (data) {
+    if(gljOprObj.calcPriceDiff(data)==true){//是否记算价差
+        data.base_price = data.unit_price.base_price;
+        data.adjust_price = projectObj.project.projectGLJ.getAdjustPrice(data);
+    }else {
+        data.base_price = data.unit_price.market_price;
+        data.adjust_price = data.unit_price.market_price;
+    }
+    return data;
+};
+
+CommonSpreadJs.prototype.getUnitPrice = function (data) {
+    let gljList=projectObj.project.projectGLJ.datas.gljList;
+    var pg = _.find(gljList, {
+        'code': data.code,
+        'name': data.name,
+        'specs': data.specs,
+        'type': data.type,
+        'unit': data.unit
+    })
+    if(pg){
+        return pg.unit_price;
+    }
+
+    return null;
 };
 };

+ 2 - 2
web/building_saas/glj/js/composition.js

@@ -67,9 +67,9 @@ function compositionSuccess(info) {
     let row= projectGLJSheet.sheet.getActiveRowIndex();//取父机械或组成物的下标
     let row= projectGLJSheet.sheet.getActiveRowIndex();//取父机械或组成物的下标
     let parentData = jsonData[row];
     let parentData = jsonData[row];
     let ratioData = _.find(parentData.ratio_data,{"id":info.id});
     let ratioData = _.find(parentData.ratio_data,{"id":info.id});
-    let con_key = gljOprObj.getIndex(ratioData,['code', 'name', 'specs', 'unit', 'type']);
+    let con_key = gljOprObj.getIndex(ratioData,gljKeyArray);
     for(let i=0;i< jsonData.length;i++){
     for(let i=0;i< jsonData.length;i++){
-        let tem_key = gljOprObj.getIndex(jsonData[i],['code', 'name', 'specs', 'unit', 'type']);
+        let tem_key = gljOprObj.getIndex(jsonData[i],gljKeyArray);
         if(con_key == tem_key){
         if(con_key == tem_key){
             //乘以父工料机的消耗量得到该组成物总消耗量的改变量
             //乘以父工料机的消耗量得到该组成物总消耗量的改变量
             info.change = operationWithRound(parentData.quantity,info.change,"glj.quantity","*");
             info.change = operationWithRound(parentData.quantity,info.change,"glj.quantity","*");

+ 8 - 3
web/building_saas/glj/js/composition_spread.js

@@ -32,7 +32,7 @@ CompositionSpread.prototype.init = function(target) {
         {name: '单位', field: 'unit', visible: true},
         {name: '单位', field: 'unit', visible: true},
         {name: 'ID', field: 'id', visible: false},
         {name: 'ID', field: 'id', visible: false},
         {name: '类型', field: 'unit_price.type', visible: false},
         {name: '类型', field: 'unit_price.type', visible: false},
-        {name: '定额价', field: "unit_price.base_price", visible: true,decimalField:"glj.unitPrice"},
+        {name: '定额价', field: "base_price", visible: true,decimalField:"glj.unitPrice"},
         {name: '调整价', field: 'adjust_price', visible: true,decimalField:"glj.unitPrice"},
         {name: '调整价', field: 'adjust_price', visible: true,decimalField:"glj.unitPrice"},
         {name: '市场价', field: "unit_price.market_price", visible: true,decimalField:"glj.unitPrice"},
         {name: '市场价', field: "unit_price.market_price", visible: true,decimalField:"glj.unitPrice"},
         {name: name, field: 'consumption', visible: true, validator: 'number',decimalField:'glj.quantity'},
         {name: name, field: 'consumption', visible: true, validator: 'number',decimalField:'glj.quantity'},
@@ -46,7 +46,7 @@ CompositionSpread.prototype.init = function(target) {
     let codeColumn = this.sheetObj.getFieldColumn('code');
     let codeColumn = this.sheetObj.getFieldColumn('code');
     let unitColumn = this.sheetObj.getFieldColumn('unit');
     let unitColumn = this.sheetObj.getFieldColumn('unit');
     let consumptionColumn = this.sheetObj.getFieldColumn('consumption');
     let consumptionColumn = this.sheetObj.getFieldColumn('consumption');
-    let basePriceCol = this.sheetObj.getFieldColumn('unit_price.base_price');
+    let basePriceCol = this.sheetObj.getFieldColumn('base_price');
     let adjustPriceCol = this.sheetObj.getFieldColumn('adjust_price');
     let adjustPriceCol = this.sheetObj.getFieldColumn('adjust_price');
     let marketPriceCol = this.sheetObj.getFieldColumn('unit_price.market_price');
     let marketPriceCol = this.sheetObj.getFieldColumn('unit_price.market_price');
     // 居中样式
     // 居中样式
@@ -154,6 +154,8 @@ CompositionSpread.prototype.specialColumn = function(sourceData) {
     let rowCounter = 0;
     let rowCounter = 0;
     // 获取市场单价列号
     // 获取市场单价列号
     let consumptionColumn = this.sheetObj.getFieldColumn('consumption');
     let consumptionColumn = this.sheetObj.getFieldColumn('consumption');
+    let basePriceColumn = this.sheetObj.getFieldColumn('base_price');
+    let adjustPriceColumn = this.sheetObj.getFieldColumn('adjust_price');
     let idColumn = this.sheetObj.getFieldColumn('mix_ratio_id');
     let idColumn = this.sheetObj.getFieldColumn('mix_ratio_id');
     let activeSheet = this.sheetObj.getSheet();
     let activeSheet = this.sheetObj.getSheet();
     for(let data of sourceData) {
     for(let data of sourceData) {
@@ -162,6 +164,9 @@ CompositionSpread.prototype.specialColumn = function(sourceData) {
             activeSheet.setValue(rowCounter, consumptionColumn, data.ratio_data.consumption);
             activeSheet.setValue(rowCounter, consumptionColumn, data.ratio_data.consumption);
             activeSheet.setValue(rowCounter, idColumn, data.ratio_data.id);
             activeSheet.setValue(rowCounter, idColumn, data.ratio_data.id);
         }
         }
+        data=this.sheetObj.setProjectGLJDiffPrice(data);
+        activeSheet.setValue(rowCounter, basePriceColumn, data.base_price);
+        activeSheet.setValue(rowCounter, adjustPriceColumn, data.adjust_price);
         rowCounter++;
         rowCounter++;
     }
     }
 };
 };
@@ -249,7 +254,7 @@ CompositionSpread.prototype.getCompositionSumPrice = function(scene, affectRow,
     // 获取对应列的列号
     // 获取对应列的列号
     let marketPriceColumn = this.sheetObj.getFieldColumn('unit_price.market_price');
     let marketPriceColumn = this.sheetObj.getFieldColumn('unit_price.market_price');
     let consumptionColumn = this.sheetObj.getFieldColumn('consumption');
     let consumptionColumn = this.sheetObj.getFieldColumn('consumption');
-    let basePriceColumn = this.sheetObj.getFieldColumn('unit_price.base_price');
+    let basePriceColumn = this.sheetObj.getFieldColumn('base_price');
 
 
     let parentMarketPrice = 0;
     let parentMarketPrice = 0;
     let parentBasePrice = 0;
     let parentBasePrice = 0;

+ 30 - 3
web/building_saas/glj/js/project_glj.js

@@ -26,6 +26,7 @@ let usedTenderList = [];
 let otherFileData = {};
 let otherFileData = {};
 let currentTag = '';
 let currentTag = '';
 let isChanging = false;
 let isChanging = false;
+let initPage = false;
 $(document).ready(function () {
 $(document).ready(function () {
     $('#tab_gongliaoji').on('show.bs.tab', function (e) {
     $('#tab_gongliaoji').on('show.bs.tab', function (e) {
         $(e.relatedTarget.hash).removeClass('active');
         $(e.relatedTarget.hash).removeClass('active');
@@ -225,7 +226,7 @@ $(document).ready(function () {
  */
  */
 function init() {
 function init() {
     projectObj.project.projectGLJ.loadData(function (data) {
     projectObj.project.projectGLJ.loadData(function (data) {
-        if (jsonData.length <= 0) {
+        if (initPage==false||jsonData.length <= 0) {
             // 赋值
             // 赋值
             jsonData = data.gljList !== undefined && data.gljList.length > 0 ? data.gljList : [];
             jsonData = data.gljList !== undefined && data.gljList.length > 0 ? data.gljList : [];
             jsonData = filterProjectGLJ(jsonData);
             jsonData = filterProjectGLJ(jsonData);
@@ -245,6 +246,7 @@ function init() {
             unitPriceFileInit();
             unitPriceFileInit();
 
 
             setTimeout(spreadInit, 1);
             setTimeout(spreadInit, 1);
+            initPage=true;
         } else {
         } else {
             projectObj.project.projectGLJ.loadCacheData();
             projectObj.project.projectGLJ.loadCacheData();
         }
         }
@@ -325,7 +327,7 @@ function getUsedTenderInfo() {
  * @param {object} info
  * @param {object} info
  * @return {void}
  * @return {void}
  */
  */
-function successTrigger(field, info) {
+function successTrigger(field, info,id) {
     let updateData = {};
     let updateData = {};
     switch (field) {
     switch (field) {
         case 'unit_price.market_price':
         case 'unit_price.market_price':
@@ -334,22 +336,47 @@ function successTrigger(field, info) {
 
 
             // 触发websocket通知
             // 触发websocket通知
             socket.emit('dataNotify', JSON.stringify(info));
             socket.emit('dataNotify', JSON.stringify(info));
-            console.log(info);
             break;
             break;
         case 'supply':
         case 'supply':
             // 供货方式更改成功后
             // 供货方式更改成功后
             projectGLJSpread.changeSupplyType(info);
             projectGLJSpread.changeSupplyType(info);
             break;
             break;
+        case 'is_evaluate':
+            changeIsEvaluate(id);
+            break;
     }
     }
     // 重新加载数据到缓存
     // 重新加载数据到缓存
     projectObj.project.projectGLJ.loadData(function () {
     projectObj.project.projectGLJ.loadData(function () {
         projectObj.project.projectGLJ.loadCacheData();
         projectObj.project.projectGLJ.loadCacheData();
+        $.bootstrapLoading.end();
     });
     });
 
 
     // 更新定额工料机
     // 更新定额工料机
     gljOprObj.refreshView();
     gljOprObj.refreshView();
 }
 }
 
 
+//更新是否暂估
+function changeIsEvaluate (id){
+    let projectGLJ = projectObj.project.projectGLJ
+    let datas = projectGLJ.datas;
+    let gljList = datas.gljList;
+    let glj = _.find(gljList, {'id': id});
+    if(glj){
+        let con_key = gljOprObj.getIndex(glj,gljKeyArray);
+        let pratioM =datas.mixRatioConnectData[con_key];//找到父key
+        let conditions = [];
+        if(pratioM&&pratioM.length>0){
+            for(let p_key in pratioM ){
+                conditions.push(gljOprObj.getConditionByKey(p_key));
+            }
+        }
+        let gljs = projectGLJ.getProjectGLJs(conditions,false);
+        gljs.push(glj);
+        let nodes = projectGLJ.getImpactRationNodes(gljs);//取到因为改变工料机价格而受影响的定额
+        projectObj.project.calcProgram.calcRationsAndSave(nodes);//触发计算程序
+    }
+}
+
 /**
 /**
  * socket.io相关初始化
  * socket.io相关初始化
  *
  *

+ 69 - 63
web/building_saas/glj/js/project_glj_spread.js

@@ -19,7 +19,7 @@ function ProjectGLJSpread() {
     this.successCallback = null;
     this.successCallback = null;
     this.supplyType = ['自行采购', '部分甲供', '完全甲供', '甲定乙供'];
     this.supplyType = ['自行采购', '部分甲供', '完全甲供', '甲定乙供'];
     // 工料机类型是混凝土、砂浆、配合比、机械(不包括机械组成物)时,供货方式列只读。
     // 工料机类型是混凝土、砂浆、配合比、机械(不包括机械组成物)时,供货方式列只读。
-    this.supplyReadonlyType = [GLJTypeConst.CONCRETE, GLJTypeConst.MORTAR, GLJTypeConst.MIX_RATIO, GLJTypeConst.GENERAL_MACHINE];
+    this.supplyReadonlyType = notEditType;
 }
 }
 
 
 /**
 /**
@@ -48,7 +48,7 @@ ProjectGLJSpread.prototype.init = function () {
         {name: 'ID', field: 'id', visible: false},
         {name: 'ID', field: 'id', visible: false},
         {name: '类型', field: 'unit_price.type', visible: false},
         {name: '类型', field: 'unit_price.type', visible: false},
         {name: '总消耗量', field: 'quantity', visible: true,width:100,decimalField:'glj.quantity'},
         {name: '总消耗量', field: 'quantity', visible: true,width:100,decimalField:'glj.quantity'},
-        {name: '定额价', field: "unit_price.base_price", visible: true,width:70,decimalField:"glj.unitPrice"},
+        {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: 'adjust_price', visible: true,width:70,decimalField:"glj.unitPrice"},
         {name: '市场价', field: "unit_price.market_price", visible: true, validator: 'number',width:70,decimalField:"glj.unitPrice"},
         {name: '市场价', field: "unit_price.market_price", visible: true, validator: 'number',width:70,decimalField:"glj.unitPrice"},
         {
         {
@@ -87,7 +87,7 @@ ProjectGLJSpread.prototype.init = function () {
     let isAdjustPriceColumn = this.sheetObj.getFieldColumn('is_adjust_price');
     let isAdjustPriceColumn = this.sheetObj.getFieldColumn('is_adjust_price');
     let unitColumn = this.sheetObj.getFieldColumn('unit');
     let unitColumn = this.sheetObj.getFieldColumn('unit');
     let quantityColumn = this.sheetObj.getFieldColumn('quantity');
     let quantityColumn = this.sheetObj.getFieldColumn('quantity');
-    let basePriceColumn = this.sheetObj.getFieldColumn('unit_price.base_price');
+    let basePriceColumn = this.sheetObj.getFieldColumn('base_price');
     let adjustPriceColumn = this.sheetObj.getFieldColumn('adjust_price');
     let adjustPriceColumn = this.sheetObj.getFieldColumn('adjust_price');
     let marketPriceColumn = this.sheetObj.getFieldColumn('unit_price.market_price');
     let marketPriceColumn = this.sheetObj.getFieldColumn('unit_price.market_price');
     let supplyColumn = this.sheetObj.getFieldColumn('supply');
     let supplyColumn = this.sheetObj.getFieldColumn('supply');
@@ -112,6 +112,7 @@ ProjectGLJSpread.prototype.init = function () {
     this.sheetObj.setStyle(-1, supplyQuantity, rightStyleSetting);
     this.sheetObj.setStyle(-1, supplyQuantity, rightStyleSetting);
 
 
     // 设置可编辑列
     // 设置可编辑列
+    this.sheetObj.setColumnEditable(basePriceColumn);
     this.sheetObj.setColumnEditable(marketPriceColumn);
     this.sheetObj.setColumnEditable(marketPriceColumn);
     this.sheetObj.setColumnEditable(isEvaluateColumn);
     this.sheetObj.setColumnEditable(isEvaluateColumn);
     this.sheetObj.setColumnEditable(isAdjustPriceColumn);
     this.sheetObj.setColumnEditable(isAdjustPriceColumn);
@@ -198,7 +199,8 @@ ProjectGLJSpread.prototype.updateProjectGLJField = function(info, callback) {
 
 
     // 直接在前端计算后传值后台改
     // 直接在前端计算后传值后台改
     let extend = {};
     let extend = {};
-    let parentMarketPrice = projectGLJSpread.compositionCalculate(row);
+/*    let updateRecord = jsonData[row];  这时修改成在后端计算后直接更新,因为还要重新计算受影响的清单节点
+    let parentMarketPrice = projectGLJSpread.compositionCalculate(updateRecord);
     if (parentMarketPrice !== null && Object.keys(parentMarketPrice).length > 0) {
     if (parentMarketPrice !== null && Object.keys(parentMarketPrice).length > 0) {
         for (let activeCode in parentMarketPrice) {
         for (let activeCode in parentMarketPrice) {
             let tmpObject = {
             let tmpObject = {
@@ -206,7 +208,7 @@ ProjectGLJSpread.prototype.updateProjectGLJField = function(info, callback) {
             };
             };
             extend[activeCode] = tmpObject;
             extend[activeCode] = tmpObject;
         }
         }
-    }
+    }*/
 
 
     // 如果是供货方式则需要处理数据
     // 如果是供货方式则需要处理数据
     if (field === 'supply') {
     if (field === 'supply') {
@@ -216,10 +218,18 @@ ProjectGLJSpread.prototype.updateProjectGLJField = function(info, callback) {
     if(field === 'supply_quantity'){//修改数量需做4舍5入
     if(field === 'supply_quantity'){//修改数量需做4舍5入
         value= value.toDecimal(getDecimal('glj.quantity'));
         value= value.toDecimal(getDecimal('glj.quantity'));
     }
     }
-    if(field === 'unit_price.market_price'){
-        value= value.toDecimal(getDecimal('glj.unitPrice'));
+    if(field === 'unit_price.market_price'||field === 'base_price'){
+        value= scMathUtil.roundForObj(value,getDecimal('glj.unitPrice'));//修改市场价和修改定额价时需要重新记算很多受影响的树节点,现在改成与定字额工料机那里调相同的方法。
+        let editField = field === 'base_price'?field:"market_price";
+        projectObj.project.projectGLJ.updatePrice(jsonData[row],editField,value);
+        return;
     }
     }
     extend = Object.keys(extend).length > 0 ?  JSON.stringify(extend) : '';
     extend = Object.keys(extend).length > 0 ?  JSON.stringify(extend) : '';
+    this.postUpdate(id,field,value,info,extend,callback);
+};
+
+ProjectGLJSpread.prototype.postUpdate=function (id,field,value,info,extend,callback) {
+    $.bootstrapLoading.start();
     $.ajax({
     $.ajax({
         url: '/glj/update',
         url: '/glj/update',
         type: 'post',
         type: 'post',
@@ -235,22 +245,25 @@ ProjectGLJSpread.prototype.updateProjectGLJField = function(info, callback) {
         success: function(response) {
         success: function(response) {
             isChanging = false;
             isChanging = false;
             // 修改失败则恢复原值
             // 修改失败则恢复原值
-            if (response.err !== 0) {
-                activeSheet.setValue(row, column, info.oldValue);
+            if (response.err !== 0&&info.fromRG!=true) {
+                projectGLJSheet.getSheet().setValue(info.row, info.col, info.oldValue);
                 alert('更改数据失败!');
                 alert('更改数据失败!');
             } else {
             } else {
                 // 成功则触发相应事件
                 // 成功则触发相应事件
-                if (parentMarketPrice !== null) {
-                    info.parentMarketPrice = parentMarketPrice;
+                /* if (parentMarketPrice !== null) {
+                 info.parentMarketPrice = parentMarketPrice;
+                 }*/
+                if(field !== 'supply'&&info.fromRG!=true){ //供货方式需做转换才能直接设置值, 这里设置值是为了早点更新数据,等getdata返回数据再刷新的话会有比较大的延时
+                    projectGLJSheet.getSheet().setValue(info.row, info.col, value);
                 }
                 }
-                if(field !== 'supply'){ //供货方式需做转换才能直接设置值, 这里设置值是为了早点更新数据,等getdata返回数据再刷新的话会有比较大的延时
-                    activeSheet.setValue(row, column, value);
-                }
-                callback(field, info);
+                callback(field, info,id);
             }
             }
         }
         }
     });
     });
-};
+
+
+}
+
 
 
 /**
 /**
  * 设置特殊单元格数据
  * 设置特殊单元格数据
@@ -263,6 +276,7 @@ ProjectGLJSpread.prototype.specialColumn = function (sourceData) {
     // 获取列号
     // 获取列号
     let isEvaluateColumn = this.sheetObj.getFieldColumn('is_evaluate');
     let isEvaluateColumn = this.sheetObj.getFieldColumn('is_evaluate');
     let marketPriceColumn = this.sheetObj.getFieldColumn('unit_price.market_price');
     let marketPriceColumn = this.sheetObj.getFieldColumn('unit_price.market_price');
+    let basePriceColumn = this.sheetObj.getFieldColumn('base_price');
     let adjustPriceColumn = this.sheetObj.getFieldColumn("adjust_price");
     let adjustPriceColumn = this.sheetObj.getFieldColumn("adjust_price");
     let connectCodeColumn = this.sheetObj.getFieldColumn('connect_code');
     let connectCodeColumn = this.sheetObj.getFieldColumn('connect_code');
     let consumptionColumn = this.sheetObj.getFieldColumn('consumption');
     let consumptionColumn = this.sheetObj.getFieldColumn('consumption');
@@ -311,18 +325,22 @@ ProjectGLJSpread.prototype.specialColumn = function (sourceData) {
             this.firstMachineRow = this.firstMachineRow === -1 && data.unit_price.type === GLJTypeConst.GENERAL_MACHINE ?
             this.firstMachineRow = this.firstMachineRow === -1 && data.unit_price.type === GLJTypeConst.GENERAL_MACHINE ?
                 rowCounter : this.firstMachineRow;
                 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, 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);
+        }
 
 
         // 处理数据
         // 处理数据
         if (data.ratio_data !== undefined && data.ratio_data.length > 0) {
         if (data.ratio_data !== undefined && data.ratio_data.length > 0) {
             let connectCode = [];
             let connectCode = [];
             let consumption = [];
             let consumption = [];
             for (let tmp of data.ratio_data) {
             for (let tmp of data.ratio_data) {
-                connectCode.push(tmp.connect_code);
+                connectCode.push(tmp.connect_key);
                 consumption.push(tmp.consumption);
                 consumption.push(tmp.consumption);
             }
             }
             let connectCodeString = connectCode.join(',');
             let connectCodeString = connectCode.join(',');
@@ -330,7 +348,8 @@ ProjectGLJSpread.prototype.specialColumn = function (sourceData) {
             activeSheet.setValue(rowCounter, connectCodeColumn, connectCodeString);
             activeSheet.setValue(rowCounter, connectCodeColumn, connectCodeString);
             activeSheet.setValue(rowCounter, consumptionColumn, consumptionString);
             activeSheet.setValue(rowCounter, consumptionColumn, consumptionString);
         }
         }
-        data.adjust_price = projectObj.project.projectGLJ.getAdjustPrice(data);
+        data=this.sheetObj.setProjectGLJDiffPrice(data);
+        activeSheet.setValue(rowCounter,basePriceColumn,data.base_price);
         activeSheet.setValue(rowCounter,adjustPriceColumn,data.adjust_price);
         activeSheet.setValue(rowCounter,adjustPriceColumn,data.adjust_price);
         rowCounter++;
         rowCounter++;
     }
     }
@@ -342,53 +361,29 @@ ProjectGLJSpread.prototype.specialColumn = function (sourceData) {
  * @param {Number} row
  * @param {Number} row
  * @return {Object}
  * @return {Object}
  */
  */
-ProjectGLJSpread.prototype.compositionCalculate = function(row) {
-    let activeSheet = this.sheetObj.getSheet();
-    // 获取相关列号
-    let connectCodeColumn = this.sheetObj.getFieldColumn('connect_code');
-    let consumptionColumn = this.sheetObj.getFieldColumn('consumption');
-    let marketPriceColumn = this.sheetObj.getFieldColumn('unit_price.market_price');
-
-    let activeConnectCode = activeSheet.getValue(row, connectCodeColumn);
-    // 不属于组成物则忽略
-    if (activeConnectCode === '' || activeConnectCode === null) {
+ProjectGLJSpread.prototype.compositionCalculate = function(updateRecord) {
+    let gljData = projectObj.project.projectGLJ.datas;
+    let m_index = gljOprObj.getIndex(updateRecord,gljKeyArray);
+    let parent_connect_keys = gljData.mixRatioConnectData[m_index];
+    if(!parent_connect_keys||parent_connect_keys.length<=0){// 不属于组成物则忽略
         return null;
         return null;
     }
     }
-    activeConnectCode = activeConnectCode.split(',');
-    // 计算同级组成物的价格
-    // 遍历所有记录
-    let maxRow = activeSheet.getRowCount();
-
+    let q_decimal = getDecimal("glj.quantity");
+    let p_decimal = getDecimal("glj.unitPrice");
     let parentMarketPrice = {};
     let parentMarketPrice = {};
-    for (let i = 0; i < maxRow; i++) {
-        let connectCode = activeSheet.getValue(i, connectCodeColumn);
-        if (connectCode === null) {
-            continue;
-        }
-        connectCode = connectCode.split(',');
-        // 消耗量
-        let consumption = activeSheet.getValue(i, consumptionColumn);
-        consumption = consumption.split(',');
-
-        // 获取市场价
-        let marketPrice = activeSheet.getValue(i, marketPriceColumn);
-
-        for (let active of activeConnectCode) {
-            let index = connectCode.indexOf(active);
-            if (index < 0) {
-                continue;
+    for(let p  of parent_connect_keys) {
+        let mix_ratios = gljData.mixRatioMap[p];
+        let sum = 0;
+        for (let m of mix_ratios) {
+            let unitPrice = this.sheetObj.getUnitPrice(m);
+            if (unitPrice) {
+                let com = scMathUtil.roundForObj(m.consumption, q_decimal);
+                let marketPrice = scMathUtil.roundForObj(unitPrice.market_price, p_decimal);
+                sum = scMathUtil.roundForObj(marketPrice * com + sum, p_decimal);
             }
             }
-            let rowConsumption = consumption[index] === undefined ? 0 : consumption[index];
-            let decimal = getDecimal("glj.unitPrice");
-            // 计算价格
-            let rowMarketPrice = (marketPrice * rowConsumption).toDecimal(decimal);
-            parentMarketPrice[active] = parentMarketPrice[active] === undefined ?
-                rowMarketPrice : (parentMarketPrice[active] + rowMarketPrice).toDecimal(decimal);
-
         }
         }
-
+        parentMarketPrice[p]=sum;
     }
     }
-
     return parentMarketPrice;
     return parentMarketPrice;
 };
 };
 
 
@@ -417,12 +412,23 @@ ProjectGLJSpread.prototype.compositionParentUpdate = function(parentMarketPrice)
 ProjectGLJSpread.prototype.priceCalculate = function(info) {
 ProjectGLJSpread.prototype.priceCalculate = function(info) {
     let row = info.row;
     let row = info.row;
     let typeColumn = this.sheetObj.getFieldColumn('unit_price.type');
     let typeColumn = this.sheetObj.getFieldColumn('unit_price.type');
-    let basePriceColumn = this.sheetObj.getFieldColumn('unit_price.base_price');
+    let basePriceColumn = this.sheetObj.getFieldColumn('base_price');
     let adjustPriceColumn = projectGLJSheet.getFieldColumn('adjust_price');
     let adjustPriceColumn = projectGLJSheet.getFieldColumn('adjust_price');
     let activeSheet = this.sheetObj.getSheet();
     let activeSheet = this.sheetObj.getSheet();
 
 
     // 获取类型
     // 获取类型
     let type = activeSheet.getValue(row, typeColumn);
     let type = activeSheet.getValue(row, typeColumn);
+  /*  let data = jsonData[row];
+    if(gljOprObj.calcPriceDiff(data)==true){//是否记算价差
+        data.base_price = data.unit_price.base_price;
+        data.adjust_price = projectObj.project.projectGLJ.getAdjustPrice(data);
+    }else {
+        data.base_price = data.unit_price.market_price;
+        data.adjust_price = data.unit_price.market_price;
+    }
+    activeSheet.setValue(info.row,basePriceColumn,data.base_price);
+    activeSheet.setValue(info.row,adjustPriceColumn,data.adjust_price);*/
+
 
 
   /*  // 基价单价计算
   /*  // 基价单价计算
     switch (type) {
     switch (type) {
@@ -433,7 +439,7 @@ ProjectGLJSpread.prototype.priceCalculate = function(info) {
             break;
             break;
     }*/
     }*/
 
 
-    // 调整基价计算
+ /*   // 调整基价计算
     switch (type) {
     switch (type) {
         // 材料、主材、设备 调整基价=基价单价
         // 材料、主材、设备 调整基价=基价单价
         case GLJTypeConst.MAIN_MATERIAL:
         case GLJTypeConst.MAIN_MATERIAL:
@@ -442,7 +448,7 @@ ProjectGLJSpread.prototype.priceCalculate = function(info) {
             activeSheet.setValue(info.row, adjustPriceColumn, basePrice);
             activeSheet.setValue(info.row, adjustPriceColumn, basePrice);
             break;
             break;
 
 
-    }
+    }*/
 
 
     // 市场单价计算
     // 市场单价计算
     switch (type) {
     switch (type) {

+ 23 - 4
web/building_saas/main/html/main.html

@@ -84,6 +84,7 @@
                           <div class="top-content">
                           <div class="top-content">
                               <div class="main-data-top" id="billsSpread"></div>
                               <div class="main-data-top" id="billsSpread"></div>
                           </div>
                           </div>
+                          <div class="resize"></div>
                           <div class="bottom-content">
                           <div class="bottom-content">
                               <ul class="nav nav-tabs" role="tablist">
                               <ul class="nav nav-tabs" role="tablist">
                                   <li class="nav-item">
                                   <li class="nav-item">
@@ -107,9 +108,6 @@
                                   <li class="nav-item">
                                   <li class="nav-item">
                                       <a class="nav-link" id="linkTZJNR" data-toggle="tab" href="#subSpread" role="tab">特征及内容</a>
                                       <a class="nav-link" id="linkTZJNR" data-toggle="tab" href="#subSpread" role="tab">特征及内容</a>
                                   </li>
                                   </li>
-                                  <li class="nav-item ml-auto mr-4">
-                                      <a class="nav-link text-muted position-absolute resize" data-toggle="tooltip" data-placement="bottom" title="按住,上下拖动调整高度"><i class="fa fa-arrows-v"></i></a>
-                                  </li>
                               </ul>
                               </ul>
                               <!-- Tab panes -->
                               <!-- Tab panes -->
                               <div class="tab-content" id="tabCon">
                               <div class="tab-content" id="tabCon">
@@ -289,7 +287,7 @@
                                 <li class="nav-item"><a class="nav-link active" data-toggle="pill" href="#poj-settings-basicInfo" role="tab" id="tab_poj-settings-basicInfo">基本信息</a></li>
                                 <li class="nav-item"><a class="nav-link active" data-toggle="pill" href="#poj-settings-basicInfo" role="tab" id="tab_poj-settings-basicInfo">基本信息</a></li>
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-projFeature" id="tab_poj-settings-projFeature" role="tab">工程特征</a></li>
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-projFeature" id="tab_poj-settings-projFeature" role="tab">工程特征</a></li>
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-3" role="tab">指标信息</a></li>
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-3" role="tab">指标信息</a></li>
-                                <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-4" role="tab">关于计算</a></li>
+                                <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-4" id="about-calc" role="tab">关于计算</a></li>
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-billsQuanDecimal" id="tab_poj-settings-bqDecimal" role="tab">清单工程量精度</a></li>
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-billsQuanDecimal" id="tab_poj-settings-bqDecimal" role="tab">清单工程量精度</a></li>
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-decimal" role="tab" id="tab_poj-settings-decimal">小数位数</a></li>
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-decimal" role="tab" id="tab_poj-settings-decimal">小数位数</a></li>
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-6" role="tab" id="tab_poj-settings-6">人工单价调整</a></li>
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-6" role="tab" id="tab_poj-settings-6">人工单价调整</a></li>
@@ -360,6 +358,27 @@
                                                 </label>
                                                 </label>
                                             </div>
                                             </div>
                                         </fieldset>
                                         </fieldset>
+                                        <fieldset class="form-group">
+                                            <h5>计算选项</h5>
+                                            <div class="form-check">
+                                                <label class="form-check-label">
+                                                    <input class="form-check-input" type="checkbox" id="calc_main">
+                                                    主材、设备、未计价材料计取价差
+                                                </label>
+                                            </div>
+                                            <div class="form-check">
+                                                <label class="form-check-label">
+                                                    <input class="form-check-input" type="checkbox" id="calc_add">
+                                                    新增工料机计取价差
+                                                </label>
+                                            </div>
+                                            <div class="form-check">
+                                                <label class="form-check-label">
+                                                    <input class="form-check-input" type="checkbox" id="calc_est">
+                                                    暂估材料计取价差
+                                                </label>
+                                            </div>
+                                        </fieldset>
                                     </div>
                                     </div>
                                 </div>
                                 </div>
                                 <!--清单工程精度-->
                                 <!--清单工程精度-->

+ 2 - 2
web/building_saas/main/js/main.js

@@ -68,7 +68,7 @@ function slideResize(rootElement, callback) {
         // 获取下部分的高度
         // 获取下部分的高度
         bottomContentHeight = bottomContentEle.height();
         bottomContentHeight = bottomContentEle.height();
         // nav高度部分
         // nav高度部分
-        navHeight = bottomContentEle.children('ul.nav').height();
+        navHeight = bottomContentEle.children('ul.nav').height() + 4;
         element.tooltip('hide');
         element.tooltip('hide');
     });
     });
 
 
@@ -120,7 +120,7 @@ function loadSize(tag, callback) {
     if (topHeight === null || bottomHeight === null) {
     if (topHeight === null || bottomHeight === null) {
         return;
         return;
     }
     }
-    const navHeight = $("#"+ tag +" .bottom-content").children('ul.nav').height();
+    const navHeight = $("#"+ tag +" .bottom-content").children('ul.nav').height() + 4;
     topHeight = parseFloat(topHeight);
     topHeight = parseFloat(topHeight);
     bottomHeight = parseFloat(bottomHeight);
     bottomHeight = parseFloat(bottomHeight);
     $("#"+ tag +" .main-data-top").height(topHeight);
     $("#"+ tag +" .main-data-top").height(topHeight);

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

@@ -536,11 +536,6 @@ class CalcProgram {
                 template.compiledSeq.push(itemIdx);
                 template.compiledSeq.push(itemIdx);
             }
             }
         };
         };
-        let private_setup_seq = function(item, itemIdx){
-            if (template.compiledSeq.indexOf(itemIdx) < 0) {
-                private_parse_ref(item, itemIdx);
-            }
-        };
         let private_compile_items = function() {
         let private_compile_items = function() {
             for (let idx of template.compiledSeq) {
             for (let idx of template.compiledSeq) {
                 let item = template.calcItems[idx];
                 let item = template.calcItems[idx];
@@ -584,8 +579,12 @@ class CalcProgram {
             }
             }
 
 
             for (let i = 0; i < template.calcItems.length; i++) {
             for (let i = 0; i < template.calcItems.length; i++) {
-                private_setup_seq(template.calcItems[i], i);
+                let item = template.calcItems[i];
+                if (template.compiledSeq.indexOf(i) < 0) {
+                    private_parse_ref(item, i);
+                }
             }
             }
+
             if (template.errs.length == 0) {
             if (template.errs.length == 0) {
                 private_compile_items();
                 private_compile_items();
                 template.hasCompiled = true;
                 template.hasCompiled = true;
@@ -956,7 +955,7 @@ class CalcProgram {
         };
         };
     };
     };
 
 
-/*    计算所有树结点(分3种情况),并返回发生变动的零散的多个树结点。
+    /* 计算所有树结点(分3种情况),并返回发生变动的零散的多个树结点。
     参数取值如下:
     参数取值如下:
     calcAllType.catAll       计算所有树结点 (不指定参数时的默认值)
     calcAllType.catAll       计算所有树结点 (不指定参数时的默认值)
     calcAllType.catBills     计算所有清单 (改变项目属性中清单取费算法时会用到)
     calcAllType.catBills     计算所有清单 (改变项目属性中清单取费算法时会用到)

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

@@ -47,6 +47,12 @@ const gljType = {
     EQUIPMENT: 5
     EQUIPMENT: 5
 };
 };
 
 
+const notEditType = [
+    gljType.CONCRETE,
+    gljType.MORTAR,
+    gljType.MIX_RATIO,
+    gljType.GENERAL_MACHINE
+];
 
 
 const CP_Col_Width = {          // 多处计算程序界面的列宽统一设置
 const CP_Col_Width = {          // 多处计算程序界面的列宽统一设置
     rowHeader: 30,
     rowHeader: 30,
@@ -126,3 +132,6 @@ const zanguCalcType = {
     common: 0,
     common: 0,
     gatherMaterial: 1
     gatherMaterial: 1
 };
 };
+
+const gljKeyArray =['code','name','specs','unit','type'];
+const gljLibKeyArray =['code', 'name', 'specs', 'unit', 'gljType']

+ 132 - 101
web/building_saas/main/js/models/project_glj.js

@@ -27,13 +27,13 @@ ProjectGLJ.prototype.loadData = function (callback = null) {
         type: 'post',
         type: 'post',
         dataType: 'json',
         dataType: 'json',
         data: {project_id: scUrlUtil.GetQueryString('project')},
         data: {project_id: scUrlUtil.GetQueryString('project')},
-        error: function() {
+        error: function () {
             // alert('数据传输错误');
             // alert('数据传输错误');
         },
         },
-        beforeSend: function() {
+        beforeSend: function () {
             self.isLoading = true;
             self.isLoading = true;
         },
         },
-        success: function(response) {
+        success: function (response) {
             self.isLoading = false;
             self.isLoading = false;
             if (response.err === 1) {
             if (response.err === 1) {
                 let msg = response.msg !== undefined && response.msg !== '' ? response.msg : '读取工料机数据失败!';
                 let msg = response.msg !== undefined && response.msg !== '' ? response.msg : '读取工料机数据失败!';
@@ -53,7 +53,7 @@ ProjectGLJ.prototype.loadData = function (callback = null) {
 
 
 ProjectGLJ.prototype.loadToCache = function (data) {
 ProjectGLJ.prototype.loadToCache = function (data) {
     this.datas = data;
     this.datas = data;
-    projectObj.project.projectGLJ=this;
+    projectObj.project.projectGLJ = this;
 }
 }
 
 
 
 
@@ -74,7 +74,7 @@ ProjectGLJ.prototype.getDataByCode = function (code) {
         return result;
         return result;
     }
     }
 
 
-    for(let tmp of gljList) {
+    for (let tmp of gljList) {
         if (tmp.code === code) {
         if (tmp.code === code) {
             result = tmp;
             result = tmp;
             break;
             break;
@@ -91,7 +91,7 @@ ProjectGLJ.prototype.getDataByCode = function (code) {
  * @param {Object} data
  * @param {Object} data
  * @return {boolean}
  * @return {boolean}
  */
  */
-ProjectGLJ.prototype.updateData = function(id, data) {
+ProjectGLJ.prototype.updateData = function (id, data) {
     let result = false;
     let result = false;
     if (this.datas === null) {
     if (this.datas === null) {
         return result;
         return result;
@@ -104,7 +104,7 @@ ProjectGLJ.prototype.updateData = function(id, data) {
 
 
     // 查找对应的index
     // 查找对应的index
     let index = -1;
     let index = -1;
-    for(let tmp in gljList) {
+    for (let tmp in gljList) {
         if (gljList[tmp].id === id) {
         if (gljList[tmp].id === id) {
             index = tmp;
             index = tmp;
             break;
             break;
@@ -116,8 +116,8 @@ ProjectGLJ.prototype.updateData = function(id, data) {
     }
     }
 
 
     // 修改数据
     // 修改数据
-    for(let tmpIndex in data) {
-        if(tmpIndex.indexOf('_price') >= 0) {
+    for (let tmpIndex in data) {
+        if (tmpIndex.indexOf('_price') >= 0) {
             // 修改unit_price中的对象
             // 修改unit_price中的对象
             this.datas.gljList[index]['unit_price'][tmpIndex] = data[tmpIndex];
             this.datas.gljList[index]['unit_price'][tmpIndex] = data[tmpIndex];
         } else {
         } else {
@@ -132,132 +132,138 @@ ProjectGLJ.prototype.updateData = function(id, data) {
  *
  *
  * @return {void}
  * @return {void}
  */
  */
-ProjectGLJ.prototype.loadCacheData = function() {
+ProjectGLJ.prototype.loadCacheData = function (resort) {
     // 加载工料机数据
     // 加载工料机数据
     let data = this.datas === null ? null : this.datas;
     let data = this.datas === null ? null : this.datas;
     if (data === null) {
     if (data === null) {
         return;
         return;
     }
     }
     jsonData = data.gljList !== undefined && data.gljList.length > 0 ? data.gljList : [];
     jsonData = data.gljList !== undefined && data.gljList.length > 0 ? data.gljList : [];
-    jsonData=filterProjectGLJ(jsonData);
+    jsonData = filterProjectGLJ(jsonData);
     jsonData = sortProjectGLJ(jsonData);
     jsonData = sortProjectGLJ(jsonData);
-    projectGLJSheet.setData(jsonData);
-    projectGLJSpread.specialColumn(jsonData);
+    if(projectGLJSheet&&projectGLJSpread){
+        projectGLJSheet.setData(jsonData);
+        projectGLJSpread.specialColumn(jsonData);
+    }
 };
 };
 
 
-ProjectGLJ.prototype.updatePriceFromRG=function(recode,updateField,newval){
-    if(updateField=='marketPrice'){
-        this.updateBasePriceFromRG(recode,"market_price",newval);
+ProjectGLJ.prototype.updatePriceFromRG = function (recode, updateField, newval) {
+    if (updateField == 'marketPrice') {
+        this.updatePrice(recode, "market_price", newval,"rg");
     }
     }
-    if(updateField=='basePrice'){
-        this.updateBasePriceFromRG(recode,"base_price",newval);
+    if (updateField == 'basePrice') {
+        this.updatePrice(recode, "base_price", newval,"rg");
     }
     }
 };
 };
 
 
-ProjectGLJ.prototype.updatePropertyFromMainSpread = function (node,updateField,newval) {
-   if(updateField=="contain"){
+ProjectGLJ.prototype.updatePropertyFromMainSpread = function (node, updateField, newval) {
+    if (updateField == "contain") {
 
 
-   }else {
-       this.updateGLJProperty(node,updateField,newval);
-   }
+    } else {
+        this.updateGLJProperty(node, updateField, newval);
+    }
 };
 };
 
 
 
 
-ProjectGLJ.prototype.updateGLJProperty=function (node,updateField,newval) {
+ProjectGLJ.prototype.updateGLJProperty = function (node, updateField, newval) {
     let rationTypeGLJ = node.data;
     let rationTypeGLJ = node.data;
     let postData = {};
     let postData = {};
-    if(rationTypeGLJ[updateField]==newval){
+    if (rationTypeGLJ[updateField] == newval) {
         return;
         return;
     }
     }
-    let data ={
+    let data = {
         glj_id: rationTypeGLJ.GLJID,
         glj_id: rationTypeGLJ.GLJID,
         project_id: rationTypeGLJ.projectID,
         project_id: rationTypeGLJ.projectID,
         code: rationTypeGLJ.code,
         code: rationTypeGLJ.code,
-        original_code:rationTypeGLJ.original_code,
+        original_code: rationTypeGLJ.original_code,
         name: rationTypeGLJ.name,
         name: rationTypeGLJ.name,
-        shortName:rationTypeGLJ.shortName,
+        shortName: rationTypeGLJ.shortName,
         specs: rationTypeGLJ.specs,
         specs: rationTypeGLJ.specs,
         unit: rationTypeGLJ.unit,
         unit: rationTypeGLJ.unit,
-        type:rationTypeGLJ.subType,
-        type_of_work:rationTypeGLJ.subType,
+        type: rationTypeGLJ.subType,
+        type_of_work: rationTypeGLJ.subType,
         base_price: rationTypeGLJ.basePrice,
         base_price: rationTypeGLJ.basePrice,
         market_price: rationTypeGLJ.basePrice,
         market_price: rationTypeGLJ.basePrice,
-        repositoryId:rationTypeGLJ.repositoryId,
-        adjCoe:rationTypeGLJ.adjCoe,
-        from:rationTypeGLJ.from?rationTypeGLJ.from:'std'//std:标准工料机库, cpt:补充工料机库
+        repositoryId: rationTypeGLJ.repositoryId,
+        adjCoe: rationTypeGLJ.adjCoe,
+        from: rationTypeGLJ.from ? rationTypeGLJ.from : 'std'//std:标准工料机库, cpt:补充工料机库
     };
     };
-    if(updateField=='subType'){
+    if (updateField == 'subType') {
         data.type = newval;
         data.type = newval;
         data.type_of_work = newval;
         data.type_of_work = newval;
         data.shortName = this.getShortNameByID(newval);
         data.shortName = this.getShortNameByID(newval);
-    }else {
-        data[updateField]=newval;
+    } else {
+        data[updateField] = newval;
     }
     }
     postData.ration = {
     postData.ration = {
-        ID:rationTypeGLJ.ID,
-        projectID:rationTypeGLJ.projectID
+        ID: rationTypeGLJ.ID,
+        projectID: rationTypeGLJ.projectID
     };
     };
     postData.updateData = data;
     postData.updateData = data;
     $.bootstrapLoading.start();
     $.bootstrapLoading.start();
-    CommonAjax.post("/glj/modifyKeyValue",postData,function (result) {
+    CommonAjax.post("/glj/modifyKeyValue", postData, function (result) {
         console.log(result);  //更新节点信息
         console.log(result);  //更新节点信息
-        rationTypeGLJ[updateField]=newval;
+        rationTypeGLJ[updateField] = newval;
         rationTypeGLJ.projectGLJID = result.id;
         rationTypeGLJ.projectGLJID = result.id;
         rationTypeGLJ.code = result.code;
         rationTypeGLJ.code = result.code;
         rationTypeGLJ.basePrice = result.unit_price.base_price;
         rationTypeGLJ.basePrice = result.unit_price.base_price;
         rationTypeGLJ.marketUnitFee = result.unit_price.market_price;
         rationTypeGLJ.marketUnitFee = result.unit_price.market_price;
         rationTypeGLJ.isAdd = result.unit_price.is_add;
         rationTypeGLJ.isAdd = result.unit_price.is_add;
-        rationTypeGLJ.isEstimate=result.is_evaluate;
+        rationTypeGLJ.isEstimate = result.is_evaluate;
         rationTypeGLJ.shortName = result.unit_price.short_name;
         rationTypeGLJ.shortName = result.unit_price.short_name;
         //触发计算并更新节点信息
         //触发计算并更新节点信息
-        node.changed=true;
+        node.changed = true;
         projectObj.project.projectGLJ.loadData(function () {
         projectObj.project.projectGLJ.loadData(function () {
             projectObj.project.calcProgram.calculate(node);
             projectObj.project.calcProgram.calculate(node);
             projectObj.project.calcProgram.saveNode(node);
             projectObj.project.calcProgram.saveNode(node);
             $.bootstrapLoading.end();
             $.bootstrapLoading.end();
         });//重新加载项目工料机数据
         });//重新加载项目工料机数据
         //上面两步都是异步操作,这句应该是要等上面两步做完了再执行的
         //上面两步都是异步操作,这句应该是要等上面两步做完了再执行的
-    },function (err) {
+    }, function (err) {
         $.bootstrapLoading.end();
         $.bootstrapLoading.end();
     });
     });
-    
+
 }
 }
 
 
-ProjectGLJ.prototype.updateBasePriceFromRG=function(recode,updateField,newval){
+ProjectGLJ.prototype.updatePrice = function (recode, updateField, newval,from) {
     let me = this;
     let me = this;
     let projectGljs = this.datas.gljList;
     let projectGljs = this.datas.gljList;
-    let glj = _.find(projectGljs,{'id':recode.projectGLJID});
-    console.log(glj);
-    if(glj){
-        let data = {id:glj.unit_price.id,field:updateField,newval:newval};
-        let callback =function (data) {
-            if(updateField=='base_price'){
-                glj.unit_price.base_price=newval;
+    let pgljID = from=="rg"?recode.projectGLJID:recode.id;//和定额工料机统一接口,项目工料机ID取值不一样
+    let glj = _.find(projectGljs, {'id': pgljID});
+    if (glj) {
+        let data = {id: glj.unit_price.id, field: updateField, newval: newval};
+        let callback = function (data) {
+            if (updateField == 'base_price') {
+                glj.unit_price.base_price = newval;
                 me.setAdjustPrice(glj);
                 me.setAdjustPrice(glj);
-            }else {
-                glj.unit_price.market_price=newval;
+            } else {
+                glj.unit_price.market_price = newval;
             }
             }
-            //更新项目工料机价格
-            me.refreshProjectGLJPrice(data);
+            //更新回传的父节点项目工料机价格
+           let gljs = me.getProjectGLJs(data);
             me.refreshRationGLJPrice(glj);//刷新定额工料机列表的记录
             me.refreshRationGLJPrice(glj);//刷新定额工料机列表的记录
+            projectObj.project.projectGLJ.loadCacheData();//更新工料机汇总缓存和显示
             gljOprObj.showRationGLJSheetData();
             gljOprObj.showRationGLJSheetData();
             me.refreshTreeNodePriceIfNeed(glj);//刷新造价书中主树上的定额工料机;
             me.refreshTreeNodePriceIfNeed(glj);//刷新造价书中主树上的定额工料机;
-            let nodes = me.getImpactRationNodes(glj);//取到因为改变工料机价格而受影响的定额
+            gljs.push(glj);
+            let nodes = me.getImpactRationNodes(gljs);//取到因为改变工料机价格而受影响的定额
             projectObj.project.calcProgram.calcRationsAndSave(nodes);//触发计算程序
             projectObj.project.calcProgram.calcRationsAndSave(nodes);//触发计算程序
             $.bootstrapLoading.end();
             $.bootstrapLoading.end();
         }
         }
         $.bootstrapLoading.start();
         $.bootstrapLoading.start();
-        CommonAjax.post("/glj/updatePrice",data,callback,function (err) {
+        CommonAjax.post("/glj/updatePrice", data, callback, function (err) {
             $.bootstrapLoading.end();
             $.bootstrapLoading.end();
         });
         });
-    }else {
+    } else {
         gljOprObj.showRationGLJSheetData();
         gljOprObj.showRationGLJSheetData();
     }
     }
 }
 }
+
+
 ProjectGLJ.prototype.refreshTreeNodePriceIfNeed = function (data) {
 ProjectGLJ.prototype.refreshTreeNodePriceIfNeed = function (data) {
-    if((data.unit_price.type = gljType.MAIN_MATERIAL||data.unit_price.type==gljType.EQUIPMENT)&&projectInfoObj.projectInfo.property.displaySetting.disPlayMainMaterial==true){
-        var nodes = _.filter(projectObj.project.mainTree.items,function (tem) {
-            if(tem.sourceType==ModuleNames.ration_glj&&tem.data.projectGLJID ==data.id){
+    if ((data.unit_price.type == gljType.MAIN_MATERIAL || data.unit_price.type == gljType.EQUIPMENT) && projectInfoObj.projectInfo.property.displaySetting.disPlayMainMaterial == true) {
+        var nodes = _.filter(projectObj.project.mainTree.items, function (tem) {
+            if (tem.sourceType == ModuleNames.ration_glj && tem.data.projectGLJID == data.id) {
                 tem.data.marketUnitFee = data.unit_price.market_price;
                 tem.data.marketUnitFee = data.unit_price.market_price;
                 return true;
                 return true;
             }
             }
@@ -268,36 +274,39 @@ ProjectGLJ.prototype.refreshTreeNodePriceIfNeed = function (data) {
 }
 }
 
 
 //根据工料机,取得所有受影响的定额节点
 //根据工料机,取得所有受影响的定额节点
-ProjectGLJ.prototype.getImpactRationNodes = function (glj) {
-    let nodes=[];
+ProjectGLJ.prototype.getImpactRationNodes = function (gljs) {
+    let nodes = [];
     let rationMap = {};
     let rationMap = {};
+    let idArray = _.map(gljs,'id');
+    let priceArray = _.map(gljs,'unit_price');
     //先根据项目工料机ID,找到受影响定额的ID
     //先根据项目工料机ID,找到受影响定额的ID
-    let ration_glj_list =projectObj.project.ration_glj.datas; //取定额工料机数据
-    for(let rg of ration_glj_list){
-        if(rg.projectGLJID==glj.id){
+    let ration_glj_list = projectObj.project.ration_glj.datas; //取定额工料机数据
+    for (let rg of ration_glj_list) {
+        if (_.indexOf(idArray,rg.projectGLJID)!=-1) {
             rationMap[rg.rationID] = true;  //取所有定额ID,用MAP方式去重
             rationMap[rg.rationID] = true;  //取所有定额ID,用MAP方式去重
         }
         }
     }
     }
-    for(let item of projectObj.project.mainTree.items){
-        if(item.sourceType==ModuleNames.ration){
-            if(item.data.type==rationType.gljRation){//取定额类型的工料机
-                if(item.data.projectGLJID == glj.id){
-                    item.data.marketUnitFee = glj.unit_price.market_price; //更新市场单价
+    for (let item of projectObj.project.mainTree.items) {
+        if (item.sourceType == ModuleNames.ration) {
+            if (item.data.type == rationType.gljRation) {//取定额类型的工料机
+                let idx = _.indexOf(idArray,item.data.projectGLJID);
+                if (idx != -1) {
+                    item.data.marketUnitFee = priceArray[idx].market_price; //更新市场单价
                     nodes.push(item);
                     nodes.push(item);
                 }
                 }
-            }else if( rationMap[item.data.ID]==true){  //受影响的定额
-                   nodes.push(item)
+            } else if (rationMap[item.data.ID] == true) {  //受影响的定额
+                nodes.push(item)
             }
             }
         }
         }
     }
     }
     return nodes;
     return nodes;
 };
 };
-ProjectGLJ.prototype.refreshRationGLJPrice=function (glj) {
-    for(let ration_glj of gljOprObj.sheetData){
-        if(ration_glj.projectGLJID ==glj.id){
-            ration_glj.basePrice=glj.unit_price.base_price;
-            ration_glj.marketPrice=glj.unit_price.market_price;
-            ration_glj.adjustPrice=this.getAdjustPrice(glj);
+ProjectGLJ.prototype.refreshRationGLJPrice = function (glj) {
+    for (let ration_glj of gljOprObj.sheetData) {
+        if (ration_glj.projectGLJID == glj.id) {
+            ration_glj.basePrice = glj.unit_price.base_price;
+            ration_glj.marketPrice = glj.unit_price.market_price;
+            ration_glj.adjustPrice = this.getAdjustPrice(glj);
         }
         }
     }
     }
 }
 }
@@ -306,30 +315,36 @@ ProjectGLJ.prototype.refreshRationTypeGLJ = function (glj) {
 
 
 }
 }
 
 
-ProjectGLJ.prototype.refreshProjectGLJPrice=function(data){
+ProjectGLJ.prototype.getProjectGLJs = function (data,refreshPrice=true) {
+    let parentGlj = [];
+    //
     let projectGljs = this.datas.gljList;
     let projectGljs = this.datas.gljList;
-    let indexList = ['code','name','specs','unit','type'];
-    for(let d of data){
-        if(d){
+    let indexList = gljKeyArray;
+    for (let d of data) {
+        if (d) {
             let condition = {};
             let condition = {};
-            for(let index of indexList){
-                if(d[index]!=null&&d[index]!=undefined&&d[index]!=''){
-                    condition[index]=d[index]
+            for (let index of indexList) {
+                if (d[index] != null && d[index] != undefined && d[index] != '') {
+                    condition[index] = d[index]
                 }
                 }
             }
             }
-            let glj = _.find(projectGljs,condition);
-            if(glj){
-                glj.unit_price.base_price = d.base_price;
-                glj.unit_price.market_price = d.market_price;
-                this.setAdjustPrice(glj);
-                this.refreshRationGLJPrice(glj);
-                this.refreshTreeNodePriceIfNeed(glj);
+            let glj = _.find(projectGljs, condition);
+            if (glj) {
+                if(refreshPrice==true){
+                    glj.unit_price.base_price = d.base_price;
+                    glj.unit_price.market_price = d.market_price;
+                    this.setAdjustPrice(glj);
+                    this.refreshRationGLJPrice(glj);
+                    this.refreshTreeNodePriceIfNeed(glj);
+                }
+                parentGlj.push(glj);
             }
             }
         }
         }
     }
     }
+    return parentGlj;
 }
 }
 
 
-ProjectGLJ.prototype.setAdjustPrice=function(glj){
+ProjectGLJ.prototype.setAdjustPrice = function (glj) {
     switch (glj.unit_price.type + '') {
     switch (glj.unit_price.type + '') {
         // 人工: 调整基价=基价单价*调整系数
         // 人工: 调整基价=基价单价*调整系数
         case GLJTypeConst.LABOUR:
         case GLJTypeConst.LABOUR:
@@ -348,18 +363,34 @@ ProjectGLJ.prototype.setAdjustPrice=function(glj){
 
 
 ProjectGLJ.prototype.getAdjustPrice = function (glj) {
 ProjectGLJ.prototype.getAdjustPrice = function (glj) {
     GLJTypeConst = this.datas.constData.GLJTypeConst !== undefined ? JSON.parse(this.datas.constData.GLJTypeConst) : GLJTypeConst;
     GLJTypeConst = this.datas.constData.GLJTypeConst !== undefined ? JSON.parse(this.datas.constData.GLJTypeConst) : GLJTypeConst;
-    if(glj.unit_price.type==GLJTypeConst.LABOUR||glj.unit_price.type==GLJTypeConst.MACHINE_LABOUR){
+    let decimal = getDecimal("glj.unitPrice");
+    let quantity_decimal = getDecimal("glj.quantity")
+    if (glj.unit_price.type == GLJTypeConst.LABOUR || glj.unit_price.type == GLJTypeConst.MACHINE_LABOUR) {//人工、机上人工,调整价根据定额价*调整系数计算得出。
         let labour = projectObj.project.calcProgram.compiledLabourCoes[glj.adjCoe];
         let labour = projectObj.project.calcProgram.compiledLabourCoes[glj.adjCoe];
         //let labour=1;
         //let labour=1;
-        let coe = labour&&labour.coe?labour.coe:1;
-        let decimal = getDecimal("glj.unitPrice");
-        return scMathUtil.roundTo(parseFloat(coe*glj.unit_price.base_price),-decimal);
-    }else {
+        let coe = labour && labour.coe ? labour.coe : 1;
+        return scMathUtil.roundTo(parseFloat(coe * scMathUtil.roundForObj(glj.unit_price.base_price,decimal)), -decimal);
+    } else if (notEditType.indexOf(glj.unit_price.type)>0) {//对于混凝土、配合比、砂浆、机械台班,调整价根据组成物计算得出。
+        let p =0;
+        for(let ratio of glj.ratio_data){
+           let tem =  _.find( projectObj.project.projectGLJ.datas.gljList,{
+               'code': ratio.code,
+               'name': ratio.name,
+               'specs':ratio.specs,
+               'type': ratio.type,
+               'unit': ratio.unit
+           })
+            if(tem){
+                p+=scMathUtil.roundForObj(this.getAdjustPrice(tem)*scMathUtil.roundForObj(ratio.consumption,quantity_decimal),decimal);
+            }
+        }
+        return scMathUtil.roundForObj(p,decimal);
+    } else {//对于其他普通材料等,无调整系数,调整价=定额价。
         return glj.unit_price.base_price
         return glj.unit_price.base_price
     }
     }
 }
 }
 
 
 ProjectGLJ.prototype.getShortNameByID = function (ID) {
 ProjectGLJ.prototype.getShortNameByID = function (ID) {
     let gljTypeMap = this.datas.constData.gljTypeMap;
     let gljTypeMap = this.datas.constData.gljTypeMap;
-    return gljTypeMap["typeId"+ID].shortName;
+    return gljTypeMap["typeId" + ID].shortName;
 }
 }

+ 9 - 10
web/building_saas/main/js/models/ration_glj.js

@@ -345,7 +345,6 @@ var ration_glj = {
                 let initShow = false;//是否需要表格初始化显示
                 let initShow = false;//是否需要表格初始化显示
                 if (updateField == 'customQuantity') {
                 if (updateField == 'customQuantity') {
                     me.refreshAfterQuantityUpdate(data, node);
                     me.refreshAfterQuantityUpdate(data, node);
-                    me.refreshTreeNodeIfNeeded(recode);//需刷新主材和设备的工程量和含量
                 } else {
                 } else {
                     var doc = data.doc;
                     var doc = data.doc;
                     for (var key in doc) {
                     for (var key in doc) {
@@ -360,11 +359,11 @@ var ration_glj = {
                     if (node) {//如果不是在造价书页面直接编辑,则不用刷新
                     if (node) {//如果不是在造价书页面直接编辑,则不用刷新
                         if (updateField == "type" && !(newval == gljType.MAIN_MATERIAL || newval == gljType.EQUIPMENT)) {//如果改变类型后不是主材或设备,则在造价书树中移除
                         if (updateField == "type" && !(newval == gljType.MAIN_MATERIAL || newval == gljType.EQUIPMENT)) {//如果改变类型后不是主材或设备,则在造价书树中移除
                             projectObj.mainController.deleteNode(node, true);
                             projectObj.mainController.deleteNode(node, true);
-                        } else {
-                            me.refreshTreeNodeIfNeeded(recode);
                         }
                         }
                     }
                     }
                 }
                 }
+                me.refreshTreeNodeIfNeeded(recode);//刷新造价书上的树节点(如果需要)
+
                 if (initShow == false) {//不需要初始化,只需耍新当前显示就可以了
                 if (initShow == false) {//不需要初始化,只需耍新当前显示就可以了
                     gljOprObj.showRationGLJSheetData();
                     gljOprObj.showRationGLJSheetData();
                 }
                 }
@@ -448,7 +447,7 @@ var ration_glj = {
             serialNo == 0 ? serialNo = children.length : "";
             serialNo == 0 ? serialNo = children.length : "";
             for (let con_key of GLJSelection) {
             for (let con_key of GLJSelection) {
                 var glj = _.find(allGLJ, function (item) {
                 var glj = _.find(allGLJ, function (item) {
-                    let i_key = gljOprObj.getIndex(item, ['code', 'name', 'specs', 'unit', 'gljType']);
+                    let i_key = gljOprObj.getIndex(item, gljLibKeyArray);
                     return i_key == con_key;
                     return i_key == con_key;
                 });
                 });
                 if (glj) {
                 if (glj) {
@@ -530,7 +529,7 @@ var ration_glj = {
             GLJSelection.sort();
             GLJSelection.sort();
             _.forEach(GLJSelection, function (g) {
             _.forEach(GLJSelection, function (g) {
                 var glj = _.find(allGLJ, function (item) {
                 var glj = _.find(allGLJ, function (item) {
-                    var i_key = gljOprObj.getIndex(item, ['code', 'name', 'specs', 'unit', 'gljType']);
+                    var i_key = gljOprObj.getIndex(item, gljLibKeyArray);
                     return i_key == g;
                     return i_key == g;
                 });
                 });
                 var ration_glj = {
                 var ration_glj = {
@@ -569,10 +568,10 @@ var ration_glj = {
         ration_glj.prototype.replaceGLJ = function (selectCode, oldData, callback) {
         ration_glj.prototype.replaceGLJ = function (selectCode, oldData, callback) {
             var allGLJ = gljOprObj.AllRecode;
             var allGLJ = gljOprObj.AllRecode;
             var glj = _.find(allGLJ, function (item) {
             var glj = _.find(allGLJ, function (item) {
-                var i_key = gljOprObj.getIndex(item, ['code', 'name', 'specs', 'unit', 'gljType']);
+                var i_key = gljOprObj.getIndex(item, gljLibKeyArray);
                 return i_key == selectCode;
                 return i_key == selectCode;
             });
             });
-            if (selectCode == gljOprObj.getIndex(oldData, ['code', 'name', 'specs', 'unit', 'type'])) {
+            if (selectCode == gljOprObj.getIndex(oldData, gljKeyArray)) {
                 return callback(null);
                 return callback(null);
             }
             }
             if (oldData.createType != 'replace') {
             if (oldData.createType != 'replace') {
@@ -604,10 +603,10 @@ var ration_glj = {
         ration_glj.prototype.mReplaceGLJ = function (selectCode, oldData, callback) {
         ration_glj.prototype.mReplaceGLJ = function (selectCode, oldData, callback) {
             var allGLJ = gljOprObj.AllRecode;
             var allGLJ = gljOprObj.AllRecode;
             var glj = _.find(allGLJ, function (item) {
             var glj = _.find(allGLJ, function (item) {
-                var i_key = gljOprObj.getIndex(item, ['code', 'name', 'specs', 'unit', 'gljType']);
+                var i_key = gljOprObj.getIndex(item, gljLibKeyArray);
                 return i_key == selectCode;
                 return i_key == selectCode;
             });
             });
-            if (selectCode == gljOprObj.getIndex(oldData, ['code', 'name', 'specs', 'unit', 'type'])) {
+            if (selectCode == gljOprObj.getIndex(oldData, gljKeyArray)) {
                 return callback(null);
                 return callback(null);
             }
             }
             var query = {
             var query = {
@@ -679,7 +678,7 @@ var ration_glj = {
                     ration.basePrice = glj.unit_price.base_price;
                     ration.basePrice = glj.unit_price.base_price;
                     ration.marketUnitFee = glj.unit_price.market_price;
                     ration.marketUnitFee = glj.unit_price.market_price;
                     ration.isAdd = glj.unit_price.is_add;
                     ration.isAdd = glj.unit_price.is_add;
-                    var connect_index = gljOprObj.getIndex(glj, ['code', 'name', 'specs', 'unit', 'type'])
+                    var connect_index = gljOprObj.getIndex(glj, gljKeyArray);
                     if (mixRatioMap.hasOwnProperty(connect_index)) {
                     if (mixRatioMap.hasOwnProperty(connect_index)) {
                         var mixRatios = gljOprObj.getMixRationShowDatas(mixRatioMap[connect_index], projectGljs);
                         var mixRatios = gljOprObj.getMixRationShowDatas(mixRatioMap[connect_index], projectGljs);
                         ration.subList = mixRatios;
                         ration.subList = mixRatios;

+ 130 - 158
web/building_saas/main/js/views/character_content_view.js

@@ -122,7 +122,9 @@ let contentOprObj = {
 
 
     },
     },
     save: function (callback) {
     save: function (callback) {
-        let me = contentOprObj;
+        let selectedNode = projectObj.mainController.tree.selected;
+        const setting = projectObj.project.property.addRule !== undefined ? projectObj.project.property.addRule : null;
+        pageCCOprObj.setCharacterBySetting(selectedNode, setting);		let me = contentOprObj;
         let contentTxt = me.getColData(me.currentCache);
         let contentTxt = me.getColData(me.currentCache);
         let txtObj =  {field: 'jobContentText', text: contentTxt ? contentTxt : ''};
         let txtObj =  {field: 'jobContentText', text: contentTxt ? contentTxt : ''};
         pageCCOprObj.updateCharacterContent(pageCCOprObj.currentFindSet, {field: 'jobContent', updateArr: me.currentCache}, txtObj, contentOprObj, callback);
         pageCCOprObj.updateCharacterContent(pageCCOprObj.currentFindSet, {field: 'jobContent', updateArr: me.currentCache}, txtObj, contentOprObj, callback);
@@ -497,10 +499,23 @@ let characterOprObj = {
         }
         }
     },
     },
     save: function (callback) {
     save: function (callback) {
+<<<<<<< .mine
         let me = characterOprObj;
         let me = characterOprObj;
         let characterTxt = me.getColData(me.currentCache);
         let characterTxt = me.getColData(me.currentCache);
         let txtObj =  {field: 'itemCharacterText', text: characterTxt ? characterTxt : ''};
         let txtObj =  {field: 'itemCharacterText', text: characterTxt ? characterTxt : ''};
         pageCCOprObj.updateCharacterContent(pageCCOprObj.currentFindSet, {field: 'itemCharacter', updateArr: me.currentCache}, txtObj, characterOprObj, callback);
         pageCCOprObj.updateCharacterContent(pageCCOprObj.currentFindSet, {field: 'itemCharacter', updateArr: me.currentCache}, txtObj, characterOprObj, callback);
+
+
+
+=======
+        let selectedNode = projectObj.mainController.tree.selected;
+        const setting = projectObj.project.property.addRule !== undefined ? projectObj.project.property.addRule : null;
+        pageCCOprObj.setCharacterBySetting(selectedNode, setting);
+        // let me = characterOprObj;
+        // let characterTxt = me.getColData(me.currentCache);
+        // let txtObj =  {field: 'itemCharacterText', text: characterTxt ? characterTxt : ''};
+        // pageCCOprObj.updateCharacterContent(pageCCOprObj.currentFindSet, {field: 'itemCharacter', updateArr: me.currentCache}, txtObj, characterOprObj);
+>>>>>>> .theirs
     },
     },
     onEditStart: function (sender, args) {
     onEditStart: function (sender, args) {
         let me = characterOprObj;
         let me = characterOprObj;
@@ -648,6 +663,7 @@ let characterOprObj = {
 let pageCCOprObj = {
 let pageCCOprObj = {
     currentFindSet: null,
     currentFindSet: null,
     mainActiveCell: null,//mainSpread焦点单元格
     mainActiveCell: null,//mainSpread焦点单元格
+    nameCache: '',
     //获得造价书当前焦点行的类型:清单、定额
     //获得造价书当前焦点行的类型:清单、定额
     isBillsType: function () {
     isBillsType: function () {
         let rst = false;
         let rst = false;
@@ -658,17 +674,22 @@ let pageCCOprObj = {
         return rst;
         return rst;
 
 
     },
     },
-    setItemContentNode: function (node, jobs, items) {
+    setItemContentNode: function (node, jobs, items, name = '') {
         let theCont = contentOprObj, theCha = characterOprObj,
         let theCont = contentOprObj, theCha = characterOprObj,
             jobContent, itemCharacter, contentTxt, characterTxt;
             jobContent, itemCharacter, contentTxt, characterTxt;
         jobContent = theCont.buildJobContent(jobs);
         jobContent = theCont.buildJobContent(jobs);
         itemCharacter = theCha.buildItemCharactet(items);
         itemCharacter = theCha.buildItemCharactet(items);
-        contentTxt = theCont.getColData(jobContent);
-        characterTxt = theCha.getColData(itemCharacter);
+        // contentTxt = theCont.getColData(jobContent);
+        // characterTxt = theCha.getColData(itemCharacter);
         node.data.jobContent = jobContent;
         node.data.jobContent = jobContent;
         node.data.itemCharacter = itemCharacter;
         node.data.itemCharacter = itemCharacter;
-        node.data.jobContentText = contentTxt ? contentTxt : '';
-        node.data.itemCharacterText = characterTxt ? characterTxt : '';
+        this.nameCache = name;
+        // 根据规则设置对应特征、内容、名称格式
+        const setting = projectObj.project.property.addRule !== undefined ? projectObj.project.property.addRule : null;
+        const updateData = pageCCOprObj.getCharacterUpdateData(setting, node);
+        node.data.jobContentText = updateData.jobContentText;
+        node.data.itemCharacterText = updateData.itemCharacterText;
+        node.data.name = updateData.name;
     },
     },
     safeItemCharater: function (itemCharater) {
     safeItemCharater: function (itemCharater) {
         return characterOprObj.buildItemCharactet(itemCharater);
         return characterOprObj.buildItemCharactet(itemCharater);
@@ -788,32 +809,26 @@ let pageCCOprObj = {
      *
      *
      * @param {Object} node - 节点数据
      * @param {Object} node - 节点数据
      * @param {Object} refreshData - 刷新的数据
      * @param {Object} refreshData - 刷新的数据
-     * @param {Object} defaultData - 默认数据
      * @return {void}
      * @return {void}
      */
      */
-    refreshView: function(node, refreshData, defaultData) {
+    refreshView: function(node, refreshData) {
         // 更新清单行特征列或内容列
         // 更新清单行特征列或内容列
         let updateCol = [
         let updateCol = [
-            { name: 'character', col: 4 },
-            { name: 'content', col: 5 },
+            { name: 'itemCharacterText', col: 4 },
+            { name: 'jobContentText', col: 5 },
             { name: 'name', col: 2 }
             { name: 'name', col: 2 }
         ];
         ];
         if (updateCol === '') {
         if (updateCol === '') {
             return;
             return;
         }
         }
-        const row = node.getID() - 1;
+        const row = node.serialNo();
         // 刷新输出显示
         // 刷新输出显示
         for (const tmp of updateCol) {
         for (const tmp of updateCol) {
             // 没有默认的数据则跳过刷新
             // 没有默认的数据则跳过刷新
-            if (defaultData[tmp.name] === undefined) {
-                continue;
-            }
-            // 不存在更新的数据则全部用默认数据替代
             if (refreshData[tmp.name] === undefined) {
             if (refreshData[tmp.name] === undefined) {
-                projectObj.mainSpread.getActiveSheet().setValue(row, tmp.col, defaultData[tmp.name] + '');
-            } else {
-                projectObj.mainSpread.getActiveSheet().setValue(row, tmp.col, refreshData[tmp.name] + '');
+                continue;
             }
             }
+            projectObj.mainSpread.getActiveSheet().setValue(row, tmp.col, refreshData[tmp.name] + '');
         }
         }
         projectObj.mainSpread.getActiveSheet().autoFitRow(row);
         projectObj.mainSpread.getActiveSheet().autoFitRow(row);
     },
     },
@@ -825,122 +840,26 @@ let pageCCOprObj = {
      * @return {void}
      * @return {void}
      */
      */
     setCharacterBySetting: function(node, setting) {
     setCharacterBySetting: function(node, setting) {
-        let contentArray = [];
         let self = this;
         let self = this;
 
 
         // 保存的条件数据
         // 保存的条件数据
         const findSet = { ID: node.data.ID, projectID: node.data.projectID };
         const findSet = { ID: node.data.ID, projectID: node.data.projectID };
-        // 获取默认数据
-        const defaultData = this.getDataBySetting(node, {
-            serialType: "1",
-            characterFormat: "2",
-        });
-        // console.log(defaultData);return false;
-        defaultData.character = defaultData.character.join("\r\n");
-        defaultData.content = defaultData.content.join("\r\n");
-
-        // 获取当前设置数据
-        const currentData = this.getDataBySetting(node, setting);
+        const updateData = this.getCharacterUpdateData(setting, node);
 
 
-        // 组合数据
-        let content = '';
-        switch (setting.addContent) {
-            case "1":
-                // 项目特征+工作内容
-                contentArray.push('[项目特征]');
-                contentArray.push.apply(contentArray, currentData.character);
-                contentArray.push('[工作内容]');
-                contentArray.push.apply(contentArray, currentData.content);
-                break;
-            case "2":
-                // 工作内容+项目特征
-                contentArray.push('[工作内容]');
-                contentArray.push.apply(contentArray, currentData.content);
-                contentArray.push('[项目特征]');
-                contentArray.push.apply(contentArray, currentData.character);
-                break;
-            case "3":
-                // 项目特征
-                contentArray.push.apply(contentArray, currentData.character);
-                break;
-            case "4":
-                // 工作内容
-                contentArray.push.apply(contentArray, currentData.content);
-                break;
-            case "5":
-                // 定额子目
-                const rationChapter = this.getRationChapter(node, setting);
-                contentArray.push.apply(contentArray, rationChapter);
-                break;
-            case "":
-                // 无
-                break;
-        }
-        // 显示格式
-        switch (setting.displayFormat) {
-            case "1":
-                // 换行分隔
-                content = contentArray.join("\r\n");
-                break;
-            case "2":
-                // 逗号分隔
-                content = contentArray.join(',');
-                break;
-            case "3":
-                // 括号分隔
-                content = '(' + contentArray.join(',') + ')';
-                break;
-        }
-        // 添加到对应位置
         let saveObj = [];
         let saveObj = [];
-        let refreshData = {};
-        saveObj.push({ field: 'addRule', value: setting });
-        switch (setting.position) {
-            case "1":
-                // 添加到项目特征列
-                saveObj.push({field: 'itemCharacterText', value: content});
-                // 还原名称及内容
-                saveObj.push({field: 'name', value: defaultData.name});
-                saveObj.push({field: 'jobContentText', value: defaultData.content});
-                // 刷新数据
-                refreshData = {'character': content};
-                break;
-            case "2":
-                // 添加到清单名称列
-                content = defaultData.name + "\r\n" + content;
-                saveObj.push({field: 'name', value: content});
-                // 还原特征及内容
-                saveObj.push({field: 'itemCharacterText', value: defaultData.character});
-                saveObj.push({field: 'jobContentText', value: defaultData.content});
-                // 刷新数据
-                refreshData = {'name': content};
-                break;
-            case "3":
-                // 添加到工作内容列
-                saveObj.push({field: 'jobContentText', value: content});
-                // 还原名称以及特征
-                saveObj.push({field: 'itemCharacterText', value: defaultData.character});
-                saveObj.push({field: 'name', value: defaultData.name});
-                // 刷新数据
-                refreshData = {'content': content};
-                break;
-            case "4":
-                // 分别添加到对应列
-                if (Object.keys(defaultData).length <= 0) {
-                    return;
-                }
-                // 特征
-                saveObj.push({field: 'itemCharacterText', value: defaultData.character});
-                // 内容
-                saveObj.push({field: 'jobContentText', value: defaultData.content});
-                // 名称
-                saveObj.push({field: 'name', value: defaultData.name});
-                refreshData = {};
-                break;
+        for (const index in updateData) {
+            saveObj.push({field: index, value: updateData[index]});
         }
         }
+        saveObj.push({field: 'addRule', value: setting});
         // 更新到数据库
         // 更新到数据库
         pageCCOprObj.updateBill(findSet, saveObj, function(response) {
         pageCCOprObj.updateBill(findSet, saveObj, function(response) {
-            self.refreshView(node, refreshData, defaultData);
+            self.refreshView(node, updateData);
+            // 更新项目属性的配置
+            projectObj.project.property.addRule = setting;
+            // 更新节点数据
+            node.data.name = updateData.name;
+            node.data.itemCharacterText = updateData.itemCharacterText;
+            node.data.jobContentText = updateData.jobContentText;
         });
         });
 
 
     },
     },
@@ -1017,9 +936,7 @@ let pageCCOprObj = {
                 throw '内部数据错误';
                 throw '内部数据错误';
             }
             }
             // 默认名称
             // 默认名称
-            let nodeNameList = node.data.name.split("\r\n");
-            const nameContent = nodeNameList[0] !== undefined ? nodeNameList[0] : '';
-            result['name'] = nameContent;
+            result['name'] = this.nameCache;
 
 
             // 特征
             // 特征
             let characterArray = [];
             let characterArray = [];
@@ -1068,54 +985,109 @@ let pageCCOprObj = {
             }
             }
             result['content'] = jobArray;
             result['content'] = jobArray;
         } catch (error) {
         } catch (error) {
+            console.log(error);
             result = {};
             result = {};
         }
         }
         return result;
         return result;
     },
     },
+
     /**
     /**
-     * 还原数据
+     * 获取特征内容名称更新的数据
      *
      *
+     * @param {Object} setting - 设置
      * @param {Object} node - 节点数据
      * @param {Object} node - 节点数据
-     * @param {String} setType - 当前设置的项
-     * @param {Object} baseData - 需要用到的基础数据
-     * @param {Object} defaultContentInfo - 默认数据
-     * @return {void}
+     * @return {Object} - 返回更新的数据
      */
      */
-    restoreData: function(node, setType, baseData, defaultContentInfo) {
-        if (baseData.findSet === undefined ||
-        baseData.itemJob === undefined || baseData.itemCharacter === undefined) {
-            return;
+    getCharacterUpdateData: function(setting, node) {
+        let updateData = {
+            itemCharacterText: '',
+            jobContentText: '',
+            name: this.nameCache,
+        };
+        let contentArray = [];
+
+        // 获取当前设置数据
+        const currentData = this.getDataBySetting(node, setting);
+
+        // 组合数据
+        let content = '';
+        switch (setting.addContent) {
+            case "1":
+                // 项目特征+工作内容
+                contentArray.push('[项目特征]');
+                contentArray.push.apply(contentArray, currentData.character);
+                contentArray.push('[工作内容]');
+                contentArray.push.apply(contentArray, currentData.content);
+                break;
+            case "2":
+                // 工作内容+项目特征
+                contentArray.push('[工作内容]');
+                contentArray.push.apply(contentArray, currentData.content);
+                contentArray.push('[项目特征]');
+                contentArray.push.apply(contentArray, currentData.character);
+                break;
+            case "3":
+                // 项目特征
+                contentArray.push.apply(contentArray, currentData.character);
+                break;
+            case "4":
+                // 工作内容
+                contentArray.push.apply(contentArray, currentData.content);
+                break;
+            case "5":
+                // 定额子目
+                const rationChapter = this.getRationChapter(node, setting);
+                contentArray.push.apply(contentArray, rationChapter);
+                break;
+            case "":
+                // 无
+                break;
         }
         }
+        // 显示格式
+        switch (setting.displayFormat) {
+            case "1":
+                // 换行分隔
+                content = contentArray.join("\n");
 
 
-        switch (setType) {
+                currentData.character = currentData.character.join("\n");
+                currentData.content = currentData.content.join("\n");
+                break;
+            case "2":
+                // 逗号分隔
+                content = contentArray.join(',');
+
+                currentData.character = currentData.character.join(",");
+                currentData.content = currentData.content.join(",");
+                break;
+            case "3":
+                // 括号分隔
+                content = '(' + contentArray.join(',') + ')';
+                break;
+        }
+        // 添加到对应位置
+        switch (setting.position) {
             case "1":
             case "1":
                 // 添加到项目特征列
                 // 添加到项目特征列
-                // 把其他字段还原回原来数据
-                // 还原名称
-                projectObj.project.Bills.updateField(node.source, 'name', defaultContentInfo.nameContent, true);
-                projectObj.mainController.refreshTreeNode([node], false);
-                // 还原工作内容
-                pageCCOprObj.updateCharacterContent(baseData.findSet, {field: 'jobContent', updateArr: baseData.itemJob},
-                    {field: 'jobContentText', text: contentOprObj.lastTextCache}, node);
+                updateData.itemCharacterText = content;
                 break;
                 break;
             case "2":
             case "2":
-                // 添加到清单名称
-                // 还原特征
-                pageCCOprObj.updateCharacterContent(baseData.findSet, {field: 'itemCharacter', updateArr: baseData.itemCharacter},
-                    {field: 'itemCharacterText', text: characterOprObj.lastTextCache}, node);
-                // 还原工作内容
-                pageCCOprObj.updateCharacterContent(baseData.findSet, {field: 'jobContent', updateArr: baseData.itemJob},
-                    {field: 'jobContentText', text: contentOprObj.lastTextCache}, node);
+                // 添加到清单名称列
+                content = this.nameCache + "\n" + content;
+                updateData.name = content;
                 break;
                 break;
             case "3":
             case "3":
                 // 添加到工作内容列
                 // 添加到工作内容列
-                // 还原名称
-                projectObj.project.Bills.updateField(node.source, 'name', defaultContentInfo.nameContent, true);
-                projectObj.mainController.refreshTreeNode([node], false);
-                // 还原特征
-                pageCCOprObj.updateCharacterContent(baseData.findSet, {field: 'itemCharacter', updateArr: baseData.itemCharacter},
-                    {field: 'itemCharacterText', text: characterOprObj.lastTextCache}, node);
+                updateData.jobContentText = content;
+                break;
+            case "4":
+                updateData = {
+                    itemCharacterText: currentData.character,
+                    jobContentText: currentData.content,
+                    name: currentData.name,
+                };
                 break;
                 break;
         }
         }
+
+        return updateData;
     },
     },
 }
 }

+ 125 - 35
web/building_saas/main/js/views/glj_view.js

@@ -94,9 +94,10 @@ var gljOprObj = {
         view: {
         view: {
             comboBox: [{row: -1, col: 12, rowCount: -1, colCount: 1}],
             comboBox: [{row: -1, col: 12, rowCount: -1, colCount: 1}],
             lockedCells: [{row: -1, col: 3, rowCount: -1, colCount: 1}],
             lockedCells: [{row: -1, col: 3, rowCount: -1, colCount: 1}],
-            lockColumns: [0, 4, 5, 7, 8, 9, 10, 12]
+            lockColumns: [0, 4, 5, 7, 8, 10, 12]
         },
         },
-        notEditedType: ['砼', '桨', '配比', '机']
+        // 工料机类型是混凝土、砂浆、配合比、机械台班时,价格不可编辑。
+        editedTyep:[GLJTypeConst.MAIN_MATERIAL,GLJTypeConst.EQUIPMENT]//主材设备
     },
     },
     coeSetting: {
     coeSetting: {
         header: [
         header: [
@@ -262,6 +263,7 @@ var gljOprObj = {
         sheet.name('ration_glj');
         sheet.name('ration_glj');
         me.bindSheetEvent(sheet);
         me.bindSheetEvent(sheet);
         sheet.bind(GC.Spread.Sheets.Events.CellClick, me.onCellClick);
         sheet.bind(GC.Spread.Sheets.Events.CellClick, me.onCellClick);
+        sheet.bind(GC.Spread.Sheets.Events.CellDoubleClick, me.onCellDoubleClick);
         gljContextMenu.loadGLJSpreadContextMenu();
         gljContextMenu.loadGLJSpreadContextMenu();
     },
     },
     initCoeSheet: function (sheet) {
     initCoeSheet: function (sheet) {
@@ -388,19 +390,18 @@ var gljOprObj = {
         }
         }
     },
     },
     onCheckBoxClick: function (sender, args) {
     onCheckBoxClick: function (sender, args) {
-        if (args.sheetName == 'ration_glj') {
-            return;
-        }
         var checkboxValue = args.sheet.getCell(args.row, args.col).value();
         var checkboxValue = args.sheet.getCell(args.row, args.col).value();
         var newval = 0;
         var newval = 0;
         if (checkboxValue) {
         if (checkboxValue) {
             newval = 0;
             newval = 0;
             args.sheet.getCell(args.row, args.col).value(newval);
             args.sheet.getCell(args.row, args.col).value(newval);
         } else {
         } else {
-            newval = 1
+            newval = 1;
             args.sheet.getCell(args.row, args.col).value(newval);
             args.sheet.getCell(args.row, args.col).value(newval);
         }
         }
-        if (args.sheetName == 'ration_coe') {
+        if (args.sheetName == 'ration_glj') {
+            gljOprObj.updateIsEstimate(args,newval);
+        } else if (args.sheetName == 'ration_coe') {
             gljOprObj.updateRationCoe(args, newval)
             gljOprObj.updateRationCoe(args, newval)
         } else if (args.sheetName == 'quantity_detail') {
         } else if (args.sheetName == 'quantity_detail') {
             projectObj.project.quantity_detail.isSummationUpdate(args, gljOprObj.detailData, newval);
             projectObj.project.quantity_detail.isSummationUpdate(args, gljOprObj.detailData, newval);
@@ -430,6 +431,26 @@ var gljOprObj = {
         }
         }
         me.editChecking(args);
         me.editChecking(args);
     },
     },
+    onCellDoubleClick:function (sender, args) {
+        var me = gljOprObj;
+        var header = me.setting.header;
+        if (args.row >= me.sheetData.length) {
+            return;
+        }
+        if (header[args.col] && header[args.col].dataCode == 'marketPrice') {
+            if(me.hasComposition(me.sheetData[args.row])){
+                alert("当前工料机的市场价由组成物计算得出,不可直接修改。");
+            }
+        }
+        if (header[args.col] && header[args.col].dataCode == 'basePrice') {
+            var isAdd = me.sheetData[args.row].isAdd;
+            if(isAdd==1){//是新增但没有组成物时允许修改定额价
+                if(me.hasComposition(me.sheetData[args.row])){//如果有组成物,不可修改
+                    alert("当前工料机的定额价由组成物计算得出,不可直接修改。");
+                }
+            }
+        }
+    },
     onCoeCellClick: function (sender, args) {
     onCoeCellClick: function (sender, args) {
         var me = gljOprObj;
         var me = gljOprObj;
         var floatingObject = me.coeSheet.floatingObjects.get('customerCoe');
         var floatingObject = me.coeSheet.floatingObjects.get('customerCoe');
@@ -552,23 +573,42 @@ var gljOprObj = {
         if (me.sheetData[args.row] != undefined) {
         if (me.sheetData[args.row] != undefined) {
             if (me.sheetData[args.row].isMixRatio) {
             if (me.sheetData[args.row].isMixRatio) {
                 disable = true;
                 disable = true;
+            }else {
+                if (header[args.col] && header[args.col].dataCode == 'marketPrice') {
+                    if(me.hasComposition(me.sheetData[args.row])){
+                        disable = true;
+                    }else {
+                        disable = false;
+                    }
+                }
+                if (header[args.col] && header[args.col].dataCode == 'basePrice') {
+                    var isAdd = me.sheetData[args.row].isAdd;
+                    if(isAdd==1){//是新增但没有组成物时允许修改定额价
+                        if(me.hasComposition(me.sheetData[args.row])){//如果有组成物,不可修改
+                            disable = true;
+                        }else {
+                            disable = false;
+                        }
+                    } else {
+                        disable = true;
+                    }
+                }
             }
             }
         }
         }
-        if (header[args.col] && header[args.col].dataCode == 'marketPrice') {
-            var type = me.sheetData[args.row].shortName;
-            var index = _.indexOf(me.setting.notEditedType, type);
-            disable = index == -1 ? false : true;
-        }
-        if (header[args.col] && header[args.col].dataCode == 'basePrice') {
-            var isAdd = me.sheetData[args.row].isAdd;
-            var type_b = me.sheetData[args.row].shortName;
-            var index_b = _.indexOf(me.setting.notEditedType, type);
-            disable = isAdd == 1 && index_b == -1 ? false : true
-        }
         if (disable != null) {
         if (disable != null) {
             me.sheet.getCell(args.row, args.col, GC.Spread.Sheets.SheetArea.viewport).locked(disable);
             me.sheet.getCell(args.row, args.col, GC.Spread.Sheets.SheetArea.viewport).locked(disable);
         }
         }
     },
     },
+    hasComposition:function (ration_glj) {//判断是否有组成物,有则返回true
+        if(notEditType.indexOf(ration_glj.type)!=-1){
+            let con_key = this.getIndex(ration_glj,gljKeyArray);
+            var mixRatioMap = projectObj.project.projectGLJ.datas.mixRatioMap;
+            if(mixRatioMap[con_key]&&mixRatioMap[con_key].length>0){
+                return true;
+            }
+        }
+        return false;
+    },
     addDropDownList: function () {
     addDropDownList: function () {
         var sheet = this.coeSheet;
         var sheet = this.coeSheet;
         sheet.suspendPaint();
         sheet.suspendPaint();
@@ -671,6 +711,7 @@ var gljOprObj = {
         }
         }
     },
     },
     showRationGLJSheetData: function (init) {
     showRationGLJSheetData: function (init) {
+        this.combineWithProjectGlj(this.sheetData);
         this.sheet.setRowCount(0);
         this.sheet.setRowCount(0);
         //console.log(+new Date())
         //console.log(+new Date())
         //this.sheet.getRange(0,-1,this.sheet.getRowCount(),-1).visible(true); //这个方法导致加载缓慢
         //this.sheet.getRange(0,-1,this.sheet.getRowCount(),-1).visible(true); //这个方法导致加载缓慢
@@ -708,7 +749,7 @@ var gljOprObj = {
         return gljList;
         return gljList;
     },
     },
     showInSheet: function (gljList) {
     showInSheet: function (gljList) {
-        this.sheetData = this.combineWithProjectGlj(gljList);
+        this.sheetData = gljList;
         this.showRationGLJSheetData(true);
         this.showRationGLJSheetData(true);
     },
     },
     sumQuantity: function (node) {
     sumQuantity: function (node) {
@@ -762,15 +803,12 @@ var gljOprObj = {
                 var glj = _.find(projectGljs, {'id': ration_gljs[i].projectGLJID});
                 var glj = _.find(projectGljs, {'id': ration_gljs[i].projectGLJID});
                 if (glj) {
                 if (glj) {
                     let typeString = ration_gljs[i].type + "";
                     let typeString = ration_gljs[i].type + "";
-                    if (typeString.indexOf("2") != -1) {//只有材料类型才显示是否暂估
+                    if (typeString.indexOf("2") != -1||typeString=='4'||typeString=='5') {//只有材料类型才显示是否暂估
                         ration_gljs[i].isEstimate = glj.is_evaluate;
                         ration_gljs[i].isEstimate = glj.is_evaluate;
                     }
                     }
-                    ration_gljs[i].basePrice = glj.unit_price.base_price;
-                    ration_gljs[i].marketPrice = glj.unit_price.market_price;
-                    //ration_gljs[i].adjustPrice=glj.adjust_price;
                     ration_gljs[i].isAdd = glj.unit_price.is_add;
                     ration_gljs[i].isAdd = glj.unit_price.is_add;
-                    ration_gljs[i].adjustPrice = projectObj.project.projectGLJ.getAdjustPrice(glj);
-                    var connect_index = this.getIndex(glj, ['code', 'name', 'specs', 'unit', 'type'])
+                    ration_gljs[i]=this.setGLJPrice(ration_gljs[i],glj);//设置工料机价格
+                    var connect_index = this.getIndex(glj, gljKeyArray)
                     if (mixRatioMap.hasOwnProperty(connect_index)) {
                     if (mixRatioMap.hasOwnProperty(connect_index)) {
                         var mixRatios = this.getMixRationShowDatas(mixRatioMap[connect_index], projectGljs);
                         var mixRatios = this.getMixRationShowDatas(mixRatioMap[connect_index], projectGljs);
                         ration_gljs[i].subList = mixRatios;
                         ration_gljs[i].subList = mixRatios;
@@ -780,6 +818,34 @@ var gljOprObj = {
         }
         }
         return ration_gljs;
         return ration_gljs;
     },
     },
+    setGLJPrice:function (data,glj) {
+        glj = glj?glj:_.find(projectObj.project.projectGLJ.datas.projectGljs, {'id': ration_gljs[i].projectGLJID});
+        if(this.calcPriceDiff(glj)==true) {//计取价差
+            data.basePrice = glj.unit_price.base_price;
+            data.marketPrice = glj.unit_price.market_price;
+            data.adjustPrice = projectObj.project.projectGLJ.getAdjustPrice(glj);
+        }else {//不计价差
+            data.basePrice = glj.unit_price.market_price;
+            data.marketPrice = glj.unit_price.market_price;
+            data.adjustPrice = glj.unit_price.market_price;
+        }
+        return data;
+
+    },
+    calcPriceDiff:function (glj) {
+        let calcOptions=projectInfoObj.projectInfo.property.calcOptions;
+        if(glj.is_evaluate==1){//先按是否暂估判断
+            return calcOptions.calc_est;
+        }
+        if(glj.type==gljType.MAIN_MATERIAL||glj.type==gljType.EQUIPMENT){//再判断是否是主材和设备
+            return calcOptions.calc_main;
+        }
+        if(glj.unit_price.is_add==1){//再判断是否新增
+            return calcOptions.calc_add;
+        }
+        return true;
+    },
+
     getIndex(obj, pops){
     getIndex(obj, pops){
         let t_index = '';
         let t_index = '';
         let k_arr = [];
         let k_arr = [];
@@ -790,6 +856,16 @@ var gljOprObj = {
         t_index = k_arr.join("|-|");
         t_index = k_arr.join("|-|");
         return t_index;
         return t_index;
     },
     },
+    getConditionByKey(conKey){//将连接字符串转换成对象
+        let valueArray = conKey.split("|-|");
+        let obj ={};
+        for(let i = 0;i<valueArray.length;i++){
+            if(valueArray[i]!='null'){
+                obj[gljKeyArray[i]]=valueArray[i];
+            }
+        }
+        return obj;
+    },
     getMixRationShowDatas: function (mixRatioList, projectGljs) {
     getMixRationShowDatas: function (mixRatioList, projectGljs) {
         var temRationGLJs = [];
         var temRationGLJs = [];
         for (var i = 0; i < mixRatioList.length; i++) {
         for (var i = 0; i < mixRatioList.length; i++) {
@@ -969,6 +1045,20 @@ var gljOprObj = {
         var recode = me.coeSheetData[args.row];
         var recode = me.coeSheetData[args.row];
         projectObj.project.ration_coe.adjustCoeClick(recode, newval);
         projectObj.project.ration_coe.adjustCoeClick(recode, newval);
     },
     },
+    updateIsEstimate:function (args, newval) {
+        var me = gljOprObj;
+        if(me.setting.header[args.col].dataCode=="isEstimate"){
+            var pspread= new ProjectGLJSpread();
+            var recode = me.sheetData[args.row];
+            let projectGljs = projectObj.project.projectGLJ.datas.gljList;
+            let glj = _.find(projectGljs, {'id': recode.projectGLJID});
+            if(glj){
+                glj["is_evaluate"]=newval;
+                args.fromRG=true;
+                pspread.postUpdate(recode.projectGLJID,"is_evaluate",newval,args,null,successTrigger);
+            }
+        }
+    },
     numberValueChecking: function (val) {
     numberValueChecking: function (val) {
         var newval = Number(val);
         var newval = Number(val);
         if (number_util.isNumber(newval)) {
         if (number_util.isNumber(newval)) {
@@ -1043,7 +1133,7 @@ var gljOprObj = {
         }
         }
     },
     },
     addGLJsSelection: function (args, newVal) {
     addGLJsSelection: function (args, newVal) {
-        var con_key = this.getIndex(this.gljLibSheetData[args.row], ['code', 'name', 'specs', 'unit', 'gljType'])
+        var con_key = this.getIndex(this.gljLibSheetData[args.row], gljLibKeyArray);
         if (newVal == 1) {
         if (newVal == 1) {
             this.GLJSelection.push(con_key);
             this.GLJSelection.push(con_key);
             this.gljLibSheetData[args.row].select = 1;
             this.gljLibSheetData[args.row].select = 1;
@@ -1059,10 +1149,10 @@ var gljOprObj = {
             args.sheet.getCell(args.row, args.col).value(1);
             args.sheet.getCell(args.row, args.col).value(1);
             return;
             return;
         }
         }
-        this.GLJSelection = [me.getIndex(this.gljLibSheetData[args.row], ['code', 'name', 'specs', 'unit', 'gljType'])];
+        this.GLJSelection = [me.getIndex(this.gljLibSheetData[args.row], gljLibKeyArray)];
         this.gljLibSheetData[args.row].select = 1;
         this.gljLibSheetData[args.row].select = 1;
         var oindex = _.findIndex(this.gljLibSheetData, function (item) {
         var oindex = _.findIndex(this.gljLibSheetData, function (item) {
-            var i_key = me.getIndex(item, ['code', 'name', 'specs', 'unit', 'gljType']);
+            var i_key = me.getIndex(item, gljLibKeyArray);
             return oldSelection == i_key;
             return oldSelection == i_key;
         });
         });
         if (oindex != -1) {
         if (oindex != -1) {
@@ -1070,7 +1160,7 @@ var gljOprObj = {
             this.gljLibSheetData[oindex].select = 0;
             this.gljLibSheetData[oindex].select = 0;
         } else {
         } else {
             var oldData = _.find(gljOprObj.AllRecode, function (item) {
             var oldData = _.find(gljOprObj.AllRecode, function (item) {
-                var i_key = me.getIndex(item, ['code', 'name', 'specs', 'unit', 'gljType']);
+                var i_key = me.getIndex(item, gljLibKeyArray);
                 return oldSelection == i_key;
                 return oldSelection == i_key;
             });
             });
             oldData ? oldData.select = 0 : "";
             oldData ? oldData.select = 0 : "";
@@ -1131,7 +1221,7 @@ var gljOprObj = {
         var project = projectObj.project;
         var project = projectObj.project;
         gljOprObj.GLJSelection = _.filter(gljOprObj.GLJSelection, function (n) {
         gljOprObj.GLJSelection = _.filter(gljOprObj.GLJSelection, function (n) {
             var rg = _.find(gljOprObj.sheetData, function (item) {
             var rg = _.find(gljOprObj.sheetData, function (item) {
-                var i_key = gljOprObj.getIndex(item, ['code', 'name', 'specs', 'unit', 'type']);
+                var i_key = gljOprObj.getIndex(item, gljKeyArray);
                 return n == i_key
                 return n == i_key
             })
             })
             return rg ? false : true;
             return rg ? false : true;
@@ -1204,10 +1294,10 @@ var gljOprObj = {
         project.ration_glj.mReplaceGLJ(selectCode, oldData, function (result) {
         project.ration_glj.mReplaceGLJ(selectCode, oldData, function (result) {
             var data = result.data;
             var data = result.data;
             var stateList = result.stateList;
             var stateList = result.stateList;
-            var n_index = me.getIndex(data.query, ['code', 'name', 'specs', 'unit', 'type']);
+            var n_index = me.getIndex(data.query, gljKeyArray);
             var nodes = [];
             var nodes = [];
             _.forEach(project.ration_glj.datas, function (t) {
             _.forEach(project.ration_glj.datas, function (t) {
-                var t_index = me.getIndex(t, ['code', 'name', 'specs', 'unit', 'type']);
+                var t_index = me.getIndex(t, gljKeyArray);
                 if (n_index == t_index) {
                 if (n_index == t_index) {
                     me.updateProperty(t, data.doc);
                     me.updateProperty(t, data.doc);
                     if (project.ration_glj.needShowToTree(t)) {//如果是造价书中的树节点,则也须刷新
                     if (project.ration_glj.needShowToTree(t)) {//如果是造价书中的树节点,则也须刷新
@@ -1403,15 +1493,15 @@ $(function () {
             gljOprObj.GLJSelection = [];
             gljOprObj.GLJSelection = [];
         } else {
         } else {
             selected = gljOprObj.sheetData[gljContextMenu.selectedRow];
             selected = gljOprObj.sheetData[gljContextMenu.selectedRow];
-            var connect_key = gljOprObj.getIndex(selected, ['code', 'name', 'specs', 'unit', 'type'])
+            var connect_key = gljOprObj.getIndex(selected, gljKeyArray);
             gljOprObj.GLJSelection = [connect_key];
             gljOprObj.GLJSelection = [connect_key];
             gljOprObj.filterLibGLJByType();
             gljOprObj.filterLibGLJByType();
         }
         }
 
 
         if (selected != null) {
         if (selected != null) {
-            var s_key = gljOprObj.getIndex(selected, ['code', 'name', 'specs', 'unit', 'gljType']);
+            var s_key = gljOprObj.getIndex(selected, gljLibKeyArray);
             var r = _.find(gljOprObj.gljLibSheetData, function (item) {
             var r = _.find(gljOprObj.gljLibSheetData, function (item) {
-                var item_key = gljOprObj.getIndex(item, ['code', 'name', 'specs', 'unit', 'type']);
+                var item_key = gljOprObj.getIndex(item, gljKeyArray);
                 return s_key == item_key;
                 return s_key == item_key;
             });
             });
             r ? r.select = 1 : "";
             r ? r.select = 1 : "";

+ 44 - 14
web/building_saas/main/js/views/project_property_display_view.js

@@ -3,38 +3,68 @@
  */
  */
 let projDisplayView = {
 let projDisplayView = {
     datas: null,//just for view
     datas: null,//just for view
-    init:function () {
+    init: function () {
         this.datas = projectInfoObj.projectInfo.property.displaySetting;
         this.datas = projectInfoObj.projectInfo.property.displaySetting;
-        this.datas = this.datas === undefined ? { autoHeight: true, disPlayMainMaterial: true } : this.datas;
-        $("#autoHeight").attr("checked",this.datas.autoHeight);
-        $("#disPlayMainMaterial").attr("checked",this.datas.disPlayMainMaterial);
+        this.datas = this.datas === undefined ? {autoHeight: true, disPlayMainMaterial: true} : this.datas;
+        $("#autoHeight").attr("checked", this.datas.autoHeight);
+        $("#disPlayMainMaterial").attr("checked", this.datas.disPlayMainMaterial);
         //$('#disPlayMainMateria').prop('checked')
         //$('#disPlayMainMateria').prop('checked')
- },
+    },
 
 
-    needUpdate: function(autoHeight, disPlayMainMaterial) {
-        if(this.datas==null){
+    needUpdate: function (autoHeight, disPlayMainMaterial) {
+        if (this.datas == null) {
             return;
             return;
         }
         }
         return autoHeight !== this.datas.autoHeight || disPlayMainMaterial !== this.datas.disPlayMainMaterial;
         return autoHeight !== this.datas.autoHeight || disPlayMainMaterial !== this.datas.disPlayMainMaterial;
     },
     },
 
 
-    updateChecking:function (projectID,properties) {
-        if(this.datas==null){
+    updateChecking: function (properties) {
+        if (this.datas == null) {
             return;
             return;
         }
         }
-        var autoHeight = $('#autoHeight').prop('checked');
-        var disPlayMainMaterial = $('#disPlayMainMaterial').prop('checked');
-        if(this.datas.autoHeight!==autoHeight||this.datas.disPlayMainMaterial!==disPlayMainMaterial){
-            this.datas.autoHeight=autoHeight;
-            this.datas.disPlayMainMaterial=disPlayMainMaterial;
+        let autoHeight = $('#autoHeight').prop('checked');
+        let disPlayMainMaterial = $('#disPlayMainMaterial').prop('checked');
+        if (this.datas.autoHeight !== autoHeight || this.datas.disPlayMainMaterial !== disPlayMainMaterial) {
+            this.datas.autoHeight = autoHeight;
+            this.datas.disPlayMainMaterial = disPlayMainMaterial;
             // let updateData = {sourceType: 'properties', updateType: 'update', updateData: {ID: projectID, 'property.displaySetting':this.datas}};
             // let updateData = {sourceType: 'properties', updateType: 'update', updateData: {ID: projectID, 'property.displaySetting':this.datas}};
             properties['property.displaySetting'] = this.datas;
             properties['property.displaySetting'] = this.datas;
         }
         }
     }
     }
 };
 };
 
 
+let calcOptions = {
+    datas: null,//just for view
+    init: function () {
+        this.datas = projectInfoObj.projectInfo.property.calcOptions;
+        $("#calc_main").attr("checked", this.datas.calc_main);
+        $("#calc_add").attr("checked", this.datas.calc_add);
+        $("#calc_est").attr("checked", this.datas.calc_est);
+    },
+    updateChecking: function (properties) {
+        if (this.datas == null) {
+            return false;
+        }
+        let calc_main = $('#calc_main').prop('checked');
+        let calc_add = $('#calc_add').prop('checked');
+        let calc_est = $('#calc_est').prop('checked');
+        if (this.datas.calc_main !== calc_main || this.datas.calc_add !== calc_add||this.datas.calc_est !== calc_est) {
+            this.datas.calc_main = calc_main;
+            this.datas.calc_add = calc_add;
+            this.datas.calc_est = calc_est;
+            properties['property.calcOptions'] = this.datas;
+            return true
+        }
+        return false
+    }
+}
+
+
 $(document).ready(function () {
 $(document).ready(function () {
     $('#tab_display_setting').on('shown.bs.tab', function () {
     $('#tab_display_setting').on('shown.bs.tab', function () {
         projDisplayView.init();
         projDisplayView.init();
     });
     });
+    $('#about-calc').on('shown.bs.tab', function () {
+        calcOptions.init();
+    });
 });
 });

+ 10 - 4
web/building_saas/main/js/views/project_view.js

@@ -628,16 +628,18 @@ var projectObj = {
         let y = window.event.clientY;
         let y = window.event.clientY;
 
 
         // 匹配数字或小数
         // 匹配数字或小数
-        const regular = /^([0-9]+[.]{1}[0-9]+)$|^([1-9]{1}\d+)$/;
+        const regular = /^([0-9]+[.]{1}[0-9]+)$|^([1-9]{1}\d*)$/;
         // 小数点最高位数
         // 小数点最高位数
         let max = 0;
         let max = 0;
         let total = 0;
         let total = 0;
+        let counter = 0;
         for (let col = selectedArea.col; col < (selectedArea.colCount + selectedArea.col); col++) {
         for (let col = selectedArea.col; col < (selectedArea.colCount + selectedArea.col); col++) {
             for (let row = selectedArea.row; row < (selectedArea.rowCount + selectedArea.row); row++) {
             for (let row = selectedArea.row; row < (selectedArea.rowCount + selectedArea.row); row++) {
-                const value = sheet.getCell(row, col).value();
+                const value = sheet.getCell(row, col).text();
                 if (!regular.test(value)) {
                 if (!regular.test(value)) {
                     continue;
                     continue;
                 }
                 }
+                counter++;
                 // 获取当前数据小数位数
                 // 获取当前数据小数位数
                 let pointPosition = value.toString().indexOf(".");
                 let pointPosition = value.toString().indexOf(".");
                 pointPosition = pointPosition < 0 ? pointPosition : pointPosition + 1;
                 pointPosition = pointPosition < 0 ? pointPosition : pointPosition + 1;
@@ -647,7 +649,7 @@ var projectObj = {
             }
             }
         }
         }
         // 如果不为0则悬浮显示
         // 如果不为0则悬浮显示
-        if (total > 0) {
+        if (total > 0 && counter > 1) {
             const div = $('<div id="total-tips"><p>合计: <input type="text" id="total" readonly="readonly" style="border: none;"/></p><p><a href="javascript:void(0);">复制</a></p></div>');
             const div = $('<div id="total-tips"><p>合计: <input type="text" id="total" readonly="readonly" style="border: none;"/></p><p><a href="javascript:void(0);">复制</a></p></div>');
             div.css({
             div.css({
                 position: "absolute",
                 position: "absolute",
@@ -863,7 +865,11 @@ $('#property_ok').click(function () {
         properties['property.decimal'] = updateDecimal;
         properties['property.decimal'] = updateDecimal;
     }
     }
     // 呈现选项
     // 呈现选项
-    projDisplayView.updateChecking(projectID, properties);
+    projDisplayView.updateChecking(properties);
+
+    if(calcOptions.updateChecking(properties)){
+        reCalcRations = true;
+    }
 
 
     // 人工系数
     // 人工系数
     if (labourCoeView.needSave()){
     if (labourCoeView.needSave()){

+ 2 - 1
web/building_saas/main/js/views/std_bills_lib.js

@@ -173,9 +173,10 @@ var billsLibObj = {
             that.stdBillsSpread.unbind(GC.Spread.Sheets.Events.CellDoubleClick);
             that.stdBillsSpread.unbind(GC.Spread.Sheets.Events.CellDoubleClick);
             that.stdBillsSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick, function (sender, args) {
             that.stdBillsSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick, function (sender, args) {
                 let selectNode = stdBillsTree.items[args.row];
                 let selectNode = stdBillsTree.items[args.row];
+                let name = selectNode.data.name;
                 if (stdBillsTree.items[args.row].children.length === 0) {
                 if (stdBillsTree.items[args.row].children.length === 0) {
                     //特征及内容转化
                     //特征及内容转化
-                    pageCCOprObj.setItemContentNode(stdBillsTree.items[args.row], getBillsJobs(stdBillsTree.items[args.row]), getBillsFeatures(stdBillsTree.items[args.row]));
+                    pageCCOprObj.setItemContentNode(stdBillsTree.items[args.row], getBillsJobs(stdBillsTree.items[args.row]), getBillsFeatures(stdBillsTree.items[args.row]), name);
                     if (/\//.test(selectNode.data.unit)) {
                     if (/\//.test(selectNode.data.unit)) {
                         let existB = projectObj.project.Bills.sameStdCodeBillsData(selectNode.data.code);
                         let existB = projectObj.project.Bills.sameStdCodeBillsData(selectNode.data.code);
                         if (existB) {
                         if (existB) {

+ 25 - 6
web/building_saas/main/js/views/sub_view.js

@@ -101,13 +101,13 @@ $("#linkTZJNR").click(function () {
     $("#subItems").children().hide();
     $("#subItems").children().hide();
     $("#tzjnrCon").show();
     $("#tzjnrCon").show();
     $("#add-rule").show();
     $("#add-rule").show();
+    $("#add-rule p").not(":first").css('margin-bottom', 4);
     pageCCOprObj.active = true;
     pageCCOprObj.active = true;
     refreshSubSpread();
     refreshSubSpread();
     let selectedNode = projectObj.mainController.tree.selected;
     let selectedNode = projectObj.mainController.tree.selected;
-    if (selectedNode.data.addRule !== undefined) {
-        setRule(selectedNode.data.addRule);
+    if (projectObj.project.property.addRule !== undefined) {
+        setRule(projectObj.project.property.addRule);
     }
     }
-
     pageCCOprObj.mainActiveCell = projectObj.mainSpread.getActiveSheet().getSelections()[0];
     pageCCOprObj.mainActiveCell = projectObj.mainSpread.getActiveSheet().getSelections()[0];
     if(selectedNode && selectedNode.sourceType === projectObj.project.Bills.getSourceType()){
     if(selectedNode && selectedNode.sourceType === projectObj.project.Bills.getSourceType()){
         pageCCOprObj.setCacheAndShow(selectedNode);
         pageCCOprObj.setCacheAndShow(selectedNode);
@@ -129,7 +129,12 @@ $("#use-to-current").click(function() {
     const self = $(this);
     const self = $(this);
     self.attr('disabled', 'disabled');
     self.attr('disabled', 'disabled');
     let selectedNode = projectObj.mainController.tree.selected;
     let selectedNode = projectObj.mainController.tree.selected;
+    // 获取原名称
+    const name = selectedNode.data.name.split("\n");
+    pageCCOprObj.nameCache = name[0] !== undefined ? name[0] : "";
+    // 操作内容
     pageCCOprObj.setCharacterBySetting(selectedNode, setting);
     pageCCOprObj.setCharacterBySetting(selectedNode, setting);
+
     // 防止连续点击1秒后才能再次发起请求
     // 防止连续点击1秒后才能再次发起请求
     setTimeout(function() {
     setTimeout(function() {
         isSaving = false;
         isSaving = false;
@@ -143,11 +148,16 @@ $("#use-to-all").click(function() {
     if (treeNode.items === undefined || treeNode.items.length <= 0) {
     if (treeNode.items === undefined || treeNode.items.length <= 0) {
         return false;
         return false;
     }
     }
+    // 处理结果
     for (const item of treeNode.items) {
     for (const item of treeNode.items) {
         if (item.data.jobContent === undefined || item.data.jobContent.length <= 0 ||
         if (item.data.jobContent === undefined || item.data.jobContent.length <= 0 ||
-        item.data.itemCharacter === undefined || item.data.itemCharacter.length <= 0) {
+            item.data.itemCharacter === undefined || item.data.itemCharacter.length <= 0 || item.data.code === undefined) {
             continue;
             continue;
         }
         }
+        // 获取原名称
+        const name = item.data.name.split("\n");
+        pageCCOprObj.nameCache = name[0] !== undefined ? name[0] : "";
+
         pageCCOprObj.setCharacterBySetting(item, setting);
         pageCCOprObj.setCharacterBySetting(item, setting);
     }
     }
 });
 });
@@ -158,6 +168,7 @@ $("#add-position").change(function() {
     const addContentEle = $("#add-content");
     const addContentEle = $("#add-content");
     const displayFormatEle = $("#display-format");
     const displayFormatEle = $("#display-format");
     const characterFormatEle = $("#character-format");
     const characterFormatEle = $("#character-format");
+    const serialTypeEle = $("#serial-type");
     switch (selected) {
     switch (selected) {
         case '4':
         case '4':
             // 分别添加到对应列
             // 分别添加到对应列
@@ -165,14 +176,14 @@ $("#add-position").change(function() {
             addContentEle.val('');
             addContentEle.val('');
             addContentEle.attr('disabled', 'disabled');
             addContentEle.attr('disabled', 'disabled');
             displayFormatEle.val(1);
             displayFormatEle.val(1);
-            displayFormatEle.attr('disabled', 'disabled');
             characterFormatEle.val(2);
             characterFormatEle.val(2);
-            characterFormatEle.attr('disabled', 'disabled');
+            serialTypeEle.val(1);
             break;
             break;
         default:
         default:
             addContentEle.removeAttr('disabled');
             addContentEle.removeAttr('disabled');
             displayFormatEle.removeAttr('disabled');
             displayFormatEle.removeAttr('disabled');
             characterFormatEle.removeAttr('disabled');
             characterFormatEle.removeAttr('disabled');
+            addContentEle.val(1);
             break;
             break;
     }
     }
 });
 });
@@ -197,6 +208,11 @@ $("#add-content").change(function() {
         case '2':
         case '2':
         case '3':
         case '3':
             characterFormatEle.removeAttr('disabled');
             characterFormatEle.removeAttr('disabled');
+            if (serialTypeEle.val() === '') {
+                serialTypeEle.val(1);
+            }
+            serialTypeEle.removeAttr('disabled');
+            childDisplayFormatEle.attr('disabled', 'disabled');
             break;
             break;
         case '4':
         case '4':
             // 当“添加内容”是“定额子目”或“工作内容”,则“特征生成方式”灰显,不需选择;否则有效可选。
             // 当“添加内容”是“定额子目”或“工作内容”,则“特征生成方式”灰显,不需选择;否则有效可选。
@@ -204,6 +220,9 @@ $("#add-content").change(function() {
             characterFormatEle.val(2);
             characterFormatEle.val(2);
         default:
         default:
             serialTypeEle.removeAttr('disabled');
             serialTypeEle.removeAttr('disabled');
+            if (serialTypeEle.val() === '') {
+                serialTypeEle.val(1);
+            }
             childDisplayFormatEle.attr('disabled', 'disabled');
             childDisplayFormatEle.attr('disabled', 'disabled');
             break;
             break;
     }
     }

+ 6 - 4
web/building_saas/pm/js/pm_main.js

@@ -1726,10 +1726,12 @@ function getUsedObj(tenders, fileId, type){
     rst.usedCount = 0;
     rst.usedCount = 0;
     rst.usedInfo = null;
     rst.usedInfo = null;
     for(let i = 0, len = tenders.length; i < len; i++){
     for(let i = 0, len = tenders.length; i < len; i++){
-        let theFile = type === fileType.unitPriceFile ? tenders[i].data.property.unitPriceFile || null : tenders[i].data.property.feeFile || null;
-        if(theFile && theFile.id == fileId){
-            usedCount ++;
-            usedInfo += tenders[i].data.name + '<br>';
+        if(tenders[i].data.property){
+            let theFile = type === fileType.unitPriceFile ? tenders[i].data.property.unitPriceFile || null : tenders[i].data.property.feeFile || null;
+            if(theFile && theFile.id == fileId){
+                usedCount ++;
+                usedInfo += tenders[i].data.name + '<br>';
+            }
         }
         }
     }
     }
     if(usedCount > 0){
     if(usedCount > 0){

+ 16 - 0
web/building_saas/report/html/rpt_main.html

@@ -73,6 +73,22 @@
                             报表设置
                             报表设置
                         </div>
                         </div>
                     </div>
                     </div>
+                    <div class="panel">
+                        <div class="panel-body">
+                            <div class="input-group input-group-sm" role="group">
+                            <span class="input-group-btn">
+                              <button type="button" class="btn btn-secondary btn-sm" data-toggle="tooltip" data-placement="bottom" title="上一页"><i class="fa fa-chevron-left" onclick="rptControlObj.prePage(this)"></i></button>
+                            </span>
+                                <input class="form-control" id="rpt_page_num" value="" style="width:60px"  data-toggle="tooltip" data-placement="bottom" title="输入页码按回车键,快速跳转">
+                                <span class="input-group-btn">
+                              <button type="button" class="btn btn-secondary btn-sm" data-toggle="tooltip" data-placement="bottom" title="下一页"><i class="fa fa-chevron-right" onclick="rptControlObj.nextPage(this)"></i></button>
+                            </span>
+                            </div>
+                        </div>
+                        <div class="panel-foot text-muted">
+                            翻页
+                        </div>
+                    </div>
                 </div>
                 </div>
             </div>
             </div>
             <div class="print-view poj-list">
             <div class="print-view poj-list">

+ 14 - 0
web/building_saas/report/js/rpt_main.js

@@ -85,6 +85,7 @@ let zTreeOprObj = {
                         me.currentRptPageRst = pageRst;
                         me.currentRptPageRst = pageRst;
                         me.maxPages = pageRst.items.length;
                         me.maxPages = pageRst.items.length;
                         me.currentPage = 1;
                         me.currentPage = 1;
+                        me.displayPageValue();
                         let size = JpcCanvasOutput.getReportSizeInPixel(me.currentRptPageRst, getScreenDPI());
                         let size = JpcCanvasOutput.getReportSizeInPixel(me.currentRptPageRst, getScreenDPI());
                         canvas.width = size[0] + 20;
                         canvas.width = size[0] + 20;
                         if (size[1] > size[0]) {
                         if (size[1] > size[0]) {
@@ -106,6 +107,11 @@ let zTreeOprObj = {
             JpcCanvasOutput.drawPageBorder(me.currentRptPageRst, canvas, getScreenDPI());
             JpcCanvasOutput.drawPageBorder(me.currentRptPageRst, canvas, getScreenDPI());
             JpcCanvasOutput.drawToCanvas(me.currentRptPageRst, canvas, me.currentPage);
             JpcCanvasOutput.drawToCanvas(me.currentRptPageRst, canvas, me.currentPage);
         }
         }
+        me.displayPageValue();
+    },
+    displayPageValue: function() {
+        let me = zTreeOprObj;
+        $("#rpt_page_num").get(0).value = me.currentPage + "/" + me.maxPages;
     }
     }
 };
 };
 
 
@@ -210,5 +216,13 @@ let rptControlObj = {
                 me.getCurrentPageSize() + "/" + orgRptName;
                 me.getCurrentPageSize() + "/" + orgRptName;
             window.location = url;//这里不能使用get方法跳转,否则下载不成功
             window.location = url;//这里不能使用get方法跳转,否则下载不成功
         }
         }
+    },
+    prePage: function(dom) {
+        let canvas = document.getElementById("rptCanvas");
+        zTreeOprObj.showPage(zTreeOprObj.currentPage - 1, canvas);
+    },
+    nextPage: function(dom) {
+        let canvas = document.getElementById("rptCanvas");
+        zTreeOprObj.showPage(zTreeOprObj.currentPage + 1, canvas);
     }
     }
 };
 };