فهرست منبع

提交版本管理的修改

caiaolin 8 سال پیش
والد
کامیت
8ecb2e3859

+ 55 - 0
modules/common/const/engineering.js

@@ -0,0 +1,55 @@
+/**
+ * 专业工程相关常量
+ *
+ * @author CaiAoLin
+ * @date 2017/8/7
+ * @version
+ */
+const engineering = {
+    // 建筑工程
+    ARCHITECTURE: 1,
+    // 装饰工程
+    DECORATE: 2,
+    // 仿古建筑工程
+    ANTIQUE_ARCHITECTURE: 3,
+    // 安装工程
+    BUILD_IN: 4,
+    // 市政土建工程
+    MUNICIPAL_CONSTRUCTION: 5,
+    // 市政安装工程
+    MUNICIPAL_BUILD_IN: 6,
+    // 人工土石方工程
+    ARTIFICIAL_EARTHWORK: 7,
+    // 机械土石方工程
+    MECHANICAL_EARTHWORK: 8,
+    // 炉窖砌筑工程
+    KILN_MASONRY: 9,
+    // 园林工程
+    GARDEN: 10,
+    // 绿化工程
+    PLANTING: 11,
+    // 单拆除工程
+    DISMANTLE: 12,
+    // 建筑修缮工程
+    BUILDING_REPAIR: 13,
+    // 安装修缮工程
+    BUILD_IN_REPAIR: 14
+};
+const engineeringList = [
+    {name: "建筑工程", value: engineering.ARCHITECTURE},
+    {name: "装饰工程", value: engineering.DECORATE},
+    {name: "仿古建筑工程", value: engineering.ANTIQUE_ARCHITECTURE},
+    {name: "安装工程", value: engineering.BUILD_IN},
+    {name: "市政土建工程", value: engineering.MUNICIPAL_CONSTRUCTION},
+    {name: "市政安装工程", value: engineering.MUNICIPAL_BUILD_IN},
+    {name: "人工土石方工程", value: engineering.ARTIFICIAL_EARTHWORK},
+    {name: "机械土石方工程", value: engineering.MECHANICAL_EARTHWORK},
+    {name: "炉窖砌筑工程", value: engineering.KILN_MASONRY},
+    {name: "园林工程", value: engineering.GARDEN},
+    {name: "绿化工程", value: engineering.PLANTING},
+    {name: "单拆除工程", value: engineering.DISMANTLE},
+    {name: "建筑修缮工程", value: engineering.BUILDING_REPAIR},
+    {name: "安装修缮工程", value: engineering.BUILD_IN_REPAIR},
+];
+
+export {engineering as default, engineeringList as List};

+ 43 - 0
modules/common/helper/mongoose_helper.js

@@ -213,6 +213,49 @@ class MongooseHelper {
     }
 
     /**
+     * 嵌套结构的新增
+     *
+     * @param {Object} condition
+     * @param {Object} insertData
+     * @return {Promise}
+     */
+    addToSet(condition, insertData) {
+        let self = this;
+        return new Promise(function(resolve, reject) {
+            condition = self._convertId(condition);
+            self.model.update(condition, {$addToSet: insertData}, function(error, data) {
+                if (error) {
+                    reject(error);
+                } else {
+                    resolve(data);
+                }
+            });
+        });
+    }
+
+    /**
+     * 删除嵌套结构数据
+     *
+     * @param {Object} condition
+     * @param {Object} deleteData
+     * @return {Promise}
+     */
+    deleteSet(condition, deleteData) {
+        let self = this;
+        return new Promise(function(resolve, reject) {
+            condition = self._convertId(condition);
+            self.model.update(condition, {$pull: deleteData}, function(error, data) {
+                if (error) {
+                    reject(error);
+                } else {
+                    resolve(data);
+                }
+            });
+        });
+    }
+
+
+    /**
      * id转换为objectId
      *
      * @param {object} condition

+ 149 - 39
modules/users/controllers/version_controller.js

@@ -10,6 +10,7 @@ import VersionModel from "../models/version_model";
 import STDRationLibMapModel from "../../common/std/std_ration_lib_map_model";
 import STDBillLibListsModel from "../../common/std/std_bills_lib_lists_model";
 import {default as ProvinceConst, List as ProvinceList} from "../../common/const/province_const";
+import {default as EngineeringConst, List as EngineeringList} from "../../common/const/engineering";
 
 class VersionController extends BaseController {
 
@@ -24,20 +25,8 @@ class VersionController extends BaseController {
         let id = request.query.id;
 
         let versionList = [];
-
-
-        let rationList = {};
         let selectedVersion = {};
-        let billList = {};
         try {
-            // 获取标准清单
-            let stdBillLibListsModel = new STDBillLibListsModel();
-            billList = await stdBillLibListsModel.getBillList();
-
-            // 获取定额库
-            let stdRationLibMapModel = new STDRationLibMapModel();
-            rationList = await stdRationLibMapModel.getRationLib();
-
             let versionModel = new VersionModel();
             versionList = await versionModel.getVersionList();
 
@@ -53,6 +42,7 @@ class VersionController extends BaseController {
             }
 
             selectedVersion = Object.keys(selectedVersion).length <= 0 ? versionList[0] : selectedVersion;
+            request.session.selectedVersion = selectedVersion;
 
         } catch (error) {
             console.log(error);
@@ -62,9 +52,6 @@ class VersionController extends BaseController {
             id: id,
             versionList: versionList,
             selectedVersion: selectedVersion,
-            billList: JSON.stringify(billList),
-            rationList: JSON.stringify(rationList),
-            province: JSON.stringify(ProvinceList),
             layout: 'users/views/layout/layout'
         };
 
@@ -72,37 +59,35 @@ class VersionController extends BaseController {
     }
 
     /**
-     * 新增版本操作
+     * 新增计价页面
      *
      * @param {object} request
      * @param {object} response
      * @return {void}
      */
-    async add(request, response) {
+    async addValuation(request, response) {
         let name = request.body.name;
-        let standardBillId = request.body.standard_bill_id;
-        let standardBill = request.body.standard_bill;
-        let rationLibId = request.body.ration_lib_id;
-        let rationLib = request.body.ration_lib;
+        let id = request.body.id;
+        let section = request.body.section;
 
         let responseData = {
             err: 0,
             msg: ''
         };
         try {
-            let sessionManager = request.session.managerData;
+            if (id === undefined || id === '') {
+                throw '参数错误';
+            }
+
             let insertData = {
                 name: name,
-                standard_bill: [{id: standardBillId, name: standardBill}],
-                ration_lib: [{id: rationLibId, name: rationLib}],
-                creator: sessionManager.userID
             };
 
             let versionModel = new VersionModel();
-            let result = await versionModel.add(insertData);
+            let result = await versionModel.addValuation(id, section, insertData);
 
             if (!result) {
-                throw '新增版本失败';
+                throw '新增计价规则失败';
             }
         } catch (error) {
             console.log(error);
@@ -114,24 +99,144 @@ class VersionController extends BaseController {
     }
 
     /**
-     * 新增标准清单/定额库
+     * 修改计价规则页面
+     *
+     * @param {object} request
+     * @param {object} response
+     * @return {void}
+     */
+    async editValuation(request, response) {
+        let selectedVersion = request.session.selectedVersion;
+        let valuationId = request.params.id;
+        let section = request.params.section;
+
+        let billList = {};
+        let rationList = {};
+        let versionList = [];
+        let valuationData = {};
+        let valuationList = {};
+        try {
+            let versionModel = new VersionModel();
+            versionList = await versionModel.getVersionList();
+
+            // 获取标准清单
+            let stdBillLibListsModel = new STDBillLibListsModel();
+            billList = await stdBillLibListsModel.getBillList();
+
+            // 获取定额库
+            let stdRationLibMapModel = new STDRationLibMapModel();
+            rationList = await stdRationLibMapModel.getRationLib();
+
+            // 获取对应的计价规则数据
+            [valuationData, valuationList] = await versionModel.getValuation(selectedVersion._id, valuationId, section);
+            if (Object.keys(valuationData).length <= 0) {
+                throw '不存在数据';
+            }
+
+        } catch (error) {
+            console.log(error);
+        }
+
+        let renderData = {
+            versionList: versionList,
+            billList: JSON.stringify(billList),
+            rationList: JSON.stringify(rationList),
+            province: JSON.stringify(ProvinceList),
+            engineeringList: EngineeringList,
+            selectedVersion: selectedVersion,
+            valuationData: valuationData,
+            valuationList: valuationList,
+            valuationId: valuationId,
+            section: section,
+            layout: 'users/views/layout/layout'
+        };
+        response.render('users/views/version/add', renderData);
+    }
+
+    /**
+     * 保存计价规则
      *
      * @param {object} request
      * @param {object} response
      * @return {void}
      */
-    async addLib(request, response) {
+    async saveValuation(request, response) {
+        let valuationId = request.body.id;
+        try {
+            if (valuationId === '') {
+                throw 'id参数错误';
+            }
+
+            let versionModel = new VersionModel();
+            let result = await versionModel.saveValuation(valuationId, request.body);
+
+            if (!result) {
+                throw '保存失败';
+            }
+
+        } catch (error) {
+            console.log(error);
+        }
+
+        response.redirect(request.headers.referer);
+    }
+
+    /**
+     * 删除计价规则
+     *
+     * @param {object} request
+     * @param {object} response
+     * @return {void}
+     */
+    async deleteValuation(request, response) {
+        let id = request.params.id;
+        let section = request.params.section;
+        let selectedVersion = request.session.selectedVersion;
+
+        try {
+            if (id === undefined || id === '' || section === undefined || section === '') {
+                throw '参数错误';
+            }
+
+            let versionModel = new VersionModel();
+            let result = versionModel.deleteValuation(selectedVersion._id, id, section);
+
+            if (!result) {
+                throw '删除失败';
+            }
+
+        } catch (error) {
+            console.log(error);
+        }
+
+        response.redirect(request.headers.referer);
+    }
+
+    /**
+     * 快速切换启用/禁用
+     *
+     * @param {object} request
+     * @param {object} response
+     * @return {void}
+     */
+    async enableSwitch(request, response) {
+        let id = request.body.id;
+        let section = request.params.section;
+        let enable = request.body.enable;
+
         let responseData = {
             err: 0,
             msg: ''
         };
         try {
             let versionModel = new VersionModel();
-            let addResult = await versionModel.addLib(request.body);
-            if (!addResult) {
-                throw '新增失败';
+            let result = await versionModel.switchEnable(id, section, enable);
+
+            if (!result) {
+                throw '新增版本失败';
             }
         } catch (error) {
+            console.log(error);
             responseData.err = 1;
             responseData.msg = error;
         }
@@ -140,28 +245,33 @@ class VersionController extends BaseController {
     }
 
     /**
-     * 删除对应的标准清单/定额库
+     * 新增版本操作
      *
      * @param {object} request
      * @param {object} response
      * @return {void}
      */
-    async deleteLib(request, response) {
-        let id = request.body.id;
-        let model = request.body.model;
-        let deleteId = request.body.delete_id;
+    async addVersion(request, response) {
+        let name = request.body.name;
         let responseData = {
             err: 0,
             msg: ''
         };
         try {
+            let sessionManager = request.session.managerData;
+            let insertData = {
+                name: name,
+                creator: sessionManager.userID
+            };
+
             let versionModel = new VersionModel();
-            let result = await versionModel.deleteLib(id, deleteId, model);
+            let result = await versionModel.add(insertData);
 
             if (!result) {
-                throw '删除失败';
+                throw '新增版本失败';
             }
         } catch (error) {
+            console.log(error);
             responseData.err = 1;
             responseData.msg = error;
         }

+ 47 - 7
modules/users/models/schemas/version.js

@@ -9,22 +9,62 @@ import mongoose from "mongoose";
 
 let Schema = mongoose.Schema;
 let collectionName = 'version';
+let childrenSchema = new Schema({
+    // 计价名称
+    name: String,
+    // 工程专业
+    engineering: {
+        type: Number,
+        default: ''
+    },
+    // 标准清单
+    bill_lib: {
+        type: Schema.Types.Mixed,
+        default: []
+    },
+    // 定额库
+    ration_lib: {
+        type: Schema.Types.Mixed,
+        default: []
+    },
+    // 是否启用
+    enable: {
+        type: Boolean,
+        default: false
+    },
+    // 类型
+    type: {
+        type: Number
+    }
+});
 let modelSchema = {
+    // 是否发布
+    is_release: {
+        type: Boolean,
+        default: false
+    },
     // 自增id
     id: {
-        type: Number,
-        index: true
+        type: Number
+    },
+    // 清单计价规则
+    bill_valuation: {
+        type: [childrenSchema],
+        default: []
+    },
+    // 定额计价规则
+    ration_valuation: {
+        type: [childrenSchema],
+        default: []
     },
     // 名称
     name: String,
-    // 标准清单
-    standard_bill: Schema.Types.Mixed,
-    // 定额库
-    ration_lib: Schema.Types.Mixed,
     // 创建时间
     create_time: Number,
     // 创建者id
-    creator: String
+    creator: String,
+    // 最后修改时间
+    update_time: Number
 };
 let model = mongoose.model(collectionName, new Schema(modelSchema, {versionKey: false, collection: collectionName}));
 export {model as default, collectionName as collectionName};

+ 159 - 70
modules/users/models/version_model.js

@@ -7,10 +7,18 @@
  */
 import BaseModel from "../../common/base/base_model";
 import VersionSchema from "./schemas/version";
+import mongoose from "mongoose";
 
 class VersionModel extends BaseModel {
 
     /**
+     * 允许的块
+     *
+     * @var {Array}
+     */
+    sectionList = ['bill', 'ration'];
+
+    /**
      * 构造函数
      *
      * @return {void}
@@ -27,7 +35,10 @@ class VersionModel extends BaseModel {
      * @return {Promise}
      */
     async getVersionList() {
-        let versionData = await this.findDataByCondition({name: {$ne: ''}}, null, false);
+        // 筛选字段
+        let field = {_id: 1, name: 1, "ration_valuation._id": 1, "ration_valuation.name": 1, "ration_valuation.enable": 1,
+            "bill_valuation._id": 1, "bill_valuation.name": 1, "bill_valuation.enable": 1};
+        let versionData = await this.findDataByCondition({name: {$ne: ''}}, field, false);
 
         return versionData === null ? [] : versionData;
     }
@@ -43,8 +54,6 @@ class VersionModel extends BaseModel {
             // 新增
             case 'add':
                 this.model.schema.path('name').required(true);
-                this.model.schema.path('standard_bill').required(true);
-                this.model.schema.path('ration_lib').required(true);
                 this.model.schema.path('creator').required(true);
                 this.model.schema.path('create_time').required(true);
                 break;
@@ -70,100 +79,180 @@ class VersionModel extends BaseModel {
     }
 
     /**
-     * 新增标准清单/定额库
+     * 新增计价规则
      *
-     * @param {Object} postData
+     * @param {String} id
+     * @param {String} section
+     * @param {Object} data
      * @return {Promise}
      */
-    async addLib(postData) {
-        if (postData.id === undefined || postData.model === undefined) {
-            throw '参数错误';
-        }
-        let model = postData.model;
-        let id = postData.id;
-        let standardBillId = postData.standard_bill_id;
-        let standardBill = postData.standard_bill;
-        let rationLibId = postData.ration_lib_id;
-        let rationLib = postData.ration_lib;
-
-        switch (model) {
-            case 'bill':
-                if (standardBillId === undefined || standardBill === undefined) {
-                    throw '参数错误';
-                }
-                break;
-            case 'ration':
-                if (rationLibId === undefined || rationLib === undefined) {
-                    throw '参数错误';
-                }
-                break;
-        }
-
-        let versionData = await this.findDataByCondition({_id: id});
-        if (versionData === null || versionData.standard_bill === undefined) {
+    async addValuation(id, section, data) {
+        let condition = {_id: id};
+        let versionData = await this.findDataByCondition(condition);
+        if (versionData === null || versionData.name === undefined) {
             throw '没有找到对应的数据';
         }
 
-        let updateData = {};
-        let field = model === 'bill' ? 'standard_bill' : 'ration_lib';
-        let tmpData = {
-            id: model === 'bill' ? standardBillId : rationLibId,
-            name: model === 'bill' ? standardBill : rationLib
-        };
-        // 判断是否有重复
-        if (versionData[field].length > 0) {
-            for (let tmp of versionData[field]) {
-                if (tmp.id === tmpData.id) {
-                    throw '已存在对应数据';
-                }
-            }
+        if (data.name === undefined || data.name === '') {
+            throw '计价规则名称为空';
+        }
+        if (this.sectionList.indexOf(section) < 0) {
+            throw '数据有误';
         }
-        versionData[field].push(tmpData);
-        updateData[field] = versionData[field];
 
-        let result = await this.db.update({_id: id}, updateData);
+        let insertData = {};
+        insertData[section + '_valuation'] = data;
+        let result = await this.db.addToSet(condition, insertData);
 
         return result.ok === undefined ? false : result.ok;
     }
 
     /**
-     * 删除对应的标准清单库/定额库
+     * 保存计价数据
      *
-     * @param {Number} id
-     * @param {Number} libId
-     * @param {String} model
+     * @param {String} valuationId
+     * @param {Object} data
      * @return {Promise}
      */
-    async deleteLib(id, libId, model) {
-        let versionData = await this.findDataByCondition({_id: id});
-        if (versionData === null || versionData.standard_bill === undefined) {
-            throw '没有找到对应的数据';
+    async saveValuation(valuationId, data) {
+        data = this._filterValuationData(data);
+        let sectionString = data.section + "_valuation";
+        let condition = {};
+        condition[sectionString + "._id"] = valuationId;
+
+        let updateData = {};
+        updateData[sectionString + ".$.bill_lib"] = data.bill_lib;
+        updateData[sectionString + ".$.ration_lib"] = data.ration_lib;
+        updateData[sectionString + ".$.name"] = data.name;
+        updateData[sectionString + ".$.engineering"] = data.engineering;
+
+        let result = await this.db.update(condition, updateData);
+
+        return result !== null && result.ok === 1;
+    };
+
+    /**
+     * 更改启用/禁用
+     *
+     * @param {String} valuationId
+     * @param {String} section
+     * @param {String} enable
+     * @return {Promise}
+     */
+    async switchEnable(valuationId, section, enable) {
+        let sectionString = section + "_valuation";
+        let condition = {};
+        condition[sectionString + "._id"] = valuationId;
+
+        let updateData = {};
+        updateData[sectionString + ".$.enable"] = enable === "true";
+
+        let result = await this.db.update(condition, updateData);
+
+        return result !== null && result.ok === 1;
+    }
+
+    /**
+     * 过滤计价数据
+     *
+     * @param {Object} data
+     * @return {Object}
+     */
+    _filterValuationData(data) {
+        if (Object.keys(data).length <= 0) {
+            throw '数据有误';
+        }
+
+        if (data.section === undefined || data.section === '' || this.sectionList.indexOf(data.section) < 0) {
+            throw '类型错误';
+        }
+
+        // 判断名称
+        if (data.name === undefined || data.name === '') {
+            throw '名称不能为空';
         }
+        // 判断工程专业
+        if (data.engineering === undefined || data.engineering === '') {
+            throw '名称不能为空';
+        }
+        data.engineering = parseInt(data.engineering);
+        // 判断标准清单
+        if (data.bill_lib === undefined || data.bill_lib === '') {
+            throw '判断标准清单不能为空';
+        }
+        data.bill_lib = data.bill_lib instanceof Array ? data.bill_lib : [data.bill_lib];
+        for(let tmp in data.bill_lib) {
+            data.bill_lib[tmp] = JSON.parse(data.bill_lib[tmp]);
+        }
+        // 判断定额清单
+        if (data.ration_lib === undefined || data.ration_lib === '') {
+            throw '判断标准清单不能为空';
+        }
+        data.ration_lib = data.ration_lib instanceof Array ? data.ration_lib : [data.ration_lib];
+        for(let tmp in data.ration_lib) {
+            data.ration_lib[tmp] = JSON.parse(data.ration_lib[tmp]);
+        }
+
+        return data;
+    }
 
-        let field = model === 'bill' ? 'standard_bill' : 'ration_lib';
-        if (versionData[field].length <= 0) {
-            throw '没有对应的库数据';
+    /**
+     * 获取计价规则数据
+     *
+     * @param {String} versionId
+     * @param {String} id
+     * @param {String} section
+     * @return {Promise|Array}
+     */
+    async getValuation(versionId, id, section) {
+        if (this.sectionList.indexOf(section) < 0) {
+            throw '数据有误';
+        }
+        let versionData = await this.findDataByCondition({_id: versionId});
+        if (Object.keys(versionData).length <= 0) {
+            throw '版本数据有误';
         }
+        let result = {};
+        let sectionString = section + '_valuation';
 
-        let own = false;
-        for (let index in versionData[field]) {
-            if (versionData[field][index].id === libId) {
-                versionData[field].splice(index, 1);
-                own = true;
+        for(let valuation of versionData[sectionString]) {
+            if (valuation._id.toString() === id) {
+                result = valuation;
                 break;
             }
         }
 
-        if (!own) {
-            throw '没有对应的库数据';
-        }
-        let updateData = {};
-        updateData[field] = versionData[field];
-        let result = await this.db.update({_id: id}, updateData);
+        return [result, versionData[sectionString]];
+        /* 数据库获取版本
+        let condition = {_id: versionId};
+        let childCondition = {};
+        childCondition[sectionString] = {$elemMatch: {_id: id}};
 
-        return result.ok === undefined ? false : result.ok;
+        let result = await this.db.findOne(condition, childCondition);
+
+        return result !== null && result.bill_valuation.length > 0 ? result.bill_valuation[0] : {};
+        */
     }
 
+    /**
+     * 删除计价规则
+     *
+     * @param {String} versionId
+     * @param {String} valuationId
+     * @param {String} section
+     * @return {Promise}
+     */
+    async deleteValuation(versionId, valuationId, section) {
+        let condition = {_id: versionId};
+        let sectionString = section + '_valuation';
+        let deleteData = {};
+        deleteData[sectionString] = {_id: valuationId};
+
+        // 利用pull删除嵌套数据
+        let result = await this.db.deleteSet(condition, deleteData);
+
+        return result !== null && result.ok === 1;
+    }
 
 }
 

+ 6 - 3
modules/users/routes/version_route.js

@@ -14,9 +14,12 @@ const versionController = new VersionController();
 module.exports =function (app) {
     // action定义区域
     router.get('/', versionController.auth, versionController.init, versionController.index);
-    router.post('/add', versionController.auth, versionController.init, versionController.add);
-    router.post('/addLib', versionController.auth, versionController.init, versionController.addLib);
-    router.post('/deleteLib', versionController.auth, versionController.init, versionController.deleteLib);
+    router.get('/valuation/:section/:id', versionController.auth, versionController.init, versionController.editValuation);
+    router.get('/valuation/:section/delete/:id', versionController.auth, versionController.init, versionController.deleteValuation);
+    router.post('/add', versionController.auth, versionController.init, versionController.addVersion);
+    router.post('/add-valuation', versionController.auth, versionController.init, versionController.addValuation);
+    router.post('/save-valuation', versionController.auth, versionController.init, versionController.saveValuation);
+    router.post('/valuation/:section/enable', versionController.auth, versionController.init, versionController.enableSwitch);
 
     app.use("/version", router);
 };

+ 177 - 49
web/users/js/version.js

@@ -8,36 +8,97 @@
 $(document).ready(function() {
     let isAdding = false;
     let model = '';
+    let section = 'bill';
+    let id = $("#version-id").val();
 
-    // 初始化数据
-    initVersion();
+    // 计价规则页面初始化数据
+    if ($("#section").length > 0) {
+        initVersion();
+    }
+
+    // 计价类型选择
+    $(".nav-tabs li > a").click(function() {
+        section = $(this).attr("aria-controls");
+    });
 
     // 新增版本
     $("#add-version").click(function() {
         try {
             let [name, standardBill, rationLib, standardBillString, rationLibString] = getAndValidData(model);
-            let id = $("#version-id").val();
 
-            let postData = {};
             let url = '/version/add';
-            switch (model) {
-                case 'all':
-                    postData = {model: model, name: name, standard_bill_id: standardBill, ration_lib_id: rationLib,
-                        standard_bill: standardBillString, ration_lib: rationLibString};
-                    break;
-                case 'bill':
-                    url = '/version/addLib';
-                    postData = {model: model, standard_bill_id: standardBill, standard_bill: standardBillString, id: id};
-                    break;
-                case 'ration':
-                    url = '/version/addLib';
-                    postData = {model: model, ration_lib_id: rationLib, ration_lib: rationLibString, id: id};
-                    break;
+            if (model === 'all') {
+                // 新增版本操作
+                $.ajax({
+                    url: url,
+                    type: 'post',
+                    data: {name: name},
+                    error: function() {
+                        isAdding = false;
+                    },
+                    beforeSend: function() {
+                        isAdding = true;
+                    },
+                    success: function(response) {
+                        isAdding = false;
+                        if (response.err === 0) {
+                            window.location.reload();
+                        } else {
+                            let msg = response.msg === undefined ? '未知错误' : response.msg;
+                            alert(msg);
+                        }
+                    }
+                });
+            } else {
+                // 新增标准清单/定额库
+                let addLib = {
+                    name: '',
+                    id: ''
+                };
+                switch (model) {
+                    case 'bill':
+                        addLib.name = standardBillString;
+                        addLib.id = standardBill;
+                        break;
+                    case 'ration':
+                        addLib.name = rationLibString;
+                        addLib.id = rationLib;
+                        break;
+                }
+                // 判断是否有重复的数据
+                if ($("input:hidden[name='"+ model +"_lib'][data-id='"+ addLib.id +"']").length > 0) {
+                    alert('重复添加数据!');
+                    return false;
+                }
+
+                let removeHtml = '<a class="pull-right text-danger remove-lib" data-model="bill" ' +
+                    'title="移除"><span class="glyphicon glyphicon-remove"></span></a>';
+                let tmpHtml = '<p class="form-control-static">' + removeHtml + addLib.name +
+                    '<input type="hidden" data-id="'+ addLib.id +'" name=\'' + model + '_lib\' value=\'' + JSON.stringify(addLib) + '\'>' + '</p>';
+                $("." + model + "-list").append(tmpHtml);
+                $('#addversion').modal('hide');
+            }
+
+        } catch (error) {
+            alert(error);
+        }
+    });
+
+    // 新增计价规则
+    $("#add-valuation").click(function() {
+        try {
+            if (id === '') {
+                throw '页面数据有误';
+            }
+            let name = $("input[name='valuation_name']").val();
+            if (name === '') {
+                throw '请填写计价规则名称';
             }
+
             $.ajax({
-                url: url,
+                url: '/version/add-valuation',
                 type: 'post',
-                data: postData,
+                data: {name: name, id: id, section: section},
                 error: function() {
                     isAdding = false;
                 },
@@ -54,9 +115,9 @@ $(document).ready(function() {
                     }
                 }
             });
-
         } catch (error) {
             alert(error);
+            return false;
         }
     });
 
@@ -93,8 +154,8 @@ $(document).ready(function() {
         switch (model) {
             case 'all':
                 $("#name-area").show();
-                $("#bill-area").show();
-                $("#ration-area").show();
+                $("#bill-area").hide();
+                $("#ration-area").hide();
                 $("#add-version-title").text('添加新版本');
                 break;
             case 'bill':
@@ -114,44 +175,48 @@ $(document).ready(function() {
         $("#addversion").modal('show');
     });
 
-    // 移除操作
-    let isDeleting = false;
-    $(".remove-version").click(function() {
-        let model = $(this).data('model');
-        let id = $("#version-id").val();
-        let deleteId = $(this).data('id');
-        deleteId = parseInt(deleteId);
-
-        if (model === undefined || model === '' || isNaN(deleteId)) {
-            return false;
+    // 保存计价规则
+    $("#save-valuation").click(function() {
+        if (validValuation()) {
+            $("form").submit();
         }
-        if (isDeleting) {
+    });
+
+    // 移除操作
+    $(".bill-list, .ration-list").on("click", ".remove-lib", function() {
+        $(this).parent().remove();
+    });
+
+    // 计价规则启用/禁止
+    $(".enable").click(function() {
+        let goingChangeStatus = switchChange($(this));
+        let id = $(this).data('id');
+        if (id === undefined || id === '' || isAdding) {
             return false;
         }
-
         $.ajax({
-            url: '/version/deleteLib',
+            url: '/version/valuation/' + section + '/enable',
             type: 'post',
-            data: {id: id, model: model, delete_id: deleteId},
+            dataType: "json",
+            data: {id: id, enable: goingChangeStatus},
             error: function() {
-                isDeleting = false;
+                isAdding = false;
+                switchChange($(this));
             },
             beforeSend: function() {
-                isDeleting = true;
+                isAdding = true;
             },
             success: function(response) {
-                isDeleting = false;
-                if (response.err === 0) {
-                    window.location.reload();
-                } else {
-                    let msg = response.msg === undefined ? '未知错误' : response.msg;
-                    alert(msg);
+                isAdding = false;
+                if (response.err !== 0) {
+                    switchChange($(this));
+                    alert('更改失败');
                 }
             }
         });
-
     });
 
+
 });
 
 /**
@@ -191,18 +256,18 @@ function initVersion() {
  */
 function getAndValidData(model) {
     let name = $("input[name='version_name']").val();
-    let standardBill = $("select[name='standard_bill']").val();
-    let rationLib = $("select[name='ration_lib']").val();
+    let standardBill = $("select[name='standard_bill']").children("option:selected").val();
+    let rationLib = $("select[name='ration_lib']").children("option:selected").val();
 
     if (name === '' && model === 'all') {
         throw '版本名字不能为空';
     }
 
-    if ((model === 'all' || model === 'bill') && (standardBill === '' || standardBill === undefined)) {
+    if ( model === 'bill' && (standardBill === '' || standardBill === undefined)) {
         throw '请选择标准清单库';
     }
 
-    if ((model === 'all' || model === 'ration') && (rationLib === '' || rationLib === undefined)) {
+    if (model === 'ration' && (rationLib === '' || rationLib === undefined)) {
         throw '请选择定额库';
     }
 
@@ -211,3 +276,66 @@ function getAndValidData(model) {
 
     return [name, standardBill, rationLib, standardBillString, rationLibString];
 }
+
+/**
+ * 验证计价规则数据
+ *
+ * @return {boolean}
+ */
+function validValuation() {
+    let result = false;
+    try {
+        let valuationName = $("input[name='name']").val();
+        if (valuationName === '') {
+            throw '请填写计价规则名称';
+        }
+
+        let engineering = $("select[name='engineering']").val();
+        if (engineering === '' || engineering <= 0) {
+            throw '请选择工程专业';
+        }
+
+        if ($("input:hidden[name='bill_lib']").length <= 0) {
+            throw '请添加标准清单';
+        }
+
+        if ($("input:hidden[name='ration_lib']").length <= 0) {
+            throw '请添加定额库';
+        }
+
+        result = true;
+    } catch (error) {
+        alert(error);
+        result = false;
+    }
+
+    return result;
+}
+
+/**
+ * 切换switch效果
+ *
+ * @param {Object} element
+ * @return {boolean}
+ */
+function switchChange(element) {
+    // 第一个元素判断当前的状态
+    let firstButton = element.children("button").first();
+    let secondButton = element.children("button").eq(1);
+    let currentStatus = firstButton.is(":disabled");
+    if (currentStatus) {
+        // 当前为true切换到false
+        firstButton.removeClass('btn-success').removeClass('disabled').addClass('btn-default').removeAttr("disabled");
+        firstButton.text('开启');
+        secondButton.removeClass("btn-default").addClass("btn-danger").addClass("disabled").attr("disabled", "disabled");
+        secondButton.text('已禁用');
+    } else {
+        // 当前false切换到true
+        firstButton.removeClass("btn-default").addClass("btn-success").addClass("disabled").attr("disabled", "disabled");
+        firstButton.text('已开启');
+        secondButton.removeClass('btn-danger').removeClass('disabled').addClass('btn-default').removeAttr("disabled");
+        secondButton.text('禁用');
+    }
+
+    return !currentStatus;
+}

+ 1 - 53
web/users/views/layout/layout.html

@@ -98,57 +98,5 @@
         </div>
     </div>
 </div>
-
-<!-- 弹窗新增版本 -->
-<div class="modal fade" id="addversion" tabindex="-1" role="dialog">
-    <div class="modal-dialog" role="document">
-        <div class="modal-content">
-            <div class="modal-header">
-                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
-                <h4 class="modal-title" id="add-version-title">添加新版本</h4>
-            </div>
-            <div class="modal-body">
-                <div class="form-group" id="name-area">
-                    <label>版本名称</label>
-                    <input class="form-control" placeholder="" name="version_name">
-                </div>
-                <div class="form-group" id="bill-area">
-                    <label>标准清单</label>
-                    <div class="row">
-                        <div class="col-xs-4">
-                            <select class="form-control" name="standard_bill_province">
-                                <option value="">请选择省份</option>
-                            </select>
-                        </div>
-                        <div class="col-xs-8">
-                            <select class="form-control" name="standard_bill">
-                                <option value="">请选择标准清单</option>
-                            </select>
-                        </div>
-                    </div>
-                </div>
-                <div class="form-group" id="ration-area">
-                    <label>定额库</label>
-                    <div class="row">
-                        <div class="col-xs-4">
-                            <select class="form-control" name="ration_lib_province">
-                                <option value="">请选择省份</option>
-                            </select>
-                        </div>
-                        <div class="col-xs-8">
-                            <select class="form-control" name="ration_lib">
-                                <option value="">请选择定额库</option>
-                            </select>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
-                <button type="button" class="btn btn-primary" id="add-version">确定添加</button>
-            </div>
-        </div>
-    </div>
-</div>
-
+<%include ../version/modal.html %>
 </body>

+ 99 - 0
web/users/views/version/add.html

@@ -0,0 +1,99 @@
+<%include ./common.html %>
+<div class="panel-content">
+    <div class="panel-title">
+        <div class="title-main">
+            <h2>重庆版<span class="text-muted pull-right">已发布 2017-08-04</span><a href="javascript:void(0);" class="btn btn-primary btn-sm pull-right" id="save">发布版本</a></h2>
+        </div>
+    </div>
+    <div class="content-wrap">
+        <div class="c-header" style="padding:0">
+            <ul class="nav nav-tabs">
+                <% valuationList.forEach(function(valuation) { %>
+                <li role="presentation" <% if (valuation._id.toString() === valuationId) { %>class="active"<% } %>><a href="/version/valuation/<%= section %>/<%= valuation._id %>"><%= valuation.name %></a></li>
+                <% }) %>
+            </ul>
+        </div>
+        <div class="c-body">
+            <form method="post" action="/version/save-valuation" enctype="application/x-www-form-urlencoded21">
+                <div class=" row">
+                    <div class="col-md-4">
+                        <div class="form-group">
+                            <label>名称</label>
+                            <div class="input-group">
+                                <input type="text" class="form-control" value="<%= valuationData.name %>" name="name">
+                                <span class="input-group-btn">
+                                     <button class="btn btn-default" type="button" id="save-valuation">保存</button>
+                                </span>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="col-md-12">
+                        <legend>
+                            <div class="form-group row">
+                                <label class="col-sm-2 col-form-label">工程专业</label>
+                                <div class="col-sm-3">
+                                    <select class="form-control" name="engineering">
+                                        <option value="">请选择工程</option>
+                                        <% engineeringList.forEach(function(engineering) {%>
+                                        <option value="<%= engineering.value %>" <% if (engineering.value === valuationData.engineering) {%>selected="selected"<% } %>><%= engineering.name %></option>
+                                        <% }) %>
+                                    </select>
+                                </div>
+                            </div>
+                        </legend>
+                    </div>
+                    <div class="col-md-4">
+                        <div class="form-group">
+                            <label>标准清单</label>
+                            <div class="bill-list">
+                                <% if (valuationData.bill_lib.length > 0) { %>
+                                <% valuationData.bill_lib.forEach(function (bill){ %>
+                                <p class="form-control-static">
+                                    <a class="pull-right text-danger remove-lib" data-model="bill" title="移除">
+                                        <span class="glyphicon glyphicon-remove"></span>
+                                    </a>
+                                    <input type="hidden" name="bill_lib" data-id="<%= bill.id %>" value="<%= JSON.stringify({id: bill.id, name: bill.name}) %>">
+                                    <%= bill.name %>
+                                </p>
+                                <% }) %>
+                                <% } %>
+                            </div>
+                            <a class="btn btn-link btn-sm add-version" href="javascript:void(0)" data-model="bill">添加</a>
+                        </div>
+                        <div class="form-group">
+                            <label>定额库</label>
+                            <div class="ration-list">
+                                <% if (valuationData.ration_lib.length > 0) { %>
+                                <% valuationData.ration_lib.forEach(function (ration){ %>
+                                <p class="form-control-static">
+                                    <a class="pull-right text-danger remove-lib" data-model="ration" title="移除" data-id="<%= ration.id %>">
+                                        <span class="glyphicon glyphicon-remove"></span>
+                                    </a>
+                                    <input type="hidden" name="ration_lib" data-id="<%= ration.id %>" value="<%= JSON.stringify({id: ration.id, name: ration.name}) %>">
+                                    <%= ration.name %>
+                                </p>
+                                <% }) %>
+                                <% } %>
+                            </div>
+                            <a href="#" class="btn btn-link btn-sm add-version" data-model="ration">添加</a>
+                        </div>
+                    </div>
+                    <div class="col-md-8">
+                        <legend>造价书列设置<a href="javascript:void(0)" data-toggle="modal" data-target="#set-column" class="btn btn-primary btn-sm pull-right">设置</a></legend>
+                        <div>
+                            S JS预览在此
+                        </div>
+                    </div>
+                </div>
+                <input type="hidden" name="section" value="<%= section %>" id="section">
+                <input type="hidden" name="id" value="<%= valuationId %>">
+            </form>
+        </div>
+    </div>
+</div>
+<script type="text/javascript">
+    let province = '<%- province %>';
+    let billList = '<%- billList %>';
+    let rationList = '<%- rationList %>';
+</script>
+<script type="text/javascript" src="/web/users/js/version.js"></script>

+ 16 - 0
web/users/views/version/common.html

@@ -0,0 +1,16 @@
+<div class="panel-sidebar">
+    <div class="panel-title">
+        <div class="title-bar">
+            <h2><a class="pull-right add-version" title="添加新版本" href="javascript:void(0)" data-model="all"><span class="glyphicon glyphicon-plus"></span></a>版本管理</h2>
+        </div>
+    </div>
+    <div class="scrollbar-auto">
+        <div class="nav-box">
+            <ul class="nav-list list-unstyled" id="version-select">
+                <% versionList.forEach(function (version){ %>
+                <li <% if(selectedVersion._id.toString() === version._id.toString()) { %>class="active"<% } %>><a href="/version?id=<%= version._id %>"><span><%= version.name %></span><% if (!version.is_release) { %><span class="text-muted">(未发布)</span><% } %></a></li>
+                <% }) %>
+            </ul>
+        </div>
+    </div>
+</div>

+ 94 - 110
web/users/views/version/index.html

@@ -1,114 +1,98 @@
-<div class="panel-sidebar">
-	<div class="panel-title">
-		<div class="title-bar">
-			<h2><a class="pull-right add-version" title="添加新版本" href="javascript:void(0)" data-model="all"><span class="glyphicon glyphicon-plus"></span></a>版本管理</h2>
-		</div>
-	</div>
-	<div class="scrollbar-auto">
-		<div class="nav-box">
-			<ul class="nav-list list-unstyled" id="version-select">
-				<% versionList.forEach(function (version){ %>
-				<li <% if(selectedVersion._id === version._id) { %>class="active"<% } %>><a href="/version?id=<%= version._id %>"><span><%= version.name %></span></a></li>
-				<% }) %>
-			</ul>
-		</div>
-	</div>
-</div>
+<%include ./common.html %>
 <div class="panel-content">
-	<% if(Object.keys(selectedVersion).length > 0) { %>
-	<div class="panel-title">
-		<div class="title-main">
-			<h2><%= selectedVersion.name %><a href="" class="btn btn-primary btn-sm pull-right">确定修改</a></h2>
-		</div>
-	</div>
-	<div class="content-wrap container-fluid">
-		<div class="c-body row">
-			<div class="col-md-4">
-				<div class="form-group">
-					<label>标准清单</label>
-					<div id="bill-list">
-						<% selectedVersion.standard_bill.forEach(function (bill){ %>
-						<p class="form-control-static">
-							<% if (selectedVersion.standard_bill.length > 1) { %>
-							<a class="pull-right text-danger remove-version" data-model="bill" data-id="<%= bill.id %>" title="移除">
-								<span class="glyphicon glyphicon-remove"></span>
-							</a>
-							<% } %>
-							<%= bill.name %>
-						</p>
-						<% }) %>
-					</div>
-					<a class="btn btn-link btn-sm add-version" href="javascript:void(0)" data-model="bill">添加</a>
-				</div>
-				<div class="form-group">
-					<label>定额库</label>
-					<div id="ration-list">
-						<% selectedVersion.ration_lib.forEach(function (ration){ %>
-						<p class="form-control-static">
-							<% if (selectedVersion.ration_lib.length > 1) { %>
-							<a class="pull-right text-danger remove-version" data-model="ration" title="移除" data-id="<%= ration.id %>">
-								<span class="glyphicon glyphicon-remove"></span>
-							</a>
-							<% } %>
-							<%= ration.name %>
-						</p>
-						<% }) %>
-					</div>
-					<a href="#" class="btn btn-link btn-sm add-version" data-model="ration">添加</a>
-				</div>
-				<input type="hidden" name="version-id" value="<%= selectedVersion._id %>" id="version-id">
-			</div>
-			<!--<div class="col-md-4">-->
-				<!--<div class="form-group">-->
-					<!--<label >文本选项</label>-->
-					<!--<input type="text" class="form-control" placeholder="输入内容">-->
-				<!--</div>-->
-				<!--<div class="form-group">-->
-					<!--<label >数字选项</label>-->
-					<!--<input type="number" class="form-control" placeholder="输入内容">-->
-				<!--</div>-->
-				<!--<div class="form-group">-->
-					<!--<label >下拉选项</label>-->
-					<!--<select class="form-control"><option>选择1</option><option>选择2</option></select>-->
-				<!--</div>-->
-			<!--</div>-->
-			<!--<div class="col-md-4">-->
-				<!--<div class="form-group">-->
-					<!--<label >多选</label>-->
-					<!--<div>-->
-						<!--<label class="checkbox-inline">-->
-							<!--<input type="checkbox" id="inlineCheckbox1" value="option1"> 1-->
-						<!--</label>-->
-						<!--<label class="checkbox-inline">-->
-							<!--<input type="checkbox" id="inlineCheckbox2" value="option2"> 2-->
-						<!--</label>-->
-						<!--<label class="checkbox-inline">-->
-							<!--<input type="checkbox" id="inlineCheckbox3" value="option3"> 3-->
-						<!--</label>-->
-					<!--</div>-->
-				<!--</div>-->
-				<!--<div class="form-group">-->
-					<!--<label >单选</label>-->
-					<!--<div>-->
-						<!--<label class="radio-inline">-->
-							<!--<input type="radio" name="inlineRadioOptions" id="inlineRadio1" value="option1"> 1-->
-						<!--</label>-->
-						<!--<label class="radio-inline">-->
-							<!--<input type="radio" name="inlineRadioOptions" id="inlineRadio2" value="option2"> 2-->
-						<!--</label>-->
-						<!--<label class="radio-inline">-->
-							<!--<input type="radio" name="inlineRadioOptions" id="inlineRadio3" value="option3"> 3-->
-						<!--</label>-->
-					<!--</div>-->
-				<!--</div>-->
-			<!--</div>-->
-		</div>
+    <% if(Object.keys(selectedVersion).length > 0) {%>
+    <div class="panel-title">
+        <div class="title-main">
+            <h2>重庆版<span class="text-muted pull-right">已发布 2017-08-04</span><a href="javascript:void(0);" class="btn btn-primary btn-sm pull-right" id="save">发布版本</a></h2>
+        </div>
+    </div>
+    <div class="content-wrap">
+        <div class="c-header" style="padding:0">
+            <ul class="nav nav-tabs">
+                <li role="presentation" class="active"><a href="#bill" aria-controls="bill" role="tab" data-toggle="tab">清单计价</a></li>
+                <li role="presentation"><a href="#ration" aria-controls="ration" role="tab" data-toggle="tab">定额计价</a></li>
+            </ul>
+        </div>
+        <div class="c-body tab-content">
+            <div class="tab-pane active" role="tabpanel" id="bill">
+                <a class="btn btn-default btn-sm" href="#" data-toggle="modal" data-target="#valuation-dialog"><span class="glyphicon glyphicon-plus"></span> 添加计价规则</a>
+                <table class="table">
+                    <thead>
+                    <tr>
+                        <th>计价规则</th>
+                        <th>启用/禁用</th>
+                        <th>操作</th>
+                    </tr>
+                    </thead>
+                    <tbody>
+                    <% if (selectedVersion.bill_valuation.length > 0) { %>
+                    <% selectedVersion.bill_valuation.forEach(function(bill) { %>
+                    <tr>
+                        <td><%= bill.name %></td>
+                        <td>
+                            <% if (bill.enable) { %>
+                            <div class="btn-group enable" data-id="<%= bill.id %>">
+                                <button class="btn btn-success  disabled" disabled="disabled">已开启</button>
+                                <button class="btn btn-default" title="禁用">禁用</button>
+                            </div>
+                            <% }else { %>
+                            <div class="btn-group enable" data-id="<%= bill.id %>">
+                                <button class="btn btn-default" title="开启">开启</button>
+                                <button class="btn btn-danger disabled" disabled="disabled">已禁用</button>
+                            </div>
+                            <% } %>
+                        </td>
+                        <td>
+                            <a href="/version/valuation/bill/<%= bill.id %>" class="btn btn-sm">编辑</a>
+                            <a href="/version/valuation/bill/delete/<%= bill.id %>" class="btn btn-sm text-danger">删除</a>
+                        </td>
+                    </tr>
+                    <% }) %>
+                    <% } %>
+                    </tbody>
+                </table>
+            </div>
+            <div class="tab-pane" role="tabpanel" id="ration">
+                <a class="btn btn-default btn-sm" href="javascript:void(0)" data-toggle="modal" data-target="#valuation-dialog"><span class="glyphicon glyphicon-plus"></span> 添加计价规则</a>
+                <table class="table">
+                    <thead>
+                    <tr>
+                        <th>计价规则</th>
+                        <th>启用/禁用</th>
+                        <th>操作</th>
+                    </tr>
+                    </thead>
+                    <tbody>
+                    <% if (selectedVersion.ration_valuation.length > 0) { %>
+                    <% selectedVersion.ration_valuation.forEach(function(ration) { %>
+                    <tr>
+                        <td><%= ration.name %></td>
+                        <td>
+                            <% if (ration.enable) { %>
+                            <div class="btn-group enable" data-id="<%= ration.id %>">
+                                <button class="btn btn-success  disabled" disabled="disabled">已开启</button>
+                                <button class="btn btn-default" title="禁用">禁用</button>
+                            </div>
+                            <% }else { %>
+                            <div class="btn-group enable" data-id="<%= ration.id %>">
+                                <button class="btn btn-default" title="开启">开启</button>
+                                <button class="btn btn-danger disabled" disabled="disabled">已禁用</button>
+                            </div>
+                            <% } %>
+                        </td>
+                        <td>
+                            <a href="/version/valuation/ration/<%= ration.id %>" class="btn btn-sm">编辑</a>
+                            <a href="/version/valuation/ration/delete/<%= ration.id %>" class="btn btn-sm text-danger">删除</a>
+                        </td>
+                    </tr>
+                    <% }) %>
+                    <% } %>
+                    </tbody>
+                </table>
+            </div>
+        </div>
+        <input type="hidden" name="id" value="<%= selectedVersion._id %>" id="version-id">
+        <% } %>
 	</div>
-	<% } %>
 </div>
-<script type="text/javascript">
-	let province = '<%- province %>';
-	let billList = '<%- billList %>';
-	let rationList = '<%- rationList %>';
-</script>
 <script type="text/javascript" src="/web/users/js/version.js"></script>

+ 73 - 0
web/users/views/version/modal.html

@@ -0,0 +1,73 @@
+<!-- 弹窗新增版本 -->
+<div class="modal fade" id="addversion" tabindex="-1" role="dialog">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                <h4 class="modal-title" id="add-version-title">添加新版本</h4>
+            </div>
+            <div class="modal-body">
+                <div class="form-group" id="name-area">
+                    <label>版本名称</label>
+                    <input class="form-control" placeholder="" name="version_name">
+                </div>
+                <div class="form-group" id="bill-area">
+                    <label>标准清单</label>
+                    <div class="row">
+                        <div class="col-xs-4">
+                            <select class="form-control" name="standard_bill_province">
+                                <option value="">请选择省份</option>
+                            </select>
+                        </div>
+                        <div class="col-xs-8">
+                            <select class="form-control" name="standard_bill">
+                                <option value="">请选择标准清单</option>
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group" id="ration-area">
+                    <label>定额库</label>
+                    <div class="row">
+                        <div class="col-xs-4">
+                            <select class="form-control" name="ration_lib_province">
+                                <option value="">请选择省份</option>
+                            </select>
+                        </div>
+                        <div class="col-xs-8">
+                            <select class="form-control" name="ration_lib">
+                                <option value="">请选择定额库</option>
+                            </select>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
+                <button type="button" class="btn btn-primary" id="add-version">确定添加</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!-- 弹窗新增计价 -->
+<div class="modal fade" id="valuation-dialog" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                <h4 class="modal-title" id="myModalLabel">添加新计价规则</h4>
+            </div>
+            <div class="modal-body">
+                <div class="form-group">
+                    <label>名称</label>
+                    <input class="form-control" name="valuation_name" >
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
+                <button type="button" class="btn btn-primary" id="add-valuation">确定添加</button>
+            </div>
+        </div>
+    </div>
+</div>