Browse Source

update FeeRate

zhangweicheng 8 years ago
parent
commit
c96d398413

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

@@ -2,6 +2,11 @@
  * Created by CSL on 2017-03-23.
  * 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 stdFeeRateLibs = require('../../std_fee_rate_libs/models/std_fee_rate_libs');
 var projectFeeRateFile = require('../models/fee_rates');
 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);
+    }
+}

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

@@ -2,58 +2,50 @@
  * Created by CSL on 2017-03-29.
  * 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,
     ID: Number,
     ParentID: Number,
     ParentID: Number,
     name: String,
     name: String,
     rate: Number,
     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,
     libID: Number,
     libName: String,
     libName: String,
+    projectID:Number,
+    status:String,
     rates: [ratesSchema]
     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', {});
         res.render('building_saas/fee_rates/fee_rate', {});
     });
     });
     frRouter.post('/getLibNames', frController.libNames);
     frRouter.post('/getLibNames', frController.libNames);
+/*    frRouter.post('/getLibNames', frController.libNames);
     frRouter.post('/getLibFeeRates', frController.libFeeRates);
     frRouter.post('/getLibFeeRates', frController.libFeeRates);
     frRouter.post('/getProjectFeeRates', frController.projectFeeRates);
     frRouter.post('/getProjectFeeRates', frController.projectFeeRates);
-    frRouter.post('/updateProjectFeeRate', frController.projectFeeUpdateRate);
+    frRouter.post('/updateProjectFeeRate', frController.projectFeeUpdateRate);*/
 
 
     app.use('/feeRates',frRouter);
     app.use('/feeRates',frRouter);
 }
 }

+ 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_coe_data = require('../../ration_glj/facade/ration_coe_facade');
 var ration_ass_data = require('../../ration_glj/facade/ration_ass_facade');
 var ration_ass_data = require('../../ration_glj/facade/ration_ass_facade');
 var quantity_detail_data = require('../../ration_glj/facade/quantity_detail_facade');
 var quantity_detail_data = require('../../ration_glj/facade/quantity_detail_facade');
+var fee_rate_data = require('../../fee_rates/facade/fee_rates_facade');
 let projCounter = require('./proj_counter');
 let projCounter = require('./proj_counter');
 let volumePriceData = require('../../volume_price/models/volume_price_model');
 let volumePriceData = require('../../volume_price/models/volume_price_model');
 var consts = require('./project_consts');
 var consts = require('./project_consts');
@@ -25,7 +26,7 @@ moduleMap[projectConsts.RATION_ASS] = ration_ass_data;
 moduleMap[projectConsts.QUANTITY_DETAIL] = quantity_detail_data;
 moduleMap[projectConsts.QUANTITY_DETAIL] = quantity_detail_data;
 moduleMap[projCounter.collectionName] = projCounter;
 moduleMap[projCounter.collectionName] = projCounter;
 moduleMap[volumePriceData.collectionName] = volumePriceData;
 moduleMap[volumePriceData.collectionName] = volumePriceData;
-
+moduleMap[projectConsts.FEERATE] = fee_rate_data;
 
 
 var Project = function (){};
 var Project = function (){};
 
 

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

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

+ 0 - 1
modules/ration_glj/facade/quantity_detail_facade.js

@@ -515,7 +515,6 @@ function update_quantity_detail(user_id,datas) {
     if(datas.updateFunction){
     if(datas.updateFunction){
         return updateFunctionMap[datas.updateFunction](user_id,datas);
         return updateFunctionMap[datas.updateFunction](user_id,datas);
     }else {
     }else {
-        console.log(datas);
         return normalUpdate(user_id,datas);
         return normalUpdate(user_id,datas);
     }
     }
 }
 }

+ 2 - 0
server.js

@@ -21,6 +21,8 @@ dbm.connect();
 fileUtils.getGlobbedFiles('./modules/ration_glj/models/*.js').forEach(function(modelPath) {
 fileUtils.getGlobbedFiles('./modules/ration_glj/models/*.js').forEach(function(modelPath) {
     require(path.resolve(modelPath));
     require(path.resolve(modelPath));
 })
 })
+//暂时引入其它模块的model
+require('./modules/fee_rates/models/fee_rates');
 
 
 let app = express();
 let app = express();
 let _rootDir = __dirname;
 let _rootDir = __dirname;

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

@@ -293,6 +293,7 @@ body {
 .modal-fixed-height {
 .modal-fixed-height {
   height: 400px;
   height: 400px;
   overflow-y: auto;
   overflow-y: auto;
+  width:100%
 }
 }
 .sidebar-tools-bar {
 .sidebar-tools-bar {
   background:#fff
   background:#fff
@@ -301,3 +302,22 @@ body {
   background:#fff;
   background:#fff;
   border-bottom:1px solid #ddd
   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;
+}
+
+/*
+.gc-cell span{font-size: 12px !important}*/

+ 0 - 131
web/building_saas/fee_rates/fee_rate.html

@@ -1,131 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-    <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>
-                    </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>
-            </div>
-        </div>
-
-        <div class="grid" id="divFee"></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>
-
-</html>

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

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

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

@@ -13,8 +13,11 @@
     <link rel="stylesheet" href="/lib/ztree/css/zTreeStyle.css" type="text/css">
     <link rel="stylesheet" href="/lib/ztree/css/zTreeStyle.css" type="text/css">
     <!--SpreadJs-->
     <!--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/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 -->
     <!-- jquery.contextmenu -->
     <link rel="stylesheet" href="/lib/jquery-contextmenu/jquery.contextMenu.css" type="text/css">
     <link rel="stylesheet" href="/lib/jquery-contextmenu/jquery.contextMenu.css" type="text/css">
+
+
     <script src="/lib/jquery/jquery.min.js"></script>
     <script src="/lib/jquery/jquery.min.js"></script>
     <script src="/web/building_saas/js/global.js"></script>
     <script src="/web/building_saas/js/global.js"></script>
     <script>
     <script>
@@ -90,6 +93,7 @@
             <ul class="nav nav-tabs flex-column" role="tablist">
             <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 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="#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>
                 <li class="nav-item"><a data-toggle="tab" href="#baobiao" role="tab" onclick="">报表</a></li>
             </ul>
             </ul>
         </div>
         </div>
@@ -156,8 +160,6 @@
                                       <div class="main-data-bottom ovf-hidden" id="subSpread">
                                       <div class="main-data-bottom ovf-hidden" id="subSpread">
                                       </div>
                                       </div>
                                   </div>
                                   </div>
-
-                                  
                               </div>
                               </div>
                           </div>
                           </div>
                       </div>
                       </div>
@@ -451,6 +453,38 @@
                   </div>
                   </div>
               </div>
               </div>
             </div>
             </div>
+            <div class="tab-pane" id="fee_rates" role="tabpanel">
+
+                <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>
+                                    <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>
+                </div>
+            </div>
           </div>
           </div>
 
 
         </div>
         </div>
@@ -483,6 +517,13 @@
     <!-- SpreadJs -->
     <!-- SpreadJs -->
     <script type="text/javascript" src="/lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
     <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>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 -->
     <!-- 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/main_consts.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/models/project.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/models/project.js"></script>
@@ -534,6 +575,17 @@
     <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/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/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/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 src="/public/debug.js"></script>
 
 
     <SCRIPT type="text/javascript">
     <SCRIPT type="text/javascript">

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

@@ -7,16 +7,126 @@ var FeeRate = {
     createNew: function (project) {
     createNew: function (project) {
 
 
         function FeeRate(proj){
         function FeeRate(proj){
-            this.project = proj;
             this.datas = null;
             this.datas = null;
             this.sourceType = ModuleNames.feeRate;
             this.sourceType = ModuleNames.feeRate;
             proj.registerModule(ModuleNames.feeRate, this);
             proj.registerModule(ModuleNames.feeRate, this);
         };
         };
-
         FeeRate.prototype.loadData = function (datas) {
         FeeRate.prototype.loadData = function (datas) {
             this.datas = datas;
             this.datas = datas;
         };
         };
+   /*     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.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);
+        };
 
 
+        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);
+        };
+        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.getRate = function (fileID, rateID){
         FeeRate.prototype.getRate = function (fileID, rateID){
 
 
             return 1.25;
             return 1.25;
@@ -25,12 +135,4 @@ var FeeRate = {
         var feeRate = new FeeRate(project);
         var feeRate = new FeeRate(project);
         return feeRate;
         return feeRate;
     }
     }
-};
-
-// for test
-/*
-var f = -1;
-var fr = FeeRate.createNew(null);
-f = fr.getRate();
-console.log(fr.sourceType);
-console.log(f);*/
+};

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

@@ -0,0 +1,280 @@
+/**
+ * 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);
+        }
+        //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();
+});
+
+$('#inlineFormCustomSelect').change(function(){
+    var updateTask = [];
+    var selectID = $(this).val();
+    _.forEach(projectObj.project.FeeRate.datas,function (feeRate) {
+        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();
+})

+ 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;
+    }
+}