ソースを参照

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

TonyKang 8 年 前
コミット
943e5f58b8

+ 16 - 2
modules/fee_rates/controllers/fee_rates_controller.js

@@ -2,6 +2,11 @@
  * Created by CSL on 2017-03-23.
  */
 
+const uuidV1 = require('uuid/v1');
+let mongoose = require('mongoose');
+let feeRateModel = mongoose.model('fee_rates');
+let template = require('./feerate_template');
+/*
 var stdFeeRateLibs = require('../../std_fee_rate_libs/models/std_fee_rate_libs');
 var projectFeeRateFile = require('../models/fee_rates');
 
@@ -34,9 +39,18 @@ module.exports = {
         })
     }
 }
+*/
 
 
 
+module.exports = {
+    libNames: function (req, res) {
+        var region = req.body.region;
+        let temObject = template.feerate_template2;
+        temObject.ID=uuidV1();
+        feeRateModel.create(temObject,function (err,doc) {
+            res.json({data: doc});
+        });
 
-
-
+    }
+}

+ 953 - 0
modules/fee_rates/controllers/feerate_template.js

@@ -0,0 +1,953 @@
+/**
+ * Created by chen on 2017/8/4.
+ */
+
+module.exports={
+    feerate_template1:{
+        "libID": 2,
+        "libName": "重庆2016年标准",
+        "projectID": 99,
+        "status": "activate",
+        "rates": [
+            {
+                "ID": 1,
+                "ParentID": null,
+                "name": "企业管理费",
+                "rate": null,
+                "memo": ""
+            },
+            {
+                "ID": 101,
+                "ParentID": 1,
+                "name": "建筑工程",
+                "rate": 16.36,
+                "memo": "",
+                "subFeeRate": {
+                    "recodes": [
+                        {
+                            "ID": 1,
+                            "name": "工程分类",
+                            "optionList": [
+                                {
+                                    "name": "一类工程",
+                                    "value": "001",
+                                    "selected": true
+                                },
+                                {
+                                    "name": "二类工程",
+                                    "value": "002",
+                                    "selected": false
+                                },
+                                {
+                                    "name": "三类工程",
+                                    "value": "003",
+                                    "selected": false
+                                },
+                                {
+                                    "name": "四类工程",
+                                    "value": "004",
+                                    "selected": false
+                                }
+                            ]
+                        },
+                        {
+                            "ID": 2,
+                            "name": "地区",
+                            "optionList": [
+                                {
+                                    "name": "在市区",
+                                    "value": "005",
+                                    "selected": true
+                                },
+                                {
+                                    "name": "县城镇",
+                                    "value": "006",
+                                    "selected": false
+                                },
+                                {
+                                    "name": "不在市区、县城镇",
+                                    "value": "007",
+                                    "selected": false
+                                }
+                            ]
+                        }
+                    ],
+                    "valueMaps": [
+                        {
+                            "ID": "001-005",
+                            "value": 16.36
+                        },
+                        {
+                            "ID": "001-006",
+                            "value": 16.21
+                        },
+                        {
+                            "ID": "001-007",
+                            "value": 15.94
+                        },
+                        {
+                            "ID": "002-005",
+                            "value": 15.31
+                        },
+                        {
+                            "ID": "002-006",
+                            "value": 15.16
+                        },
+                        {
+                            "ID": "002-007",
+                            "value": 14.89
+                        },
+                        {
+                            "ID": "003-005",
+                            "value": 12.9
+                        },
+                        {
+                            "ID": "003-006",
+                            "value": 12.75
+                        },
+                        {
+                            "ID": "003-007",
+                            "value": 12.48
+                        },
+                        {
+                            "ID": "004-005",
+                            "value": 9.82
+                        },
+                        {
+                            "ID": "004-006",
+                            "value": 9.67
+                        },
+                        {
+                            "ID": "004-007",
+                            "value": 9.4
+                        }
+
+                    ]
+                }
+            },
+            {
+                "ID": 102,
+                "ParentID": 1,
+                "name": "市政工程",
+                "rate": 17.43,
+                "memo": "",
+                "subFeeRate": {
+                    "recodes": [
+                        {
+                            "ID": 1,
+                            "name": "工程分类",
+                            "optionList": [
+                                {
+                                    "name": "一类工程",
+                                    "value": "001",
+                                    "selected": true
+                                },
+                                {
+                                    "name": "二类工程",
+                                    "value": "002",
+                                    "selected": false
+                                },
+                                {
+                                    "name": "三类工程",
+                                    "value": "003",
+                                    "selected": false
+                                },
+                                {
+                                    "name": "四类工程",
+                                    "value": "004",
+                                    "selected": false
+                                }
+                            ]
+                        },
+                        {
+                            "ID": 2,
+                            "name": "地区",
+                            "optionList": [
+                                {
+                                    "name": "在市区",
+                                    "value": "005",
+                                    "selected": true
+                                },
+                                {
+                                    "name": "县城镇",
+                                    "value": "006",
+                                    "selected": false
+                                },
+                                {
+                                    "name": "不在市区、县城镇",
+                                    "value": "007",
+                                    "selected": false
+                                }
+                            ]
+                        }
+                    ],
+                    "valueMaps": [
+                        {
+                            "ID": "001-005",
+                            "value": 17.43
+                        },
+                        {
+                            "ID": "001-006",
+                            "value": 17.17
+                        },
+                        {
+                            "ID": "001-007",
+                            "value": 16.68
+                        },
+                        {
+                            "ID": "002-005",
+                            "value": 16.14
+                        },
+                        {
+                            "ID": "002-006",
+                            "value": 15.88
+                        },
+                        {
+                            "ID": "002-007",
+                            "value": 15.39
+                        },
+                        {
+                            "ID": "003-005",
+                            "value": 13.72
+                        },
+                        {
+                            "ID": "003-006",
+                            "value": 13.46
+                        },
+                        {
+                            "ID": "003-007",
+                            "value": 12.97
+                        },
+                        {
+                            "ID": "004-005",
+                            "value": 10.82
+                        },
+                        {
+                            "ID": "004-006",
+                            "value": 10.56
+                        },
+                        {
+                            "ID": "004-007",
+                            "value": 10.07
+                        }
+
+                    ]
+                }
+            },
+            {
+                "ID": 103,
+                "ParentID": 1,
+                "name": "机械土石方",
+                "rate": 10.82,
+                "memo": ""
+            },
+            {
+                "ID": 104,
+                "ParentID": 1,
+                "name": "仿古建筑工程",
+                "rate": 12,
+                "memo": ""
+            },
+            {
+                "ID": 105,
+                "ParentID": 1,
+                "name": "建筑修缮工程",
+                "rate": 12.47,
+                "memo": ""
+            },
+            {
+                "ID": 106,
+                "ParentID": 1,
+                "name": "炉窑砌筑工程",
+                "rate": 10.8,
+                "memo": "",
+                "subFeeRate": {
+                    "recodes": [
+                        {
+                            "ID": 1,
+                            "name": "工程分类",
+                            "optionList": [
+                                {
+                                    "name": "一类工程",
+                                    "value": "001",
+                                    "selected": true
+                                },
+                                {
+                                    "name": "二类工程",
+                                    "value": "002",
+                                    "selected": false
+                                },
+                                {
+                                    "name": "三类工程",
+                                    "value": "003",
+                                    "selected": false
+                                },
+                                {
+                                    "name": "四类工程",
+                                    "value": "004",
+                                    "selected": false
+                                }
+                            ]
+                        },
+                        {
+                            "ID": 2,
+                            "name": "地区",
+                            "optionList": [
+                                {
+                                    "name": "在市区",
+                                    "value": "005",
+                                    "selected": true
+                                },
+                                {
+                                    "name": "县城镇",
+                                    "value": "006",
+                                    "selected": false
+                                },
+                                {
+                                    "name": "不在市区、县城镇",
+                                    "value": "007",
+                                    "selected": false
+                                }
+                            ]
+                        }
+                    ],
+                    "valueMaps": [
+                        {
+                            "ID": "001-005",
+                            "value": 17.43
+                        },
+                        {
+                            "ID": "001-006",
+                            "value": 17.17
+                        },
+                        {
+                            "ID": "001-007",
+                            "value": 16.68
+                        },
+                        {
+                            "ID": "002-005",
+                            "value": 16.14
+                        },
+                        {
+                            "ID": "002-006",
+                            "value": 15.88
+                        },
+                        {
+                            "ID": "002-007",
+                            "value": 15.39
+                        },
+                        {
+                            "ID": "003-005",
+                            "value": 13.72
+                        },
+                        {
+                            "ID": "003-006",
+                            "value": 13.46
+                        },
+                        {
+                            "ID": "003-007",
+                            "value": 12.97
+                        },
+                        {
+                            "ID": "004-005",
+                            "value": 10.82
+                        },
+                        {
+                            "ID": "004-006",
+                            "value": 10.56
+                        },
+                        {
+                            "ID": "004-007",
+                            "value": 10.07
+                        }
+
+                    ]
+                }
+            },
+            {
+                "ID": 2,
+                "ParentID": null,
+                "name": "夜间施工费",
+                "rate": null,
+                "memo": ""
+            },
+            {
+                "ID": 201,
+                "ParentID": 2,
+                "name": "建筑工程",
+                "rate": 0.45,
+                "memo": ""
+            },
+            {
+                "ID": 202,
+                "ParentID": 2,
+                "name": "市政工程",
+                "rate": 0.4,
+                "memo": ""
+            },
+            {
+                "ID": 203,
+                "ParentID": 2,
+                "name": "机械土石方",
+                "rate": 0.7,
+                "memo": ""
+            },
+            {
+                "ID": 204,
+                "ParentID": 2,
+                "name": "仿古建筑工程",
+                "rate": 0.2,
+                "memo": ""
+            },
+            {
+                "ID": 205,
+                "ParentID": 2,
+                "name": "建筑修缮工程",
+                "rate": 0.35,
+                "memo": ""
+            },
+            {
+                "ID": 206,
+                "ParentID": 2,
+                "name": "炉窑砌筑工程",
+                "rate": 0.4,
+                "memo": ""
+            },
+            {
+                "ID": 3,
+                "ParentID": null,
+                "name": "规费",
+                "rate": null,
+                "memo": ""
+            },
+            {
+                "ID": 301,
+                "ParentID": 3,
+                "name": "建筑工程",
+                "rate": 16.03,
+                "memo": ""
+            },
+            {
+                "ID": 302,
+                "ParentID": 3,
+                "name": "市政工程",
+                "rate": 16.33,
+                "memo": ""
+            },
+            {
+                "ID": 303,
+                "ParentID": 3,
+                "name": "机械土石方",
+                "rate": 15.5,
+                "memo": ""
+            },
+            {
+                "ID": 304,
+                "ParentID": 3,
+                "name": "仿古建筑工程",
+                "rate": 12,
+                "memo": ""
+            },
+            {
+                "ID": 305,
+                "ParentID": 3,
+                "name": "建筑修缮工程",
+                "rate": 12.47,
+                "memo": ""
+            },
+            {
+                "ID": 306,
+                "ParentID": 3,
+                "name": "炉窑砌筑工程",
+                "rate": 10.8,
+                "memo": ""
+            },
+            {
+                "ID": 4,
+                "ParentID": null,
+                "name": "利润",
+                "rate": null,
+                "memo": ""
+            },
+            {
+                "ID": 401,
+                "ParentID": 4,
+                "name": "建筑工程",
+                "rate": 8.73,
+                "memo": "",
+                "subFeeRate": {
+                    "recodes": [
+                        {
+                            "ID": 1,
+                            "name": "工程分类",
+                            "optionList": [
+                                {
+                                    "name": "一类工程",
+                                    "value": "001",
+                                    "selected": true
+                                },
+                                {
+                                    "name": "二类工程",
+                                    "value": "002",
+                                    "selected": false
+                                },
+                                {
+                                    "name": "三类工程",
+                                    "value": "003",
+                                    "selected": false
+                                },
+                                {
+                                    "name": "四类工程",
+                                    "value": "004",
+                                    "selected": false
+                                }
+                            ]
+                        }
+                    ],
+                    "valueMaps": [
+                        {
+                            "ID": "001",
+                            "value": 8.73
+                        },
+                        {
+                            "ID": "002",
+                            "value": 6.94
+                        },
+                        {
+                            "ID": "003",
+                            "value": 4
+                        },
+                        {
+                            "ID": "004",
+                            "value": 2.8
+                        }
+                    ]
+                }
+            },
+            {
+                "ID": 402,
+                "ParentID": 4,
+                "name": "市政工程",
+                "rate": 9.2,
+                "memo": "",
+                "subFeeRate": {
+                    "recodes": [
+                        {
+                            "ID": 1,
+                            "name": "工程分类",
+                            "optionList": [
+                                {
+                                    "name": "一类工程",
+                                    "value": "001",
+                                    "selected": true
+                                },
+                                {
+                                    "name": "二类工程",
+                                    "value": "002",
+                                    "selected": false
+                                },
+                                {
+                                    "name": "三类工程",
+                                    "value": "003",
+                                    "selected": false
+                                },
+                                {
+                                    "name": "四类工程",
+                                    "value": "004",
+                                    "selected": false
+                                }
+                            ]
+                        }
+                    ],
+                    "valueMaps": [
+                        {
+                            "ID": "001",
+                            "value": 9.2
+                        },
+                        {
+                            "ID": "002",
+                            "value": 7.2
+                        },
+                        {
+                            "ID": "003",
+                            "value": 4.35
+                        },
+                        {
+                            "ID": "004",
+                            "value": 3
+                        }
+                    ]
+                }
+            },
+            {
+                "ID": 403,
+                "ParentID": 4,
+                "name": "机械土石方",
+                "rate": 6.5,
+                "memo": ""
+            },
+            {
+                "ID": 404,
+                "ParentID": 4,
+                "name": "仿古建筑工程",
+                "rate": 7,
+                "memo": ""
+            },
+            {
+                "ID": 405,
+                "ParentID": 4,
+                "name": "建筑修缮工程",
+                "rate": 3.72,
+                "memo": ""
+            },
+            {
+                "ID": 406,
+                "ParentID": 4,
+                "name": "炉窑砌筑工程",
+                "rate": 4.9,
+                "memo": ""
+            },
+            {
+                "ID": 5,
+                "ParentID": null,
+                "name": "税金",
+                "rate": 11,
+                "memo": "",
+                "subFeeRate": {
+                    "recodes": [
+                        {
+                            "ID": 1,
+                            "name": "工程分类",
+                            "optionList": [
+                                {
+                                    "name": "一般纳税人",
+                                    "value": "008",
+                                    "selected": true
+                                },
+                                {
+                                    "name": "小规模纳税人",
+                                    "value": "009",
+                                    "selected": false
+                                }
+                            ]
+                        }
+                    ],
+                    "valueMaps": [
+                        {
+                            "ID": "008",
+                            "value": 11
+                        },
+                        {
+                            "ID": "009",
+                            "value": 3
+                        }
+                    ]
+                }
+            }]
+    },
+    feerate_template2:{
+        "libID": 2,
+        "libName": "北京2009年标准",
+        "projectID": 99,
+        "status": "disable",
+        "rates": [
+            {
+                "ID": 1,
+                "ParentID": null,
+                "name": "企业管理费",
+                "rate": null,
+                "memo": ""
+            },
+            {
+                "ID": 101,
+                "ParentID": 1,
+                "name": "建筑工程",
+                "rate": 16.36,
+                "memo": "",
+                "subFeeRate": {
+                    "recodes": [
+                        {
+                            "ID": 1,
+                            "name": "建筑分类",
+                            "optionList": [
+                                {
+                                    "name": "单层建筑",
+                                    "value": "010",
+                                    "selected": true
+                                },
+                                {
+                                    "name": "住宅檐高25m以下",
+                                    "value": "011",
+                                    "selected": false
+                                },
+                                {
+                                    "name": "住宅檐高25m以上",
+                                    "value": "012",
+                                    "selected": false
+                                },
+                                {
+                                    "name": "公共建筑檐高25m以下",
+                                    "value": "013",
+                                    "selected": false
+                                },
+                                {
+                                    "name": "公共建筑檐高45m以下",
+                                    "value": "014",
+                                    "selected": false
+                                },
+                                {
+                                    "name": "公共建筑檐高45m以下",
+                                    "value": "015",
+                                    "selected": false
+                                }
+                            ]
+                        }
+                    ],
+                    "valueMaps": [
+                        {
+                            "ID": "010",
+                            "value": 5.7
+                        },
+                        {
+                            "ID": "011",
+                            "value": 5.6
+                        },
+                        {
+                            "ID": "012",
+                            "value": 6.1
+                        },
+                        {
+                            "ID": "013",
+                            "value": 5.7
+                        },
+                        {
+                            "ID": "014",
+                            "value": 6.8
+                        },
+                        {
+                            "ID": "015",
+                            "value": 7.3
+                        }
+                    ]
+                }
+            },
+            {
+                "ID": 102,
+                "ParentID": 1,
+                "name": "装饰工程",
+                "rate": 45,
+                "memo": ""
+            },
+            {
+                "ID": 2,
+                "ParentID": null,
+                "name": "临时设施费",
+                "rate": null,
+                "memo": ""
+            },
+            {
+                "ID": 201,
+                "ParentID": 2,
+                "name": "建筑工程",
+                "rate": 2.7,
+                "memo": "",
+                "subFeeRate": {
+                    "recodes": [
+                        {
+                            "ID": 1,
+                            "name": "建筑面积",
+                            "optionList": [
+                                {
+                                    "name": "建筑面积5000m2以外",
+                                    "value": "016",
+                                    "selected": true
+                                },
+                                {
+                                    "name": "建筑面积5000m2以内",
+                                    "value": "017",
+                                    "selected": false
+                                },
+                                {
+                                    "name": "建筑面积2000m2以内",
+                                    "value": "018",
+                                    "selected": false
+                                }
+                            ]
+                        },
+                        {
+                            "ID": 2,
+                            "name": "区域",
+                            "optionList": [
+                                {
+                                    "name": "四环以内",
+                                    "value": "019",
+                                    "selected": true
+                                },
+                                {
+                                    "name": "四环以外",
+                                    "value": "020",
+                                    "selected": false
+                                }
+                            ]
+                        }
+                    ],
+                    "valueMaps": [
+                        {
+                            "ID": "016-019",
+                            "value": 2.7
+                        },
+                        {
+                            "ID": "016-020",
+                            "value": 2.3
+                        },
+                        {
+                            "ID": "017-019",
+                            "value": 2.9
+                        },
+                        {
+                            "ID": "017-020",
+                            "value": 2.5
+                        },
+                        {
+                            "ID": "018-019",
+                            "value": 3.1
+                        },
+                        {
+                            "ID": "018-020",
+                            "value": 2.6
+                        }
+                    ]
+                }
+            },
+            {
+                "ID": 202,
+                "ParentID": 2,
+                "name": "装饰工程",
+                "rate": 15,
+                "memo": "",
+                "subFeeRate": {
+                    "recodes": [
+                        {
+                            "ID": 1,
+                            "name": "区域",
+                            "optionList": [
+                                {
+                                    "name": "四环以内",
+                                    "value": "019",
+                                    "selected": true
+                                },
+                                {
+                                    "name": "四环以外",
+                                    "value": "020",
+                                    "selected": false
+                                }
+                            ]
+                        }
+                    ],
+                    "valueMaps": [
+                        {
+                            "ID": "019",
+                            "value": 15
+                        },
+                        {
+                            "ID": "020",
+                            "value": 13
+                        }
+                    ]
+                }
+            },
+            {
+                "ID": 203,
+                "ParentID": 2,
+                "name": "构筑物",
+                "rate": 2.6,
+                "memo": "",
+                "subFeeRate": {
+                    "recodes": [
+                        {
+                            "ID": 1,
+                            "name": "区域",
+                            "optionList": [
+                                {
+                                    "name": "四环以内",
+                                    "value": "019",
+                                    "selected": true
+                                },
+                                {
+                                    "name": "四环以外",
+                                    "value": "020",
+                                    "selected": false
+                                }
+                            ]
+                        }
+                    ],
+                    "valueMaps": [
+                        {
+                            "ID": "019",
+                            "value": 2.6
+                        },
+                        {
+                            "ID": "020",
+                            "value": 2.2
+                        }
+                    ]
+                }
+            },
+            {
+                "ID": 204,
+                "ParentID": 2,
+                "name": "钢结构工程",
+                "rate": 2,
+                "memo": "",
+                "subFeeRate": {
+                    "recodes": [
+                        {
+                            "ID": 1,
+                            "name": "区域",
+                            "optionList": [
+                                {
+                                    "name": "四环以内",
+                                    "value": "019",
+                                    "selected": true
+                                },
+                                {
+                                    "name": "四环以外",
+                                    "value": "020",
+                                    "selected": false
+                                }
+                            ]
+                        }
+                    ],
+                    "valueMaps": [
+                        {
+                            "ID": "019",
+                            "value": 2
+                        },
+                        {
+                            "ID": "020",
+                            "value": 1.7
+                        }
+                    ]
+                }
+            },
+            {
+                "ID": 3,
+                "ParentID": null,
+                "name": "利润",
+                "rate": 18,
+                "memo": ""
+            },
+            {
+                "ID": 5,
+                "ParentID": null,
+                "name": "税金",
+                "rate": 3.42,
+                "memo": ""
+            }]
+    }
+
+}
+
+
+
+

+ 131 - 0
modules/fee_rates/facade/fee_rates_facade.js

@@ -0,0 +1,131 @@
+/**
+ * Created by chen on 2017/8/2.
+ */
+
+let async_n = require("async");
+let mongoose = require('mongoose');
+let feeRateModel = mongoose.model('fee_rates');
+let consts = require('../../main/models/project_consts');
+let _=require("lodash");
+
+module.exports={
+    save:save,
+    getData:getData
+};
+let operationMap={
+    'ut_create':create_fee_rate,
+    'ut_update':update_fee_rate,
+    'ut_delete':delete_fee_rate
+};
+
+let updateFunctionMap = {
+    'normalUpdate':normalUpdate,
+    'update_rates':update_rates,
+    'updateStatusBySelected':updateStatusBySelected
+}
+
+function create_fee_rate() {
+
+}
+
+function update_fee_rate(user_id,datas) {
+    if(datas.updateFunction){
+        return updateFunctionMap[datas.updateFunction](user_id,datas);
+    }else {
+        return normalUpdate(user_id,datas);
+    }
+}
+
+function updateStatusBySelected(user_id,datas) {
+    return function(callback){
+        feeRateModel.bulkWrite(generateUpdateTaks(datas.tasks),function (err,data) {
+            console.log(data);
+            commonCallback(callback,data,err);
+        })
+
+    }
+}
+function normalUpdate(user_id,datas) {
+    return function(callback){
+        console.log(datas)
+        callback(null,'');
+    }
+}
+
+
+function  generateUpdateTaks(updateTasks) {
+    var tasks=[];
+    for(let u of updateTasks){
+        let t ={
+            updateOne:{
+                filter:u.query,
+                update: u.doc
+            }
+        }
+        tasks.push(t);
+    }
+    return tasks;
+}
+
+function update_rates(user_id,datas) {
+    return function(callback){
+        console.log(datas);
+        feeRateModel.findOne(datas.query,['rates'],function(err, data){
+            let doc = datas.doc;
+            if(_.isArray(doc)){
+                _.forEach(doc,function (item) {
+                    data.rates[item.rateIndex]=item.rate;
+                })
+            }else {
+                data.rates[doc.rateIndex]=doc.rate;
+            }
+            data.save(function (err) {
+                commonCallback(callback,'',err);
+            });
+        })
+    }
+}
+
+function delete_fee_rate() {
+
+}
+
+function save (user_id, datas, callback) {
+    let operations=[];
+    if(_.isArray(datas)){
+        for(let i=0;i<datas.length;i++){
+            operations.push(operationMap[datas[i].updateType](user_id,datas[i]));
+        }
+    }else {
+        operations.push(operationMap[datas.updateType](user_id,datas));
+    }
+    async_n.parallel(operations,function (err,results) {
+        if(err){
+            callback(err,'');
+        }else {
+            if(results.length==1){
+                callback(null,results[0])
+            }else {
+                callback(null,results)
+            }
+        }
+    })
+}
+
+function getData(projectID, callback) {
+    feeRateModel.find({'projectID':projectID}).exec((err,datas)=>{
+        if(err){
+            callback(1, '', null);
+        }else {
+            callback(0, consts.projectConst.FEERATE, datas);
+        }
+    })
+}
+
+function commonCallback(callback,result,err) {
+    if(err){
+        callback(err,'');
+    }else {
+        callback(null,result);
+    }
+}

+ 38 - 45
modules/fee_rates/models/fee_rates.js

@@ -2,58 +2,51 @@
  * Created by CSL on 2017-03-29.
  */
 
-var mg = require('mongoose');
-var dbm = require("../../../config/db/db_manager");
-var db = dbm.getCfgConnection("scConstruct");
-
-var ratesSchema = new mg.Schema({
+let mongoose = require('mongoose');
+let Schema = mongoose.Schema;
+// {ID:1,name:'工程分类',optionList:[{name:'一类工程',value:1,selected:true},{name:'二类工程',value:2,selected:false},{name:'三类工程',value:3,selected:false},{name:'四类工程',value:4,selected:false}]},
+let optionSchema = new Schema({
+    name:String,
+    value:String,
+    selected:Boolean
+},{versionKey:false,_id: false})
+
+let recordSchema = new Schema({
+    ID:Number,
+    name:String,
+    optionList:[optionSchema]
+},{versionKey:false,_id: false})
+
+let valueMapSchema = new Schema({
+    ID:String,
+    value:Number
+},{versionKey:false,_id: false})
+let subFeeRatesSchema = new Schema({
+    recodes :[recordSchema],
+    valueMaps:[valueMapSchema],
+},{versionKey:false,_id: false});
+
+
+let ratesSchema = new Schema({
     ID: Number,
     ParentID: Number,
     name: String,
     rate: Number,
-    memo: String
-});
+    memo: String,
+    subFeeRate:subFeeRatesSchema
+},{versionKey:false,_id: false});
 
-var feeRatesSchema = new mg.Schema({
-    ID: Number,
+let feeRatesSchema = new Schema({
+    ID: String,
     libID: Number,
     libName: String,
+    name:String,
+    projectID:Number,
+    status:String,
     rates: [ratesSchema]
-});
-
-var feeRatesModel = db.model('fee_rates', feeRatesSchema, 'fee_rates');
-
-var FeeRateFile = function(){};
-
-FeeRateFile.prototype.rates = function(fileID, controllerFun){
-    feeRatesModel.find({"ID": fileID}, ["rates"], function(err, data){
-        if(data.length){
-            controllerFun(data);
-        }
-        else{
-            controllerFun(false);
-        }
-    })
-};
-
-// 1 保存成功; 0 保存失败;-1没有找到对应记录。
-FeeRateFile.prototype.updateRate = function(rateObj, controllerFun){
-    feeRatesModel.findOne({"ID": rateObj.fileID}, ["rates"], function(err, data){
-        if(data){
-            for (var i = 0; i < data.rates.length; i++) {
-                if (data.rates[i].ID == rateObj.rateID) {
-                    data.rates[i].rate = rateObj.rateValue;
-                    data.save(function (err) {
-                        if (err) { controllerFun(0); } else { controllerFun(1); }
-                    });
-                    break;
-                }
-            };
-        }
-        else{ controllerFun(-1); }
-    })
-};
-
-module.exports = new FeeRateFile();
+},{versionKey:false});
+
+mongoose.model('fee_rates', feeRatesSchema, 'fee_rates');
+
 
 

+ 2 - 1
modules/fee_rates/routes/fee_rates_route.js

@@ -12,9 +12,10 @@ module.exports = function (app) {
         res.render('building_saas/fee_rates/fee_rate', {});
     });
     frRouter.post('/getLibNames', frController.libNames);
+/*    frRouter.post('/getLibNames', frController.libNames);
     frRouter.post('/getLibFeeRates', frController.libFeeRates);
     frRouter.post('/getProjectFeeRates', frController.projectFeeRates);
-    frRouter.post('/updateProjectFeeRate', frController.projectFeeUpdateRate);
+    frRouter.post('/updateProjectFeeRate', frController.projectFeeUpdateRate);*/
 
     app.use('/feeRates',frRouter);
 }

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

@@ -11,6 +11,8 @@ let counter = require("../../../public/counter/counter.js");
 let consts = require('./project_consts');
 let projectConsts = consts.projectConst;
 let commonConsts = consts.commonConst;
+let quantity_detial = require('../../ration_glj/facade/quantity_detail_facade');
+
 
 let billsSchema = new Schema({
     ID: Number,
@@ -24,7 +26,7 @@ let billsSchema = new Schema({
     name: String,
     unit: String,
     quantity: String, // Decimal
-    isFromDetail:{type: Number,default:0},//1 true 2 false
+    isFromDetail:{type: Number,default:0},//1 true 0 false
     programID: Number,
     comments: String,
     // 调价
@@ -74,7 +76,7 @@ class billsModel extends baseModel {
             return function (cb) {
                 switch (doc.updateType) {
                     case commonConsts.UT_UPDATE:
-                        bills.update({projectID: doc.updateData.projectID, ID: doc.updateData.ID}, doc.updateData, cb);
+                        bills.update({projectID: doc.updateData.projectID, ID: doc.updateData.ID,deleteInfo: null}, doc.updateData, cb);
                         break;
                     case commonConsts.UT_CREATE:
                         bills.create(doc.updateData, cb);
@@ -89,8 +91,8 @@ class billsModel extends baseModel {
         for (let i = 0; i < datas.length; i++){
             data = datas[i];
             functions.push(saveOne(data));
+            quantity_detial.quantityEditChecking(data,'bills',functions);
         }
-
         async.parallel(functions, callback);
     };
 

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

@@ -8,6 +8,7 @@ var ration_glj_data = require('../../ration_glj/facade/ration_glj_facade');
 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 volumePriceData = require('../../volume_price/models/volume_price_model');
 var consts = require('./project_consts');
@@ -25,7 +26,7 @@ moduleMap[projectConsts.RATION_ASS] = ration_ass_data;
 moduleMap[projectConsts.QUANTITY_DETAIL] = quantity_detail_data;
 moduleMap[projCounter.collectionName] = projCounter;
 moduleMap[volumePriceData.collectionName] = volumePriceData;
-
+moduleMap[projectConsts.FEERATE] = fee_rate_data;
 
 var Project = function (){};
 

+ 2 - 1
modules/main/models/project_consts.js

@@ -13,7 +13,8 @@ var projectConst = {
     GLJLIST: 'GLJList',
     UNITPRICEFILE: 'unitPriceFile',
     PROPERTIES: 'properties',
-    VOLUMEPRICE: 'volume_price'
+    VOLUMEPRICE: 'volume_price',
+    FEERATE:'feeRate'
 };
 
 var commonConst = {

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

@@ -11,6 +11,7 @@ let counter = require("../../../public/counter/counter.js");
 let consts = require('./project_consts');
 let projectConsts = consts.projectConst;
 let commonConsts = consts.commonConst;
+let quantity_detial = require('../../ration_glj/facade/quantity_detail_facade');
 
 var rationAssItemSchema = mongoose.Schema({
     name: String,
@@ -77,7 +78,7 @@ class rationModel extends baseModel {
             return function (cb) {
                 switch (doc.updateType) {
                     case commonConsts.UT_UPDATE:
-                        ration.update({projectID: doc.updateData.projectID, ID: doc.updateData.ID}, doc.updateData, cb);
+                        ration.update({projectID: doc.updateData.projectID, ID: doc.updateData.ID, deleteInfo: null}, doc.updateData, cb);
                         break;
                     case commonConsts.UT_CREATE:
                         ration.create(doc.updateData, cb);
@@ -94,6 +95,7 @@ class rationModel extends baseModel {
         for (let i = 0; i < datas.length; i++){
             data = datas[i];
             functions.push(saveOne(data));
+            quantity_detial.quantityEditChecking(data,'ration',functions);
         }
         async.parallel(functions, callback);
     };

+ 13 - 2
modules/ration_glj/facade/quantity_detail_facade.js

@@ -20,7 +20,8 @@ module.exports={
     save:save,
     getData:getData,
     deleteByRation:deleteByRation,
-    deleteByBill:deleteByBill
+    deleteByBill:deleteByBill,
+    quantityEditChecking:quantityEditChecking,
 };
 
 let operationMap={
@@ -515,7 +516,6 @@ function update_quantity_detail(user_id,datas) {
     if(datas.updateFunction){
         return updateFunctionMap[datas.updateFunction](user_id,datas);
     }else {
-        console.log(datas);
         return normalUpdate(user_id,datas);
     }
 }
@@ -624,6 +624,17 @@ function deleteByBill(data) {
     }
 }
 
+function quantityEditChecking(doc,type,functions) {
+    if(doc.updateType == commonConsts.UT_UPDATE&&doc.updateData.hasOwnProperty('isFromDetail')&&doc.updateData.isFromDetail==0) {
+        if(type=='bills'){
+            functions.push(deleteByBill(doc.updateData));
+        }else if(type=='ration'){
+            functions.push(deleteByRation(doc.updateData));
+        }
+    }
+}
+
+
 function commonCallback(callback,result,err) {
     if(err){
         callback(err,'');

+ 41 - 0
public/web/socket/connection.js

@@ -0,0 +1,41 @@
+/**
+ * Created by zhangweicheng on 2017/8/7.
+ */
+socketObject={
+  connect:function () {
+      // 连接socket服务器
+      var hostName = window.location.hostname;
+      socket = io('http://'+hostName+':3300');
+      socket.on('connect', function () {
+
+          var roomID = projectObj.project.FeeRate.getActivateFeeRateID();
+          socket.emit('join', roomID);
+          console.log('连接成功');
+      });
+
+      socket.on('feeRateChange', function(data) {
+          //data = JSON.parse(data);
+
+          $("#message").html('费率文件已被修改,<a href="javascript:void(0);" id="load-data" onclick="window.location.reload()">点击加载</a>');
+          $("#notify").show();
+          //alert('费率文件已经修改,请刷新页面');
+          //window.location.reload();
+      })
+
+      /*   socket.on('connect', function () {
+       socket.emit('join', roomId);
+       console.log('连接成功');
+       });
+
+       // 接收到改变
+       socket.on('dataChange', function(data) {
+       data = JSON.parse(data);
+       if (data.newValue === undefined) {
+       return false;
+       }
+       changeInfo.push(data);
+       $("#message").html('市场单位已被修改,<a href="javascript:void(0);" id="load-data">点击加载</a>');
+       $("#notify").slideDown('fast');
+       });*/
+  }
+}

+ 2 - 0
server.js

@@ -18,6 +18,8 @@ dbm.connect();
 fileUtils.getGlobbedFiles('./modules/ration_glj/models/*.js').forEach(function(modelPath) {
     require(path.resolve(modelPath));
 })
+//暂时引入其它模块的model
+require('./modules/fee_rates/models/fee_rates');
 
 //引入报表模块
 fileUtils.getGlobbedFiles('./modules/reports/models/*.js').forEach(function(modelPath) {

+ 8 - 0
socket.js

@@ -19,9 +19,17 @@ socketIO.on('connection', function(socket) {
         socket.join(data);
     });
 
+
     // 数据更改通知
     socket.on('dataNotify', function(data) {
         socket.broadcast.to(roomId).emit('dataChange', data);
     });
+    socket.on('feeRateChangeNotify', function(data) {
+        socket.broadcast.to(data).emit('feeRateChange', data);
+    });
+    socket.on('changeActivateFeeRate', function(data) {
+        socket.leave(data.oldRoom);
+        socket.join(data.newRoom);
+    });
 
 });

+ 11 - 0
socketdocker/socketdockerfile

@@ -0,0 +1,11 @@
+FROM server:2.0
+
+COPY . ConstructionCost
+
+WORKDIR ConstructionCost
+
+RUN cnpm install 
+
+EXPOSE 3300
+
+ENTRYPOINT babel-node socket.js

+ 11 - 0
socketdockerfile

@@ -0,0 +1,11 @@
+FROM server:2.0
+
+COPY . ConstructionCost
+
+WORKDIR ConstructionCost
+
+RUN cnpm install 
+
+EXPOSE 3300
+
+ENTRYPOINT babel-node socket.js

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

@@ -293,6 +293,7 @@ body {
 .modal-fixed-height {
   height: 400px;
   overflow-y: auto;
+  width:100%
 }
 .sidebar-tools-bar {
   background:#fff
@@ -301,3 +302,26 @@ 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}*/

+ 25 - 112
web/building_saas/fee_rates/fee_rate.html

@@ -5,127 +5,40 @@
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
-    <title>费率-Smartcost</title>
-    <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
-    <link rel="stylesheet" href="/web/building_saas/css/main.css">
-    <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
 
-    <link rel="stylesheet" href="/lib/spreadjs/views/gc.spread.views.dataview.10.0.0.css">
-    <script src="/lib/spreadjs/views/common/gc.spread.common.10.0.0.min.js" type="text/javascript"></script>
-    <script src="/lib/spreadjs/views/gc.spread.views.dataview.10.0.0.min.js" type="text/javascript"></script>
-    <script src="/lib/spreadjs/views/plugins/gc.spread.views.gridlayout.10.0.0.min.js" type="text/javascript"></script>
-    <script src="/lib/spreadjs/views/locale/gc.spread.views.dataview.locale.zh-CN.10.0.0.min.js" type="text/javascript"></script>
-    <script>GC.Spread.Views.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</script>
-
-
-    <style>
-        .grid { height: 500px; margin:0 10px 10px 40px;}
-        .grid .gc-cell.c1 { text-align: right; }
-    </style>
 </head>
 
-<body  style="margin:0;position:absolute;top:0;bottom:0;left:0;right:0;
-    user-select:none;-webkit-user-select: none;overflow:hidden;">
-
-    <div class="header">
-        <!-- <div class="top-msg clearfix">
-            <div class="alert alert-warning mb-0 py-0" role="alert">
-                <button type="button" class="close" data-dismiss="alert" aria-label="Close">
-                  <span aria-hidden="true">&times;</span>
-                </button>
-                <strong>注意!</strong> 这是一条消息通知 <a href="#">链接</a>
-            </div>
-        </div> -->
-        <nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 justify-content-between">
-            <span class="header-logo px-2">Smartcost</span>
-            <div class="navbar-text"><a href="project-management.html">项目管理</a><i class="fa fa-angle-right fa-fw"></i>文件夹<i class="fa fa-angle-right fa-fw"></i>建设项目<i class="fa fa-angle-right fa-fw"></i>单项工程<i class="fa fa-angle-right fa-fw"></i>单位工程</div>
-            <div class="float-lg-right navbar-text pt-0">
-                <div class="dropdown d-inline-block">
-                    <button class="btn btn-link btn-sm dropdown-toggle" type="button" data-toggle="dropdown">陈特</button>
-                    <div class="dropdown-menu dropdown-menu-right">
-                        <a class="dropdown-item" href="user-info.html" target="_blank">账号资料</a>
-                        <a class="dropdown-item" href="user-buy.html" target="_blank">产品购买</a>
-                        <a class="dropdown-item" href="user-set.html" target="_blank">偏好设置</a>
+<body >
+<div class="toolsbar px-1">
+    <div class="form-inline py-1">
+        <div class="col-lg-6" > <button id="selctFeeFile">选择费率文件</button></div>
+        <div class="col-lg-3" style="text-align: center"> 费率文件: <span id="projectName"></span></div>
+    </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" for="inlineFormCustomSelect">费率标准:</label>
+                        <select class="form-control form-control-sm" id="inlineFormCustomSelect">
+
+                        </select>
+                        <span>&nbsp;</span>
                     </div>
+                    <div class=" grid  main-data-top" id="divFee"></div>
                 </div>
-                <span class="btn btn-link btn-sm new-msg">
-                  <i class="fa fa-envelope-o" aria-hidden="true"></i>&nbsp;2
-                </span>
-                <button class="btn btn-link btn-sm" id="logout">注销</button>
-            </div>
-        </nav>
-        <nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0">
-            <ul class="nav navbar-nav px-1">
-                <li class="nav-item">
-                    <a class="nav-link" href="#" aria-haspopup="true" aria-expanded="false"><i class="fa fa-sliders"></i> 选项</a>
-                </li>
-                <li class="nav-item dropdown">
-                    <a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-wrench"></i> 工具</a>
-                    <div class="dropdown-menu">
-                        <a class="dropdown-item" href="#">定额库编辑器</a>
-                        <a class="dropdown-item" href="#">工料机库编辑器</a>
-                    </div>
-                </li>
-                <li class="nav-item dropdown">
-                    <a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-question-circle-o"></i> 帮助</a>
-                    <div class="dropdown-menu">
-                        <a class="dropdown-item" href="#">帮助</a>
-                        <a class="dropdown-item" href="#">升级说明</a>
-                        <a class="dropdown-item" href="#">重庆市2008定额说明</a>
-                        <a class="dropdown-item" href="#">纵横官网</a>
-                        <a class="dropdown-item" href="#">动画教程</a>
-                        <a class="dropdown-item" href="#">联系客服</a>
-                        <a class="dropdown-item" href="#">关于</a>
-                    </div>
-                </li>
-                <li class="nav-item">
-                    <a class="nav-link" href="#" aria-haspopup="true" aria-expanded="false"><i class="fa fa-history"></i> 历史记录</a>
-                </li>
-            </ul>
-            <form class="form-inline">
-                <input class="form-control form-control-sm mr-1" type="text" placeholder="告诉我你想做什么">
-            </form>
-        </nav>
-    </div>
-    <div class="main">
-        <div class="main-nav">
-            <ul class="nav flex-column">
-                <li><a href="zaojiashu.html">造价书</a></li>
-                <li><a href="gongliaoji.html">工料机</a></li>
-                <li><a href="baobiao.html">报表</a></li>
-                <li><a href="feilv.html" class="active">费率</a></li>
-            </ul>
-        </div>
-
-        <div class="content" id ="content">
-            <div class="toolsbar px-1">
-                <div class="form-inline py-1">
-                    <label class="mx-2" for="inlineFormCustomSelect">费率标准:</label>
-                    <select class="form-control form-control-sm" id="inlineFormCustomSelect">
-                        <option selected>重庆渝发建发[2016]35号</option>
-                        <option value="1">One</option>
-                        <option value="2">Two</option>
-                        <option value="3">Three</option>
-                    </select>
-                    <span>&nbsp;</span><button id="projectFeeFile">本项目费率文件2</button>
+                <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>
             </div>
         </div>
-
-        <div class="grid" id="divFee"></div>
     </div>
+</div>
 
-    <!-- JS. -->
-    <script src="/lib/jquery/jquery.min.js"></script>
-    <script src="/lib/tether/tether.min.js"></script>
-    <script src="/lib/bootstrap/bootstrap.min.js"></script>
-    <script src="/web/building_saas/js/global.js"></script>
-    <script src="/web/building_saas/fee_rates/fee_rate.js"></script>
 </body>
-<script type="text/javascript">
-    autoFlashHeight();
-    loadStdFeeRateLibNames(region);
-    loadProjectFeeRates(feeRateFileID);
-</script>
-
+<script src="/web/glj/js/socket.io.slim.js"></script>
+<script src="/public/web/socket/connection.js"></script>
 </html>

+ 17 - 3
web/building_saas/fee_rates/fee_rate.js

@@ -29,6 +29,7 @@ function loadProjectFeeRates(fileID) {
         success: function (result) {
             if (result.data) {
                 datas = result.data[0].rates;
+                datas=rate_data;
                 createSpreadView(true);
             }
         },
@@ -147,7 +148,7 @@ function createSpreadView(canEdit) {
 
     var dataSource = {
         loadRange: function(params) {
-            params.success(datas);
+            params.success(rate_data);
         },
 
         update: function(params) {
@@ -179,16 +180,29 @@ function createSpreadView(canEdit) {
 
     spreadView = new GC.Spread.Views.DataView($('#divFee')[0],
         dataSource, columns, new GC.Spread.Views.Plugins.GridLayout(options));
- 
+
     spreadView["rowDbClick"].addHandler(rowClickFun);
     spreadView.invalidate();
     document.querySelector('#divFee').focus();
 }
 
+function reFreshRateViews() {
+    if(spreadView){
+        spreadView.refresh();
+    }else {
+        loadProjectFeeRates(feeRateFileID);
+    }
+}
 
 var feeRateObj = {
     getFeeRate: function (){
 
 
     }
-}
+}
+
+
+$('#tab_fee_rate').bind('click', function () {
+    reFreshRateViews();
+    //creatennnSpreadView();
+});

+ 2 - 0
web/building_saas/js/global.js

@@ -13,6 +13,8 @@ function autoFlashHeight(){
     $(".side-content").height($(window).height()-headerHeight );
     $(".poj-list").height($(window).height()-headerHeight-toolsbarHeight);
     $(".form-list").height($(window).height()-headerHeight-50 );
+    $(".grid").height($(window).height()-headerHeight-50 );
+
 };
 $(window).resize(autoFlashHeight);
 /*全局自适应高度结束*/

+ 31 - 7
web/building_saas/main/html/main.html

@@ -13,8 +13,11 @@
     <link rel="stylesheet" href="/lib/ztree/css/zTreeStyle.css" type="text/css">
     <!--SpreadJs-->
     <link rel="stylesheet" href="/lib/spreadjs/sheets/css/gc.spread.sheets.excel2013lightGray.10.0.1.css" type="text/css">
+    <link rel="stylesheet" href="/lib/spreadjs/views/gc.spread.views.dataview.10.0.0.css">
     <!-- jquery.contextmenu -->
     <link rel="stylesheet" href="/lib/jquery-contextmenu/jquery.contextMenu.css" type="text/css">
+
+
     <script src="/lib/jquery/jquery.min.js"></script>
     <script src="/web/building_saas/js/global.js"></script>
     <script>
@@ -26,14 +29,14 @@
 
 <body>
     <div class="header">
-        <!-- <div class="top-msg clearfix">
-            <div class="alert alert-warning mb-0 py-0" role="alert">
-                <button type="button" class="close" data-dismiss="alert" aria-label="Close">
+         <div class="top-msg clearfix">
+            <div class="alert alert-warning mb-0 py-0" role="alert" id="notify" style="display: none">
+                <button type="button" class="close" aria-label="Close" onclick="$('#notify').hide();">
                   <span aria-hidden="true">&times;</span>
                 </button>
-                <strong>注意!</strong> 这是一条消息通知 <a href="#">链接</a>
+                <strong id="message"></strong>
             </div>
-        </div> -->
+        </div>
         <nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 justify-content-between">
             <span class="header-logo px-2">Smartcost</span>
             <div class="navbar-text" id="fullpath"><a href="/pm">项目管理</a><i class="fa fa-angle-right fa-fw"></i>文件夹<i class="fa fa-angle-right fa-fw"></i>建设项目<i class="fa fa-angle-right fa-fw"></i>单项工程<i class="fa fa-angle-right fa-fw"></i>单位工程</div>
@@ -90,6 +93,7 @@
             <ul class="nav nav-tabs flex-column" role="tablist">
                 <li class="nav-item"><a class="active" data-toggle="tab" href="#zaojiashu" role="tab">造价书</a></li>
                 <li class="nav-item"><a data-toggle="tab" href="#gongliaoji" role="tab">工料机</a></li>
+                <li class="nav-item"><a data-toggle="tab" href="#fee_rates" id="tab_fee_rate" role="tab" onclick="">费率</a></li>
                 <li class="nav-item"><a data-toggle="tab" href="#baobiao" role="tab" onclick="">报表</a></li>
             </ul>
         </div>
@@ -156,8 +160,6 @@
                                       <div class="main-data-bottom ovf-hidden" id="subSpread">
                                       </div>
                                   </div>
-
-                                  
                               </div>
                           </div>
                       </div>
@@ -451,6 +453,9 @@
                   </div>
               </div>
             </div>
+            <div class="tab-pane" id="fee_rates" role="tabpanel">
+                <%include ../../fee_rates/fee_rate.html %>
+            </div>
           </div>
 
         </div>
@@ -483,6 +488,13 @@
     <!-- SpreadJs -->
     <script type="text/javascript" src="/lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
     <script>GC.Spread.Sheets.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</script>
+    <script src="/lib/spreadjs/views/gc.spread.views.dataview.10.0.0.min.js" type="text/javascript"></script>
+    <!--<script src="/lib/spreadjs/views/common/gc.spread.common.10.0.0.min.js" type="text/javascript"></script>-->
+    <script src="/lib/spreadjs/views/plugins/gc.spread.views.gridlayout.10.0.0.min.js" type="text/javascript"></script>
+    <script src="/lib/spreadjs/views/locale/gc.spread.views.dataview.locale.zh-CN.10.0.0.min.js" type="text/javascript"></script>
+    <script>GC.Spread.Views.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</script>
+
+
     <!-- Model -->
     <script type="text/javascript" src="/web/building_saas/main/js/models/main_consts.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/models/project.js"></script>
@@ -535,6 +547,18 @@
     <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/fee_rate_view.js"></script>
+    <script type="text/javascript" src="/web/building_saas/main/js/views/sub_fee_rate_views.js"></script>
+
+
+   <!-- <script src="/web/building_saas/fee_rates/fee_rate.js"></script>-->
+    <script type="text/javascript">
+        /* autoFlashHeight();
+        loadStdFeeRateLibNames(region);*/
+        //loadProjectFeeRates(feeRateFileID);
+    </script>
+
+
     <script src="/public/debug.js"></script>
 
     <SCRIPT type="text/javascript">

+ 1 - 0
web/building_saas/main/js/models/bills.js

@@ -209,6 +209,7 @@ var Bills = {
             let data = {'ID': node.getID(), 'projectID': this.project.ID()};
             if (field === 'quantity') {
                 data[field] = newValue;
+                data.isFromDetail=0;
                 // to do Calculate
                 if (node.data.fees) {
                     data.fees = node.data.fees;

+ 143 - 11
web/building_saas/main/js/models/fee_rate.js

@@ -7,14 +7,154 @@ var FeeRate = {
     createNew: function (project) {
 
         function FeeRate(proj){
-            this.project = proj;
             this.datas = null;
             this.sourceType = ModuleNames.feeRate;
             proj.registerModule(ModuleNames.feeRate, this);
         };
-
         FeeRate.prototype.loadData = function (datas) {
             this.datas = datas;
+            socketObject.connect();
+        };
+   /*     FeeRate.prototype.getViewDatas = function(){
+            var  rates=[];
+            _.forEach(this.datas,function (item) {
+                if(item.status == 'activate'){
+                    rates= item.rates;
+                }
+            })
+            return rates;
+        };*/
+        FeeRate.prototype.getActivateFeeRate = function () {
+            var feeRate=null;
+            _.forEach(this.datas,function (item) {
+                if(item.status == 'activate'){
+                    feeRate= item;
+                }
+            })
+            return feeRate;
+        };
+        FeeRate.prototype.getActivateFeeRateID = function(){
+            var feeRate = this.getActivateFeeRate()
+            if(feeRate){
+                return feeRate.ID;
+            }else {
+                return 0;
+            }
+        };
+
+        FeeRate.prototype.getSubViewData= function(item) {
+            var datas = [];
+            if(item.hasOwnProperty('subFeeRate')&&item.subFeeRate!=undefined){
+                datas = item.subFeeRate.recodes;
+            }
+            return datas;
+        };
+        FeeRate.prototype.getValueMap= function(item) {
+            var valueMap = {};
+            if(item.hasOwnProperty('subFeeRate')&&item.subFeeRate!=undefined){
+                var recodes = item.subFeeRate.valueMaps;
+                _.forEach(recodes,function (r) {
+                    valueMap[r.ID] = r.value;
+                })
+                return valueMap;
+            }else {
+                return null;
+            }
+        };
+        FeeRate.prototype.getOptions=function (options,subRates,parentID,itemID) {
+            var data = {};
+            var list = _.filter(subRates, {'ParentID':parentID});
+            if(list&&list.length>0){
+                if(parentID==-1){
+                    data.ID = itemID+'_'+0;
+                }else {
+                    data.ID = itemID+'_'+parentID;
+                }
+                data.name = list[0].type;
+                data.optionList=[];
+            }
+            var nexParent = null;
+            _.forEach(list,function (c) {
+                var option={};
+                option.name = c.name;
+                option.value = c.ID;
+                option.selected = c.selected;
+                data.optionList.push(option);
+                if(c.selected&&!c.isLeaf){
+                    nexParent = c.ID;
+                }
+            })
+            options.push(data);
+            if(nexParent!=null){
+                this.getOptions(options,subRates,nexParent,itemID);
+            }
+        };
+        FeeRate.prototype.getUpdateData=function(type,query,doc,callfunction){
+            var updateData = [];
+            var newobj = {
+                'updateType': type,
+                'query': query,
+            }
+            if(doc){
+                newobj['doc']=doc;
+            }
+            if(callfunction){
+                newobj['updateFunction']=callfunction;
+            }
+            updateData.push(newobj);
+            return updateData;
+        };
+        FeeRate.prototype.updateFeeRateByEdit = function(params,feerate){
+            var query={
+                ID:feerate.ID,
+                projectID:feerate.projectID
+            };
+            var doc ={
+                rateIndex:params.sourceIndex,
+                rate:params.dataItem
+            }
+            this.updateFeeRate(query,doc);
+            if(this.ifRateChange(params)){
+                this.synchronizeFeeRate();
+            }
+        };
+
+        FeeRate.prototype.batchUpdateFeeRate = function (items,feerate) {
+            var query={
+                ID:feerate.ID,
+                projectID:project.ID()
+            };
+            this.updateFeeRate(query,items);
+        };
+        FeeRate.prototype.updateFeeRate=function (query,doc) {
+          var updateData = this.getUpdateData('ut_update',query,doc,'update_rates');
+            project.pushNow('updateFeeRate',[this.sourceType],updateData);
+            socket.emit('feeRateChangeNotify', this.getActivateFeeRateID());
+        };
+        FeeRate.prototype.updateStatusBySelected = function (updateTasks) {
+            var updateData = [];
+            var newobj = {
+                'updateType': 'ut_update',
+                'tasks': updateTasks,
+                'updateFunction':'updateStatusBySelected'
+            }
+            updateData.push(newobj);
+            project.pushNow('updateFeeRate',[this.sourceType],updateData);
+        };
+        FeeRate.prototype.synchronizeFeeRate = function () {
+            var node = project.mainTree.selected;
+            if (node.sourceType==='ration'&&rationCalcView.sheet) {
+                rationCalcView.showData(node);
+            }
+        };
+
+        FeeRate.prototype.ifRateChange=function (params) {
+            if(params.dataItem.rate!=params.oldDataItem.rate){
+                return true;
+            }else {
+                return false;
+            }
+
         };
 
         FeeRate.prototype.getRate = function (fileID, rateID){
@@ -25,12 +165,4 @@ var FeeRate = {
         var feeRate = new FeeRate(project);
         return feeRate;
     }
-};
-
-// for test
-/*
-var f = -1;
-var fr = FeeRate.createNew(null);
-f = fr.getRate();
-console.log(fr.sourceType);
-console.log(f);*/
+};

+ 26 - 0
web/building_saas/main/js/models/quantity_detail.js

@@ -447,6 +447,32 @@ var quantity_detail = {
                 this.datas = newList;
             }
         };
+        quantity_detail.prototype.quantityEditChecking = function(value,node,fieldName){
+            var validate = true;
+            if (value && value != calcFees.getFee(node.data, fieldName)){
+                if(fieldName=='quantity'){
+                   if(node.data.hasOwnProperty('isFromDetail')&&node.data.isFromDetail==1){
+                       var c = confirm('已有工程量明细,是否清空明细表,采用手工输入的表达式?')
+                        if(c){
+                            node.data.isFromDetail=0;
+                            if(node.sourceType === project.Bills.getSourceType()){
+                                this.deleteByBills([{type:'delete',data:node.data}]);
+                            }else if(node.sourceType === project.Ration.getSourceType()){
+                                this.deleteByRation(node.data);
+                            }
+                            gljOprObj.detailData=[];
+                            sheetCommonObj.showData(gljOprObj.detailSheet,gljOprObj.detailSetting,[]);
+
+                            validate = true;
+                        }else {
+                            validate = false;
+                        }
+                   }
+                }
+            }
+            return validate;
+
+        }
         return new quantity_detail(project);
     }
 

+ 1 - 0
web/building_saas/main/js/models/ration.js

@@ -235,6 +235,7 @@ var Ration = {
             let data = {'ID': ration.ID, 'projectID': this.project.ID()};
             if (field === 'quantity') {
                 data[field] = newValue;
+                data.isFromDetail=0;
                 // to do Calculate
                 if (ration.fees) {
                     data.fees = ration.fees;

+ 294 - 0
web/building_saas/main/js/views/fee_rate_view.js

@@ -0,0 +1,294 @@
+/**
+ * Created by chen on 2017/8/1.
+ */
+
+/*var rate_data = [
+    {"ID":1,"ParentID":null,"name":"企业管理费","rate":null,"memo":""},
+{"ID":101,"ParentID":1,"name":"建筑工程","rate":16.36,"memo":""},
+{"ID":102,"ParentID":1,"name":"市政工程","rate":17.43,"memo":""},
+{"ID":103,"ParentID":1,"name":"机械土石方","rate":10.82,"memo":""},
+{"ID":104,"ParentID":1,"name":"仿古建筑工程","rate":12,"memo":""},
+{"ID":105,"ParentID":1,"name":"建筑修缮工程","rate":12.47,"memo":""},
+{"ID":106,"ParentID":1,"name":"炉窑砌筑工程","rate":10.8,"memo":""},
+{"ID":2,   "ParentID":null,"name":"夜间施工费","rate":null,"memo":""},
+{"ID":201,"ParentID":2,"name":"建筑工程","rate":0.45,"memo":""},
+{"ID":202,"ParentID":2,"name":"市政工程","rate":0.4,"memo":""},
+{"ID":203,"ParentID":2,"name":"机械土石方","rate":0.7,"memo":""},
+{"ID":204,"ParentID":2,"name":"仿古建筑工程","rate":0.2,"memo":""},
+{"ID":205,"ParentID":2,"name":"建筑修缮工程","rate":0.35,"memo":""},
+{"ID":206,"ParentID":2,"name":"炉窑砌筑工程","rate":0.4,"memo":""},
+{"ID":3,   "ParentID":null,"name":"规费","rate":null,"memo":""},
+{"ID":301,"ParentID":3,"name":"建筑工程","rate":16.03,"memo":""},
+{"ID":302,"ParentID":3,"name":"市政工程","rate":16.33,"memo":""},
+{"ID":303,"ParentID":3,"name":"机械土石方","rate":15.5,"memo":""},
+{"ID":304,"ParentID":3,"name":"仿古建筑工程","rate":12,"memo":""},
+{"ID":305,"ParentID":3,"name":"建筑修缮工程","rate":12.47,"memo":""},
+{"ID":306,"ParentID":3,"name":"炉窑砌筑工程","rate":10.8,"memo":""},
+{"ID":4,"ParentID":null,"name":"利润","rate":null,"memo":""},
+{"ID":401,"ParentID":4,"name":"建筑工程","rate":8.73,"memo":""},
+{"ID":402,"ParentID":4,"name":"市政工程","rate":9.2,"memo":""},
+{"ID":403,"ParentID":4,"name":"机械土石方","rate":6.5,"memo":""},
+{"ID":404,"ParentID":4,"name":"仿古建筑工程","rate":7,"memo":""},
+{"ID":405,"ParentID":4,"name":"建筑修缮工程","rate":3.72,"memo":""},
+{"ID":406,"ParentID":4,"name":"炉窑砌筑工程","rate":4.9,"memo":""},
+{"ID":5,"ParentID":null,"name":"税金","rate":11,"memo":""}];*/
+
+var feeRateObject={
+    mainViews:null,
+    datas:null,
+    canEdit:false,
+    activateFeeRate:null,
+    needCascadeSet:false,
+    selectionLoad:false,
+    columns: [
+        {
+            id: 'name',
+            caption: '专业名称',
+            dataField: 'name',
+            width: 450,
+            allowEditing: false
+        },
+        {
+            id: 'rate',
+            caption: '值%',
+            dataField: 'rate',
+            format: '0.000',
+            width: 120,
+            minWidth: 50,
+            allowEditing: true
+        },
+        {
+            id: 'memo',
+            caption: '备注',
+            dataField: 'memo',
+            minWidth: 120,
+            allowEditing: true
+        },
+        {
+            id: 'ID',
+            caption: 'ID',
+            dataField: 'ID',
+            width: 80,
+            visible: false,
+            allowEditing: false
+        },
+        {
+            id: 'subFeeRate',
+            caption: '子费率',
+            dataField: 'subFeeRate',
+            width: 80,
+            visible: false,
+            allowEditing: false
+        },
+        {
+            id: '_id',
+            caption: '自动ID',
+            dataField: '_id',
+            width: 80,
+            visible: false,
+            allowEditing: false
+        },
+        {
+            id: 'ParentID',
+            caption: '父结点ID',
+            dataField: 'ParentID',
+            width: 80,
+            visible: false,
+            allowEditing: false
+        }
+    ],
+    options :{
+        allowSorting: false,
+        showRowHeader: true,
+        colMinWidth: 80,
+        rowHeight: 30,
+        allowEditing: true,
+        editMode: 'inline',
+        editUnit: 'cell',
+        selectionUnit:  "row",
+        hierarchy: {
+            keyField: 'ID',
+            parentField: 'ParentID',
+            collapsed: false,
+            column: 'name'
+        }
+    },
+    dataSource : {
+        loadRange: function(params) {
+            params.success(feeRateObject.datas);
+        },
+        update: function(params) {
+            if(!params.hasOwnProperty('sourceIndex')){
+               var selected = feeRateObject.mainViews.getSelections()[0];
+                params.sourceIndex = selected.sourceRow;
+            }
+            if(!$('#cascadeSet').prop('checked')||params.hasOwnProperty('viewIndex')){
+                projectObj.project.FeeRate.updateFeeRateByEdit(params,feeRateObject.activateFeeRate);
+            }
+            params.success();
+        }
+    },
+    createSpreadView:function () {
+        if (this.mainViews) {
+            this.mainViews.destroy();
+            this.mainViews = null;
+        }
+        this.activateFeeRate = projectObj.project.FeeRate.getActivateFeeRate();
+        this.datas = this.activateFeeRate.rates;
+        this.mainViews = new GC.Spread.Views.DataView($('#divFee')[0],
+            this.dataSource, this.columns, new GC.Spread.Views.Plugins.GridLayout(this.options));
+        this.mainViews["rowClick"].addHandler(subRateObject.reFreshRateViews);
+        this.mainViews .invalidate();
+        document.querySelector('#divFee').focus();
+    },
+    reFreshRateViews:function() {
+        if(this.mainViews){
+            this.mainViews.refresh()
+        }else {
+            setTimeout("feeRateObject.createSpreadView()",100);
+        }
+    },
+    updateBySelect:function (rate,selectMap,mapID) {
+       var selected = this.mainViews.getSelections()[0];
+       var item = this.datas[selected.sourceRow];
+        item.rate = rate;
+        _.forEach(selectMap,function (value,key) {
+            var recode =  item.subFeeRate.recodes[key];
+            var optionList = recode.optionList;
+            _.forEach(optionList,function (o) {
+                if(o.value==value){
+                    o.selected=true;
+                }else {
+                    o.selected = false;
+                }
+            })
+        })
+        if($('#cascadeSet').prop('checked')){
+            this.cascadeSetRates(item,selected.sourceRow,mapID,selectMap)
+        }else {
+            this.mainViews.data.updateItem(selected.sourceRow,item);
+        }
+        projectObj.project.FeeRate.synchronizeFeeRate();
+
+        //this.views.data.updateItem()
+    },
+    cascadeSetRates:function(selectedItem,sourceRow,mapID,selectMap){
+        var items=[];
+        items.push({rateIndex:sourceRow,rate:selectedItem});
+        _.forEach(this.datas,function (recode,Index) {
+            if(Index!=sourceRow&&recode.subFeeRate){
+                var valueMaps = recode.subFeeRate.valueMaps;
+                var valueMap = _.find(valueMaps,{ID:mapID});
+                if(valueMap){//选项完全一样的情况
+                    if(valueMap.value==recode.rate){
+                        return;
+                    }else {
+                        recode.rate = valueMap.value;
+                        _.forEach(selectMap,function (value,key) {
+                            var tempRecode =  recode.subFeeRate.recodes[key];
+                            var optionList = tempRecode.optionList;
+                            _.forEach(optionList,function (o) {
+                                if(o.value==value){
+                                    o.selected=true;
+                                }else {
+                                    o.selected = false;
+                                }
+                            })
+                        })
+                        items.push({rateIndex:Index,rate:recode});
+                    }
+                }else {//某条选项一样的情况
+                    var needUpdate = false;
+                    var selectList = mapID.split('-');
+                    var newList=[];
+                    _.forEach(recode.subFeeRate.recodes,function (r) {
+                        var oList = r.optionList;
+                        var oldSelectIndex=0;
+                        var hasChange=false;
+                        _.forEach(oList,function (o,key) {
+                            if(o.selected){
+                                oldSelectIndex = key;
+                            }
+                            if(_.includes(selectList,o.value)){
+                                needUpdate=true;
+                                o.selected=true;
+                                hasChange=true;
+                                newList.push(o.value);
+                            }else {
+                                o.selected=false;
+                            }
+                        })
+                        if(!hasChange){
+                            oList[oldSelectIndex].selected=true;
+                            newList.push(oList[oldSelectIndex].value)
+                        }
+                    })
+                    if(needUpdate){
+                      var newValue =   _.find(valueMaps,{ID:newList.join("-")})//取出费率值并更新
+                        if(newValue){
+                          if(recode.rate != newValue.value){
+                              recode.rate = newValue.value
+                              items.push({rateIndex:Index,rate:recode});
+                          }
+                        }
+                    }
+                }
+            }
+        })
+
+        _.forEach(items,function (t) {
+            feeRateObject.mainViews.data.updateItem(t.rateIndex,t.rate);
+        })
+
+        projectObj.project.FeeRate.batchUpdateFeeRate(items,feeRateObject.activateFeeRate);
+    },
+    loadFeeRateSelection:function() {
+        if(!this.selectionLoad){
+            var selectedID=0;
+            _.forEach(projectObj.project.FeeRate.datas,function (data) {
+                var option =  $("<option>").val(data.ID).text(data.libName);
+                $('#inlineFormCustomSelect').append(option);
+                if(data.status=='activate'){
+                    selectedID=data.ID;
+                }
+            })
+            $('#inlineFormCustomSelect').val(selectedID);
+        }
+    }
+}
+
+$('#tab_fee_rate').bind('click', function () {
+    $("#de").trigger("click");
+    feeRateObject.reFreshRateViews();
+    $('#projectName').text(projectInfoObj.projectInfo.name);
+    feeRateObject.loadFeeRateSelection();
+});
+
+/*$('#fee_rates').bind('click', function () {
+    feeRateObject.datas[0].name = 'test';
+    feeRateObject.mainViews.refresh();
+    feeRateObject.mainViews.invalidate();
+
+});*/
+
+$('#inlineFormCustomSelect').change(function(){
+    var updateTask = [];
+    var selectID = $(this).val();
+    var oldValue=0;
+    _.forEach(projectObj.project.FeeRate.datas,function (feeRate) {
+        if(feeRate.status=='activate'){
+            oldValue=feeRate.ID;
+        }
+        if(feeRate.ID ==selectID){
+            feeRate.status='activate';
+        }else {
+            feeRate.status='disable';
+        }
+        updateTask.push({query:{ID:feeRate.ID,projectID:projectObj.project.ID()},doc:{status:feeRate.status}});
+    })
+    projectObj.project.FeeRate.updateStatusBySelected(updateTask);
+    feeRateObject.createSpreadView();
+    subRateObject.destorySpreadView();
+    socket.emit('changeActivateFeeRate',{oldRoom:oldValue,newRoom:selectID});
+
+})

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

@@ -54,10 +54,12 @@ var projectObj = {
         let colSetting = projectObj.mainController.setting.cols[info.col];
         let fieldName = projectObj.mainController.setting.cols[info.col].data.field;
         let value = projectObj.checkSpreadEditingText(info.editingText, colSetting);
+        let validate = project.quantity_detail.quantityEditChecking(value,node,fieldName);
+
         if (colSetting.data.wordWrap) {
             info.sheet.autoFitRow(info.row);
         }
-        if (value && value != calcFees.getFee(node.data, fieldName)) {
+        if (value && value != calcFees.getFee(node.data, fieldName)&&validate) {
             if (node.sourceType === project.Bills.getSourceType()) {
                 project.Bills.updateField(node.source, fieldName, value);
             } else if (node.sourceType === project.Ration.getSourceType()) {

+ 114 - 0
web/building_saas/main/js/views/sub_fee_rate_views.js

@@ -0,0 +1,114 @@
+/**
+ * Created by chen on 2017/8/1.
+ */
+var optionMap={
+"1":[{}]
+
+};
+
+
+var subRateData=[
+    {"ID":10101,"name":"工程分类","typeName":"一类工程",optionList:[{name:'一类工程',value:"1",selected:true},{name:'二类工程',value:"2",selected:false},{name:'三类工程',value:"3",selected:false}]},
+    {"ID":10102,"name":"地区","typeName":"在市区",optionList:[{name:'在市区',value:16.36,selected:false},{name:'县城镇',value:16.21,selected:true},{name:'不在市区、县城镇',value:15.94,selected:false}]}
+];
+
+var subRateObject={
+    views:null,
+    datas:null,
+    valueMap:null,
+    canEdit:true,
+    columns: [
+        {
+            id: 'name',
+            caption: '参数名称',
+            dataField: 'name',
+            width: 250,
+            allowEditing: false
+        },
+        {
+            id: 'typeName',
+            caption: '参数值',
+            dataField: 'typeName',
+            width: 200,
+            minWidth: 50,
+            allowEditing: true,
+            presenter:'<div><select class="form-control form-control-sm" id="{{=it.ID}}" onchange="subRateObject.subRateChange(this)" style="width: 100%">  </select></div>'
+        },
+        {
+            id: 'ID',
+            caption: 'ID',
+            dataField: 'ID',
+            width: 80,
+            visible: false,
+            allowEditing: false
+        }
+    ],
+    options :{
+        allowSorting: false,
+        showRowHeader: true,
+        colMinWidth: 80,
+        rowHeight: 33,
+        allowEditing: this.canEdit,
+        editMode: 'inline',
+        editUnit: 'cell',
+        selectionUnit:(this.canEdit == true) ? "cell" : "row"
+    },
+    createSpreadView:function () {
+        if (this.views) {
+            this.views.destroy();
+            this.views = null;
+        }
+        this.views = new GC.Spread.Views.DataView($('#subRate')[0],
+            this.datas, this.columns, new GC.Spread.Views.Plugins.GridLayout(this.options));
+
+        this.views["rowDbClick"].addHandler(function () {
+            console.log('hh')
+        });
+        this.views.invalidate();
+        document.querySelector('#subRate').focus();
+        this.addComboboxOption(this.datas);
+
+    },
+       reFreshRateViews:function(sender,args) {
+        subRateObject.datas = projectObj.project.FeeRate.getSubViewData(args.item);
+        subRateObject.valueMap=projectObj.project.FeeRate.getValueMap(args.item);
+        subRateObject.createSpreadView();
+    },
+    addComboboxOption:function (datas) {
+        //<option value ="volvo">Volvo</option> <option value ="saab">Saab</option> <option value="opel">Opel</option> <option value="audi">Audi</option>
+        _.forEach(datas,function (item) {
+            var selectvalue = 0;
+            _.forEach(item.optionList,function (o) {
+                var option =  $("<option>").val(o.value).text(o.name);
+                $('#'+item.ID).append(option);
+                if(o.selected){
+                    selectvalue = o.value;
+                }
+            })
+            $('#'+item.ID).val(selectvalue);
+        })
+    },
+    subRateChange:function(select){
+        var me = subRateObject;
+        var selectValueList=[];
+        var selectMap={};
+        if(me.datas&&me.datas.length>0){
+            _.forEach(me.datas,function (d,key) {
+                var selectValue = $('#'+d.ID).val();
+                selectValueList.push(selectValue);
+                selectMap[key]=selectValue;
+            })
+            var mapID =selectValueList.join('-');
+           var  rate = me.valueMap[mapID];
+            feeRateObject.updateBySelect(rate,selectMap,mapID);
+        }
+    },
+    destorySpreadView:function () {
+        if(this.views){
+            this.views.destroy();
+            this.views = null;
+        }
+        subRateObject.datas=null;
+        subRateObject.valueMap=null;
+    }
+}