瀏覽代碼

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

chenshilong 7 年之前
父節點
當前提交
879558002d

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

@@ -2,7 +2,7 @@
  * Created by jimiz on 2017/4/7.
  */
 var billsData = require('../models/bills');
-
+let ProjectsData = require('../../pm/models/project_model').project;
 //统一回调函数
 var callback = function(req, res, err, message, data){
     res.json({error: err, message: message, data: data});
@@ -54,9 +54,24 @@ module.exports = {
         const data = JSON.parse(request.body.data);
         const findSet = data.findSet;
         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 message = !result ? '修改失败' : '修改成功';
-        const err = !result ? 1 : 0;
+        const message = !result || !projectResult ? '修改失败' : '修改成功';
+        const err = !result || !projectResult ? 1 : 0;
         callback(request, response, err, message, null);
     }
 

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

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

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

@@ -44,20 +44,5 @@ let itemCharacterSchema = new Schema({
     eigenvalue: [eigenvalueSchema],//特征值
     isChecked: Boolean //是否勾选(输出)
 }, {_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};

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

@@ -594,6 +594,25 @@ ProjectsDAO.prototype.changeUnitPriceFileInfo = async function(projectId, change
     return result.ok === 1;
 };
 
+/**
+ * 更新项目属性
+ *
+ * @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,

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

@@ -50,12 +50,12 @@ let JpcAreaHelper = {
                 }
             } 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);
                 } else {
                     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);
                 } else {
                     innerBottom = 1.0 * areaNode[JV.PROP_BOTTOM] * unitFactor;

+ 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/calc_program_model');
+//config.setupCache();
+let cfgCacheUtil = require("../../../config/cacheCfg");
+cfgCacheUtil.setupDftCache();
 
 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/calc_program_model');
+//config.setupCache();
+let cfgCacheUtil = require("../../../config/cacheCfg");
+cfgCacheUtil.setupDftCache();
 
 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 = 1296; //QA:
+//*/
+let userId_Dft = userId_Leng;
+/*/
+ let userId_Dft = 76075;
+ //*/
+
+let rptTplFacade = require("../../../modules/reports/facade/rpt_template_facade");
+let rptTplDataFacade = require("../../../modules/reports/facade/rpt_tpl_data_facade");
+
+import rptDataExtractor from "../../../modules/reports/util/rpt_construct_data_util";
+
+let fs = require('fs');
+//设置Date Format函数
+fs.readFile(__dirname.slice(0, __dirname.length - 18) + '/public/web/date_util.js', 'utf8', 'r', function (err, data) {
+    eval(data);
+});
+
+/*/
+ test('测试 - 获取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/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');

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

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

+ 1 - 1
web/building_saas/glj/js/project_glj_spread.js

@@ -19,7 +19,7 @@ function ProjectGLJSpread() {
     this.successCallback = null;
     this.supplyType = ['自行采购', '部分甲供', '完全甲供', '甲定乙供'];
     // 工料机类型是混凝土、砂浆、配合比、机械(不包括机械组成物)时,供货方式列只读。
-    this.supplyReadonlyType = [GLJTypeConst.CONCRETE, GLJTypeConst.MORTAR, GLJTypeConst.MIX_RATIO, GLJTypeConst.GENERAL_MACHINE];
+    this.supplyReadonlyType = notEditType;
 }
 
 /**

+ 1 - 3
web/building_saas/main/html/main.html

@@ -84,6 +84,7 @@
                           <div class="top-content">
                               <div class="main-data-top" id="billsSpread"></div>
                           </div>
+                          <div class="resize"></div>
                           <div class="bottom-content">
                               <ul class="nav nav-tabs" role="tablist">
                                   <li class="nav-item">
@@ -107,9 +108,6 @@
                                   <li class="nav-item">
                                       <a class="nav-link" id="linkTZJNR" data-toggle="tab" href="#subSpread" role="tab">特征及内容</a>
                                   </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>
                               <!-- Tab panes -->
                               <div class="tab-content" id="tabCon">

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

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

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

@@ -47,6 +47,12 @@ const gljType = {
     EQUIPMENT: 5
 };
 
+const notEditType = [
+    gljType.CONCRETE,
+    gljType.MORTAR,
+    gljType.MIX_RATIO,
+    gljType.GENERAL_MACHINE
+];
 
 const CP_Col_Width = {          // 多处计算程序界面的列宽统一设置
     rowHeader: 30,

+ 104 - 88
web/building_saas/main/js/models/project_glj.js

@@ -27,13 +27,13 @@ ProjectGLJ.prototype.loadData = function (callback = null) {
         type: 'post',
         dataType: 'json',
         data: {project_id: scUrlUtil.GetQueryString('project')},
-        error: function() {
+        error: function () {
             // alert('数据传输错误');
         },
-        beforeSend: function() {
+        beforeSend: function () {
             self.isLoading = true;
         },
-        success: function(response) {
+        success: function (response) {
             self.isLoading = false;
             if (response.err === 1) {
                 let msg = response.msg !== undefined && response.msg !== '' ? response.msg : '读取工料机数据失败!';
@@ -53,7 +53,7 @@ ProjectGLJ.prototype.loadData = function (callback = null) {
 
 ProjectGLJ.prototype.loadToCache = function (data) {
     this.datas = data;
-    projectObj.project.projectGLJ=this;
+    projectObj.project.projectGLJ = this;
 }
 
 
@@ -74,7 +74,7 @@ ProjectGLJ.prototype.getDataByCode = function (code) {
         return result;
     }
 
-    for(let tmp of gljList) {
+    for (let tmp of gljList) {
         if (tmp.code === code) {
             result = tmp;
             break;
@@ -91,7 +91,7 @@ ProjectGLJ.prototype.getDataByCode = function (code) {
  * @param {Object} data
  * @return {boolean}
  */
-ProjectGLJ.prototype.updateData = function(id, data) {
+ProjectGLJ.prototype.updateData = function (id, data) {
     let result = false;
     if (this.datas === null) {
         return result;
@@ -104,7 +104,7 @@ ProjectGLJ.prototype.updateData = function(id, data) {
 
     // 查找对应的index
     let index = -1;
-    for(let tmp in gljList) {
+    for (let tmp in gljList) {
         if (gljList[tmp].id === id) {
             index = tmp;
             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中的对象
             this.datas.gljList[index]['unit_price'][tmpIndex] = data[tmpIndex];
         } else {
@@ -132,110 +132,110 @@ ProjectGLJ.prototype.updateData = function(id, data) {
  *
  * @return {void}
  */
-ProjectGLJ.prototype.loadCacheData = function() {
+ProjectGLJ.prototype.loadCacheData = function () {
     // 加载工料机数据
     let data = this.datas === null ? null : this.datas;
     if (data === null) {
         return;
     }
     jsonData = data.gljList !== undefined && data.gljList.length > 0 ? data.gljList : [];
-    jsonData=filterProjectGLJ(jsonData);
+    jsonData = filterProjectGLJ(jsonData);
     jsonData = sortProjectGLJ(jsonData);
     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.updateBasePriceFromRG(recode, "market_price", newval);
     }
-    if(updateField=='basePrice'){
-        this.updateBasePriceFromRG(recode,"base_price",newval);
+    if (updateField == 'basePrice') {
+        this.updateBasePriceFromRG(recode, "base_price", newval);
     }
 };
 
-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 postData = {};
-    if(rationTypeGLJ[updateField]==newval){
+    if (rationTypeGLJ[updateField] == newval) {
         return;
     }
-    let data ={
+    let data = {
         glj_id: rationTypeGLJ.GLJID,
         project_id: rationTypeGLJ.projectID,
         code: rationTypeGLJ.code,
-        original_code:rationTypeGLJ.original_code,
+        original_code: rationTypeGLJ.original_code,
         name: rationTypeGLJ.name,
-        shortName:rationTypeGLJ.shortName,
+        shortName: rationTypeGLJ.shortName,
         specs: rationTypeGLJ.specs,
         unit: rationTypeGLJ.unit,
-        type:rationTypeGLJ.subType,
-        type_of_work:rationTypeGLJ.subType,
+        type: rationTypeGLJ.subType,
+        type_of_work: rationTypeGLJ.subType,
         base_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_of_work = newval;
         data.shortName = this.getShortNameByID(newval);
-    }else {
-        data[updateField]=newval;
+    } else {
+        data[updateField] = newval;
     }
     postData.ration = {
-        ID:rationTypeGLJ.ID,
-        projectID:rationTypeGLJ.projectID
+        ID: rationTypeGLJ.ID,
+        projectID: rationTypeGLJ.projectID
     };
     postData.updateData = data;
     $.bootstrapLoading.start();
-    CommonAjax.post("/glj/modifyKeyValue",postData,function (result) {
+    CommonAjax.post("/glj/modifyKeyValue", postData, function (result) {
         console.log(result);  //更新节点信息
-        rationTypeGLJ[updateField]=newval;
+        rationTypeGLJ[updateField] = newval;
         rationTypeGLJ.projectGLJID = result.id;
         rationTypeGLJ.code = result.code;
         rationTypeGLJ.basePrice = result.unit_price.base_price;
         rationTypeGLJ.marketUnitFee = result.unit_price.market_price;
         rationTypeGLJ.isAdd = result.unit_price.is_add;
-        rationTypeGLJ.isEstimate=result.is_evaluate;
+        rationTypeGLJ.isEstimate = result.is_evaluate;
         rationTypeGLJ.shortName = result.unit_price.short_name;
         //触发计算并更新节点信息
-        node.changed=true;
+        node.changed = true;
         projectObj.project.projectGLJ.loadData(function () {
             projectObj.project.calcProgram.calculate(node);
             projectObj.project.calcProgram.saveNode(node);
             $.bootstrapLoading.end();
         });//重新加载项目工料机数据
         //上面两步都是异步操作,这句应该是要等上面两步做完了再执行的
-    },function (err) {
+    }, function (err) {
         $.bootstrapLoading.end();
     });
-    
+
 }
 
-ProjectGLJ.prototype.updateBasePriceFromRG=function(recode,updateField,newval){
+ProjectGLJ.prototype.updateBasePriceFromRG = function (recode, updateField, newval) {
     let me = this;
     let projectGljs = this.datas.gljList;
-    let glj = _.find(projectGljs,{'id':recode.projectGLJID});
+    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;
+    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);
-            }else {
-                glj.unit_price.market_price=newval;
+            } else {
+                glj.unit_price.market_price = newval;
             }
             //更新项目工料机价格
             me.refreshProjectGLJPrice(data);
@@ -247,17 +247,17 @@ ProjectGLJ.prototype.updateBasePriceFromRG=function(recode,updateField,newval){
             $.bootstrapLoading.end();
         }
         $.bootstrapLoading.start();
-        CommonAjax.post("/glj/updatePrice",data,callback,function (err) {
+        CommonAjax.post("/glj/updatePrice", data, callback, function (err) {
             $.bootstrapLoading.end();
         });
-    }else {
+    } else {
         gljOprObj.showRationGLJSheetData();
     }
 }
 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;
                 return true;
             }
@@ -269,35 +269,35 @@ ProjectGLJ.prototype.refreshTreeNodePriceIfNeed = function (data) {
 
 //根据工料机,取得所有受影响的定额节点
 ProjectGLJ.prototype.getImpactRationNodes = function (glj) {
-    let nodes=[];
+    let nodes = [];
     let rationMap = {};
     //先根据项目工料机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 (rg.projectGLJID == glj.id) {
             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){
+    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; //更新市场单价
                     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;
 };
-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,19 +306,19 @@ ProjectGLJ.prototype.refreshRationTypeGLJ = function (glj) {
 
 }
 
-ProjectGLJ.prototype.refreshProjectGLJPrice=function(data){
+ProjectGLJ.prototype.refreshProjectGLJPrice = function (data) {
     let projectGljs = this.datas.gljList;
-    let indexList = ['code','name','specs','unit','type'];
-    for(let d of data){
-        if(d){
+    let indexList = ['code', 'name', 'specs', 'unit', 'type'];
+    for (let d of data) {
+        if (d) {
             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){
+            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);
@@ -329,7 +329,7 @@ ProjectGLJ.prototype.refreshProjectGLJPrice=function(data){
     }
 }
 
-ProjectGLJ.prototype.setAdjustPrice=function(glj){
+ProjectGLJ.prototype.setAdjustPrice = function (glj) {
     switch (glj.unit_price.type + '') {
         // 人工: 调整基价=基价单价*调整系数
         case GLJTypeConst.LABOUR:
@@ -348,18 +348,34 @@ ProjectGLJ.prototype.setAdjustPrice=function(glj){
 
 ProjectGLJ.prototype.getAdjustPrice = function (glj) {
     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=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
     }
 }
 
 ProjectGLJ.prototype.getShortNameByID = function (ID) {
     let gljTypeMap = this.datas.constData.gljTypeMap;
-    return gljTypeMap["typeId"+ID].shortName;
+    return gljTypeMap["typeId" + ID].shortName;
 }

+ 2 - 3
web/building_saas/main/js/models/ration_glj.js

@@ -345,7 +345,6 @@ var ration_glj = {
                 let initShow = false;//是否需要表格初始化显示
                 if (updateField == 'customQuantity') {
                     me.refreshAfterQuantityUpdate(data, node);
-                    me.refreshTreeNodeIfNeeded(recode);//需刷新主材和设备的工程量和含量
                 } else {
                     var doc = data.doc;
                     for (var key in doc) {
@@ -360,11 +359,11 @@ var ration_glj = {
                     if (node) {//如果不是在造价书页面直接编辑,则不用刷新
                         if (updateField == "type" && !(newval == gljType.MAIN_MATERIAL || newval == gljType.EQUIPMENT)) {//如果改变类型后不是主材或设备,则在造价书树中移除
                             projectObj.mainController.deleteNode(node, true);
-                        } else {
-                            me.refreshTreeNodeIfNeeded(recode);
                         }
                     }
                 }
+                me.refreshTreeNodeIfNeeded(recode);//刷新造价书上的树节点(如果需要)
+
                 if (initShow == false) {//不需要初始化,只需耍新当前显示就可以了
                     gljOprObj.showRationGLJSheetData();
                 }

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

@@ -118,10 +118,13 @@ let contentOprObj = {
 
     },
     save: function () {
-        let me = contentOprObj;
-        let contentTxt = me.getColData(me.currentCache);
-        let txtObj =  {field: 'jobContentText', text: contentTxt ? contentTxt : ''};
-        pageCCOprObj.updateCharacterContent(pageCCOprObj.currentFindSet, {field: 'jobContent', updateArr: me.currentCache}, txtObj, 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 txtObj =  {field: 'jobContentText', text: contentTxt ? contentTxt : ''};
+        // pageCCOprObj.updateCharacterContent(pageCCOprObj.currentFindSet, {field: 'jobContent', updateArr: me.currentCache}, txtObj, contentOprObj);
     },
     onEditEnded: function (sender, args) {
         let me = contentOprObj;
@@ -489,10 +492,13 @@ let characterOprObj = {
         }
     },
     save: function () {
-        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);
+        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);
     },
     onEditStart: function (sender, args) {
         let me = characterOprObj;
@@ -640,6 +646,7 @@ let characterOprObj = {
 let pageCCOprObj = {
     currentFindSet: null,
     mainActiveCell: null,//mainSpread焦点单元格
+    nameCache: '',
     //获得造价书当前焦点行的类型:清单、定额
     isBillsType: function () {
         let rst = false;
@@ -650,17 +657,22 @@ let pageCCOprObj = {
         return rst;
 
     },
-    setItemContentNode: function (node, jobs, items) {
+    setItemContentNode: function (node, jobs, items, name = '') {
         let theCont = contentOprObj, theCha = characterOprObj,
             jobContent, itemCharacter, contentTxt, characterTxt;
         jobContent = theCont.buildJobContent(jobs);
         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.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) {
         return characterOprObj.buildItemCharactet(itemCharater);
@@ -777,32 +789,26 @@ let pageCCOprObj = {
      *
      * @param {Object} node - 节点数据
      * @param {Object} refreshData - 刷新的数据
-     * @param {Object} defaultData - 默认数据
      * @return {void}
      */
-    refreshView: function(node, refreshData, defaultData) {
+    refreshView: function(node, refreshData) {
         // 更新清单行特征列或内容列
         let updateCol = [
-            { name: 'character', col: 4 },
-            { name: 'content', col: 5 },
+            { name: 'itemCharacterText', col: 4 },
+            { name: 'jobContentText', col: 5 },
             { name: 'name', col: 2 }
         ];
         if (updateCol === '') {
             return;
         }
-        const row = node.getID() - 1;
+        const row = node.serialNo();
         // 刷新输出显示
         for (const tmp of updateCol) {
             // 没有默认的数据则跳过刷新
-            if (defaultData[tmp.name] === undefined) {
-                continue;
-            }
-            // 不存在更新的数据则全部用默认数据替代
             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);
     },
@@ -814,122 +820,26 @@ let pageCCOprObj = {
      * @return {void}
      */
     setCharacterBySetting: function(node, setting) {
-        let contentArray = [];
         let self = this;
 
         // 保存的条件数据
         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 updateData = this.getCharacterUpdateData(setting, node);
 
-        // 获取当前设置数据
-        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("\r\n");
-                break;
-            case "2":
-                // 逗号分隔
-                content = contentArray.join(',');
-                break;
-            case "3":
-                // 括号分隔
-                content = '(' + contentArray.join(',') + ')';
-                break;
-        }
-        // 添加到对应位置
         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) {
-            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;
         });
 
     },
@@ -1006,9 +916,7 @@ let pageCCOprObj = {
                 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 = [];
@@ -1057,54 +965,110 @@ let pageCCOprObj = {
             }
             result['content'] = jobArray;
         } catch (error) {
+            console.log(error);
             result = {};
         }
         return result;
     },
+
     /**
-     * 还原数据
+     * 获取特征内容名称更新的数据
      *
+     * @param {Object} setting - 设置
      * @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: '',
+        };
+        let contentArray = [];
+        // 获取默认数据
+        const defaultData = this.getDataBySetting(node, {
+            serialType: "1",
+            characterFormat: "2",
+        });
+        defaultData.character = defaultData.character.join("\r\n");
+        defaultData.content = defaultData.content.join("\r\n");
 
-        switch (setType) {
+        // 获取当前设置数据
+        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("\r\n");
+                break;
+            case "2":
+                // 逗号分隔
+                content = contentArray.join(',');
+                break;
+            case "3":
+                // 括号分隔
+                content = '(' + contentArray.join(',') + ')';
+                break;
+        }
+        // 添加到对应位置
+        switch (setting.position) {
             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;
             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 = defaultData.name + "\r\n" + content;
+                updateData.name = content;
                 break;
             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: defaultData.character,
+                    jobContentText: defaultData.content,
+                    name: defaultData.name,
+                };
                 break;
         }
+
+        return updateData;
     },
 }

+ 54 - 13
web/building_saas/main/js/views/glj_view.js

@@ -94,9 +94,10 @@ var gljOprObj = {
         view: {
             comboBox: [{row: -1, col: 12, 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: {
         header: [
@@ -262,6 +263,7 @@ var gljOprObj = {
         sheet.name('ration_glj');
         me.bindSheetEvent(sheet);
         sheet.bind(GC.Spread.Sheets.Events.CellClick, me.onCellClick);
+        sheet.bind(GC.Spread.Sheets.Events.CellDoubleClick, me.onCellDoubleClick);
         gljContextMenu.loadGLJSpreadContextMenu();
     },
     initCoeSheet: function (sheet) {
@@ -430,6 +432,26 @@ var gljOprObj = {
         }
         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) {
         var me = gljOprObj;
         var floatingObject = me.coeSheet.floatingObjects.get('customerCoe');
@@ -552,23 +574,42 @@ var gljOprObj = {
         if (me.sheetData[args.row] != undefined) {
             if (me.sheetData[args.row].isMixRatio) {
                 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) {
             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,['code', 'name', 'specs', 'unit', 'type']);
+            var mixRatioMap = projectObj.project.projectGLJ.datas.mixRatioMap;
+            if(mixRatioMap[con_key]&&mixRatioMap[con_key].length>0){
+                return true;
+            }
+        }
+        return false;
+    },
     addDropDownList: function () {
         var sheet = this.coeSheet;
         sheet.suspendPaint();

+ 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.bind(GC.Spread.Sheets.Events.CellDoubleClick, function (sender, args) {
                 let selectNode = stdBillsTree.items[args.row];
+                let name = selectNode.data.name;
                 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)) {
                         let existB = projectObj.project.Bills.sameStdCodeBillsData(selectNode.data.code);
                         if (existB) {

+ 40 - 10
web/building_saas/main/js/views/sub_view.js

@@ -104,10 +104,9 @@ $("#linkTZJNR").click(function () {
     pageCCOprObj.active = true;
     refreshSubSpread();
     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];
     if(selectedNode && selectedNode.sourceType === projectObj.project.Bills.getSourceType()){
         pageCCOprObj.setCacheAndShow(selectedNode);
@@ -129,7 +128,16 @@ $("#use-to-current").click(function() {
     const self = $(this);
     self.attr('disabled', 'disabled');
     let selectedNode = projectObj.mainController.tree.selected;
-    pageCCOprObj.setCharacterBySetting(selectedNode, setting);
+    // 获取原名称
+    let libId = projectInfoObj.projectInfo.engineeringInfo.bill_lib[0].id;
+    let orgCode = selectedNode.data.code.substr(0, 9);
+    CommonAjax.post('/stdBillsEditor/getStdBillsByCode', {userId: userID, billsLibId: libId, code: orgCode}, function (data) {
+        if (data) {
+            pageCCOprObj.nameCache = data.name;
+            // 操作内容
+            pageCCOprObj.setCharacterBySetting(selectedNode, setting);
+        }
+    });
     // 防止连续点击1秒后才能再次发起请求
     setTimeout(function() {
         isSaving = false;
@@ -143,13 +151,35 @@ $("#use-to-all").click(function() {
     if (treeNode.items === undefined || treeNode.items.length <= 0) {
         return false;
     }
-    for (const item of treeNode.items) {
-        if (item.data.jobContent === undefined || item.data.jobContent.length <= 0 ||
-        item.data.itemCharacter === undefined || item.data.itemCharacter.length <= 0) {
-            continue;
-        }
-        pageCCOprObj.setCharacterBySetting(item, setting);
+    // 获取所有标准清单
+    const stdBillsLibID = $("#stdBillsLibSelect").is(":visible") ?
+        $("#stdBillsLibSelect").val() : (projectInfoObj.projectInfo.engineeringInfo.bill_lib[0] !== undefined ? projectInfoObj.projectInfo.engineeringInfo.bill_lib[0].id : 0);
+    if (stdBillsLibID <= 0) {
+        return false;
     }
+    let stdBillData = {};
+    CommonAjax.post('/stdBillsEditor/getBills', {userId: userID, billsLibId: stdBillsLibID}, function (data) {
+        if (!data instanceof Array || data.length <= 0) {
+            return false;
+        }
+        // 整理数据
+        for (const tmp of data) {
+            stdBillData[tmp.code] = tmp;
+        }
+        // 处理结果
+        for (const item of treeNode.items) {
+            if (item.data.jobContent === undefined || item.data.jobContent.length <= 0 ||
+                item.data.itemCharacter === undefined || item.data.itemCharacter.length <= 0 || item.data.code === undefined) {
+                continue;
+            }
+            const orgCode = item.data.code.substr(0, 9);
+            if (stdBillData[orgCode] === undefined) {
+                continue;
+            }
+            pageCCOprObj.nameCache = stdBillData[orgCode].name;
+            pageCCOprObj.setCharacterBySetting(item, setting);
+        }
+    });
 });
 
 // 添加位置选择