Selaa lähdekoodia

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

zhangweicheng 7 vuotta sitten
vanhempi
commit
bbb1bd2c64

+ 27 - 6
modules/main/facade/prj_properties_facade.js

@@ -3,33 +3,54 @@
  */
 let mongoose = require("mongoose");
 let prj_prop_mdl = mongoose.model("project_property");
+let std_prj_prop_mdl = mongoose.model("cfg_prj_property");
 
 module.exports = {
     createPrjProperties: createPrjProperties,
-    removeProperty : removeProperty,
+    removePrjProperties : removePrjProperties,
     updateWhole: updateWhole,
     updateOneProperty: updateOneProperty,
     addOrChangeProperty: addOrChangeProperty,
     removeOneProperty: removeOneProperty,
+    getPrjProperty: getPrjProperty,
+
+    createStdPrjProperties: createStdPrjProperties,
+    getStdPrjProperties: getStdPrjProperties,
 
     createPrjPropertiesWithCallBack: createPrjPropertiesWithCallBack,
-    removePropertyWithCallBack: removePropertyWithCallBack,
+    removePrjPropertiesWithCallBack: removePrjPropertiesWithCallBack,
     updateWholeWithCallBack: updateWholeWithCallBack,
     updateOnePropertyWithCallBack: updateOnePropertyWithCallBack,
     addOrChangePropertyWithCallBack: addOrChangePropertyWithCallBack,
     removeOnePropertyWithCallBack: removeOnePropertyWithCallBack
 };
 
+async function createStdPrjProperties(rationLibId, items) {
+    let data = {};
+    data.rationLibID = rationLibId;
+    data.properties = items;
+    let rst = await  std_prj_prop_mdl.create(data);
+    return rst;
+}
+
+async function getStdPrjProperties(rationLibId) {
+    let rst = await  std_prj_prop_mdl.findOne({"rationLibID": rationLibId});
+    return rst;
+}
+
+async function getPrjProperty(prjId) {
+    let rst = await  prj_prop_mdl.findOne({"projectID": prjId});
+    return rst;
+}
 async function createPrjProperties(prjId, dftItems) {
     let data = {};
     data.projectID = prjId;
     data.properties = dftItems;
-    let saveObj = new prj_prop_mdl(data);
-    let rst = await  saveObj.save();
+    let rst = await  prj_prop_mdl.create(data);
     return rst;
 };
 
-async function removeProperty(prjId) {
+async function removePrjProperties(prjId) {
     let rst = await  prj_prop_mdl.remove({'projectID': prjId});
     return rst;
 };
@@ -75,7 +96,7 @@ function createPrjPropertiesWithCallBack(prjId, dftItems, cb) {
     saveObj.save(cb);
 };
 
-function removePropertyWithCallBack(prjId, cb) {
+function removePrjPropertiesWithCallBack(prjId, cb) {
     prj_prop_mdl.remove({'projectID': prjId}, cb);
 }
 

+ 23 - 7
modules/main/models/prj_properties.js

@@ -63,17 +63,33 @@
 // module.exports = new projectPropertiesDAO();
 
 let mongoose = require('mongoose');
-// let propertyDetailSchema = new mongoose.Schema({
-//     key: String,
-//     dispName: String,
-//     value: String
-// });
+let propertyDetailSchema = new mongoose.Schema({
+    key: String,
+    dispName: String,
+    value: String
+});
 
 let prj_property = new mongoose.Schema({
     projectID: Number,
-    properties: Array
+    properties: Array  //原则上是应该设置好对象的属性,但在实际应用中发现mongoose保存的时候会自动增加objectId(_id)字段,无语。。。
+    // properties: [{
+    //     key: String,
+    //     dispName: String,
+    //     value: String
+    // }]
+}, {versionKey: false});
+
+//预储存的项目属性,在项目创建的时候copy一份到项目中
+let cfg_property = new mongoose.Schema({
+    rationLibID: Number,      //这个对应标准定额库ID
+    descr: String,      //描述
+    properties: [propertyDetailSchema]
 }, {versionKey: false});
 
 let prj_prop_mdl = mongoose.model('project_property', prj_property, 'prj_properties');
+let std_prj_prop_mdl = mongoose.model('cfg_prj_property', cfg_property, 'std_cfg_prj_properties');
 
-module.exports = prj_prop_mdl;
+module.exports = {
+    prj_prop_mdl: prj_prop_mdl,
+    std_prj_prop_mdl: std_prj_prop_mdl
+};

+ 38 - 7
modules/reports/controllers/rpt_controller.js

@@ -7,7 +7,8 @@ let mongoose = require('mongoose');
 let JV = require('../rpt_component/jpc_value_define');
 
 let Template = mongoose.model('rpt_templates');
-let demoTemplateData = mongoose.model('rpt_temp_tpl_data');
+let rptTplFacade = require('../facade/rpt_template_facade');
+let demoTemplateFacade = require('../facade/rpt_tpl_data_demo_facade');
 
 let JpcEx = require('../rpt_component/jpc_ex');
 let rptUtil = require("../util/rpt_util");
@@ -26,14 +27,13 @@ let callback = function(req, res, err, data){
     }
 };
 
-function getAllPagesCommon(req, res, rpt_id, pageSize, cb) {
+function getAllPagesCommonOrg(req, res, rpt_id, pageSize, cb) {
     let rptTpl = null;
-    Template.findOne({ID: rpt_id}, '-_id').exec().then(function(rst) {
+    rptTplFacade.getRptTemplate(rpt_id).then(function(rst) {
         rptTpl = rst;
         if (rptTpl) {
             if (rptTpl.ID_KEY) {
-                //return demoTemplateData.getPromise(rptTpl.ID_KEY);
-                return demoTemplateData.findOne({"Data_Key": rptTpl.ID_KEY}).exec();
+                return demoTemplateFacade.getDemoData(rptTpl.ID_KEY);
             } else {
                 callback(req, res, 'No report template data were found!', null);
             }
@@ -61,11 +61,42 @@ function getAllPagesCommon(req, res, rpt_id, pageSize, cb) {
     );
 };
 
+function getAllPagesCommon(req, res, rpt_id, pageSize, cb) {
+    let rptTpl = null;
+    rptTplFacade.getRptTemplate(rpt_id).then(function(rst) {
+        rptTpl = rst;
+        if (rptTpl) {
+            let tplData = {};
+            if (rptTpl[JV.NODE_FIELD_MAP]) {
+                //1. 离散数据
+                if (rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DISCRETE_FIELDS] && rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DISCRETE_FIELDS].leng > 0) {
+                    tplData[JV.DATA_DISCRETE_DATA] = [];
+                }
+                //2. 主数据
+                if (rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS] && rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS].leng > 0) {
+                    tplData[JV.DATA_MASTER_DATA] = [];
+                }
+                //3. 从数据
+                if (rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS] && rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS].leng > 0) {
+                    tplData[JV.DATA_DETAIL_DATA] = [];
+                }
+                //return demoTemplateData.getPromise(rptTpl.ID_KEY);
+                //return demoTemplateData.findOne({"Data_Key": rptTpl.ID_KEY}).exec();
+
+            } else {
+                callback(req, res, 'No report template data were found!', null);
+            }
+        } else {
+            callback(req, res, 'No report template was found!', null);
+        }
+    })
+};
+
 module.exports = {
     getReportAllPages: function(req, res){
         let rpt_id = req.body.ID;
         let pageSize = req.body.pageSize;
-        getAllPagesCommon(req, res, rpt_id, pageSize, function(pageRst){
+        getAllPagesCommonOrg(req, res, rpt_id, pageSize, function(pageRst){
             //fs.writeFileSync('D:/GitHome/ConstructionOperation/tmp/testRpt.js', JSON.stringify(pageRst));
             callback(req, res, null, pageRst);
         })
@@ -76,7 +107,7 @@ module.exports = {
             rptName = req.params.rptName,
             isOneSheet = req.params.isOneSheet;
         ;
-        getAllPagesCommon(req, res, rpt_id, pageSize, function(pageRst){
+        getAllPagesCommonOrg(req, res, rpt_id, pageSize, function(pageRst){
             rpt_xl_util.exportExcel(pageRst, pageSize, rptName, isOneSheet, function(newName){
                 res.setHeader('Content-Type', 'application/vnd.openxmlformats');
                 res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".xlsx");

+ 15 - 0
modules/reports/facade/rpt_template_facade.js

@@ -0,0 +1,15 @@
+/**
+ * Created by Tony on 2017/8/9.
+ */
+let mongoose = require("mongoose");
+let rpt_tpl_mdl = mongoose.model("rpt_templates");
+
+module.exports = {
+    getRptTemplate: getRptTemplate
+};
+
+async function getRptTemplate(tplId) {
+    //console.log('templateId: ' + parseInt(tplId));
+    let rst = await  rpt_tpl_mdl.findOne({"ID": parseInt(tplId)}, '-_id');
+    return rst;
+}

+ 14 - 0
modules/reports/facade/rpt_tpl_data_demo_facade.js

@@ -0,0 +1,14 @@
+/**
+ * Created by Tony on 2017/8/9.
+ */
+let mongoose = require("mongoose");
+let rpt_tpl_data_demo_mdl = mongoose.model("rpt_temp_tpl_data");
+
+module.exports = {
+    getDemoData: getDemoData
+};
+
+async function getDemoData(dataKey) {
+    let rst = await  rpt_tpl_data_demo_mdl.findOne({"Data_Key": dataKey});
+    return rst;
+}

+ 6 - 0
modules/reports/facade/rpt_tpl_data_facade.js

@@ -0,0 +1,6 @@
+/**
+ * Created by Tony on 2017/8/9.
+ */
+
+let mongoose = require("mongoose");
+let rpt_tpl_mdl = mongoose.model("rpt_templates");

+ 6 - 5
modules/reports/models/rpt_mapping_field.js

@@ -4,14 +4,15 @@
 let mongoose = require('mongoose');
 let MapFieldSchema = new mongoose.Schema({
     "fieldMapGrpName" : String,
-    "dispName": String,
+    "Name": String,
     "remark" : String,
     "seq" : Number,
     "items" : [{
-        mapId: Number,
-        dispName: String,
-        mapExpression: String,
-        descr: String
+        "ID": Number,
+        "Name": String,
+        "mapExpression": String,
+        "adHocFormula": {"run_type": String, "expression": String, "format": String},
+        "descr": String
     }]
 });
 

+ 220 - 131
test/unit/main/prj_properties_test.js

@@ -7,139 +7,228 @@ let dbm = require("../../../config/db/db_manager");
 require('../../../modules/main/models/prj_properties');
 let ppFacade = require('../../../modules/main/facade/prj_properties_facade');
 
-//let randomPrjId = Math.round(Math.random() * 100);
-let randomPrjId = 35;
+let rationLibId = 3;
+let randomPrjId = Math.round(Math.random() * 100);
+//let randomPrjId = 35;
 dbm.connect();
 
-// test('测试 - 创建dummy项目属性: ', function (t) {
-//     let items = [];
-//     items.push({key: "contractNum", dispName: "合同号", value: "天字第一号"});
-//     items.push({key: "appType", dispName: "工程专业", value: "建筑工程"});
-//     items.push({key: "constructType", dispName: "工程类别", value: "住宅"});
-//     items.push({key: "startDate", dispName: "建设日期", value: "2017-07-31"});
-//     items.push({key: "owner", dispName: "建设单位", value: "珠海纵横创新"});
-//     items.push({key: "designer", dispName: "设计单位", value: "珠海设计局"});
-//     items.push({key: "builder", dispName: "施工单位", value: "中建十局"});
-//
-//     let results = ppFacade.createPrjProperties(randomPrjId, items);
-//     results.then(function(rst) {
-//         console.log('rst.projectID: ' + rst.projectID);
-//         for (let prop of rst.properties) {
-//             console.log('property ' + prop.dispName + ': ' + prop.value);
-//         }
-//         t.pass('just pass!');
-//         t.end();
-//     });
-// });
-
-// test('测试 - 整个更新项目属性: ', function (t) {
-//     let items = [];
-//     items.push({key: "contractNum", dispName: "合同号", value: "人字第三号"});
-//     items.push({key: "appType", dispName: "工程专业", value: "建筑工程"});
-//     items.push({key: "constructType", dispName: "工程类别", value: "住宅"});
-//     items.push({key: "startDate", dispName: "建设日期", value: "2017-08-01"});
-//     items.push({key: "owner", dispName: "建设单位", value: "珠海纵横创新"});
-//     items.push({key: "designer", dispName: "设计单位", value: "珠海设计局"});
-//     items.push({key: "builder", dispName: "施工单位", value: "中建十局"});
-//
-//     let udtObj = {"projectID": 35, "properties": items};
-//
-//     let rst = ppFacade.updateWhole(udtObj);
-//     if (rst) {
-//         rst.then(function(results){
-//             for (let prop in results) {
-//                 console.log(prop + ': ' + results[prop]);
-//             }
-//             t.pass('just pass!');
-//             t.end();
-//         });
-//     } else {
-//         console.log('update failed!');
-//         t.pass('just pass!');
-//         t.end();
-//     }
-// });
-
-// test('测试 - 新增项目属性: ', function (t) {
-//     let newItem = {key: "auditor", dispName: "监理单位", value: "珠海德信"};
-//     let results = ppFacade.addOrChangeProperty(35, newItem);
-//     if (results instanceof Promise) {
-//         results.then(function (rst) {
-//             for (let prop in rst) {
-//                 console.log("property " + prop + ' : ' + rst[prop]);
-//             }
-//         })
-//     } else {
-//         for (let prop in results) {
-//             console.log("property " + prop + ' : ' + results[prop]);
-//         }
-//     }
-//
-//     t.pass('just pass!');
-//     t.end();
-//
-// });
-
-// test('测试 - 删除全体项目属性: ', function (t) {
-//     let rst = ppFacade.removeProperty(35);
-//     if (rst) {
-//         if (rst instanceof Promise) {
-//             rst.then(function(results){
-//                 for (let prop in results) {
-//                     console.log(prop + ': ' + results[prop]);
-//                 }
-//                 t.pass('just pass with remove1!');
-//                 t.end();
-//             });
-//         } else {
-//             for (let prop in results) {
-//                 console.log(prop + ': ' + results[prop]);
-//             }
-//             t.pass('just pass with remove2!');
-//             t.end();
-//         }
-//     } else {
-//         t.pass('just pass but not remove!');
-//         t.end();
-//     }
-// });
-
-// test('测试 - 更新项目属性: ', function (t) {
-//     let rst = ppFacade.updateOneProperty(35, "builder", "中建十一局");
-//     if (rst) {
-//         rst.then(function(results){
-//             for (let prop in results) {
-//                 console.log(prop + ': ' + results[prop]);
-//             }
-//             t.pass('just pass with update!');
-//             t.end();
-//         });
-//     } else {
-//         t.pass('just pass but not update!');
-//         t.end();
-//     }
-// });
-
-// test('测试 - 移除一项属性: ', function (t) {
-//     let rst = ppFacade.removeOneProperty(35, "auditor");
-//     if (rst) {
-//         rst.then(function(results){
-//             for (let prop in results) {
-//                 console.log(prop + ': ' + results[prop]);
-//             }
-//             t.pass('just pass with remove!');
-//             t.end();
-//         });
-//     } else {
-//         t.pass('just pass but not remove!');
-//         t.end();
-//     }
-// });
+/*
+test('测试 - 创建dummy项目属性: ', function (t) {
+    let items = [];
+    items.push({key: "contractNum", dispName: "合同号", value: "天字第一号"});
+    items.push({key: "appType", dispName: "工程专业", value: "建筑工程"});
+    items.push({key: "constructType", dispName: "工程类别", value: "住宅"});
+    items.push({key: "startDate", dispName: "开工日期", value: "2017-07-31"});
+    items.push({key: "completeDate", dispName: "竣工日期", value: "2018-07-31"});
+    items.push({key: "location", dispName: "工程地点", value: "珠海新香洲人民西路666号"});
+    items.push({key: "owner", dispName: "建设单位", value: "珠海纵横创新"});
+    items.push({key: "designCompany", dispName: "设计单位", value: "珠海设计局"});
+    items.push({key: "buildingCompany", dispName: "施工单位", value: "中建十局"});
+    items.push({key: "superviseCompany", dispName: "监理单位", value: "珠海监理"});
+    items.push({key: "auditCompany", dispName: "审核单位", value: "创新审核"});
+    items.push({key: "author", dispName: "编制人", value: "张三"});
+    items.push({key: "auditor", dispName: "审核人", value: "李四"});
 
-test('close the connection', function (t) {
-    setTimeout(function () {
-        mongoose.disconnect();
-        t.pass('closing db connection');
+    let results = ppFacade.createPrjProperties(randomPrjId, items);
+    results.then(function(rst) {
+        console.log('rst.projectID: ' + rst.projectID);
+        for (let prop of rst.properties) {
+            console.log('property ' + prop.dispName + ': ' + prop.value);
+        }
+        t.pass('just pass!');
+        t.end();
+    });
+});
+//*/
+
+/*
+test('测试 - 创建dummy标准项目属性: ', function (t) {
+    let items = [];
+    items.push({key: "contractNum", dispName: "合同号", value: "天字第一号"});
+    items.push({key: "appType", dispName: "工程专业", value: "建筑工程"});
+    items.push({key: "constructType", dispName: "工程类别", value: "住宅"});
+    items.push({key: "startDate", dispName: "开工日期", value: "2017-07-31"});
+    items.push({key: "completeDate", dispName: "竣工日期", value: "2018-07-31"});
+    items.push({key: "location", dispName: "工程地点", value: "珠海新香洲人民西路666号"});
+    items.push({key: "owner", dispName: "建设单位", value: "珠海纵横创新"});
+    items.push({key: "designCompany", dispName: "设计单位", value: "珠海设计局"});
+    items.push({key: "buildingCompany", dispName: "施工单位", value: "中建十局"});
+    items.push({key: "superviseCompany", dispName: "监理单位", value: "珠海监理"});
+    items.push({key: "auditCompany", dispName: "审核单位", value: "创新审核"});
+    items.push({key: "author", dispName: "编制人", value: "张三"});
+    items.push({key: "auditor", dispName: "审核人", value: "李四"});
+
+    let results = ppFacade.createStdPrjProperties(rationLibId, items);
+    results.then(function(rst) {
+        console.log('rst.projectID: ' + rst.projectID);
+        for (let prop of rst.properties) {
+            console.log('property ' + prop.dispName + ': ' + prop.value);
+        }
+        t.pass('just pass!');
+        t.end();
+    });
+});
+//*/
+
+/*
+test('测试 - 整个更新项目属性: ', function (t) {
+    let items = [];
+    items.push({key: "contractNum", dispName: "合同号", value: "人字第三号"});
+    items.push({key: "appType", dispName: "工程专业", value: "建筑工程"});
+    items.push({key: "constructType", dispName: "工程类别", value: "住宅"});
+    items.push({key: "startDate", dispName: "建设日期", value: "2017-08-01"});
+    items.push({key: "owner", dispName: "建设单位", value: "珠海纵横创新"});
+    items.push({key: "designCompany", dispName: "设计单位", value: "珠海设计局"});
+    items.push({key: "buildingCompany", dispName: "施工单位", value: "中建十局"});
+
+    let udtObj = {"projectID": 35, "properties": items};
+
+    let rst = ppFacade.updateWhole(udtObj);
+    if (rst) {
+        rst.then(function(results){
+            for (let prop in results) {
+                console.log(prop + ': ' + results[prop]);
+            }
+            t.pass('just pass!');
+            t.end();
+        });
+    } else {
+        console.log('update failed!');
+        t.pass('just pass!');
         t.end();
-    }, 1500);
+    }
+});
+//*/
+
+/*
+test('测试 - 新增项目属性: ', function (t) {
+    let newItem = {key: "superviseCompany", dispName: "监理单位", value: "珠海德信"};
+    let results = ppFacade.addOrChangeProperty(35, newItem);
+    if (results instanceof Promise) {
+        results.then(function (rst) {
+            for (let prop in rst) {
+                console.log("property " + prop + ' : ' + rst[prop]);
+            }
+        })
+    } else {
+        for (let prop in results) {
+            console.log("property " + prop + ' : ' + results[prop]);
+        }
+    }
+
+    t.pass('just pass!');
+    t.end();
+
+});
+//*/
+
+/*
+test('测试 - 删除全体项目属性: ', function (t) {
+    let rst = ppFacade.removePrjProperties(35);
+    if (rst) {
+        if (rst instanceof Promise) {
+            rst.then(function(results){
+                for (let prop in results) {
+                    console.log(prop + ': ' + results[prop]);
+                }
+                t.pass('just pass with remove1!');
+                t.end();
+            });
+        } else {
+            for (let prop in results) {
+                console.log(prop + ': ' + results[prop]);
+            }
+            t.pass('just pass with remove2!');
+            t.end();
+        }
+    } else {
+        t.pass('just pass but not remove!');
+        t.end();
+    }
+});
+//*/
+
+/*
+test('测试 - 更新项目属性: ', function (t) {
+    let rst = ppFacade.updateOneProperty(35, "buildingCompany", "中建十一局");
+    if (rst) {
+        rst.then(function(results){
+            for (let prop in results) {
+                console.log(prop + ': ' + results[prop]);
+            }
+            t.pass('just pass with update!');
+            t.end();
+        });
+    } else {
+        t.pass('just pass but not update!');
+        t.end();
+    }
+});
+//*/
+
+/*
+test('测试 - 获取项目属性: ', function (t) {
+    let rst = ppFacade.getPrjProperty(35);
+    if (rst) {
+        rst.then(function(results){
+            console.log(results.projectID);
+            console.log(results.properties);
+            t.pass('just pass with update!');
+            t.end();
+        });
+    } else {
+        t.pass('just pass but not update!');
+        t.end();
+    }
+});
+//*/
+
+/*
+test('测试 - 获取标准项目属性: ', function (t) {
+    let rst = ppFacade.getStdPrjProperties(rationLibId);
+    if (rst) {
+        rst.then(function(results){
+            // console.log(results.rationLibID);
+            // console.log(results.properties);
+            let rt = ppFacade.createPrjProperties(randomPrjId, results.properties);
+            rt.then(function (rt1) {
+                console.log('创建后ID: '+ rt1.projectID);
+            })
+            t.pass('just pass with update!');
+            t.end();
+        });
+    } else {
+        t.pass('just pass but not update!');
+        t.end();
+    }
+});
+//*/
+
+/*
+test('测试 - 移除一项属性: ', function (t) {
+    let rst = ppFacade.removeOneProperty(35, "superviseCompany");
+    if (rst) {
+        rst.then(function(results){
+            for (let prop in results) {
+                console.log(prop + ': ' + results[prop]);
+            }
+            t.pass('just pass with remove!');
+            t.end();
+        });
+    } else {
+        t.pass('just pass but not remove!');
+        t.end();
+    }
+});
+//*/
+
+test('close the connection', function (t) {
+    // setTimeout(function () {
+    //     mongoose.disconnect();
+    //     t.pass('closing db connection');
+    //     t.end();
+    // }, 100);
+    mongoose.disconnect();
+    t.pass('closing db connection');
+    t.end();
 })

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

@@ -153,6 +153,9 @@
                                   <li class="nav-item">
                                       <a class="nav-link" id="linkDESM" data-toggle="tab" href="#subSpread" role="tab">定额说明</a>
                                   </li>
+                                  <li class="nav-item">
+                                      <a class="nav-link" id="linkJSCXGL" data-toggle="tab" href="#subSpread" role="tab">计算程序管理</a>
+                                  </li>
                               </ul>
                               <!-- Tab panes -->
                               <div class="tab-content">
@@ -547,6 +550,7 @@
     <script type="text/javascript" src="/web/building_saas/main/js/views/glj_view.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/views/ration_calc_view.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/views/sub_view.js"></script>
+    <script type="text/javascript" src="/web/building_saas/main/js/views/ration_programs_manage.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/views/fee_rate_view.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/views/sub_fee_rate_views.js"></script>
 

+ 18 - 0
web/building_saas/main/html/ration_pm.html

@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head lang="en">
+    <meta charset="UTF-8">
+    <title>计算程序管理</title>
+    <script src="/lib/jquery/jquery.min.js"></script>
+    <link rel="stylesheet" href="/lib/spreadjs/sheets/css/gc.spread.sheets.excel2013lightGray.10.0.1.css" type="text/css">
+    <script type="text/javascript" src="/lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
+    <script type="text/javascript" src="/public/web/sheet/sheet_common.js"></script>
+    <script type="text/javascript" src="/web/building_saas/main/js/models/ration_program.js"></script>
+    <script type="text/javascript" src="/web/building_saas/main/js/views/ration_programs_manage.js"></script>
+</head>
+<body>
+<div id="mainSpread" style="width:30%;height:400px;position:absolute;"></div>
+<div id="detailSpread" style="width:100%;height:400px;position:absolute;bottom:5px;"></div>
+
+</body>
+</html>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 3190 - 142
web/building_saas/main/js/models/ration_program.js


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

@@ -168,8 +168,8 @@ var projectObj = {
 
             }
         });
-        this.rationProgram = new RationProgram(this.project);
-        this.rationProgram.compileAllTemps();
+        this.project.rationProgram = new RationProgram(this.project);
+        this.project.rationProgram.compileAllTemps();
     },
     loadMainSpreadContextMenu: function () {
         var project = this.project, spread = this.mainSpread, controller = this.mainController;

+ 8 - 6
web/building_saas/main/js/views/ration_calc_view.js

@@ -4,7 +4,7 @@
 
 let rationCalcView = {
     sheet: null,
-    ration: null,
+    treeNode: null,
 
     setting: {
         header: [
@@ -29,17 +29,19 @@ let rationCalcView = {
         sheetCommonObj.initSheet(me.sheet, me.setting, 20);
     },
 
-    showData: function (ration) {
+    showData: function (treeNode) {
         var me = this;
-        me.ration = ration;
-        projectObj.rationProgram.calculate(me.ration);
-        me.datas = me.ration.data.calcTemplate.calcItems;
+        me.treeNode = treeNode;
+        projectObj.project.rationProgram.calculate(treeNode);
+        me.datas = me.treeNode.data.calcTemplate.calcItems;
+        //me.sheet.setRowCount(me.datas.length);
+        sheetCommonObj.initSheet(me.sheet, me.setting, me.datas.length);
         sheetCommonObj.showData(me.sheet, me.setting, me.datas);
     },
 
     clearData: function (){
         var me = this;
-        me.ration = null;
+        me.treeNode = null;
         sheetCommonObj.cleanSheet(me.sheet, me.setting, -1);
     }
 

+ 77 - 0
web/building_saas/main/js/views/ration_programs_manage.js

@@ -0,0 +1,77 @@
+/**
+ * Created by CSL on 2017-08-03.
+ * 计算程序管理。
+ */
+let rationPM = {
+    datas: [],
+    mainSpread: null,
+    detailSpread: null,
+
+    mainSetting: {
+        header:[
+            {headerName:"ID",headerWidth:80,dataCode:"ID", hAlign: "center"},
+            {headerName:"名称",headerWidth:200,dataCode:"name", dataType: "String"}
+        ],
+        view:{
+            comboBox:[],
+            lockColumns:[0,1]
+        }
+    },
+
+    detailSetting: {
+        header:[
+            {headerName:"ID",headerWidth:80,dataCode:"ID", hAlign: "center"},
+            {headerName:"费用代号",headerWidth:80,dataCode:"code", dataType: "String"},
+            {headerName:"费用名称",headerWidth:200,dataCode:"name", dataType: "String"},
+            {headerName:"计算基数",headerWidth:180,dataCode:"dispExpr", dataType: "String"},
+            {headerName:"基数说明",headerWidth:300,dataCode:"statement", dataType: "String"},
+            {headerName:"费率",headerWidth:80,dataCode:"feeRate", dataType: "Number"},
+            {headerName:"字段名称",headerWidth:180,dataCode:"fieldName", dataType: "String"},
+            {headerName:"备注",headerWidth:100,dataCode:"memo", dataType: "String"}
+        ],
+        view:{
+            comboBox:[],
+            lockColumns:[0,1,2,3,4,5,6,7]
+        }
+    },
+
+    buildSheet: function (){
+        let me = this;
+        me.datas = calcTemplates;
+        me.mainSpread = sheetCommonObj.buildSheet($('#mainSpread')[0], me.mainSetting, 16);
+        me.detailSpread = sheetCommonObj.buildSheet($('#detailSpread')[0], me.detailSetting, 18);
+
+        //var coeType = new GC.Spread.Sheets.CellTypes.ComboBox();
+        //coeType.items(["单个","定额","人工","材料","机械"]);
+        //me.detailSpread.getSheet(0).getRange(-1, 0, -1, 1).cellType(coeType);
+
+        me.mainSpread.options.showVerticalScrollbar = false;
+        me.detailSpread.options.showVerticalScrollbar = false;
+
+        me.mainSpread.getSheet(0).bind(GC.Spread.Sheets.Events.EnterCell, me.onMainEnterCell);
+        me.detailSpread.getSheet(0).bind(GC.Spread.Sheets.Events.CellChanged, me.onDetailCellChanged);
+
+        let mSheet = me.mainSpread.getSheet(0);
+        sheetCommonObj.showData(mSheet, me.mainSetting, me.datas);
+
+        let dSheet = me.detailSpread.getSheet(0);
+        sheetCommonObj.showData(dSheet, me.detailSetting, me.datas[0].calcItems);
+    },
+
+    onMainEnterCell: function(sender, args) {
+        var me = rationPM;
+        var row = args.sheet.getActiveRowIndex();
+
+        me.detailSpread.suspendPaint();
+        var dSheet = me.detailSpread.getSheet(0);
+        var dData = me.datas[row].calcItems;
+        sheetCommonObj.showData(dSheet, me.detailSetting, dData);
+        me.detailSpread.resumePaint();
+    }
+};
+
+$(document).ready(function(){
+    rationPM.buildSheet();
+});
+
+

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

@@ -82,6 +82,10 @@ $("#linkDESM").click(function(){
     subSpread.getActiveSheet().setValue(0, 0, "定额说明");
 });
 
+$("#linkJSCXGL").click(function(){
+    location.href = '/web/building_saas/main/html/ration_pm.html';
+});
+
 function SubActiveSheetNameIs(sheetName){
     let rst = subSpread.getActiveSheet().name() == sheetName;
     return rst;