浏览代码

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

TonyKang 7 年之前
父节点
当前提交
2355510cca

+ 9 - 8
modules/pm/controllers/pm_controller.js

@@ -40,7 +40,7 @@ module.exports = {
         });
         });
     },
     },
     getProjects: function(req, res){
     getProjects: function(req, res){
-        ProjectsData.getUserProjects(req.session.sessionUser.ssoId, function(err, message, projects){
+        ProjectsData.getUserProjects(req.session.sessionUser.ssoId, req.session.sessionCompilation._id, function(err, message, projects){
             if (projects) {
             if (projects) {
                 callback(req, res, err, message, projects);
                 callback(req, res, err, message, projects);
             } else {
             } else {
@@ -50,7 +50,7 @@ module.exports = {
     },
     },
     updateProjects: async function (req, res) {
     updateProjects: async function (req, res) {
         let data = JSON.parse(req.body.data);
         let data = JSON.parse(req.body.data);
-        await ProjectsData.updateUserProjects(req.session.sessionUser.ssoId, data.updateData, function (err, message, data) {
+        await ProjectsData.updateUserProjects(req.session.sessionUser.ssoId, req.session.sessionCompilation._id, data.updateData, function (err, message, data) {
             if (err === 0) {
             if (err === 0) {
                 callback(req, res, err, message, data);
                 callback(req, res, err, message, data);
             } else {
             } else {
@@ -77,7 +77,7 @@ module.exports = {
     },
     },
     rename: function (req, res) {
     rename: function (req, res) {
         let data = JSON.parse(req.body.data);
         let data = JSON.parse(req.body.data);
-        ProjectsData.rename(req.session.sessionUser.ssoId, data, function (err, message) {
+        ProjectsData.rename(req.session.sessionUser.ssoId, req.session.sessionCompilation._id, data, function (err, message) {
             callback(req, res, err, message, null);
             callback(req, res, err, message, null);
         });
         });
     },
     },
@@ -135,7 +135,7 @@ module.exports = {
         let renderData = {
         let renderData = {
             userAccount: request.session.userAccount,
             userAccount: request.session.userAccount,
             userID: request.session.sessionUser.ssoId,
             userID: request.session.sessionUser.ssoId,
-            compilationData: sessionCompilation,
+            compilationData: JSON.stringify(sessionCompilation),
             billValuation: JSON.stringify(billValuation),
             billValuation: JSON.stringify(billValuation),
             rationValuation: JSON.stringify(rationValuation),
             rationValuation: JSON.stringify(rationValuation),
             engineeringList: JSON.stringify(engineering.List)
             engineeringList: JSON.stringify(engineering.List)
@@ -202,6 +202,7 @@ module.exports = {
 
 
     getGCDatas: async function(request, response) {
     getGCDatas: async function(request, response) {
         let userID = request.session.sessionUser.ssoId;
         let userID = request.session.sessionUser.ssoId;
+        let compilatoinId = req.session.sessionCompilation._id;
         let rst = [];
         let rst = [];
         let _projs = Object.create(null), _engs = Object.create(null), prefix = 'ID_';
         let _projs = Object.create(null), _engs = Object.create(null), prefix = 'ID_';
         try{
         try{
@@ -212,7 +213,7 @@ module.exports = {
                 let gc_uf = gc_unitPriceFiles[i];
                 let gc_uf = gc_unitPriceFiles[i];
                 let theProj = _projs[prefix + gc_uf.root_project_id] || null;
                 let theProj = _projs[prefix + gc_uf.root_project_id] || null;
                 if(!theProj){
                 if(!theProj){
-                    let tempProj = await ProjectsData.getProjectsByIds([gc_uf.root_project_id]);
+                    let tempProj = await ProjectsData.getProjectsByIds(userID, compilatoinId, [gc_uf.root_project_id]);
                     if(tempProj.length > 0 && tempProj[0].projType !== projType.folder){
                     if(tempProj.length > 0 && tempProj[0].projType !== projType.folder){
                         theProj = _projs[prefix + gc_uf.root_project_id] = tempProj[0]._doc;
                         theProj = _projs[prefix + gc_uf.root_project_id] = tempProj[0]._doc;
                         buildProj(theProj);
                         buildProj(theProj);
@@ -226,7 +227,7 @@ module.exports = {
                 let gc_ff = gc_feeRateFiles[i];
                 let gc_ff = gc_feeRateFiles[i];
                 let theProj = _projs[prefix + gc_ff.rootProjectID] || null;
                 let theProj = _projs[prefix + gc_ff.rootProjectID] || null;
                 if(!theProj){
                 if(!theProj){
-                    let tempProj = await ProjectsData.getProjectsByIds([gc_ff.rootProjectID]);
+                    let tempProj = await ProjectsData.getProjectsByIds(userID, compilatoinId, [gc_ff.rootProjectID]);
                     if(tempProj.length > 0 && tempProj[0].projType !== projType.folder){
                     if(tempProj.length > 0 && tempProj[0].projType !== projType.folder){
                         theProj = _projs[prefix + gc_ff.rootProjectID] = tempProj[0]._doc;
                         theProj = _projs[prefix + gc_ff.rootProjectID] = tempProj[0]._doc;
                         buildProj(theProj);
                         buildProj(theProj);
@@ -241,7 +242,7 @@ module.exports = {
                     let gc_t = gc_tenderFiles[i];
                     let gc_t = gc_tenderFiles[i];
                     let theEng = _engs[prefix + gc_t.ParentID] || null;
                     let theEng = _engs[prefix + gc_t.ParentID] || null;
                     if(!theEng){
                     if(!theEng){
-                        let tempEngs = await ProjectsData.getProjectsByIds([gc_t.ParentID]);
+                        let tempEngs = await ProjectsData.getProjectsByIds(userID, compilatoinId, [gc_t.ParentID]);
                         if(tempEngs.length > 0 && tempEngs[0].projType === projType.engineering){
                         if(tempEngs.length > 0 && tempEngs[0].projType === projType.engineering){
                             theEng = _engs[prefix + gc_t.ParentID] = tempEngs[0]._doc;
                             theEng = _engs[prefix + gc_t.ParentID] = tempEngs[0]._doc;
                             theEng.children = [];
                             theEng.children = [];
@@ -251,7 +252,7 @@ module.exports = {
                         theEng.children.push(gc_t);
                         theEng.children.push(gc_t);
                         let theProj = _projs[prefix + theEng.ParentID] || null;
                         let theProj = _projs[prefix + theEng.ParentID] || null;
                         if(!theProj){
                         if(!theProj){
-                            let tempProj = await ProjectsData.getProjectsByIds([theEng.ParentID]);
+                            let tempProj = await ProjectsData.getProjectsByIds(userID, compilatoinId, [theEng.ParentID]);
                             if(tempProj.length > 0 && tempProj[0].projType === projType.project){
                             if(tempProj.length > 0 && tempProj[0].projType === projType.project){
                                 theProj = _projs[prefix + theEng.ParentID] = tempProj[0]._doc;
                                 theProj = _projs[prefix + theEng.ParentID] = tempProj[0]._doc;
                                 buildProj(theProj);
                                 buildProj(theProj);

+ 11 - 11
modules/pm/models/project_model.js

@@ -30,8 +30,8 @@ let fileType = {
 
 
 let ProjectsDAO = function(){};
 let ProjectsDAO = function(){};
 
 
-ProjectsDAO.prototype.getUserProjects = function(userId, callback){
-    Projects.find({'$or': [{'userID': userId, 'deleteInfo': null}, {'userID': userId, 'deleteInfo.deleted': {'$in': [null, false]}}]}, '-_id', function(err, templates){
+ProjectsDAO.prototype.getUserProjects = function(userId, compilation, callback){
+    Projects.find({'$or': [{'userID': userId, 'compilation': compilation, 'deleteInfo': null}, {'userID': userId, 'compilation': compilation, 'deleteInfo.deleted': {'$in': [null, false]}}]}, '-_id', function(err, templates){
         if (err) {
         if (err) {
             callback(1, 'Error', null);
             callback(1, 'Error', null);
         } else {
         } else {
@@ -50,7 +50,7 @@ ProjectsDAO.prototype.getUserProject = function (userId, ProjId, callback) {
     });
     });
 }
 }
 
 
-ProjectsDAO.prototype.updateUserProjects = async function(userId, 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){
             if (!err){
@@ -74,6 +74,7 @@ ProjectsDAO.prototype.updateUserProjects = async function(userId, datas, callbac
                 Projects.update({userID: userId, ID: data.updateData.ID}, data.updateData, updateAll);
                 Projects.update({userID: userId, ID: data.updateData.ID}, data.updateData, updateAll);
             } else if (data.updateType === 'new') {
             } else if (data.updateType === 'new') {
                 data.updateData['userID'] = userId;
                 data.updateData['userID'] = userId;
+                data.updateData['compilation'] = compilationId;
                 data.updateData['createDateTime'] = new Date();
                 data.updateData['createDateTime'] = new Date();
                 // 如果没有选中单价文件则新增单价文件
                 // 如果没有选中单价文件则新增单价文件
                 if (data.updateData.projType === projectType.tender && data.updateData.property !== null &&
                 if (data.updateData.projType === projectType.tender && data.updateData.property !== null &&
@@ -112,7 +113,7 @@ ProjectsDAO.prototype.updateUserProjects = async function(userId, datas, callbac
                 }
                 }
                 newProject = new Projects(data.updateData);
                 newProject = new Projects(data.updateData);
                 // 查找同级是否存在同名数据
                 // 查找同级是否存在同名数据
-                let exist = await this.isExist(data.updateData.name, data.updateData.ParentID);
+                let exist = await this.isExist(userId, compilationId, data.updateData.name, data.updateData.ParentID);
                 if (exist) {
                 if (exist) {
                     callback(1, '同级目录已存在相同名称数据.', null);
                     callback(1, '同级目录已存在相同名称数据.', null);
                     return;
                     return;
@@ -270,7 +271,7 @@ ProjectsDAO.prototype.copyUserProjects = function (userId, datas, callback) {
     }
     }
 };
 };
 
 
-ProjectsDAO.prototype.rename = async function (userId, 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 '数据错误!';
@@ -280,7 +281,7 @@ ProjectsDAO.prototype.rename = async function (userId, data, callback){
         }
         }
         data.newName = data.newName.trim();
         data.newName = data.newName.trim();
         // 查找同级是否存在同名数据
         // 查找同级是否存在同名数据
-        let exist = await this.isExist(data.newName, data.parentID);
+        let exist = await this.isExist(userId, compilationId, data.newName, data.parentID);
         if (exist) {
         if (exist) {
             throw '同级目录已存在相同名称数据';
             throw '同级目录已存在相同名称数据';
         }
         }
@@ -333,8 +334,8 @@ ProjectsDAO.prototype.getProject = function (key, callback) {
     }
     }
 };
 };
 
 
-ProjectsDAO.prototype.getProjectsByIds = async function (ids){
-    return await Projects.find({ID: {$in: ids}});
+ProjectsDAO.prototype.getProjectsByIds = async function (userId, compilationId, 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){
@@ -470,12 +471,12 @@ ProjectsDAO.prototype.recGC = async function(userID, datas, callback){
  * @param {Object} data
  * @param {Object} data
  * @return {Boolean}
  * @return {Boolean}
  */
  */
-ProjectsDAO.prototype.isExist = async function(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 = {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;
 };
 };
@@ -583,7 +584,6 @@ ProjectsDAO.prototype.changeUnitPriceFileInfo = async function(projectId, change
     return result.ok === 1;
     return result.ok === 1;
 };
 };
 
 
-
 module.exports ={
 module.exports ={
     project: new ProjectsDAO(),
     project: new ProjectsDAO(),
     projType: projectType,
     projType: projectType,

+ 1 - 0
modules/pm/models/project_schema.js

@@ -16,6 +16,7 @@ let ProjectSchema = new Schema({
     "projType": String,
     "projType": String,
     "recentDateTime": Date,
     "recentDateTime": Date,
     "createDateTime": Date,
     "createDateTime": Date,
+    "compilation": String,
     "deleteInfo": deleteSchema,
     "deleteInfo": deleteSchema,
     'fullFolder': Array,
     'fullFolder': Array,
     "property": {
     "property": {

+ 13 - 0
public/web/tree_sheet/tree_sheet_controller.js

@@ -54,6 +54,19 @@ var TREE_SHEET_CONTROLLER = {
                 }
                 }
             }
             }
         };
         };
+        controller.prototype.deleteNode = function (node,next) {
+            var that = this;
+            if (node){
+                var row = node.serialNo();
+                if (this.tree.delete(node)) {
+                    TREE_SHEET_HELPER.massOperationSheet(this.sheet, function () {
+                        that.sheet.deleteRows(row,1);
+                        next?that.setTreeSelected(that.tree.items[row]):"";
+                    });
+                }
+            }
+
+        };
         controller.prototype.upLevel = function () {
         controller.prototype.upLevel = function () {
             var that = this;
             var that = this;
             if (this.tree.selected) {
             if (this.tree.selected) {

+ 4 - 2
web/building_saas/complementary_glj_lib/js/glj.js

@@ -493,7 +493,7 @@ let repositoryGljObj = {
                 }
                 }
             }
             }
         }
         }
-        if(me.gljCurTypeId !== 732){
+        if(!me.parentNodeIds["_pNodeId_" + me.gljCurTypeId]){
             rObj.gljClass = me.gljCurTypeId;
             rObj.gljClass = me.gljCurTypeId;
         }
         }
         if(updateArr.length >0 || addArr.length >0){
         if(updateArr.length >0 || addArr.length >0){
@@ -741,7 +741,9 @@ let repositoryGljObj = {
 
 
         }
         }
         pasteObj.basePrice = !isNaN(parseFloat(pasteObj.basePrice)) && (pasteObj.basePrice && typeof pasteObj.basePrice !== 'undefined') ? parseFloat(pasteObj.basePrice) : 0;
         pasteObj.basePrice = !isNaN(parseFloat(pasteObj.basePrice)) && (pasteObj.basePrice && typeof pasteObj.basePrice !== 'undefined') ? parseFloat(pasteObj.basePrice) : 0;
-        pasteObj.gljClass = me.gljCurTypeId;
+        if(!me.parentNodeIds["_pNodeId_" + me.gljCurTypeId]){
+            pasteObj.gljClass = me.gljCurTypeId;
+        }
         return true;
         return true;
     },
     },
     canPasted: function (info) {
     canPasted: function (info) {

+ 12 - 1
web/building_saas/glj/js/project_glj.js

@@ -229,6 +229,7 @@ function init() {
             // 赋值
             // 赋值
             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);
             mixRatioConnectData = data.mixRatioConnectData !== undefined ? data.mixRatioConnectData : mixRatioConnectData;
             mixRatioConnectData = data.mixRatioConnectData !== undefined ? data.mixRatioConnectData : mixRatioConnectData;
             mixRatioMap = data.mixRatioMap !== undefined ? data.mixRatioMap : mixRatioMap;
             mixRatioMap = data.mixRatioMap !== undefined ? data.mixRatioMap : mixRatioMap;
             host = data.constData.hostname !== undefined ? data.constData.hostname : '';
             host = data.constData.hostname !== undefined ? data.constData.hostname : '';
@@ -341,7 +342,9 @@ function successTrigger(field, info) {
             break;
             break;
     }
     }
     // 重新加载数据到缓存
     // 重新加载数据到缓存
-    projectObj.project.projectGLJ.loadData();
+    projectObj.project.projectGLJ.loadData(function () {
+        projectObj.project.projectGLJ.loadCacheData();
+    });
 
 
     // 更新定额工料机
     // 更新定额工料机
     gljOprObj.refreshView();
     gljOprObj.refreshView();
@@ -387,3 +390,11 @@ function filterProjectGLJ(jsonData) {
     return jsonData;
     return jsonData;
 }
 }
 
 
+function sortProjectGLJ(jsonData) {
+    if (jsonData.length > 0){
+        jsonData = _.sortByAll(jsonData,[function (item) {
+            return item.unit_price.type+"";
+        },'code']);
+    }
+    return jsonData
+}

+ 3 - 2
web/building_saas/glj/js/project_glj_spread.js

@@ -356,10 +356,11 @@ ProjectGLJSpread.prototype.compositionCalculate = function(row) {
                 continue;
                 continue;
             }
             }
             let rowConsumption = consumption[index] === undefined ? 0 : consumption[index];
             let rowConsumption = consumption[index] === undefined ? 0 : consumption[index];
+            let decimal = getDecimal("glj.unitPrice");
             // 计算价格
             // 计算价格
-            let rowMarketPrice = (marketPrice * rowConsumption).toDecimal(2);
+            let rowMarketPrice = (marketPrice * rowConsumption).toDecimal(decimal);
             parentMarketPrice[active] = parentMarketPrice[active] === undefined ?
             parentMarketPrice[active] = parentMarketPrice[active] === undefined ?
-                rowMarketPrice : (parentMarketPrice[active] + rowMarketPrice).toDecimal(2);
+                rowMarketPrice : (parentMarketPrice[active] + rowMarketPrice).toDecimal(decimal);
 
 
         }
         }
 
 

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

@@ -163,7 +163,7 @@
                                               </p>
                                               </p>
                                               <p>
                                               <p>
                                                   <label class="title">子目生成方式:</label>
                                                   <label class="title">子目生成方式:</label>
-                                                  <select id="child-display-format">
+                                                  <select id="child-display-format" disabled="disabled">
                                                       <option value="1" selected="selected">编号+定额名称</option>
                                                       <option value="1" selected="selected">编号+定额名称</option>
                                                       <option value="2">序号+定额名称</option>
                                                       <option value="2">序号+定额名称</option>
                                                   </select>
                                                   </select>

+ 7 - 0
web/building_saas/main/js/controllers/project_controller.js

@@ -14,6 +14,13 @@ ProjectController = {
             sc.sheet.showRow(newNode.serialNo(), GC.Spread.Sheets.VerticalPosition.center);
             sc.sheet.showRow(newNode.serialNo(), GC.Spread.Sheets.VerticalPosition.center);
         });
         });
     },
     },
+    syncDisplayNewRationGljNode:function (sc,newNode) {
+        TREE_SHEET_HELPER.massOperationSheet(sc.sheet, function () {
+            sc.sheet.addRows(newNode.serialNo(), 1);
+            TREE_SHEET_HELPER.refreshTreeNodeData(sc.setting, sc.sheet, [newNode], false);
+            sc.sheet.showRow(newNode.serialNo(), GC.Spread.Sheets.VerticalPosition.center);
+        });
+    },
     addBills: function (project, sheetController, std) {
     addBills: function (project, sheetController, std) {
         if (!project || !sheetController) { return null; }
         if (!project || !sheetController) { return null; }
 
 

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

@@ -34,7 +34,7 @@ const gljType = {
     COMMERCIAL_MORTAR: 206,
     COMMERCIAL_MORTAR: 206,
     // ==============材料类型=================
     // ==============材料类型=================
     // ==============机械类型=================
     // ==============机械类型=================
-    // 普通机械
+    // 机械台班
     GENERAL_MACHINE: 301,
     GENERAL_MACHINE: 301,
     // 机械组成物
     // 机械组成物
     MACHINE_COMPOSITION: 302,
     MACHINE_COMPOSITION: 302,

+ 16 - 0
web/building_saas/main/js/models/project_glj.js

@@ -140,6 +140,7 @@ ProjectGLJ.prototype.loadCacheData = function() {
     }
     }
     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);
     projectGLJSheet.setData(jsonData);
     projectGLJSheet.setData(jsonData);
     projectGLJSpread.specialColumn(jsonData);
     projectGLJSpread.specialColumn(jsonData);
 };
 };
@@ -170,6 +171,8 @@ ProjectGLJ.prototype.updateBasePriceFromRG=function(recode,updateField,newval){
             me.refreshProjectGLJPrice(data);
             me.refreshProjectGLJPrice(data);
             me.refreshRationGLJPrice(glj);
             me.refreshRationGLJPrice(glj);
             gljOprObj.showRationGLJSheetData();
             gljOprObj.showRationGLJSheetData();
+            me.refreshTreeNodePriceIfNeed(glj);
+            
             $.bootstrapLoading.end();
             $.bootstrapLoading.end();
         }
         }
         $.bootstrapLoading.start();
         $.bootstrapLoading.start();
@@ -180,6 +183,18 @@ ProjectGLJ.prototype.updateBasePriceFromRG=function(recode,updateField,newval){
         gljOprObj.showRationGLJSheetData();
         gljOprObj.showRationGLJSheetData();
     }
     }
 }
 }
+ProjectGLJ.prototype.refreshTreeNodePriceIfNeed = function (data) {
+    if((data.unit_price.type = gljType.MAIN_MATERIAL||data.type==gljType.EQUIPMENT)&&projectInfoObj.projectInfo.property.displaySetting.disPlayMainMateria==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;
+            }
+        })
+        projectObj.mainController.refreshTreeNode(nodes);
+
+    }
+}
 
 
 ProjectGLJ.prototype.refreshRationGLJPrice=function (glj) {
 ProjectGLJ.prototype.refreshRationGLJPrice=function (glj) {
     for(let ration_glj of gljOprObj.sheetData){
     for(let ration_glj of gljOprObj.sheetData){
@@ -209,6 +224,7 @@ ProjectGLJ.prototype.refreshProjectGLJPrice=function(data){
                 glj.unit_price.market_price = d.market_price;
                 glj.unit_price.market_price = d.market_price;
                 this.setAdjustPrice(glj);
                 this.setAdjustPrice(glj);
                 this.refreshRationGLJPrice(glj);
                 this.refreshRationGLJPrice(glj);
+                this.refreshTreeNodePriceIfNeed(glj);
             }
             }
         }
         }
     }
     }

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

@@ -86,34 +86,36 @@ var ration_glj = {
 
 
         // 提交数据后返回数据处理
         // 提交数据后返回数据处理
         ration_glj.prototype.doAfterUpdate = function(err, data){
         ration_glj.prototype.doAfterUpdate = function(err, data){
+            var me = this;
             if(!err){
             if(!err){
                 if(data.updateTpye=='ut_update'){
                 if(data.updateTpye=='ut_update'){
-                    this.refreshAfterUpdate(data);
+                    me.refreshAfterUpdate(data);
                 }else if(data.updateTpye=='ut_delete'){
                 }else if(data.updateTpye=='ut_delete'){
-                    this.refreshAfterDelete(data);
+                    me.refreshAfterDelete(data);
                 } else {
                 } else {
-                    this.refreshAfterSave(data);
+                    me.refreshAfterSave(data);
                 }
                 }
-                projectObj.project.projectGLJ.loadData();
             }
             }
+            projectObj.project.projectGLJ.loadData();
         };
         };
         ration_glj.prototype.refreshAfterSave=function(data){
         ration_glj.prototype.refreshAfterSave=function(data){
+            let me = projectObj.project.ration_glj;
             let neRecodes=[];
             let neRecodes=[];
             if(data){
             if(data){
                // neRecodes=data.newRecords;//原来是显示和缓存分开的,后来发现会导致数据不一致的问题所以改成统一的了,这里也只是会作为显示。
                // neRecodes=data.newRecords;//原来是显示和缓存分开的,后来发现会导致数据不一致的问题所以改成统一的了,这里也只是会作为显示。
                 neRecodes = data.showDatas;
                 neRecodes = data.showDatas;
                 gljOprObj.sheetData=neRecodes;
                 gljOprObj.sheetData=neRecodes;
             }
             }
-            if(projectObj.project.ration_glj.datas&&Array.isArray(projectObj.project.ration_glj.datas)){
+            if(me.datas&&Array.isArray(me.datas)){
                 if(data){
                 if(data){
-                    projectObj.project.ration_glj.datas = projectObj.project.ration_glj.datas.concat(neRecodes);
+                    me.datas = me.datas.concat(neRecodes);
                 }
                 }
             }else {
             }else {
-                projectObj.project.ration_glj.datas = neRecodes;
+                me.datas = neRecodes;
             }
             }
             gljOprObj.showRationGLJSheetData(true);
             gljOprObj.showRationGLJSheetData(true);
             //add to mainTree;
             //add to mainTree;
-
+            me.addToMainTree(neRecodes);
             let node = project.mainTree.selected;
             let node = project.mainTree.selected;
             project.calcProgram.calculate(node);
             project.calcProgram.calculate(node);
             project.calcProgram.saveNode(node);
             project.calcProgram.saveNode(node);
@@ -121,6 +123,33 @@ var ration_glj = {
                 calcProgramObj.showData(node, false);
                 calcProgramObj.showData(node, false);
             };
             };
         };
         };
+        ration_glj.prototype.addToMainTree = function (datas) {
+            datas = sortRationGLJ(datas);
+            for(let data of datas){
+                if(this.needShowToTree(data)){
+                    this.transferToNodeData(data);
+                    let parentNode = _.find(projectObj.project.mainTree.items,function (n) {//找父节点
+                        return n.sourceType==ModuleNames.ration &&n.data.ID==data.rationID;
+                    });
+                    if(parentNode){
+                        let nextNodeID=null;
+                        if(parentNode.children.length>0){
+                            for(let br of parentNode.children){
+                                if(compareRationGLJ(data,br.data)){//如果有兄弟节点则找到添加位置。
+                                    nextNodeID = br.getID();
+                                }
+                            }
+                        }
+                        nextNodeID = nextNodeID?nextNodeID:parentNode.tree.rootID();
+                        let newNode = projectObj.project.mainTree.insert(parentNode.getID(),nextNodeID);
+                        newNode.source = data;
+                        newNode.sourceType = this.getSourceType();
+                        newNode.data = data;
+                        ProjectController.syncDisplayNewRationGljNode(projectObj.mainController,newNode);
+                    }
+                }
+            }
+        };
         ration_glj.prototype.refreshAfterUpdate=function(data){
         ration_glj.prototype.refreshAfterUpdate=function(data){
             var me = this;
             var me = this;
             if(data.quantityRefresh){
             if(data.quantityRefresh){
@@ -147,13 +176,29 @@ var ration_glj = {
         };
         };
         ration_glj.prototype.refreshAfterDelete=function(data){
         ration_glj.prototype.refreshAfterDelete=function(data){
             var glj_list = projectObj.project.ration_glj.datas;
             var glj_list = projectObj.project.ration_glj.datas;
-            _.remove(glj_list,data.query);
+            var oldData = _.remove(glj_list,data.query);
             _.remove(gljOprObj.sheetData,data.query);
             _.remove(gljOprObj.sheetData,data.query);
             gljOprObj.showRationGLJSheetData();
             gljOprObj.showRationGLJSheetData();
             projectObj.project.projectGLJ.loadData();
             projectObj.project.projectGLJ.loadData();
+            var rationNode = null;
+            var next = null;
             var selected = projectObj.project.mainTree.selected;
             var selected = projectObj.project.mainTree.selected;
-            selected.data.adjustState=data.adjustState;
-            projectObj.mainController.refreshTreeNode([selected]);
+            if(selected.sourceType==ModuleNames.ration){ //如果选中的是定额,说明是右键删除工料机操作,如果选中的是定额工料机,则说明是在造价书主界面中点击了删除按钮
+                rationNode= selected;
+            }else if(selected.sourceType==ModuleNames.ration_glj){
+                rationNode = selected.parent;
+                next = true;
+            }
+            rationNode.data.adjustState=data.adjustState;
+            projectObj.mainController.refreshTreeNode([rationNode]);
+            for(let o of oldData){
+                if(this.needShowToTree(o)){
+                    let node = _.find(projectObj.project.mainTree.items,function (n) {//找到对应的树节点
+                        return n.sourceType==ModuleNames.ration_glj &&n.data.ID==o.ID;
+                    });
+                    projectObj.mainController.deleteNode(node,next);
+                }
+            }
         };
         };
         // CSL,2017.05.09
         // CSL,2017.05.09
         ration_glj.prototype.modifyQuantity = function (data, newQuantity) {
         ration_glj.prototype.modifyQuantity = function (data, newQuantity) {
@@ -286,20 +331,25 @@ var ration_glj = {
             var callback=function (data) {
             var callback=function (data) {
                 let initShow = false;//是否需要表格初始化显示
                 let initShow = false;//是否需要表格初始化显示
                 if(updateField=='customQuantity'){
                 if(updateField=='customQuantity'){
-                    console.log(data);
                     me.refreshAfterQuantityUpdate(data,node);
                     me.refreshAfterQuantityUpdate(data,node);
                 }else {
                 }else {
                     var doc = data.doc;
                     var doc = data.doc;
                     for(var key in doc){
                     for(var key in doc){
                         recode[key] = doc[key];
                         recode[key] = doc[key];
                     }
                     }
-                    console.log(data);
                     if(data.hasOwnProperty('adjustState')){//更新定额调整状态
                     if(data.hasOwnProperty('adjustState')){//更新定额调整状态
                         me.updateRationAdjustState(data.adjustState,recode.rationID,node);
                         me.updateRationAdjustState(data.adjustState,recode.rationID,node);
                     }
                     }
                     if(recode.subList&&recode.subList.length>0){
                     if(recode.subList&&recode.subList.length>0){
                         initShow = true;
                         initShow = true;
                     }
                     }
+                    if(node){//如果不是在造价书页面直接编辑,则不用刷新
+                        if(updateField=="type"&&!(newval == gljType.MAIN_MATERIAL||newval==gljType.EQUIPMENT)){//如果改变类型后不是主材或设备,则在造价书树中移除
+                            projectObj.mainController.deleteNode(node,true);
+                        }else {
+                            me.refreshTreeNodeIfNeeded(recode);
+                        }
+                    }
                 }
                 }
                 if(initShow==false){//不需要初始化,只需耍新当前显示就可以了
                 if(initShow==false){//不需要初始化,只需耍新当前显示就可以了
                     gljOprObj.showRationGLJSheetData();
                     gljOprObj.showRationGLJSheetData();
@@ -343,7 +393,7 @@ var ration_glj = {
             })
             })
             if(node){
             if(node){
                 node.data.adjustState=adjustState;
                 node.data.adjustState=adjustState;
-                nodes.push(node)
+                nodes.push(node);
             }
             }
             if(rnode){
             if(rnode){
                 nodes.push(rnode);
                 nodes.push(rnode);
@@ -382,7 +432,7 @@ var ration_glj = {
               }
               }
               if(glj.hasOwnProperty("compilationId")){
               if(glj.hasOwnProperty("compilationId")){
                   ration_glj.from="cpt";
                   ration_glj.from="cpt";
-                  if(glj.code.indexOf('-')!=-1){//这条工料机是用户通过修改称、规格、型号等保存到补充工料机库的
+                  if(glj.code.indexOf('-')!=-1){//这条工料机是用户通过修改称、规格、型号等保存到补充工料机库的
                       ration_glj.original_code = glj.code.split('-')[0];//取-前的编号作为原始编号
                       ration_glj.original_code = glj.code.split('-')[0];//取-前的编号作为原始编号
                   }
                   }
               }
               }
@@ -480,6 +530,7 @@ var ration_glj = {
            var gljList = _.filter(this.datas,function (n) {
            var gljList = _.filter(this.datas,function (n) {
               return n.rationID == rationID&&(n.type==gljType.MAIN_MATERIAL||n.type==gljType.EQUIPMENT)
               return n.rationID == rationID&&(n.type==gljType.MAIN_MATERIAL||n.type==gljType.EQUIPMENT)
            });
            });
+           gljList = sortRationGLJ(gljList);
            return gljOprObj.combineWithProjectGlj(gljList);
            return gljOprObj.combineWithProjectGlj(gljList);
         };
         };
         ration_glj.prototype.transferToNodeData = function (data) {
         ration_glj.prototype.transferToNodeData = function (data) {
@@ -493,7 +544,13 @@ var ration_glj = {
                 return;
                 return;
             }
             }
             if(fieldName=="marketUnitFee"){
             if(fieldName=="marketUnitFee"){
-
+                var decimal =getDecimal("glj.unitPrice");
+                var newval = number_util.checkNumberValue(value,decimal);
+                if(newval){
+                    fieldName="marketPrice";
+                    projectObj.project.projectGLJ.updatePriceFromRG(node.data,fieldName,newval);
+                    return;
+                }
             }else {
             }else {
                 if(value!==undefined&&value!==null){
                 if(value!==undefined&&value!==null){
                     if(fieldName=="subType"){
                     if(fieldName=="subType"){
@@ -507,6 +564,19 @@ var ration_glj = {
            // node.data.subType = value;
            // node.data.subType = value;
             projectObj.mainController.refreshTreeNode([node]);
             projectObj.mainController.refreshTreeNode([node]);
         };
         };
+        ration_glj.prototype.refreshTreeNodeIfNeeded=function (data) {
+            if(this.needShowToTree(data)){
+                this.transferToNodeData(data);
+                gljOprObj.refreshTreeNode({"type":ModuleNames.ration_glj,"ID":data.ID});
+            }
+        };
+
+        ration_glj.prototype.needShowToTree=function(data){
+            if((data.type == gljType.MAIN_MATERIAL||data.type==gljType.EQUIPMENT)&&projectInfoObj.projectInfo.property.displaySetting.disPlayMainMateria==true){
+                return true
+            }
+            return false
+        }
         return new ration_glj(project);
         return new ration_glj(project);
     }
     }
 };
 };

+ 51 - 13
web/building_saas/main/js/views/character_content_view.js

@@ -753,20 +753,23 @@ let pageCCOprObj = {
         });
         });
     },
     },
     /**
     /**
-     * 根据配置转换清单项目特征
+     * 根据配置设置清单项目特征
      *
      *
      * @param {Object} node - 选中的node节点
      * @param {Object} node - 选中的node节点
      * @param {Object} setting - 设置
      * @param {Object} setting - 设置
      * @return {void}
      * @return {void}
      */
      */
-    buildCharacterBySetting: function(node, setting) {
+    setCharacterBySetting: function(node, setting) {
         let contentArray = [];
         let contentArray = [];
         // 特征部分
         // 特征部分
         const itemCharacter = node.data.itemCharacter;
         const itemCharacter = node.data.itemCharacter;
+        // 内容数据
+        const itemJob = node.data.jobContent;
 
 
-        if (itemCharacter === undefined || itemCharacter.length <= 0) {
+        if (itemCharacter === undefined || itemCharacter.length <= 0 || itemJob === undefined || itemJob.length <= 0) {
             return;
             return;
         }
         }
+
         let characterArray = [];
         let characterArray = [];
         for (const tmp of itemCharacter) {
         for (const tmp of itemCharacter) {
             if (tmp.eigenvalue === undefined || tmp.eigenvalue.length <= 0) {
             if (tmp.eigenvalue === undefined || tmp.eigenvalue.length <= 0) {
@@ -797,10 +800,6 @@ let pageCCOprObj = {
         }
         }
 
 
         // 内容部分
         // 内容部分
-        const itemJob = node.data.jobContent;
-        if (itemJob === undefined || itemJob.length <= 0) {
-            return;
-        }
         let jobArray = [];
         let jobArray = [];
         for (const tmp of itemJob) {
         for (const tmp of itemJob) {
             // 匹配设置的序号格式
             // 匹配设置的序号格式
@@ -827,21 +826,23 @@ let pageCCOprObj = {
                 break;
                 break;
             case "3":
             case "3":
                 // 项目特征
                 // 项目特征
-                contentArray.push(characterArray);
+                contentArray.push.apply(contentArray, characterArray);
                 break;
                 break;
             case "4":
             case "4":
                 // 工作内容
                 // 工作内容
-                contentArray.push(jobArray);
+                contentArray.push.apply(contentArray, jobArray);
                 break;
                 break;
             case "5":
             case "5":
                 // 定额子目
                 // 定额子目
+                const rationChapter = this.getRationChapter(node, setting);
+                contentArray.push.apply(contentArray, rationChapter);
                 break;
                 break;
         }
         }
         // 显示格式
         // 显示格式
         switch (setting.displayFormat) {
         switch (setting.displayFormat) {
             case "1":
             case "1":
                 // 换行分隔
                 // 换行分隔
-                content = contentArray.join('\r\n');
+                content = contentArray.join("\r\n");
                 break;
                 break;
             case "2":
             case "2":
                 // 逗号分隔
                 // 逗号分隔
@@ -853,18 +854,30 @@ let pageCCOprObj = {
                 break;
                 break;
         }
         }
         // 添加到对应位置
         // 添加到对应位置
+        let saveObj = {};
         switch (setting.position) {
         switch (setting.position) {
             case "1":
             case "1":
                 // 添加到项目特征列
                 // 添加到项目特征列
-                node.data.itemCharacterText = content;
+                saveObj = {field: 'itemCharacterText', text: content};
+                // 更新到数据库
+                pageCCOprObj.updateCharacterContent(pageCCOprObj.currentFindSet,
+                    {field: 'itemCharacter', updateArr: itemCharacter}, saveObj, characterOprObj);
                 break;
                 break;
             case "2":
             case "2":
                 // 添加到清单名称列
                 // 添加到清单名称列
-                node.data.name = content;
+                const column = this.mainActiveCell.col !== undefined ? this.mainActiveCell.col : -1;
+                let colSetting = projectObj.mainController.setting.cols[column];
+                if (colSetting !== undefined) {
+                    projectObj.project.Bills.updateField(node.source, 'name', content, true);
+                    projectObj.mainController.refreshTreeNode([node]);
+                }
                 break;
                 break;
             case "3":
             case "3":
                 // 添加到工作内容列
                 // 添加到工作内容列
-                node.data.jobContentText = content;
+                saveObj =  {field: 'jobContentText', text: content};
+                // 更新到数据库
+                pageCCOprObj.updateCharacterContent(pageCCOprObj.currentFindSet,
+                    {field: 'jobContent', updateArr: itemJob}, saveObj, contentOprObj);
                 break;
                 break;
         }
         }
 
 
@@ -895,4 +908,29 @@ let pageCCOprObj = {
         }
         }
         return serialNo;
         return serialNo;
     },
     },
+    /**
+     * 查找选中的树节点中定额子目数据
+     *
+     * @param {Object} selectNode - 选中的节点
+     * @param {Object} setting - 设置
+     * @return {Array} - 返回定额子目数组
+     */
+    getRationChapter: function(selectNode, setting) {
+        let result = [];
+        if (selectNode.children === undefined || selectNode.children.length <= 0) {
+            return result;
+        }
+        // 查找对应的定额数据
+        let count = 1;
+        for (const tmp of selectNode.children) {
+            if (tmp.sourceType !== 'ration') {
+                continue;
+            }
+            const serialNo = this.formatSerialNumber(setting.serialType, count.toString());
+            result.push(serialNo + tmp.data.code + ':' + tmp.data.name);
+            count++;
+        }
+
+        return result;
+    },
 }
 }

+ 27 - 4
web/building_saas/main/js/views/glj_view.js

@@ -559,7 +559,7 @@ var gljOprObj = {
         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); //这个方法导致加载缓慢
-        this.sheetData=_.sortBy(this.sheetData,'type');
+        this.sheetData=sortRationGLJ(this.sheetData);
         this.sumQuantity();//计算总消耗量
         this.sumQuantity();//计算总消耗量
         this.addMixRatioToShow();//显示组成物信息
         this.addMixRatioToShow();//显示组成物信息
         this.initRationTree(init);
         this.initRationTree(init);
@@ -751,7 +751,7 @@ var gljOprObj = {
         var newval;
         var newval;
         if(updateField=='marketPrice'||updateField=='customQuantity'||updateField=='basePrice'){
         if(updateField=='marketPrice'||updateField=='customQuantity'||updateField=='basePrice'){
             if(args.editingText==null){
             if(args.editingText==null){
-                newval="";
+                updateField=='marketPrice'||updateField=='customQuantity'?newval=0:newval="";
             }else {
             }else {
                 var decimal = updateField=='customQuantity'?getDecimal("glj.quantity"):getDecimal("glj.unitPrice");
                 var decimal = updateField=='customQuantity'?getDecimal("glj.quantity"):getDecimal("glj.unitPrice");
                 newval = number_util.checkNumberValue(args.editingText,decimal);
                 newval = number_util.checkNumberValue(args.editingText,decimal);
@@ -954,8 +954,9 @@ var gljOprObj = {
                     selected.data.adjustState=result.adjustState;
                     selected.data.adjustState=result.adjustState;
                     //project.ration_glj.datas = project.ration_glj.datas.concat(result.newRecodes);//显示和缓存统一,这样的话就不用更新两个位置了
                     //project.ration_glj.datas = project.ration_glj.datas.concat(result.newRecodes);//显示和缓存统一,这样的话就不用更新两个位置了
                     project.ration_glj.datas = project.ration_glj.datas.concat(result.showData);
                     project.ration_glj.datas = project.ration_glj.datas.concat(result.showData);
-                    gljOprObj.sheetData = gljOprObj.sheetData.concat(result.showData)
+                    gljOprObj.sheetData = gljOprObj.sheetData.concat(result.showData);
                     gljOprObj.showRationGLJSheetData();
                     gljOprObj.showRationGLJSheetData();
+                    project.ration_glj.addToMainTree(result.showData);
                     project.projectGLJ.loadData();
                     project.projectGLJ.loadData();
                     projectObj.mainController.refreshTreeNode([selected]);
                     projectObj.mainController.refreshTreeNode([selected]);
                     $.bootstrapLoading.end();
                     $.bootstrapLoading.end();
@@ -1053,7 +1054,6 @@ var gljOprObj = {
             nodes.push(node);
             nodes.push(node);
         }
         }
     }
     }
-
     projectObj.mainController.refreshTreeNode(nodes);
     projectObj.mainController.refreshTreeNode(nodes);
 
 
     },
     },
@@ -1162,7 +1162,11 @@ var gljOprObj = {
             }
             }
         };
         };
         return new TreeNodeCellType()
         return new TreeNodeCellType()
+    },
+    marketPriceReadOnly:function(node){
+        return node.data.type==gljType.CONCRETE||node.data.type==gljType.MORTAR||node.data.type==gljType.MIX_RATIO||node.data.type==gljType.GENERAL_MACHINE||node.data.isEstimate==1
     }
     }
+
 }
 }
 
 
 $(function(){
 $(function(){
@@ -1295,4 +1299,23 @@ function getFormatter(decimal) {
         pre += "0"
         pre += "0"
     }
     }
     return pre;
     return pre;
+}
+
+function sortRationGLJ(list) {
+    list= _.sortByAll(list,[function (item) {
+        return item.type+"";
+    },"code"])
+    return list;
+}
+
+function compareRationGLJ(a,b) {
+    if((a.type+"")<(b.type+"")){
+        return true
+    }
+    if((a.type+"")==(b.type+"")){
+        if (a.code<b.code){
+            return true
+        }
+    }
+    return false;
 }
 }

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

@@ -116,14 +116,18 @@ let MainTreeCol = {
         },
         },
         forQuantity:function (node) {
         forQuantity:function (node) {
             return MainTreeCol.readOnly.glj(node)||MainTreeCol.readOnly.billsParent(node)
             return MainTreeCol.readOnly.glj(node)||MainTreeCol.readOnly.billsParent(node)
+        },
+        forMarketPrice:function (node) {
+            return MainTreeCol.readOnly.bills(node)||(MainTreeCol.readOnly.ration(node)&&node.data.type == rationType.ration)||gljOprObj.marketPriceReadOnly(node);
         }
         }
     },
     },
     cellType: {
     cellType: {
         unit: function () {
         unit: function () {
-            let combo = new GC.Spread.Sheets.CellTypes.ComboBox();
-            combo.itemHeight(10).items(['m', 'm2', 'm3', 'km', 't', 'kg', '台班', '工日', '昼夜', '元', '项', '处', '个', '件',
+            //let combo = new GC.Spread.Sheets.CellTypes.ComboBox();
+            let dynamicCombo = sheetCommonObj.getDynamicCombo();
+            dynamicCombo.itemHeight(10).items(['m', 'm2', 'm3', 'km', 't', 'kg', '台班', '工日', '昼夜', '元', '项', '处', '个', '件',
                 '根', '组', '系统', '台', '套', '株', '丛', '缸', '支', '只', '块', '座', '对', '份', '樘', '攒', '榀']);
                 '根', '组', '系统', '台', '套', '株', '丛', '缸', '支', '只', '块', '座', '对', '份', '樘', '攒', '榀']);
-            return combo;
+            return dynamicCombo;
         },
         },
 
 
         units: function () {
         units: function () {

+ 18 - 2
web/building_saas/main/js/views/project_property_bills_quantity_decimal.js

@@ -248,7 +248,7 @@ let billsDecimalView = {
     },
     },
 
 
     isValidDecimal: function (v) {
     isValidDecimal: function (v) {
-        return this.isData(v) && !isNaN(v) && parseInt(v) % 1 === 0 && parseInt(v) >= this.default.min && parseInt(v) <= this.default.max;
+        return this.isData(v) && !isNaN(v) && parseInt(v) == v && parseInt(v) >= this.default.min && parseInt(v) <= this.default.max;
     },
     },
 
 
     hasUnit: function (all, v) {
     hasUnit: function (all, v) {
@@ -260,6 +260,21 @@ let billsDecimalView = {
         return false;
         return false;
     },
     },
 
 
+    copyObj: function(obj){
+        let newObj = {};
+        for(let attr in obj){
+            newObj[attr] = obj[attr];
+        }
+        return newObj;
+    },
+
+    initDatas: function (datas) {
+        this.cache = [];
+        for(let i = 0, len = datas.length; i < len; i++){
+            this.cache.push(this.copyObj(datas[i]));
+        }
+    },
+
     rowHasData: function (sheet, row) {
     rowHasData: function (sheet, row) {
         let v = sheet.getValue(row, 0);
         let v = sheet.getValue(row, 0);
         if(v && v.toString().trim().length > 0) {
         if(v && v.toString().trim().length > 0) {
@@ -317,7 +332,8 @@ $(document).ready(function () {
     $('#poj-set').on('shown.bs.modal', function (e) {
     $('#poj-set').on('shown.bs.modal', function (e) {
         //init Spread
         //init Spread
         if(billsDecimalView.isDef(billsQuanDecimal.datas)){
         if(billsDecimalView.isDef(billsQuanDecimal.datas)){
-            billsDecimalView.cache = billsDecimalView.cache.concat(billsQuanDecimal.datas);
+            //billsDecimalView.cache = billsDecimalView.cache.concat(billsQuanDecimal.datas);
+            billsDecimalView.initDatas(billsQuanDecimal.datas);
         }
         }
         if(billsDecimalView.cache.length === 0){
         if(billsDecimalView.cache.length === 0){
             billsDecimalView.cache.push(billsDecimalView.angleDecimal);
             billsDecimalView.cache.push(billsDecimalView.angleDecimal);

+ 20 - 1
web/building_saas/main/js/views/project_view.js

@@ -335,6 +335,16 @@ var projectObj = {
             projectObj.mainController.refreshTreeNode([node], false);
             projectObj.mainController.refreshTreeNode([node], false);
         }
         }
     },
     },
+    mainSpreadLeaveCell: function (sender, info) {
+        let colSetting = projectObj.mainController.setting.cols[info.col];
+        projectObj.lastCol = colSetting;
+    },
+    mainSpreadEnterCell: function (sender, info) {
+        let colSetting = projectObj.mainController.setting.cols[info.col];
+        if(colSetting.data.field === 'unit' || projectObj.lastCol.data.field === 'unit'){
+            info.sheet.repaint();
+        }
+    },
     mainSpreadEditEnded: function (sender, info) {
     mainSpreadEditEnded: function (sender, info) {
         let project = projectObj.project;
         let project = projectObj.project;
         let node = project.mainTree.items[info.row];
         let node = project.mainTree.items[info.row];
@@ -343,6 +353,12 @@ var projectObj = {
         // 检查输入类型等
         // 检查输入类型等
         let value = projectObj.checkSpreadEditingText(info.editingText, colSetting);
         let value = projectObj.checkSpreadEditingText(info.editingText, colSetting);
         projectObj.updateCellValue(node, value, colSetting);
         projectObj.updateCellValue(node, value, colSetting);
+
+        // 自动行高
+        const autoHeight = project.property.displaySetting.autoHeight;
+        if (autoHeight) {
+            this.mainSpread.getActiveSheet().autoFitRow(info.row);
+        }
     },
     },
     mainSpreadRangeChanged: function (sender, info) {
     mainSpreadRangeChanged: function (sender, info) {
         let project = projectObj.project, setting = projectObj.mainController.setting;
         let project = projectObj.project, setting = projectObj.mainController.setting;
@@ -415,7 +431,6 @@ var projectObj = {
                     if (col.data.field === 'name' || col.data.field === 'itemCharacterText' ||
                     if (col.data.field === 'name' || col.data.field === 'itemCharacterText' ||
                         col.data.field === 'jobContentText' || col.data.field === 'adjustState') {
                         col.data.field === 'jobContentText' || col.data.field === 'adjustState') {
                         if (!autoHeight) {
                         if (!autoHeight) {
-                            col.data.autoFitRow();
                             col.showHint = true;
                             col.showHint = true;
                         } else {
                         } else {
                             col.showHint = false;
                             col.showHint = false;
@@ -437,6 +452,8 @@ var projectObj = {
                 that.mainController.bind(TREE_SHEET_CONTROLLER.eventName.beforeTreeSelectedChange, that.beforeMainTreeSelectedChange);
                 that.mainController.bind(TREE_SHEET_CONTROLLER.eventName.beforeTreeSelectedChange, that.beforeMainTreeSelectedChange);
                 that.mainController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, that.treeSelectedChanged);
                 that.mainController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, that.treeSelectedChanged);
 
 
+                that.mainSpread.bind(GC.Spread.Sheets.Events.LeaveCell, that.mainSpreadLeaveCell);
+                that.mainSpread.bind(GC.Spread.Sheets.Events.EnterCell, that.mainSpreadEnterCell);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.EditEnded, that.mainSpreadEditEnded);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.EditEnded, that.mainSpreadEditEnded);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.RangeChanged, that.mainSpreadRangeChanged);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.RangeChanged, that.mainSpreadRangeChanged);
                 that.loadMainSpreadContextMenu();
                 that.loadMainSpreadContextMenu();
@@ -596,6 +613,8 @@ $('#delete').click(function () {
         } else if (selected.sourceType === project.Ration.getSourceType()) {
         } else if (selected.sourceType === project.Ration.getSourceType()) {
             project.Ration.delete(selected.source);
             project.Ration.delete(selected.source);
             controller.delete();
             controller.delete();
+        }else if(selected.sourceType==ModuleNames.ration_glj){
+            project.ration_glj.updataOrdelete(selected.source);
         };
         };
         projectObj.converseCalculateBills(parent);
         projectObj.converseCalculateBills(parent);
     }
     }

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

@@ -156,6 +156,7 @@ var billsLibObj = {
             showBillsRela(stdBillsTree.firstNode());
             showBillsRela(stdBillsTree.firstNode());
 
 
             stdBillsTreeController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, showBillsRela);
             stdBillsTreeController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, showBillsRela);
+            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];
                 if (stdBillsTree.items[args.row].children.length === 0) {
                 if (stdBillsTree.items[args.row].children.length === 0) {

+ 26 - 4
web/building_saas/main/js/views/sub_view.js

@@ -135,9 +135,7 @@ $("#use-to-current").click(function() {
         displayFormat,
         displayFormat,
     };
     };
     let selectedNode = projectObj.mainController.tree.selected;
     let selectedNode = projectObj.mainController.tree.selected;
-    pageCCOprObj.buildCharacterBySetting(selectedNode, setting);
-    // console.log(changeNode);
-    projectObj.mainController.refreshTreeNode([selectedNode], false);
+    pageCCOprObj.setCharacterBySetting(selectedNode, setting);
 });
 });
 // 添加位置选择
 // 添加位置选择
 $("#add-position").change(function() {
 $("#add-position").change(function() {
@@ -150,7 +148,7 @@ $("#add-position").change(function() {
             // 当“添加位置”是“分别添加到对应列”,则“添加内容”恢复默认“无”,且灰显;“显示格式”恢复默认“换行分隔”,且灰显。
             // 当“添加位置”是“分别添加到对应列”,则“添加内容”恢复默认“无”,且灰显;“显示格式”恢复默认“换行分隔”,且灰显。
             addContentEle.val('');
             addContentEle.val('');
             addContentEle.attr('disabled', 'disabled');
             addContentEle.attr('disabled', 'disabled');
-            displayFormatEle.val(1);
+            displayFormatEle.val(2);
             displayFormatEle.attr('disabled', 'disabled');
             displayFormatEle.attr('disabled', 'disabled');
             console.log('hello');
             console.log('hello');
             break;
             break;
@@ -160,6 +158,30 @@ $("#add-position").change(function() {
             break;
             break;
     }
     }
 });
 });
+// 添加内容选择
+$("#add-content").change(function() {
+    const selected = $(this).children(":selected").val();
+    const characterFormatEle = $("#character-format");
+    const childDisplayFormatEle = $("#child-display-format");
+
+    switch (selected) {
+        case '4':
+            // 当“添加内容”是“定额子目”或“工作内容”,则“特征生成方式”灰显,不需选择;否则有效可选。
+            characterFormatEle.attr('disabled', 'disabled');
+            characterFormatEle.val(2);
+            break;
+        case '5':
+            // 当“添加内容”是“定额子目”或“工作内容”,则“特征生成方式”灰显,不需选择;否则有效可选。
+            characterFormatEle.attr('disabled', 'disabled');
+            characterFormatEle.val(2);
+            // 当“添加内容”是“定额子目”,则“子目生成方式”有效可选;否则灰显,不需选择。
+            childDisplayFormatEle.removeAttr('disabled');
+            break;
+        default:
+            childDisplayFormatEle.attr('disabled', 'disabled');
+            break;
+    }
+});
 
 
 // 子目生成方式选择事件
 // 子目生成方式选择事件
 $("#child-display-format").change(function() {
 $("#child-display-format").change(function() {

+ 3 - 2
web/building_saas/pm/html/project-management.html

@@ -233,7 +233,7 @@
     <div class="modal-dialog" role="document">
     <div class="modal-dialog" role="document">
         <div class="modal-content">
         <div class="modal-content">
             <div class="modal-header">
             <div class="modal-header">
-                <h5 class="modal-title">新建 <i class="fa fa-cubes"></i> 建设项目</h5>
+                <h5 class="modal-title"><i class="fa fa-cubes"></i> 新建建设项目</h5>
                 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                     <span aria-hidden="true">&times;</span>
                     <span aria-hidden="true">&times;</span>
                 </button>
                 </button>
@@ -284,7 +284,7 @@
     <div class="modal-dialog" role="document">
     <div class="modal-dialog" role="document">
         <div class="modal-content">
         <div class="modal-content">
             <div class="modal-header">
             <div class="modal-header">
-                <h5 class="modal-title">新建 <i class="fa fa-sticky-note-o"></i> 单位工程</h5>
+                <h5 class="modal-title"><i class="fa fa-sticky-note-o"></i>新建单位工程</h5>
                 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                     <span aria-hidden="true">&times;</span>
                     <span aria-hidden="true">&times;</span>
                 </button>
                 </button>
@@ -522,5 +522,6 @@
     let billValuation = '<%- billValuation %>';
     let billValuation = '<%- billValuation %>';
     let rationValuation = '<%- rationValuation %>';
     let rationValuation = '<%- rationValuation %>';
     let engineeringList = '<%- engineeringList %>';
     let engineeringList = '<%- engineeringList %>';
+    let compilationData = JSON.parse('<%- compilationData %>');
 </script>
 </script>
 </html>
 </html>

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

@@ -6,7 +6,7 @@ var GetAllProjectData = function (callback) {
     $.ajax({
     $.ajax({
         type:"POST",
         type:"POST",
         url: '/pm/api/getProjects',
         url: '/pm/api/getProjects',
-        data: {'data': JSON.stringify({"user_id": userID})},
+        data: {'data': JSON.stringify({"user_id": userID, "compilation": compilationData._id})},
         dataType: 'json',
         dataType: 'json',
         cache: false,
         cache: false,
         timeout: 50000,
         timeout: 50000,

+ 45 - 17
web/building_saas/pm/js/pm_main.js

@@ -13,7 +13,6 @@ let feeRateData = [];
 let isSaving = false;
 let isSaving = false;
 let projectProperty = [];
 let projectProperty = [];
 let fileDelObj = null;
 let fileDelObj = null;
-let selectedInfo = {project: null, engineering: null};//新建单位工程,建设项目和单项工程下拉选择
 let projectType = {
 let projectType = {
     folder: 'Folder',
     folder: 'Folder',
     tender: 'Tender',
     tender: 'Tender',
@@ -358,10 +357,16 @@ $(document).ready(function() {
 
 
     // 新增单位工程弹层改变
     // 新增单位工程弹层改变
     $('#add-tender-dialog').on('show.bs.modal', function() {
     $('#add-tender-dialog').on('show.bs.modal', function() {
+        //clear info
+        $('#poj-name-info').hide();
+        $('#eng-name-info').hide();
+        $('#tender-name-info').hide();
+        $('#tender-name').val('');
         //获取建设项目
         //获取建设项目
         let selected = Tree.selected();
         let selected = Tree.selected();
         let projs = getProjs(selected);
         let projs = getProjs(selected);
         setProjOptions(projs);
         setProjOptions(projs);
+       $($("input[name='valuation_type']")[0]).click();
     });
     });
 
 
     // 新增单位工程
     // 新增单位工程
@@ -949,24 +954,41 @@ function existName(name , nodes){
 function getProjs(selected){
 function getProjs(selected){
     let rst = [];
     let rst = [];
     let temp;
     let temp;
+    let firstNode;
     if(!selected){
     if(!selected){
         temp = Tree._root.children;
         temp = Tree._root.children;
+        firstNode = temp[0];
     }
     }
     else if(selected.data.projType === projectType.folder){
     else if(selected.data.projType === projectType.folder){
         temp = selected.children;
         temp = selected.children;
+        firstNode = temp[0];
     }
     }
     else if(selected.data.projType === projectType.project){
     else if(selected.data.projType === projectType.project){
         temp = selected.parent.children;
         temp = selected.parent.children;
+        firstNode = temp[0];
     }
     }
     else if(selected.data.projType === projectType.engineering || selected.data.projType === projectType.tender){
     else if(selected.data.projType === projectType.engineering || selected.data.projType === projectType.tender){
         let proj = selected.parent.data.projType === projectType.project ? selected.parent : selected.parent.parent;
         let proj = selected.parent.data.projType === projectType.project ? selected.parent : selected.parent.parent;
         temp = proj.parent.children;
         temp = proj.parent.children;
+        firstNode = proj;
     }
     }
     for(let i = 0, len = temp.length; i < len; i++){
     for(let i = 0, len = temp.length; i < len; i++){
         if(temp[i].data.projType === projectType.project){
         if(temp[i].data.projType === projectType.project){
             rst.push(temp[i]);
             rst.push(temp[i]);
         }
         }
     }
     }
+    //firstNode to first place
+    let index = null;
+    for(let i = 0, len = rst.length; i < len; i++){
+        if(rst[i].data.ID === firstNode.data.ID){
+            index = i;
+            break;
+        }
+    }
+    if(index){
+        rst.splice(index, 1);
+        rst.splice(0, 0, firstNode);
+    }
     return rst;
     return rst;
 }
 }
 
 
@@ -981,6 +1003,7 @@ function setFileOptions(projID){
     }
     }
     else {
     else {
         getUnitFile(projID, function (response) {
         getUnitFile(projID, function (response) {
+            $("#unit-price").children("option:not(':first')").remove();
             if (response.data.length <= 0) {
             if (response.data.length <= 0) {
                 return false;
                 return false;
             }
             }
@@ -988,17 +1011,16 @@ function setFileOptions(projID){
             for(let tmp of response.data) {
             for(let tmp of response.data) {
                 unitFileHtml += '<option value="'+ tmp.id +'">'+ tmp.name +'</option>';
                 unitFileHtml += '<option value="'+ tmp.id +'">'+ tmp.name +'</option>';
             }
             }
-            $("#unit-price").children("option:not(':first')").remove();
             $("#unit-price").children("option").first().after(unitFileHtml);
             $("#unit-price").children("option").first().after(unitFileHtml);
         });
         });
         // 获取费率文件数据
         // 获取费率文件数据
         getFeeRateFile(projID, function (response) {
         getFeeRateFile(projID, function (response) {
-            if (response.data.length <= 0) {
-                return false;
-            }
             let first = $("#tender-fee-rate").children("option").first();
             let first = $("#tender-fee-rate").children("option").first();
             $("#tender-fee-rate").empty();
             $("#tender-fee-rate").empty();
             $("#tender-fee-rate").append(first);
             $("#tender-fee-rate").append(first);
+            if (response.data.length <= 0) {
+                return false;
+            }
             for(let tmp of response.data) {
             for(let tmp of response.data) {
                 let option =  $("<option>").val(tmp.ID).text(tmp.name);
                 let option =  $("<option>").val(tmp.ID).text(tmp.name);
                 $("#tender-fee-rate").append(option);
                 $("#tender-fee-rate").append(option);
@@ -1011,12 +1033,8 @@ function setFileOptions(projID){
 function setProjOptions(projs){
 function setProjOptions(projs){
     $("#poj-name-list").empty();
     $("#poj-name-list").empty();
     $("#poj-name").val("");
     $("#poj-name").val("");
-    selectedInfo.project = null;
     if(projs.length > 0){
     if(projs.length > 0){
         $("#poj-name").val(projs[0].data.name);
         $("#poj-name").val(projs[0].data.name);
-        selectedInfo.project = Object.create(null);
-        selectedInfo.project.ID = projs[0].data.ID;
-        selectedInfo.project.name = projs[0].data.name;
         setFileOptions(projs[0].data.ID);
         setFileOptions(projs[0].data.ID);
         setEngOptions(projs[0].data.ID);
         setEngOptions(projs[0].data.ID);
         for(let i = 0, len = projs.length; i < len; i++){
         for(let i = 0, len = projs.length; i < len; i++){
@@ -1024,8 +1042,6 @@ function setProjOptions(projs){
             proj.addClass("dropdown-item");
             proj.addClass("dropdown-item");
             proj.attr("type", "button");
             proj.attr("type", "button");
             proj.click(function () {
             proj.click(function () {
-                selectedInfo.project.ID = projs[i].data.ID;
-                selectedInfo.project.name = projs[i].data.name;
                 $("#poj-name").val(projs[i].data.name);
                 $("#poj-name").val(projs[i].data.name);
                 setFileOptions(projs[i].data.ID);
                 setFileOptions(projs[i].data.ID);
                 setEngOptions(projs[i].data.ID);
                 setEngOptions(projs[i].data.ID);
@@ -1043,21 +1059,33 @@ function setEngOptions(projID){
     let proj = Tree.findNode(projID) || null;
     let proj = Tree.findNode(projID) || null;
     $("#eng-name-list").empty();
     $("#eng-name-list").empty();
     $("#eng-name").val("");
     $("#eng-name").val("");
-    selectedInfo.engineering = null;
     if(proj){
     if(proj){
         let engineerings = proj.children;
         let engineerings = proj.children;
+        //set selected engineering to first place
+        let selected = Tree.selected();
+        let firstNode = null;
+        if(selected && (selected.data.projType === projectType.engineering || selected.data.projType === projectType.tender)){
+            firstNode = selected.data.projType === projectType.engineering ? selected : selected.parent;
+        }
+        if(firstNode){
+            let index = null;
+            for(let i = 0, len = engineerings.length; i < len; i++){
+                if(firstNode.data.ID === engineerings[i].data.ID){
+                    index = i;
+                }
+            }
+            if(index){
+                engineerings.splice(index, 1);
+                engineerings.splice(0, 0, firstNode);
+            }
+        }
         if(engineerings.length > 0){
         if(engineerings.length > 0){
             $("#eng-name").val(engineerings[0].data.name);
             $("#eng-name").val(engineerings[0].data.name);
-            selectedInfo.engineering = Object.create(null);
-            selectedInfo.engineering.ID = engineerings[0].data.ID;
-            selectedInfo.engineering.name = engineerings[0].data.name;
             for(let i = 0, len = engineerings.length; i < len; i++){
             for(let i = 0, len = engineerings.length; i < len; i++){
                 let eng = $("<button>").val(engineerings[i].data.ID).text(engineerings[i].data.name);
                 let eng = $("<button>").val(engineerings[i].data.ID).text(engineerings[i].data.name);
                 eng.addClass("dropdown-item");
                 eng.addClass("dropdown-item");
                 eng.attr("type", "button");
                 eng.attr("type", "button");
                 eng.click(function () {
                 eng.click(function () {
-                    selectedInfo.engineering.ID = engineerings[i].data.ID;
-                    selectedInfo.engineering.name = engineerings[i].data.name;
                     $("#eng-name").val(engineerings[i].data.name);
                     $("#eng-name").val(engineerings[i].data.name);
                 });
                 });
                 $("#eng-name-list").append(eng);
                 $("#eng-name-list").append(eng);