Jelajahi Sumber

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

TonyKang 7 tahun lalu
induk
melakukan
97862e23c4
40 mengubah file dengan 669 tambahan dan 260 penghapusan
  1. 4 3
      modules/fee_rates/controllers/fee_rates_controller.js
  2. 82 55
      modules/fee_rates/facade/fee_rates_facade.js
  3. 18 12
      modules/glj/controllers/glj_controller.js
  4. 0 38
      modules/main/models/proj_counter.js
  5. 29 0
      modules/main/models/proj_counter_model.js
  6. 30 0
      modules/main/models/proj_setting_model.js
  7. 3 1
      modules/main/models/project.js
  8. 15 0
      modules/main/models/schemas/proj_counter.js
  9. 17 0
      modules/main/models/schemas/proj_setting.js
  10. 3 1
      modules/pm/controllers/copy_proj_controller.js
  11. 8 1
      modules/pm/controllers/new_proj_controller.js
  12. 19 1
      modules/pm/controllers/pm_controller.js
  13. 60 15
      modules/pm/models/project_model.js
  14. 1 0
      modules/pm/routes/pm_route.js
  15. 13 8
      modules/ration_glj/facade/ration_glj_facade.js
  16. 1 0
      modules/ration_glj/models/ration_glj.js
  17. 10 4
      public/calc_util.js
  18. 28 17
      public/web/sheet/sheet_data_helper.js
  19. 4 5
      public/web/tree_sheet/tree_sheet_helper.js
  20. 2 2
      test/tmp_data/test_ration_calc/ration_calc_base.js
  21. 8 28
      web/building_saas/css/main.css
  22. 10 14
      web/building_saas/fee_rates/fee_rate.html
  23. 4 6
      web/building_saas/glj/html/glj_index.html
  24. 2 2
      web/building_saas/glj/js/composition_spread.js
  25. 29 1
      web/building_saas/glj/js/project_glj.js
  26. 10 12
      web/building_saas/js/global.js
  27. 2 2
      web/building_saas/main/html/calc_program_manage.html
  28. 22 0
      web/building_saas/main/html/main.html
  29. 7 6
      web/building_saas/main/js/models/calc_program.js
  30. 4 3
      web/building_saas/main/js/models/fee_rate.js
  31. 2 1
      web/building_saas/main/js/models/main_consts.js
  32. 7 2
      web/building_saas/main/js/models/project.js
  33. 39 0
      web/building_saas/main/js/models/project_glj.js
  34. 2 1
      web/building_saas/main/js/models/ration_glj.js
  35. 3 2
      web/building_saas/main/js/views/fee_rate_view.js
  36. 1 1
      web/building_saas/main/js/views/glj_view.js
  37. 51 0
      web/building_saas/main/js/views/main_tree_col.js
  38. 7 3
      web/building_saas/main/js/views/project_view.js
  39. 3 3
      web/building_saas/pm/html/project-management.html
  40. 109 10
      web/building_saas/pm/js/pm_main.js

+ 4 - 3
modules/fee_rates/controllers/fee_rates_controller.js

@@ -7,7 +7,7 @@ let mongoose = require('mongoose');
 let feeRateModel = mongoose.model('fee_rates');
 let feeRateFileModel = mongoose.model('fee_rate_file');
 let feeRateFacde=require('../facade/fee_rates_facade');
-
+let logger = require("../../../logs/log_helper").logger;
 let template = require('./feerate_template');
 /*
 var stdFeeRateLibs = require('../../std_fee_rate_libs/models/std_fee_rate_libs');
@@ -80,13 +80,14 @@ function libNames(req, res) {
 }
 
 
-function getFeeRateStandards(req, res) {
+async function getFeeRateStandards(req, res) {
     let result={
         error:0
     }
     try {
         let data = req.body.data;
-        let feeRateStandards= feeRateFacde.getFeeRateStandardsByProjectID(data.rootProjectID);
+        data = JSON.parse(data);
+        let feeRateStandards= await feeRateFacde.getFeeRateStandardsByProjectID(data.projectID);
         result.data= feeRateStandards;
     }catch (err){
         console.log(err);

+ 82 - 55
modules/fee_rates/facade/fee_rates_facade.js

@@ -8,11 +8,13 @@ let feeRateModel = mongoose.model('fee_rates');
 let feeRateFileModel = mongoose.model('fee_rate_file');
 let std_fee_rate_lib_model = mongoose.model('std_fee_rate_libs');
 let project_feerate_temp = mongoose.model('project_feerate_temp');
+let projectsModel = require("../../pm/models/project_schema");
 let consts = require('../../main/models/project_consts');
 let _=require("lodash");
 let template = require('../controllers/feerate_template');
 let logger = require("../../../logs/log_helper").logger;
 const uuidV1 = require('uuid/v1');
+let EngineeringLibModel = require("../../users/models/engineering_lib_model");
 
 module.exports={
     save:save,
@@ -23,7 +25,8 @@ module.exports={
     getChangeInfo:getChangeInfo,
     changeFeeRateFileFromCurrent:changeFeeRateFileFromCurrent,
     changeFeeRateFileFromOthers:changeFeeRateFileFromOthers,
-    newFeeRateFile:newFeeRateFile
+    newFeeRateFile:newFeeRateFile,
+    getFeeRatesByProject:getFeeRatesByProject
 };
 let operationMap={
     'ut_create':create_fee_rate,
@@ -186,14 +189,18 @@ async function getFeeRateData(projectID) {
     }
     try {
         //
-        let tem = await project_feerate_temp.findOne({projectID:projectID});//暂时取tem表的记录
-        if (tem){
-            let feeRateData = await feeRateFileModel.findOne({'ID':tem.feeRateFileID,deleteInfo:null});
-            let feeRate = await feeRateModel.findOne({ID:feeRateData.feeRateID});
-            feeRateData._doc.rates = feeRate.rates;
-            //
-            feeRateData._doc.usageProjects=getUsageProjects(feeRateData.ID);
-            result.datas = feeRateData;
+        let project =  await projectsModel.findOne({ID:projectID});
+        if (project&&project.property&&project.property.feeFile){
+            let feeRateData = await feeRateFileModel.findOne({'ID':project.property.feeFile,deleteInfo:null});
+            if(feeRateData===null){
+                result.datas=[];
+            }else {
+                let feeRate =  await feeRateModel.findOne({ID:feeRateData.feeRateID});
+                feeRateData._doc.rates = feeRate?feeRate.rates:[];
+                //
+                feeRateData._doc.usageProjects=await getUsageProjects(feeRateData.ID);
+                result.datas = feeRateData;
+            }
         }else {
             result.datas=[];
         }
@@ -206,12 +213,8 @@ async function getFeeRateData(projectID) {
     return result;
 }
 
-function getUsageProjects(feeRateID){
-   //从数据库中查,项目结构暂时还没做 todo
-    var projects = [];
-    projects.push({ID:99,name:'单价调整'});
-    projects.push({ID:100,name:'工程02'});
-    projects.push({ID:101,name:'建筑工程'});
+async function getUsageProjects(feeRateID){
+    let projects = await projectsModel.find({'property.feeFile':feeRateID,'deleteInfo':null});
     return projects;
 }
 
@@ -224,14 +227,19 @@ function commonCallback(callback,result,err) {
     }
 }
 
-function getFeeRateStandardsByProjectID(rootProjectID) {
-    //这里应该从项目配置中读取 to do, 暂时使用模板文件里的数据
-    let t1 = template.feerate_template1;
-    let t2 = template.feerate_template2;
-
+async function getFeeRateStandardsByProjectID(projectID) {
+    logger.info("get feeRate standard, projectID:"+projectID)
     let feeRateStandards=[];
-    feeRateStandards.push({ID:t1.ID,libName:t1.libName});
-    feeRateStandards.push({ID:t2.ID,libName:t2.libName});
+    let project =  await projectsModel.findOne({ID:projectID});
+    let engineeringLibModel = new EngineeringLibModel();
+    let engineeringInfo = project !== null && project.property.engineering_id !== undefined ?
+        await engineeringLibModel.getEngineering(project.property.engineering_id) : null;
+    if(engineeringInfo!=null){
+        let fee_lib = engineeringInfo.fee_lib;
+        for(let lib of fee_lib){
+            feeRateStandards.push({ID:lib.id,libName:lib.name});
+        }
+    }
     return feeRateStandards;
 }
 
@@ -254,27 +262,43 @@ async function changeFeeRateStandard(jdata){
     return doc;
 }
 
-async function newFeeRateFile(data){
-  /*  data = {
-   libID:2,
-   rootProjectID:113,
-   name:'费率1'
-    }*/
-    let template = await std_fee_rate_lib_model.findOne({"ID":data.libID});
-    let newFeeRate = {};
-    newFeeRate.ID =uuidV1();
-    newFeeRate.rates=template.rates;
-    await feeRateModel.create(newFeeRate);
-    let doc={
-        libID:data.libID,
-        libName:template.libName,
-        feeRateID: newFeeRate.ID,
-        rootProjectID:data.rootProjectID,
-        name:data.name
-    };
-    doc.ID = uuidV1();
-    await feeRateFileModel.create(doc);
-    return doc;
+async function newFeeRateFile(updateData){
+    if(updateData.property !== null){
+        let property = updateData.property;
+        logger.info("Create new feeRate file for project :"+updateData.ID);
+        let feeFile = property.feeFile;
+        let rootProjectID = property.rootProjectID;
+        let name = updateData.name;
+        if(feeFile.indexOf("newFeeRate")!=-1){
+            let temFee = await feeRateFileModel.findOne({rootProjectID:rootProjectID,name:name,deleteInfo:null});
+            if(temFee){
+                return temFee.ID;
+            }
+            let temA = feeFile.split("-");
+            let libID = temA[1];
+            let doc={
+                rootProjectID:rootProjectID,
+                name:name
+            };
+            if(libID!== ''){
+                let template = await std_fee_rate_lib_model.findOne({"ID":libID});
+                let newFeeRate = {};
+                newFeeRate.ID =uuidV1();
+                newFeeRate.rates=template.rates;
+                await feeRateModel.create(newFeeRate);
+                doc.libID = libID;
+                doc.libName = template.libName;
+                doc.feeRateID =  newFeeRate.ID;
+            }
+            doc.ID = uuidV1();
+            await feeRateFileModel.create(doc);
+            return doc.ID;
+        }else {
+            return feeFile
+        }
+
+    }
+    return null;
 }
 
 
@@ -290,25 +314,28 @@ async function checkFeeRateName(jdata) {
 
 async function getChangeInfo(jdata){
     let data = JSON.parse(jdata);
-    //{ projectID: 99, user_id: '76075' }
+    //{ rootProjectID: 99, user_id: '76075' }
     let result={};
-    let currentProject = {projectID:99,name:'建设项目1'};//dummy 数据
-    currentProject.currentOptions=await feeRateFileModel.find({rootProjectID:data.projectID,deleteInfo:null},['ID','name']);
+    let currentProject = await projectsModel.findOne({'ID':data.rootProjectID},['ID','name']); //{projectID:99,name:'建设项目1'};//dummy 数据
+    currentProject._doc.currentOptions=await getFeeRatesByProject(data.rootProjectID);
     //根据用户ID 找除了当前项目的其它建设项目;
-    let others = [
-        {projectID:100,name:'建设项目2',optionList:[
-            {ID:'590cf860-7d99-11e7-90b0-e3a3dfdb2116',name:'2-test另存'},
-            {ID:'c55718d0-7d98-11e7-b3b4-cfc9038d29b0',name:'2-费率B'},
-            {ID:'da059df1-7c18-11e7-9e2f-1390b52643b4',name:'2-费率A'}
-        ] },
-        {projectID:101,name:'建设项目3',optionList:currentProject.currentOptions },
-        {projectID:102,name:'建设项目4',optionList:currentProject.currentOptions },
-    ]
+    let others =await projectsModel.find({'$and': [
+            {'$or':[{'userID': data.user_id,'projType':'Project', 'deleteInfo': null}, {'userID': data.user_id,'projType':'Project', 'deleteInfo.deleted': {'$in': [null, false]}}]},
+            { 'ID':{'$nin':[data.rootProjectID]}}
+        ]},['ID','name']);
+    for(let o of others){
+        o._doc.optionList = await getFeeRatesByProject(o.ID);
+    }
     result.currentProject=currentProject;
     result.others = others;
     return result;
 }
 
+async function getFeeRatesByProject(rootProjectID) {
+       let feeRates = await feeRateFileModel.find({rootProjectID:rootProjectID,deleteInfo:null},['ID','name']);
+       return feeRates;
+}
+
 async function changeFeeRateFileFromCurrent(jdata){
     let data = JSON.parse(jdata);
     let result = await  project_feerate_temp.findOneAndUpdate({projectID:data.projectID},{feeRateFileID:data.newFeeRateFileID});

+ 18 - 12
modules/glj/controllers/glj_controller.js

@@ -9,9 +9,9 @@ import BaseController from "../../common/base/base_controller";
 import GLJTypeConst from "../../common/const/glj_type_const";
 import GLJListModel from "../models/glj_list_model";
 import UnitPriceModel from "../models/unit_price_model";
-import UnitPriceFileModel from "../models/unit_price_file_model";
 import MixRatioModel from "../models/mix_ratio_model";
 
+const ProjectModel = require('../../pm/models/project_model').project;
 class GLJController extends BaseController {
 
     /**
@@ -46,13 +46,21 @@ class GLJController extends BaseController {
             }
 
             // 获取标段对应的单价文件id
-            let unitPriceFileModel = new UnitPriceFileModel();
-            let unitPriceFile = await unitPriceFileModel.getDataByProject(projectId);
-            if (!unitPriceFile) {
+            let unitPriceFileId = await ProjectModel.getUnitPriceFileId(projectId);
+            if (unitPriceFileId <= 0) {
                 throw '没有对应的单价文件';
             }
-            // 单价文件id作为同步的roomId
-            let unitPriceFileId = unitPriceFile.id;
+
+            // 获取使用该单价文件的项目数据
+            let tenderData = await ProjectModel.getTenderByUnitPriceFileId(unitPriceFileId);
+            let usedTenderList = [];
+            let usedUnitPriceName = '';
+            if (tenderData !== null) {
+                for (let tmp of tenderData) {
+                    usedTenderList.push(tmp.name);
+                    usedUnitPriceName = tmp.property.unitPriceFile.name;
+                }
+            }
 
             // 先获取对应标段的项目工料机数据
             let gljListModel = new GLJListModel();
@@ -60,12 +68,14 @@ class GLJController extends BaseController {
 
             responseData.data.gljList = gljList;
             responseData.data.mixRatioConnectData = mixRatioConnectData;
+            responseData.data.usedTenderList = usedTenderList;
             responseData.data.constData = {
                 materialIdList: gljListModel.materialIdList,
                 ownCompositionTypes: gljListModel.ownCompositionTypes,
                 hostname: request.hostname,
                 roomId: unitPriceFileId,
                 GLJTypeConst: JSON.stringify(GLJTypeConst),
+                usedUnitPriceName: usedUnitPriceName
             };
         } catch (error) {
             responseData.err = 1;
@@ -180,15 +190,11 @@ class GLJController extends BaseController {
         };
         try {
             // 获取标段对应的单价文件id
-            let unitPriceFileModel = new UnitPriceFileModel();
-            let unitPriceFile = await unitPriceFileModel.getDataByProject(projectId);
-            if (!unitPriceFile) {
+            let unitPriceFileId = await ProjectModel.getUnitPriceFileId(projectId);
+            if (unitPriceFileId <= 0) {
                 throw '没有对应的单价文件';
             }
 
-            // 单价文件id作为同步的roomId
-            let unitPriceFileId = unitPriceFile.id;
-
             let gljListModel = new GLJListModel();
             let result = await gljListModel.getCompositionList(projectGLJId, unitPriceFileId);
             if (result.length <= 0) {

+ 0 - 38
modules/main/models/proj_counter.js

@@ -1,38 +0,0 @@
-/**
- * Created by Mai on 2017/6/13.
- */
-
-let mongoose = require('mongoose');
-let baseModel = require('./base_model');
-
-class projCounter extends baseModel {
-    constructor (name) {
-        let db = require("../db/project_db");
-        let Schema = require("mongoose").Schema;
-        let projCounterSchema = new Schema({
-            projectID: Number,
-            bills: Number,
-            ration: Number,
-            volume_price: Number
-        });
-        let projCounterModel = db.model(name, projCounterSchema);
-        super(projCounterModel);
-        this.collectionName = name;
-    };
-
-    getData (projectID, callback) {
-        this.model.findOne({"projectID": projectID}, '-_id', function (err, result) {
-            if (!err) {
-                callback(0, '', result);
-            } else {
-                callback(1, '查询数据失败。', null);
-            }
-        });
-    };
-
-    save (user_id, data, callback) {
-        this.model.update({"projectID": data.projectID}, data, callback);
-    }
-};
-
-module.exports = new projCounter('projCounter');

+ 29 - 0
modules/main/models/proj_counter_model.js

@@ -0,0 +1,29 @@
+/**
+ * Created by Mai on 2017/6/13.
+ */
+
+let baseModel = require('./base_model');
+import {default as projCounterSchema, collectionName as collectionName} from "./schemas/proj_counter";
+
+class projCounter extends baseModel {
+    constructor() {
+        super(projCounterSchema);
+        this.collectionName = collectionName;
+    }
+
+    getData (projectID, callback) {
+        this.model.findOne({"projectID": projectID}, '-_id', function (err, result) {
+            if (!err) {
+                callback(0, collectionName, result);
+            } else {
+                callback(1, '查询数据失败。', null);
+            }
+        });
+    };
+
+    save (user_id, data, callback) {
+        this.model.update({"projectID": data.projectID}, data, callback);
+    }
+};
+
+module.exports = new projCounter();

+ 30 - 0
modules/main/models/proj_setting_model.js

@@ -0,0 +1,30 @@
+/**
+ * Created by Mai on 2017/9/14.
+ */
+
+let baseModel = require('./base_model');
+import {default as projSettingSchema, collectionName as collectionName} from "./schemas/proj_setting";
+
+class projSettingModel extends baseModel {
+
+    constructor() {
+        super(projSettingSchema);
+        this.collectionName = collectionName;
+    }
+
+    getData (projectID, callback) {
+        this.model.findOne({"projectID": projectID}, '-_id', function (err, result) {
+            if (!err) {
+                callback(0, collectionName, result);
+            } else {
+                callback(1, '查询数据失败。', null);
+            }
+        });
+    };
+
+    save (user_id, data, callback) {
+        this.model.update({"projectID": data.projectID}, data, callback);
+    };
+}
+
+module.exports = new projSettingModel();

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

@@ -9,7 +9,8 @@ var ration_coe_data = require('../../ration_glj/facade/ration_coe_facade');
 var ration_ass_data = require('../../ration_glj/facade/ration_ass_facade');
 var quantity_detail_data = require('../../ration_glj/facade/quantity_detail_facade');
 var fee_rate_data = require('../../fee_rates/facade/fee_rates_facade');
-let projCounter = require('./proj_counter');
+let projCounter = require('./proj_counter_model');
+let projSetting = require('./proj_setting_model');
 let volumePriceData = require('../../volume_price/models/volume_price_model');
 var consts = require('./project_consts');
 var projectConsts = consts.projectConst;
@@ -25,6 +26,7 @@ moduleMap[projectConsts.RATION_COE] = ration_coe_data;
 moduleMap[projectConsts.RATION_ASS] = ration_ass_data;
 moduleMap[projectConsts.QUANTITY_DETAIL] = quantity_detail_data;
 moduleMap[projCounter.collectionName] = projCounter;
+moduleMap[projSetting.collectionName] = projSetting;
 moduleMap[volumePriceData.collectionName] = volumePriceData;
 moduleMap[projectConsts.FEERATE] = fee_rate_data;
 

+ 15 - 0
modules/main/models/schemas/proj_counter.js

@@ -0,0 +1,15 @@
+/**
+ * Created by Mai on 2017/9/15.
+ */
+
+let mongoose = require("mongoose");
+let Schema = mongoose.Schema;
+let collectionName = 'projCounter';
+let projSettingSchema = {
+    projectID: Number,
+    bills: Number,
+    ration: Number,
+    volume_price: Number
+};
+let model = mongoose.model(collectionName, new Schema(projSettingSchema, {versionKey: false, collection: collectionName}));
+export {model as default, collectionName as collectionName};

+ 17 - 0
modules/main/models/schemas/proj_setting.js

@@ -0,0 +1,17 @@
+/**
+ * Created by Mai on 2017/9/14.
+ */
+
+let mongoose = require("mongoose");
+let Schema = mongoose.Schema;
+let collectionName = 'proj_setting';
+let projSettingSchema = {
+    projectID: Number,
+    // 列设置
+    main_tree_col: {
+        type: Schema.Types.Mixed,
+        default: {}
+    }
+};
+let model = mongoose.model(collectionName, new Schema(projSettingSchema, {versionKey: false, collection: collectionName}));
+export {model as default, collectionName as collectionName};

+ 3 - 1
modules/pm/controllers/copy_proj_controller.js

@@ -4,7 +4,8 @@
 
 let billsData = require('../../main/models/bills');
 let rationData = require('../../main/models/ration');
-let projCounter = require('../../main/models/proj_counter');
+let projCounter = require('../../main/models/proj_counter_model');
+let projSetting = require('../../main/models/proj_setting_model');
 let volumePriceData = require('../../volume_price/models/volume_price_model');
 let async = require('async');
 
@@ -30,6 +31,7 @@ module.exports = {
         fun.push(copyData(billsData));
         fun.push(copyData(rationData));
         fun.push(copyData(projCounter));
+        fun.push(copyData(projSetting));
         fun.push(copyData(volumePriceData));
         async.parallel(fun, (err) => callback(err));
     }

+ 8 - 1
modules/pm/controllers/new_proj_controller.js

@@ -3,10 +3,12 @@
  */
 
 let billsData = require('../../main/models/bills');
-let projCounter = require('../../main/models/proj_counter');
+let projCounter = require('../../main/models/proj_counter_model');
+let projSetting = require('../../main/models/proj_setting_model');
 let async = require('async');
 
 import BillsTemplateModel from "../models/templates/bills_template_model";
+import EngineeringLibModel from "../../users/models/engineering_lib_model";
 
 module.exports = {
     copyTemplateData: async function (property, newProjID, callback) {
@@ -23,6 +25,11 @@ module.exports = {
             },
             function (cb) {
                 projCounter.insertData({"projectID": newProjID}, cb);
+            },
+            async function (cb) {
+                let engineeringModel = new EngineeringLibModel();
+                let engineering = await engineeringModel.getEngineering(property.engineering_id);
+                projSetting.insertData({"projectID": newProjID, main_tree_col: engineering.main_tree_col}, cb);
             }
         ], (err) => callback(err));
     }

+ 19 - 1
modules/pm/controllers/pm_controller.js

@@ -6,6 +6,7 @@ let ProjectsData = require('../models/project_model').project;
 let projType = require('../models/project_model').projType;
 const engineering = require("../../common/const/engineering");
 let EngineeringLibModel = require("../../users/models/engineering_lib_model");
+let fee_rate_facade = require("../../fee_rates/facade/fee_rates_facade");
 
 //统一回调函数
 let callback = function(req, res, err, message, data){
@@ -149,7 +150,7 @@ module.exports = {
             // 获取对应的单价文件
             let unitPriceFileModel = new UnitPriceFileModel();
             let unitPriceFileData = await unitPriceFileModel.getDataByTenderId(idList);
-            console.log(unitPriceFileData);
+
             if (unitPriceFileData === null) {
                 throw {msg: '不存在对应单价文件', err: 0};
             }
@@ -170,5 +171,22 @@ module.exports = {
             let responseData = error.err === 1 ? null : [];
             callback(request, response, error.err, error.msg, responseData);
         }
+    },
+    getFeeRateFileList:async function(request, response) {
+        let data = request.body.data;
+        try {
+            data = JSON.parse(data);
+            let projectId = data.parentID !== undefined ? data.parentID : 0;
+            if (isNaN(projectId) && projectId <= 0) {
+                throw {msg: 'id数据有误!', err: 1};
+            }
+            // 获取对应建设项目下所有的单位工程id
+            let feeRateFileList = await fee_rate_facade.getFeeRatesByProject(projectId);
+            callback(request, response, 0, '',feeRateFileList );
+        } catch (error) {
+            console.log(error);
+            let responseData = error.err === 1 ? null : [];
+            callback(request, response, error.err, error.msg, responseData);
+        }
     }
 };

+ 60 - 15
modules/pm/models/project_model.js

@@ -6,6 +6,8 @@ let counter = require("../../../public/counter/counter.js");
 
 let newProjController = require('../controllers/new_proj_controller');
 let copyProjController = require('../controllers/copy_proj_controller');
+let feeRateFacade = require('../../fee_rates/facade/fee_rates_facade');
+let logger = require("../../../logs/log_helper").logger;
 
 let Projects = require("./project_schema");
 let projectType = {
@@ -63,6 +65,23 @@ ProjectsDAO.prototype.updateUserProjects = async function(userId, datas, callbac
             } else if (data.updateType === 'new') {
                 data.updateData['userID'] = userId;
                 data.updateData['createDateTime'] = new Date();
+                // 如果没有选中单价文件则新增单价文件
+                if (data.updateData.projType === projectType.tender && data.updateData.property !== null &&
+                    Object.keys(data.updateData.property.unitPriceFile).length > 0 &&
+                    data.updateData.property.unitPriceFile.id === '') {
+                    let unitPriceFileModel = new UnitPriceFileModel();
+
+                    let insertData = {
+                        name: data.updateData.name,
+                        project_id: data.updateData.ID
+                    };
+                    let addResult = await unitPriceFileModel.add(insertData);
+                    if (!addResult) {
+                        callback(1, '新增单价文件失败.', null);
+                        return;
+                    }
+                    data.updateData.property.unitPriceFile.id = addResult.id + '';
+                }
                 newProject = new Projects(data.updateData);
                 // 查找同级是否存在同名数据
                 let exist = await this.isExist(data.updateData.name, data.updateData.ParentID);
@@ -70,24 +89,13 @@ ProjectsDAO.prototype.updateUserProjects = async function(userId, datas, callbac
                     callback(1, '同级目录已存在相同名称数据.', null);
                     return;
                 }
-
+                if(data.updateData.projType==='Tender'){
+                    let  feeRateFileID = await feeRateFacade.newFeeRateFile(data.updateData);
+                    newProject.property.feeFile = feeRateFileID?feeRateFileID:-1;
+                }
                 newProject.save(async function (err, result) {
                     if (!err && result._doc.projType === projectType.tender) {
                         newProjController.copyTemplateData(data.updateData.property, newProject.ID, updateAll);
-                        // 如果没有选中单价文件则新增单价文件
-                        if (data.updateData.property !== null && data.updateData.property.unitPriceFile === '') {
-                            let unitPriceFileModel = new UnitPriceFileModel();
-                            let insertData = {
-                                name: data.updateData.name,
-                                project_id: data.updateData.ID
-                            };
-                            let addResult = await unitPriceFileModel.add(insertData);
-                            if (!addResult) {
-                                callback(1, '新增单价文件失败.', null);
-                                return;
-                            }
-                        }
-
                     } else {
                         updateAll(err);
                     }
@@ -254,6 +262,43 @@ ProjectsDAO.prototype.getTenderByProjectId = async function(projectId) {
     return result;
 };
 
+/**
+ * 根据单价文件id获取对应的标段数据
+ *
+ * @param {Number} unitPriceFileId
+ * @return {Promise}
+ */
+ProjectsDAO.prototype.getTenderByUnitPriceFileId = async function(unitPriceFileId) {
+    let result = [];
+
+    unitPriceFileId = parseInt(unitPriceFileId);
+    if (isNaN(unitPriceFileId) && unitPriceFileId <= 0) {
+        return result;
+    }
+
+    let condition = {projType: 'Tender', "property.unitPriceFile.id": unitPriceFileId + ''};
+    result = await Projects.find(condition);
+
+    return result;
+};
+
+/**
+ * 根据项目id获取单价文件列表id
+ *
+ * @param {Number} projectId
+ * @return {Promise}
+ */
+ProjectsDAO.prototype.getUnitPriceFileId = async function(projectId) {
+    let result = 0;
+    let projectData = await Projects.findOne({ID: projectId});
+    if (projectData === null) {
+        return result;
+    }
+
+    result = projectData.property.unitPriceFile.id;
+    return result;
+};
+
 module.exports ={
     project: new ProjectsDAO(),
     projType: projectType

+ 1 - 0
modules/pm/routes/pm_route.js

@@ -41,6 +41,7 @@ module.exports = function (app) {
     pmRouter.post('/getProject', pmController.getProject);
     pmRouter.post('/getNewProjectID', pmController.getNewProjectID);
     pmRouter.post('/getUnitFile', pmController.getUnitFileList);
+    pmRouter.post('/getFeeRateFile', pmController.getFeeRateFileList);
 
     app.use('/pm/api', pmRouter);
 };

+ 13 - 8
modules/ration_glj/facade/ration_glj_facade.js

@@ -83,7 +83,7 @@ function combineQuantity(results) {
 
 
 function get_lib_glj_info(ration_glj) {
-    return function (cb) {
+    return function (result,cb) {
         std_glj_lib_gljList_model.findOne({'ID':ration_glj.GLJID},(err,glj)=>{
                 if(err){
                 cb(err,'')
@@ -95,8 +95,10 @@ function get_lib_glj_info(ration_glj) {
                 ration_glj.basePrice = glj.basePrice;
                 ration_glj.shortName = glj.shortName;
                 ration_glj.type = glj.gljType;
-                getInfoFromProjectGLJ(ration_glj).then(function (result) {
-                    if(result){
+                ration_glj.repositoryId = glj.ration_glj
+                getInfoFromProjectGLJ(ration_glj).then(function (info) {
+                    if(info){
+                        result.datas.push(info);
                         cb(null,result);
                     }else {
                         cb(new Error('get project glj error'),null);
@@ -111,7 +113,7 @@ function get_lib_glj_info(ration_glj) {
 
 async function getInfoFromProjectGLJ(ration_glj) {
      let data = {
-         glj_id: ration_glj.glj_repository_id,
+         glj_id: ration_glj.GLJID,
          project_id: ration_glj.projectID,
          code: ration_glj.code,
          name: ration_glj.name,
@@ -120,7 +122,8 @@ async function getInfoFromProjectGLJ(ration_glj) {
          type: ration_glj.type,
          type_of_work: ration_glj.type,
          base_price: ration_glj.basePrice,
-         market_price: ration_glj.basePrice
+         market_price: ration_glj.basePrice,
+         repositoryId:ration_glj.repositoryId
      };
 
      try {
@@ -142,16 +145,17 @@ function create_ration_glj(user_id,datas) {
     return function (callback) {
         let ration_glj_list=datas.ration_glj_list;
         var tasks=[];
+        tasks.push(startingTask("get glj info"))
         for(let i =0;i<ration_glj_list.length;i++){
             ration_glj_list[i].ID = uuidV1();
             tasks.push(get_lib_glj_info(ration_glj_list[i]))
         }
-        async_n.parallel(tasks,(err,results)=>{
+        async_n.waterfall(tasks,(err,results)=>{
             if(err){
                 callback(err,results)
             }else {
                 let newRecords =[];
-                for (let r of results){
+                for (let r of results.datas){
                     if(r){
                         newRecords.push(r)
                     }
@@ -395,7 +399,8 @@ function  deleteByID(datas,callback){
 function startingTask(processName){
     return function(asyncCallBack){
         var result = {
-            processName : processName
+            processName : processName,
+            datas:[]
         };
         asyncCallBack(null, result);
     };

+ 1 - 0
modules/ration_glj/models/ration_glj.js

@@ -7,6 +7,7 @@ var mongoose = require('mongoose'),
 var ration_glj = new Schema({
     ID:String,
     GLJID:Number,
+    repositoryId:Number,
     projectID: Number,
     rationID:Number,
     projectGLJID:Number,

+ 10 - 4
public/calc_util.js

@@ -22,16 +22,22 @@ let executeObj = {
             base = me.calcBase[calcBaseName];
 
         if (base != null) {
-            let price = 0, tmpSum = 0;
+            let price = 0, aprice = 0, mprice = 0, tmpSum = 0;
             for (let glj of me.treeNode.data.gljList) {
                 if (base.gljTypes.indexOf(glj.type) >= 0) {
                     if (base.calcType == baseCalc){ price = glj["basePrice"];}
                     else if (base.calcType == adjustCalc){price = glj["adjustPrice"];}
                     else if (base.calcType == budgetCalc){price = glj["marketPrice"];}
-                    else if (base.calcType == diffCalc){price = glj["marketPrice"] - glj["adjustPrice"];};
+                    else if (base.calcType == diffCalc){
+                        aprice = glj["adjustPrice"];
+                        if (!aprice) aprice = 0;
+                        mprice = glj["marketPrice"];
+                        if (!mprice) mprice = 0;
+                        price = mprice - aprice;
+                    };
+                    if (!price) price = 0;
+                    tmpSum = tmpSum + glj["quantity"] * price;
                 };
-                tmpSum = tmpSum + glj["quantity"] * price;
-                glj = null;
             };
             rst = tmpSum;
         };

+ 28 - 17
public/web/sheet/sheet_data_helper.js

@@ -61,23 +61,29 @@ var SheetDataHelper = {
         }
         sheet.setColumnCount(setting.cols.length);
         sheet.setRowCount(setting.headRows, GC.Spread.Sheets.SheetArea.colHeader);
-        setting.headRowHeight.forEach(function (rowHeight, index) {
-            sheet.setRowHeight(index, rowHeight, GC.Spread.Sheets.SheetArea.colHeader);
-        })
-        setting.cols.forEach(function (col, index) {
-            var i, iRow = 0, cell;
-            for (i = 0; i < col.head.spanCols.length; i++) {
-                if (col.head.spanCols[i] !== 0) {
-                    cell = sheet.getCell(iRow, index, GC.Spread.Sheets.SheetArea.colHeader);
-                    cell.value(col.head.titleNames[i]).font(col.head.font).hAlign(col.head.hAlign[i]).vAlign(col.head.vAlign[i]);
-                }
-                if (col.head.spanCols[i] > 1 || col.head.spanRows[i] > 1) {
-                    sheet.addSpan(iRow, index, col.head.spanRows[i], col.head.spanCols[i], GC.Spread.Sheets.SheetArea.colHeader);
-                }
-                iRow += col.head.spanRows[i];
-            };
-            sheet.setColumnWidth(index, col.width);
-        });
+        if (setting.headRowHeight) {
+            setting.headRowHeight.forEach(function (rowHeight, index) {
+                sheet.setRowHeight(index, rowHeight, GC.Spread.Sheets.SheetArea.colHeader);
+            });
+        }
+        if (setting.cols) {
+            sheet.setColumnCount(setting.cols.length);
+            setting.cols.forEach(function (col, index) {
+                var i, iRow = 0, cell;
+                for (i = 0; i < col.head.spanCols.length; i++) {
+                    if (col.head.spanCols[i] !== 0) {
+                        cell = sheet.getCell(iRow, index, GC.Spread.Sheets.SheetArea.colHeader);
+                        cell.value(col.head.titleNames[i]).font(col.head.font).hAlign(col.head.hAlign[i]).vAlign(col.head.vAlign[i]).wordWrap(true);
+                    }
+                    if (col.head.spanCols[i] > 1 || col.head.spanRows[i] > 1) {
+                        sheet.addSpan(iRow, index, col.head.spanRows[i], col.head.spanCols[i], GC.Spread.Sheets.SheetArea.colHeader);
+                    }
+                    iRow += col.head.spanRows[i];
+                };
+                sheet.setColumnWidth(index, col.width);
+                sheet.setColumnVisible(index, col.visible);
+            });
+        }
     },
     protectdSheet: function (sheet) {
         var option = {
@@ -191,6 +197,11 @@ var SheetDataHelper = {
         sheet.resumeEvent();
         sheet.resumePaint();
     },
+    refreshColumnVisible: function (setting, sheet) {
+        setting.cols.forEach(function (col, index) {
+            sheet.setColumnVisible(index, col.visible);
+        });
+    },
     bindSheetData: function (setting, sheet, datas) {     
         var getBindColInfo = function (setting) {
             var colInfo = {};

+ 4 - 5
public/web/tree_sheet/tree_sheet_helper.js

@@ -30,7 +30,6 @@ var TREE_SHEET_HELPER = {
         spread.options.cutCopyIndicatorVisible = false;
         spread.options.allowCopyPasteExcelStyle = false;
         spread.options.allowUserDragDrop = false;
-        spread.options.
         spread.getActiveSheet().setRowCount(3);
         return spread;
     },
@@ -61,7 +60,7 @@ var TREE_SHEET_HELPER = {
             for (i = 0; i < col.head.spanCols.length; i++) {
                 if (col.head.spanCols[i] !== 0) {
                     cell = sheet.getCell(iRow, index, GC.Spread.Sheets.SheetArea.colHeader);
-                    cell.value(col.head.titleNames[i]).font(col.head.font).hAlign(col.head.hAlign[i]).vAlign(col.head.vAlign[i]).wordWrap(col.head.wordWrap);
+                    cell.value(col.head.titleNames[i]).font(col.head.font).hAlign(col.head.hAlign[i]).vAlign(col.head.vAlign[i]).wordWrap(true);
                 }
                 if (col.head.spanCols[i] > 1 || col.head.spanRows[i] > 1) {
                     sheet.addSpan(iRow, index, col.head.spanRows[i], col.head.spanCols[i], GC.Spread.Sheets.SheetArea.colHeader);
@@ -69,6 +68,7 @@ var TREE_SHEET_HELPER = {
                 iRow += col.head.spanRows[i];
             };
             sheet.setColumnWidth(index, col.width);
+            sheet.setColumnVisible(index, col.visible && true);
         });
     },
     protectdSheet: function (sheet) {
@@ -131,12 +131,12 @@ var TREE_SHEET_HELPER = {
                     }
                     return data;
                 };
-                if (colSetting.data.getText) {
+                if (colSetting.data.getText && Object.prototype.toString.apply(colSetting.data.getText) === "[object Function]") {
                     cell.value(colSetting.data.getText(node));
                 } else {
                     cell.value(getFieldText2());
                 }
-                if (colSetting.data.cellType) {
+                if (colSetting.data.cellType && Object.prototype.toString.apply(colSetting.data.cellType) !== "[object String]") {
                     cell.cellType(colSetting.data.cellType);
                 }
                 if (colSetting.readOnly) {
@@ -164,7 +164,6 @@ var TREE_SHEET_HELPER = {
         };
         TreeNodeCellType.prototype = new GC.Spread.Sheets.CellTypes.Text();
         TreeNodeCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
-            console.log(style);
             if (style.backColor) {
                 ctx.save();
                 ctx.fillStyle = style.backColor;

+ 2 - 2
test/tmp_data/test_ration_calc/ration_calc_base.js

@@ -60,7 +60,7 @@ let rationCalcBase = [
     },{
         'dispName': '人工费价差',
         'calcFun': 'diff',
-        'calcType': budgetCalc,
+        'calcType': diffCalc,
         'gljTypes': [gljType.LABOUR]
     },{
         'dispName': '材料费价差',
@@ -75,7 +75,7 @@ let rationCalcBase = [
     },{
         'dispName': '主材费',
         'calcFun': 'budget',
-        'calcType': diffCalc,
+        'calcType': budgetCalc,
         'gljTypes': [gljType.MAIN_MATERIAL]
     },{
         'dispName': '设备费',

+ 8 - 28
web/building_saas/css/main.css

@@ -74,21 +74,21 @@ body {
     margin-left: 29px;
     background: #fff
 }
-.toolsbar {
+.toolsbar,.toolsbar-f {
   border-bottom: 1px solid #ccc
 }
 .tools-btn {
     height: 30px;
     line-height: 30px;
 }
-.toolsbar .tools-btn.btn:hover {
+.toolsbar .tools-btn.btn:hover,.toolsbar-f .tools-btn.btn:hover {
     background: #f7f7f9;
 }
 .main-side {
     border-left: 1px solid #ccc;
     overflow-y: hidden;
 }
-.main-data-top{
+.main-data-top,.main-data-full{
   overflow: hidden;
   width:100%
 }
@@ -290,10 +290,13 @@ body {
   width:inherit;
   height: inherit;
 }
-.modal-fixed-height {
+.modal-auto-height {
   height: 400px;
   overflow-y: auto;
-  width:100%
+}
+.modal-fixed-height {
+  height: 400px;
+  overflow-y: hidden;
 }
 .sidebar-tools-bar {
   background:#fff
@@ -302,26 +305,3 @@ body {
   background:#fff;
   border-bottom:1px solid #ddd
 }
-
-/* .grid { height: 500px !important; margin:0 10px 10px 40px;}*/
-.grid .gc-cell.c1 {
-    text-align: right;}
-.gc-grid{
-    border:0 !important;
-}
-.gc-column-header-cell ,.gc-corner-header-cell{
-    border-top: 1px solid rgba(0,0,0,.2);
-}
-.gc-cell,.gc-column-header-cell,select{
-    font-size: 0.9rem!important;
-}
-.gc-cell select{
-    height: auto;
-}
-.grid{
-    overflow: hidden;
-    width:100%;
-    height: 100%;
-}
-/*
-.gc-cell span{font-size: 12px !important}*/

+ 10 - 14
web/building_saas/fee_rates/fee_rate.html

@@ -17,23 +17,19 @@
     </div>
 </div>
 <div class="container-fluid">
-    <div class="row">
-        <div class="col-lg-12 p-0">
-            <div class="row">
-                <div class="col-lg-6">
-                    <div class="form-inline py-1">
-                        <label class="mx-2" >基于&nbsp;&nbsp;<span id="feeRateLibName">重庆渝建发[2016]35号</span></label>
-                        <a class="btn btn-sm ml-1" href="#" data-toggle="modal" data-target="#set-lv" id="setNewFeeRate"><i class="fa fa-cog"></i> 重选标准</a>
-                    </div>
-                    <div class=" grid  main-data-top" id="divFee"></div>
-                </div>
-                <div class="col-lg-4">
-                    <div class="py-1"><input type="checkbox" id="cascadeSet" checked >统一设置相同参数</div>
-                    <div class="grid  main-data-top py-1" id="subRate"></div>
+        <div class="row">
+            <div class="main-content col-lg-8 p-0">
+                <div class="form-inline py-1">
+                    <label class="mx-2" >基于&nbsp;&nbsp;<span id="feeRateLibName">重庆渝建发[2016]35号</span></label>
+                    <a class="btn btn-sm ml-1" href="#" data-toggle="modal" data-target="#set-lv" id="setNewFeeRate"><i class="fa fa-cog"></i> 重选标准</a>
                 </div>
+                <div class=" grid  main-data-full-fl" id="divFee"></div>
+            </div>
+            <div class="col-lg-4 py-1">
+                <div class="py-1"><input type="checkbox" id="cascadeSet" checked >统一设置相同参数</div>
+                <div class="grid  main-data-full-fl" id="subRate"></div>
             </div>
         </div>
-    </div>
 </div>
 <!--弹出更换-->
 <div class="modal fade" id="change-lv" data-backdrop="static">

+ 4 - 6
web/building_saas/glj/html/glj_index.html

@@ -1,10 +1,8 @@
 <div class="toolsbar px-1">
-    <div class="tools-btn btn-group align-top">
-        <a href="" class="btn btn-sm"><i class="fa fa-arrow-down" aria-hidden="true"></i>下移</a>
-        <a href="" class="btn btn-sm"><i class="fa fa-arrow-up" aria-hidden="true"></i>上移</a>
-        <a href="" class="btn btn-sm"><i class="fa fa-arrow-left" aria-hidden="true"></i></a>
-        <a href="" class="btn btn-sm"><i class="fa fa-arrow-right" aria-hidden="true"></i></a>
-        <a href="" class="btn btn-sm"><i class="fa fa-undo" aria-hidden="true"></i></a>
+    <div class="form-inline py-1">
+        <label class="mx-2">当前使用:<span id="used-name"></span>(<a href="#" id="pop-dj" data-original-title="" title=""><span id="used-count">0</span> 单位工程使用</a>)
+            <a class="btn btn-sm ml-1" href="#" data-toggle="modal" data-target="#change-dj"><i class="fa fa-exchange"></i> 选择其他</a>
+            <a class="btn btn-sm ml-1" href="#" data-toggle="modal" data-target="#copy-dj"><i class="fa fa-files-o"></i> 另存单独用</a></label>
     </div>
 </div>
 <div class="container-fluid">

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

@@ -115,7 +115,7 @@ CompositionSpread.prototype.getRatioData = function(projectGLJid) {
     $.ajax({
         url: '/glj/get-ratio',
         type: 'post',
-        data: {id: projectGLJid, project_id: 1},
+        data: {id: projectGLJid, project_id: scUrlUtil.GetQueryString('project')},
         error: function() {
             self.sheetObj.setData(null);
         },
@@ -131,7 +131,7 @@ CompositionSpread.prototype.getRatioData = function(projectGLJid) {
                 self.specialColumn(response.data);
             } else {
                 self.sheetObj.setData(null);
-                alert('不存在对应数据');
+                console.log('不存在对应数据');
             }
         }
     });

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

@@ -53,7 +53,7 @@ function init() {
         dataType: 'json',
         data: {project_id: scUrlUtil.GetQueryString('project')},
         error: function() {
-            alert('数据传输错误');
+            // alert('数据传输错误');
         },
         beforeSend: function() {
 
@@ -76,7 +76,15 @@ function init() {
                 data.constData.ownCompositionTypes : canNotChangeTypeId;
             GLJTypeConst = data.constData.GLJTypeConst !== undefined ? JSON.parse(data.constData.GLJTypeConst) : GLJTypeConst;
 
+            let usedTenderList = data.usedTenderList !== undefined ? data.usedTenderList : [];
+            let usedUnitFileName = data.constData.usedUnitPriceName !== undefined ?
+                data.constData.usedUnitPriceName : '';
+            // 存入缓存
+            projectObj.project.projectGLJ.datas = jsonData;
+            console.log(projectObj.project);
+
             spreadInit();
+            unitPriceFileInit(usedUnitFileName, usedTenderList);
         }
     });
 
@@ -123,6 +131,26 @@ function spreadInit() {
 }
 
 /**
+ * 单价文件相关初始化
+ *
+ * @param {String} name
+ * @param {Array} data
+ * @return {void}
+ */
+function unitPriceFileInit(name, data) {
+    $("#used-name").text(name);
+    let usedCount = data.length <= 0 ? 1 : data.length;
+    $("#used-count").text(usedCount);
+    $('#pop-dj').popover({
+            placement:"bottom",
+            html:true,
+            trigger:"hover | focus",
+            content: data.join('<br>')
+        }
+    );
+}
+
+/**
  * 成功事件
  *
  * @param {string} field

+ 10 - 12
web/building_saas/js/global.js

@@ -2,6 +2,7 @@
 function autoFlashHeight(){
     var headerHeight = $(".header").height();
     var toolsbarHeight = $(".toolsbar").height();
+    var ftoolsbarHeight = $(".toolsbar-f").height();
     var bottomContentHeight = $(".bottom-content").height();
     var toolsBarHeightQ = $(".tools-bar-height-q").height();
     var toolsBarHeightD = $(".tools-bar-height-d").height();
@@ -10,22 +11,19 @@ function autoFlashHeight(){
     $(".main-data-top").height($(window).height()-headerHeight-toolsbarHeight-bottomContentHeight-1);
     $(".main-data-full").height($(window).height()-headerHeight-toolsbarHeight-1);
     $(".main-data-full-fl").height($(window).height()-headerHeight-toolsbarHeight-37);
+    $(".main-data-not").height($(window).height()-headerHeight-1);
     $(".main-data-side-search").height($(window).height()-headerHeight-toolsbarHeight-64);
     $(".side-content").height($(window).height()-headerHeight );
-    $(".poj-list").height($(window).height()-headerHeight-toolsbarHeight);
+    $(".poj-list").height($(window).height()-headerHeight-ftoolsbarHeight);
     $(".form-list").height($(window).height()-headerHeight-50 );
-    $(".grid").height($(window).height()-headerHeight-toolsbarHeight-50);
-
 };
-// 获取get参数
-function getQueryString(name) {
-    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
-    var r = window.location.search.substr(1).match(reg);
-    if (r != null) return unescape(r[2]); return null;
-}
 $(window).resize(autoFlashHeight);
 /*全局自适应高度结束*/
 $(function(){
+/*侧滑*/
+$(".open-sidebar").click(function(){
+    $(".slide-sidebar").animate({width:"800"}).addClass("open");
+});
 $("body").click(function(event){
         var e = event || window.event; //浏览器兼容性
         if(!$(event.target).is('a')) {
@@ -42,8 +40,8 @@ $("body").click(function(event){
     });
 /*侧滑*/
 /*工具提示*/
-$('*[data-toggle=tooltip]').mouseover(function() {
- $(this).tooltip('show');
-  });
+$(function () {
+  $('[data-toggle="tooltip"]').tooltip()
+});
 /*工具提示*/
 });

+ 2 - 2
web/building_saas/main/html/calc_program_manage.html

@@ -13,11 +13,11 @@
     <div class="container-fluid">
         <div class="row">
         <div class="col-lg-3 p-0">
-            <div class="main-data-full" id="mainSpread">
+            <div class="main-data-not" id="mainSpread">
             </div>
         </div>
         <div class="col-lg-9 p-0">
-            <div class="main-data-full" id="detailSpread">
+            <div class="main-data-not" id="detailSpread">
             </div>
         </div>
     </div>

+ 22 - 0
web/building_saas/main/html/main.html

@@ -112,6 +112,9 @@
                     <a href="javascript:void(0)" class="btn btn-sm" id="downMove"><i class="fa fa-arrow-down" aria-hidden="true"></i> 下移</a>
                     <a href="javascript:void(0)" class="btn btn-sm" id="upMove"><i class="fa fa-arrow-up" aria-hidden="true"></i> 上移</a>
                   </div>
+                  <div>
+                      <a href="javacript:void(0);" data-toggle="modal" data-target="#column" class="btn btn-sm"><i class="fa fa-table" aria-hidden="true"></i> 列设置</a>
+                  </div>
                   <div class="side-tabs">
                       <ul class="nav nav-tabs" role="tablist">
                           <li class="nav-item">
@@ -406,6 +409,24 @@
 
         </div>
     </div>
+    <!--弹出列设置-->
+    <div class="modal fade" id="column" data-backdrop="static">
+        <div class="modal-dialog modal-lg" role="document">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h5 class="modal-title"><i class="fa fa-table"></i> 列设置</h5>
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">&times;</span>
+                    </button>
+                </div>
+                <div class="modal-body modal-auto-height" id="col_setting_spread" style="height: 130px; overflow: hidden;">
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
+                </div>
+            </div>
+        </div>
+    </div>
     <!-- JS. -->
     <script type="text/javascript">
         autoFlashHeight();
@@ -445,6 +466,7 @@
     <script type="text/javascript" src="/web/building_saas/main/js/models/bills.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/models/ration.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/models/glj.js"></script>
+    <script type="text/javascript" src="/web/building_saas/main/js/models/project_glj.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/models/fee_rate.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/models/ration_glj.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/models/ration_coe.js"></script>

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

@@ -122,7 +122,7 @@ let calcTemplates = [
                 feeRateID: 101,
                 expression: "@('3') + @('5') + @('7')",
                 compiledExpr: "",
-                statement: "定额基价人工费",
+                statement: "[定额基价人工费]+[定额基价材料费]+[定额基价机械费]",
                 memo: "渝建发[2014]27号"
             },
             {
@@ -134,7 +134,7 @@ let calcTemplates = [
                 feeRateID: 301,
                 expression: "@('3') + @('5') + @('7')",
                 compiledExpr: "",
-                statement: "定额基价人工费"
+                statement: "[定额基价人工费]+[定额基价材料费]+[定额基价机械费]"
             },
             {
                 ID: "13",
@@ -145,7 +145,7 @@ let calcTemplates = [
                 feeRateID: 701,
                 expression: "@('3') + @('5') + @('7')",
                 compiledExpr: "",
-                statement: "定额基价人工费",
+                statement: "[定额基价人工费]+[定额基价材料费]+[定额基价机械费]",
                 memo: "同定额包干费"
             },
             {
@@ -164,7 +164,8 @@ let calcTemplates = [
                 name: "人工费价差",
                 fieldName: "labourDiff",
                 dispExpr: "[人工费价差]",
-                expression: "base('市场价格人工费') - base('定额基价人工费(调整后)')",
+                // expression: "base('市场价格人工费') - base('定额基价人工费(调整后)')",
+                expression: "base('人工费价差')",
                 compiledExpr: "",
                 statement: "市场价格人工费-调整后的定额人工费(基价)"
             },
@@ -174,7 +175,7 @@ let calcTemplates = [
                 name: "材料费价差",
                 fieldName: "materialDiff",
                 dispExpr: "[材料费价差]",
-                expression: "base('市场价格材料费') - base('定额基价材料费(调整后)')",
+                expression: "base('材料费价差')",
                 compiledExpr: "",
                 statement: "市场价格材料费-定额基价材料费"
             },
@@ -184,7 +185,7 @@ let calcTemplates = [
                 name: "机械费价差",
                 fieldName: "machineDiff",
                 dispExpr: "[机械费价差]",
-                expression: "base('市场价格机械费') - base('定额基价机械费(调整后)')",
+                expression: "base('机械费价差')",
                 compiledExpr: "",
                 statement: "市场价格机械费-调整后的定额基价机械费(基价)"
             },

+ 4 - 3
web/building_saas/main/js/models/fee_rate.js

@@ -198,10 +198,11 @@ var FeeRate = {
             return  this.datas;
         };
         FeeRate.prototype.getChangeInfo = function (callback) {
-            var projectID = projectInfoObj.projectInfo.ID; //这里暂时用的是当前项目的ID,以后要改成顶层的建设项目ID
+           // var projectID = projectInfoObj.projectInfo.ID;
+            var feeRate = this.getActivateFeeRate();
             var data={
-                "projectID": projectID,
-                "user_id":userID
+                "user_id":userID,
+                "rootProjectID":feeRate.rootProjectID,
             };
             CommonAjax.post('/feeRates/getChangeInfo', data, function (data) {
                 callback(data);

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

@@ -11,5 +11,6 @@ const ModuleNames = {
     ration_coe:'ration_coe',
     ration_ass:'ration_ass',
     quantity_detail:'quantity_detail',
-    volume_price: 'volume_price'
+    volume_price: 'volume_price',
+    projectGLJ: 'project_glj'
 };

+ 7 - 2
web/building_saas/main/js/models/project.js

@@ -12,7 +12,8 @@ var PROJECT = {
             updateData: [],
             operation: '',
             modules: {},
-            projCounter: 'projCounter'
+            projCounter: 'projCounter',
+            projSetting: 'proj_setting'
         };
 
         var me = tools;
@@ -35,6 +36,9 @@ var PROJECT = {
                     me.modules[item.moduleName].loadData(item.data);
                 } else if (item.moduleName === me.projCounter) {
                     counter = item.data;
+                } else if (item.moduleName === me.projSetting) {
+                    me._project.projSetting = item.data;
+                    me._project.projSetting.moduleName = me.projSetting;
                 }
             });
             for (module in counter) {
@@ -74,6 +78,7 @@ var PROJECT = {
             this.quantity_detail = quantity_detail.createNew(this);
             this.FeeRate = FeeRate.createNew(this);
             this.VolumePrice = VolumePrice.createNew(this);
+            this.projectGLJ = new projectGLJ(this);
             this.Decimal = {
                 common: {
                     quantity: 3,
@@ -273,7 +278,7 @@ var PROJECT = {
                 this.push(moduleName, data);
             }
             this.endUpdate();
-        }
+        };
 
         project.prototype.registerModule = function(moduleName, obj){
             if (!tools.modules.hasOwnProperty(moduleName)){

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

@@ -0,0 +1,39 @@
+/**
+ * 工料机汇总相关数据
+ *
+ * @author CaiAoLin
+ * @date 2017/9/14
+ * @version
+ */
+function projectGLJ(project) {
+    this.project = project;
+    this.datas = null;
+}
+
+/**
+ * 获取数据类型
+ *
+ * @return {String}
+ */
+projectGLJ.prototype.getSourceType = function() {
+    let sourceType = ModuleNames.projectGLJ;
+    return sourceType;
+};
+
+/**
+ * project中调用
+ *
+ * @return {void}
+ */
+projectGLJ.prototype.createNew =  function() {
+    this.project.registerModule(ModuleNames.projectGLJ, this);
+};
+
+/**
+ * 加载数据
+ *
+ * @return {void}
+ */
+projectGLJ.prototype.loadData = function (datas) {
+    this.datas = datas;
+};

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

@@ -310,7 +310,8 @@ var ration_glj = {
                 market_price:newVal,
                 code:recode.code,
                 name:recode.name,
-                project_id:recode.projectID
+                project_id:recode.projectID,
+                repositoryId:recode.repositoryId
             };
          /*   code: '01010101',
                 market_price: '40',

+ 3 - 2
web/building_saas/main/js/views/fee_rate_view.js

@@ -236,7 +236,7 @@ var feeRateObject={
         }
     },
     getFeeRateStandards:function (callback) {
-        CommonAjax.post('/feeRates/getFeeRateStandards', {"rootProjectID": this.activateFeeRate.rootProjectID}, function (data) {
+        CommonAjax.post('/feeRates/getFeeRateStandards', {"projectID": projectObj.project.ID()}, function (data) {
             if (data) {
                 callback(data);
             }
@@ -247,6 +247,7 @@ var feeRateObject={
             feeRateObject.createSpreadView();
             feeRateObject.loadPageContent();
             projectObj.project.FeeRate.synchronizeFeeRate();
+            subRateObject.destorySpreadView();
         };
         projectObj.project.FeeRate.changeFeeRateStandard(newVal,callback);
     },
@@ -291,7 +292,7 @@ var feeRateObject={
         $('#currentOptions').val(projectObj.project.FeeRate.getActivateFeeRateID());
         $('#otherProject').empty();
         _.forEach(data.others,function (p) {
-            var option =  $("<option>").val(p.projectID).text(p.name);
+            var option =  $("<option>").val(p.ID).text(p.name);
             $('#otherProject').append(option);
         });
         $('#otherFeeRateOption').empty();

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

@@ -35,7 +35,7 @@ var gljOprObj = {
             lockedCells: [{row: -1, col: 3, rowCount: -1, colCount: 1}],
             lockColumns:[0,1,2,3,4,5,7,8,9,10,12]
         },
-        notEditedType: ['混凝土','砂浆','配合比','机械']
+        notEditedType: ['砼','桨','配比','机']
     },
     coeSetting:{
         header:[

+ 51 - 0
web/building_saas/main/js/views/main_tree_col.js

@@ -86,3 +86,54 @@ let MainTreeCol = {
         }
     }
 };
+
+let colSettingObj = {
+    settingSpread: null,
+    checkBox: new GC.Spread.Sheets.CellTypes.CheckBox(),
+    loadSetting: function (sheet, setting) {
+        sheet.setColumnCount(setting.cols.length);
+        sheet.setRowCount(setting.headRows, GC.Spread.Sheets.SheetArea.colHeader);
+        sheet.setRowCount(1);
+        sheet.getRange(0, -1, 1, -1).cellType(this.checkBox).hAlign(GC.Spread.Sheets.HorizontalAlign.center);
+
+        setting.headRowHeight.forEach(function (rowHeight, index) {
+            sheet.setRowHeight(index, rowHeight, GC.Spread.Sheets.SheetArea.colHeader);
+        });
+        setting.cols.forEach(function (col, index) {
+            let i, iRow = 0, cell;
+            for (i = 0; i < col.head.spanCols.length; i++) {
+                if (col.head.spanCols[i] !== 0) {
+                    cell = sheet.getCell(iRow, index, GC.Spread.Sheets.SheetArea.colHeader);
+                    cell.value(col.head.titleNames[i]).font(col.head.font).hAlign(col.head.hAlign[i]).vAlign(col.head.vAlign[i]).wordWrap(true);
+                }
+                if (col.head.spanCols[i] > 1 || col.head.spanRows[i] > 1) {
+                    sheet.addSpan(iRow, index, col.head.spanRows[i], col.head.spanCols[i], GC.Spread.Sheets.SheetArea.colHeader);
+                }
+                iRow += col.head.spanRows[i];
+            };
+            sheet.setColumnWidth(index, col.width);
+            cell = sheet.getCell(0, index).value(col.visible);
+        });
+    },
+    initSettingSpread: function () {
+        this.settingSpread = SheetDataHelper.createNewSpread($('#col_setting_spread')[0], {sheetCount: 1});
+        this.settingSpread.options.showScrollTip = GC.Spread.Sheets.ShowScrollTip.horizontal;
+        this.loadSetting(this.settingSpread.getActiveSheet(), projectObj.project.projSetting.main_tree_col);
+    }
+};
+
+$('#column').on('shown.bs.modal', function () {
+    if (!colSettingObj.settingSpread) {
+        colSettingObj.initSettingSpread();
+    }
+});
+
+$('#column').on('hide.bs.modal', function () {
+    let sheet = colSettingObj.settingSpread.getActiveSheet();
+    for (let iCol = 0; iCol < sheet.getColumnCount(); iCol ++) {
+        projectObj.project.projSetting.main_tree_col.cols[iCol].visible = sheet.getValue(0, iCol);
+        projectObj.project.projSetting.mainGridSetting.cols[iCol].visible = sheet.getValue(0, iCol);
+    }
+    SheetDataHelper.refreshColumnVisible(projectObj.project.projSetting.mainGridSetting, projectObj.mainSpread.getActiveSheet());
+    projectObj.project.pushNow('editColSetting', projectObj.project.projSetting.moduleName, {projectID: projectObj.project.ID(), main_tree_col: projectObj.project.projSetting.main_tree_col});
+})

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

@@ -91,8 +91,11 @@ var projectObj = {
         this.project = PROJECT.createNew(scUrlUtil.GetQueryString('project'), userID);
         this.project.loadDatas(function (err) {
             if (!err) {
-                TREE_SHEET_HELPER.initSetting($('#billsSpread')[0], BillsGridSetting);
-                BillsGridSetting.cols.forEach(function (col) {
+                let str = JSON.stringify(that.project.projSetting.main_tree_col);
+                that.project.projSetting.mainGridSetting = JSON.parse(str);
+                that.project.projSetting.mainGridSetting.frozenCols = 4;
+                TREE_SHEET_HELPER.initSetting($('#billsSpread')[0], that.project.projSetting.mainGridSetting);
+                that.project.projSetting.mainGridSetting.cols.forEach(function (col) {
                     col.data.splitFields = col.data.field.split('.');
                     if (col.data.getText && Object.prototype.toString.apply(col.data.getText) === "[object String]") {
                         col.data.getText = MainTreeCol.getEvent(col.data.getText);
@@ -109,7 +112,7 @@ var projectObj = {
                         col.data.formatter = MainTreeCol.getNumberFormatter(col.data.decimal);
                     }
                 });
-                that.mainController = TREE_SHEET_CONTROLLER.createNew(that.project.mainTree, that.mainSpread.getActiveSheet(), BillsGridSetting);
+                that.mainController = TREE_SHEET_CONTROLLER.createNew(that.project.mainTree, that.mainSpread.getActiveSheet(), that.project.projSetting.mainGridSetting);
                 that.mainController.showTreeData();
                 that.mainController.bind('refreshBaseActn', function (tree) {
                     var setButtonValid = function (valid, btn) {
@@ -403,3 +406,4 @@ $('#downMove').click(function () {
         controller.downMove();
     }
 });
+

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

@@ -183,7 +183,7 @@
                 <div class="row">
                     <div class="col-md-6">
                         <legend>单价文件</legend>
-                        <table class="table table-bordered table-hover table-sm">
+                        <table class="table table-bordered table-hover table-sm" id="summary-project-unit-price-table">
                             <thead><th></th><th>名称</th></thead>
                             <tbody>
                             <tr><td>1</td><td>A单价文件</td></tr>
@@ -194,7 +194,7 @@
                     </div>
                     <div class="col-md-6">
                         <legend>费率文件</legend>
-                        <table class="table table-bordered table-hover table-sm">
+                        <table class="table table-bordered table-hover table-sm" id="summary-project-fee-table">
                             <thead><th></th><th>名称</th></thead>
                             <tbody>
                             <tr><td>1</td><td>A费率文件</td></tr>
@@ -366,7 +366,7 @@
                     </div>
                     <div class="form-group hidden-area">
                         <label>费率文件</label>
-                        <select class="form-control" id="tender-fee-rate"><option value="">请选择费率文件</option></select>
+                        <select class="form-control" id="tender-fee-rate"><option value="">新建费率文件</option></select>
                     </div>
                     <div class="form-group">
                         <label>计价方式</label>

+ 109 - 10
web/building_saas/pm/js/pm_main.js

@@ -249,7 +249,8 @@ $(document).ready(function() {
 
         // 获取单价文件数据
         getUnitFile(projectInfo.data.ID);
-
+        // 获取费率文件数据
+        getFeeRateFile(projectInfo.data.ID);
     });
 
     // 新增单位工程
@@ -536,14 +537,9 @@ $(document).ready(function() {
             return false;
         }
         // 输出数据到页面
-        let feeHtml = '<option>请选择费率文件</option>';
         if (currentLib.fee_lib !== undefined && currentLib.fee_lib.length > 0) {
-            for (let fee of currentLib.fee_lib) {
-                feeHtml += '<option value="'+ fee.id +'">'+ fee.name +'</option>';
-            }
+            $("#tender-fee-rate").children("option").first().val("newFeeRate-"+currentLib.fee_lib[0].id);
         }
-        $("#tender-fee-rate").html(feeHtml);
-
         $(this).parent().siblings('.hidden-area').slideDown('fast');
     });
 });
@@ -554,6 +550,9 @@ $(document).ready(function() {
  * @return {void}
  */
 function init() {
+    billValuation = billValuation.replace(/\n/g, '\\n');
+    rationValuation = rationValuation.replace(/\n/g, '\\n');
+
     let table = $('#ProjTree');
     $('thead', table).remove();
     $('tbody', table).remove();
@@ -720,11 +719,13 @@ function AddTender() {
         }
 
         let unitPriceFile = $("#unit-price").val();
+        let unitPriceName = unitPriceFile !== '' ? $("#unit-price").children("option:selected").text() : name;
 
         let feeFile = $("#tender-fee-rate").val();
         if (feeFile === '') {
             throw '请选择费率文件';
         }
+        let feeFileName = $("#tender-fee-rate").children("option:selected").text();
 
         let valuation = $("#tender-valuation").val();
         let valuationName = $("#tender-valuation").children("option:selected").text();
@@ -762,8 +763,8 @@ function AddTender() {
             engineering: engineering,
             engineering_id: engineering_id,
             engineeringName: engineeringName,
-            unitPriceFile: unitPriceFile,
-            feeFile: feeFile
+            unitPriceFile: {name: unitPriceName, id: unitPriceFile},
+            feeFile: {name: feeFileName, id: feeFile}
         };
         // 如果选择的是单项工程则新增同级数据
         if (selectedItem !== null && selectedItem.data.projType === projectType.tender) {
@@ -820,6 +821,15 @@ function AddFolder() {
 function GetUpdateData(parent, next, name, property, newId, type) {
     let data = [];
     let updateData = {};
+
+    if(type.projectType== projectType.tender){
+        let rootProject = parent ? parent.parent : Tree._root;
+        let rootProjectID = rootProject ? rootProject.id() : -1;
+        if(property){
+            property.rootProjectID=rootProjectID;
+        }
+    }
+
     updateData['updateType'] = type.updateType === undefined ? 'new' : type.updateType;
     updateData['updateData'] = {};
     if (newId !== '') {
@@ -830,7 +840,8 @@ function GetUpdateData(parent, next, name, property, newId, type) {
     if (name !== '') {
         updateData['updateData']['name'] = name;
     }
-    if (property !== undefined) {
+    if (property !== null && property !== undefined) {
+        property.rootProjectID = rootProjectID;
         updateData['updateData']['property'] = property;
     }
     if (type !== null && type.projectType !== null) {
@@ -1089,6 +1100,7 @@ function getUnitFile(parentID) {
                 for(let tmp of response.data) {
                     unitFileHtml += '<option value="'+ tmp.id +'">'+ tmp.name +'</option>';
                 }
+                $("#unit-price").children("option:not(':first')").remove();
                 $("#unit-price").children("option").first().after(unitFileHtml);
             }
         }
@@ -1097,6 +1109,50 @@ function getUnitFile(parentID) {
 }
 
 /**
+ * 获取费率文件
+ *
+ * @param {Number} parentID
+ * @return {void}
+ */
+function getFeeRateFile(parentID) {
+    parentID = parseInt(parentID);
+    if (isNaN(parentID) && parentID <= 0) {
+        return;
+    }
+
+    $.ajax({
+        url: '/pm/api/getFeeRateFile',
+        type: 'post',
+        data: {'data': JSON.stringify({"user_id": userID, "parentID": parentID})},
+        dataType: 'json',
+        error: function() {
+            alert('数据传输错误!');
+        },
+        beforeSend: function() {
+
+        },
+        success: function(response) {
+            if (response.error === 1) {
+                alert('获取失败!');
+            } else {
+                if (response.data.length <= 0) {
+                    return false;
+                }
+                var first = $("#tender-fee-rate").children("option").first();
+                $("#tender-fee-rate").empty();
+                $("#tender-fee-rate").append(first);
+                for(let tmp of response.data) {
+                    var option =  $("<option>").val(tmp.ID).text(tmp.name);
+                    $("#tender-fee-rate").append(option);
+                }
+            }
+        }
+    });
+
+}
+
+
+/**
  * 加载数据到侧边栏
  *
  * @return {void}
@@ -1139,4 +1195,47 @@ function setDataToSideBar() {
         '</tr>';
     $(target + '-table tbody').html(html);
 
+    // 加载单价文件与费率文件
+    if (selectedItem.data.projType === projectType.project) {
+        let engineeringData = selectedItem.children !== null && selectedItem.children.children !== null ?
+            selectedItem.children : [];
+        if (engineeringData.length <= 0) {
+            return;
+        }
+        let unitPriceFileHtml = '';
+        let feeFileHtml = '';
+        let unitPriceFileCounter = 1;
+        let feeFileCounter = 1;
+        let unitPriceFileList = [];
+        let feeFileList = [];
+        for(let engineering of engineeringData) {
+            let tenderData = engineering.children !== null ? engineering.children : [];
+            if (tenderData.length <= 0) {
+                continue;
+            }
+            for(let tmp of tenderData) {
+                tmp = tmp.data.property !== null ? tmp.data.property : null;
+                if(tmp === null) {
+                    continue;
+                }
+
+                if (tmp.feeFile !== undefined && feeFileList.indexOf(tmp.feeFile.name) < 0) {
+                    feeFileHtml += '<tr><td>'+ unitPriceFileCounter +'</td><td>'+ tmp.feeFile.name +'</td></tr>';
+                    feeFileCounter++;
+                    feeFileList.push(tmp.feeFile.name);
+                }
+
+                if (tmp.unitPriceFile !== undefined && unitPriceFileList.indexOf(tmp.unitPriceFile.name) < 0) {
+                    unitPriceFileHtml += '<tr><td>'+ unitPriceFileCounter +'</td><td>'+ tmp.unitPriceFile.name +'单价文件</td></tr>';
+                    unitPriceFileCounter++;
+                    unitPriceFileList.push(tmp.unitPriceFile.name);
+                }
+            }
+
+            $(target + '-unit-price-table tbody').html(unitPriceFileHtml);
+            $(target + '-fee-table tbody').html(feeFileHtml);
+        }
+
+    }
+
 }