소스 검색

导出经济指标接口

zhangweicheng 6 년 전
부모
커밋
906b76bfe7
51개의 변경된 파일2864개의 추가작업 그리고 12개의 파일을 삭제
  1. 25 0
      modules/all_models/engineering_lib.js
  2. 6 0
      modules/all_models/stdBills_bills.js
  3. 5 0
      modules/all_models/stdGlj_glj.js
  4. 25 0
      modules/all_models/std_economic_lib.js
  5. 25 0
      modules/all_models/std_engineer_feature_lib.js
  6. 25 0
      modules/all_models/std_engineer_info_lib.js
  7. 25 0
      modules/all_models/std_main_quantity_lib.js
  8. 25 0
      modules/all_models/std_material_lib.js
  9. 102 0
      modules/economic_lib/controllers/economic_controller.js
  10. 41 0
      modules/economic_lib/facade/economic_facade.js
  11. 21 0
      modules/economic_lib/routes/economic_routes.js
  12. 102 0
      modules/engineer_feature_lib/controllers/engineer_feature_controller.js
  13. 41 0
      modules/engineer_feature_lib/facade/engineer_feature_facade.js
  14. 21 0
      modules/engineer_feature_lib/routes/engineer_feature_routes.js
  15. 102 0
      modules/engineer_info_lib/controllers/engineer_info_controller.js
  16. 42 0
      modules/engineer_info_lib/facade/engineer_info_facade.js
  17. 21 0
      modules/engineer_info_lib/routes/engineer_info_routes.js
  18. 102 0
      modules/main_quantity_lib/controllers/quantity_controller.js
  19. 41 0
      modules/main_quantity_lib/facade/quantity_facade.js
  20. 21 0
      modules/main_quantity_lib/routes/quantity_routes.js
  21. 102 0
      modules/material_lib/controllers/material_controller.js
  22. 41 0
      modules/material_lib/facade/material_facade.js
  23. 21 0
      modules/material_lib/routes/material_routes.js
  24. 25 1
      modules/users/controllers/compilation_controller.js
  25. 15 0
      modules/users/models/engineering_lib_model.js
  26. 69 1
      web/maintain/bills_lib/scripts/bills_lib_setting.js
  27. 37 0
      web/maintain/economic_lib/html/edit.html
  28. 108 0
      web/maintain/economic_lib/html/main.html
  29. 74 0
      web/maintain/economic_lib/js/edit.js
  30. 77 0
      web/maintain/economic_lib/js/main.js
  31. 37 0
      web/maintain/engineer_feature_lib/html/edit.html
  32. 108 0
      web/maintain/engineer_feature_lib/html/main.html
  33. 85 0
      web/maintain/engineer_feature_lib/js/edit.js
  34. 77 0
      web/maintain/engineer_feature_lib/js/main.js
  35. 37 0
      web/maintain/engineer_info_lib/html/edit.html
  36. 108 0
      web/maintain/engineer_info_lib/html/main.html
  37. 83 0
      web/maintain/engineer_info_lib/js/edit.js
  38. 77 0
      web/maintain/engineer_info_lib/js/main.js
  39. 37 0
      web/maintain/main_quantity_lib/html/edit.html
  40. 108 0
      web/maintain/main_quantity_lib/html/main.html
  41. 74 0
      web/maintain/main_quantity_lib/js/edit.js
  42. 77 0
      web/maintain/main_quantity_lib/js/main.js
  43. 37 0
      web/maintain/material_lib/html/edit.html
  44. 108 0
      web/maintain/material_lib/html/main.html
  45. 77 0
      web/maintain/material_lib/js/edit.js
  46. 77 0
      web/maintain/material_lib/js/main.js
  47. 18 7
      web/maintain/std_glj_lib/js/glj.js
  48. 98 2
      web/users/js/compilation.js
  49. 14 1
      web/users/views/compilation/add.html
  50. 90 0
      web/users/views/compilation/engineering.html
  51. 50 0
      web/users/views/compilation/modal.html

+ 25 - 0
modules/all_models/engineering_lib.js

@@ -62,6 +62,30 @@ let modelSchema = {
         type: Schema.Types.Mixed,
         type: Schema.Types.Mixed,
         default: []
         default: []
     },
     },
+    engineer_info_lib: {
+        type: Schema.Types.Mixed,
+        default: []
+    },
+    //工程特征指标库
+    engineer_feature_lib: {
+        type: Schema.Types.Mixed,
+        default: []
+    },
+    //主要工料指标库
+    material_lib: {
+        type: Schema.Types.Mixed,
+        default: []
+    },
+    //主要工程量指标库
+    main_quantity_lib: {
+        type: Schema.Types.Mixed,
+        default: []
+    },
+    //主要经济指标库
+    economic_lib: {
+        type: Schema.Types.Mixed,
+        default: []
+    },
     //设置人材机显示列
     //设置人材机显示列
     glj_col:{
     glj_col:{
         showAdjustPrice:Boolean//是否显示调整价列
         showAdjustPrice:Boolean//是否显示调整价列
@@ -80,6 +104,7 @@ let modelSchema = {
     projectEngineering:Number,
     projectEngineering:Number,
     //是否计算安装增加费
     //是否计算安装增加费
     isInstall:{type: Boolean, default: false},
     isInstall:{type: Boolean, default: false},
+    indexName:String,//指标专业名称
     seq:Number//序列号
     seq:Number//序列号
 };
 };
 mongoose.model(collectionName, new Schema(modelSchema, {versionKey: false, collection: collectionName}));
 mongoose.model(collectionName, new Schema(modelSchema, {versionKey: false, collection: collectionName}));

+ 6 - 0
modules/all_models/stdBills_bills.js

@@ -20,6 +20,12 @@ const stdBills_bills = new Schema({
             recharge:String,
             recharge:String,
             billsLibId: {type:Number,index:true},
             billsLibId: {type:Number,index:true},
             sectionInfo: Schema.Types.Mixed,
             sectionInfo: Schema.Types.Mixed,
+            //经济指标属性
+            economicType:String,//工程经济指标类别
+            quantityIndexType:String,//工程量指标类别
+            quantityIndexUnit:String,//工程量指标单位
+            quantityIndexCoe:Number,//单位转换系数
+
             deleted: Boolean
             deleted: Boolean
     },
     },
     {versionKey: false}
     {versionKey: false}

+ 5 - 0
modules/all_models/stdGlj_glj.js

@@ -39,6 +39,11 @@ const std_glj = new Schema({
     materialType: Number, //三材类型:钢材1、钢筋2、木材3、水泥4、标准砖5
     materialType: Number, //三材类型:钢材1、钢筋2、木材3、水泥4、标准砖5
     materialCoe: Number, //三材系数
     materialCoe: Number, //三材系数
     model: Number, //机型
     model: Number, //机型
+    //经济指标数据
+    materialIndexType:String,//工料指标类别
+    materialIndexUnit:String,//工料指标单位
+    materialIndexCoe:Number//单位转换系数
+
 },{versionKey: false});
 },{versionKey: false});
 
 
 mongoose.model('std_glj_lib_gljList', std_glj, 'std_glj_lib_gljList');
 mongoose.model('std_glj_lib_gljList', std_glj, 'std_glj_lib_gljList');

+ 25 - 0
modules/all_models/std_economic_lib.js

@@ -0,0 +1,25 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Zhong
+ * @date 2019/3/5
+ * @version
+ */
+//主要工程量指标库
+const mongoose = require('mongoose');
+const Schema = mongoose.Schema;
+const oprSchema = require('../all_schemas/opr_schema');
+const economicLib = new Schema({
+    ID: {type: String, index: true},
+    name: String,
+    creator: String,
+    createDate: Number,
+    recentOpr: [oprSchema],
+    index: {
+        type: Schema.Types.Mixed,
+        default: []
+    }
+}, {versionKey: false});
+mongoose.model('std_economic_lib', economicLib, 'std_economic_lib');

+ 25 - 0
modules/all_models/std_engineer_feature_lib.js

@@ -0,0 +1,25 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Zhong
+ * @date 2019/3/5
+ * @version
+ */
+//建设项目基本信息库
+const mongoose = require('mongoose');
+const Schema = mongoose.Schema;
+const oprSchema = require('../all_schemas/opr_schema');
+const engineerFeatureLib = new Schema({
+    ID: {type: String, index: true},
+    name: String,
+    creator: String,
+    createDate: Number,
+    recentOpr: [oprSchema],
+    features: {
+        type: Schema.Types.Mixed,
+        default: []
+    }
+}, {versionKey: false});
+mongoose.model('std_engineer_feature_lib', engineerFeatureLib, 'std_engineer_feature_lib');

+ 25 - 0
modules/all_models/std_engineer_info_lib.js

@@ -0,0 +1,25 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Zhong
+ * @date 2019/3/5
+ * @version
+ */
+//建设项目基本信息库
+const mongoose = require('mongoose');
+const Schema = mongoose.Schema;
+const oprSchema = require('../all_schemas/opr_schema');
+const engineerInfoLib = new Schema({
+    ID: {type: String, index: true},
+    name: String,
+    creator: String,
+    createDate: Number,
+    recentOpr: [oprSchema],
+    info: {
+        type: Schema.Types.Mixed,
+        default: []
+    }
+}, {versionKey: false});
+mongoose.model('std_engineer_info_lib', engineerInfoLib, 'std_engineer_info_lib');

+ 25 - 0
modules/all_models/std_main_quantity_lib.js

@@ -0,0 +1,25 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Zhong
+ * @date 2019/3/5
+ * @version
+ */
+//主要工程量指标库
+const mongoose = require('mongoose');
+const Schema = mongoose.Schema;
+const oprSchema = require('../all_schemas/opr_schema');
+const quantityLib = new Schema({
+    ID: {type: String, index: true},
+    name: String,
+    creator: String,
+    createDate: Number,
+    recentOpr: [oprSchema],
+    index: {
+        type: Schema.Types.Mixed,
+        default: []
+    }
+}, {versionKey: false});
+mongoose.model('std_main_quantity_lib', quantityLib, 'std_main_quantity_lib');

+ 25 - 0
modules/all_models/std_material_lib.js

@@ -0,0 +1,25 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Zhong
+ * @date 2019/3/5
+ * @version
+ */
+//建设项目基本信息库
+const mongoose = require('mongoose');
+const Schema = mongoose.Schema;
+const oprSchema = require('../all_schemas/opr_schema');
+const materialLib = new Schema({
+    ID: {type: String, index: true},
+    name: String,
+    creator: String,
+    createDate: Number,
+    recentOpr: [oprSchema],
+    materials: {
+        type: Schema.Types.Mixed,
+        default: []
+    }
+}, {versionKey: false});
+mongoose.model('std_material_lib', materialLib, 'std_material_lib');

+ 102 - 0
modules/economic_lib/controllers/economic_controller.js

@@ -0,0 +1,102 @@
+/**
+ * Created by zhang on 2018/9/10.
+ */
+import BaseController from "../../common/base/base_controller";
+let config = require("../../../config/config.js");
+let logger = require('../../../logs/log_helper').logger;
+import economicFacade from "../facade/economic_facade";
+
+class EconomicController extends BaseController{
+    async main(request, response) {
+        let economicLibs = await economicFacade.findByCondition({},{info:0},false);
+        let randerData = {
+            title:'主要经济指标库',
+            userAccount: request.session.managerData.username,
+            userID: request.session.managerData.userID,
+            economicLibs:economicLibs,
+            layout: 'maintain/common/html/layout'
+        };
+        response.render("maintain/economic_lib/html/main", randerData);
+    }
+    async addLib(request, response){
+        try {
+            await economicFacade.addLib(request.body);
+        }catch (error) {
+            console.log(error);
+        }
+        response.redirect(request.headers.referer);
+    }
+    async findLib(request, response){
+        let result={
+            error:0
+        };
+        try {
+            let data = request.body.data;
+            data = JSON.parse(data);
+            let conditions={ID:data.ID};
+            let resultData = await economicFacade.findByCondition(conditions);
+            result.data=resultData;
+        }catch (err){
+            console.log(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        response.json(result);
+    }
+    async saveLib(request, response){
+        let result={
+            error:0
+        };
+        try {
+            let data = request.body.data;
+            data = JSON.parse(data);
+            let resultData= await economicFacade.saveLib(data);
+            result.data=resultData;
+        }catch (err){
+            console.log(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        response.json(result);
+    }
+    async deleteLibByID(request,response){
+        logger.info(`delete feeRateLib ${request.ip}`);
+        let result={
+            error:0
+        };
+        try {
+            let data = request.body.data;
+            data = JSON.parse(data);
+            let resultData= await economicFacade.deleteLibByID(data.ID);
+            result.data=resultData;
+        }catch (err){
+            console.log(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        response.json(result);
+    }
+    async edit(request,response){
+        //先取出替换库信息:
+        let libID = request.params.libID;
+        let economicLib = await economicFacade.findByCondition({'ID':libID});
+        if(economicLib){
+            let randerData = {
+                title:'主要经济指标库',
+                mainURL:'/economic/main',
+                libName:economicLib.name,
+                userAccount: request.session.managerData.username,
+                userID: request.session.managerData.userID,
+                originalInfo:JSON.stringify(economicLib.index),
+                libID:libID,
+                LicenseKey:config.getLicenseKey(process.env.NODE_ENV),
+                layout: 'maintain/common/html/edit_layout'
+            };
+            response.render("maintain/economic_lib/html/edit", randerData);
+        }else {
+            response.redirect(request.headers.referer);
+        }
+    }
+}
+
+export default EconomicController;

+ 41 - 0
modules/economic_lib/facade/economic_facade.js

@@ -0,0 +1,41 @@
+/**
+ * Created by zhang on 2018/9/10.
+ */
+
+import mongoose from "mongoose";
+
+const uuidV1 = require('uuid/v1');
+let moment = require("moment");
+let economicModel = mongoose.model('std_economic_lib');
+
+let economicLib = {
+    findByCondition:async function(conditions,options,single=true){
+        if(single == true){
+            return await economicModel.findOne(conditions,options);
+        }else {
+            return await  economicModel.find(conditions,options);
+        }
+    },
+    addLib : async function (data){
+        let now = new Date().getTime();
+        let dateStr = moment(now).format('YYYY-MM-DD HH:mm:ss');
+        let newLib = {
+            creator: data.userAccount,
+            createDate: now,
+            recentOpr: [{operator: data.userAccount, operateDate: dateStr}],
+            name: data.name,
+        };
+        newLib.ID = uuidV1();
+        return await economicModel.create(newLib);
+
+
+    },
+    saveLib:async function(param) {
+        return await economicModel.findOneAndUpdate(param.query,param.data,{new:true});
+    },
+    deleteLibByID:async function(ID){
+        return await economicModel.deleteOne({ID:ID});
+    }
+};
+
+export default economicLib

+ 21 - 0
modules/economic_lib/routes/economic_routes.js

@@ -0,0 +1,21 @@
+/**
+ * Created by zhang on 2018/9/10.
+ */
+
+let express = require("express");
+let economicRouter =express.Router();
+import EconomicController from "../controllers/economic_controller";
+let economicController = new EconomicController();
+
+module.exports =function (app) {
+
+    economicRouter.get("/main", economicController.auth, economicController.init, economicController.main);
+    economicRouter.post("/addLib", economicController.auth, economicController.init, economicController.addLib);
+    economicRouter.post("/findLib", economicController.auth, economicController.init, economicController.findLib);
+    economicRouter.post("/saveLib", economicController.auth, economicController.init, economicController.saveLib);
+    economicRouter.post("/deleteLibByID", economicController.auth, economicController.init, economicController.deleteLibByID);
+    economicRouter.get("/edit/:libID", economicController.auth, economicController.init, economicController.edit);
+
+
+    app.use("/economic", economicRouter);
+};

+ 102 - 0
modules/engineer_feature_lib/controllers/engineer_feature_controller.js

@@ -0,0 +1,102 @@
+/**
+ * Created by zhang on 2018/9/10.
+ */
+import BaseController from "../../common/base/base_controller";
+let config = require("../../../config/config.js");
+let logger = require('../../../logs/log_helper').logger;
+import engineerFeatureFacade from "../facade/engineer_feature_facade";
+
+class EngineerFeatureController extends BaseController{
+    async main(request, response) {
+        let engineerFeatureLibs = await engineerFeatureFacade.findByCondition({},{info:0},false);
+        let randerData = {
+            title:'工程特征指标库',
+            userAccount: request.session.managerData.username,
+            userID: request.session.managerData.userID,
+            engineerFeatureLibs:engineerFeatureLibs,
+            layout: 'maintain/common/html/layout'
+        };
+        response.render("maintain/engineer_feature_lib/html/main", randerData);
+    }
+    async addLib(request, response){
+        try {
+            await engineerFeatureFacade.addLib(request.body);
+        }catch (error) {
+            console.log(error);
+        }
+        response.redirect(request.headers.referer);
+    }
+    async findLib(request, response){
+        let result={
+            error:0
+        };
+        try {
+            let data = request.body.data;
+            data = JSON.parse(data);
+            let conditions={ID:data.ID};
+            let resultData = await engineerFeatureFacade.findByCondition(conditions);
+            result.data=resultData;
+        }catch (err){
+            console.log(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        response.json(result);
+    }
+    async saveLib(request, response){
+        let result={
+            error:0
+        };
+        try {
+            let data = request.body.data;
+            data = JSON.parse(data);
+            let resultData= await engineerFeatureFacade.saveLib(data);
+            result.data=resultData;
+        }catch (err){
+            console.log(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        response.json(result);
+    }
+    async deleteLibByID(request,response){
+        logger.info(`delete feeRateLib ${request.ip}`);
+        let result={
+            error:0
+        };
+        try {
+            let data = request.body.data;
+            data = JSON.parse(data);
+            let resultData= await engineerFeatureFacade.deleteLibByID(data.ID);
+            result.data=resultData;
+        }catch (err){
+            console.log(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        response.json(result);
+    }
+    async edit(request,response){
+        //先取出替换库信息:
+        let libID = request.params.libID;
+        let engineerFeatureLib = await engineerFeatureFacade.findByCondition({'ID':libID});
+        if(engineerFeatureLib){
+            let randerData = {
+                title:'工程特征指标库',
+                mainURL:'/engineerFeature/main',
+                libName:engineerFeatureLib.name,
+                userAccount: request.session.managerData.username,
+                userID: request.session.managerData.userID,
+                originalInfo:JSON.stringify(engineerFeatureLib.features),
+                libID:libID,
+                LicenseKey:config.getLicenseKey(process.env.NODE_ENV),
+                layout: 'maintain/common/html/edit_layout'
+            };
+            response.render("maintain/engineer_feature_lib/html/edit", randerData);
+        }else {
+            response.redirect(request.headers.referer);
+        }
+    }
+}
+
+export default EngineerFeatureController;

+ 41 - 0
modules/engineer_feature_lib/facade/engineer_feature_facade.js

@@ -0,0 +1,41 @@
+/**
+ * Created by zhang on 2018/9/10.
+ */
+
+import mongoose from "mongoose";
+
+const uuidV1 = require('uuid/v1');
+let moment = require("moment");
+let engineerFeatureModel = mongoose.model('std_engineer_feature_lib');
+
+let engineerFeatureLib = {
+    findByCondition:async function(conditions,options,single=true){
+        if(single == true){
+            return await engineerFeatureModel.findOne(conditions,options);
+        }else {
+            return await  engineerFeatureModel.find(conditions,options);
+        }
+    },
+    addLib : async function (data){
+        let now = new Date().getTime();
+        let dateStr = moment(now).format('YYYY-MM-DD HH:mm:ss');
+        let newLib = {
+            creator: data.userAccount,
+            createDate: now,
+            recentOpr: [{operator: data.userAccount, operateDate: dateStr}],
+            name: data.name,
+        };
+        newLib.ID = uuidV1();
+        return await engineerFeatureModel.create(newLib);
+
+
+    },
+    saveLib:async function(param) {
+        return await engineerFeatureModel.findOneAndUpdate(param.query,param.data,{new:true});
+    },
+    deleteLibByID:async function(ID){
+        return await engineerFeatureModel.deleteOne({ID:ID});
+    }
+};
+
+export default engineerFeatureLib

+ 21 - 0
modules/engineer_feature_lib/routes/engineer_feature_routes.js

@@ -0,0 +1,21 @@
+/**
+ * Created by zhang on 2018/9/10.
+ */
+
+let express = require("express");
+let engineerFeatureRouter =express.Router();
+import EngineerFeatureController from "../controllers/engineer_feature_controller";
+let engineerFeatureController = new EngineerFeatureController();
+
+module.exports =function (app) {
+
+    engineerFeatureRouter.get("/main", engineerFeatureController.auth, engineerFeatureController.init, engineerFeatureController.main);
+    engineerFeatureRouter.post("/addLib", engineerFeatureController.auth, engineerFeatureController.init, engineerFeatureController.addLib);
+    engineerFeatureRouter.post("/findLib", engineerFeatureController.auth, engineerFeatureController.init, engineerFeatureController.findLib);
+    engineerFeatureRouter.post("/saveLib", engineerFeatureController.auth, engineerFeatureController.init, engineerFeatureController.saveLib);
+    engineerFeatureRouter.post("/deleteLibByID", engineerFeatureController.auth, engineerFeatureController.init, engineerFeatureController.deleteLibByID);
+    engineerFeatureRouter.get("/edit/:libID", engineerFeatureController.auth, engineerFeatureController.init, engineerFeatureController.edit);
+
+
+    app.use("/engineerFeature", engineerFeatureRouter);
+};

+ 102 - 0
modules/engineer_info_lib/controllers/engineer_info_controller.js

@@ -0,0 +1,102 @@
+/**
+ * Created by zhang on 2018/9/10.
+ */
+import BaseController from "../../common/base/base_controller";
+let config = require("../../../config/config.js");
+let logger = require('../../../logs/log_helper').logger;
+import engineerInfoFacade from "../facade/engineer_info_facade";
+
+class EngineerInfoController extends BaseController{
+    async main(request, response) {
+        let engineerInfoLibs = await engineerInfoFacade.findByCondition({},{info:0},false);
+        let randerData = {
+            title:'工程信息库',
+            userAccount: request.session.managerData.username,
+            userID: request.session.managerData.userID,
+            engineerInfoLibs:engineerInfoLibs,
+            layout: 'maintain/common/html/layout'
+        };
+        response.render("maintain/engineer_info_lib/html/main", randerData);
+    }
+    async addLib(request, response){
+        try {
+            await engineerInfoFacade.addLib(request.body);
+        }catch (error) {
+            console.log(error);
+        }
+        response.redirect(request.headers.referer);
+    }
+    async findLib(request, response){
+        let result={
+            error:0
+        };
+        try {
+            let data = request.body.data;
+            data = JSON.parse(data);
+            let conditions={ID:data.ID};
+            let resultData = await engineerInfoFacade.findByCondition(conditions);
+            result.data=resultData;
+        }catch (err){
+            console.log(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        response.json(result);
+    }
+    async saveLib(request, response){
+        let result={
+            error:0
+        };
+        try {
+            let data = request.body.data;
+            data = JSON.parse(data);
+            let resultData= await engineerInfoFacade.saveLib(data);
+            result.data=resultData;
+        }catch (err){
+            console.log(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        response.json(result);
+    }
+    async deleteLibByID(request,response){
+        logger.info(`delete feeRateLib ${request.ip}`);
+        let result={
+            error:0
+        };
+        try {
+            let data = request.body.data;
+            data = JSON.parse(data);
+            let resultData= await engineerInfoFacade.deleteLibByID(data.ID);
+            result.data=resultData;
+        }catch (err){
+            console.log(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        response.json(result);
+    }
+    async edit(request,response){
+        //先取出替换库信息:
+        let libID = request.params.libID;
+        let engineerInfoLib = await engineerInfoFacade.findByCondition({'ID':libID});
+        if(engineerInfoLib){
+            let randerData = {
+                title:'工程信息库',
+                mainURL:'/engineerInfo/main',
+                libName:engineerInfoLib.name,
+                userAccount: request.session.managerData.username,
+                userID: request.session.managerData.userID,
+                originalInfo:JSON.stringify(engineerInfoLib.info),
+                libID:libID,
+                LicenseKey:config.getLicenseKey(process.env.NODE_ENV),
+                layout: 'maintain/common/html/edit_layout'
+            };
+            response.render("maintain/engineer_info_lib/html/edit", randerData);
+        }else {
+            response.redirect(request.headers.referer);
+        }
+    }
+}
+
+export default EngineerInfoController;

+ 42 - 0
modules/engineer_info_lib/facade/engineer_info_facade.js

@@ -0,0 +1,42 @@
+/**
+ * Created by zhang on 2018/9/10.
+ */
+
+import mongoose from "mongoose";
+
+const uuidV1 = require('uuid/v1');
+let moment = require("moment");
+let engineerInfoModel = mongoose.model('std_engineer_info_lib');
+const _ = require('lodash');
+
+let engineerInfoLib = {
+    findByCondition:async function(conditions,options,single=true){
+        if(single == true){
+            return await engineerInfoModel.findOne(conditions,options);
+        }else {
+            return await  engineerInfoModel.find(conditions,options);
+        }
+    },
+    addLib : async function (data){
+        let now = new Date().getTime();
+        let dateStr = moment(now).format('YYYY-MM-DD HH:mm:ss');
+        let newLib = {
+            creator: data.userAccount,
+            createDate: now,
+            recentOpr: [{operator: data.userAccount, operateDate: dateStr}],
+            name: data.name,
+        };
+        newLib.ID = uuidV1();
+        return await engineerInfoModel.create(newLib);
+
+
+    },
+    saveLib:async function(param) {
+        return await engineerInfoModel.findOneAndUpdate(param.query,param.data,{new:true});
+    },
+    deleteLibByID:async function(ID){
+        return await engineerInfoModel.deleteOne({ID:ID});
+    },
+};
+
+export default engineerInfoLib

+ 21 - 0
modules/engineer_info_lib/routes/engineer_info_routes.js

@@ -0,0 +1,21 @@
+/**
+ * Created by zhang on 2018/9/10.
+ */
+
+let express = require("express");
+let engineerInfoRouter =express.Router();
+import EngineerInfoController from "../controllers/engineer_info_controller";
+let engineerInfoController = new EngineerInfoController();
+
+module.exports =function (app) {
+
+    engineerInfoRouter.get("/main", engineerInfoController.auth, engineerInfoController.init, engineerInfoController.main);
+    engineerInfoRouter.post("/addLib", engineerInfoController.auth, engineerInfoController.init, engineerInfoController.addLib);
+    engineerInfoRouter.post("/findLib", engineerInfoController.auth, engineerInfoController.init, engineerInfoController.findLib);
+    engineerInfoRouter.post("/saveLib", engineerInfoController.auth, engineerInfoController.init, engineerInfoController.saveLib);
+    engineerInfoRouter.post("/deleteLibByID", engineerInfoController.auth, engineerInfoController.init, engineerInfoController.deleteLibByID);
+    engineerInfoRouter.get("/edit/:libID", engineerInfoController.auth, engineerInfoController.init, engineerInfoController.edit);
+
+
+    app.use("/engineerInfo", engineerInfoRouter);
+};

+ 102 - 0
modules/main_quantity_lib/controllers/quantity_controller.js

@@ -0,0 +1,102 @@
+/**
+ * Created by zhang on 2018/9/10.
+ */
+import BaseController from "../../common/base/base_controller";
+let config = require("../../../config/config.js");
+let logger = require('../../../logs/log_helper').logger;
+import quantityFacade from "../facade/quantity_facade";
+
+class QuantityController extends BaseController{
+    async main(request, response) {
+        let quantityLibs = await quantityFacade.findByCondition({},{info:0},false);
+        let randerData = {
+            title:'主要工程量指标库',
+            userAccount: request.session.managerData.username,
+            userID: request.session.managerData.userID,
+            quantityLibs:quantityLibs,
+            layout: 'maintain/common/html/layout'
+        };
+        response.render("maintain/main_quantity_lib/html/main", randerData);
+    }
+    async addLib(request, response){
+        try {
+            await quantityFacade.addLib(request.body);
+        }catch (error) {
+            console.log(error);
+        }
+        response.redirect(request.headers.referer);
+    }
+    async findLib(request, response){
+        let result={
+            error:0
+        };
+        try {
+            let data = request.body.data;
+            data = JSON.parse(data);
+            let conditions={ID:data.ID};
+            let resultData = await quantityFacade.findByCondition(conditions);
+            result.data=resultData;
+        }catch (err){
+            console.log(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        response.json(result);
+    }
+    async saveLib(request, response){
+        let result={
+            error:0
+        };
+        try {
+            let data = request.body.data;
+            data = JSON.parse(data);
+            let resultData= await quantityFacade.saveLib(data);
+            result.data=resultData;
+        }catch (err){
+            console.log(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        response.json(result);
+    }
+    async deleteLibByID(request,response){
+        logger.info(`delete feeRateLib ${request.ip}`);
+        let result={
+            error:0
+        };
+        try {
+            let data = request.body.data;
+            data = JSON.parse(data);
+            let resultData= await quantityFacade.deleteLibByID(data.ID);
+            result.data=resultData;
+        }catch (err){
+            console.log(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        response.json(result);
+    }
+    async edit(request,response){
+        //先取出替换库信息:
+        let libID = request.params.libID;
+        let quantityLib = await quantityFacade.findByCondition({'ID':libID});
+        if(quantityLib){
+            let randerData = {
+                title:'主要工程量指标库',
+                mainURL:'/material/main',
+                libName:quantityLib.name,
+                userAccount: request.session.managerData.username,
+                userID: request.session.managerData.userID,
+                originalInfo:JSON.stringify(quantityLib.index),
+                libID:libID,
+                LicenseKey:config.getLicenseKey(process.env.NODE_ENV),
+                layout: 'maintain/common/html/edit_layout'
+            };
+            response.render("maintain/main_quantity_lib/html/edit", randerData);
+        }else {
+            response.redirect(request.headers.referer);
+        }
+    }
+}
+
+export default QuantityController;

+ 41 - 0
modules/main_quantity_lib/facade/quantity_facade.js

@@ -0,0 +1,41 @@
+/**
+ * Created by zhang on 2018/9/10.
+ */
+
+import mongoose from "mongoose";
+
+const uuidV1 = require('uuid/v1');
+let moment = require("moment");
+let quantityModel = mongoose.model('std_main_quantity_lib');
+
+let quantityLib = {
+    findByCondition:async function(conditions,options,single=true){
+        if(single == true){
+            return await quantityModel.findOne(conditions,options);
+        }else {
+            return await  quantityModel.find(conditions,options);
+        }
+    },
+    addLib : async function (data){
+        let now = new Date().getTime();
+        let dateStr = moment(now).format('YYYY-MM-DD HH:mm:ss');
+        let newLib = {
+            creator: data.userAccount,
+            createDate: now,
+            recentOpr: [{operator: data.userAccount, operateDate: dateStr}],
+            name: data.name,
+        };
+        newLib.ID = uuidV1();
+        return await quantityModel.create(newLib);
+
+
+    },
+    saveLib:async function(param) {
+        return await quantityModel.findOneAndUpdate(param.query,param.data,{new:true});
+    },
+    deleteLibByID:async function(ID){
+        return await quantityModel.deleteOne({ID:ID});
+    }
+};
+
+export default quantityLib

+ 21 - 0
modules/main_quantity_lib/routes/quantity_routes.js

@@ -0,0 +1,21 @@
+/**
+ * Created by zhang on 2018/9/10.
+ */
+
+let express = require("express");
+let quantityRouter =express.Router();
+import QuantityController from "../controllers/quantity_controller";
+let quantityController = new QuantityController();
+
+module.exports =function (app) {
+
+    quantityRouter.get("/main", quantityController.auth, quantityController.init, quantityController.main);
+    quantityRouter.post("/addLib", quantityController.auth, quantityController.init, quantityController.addLib);
+    quantityRouter.post("/findLib", quantityController.auth, quantityController.init, quantityController.findLib);
+    quantityRouter.post("/saveLib", quantityController.auth, quantityController.init, quantityController.saveLib);
+    quantityRouter.post("/deleteLibByID", quantityController.auth, quantityController.init, quantityController.deleteLibByID);
+    quantityRouter.get("/edit/:libID", quantityController.auth, quantityController.init, quantityController.edit);
+
+
+    app.use("/mainQuantity", quantityRouter);
+};

+ 102 - 0
modules/material_lib/controllers/material_controller.js

@@ -0,0 +1,102 @@
+/**
+ * Created by zhang on 2018/9/10.
+ */
+import BaseController from "../../common/base/base_controller";
+let config = require("../../../config/config.js");
+let logger = require('../../../logs/log_helper').logger;
+import materialFacade from "../facade/material_facade";
+
+class MaterialController extends BaseController{
+    async main(request, response) {
+        let materialLibs = await materialFacade.findByCondition({},{info:0},false);
+        let randerData = {
+            title:'主要工料指标库',
+            userAccount: request.session.managerData.username,
+            userID: request.session.managerData.userID,
+            materialLibs:materialLibs,
+            layout: 'maintain/common/html/layout'
+        };
+        response.render("maintain/material_lib/html/main", randerData);
+    }
+    async addLib(request, response){
+        try {
+            await materialFacade.addLib(request.body);
+        }catch (error) {
+            console.log(error);
+        }
+        response.redirect(request.headers.referer);
+    }
+    async findLib(request, response){
+        let result={
+            error:0
+        };
+        try {
+            let data = request.body.data;
+            data = JSON.parse(data);
+            let conditions={ID:data.ID};
+            let resultData = await materialFacade.findByCondition(conditions);
+            result.data=resultData;
+        }catch (err){
+            console.log(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        response.json(result);
+    }
+    async saveLib(request, response){
+        let result={
+            error:0
+        };
+        try {
+            let data = request.body.data;
+            data = JSON.parse(data);
+            let resultData= await materialFacade.saveLib(data);
+            result.data=resultData;
+        }catch (err){
+            console.log(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        response.json(result);
+    }
+    async deleteLibByID(request,response){
+        logger.info(`delete feeRateLib ${request.ip}`);
+        let result={
+            error:0
+        };
+        try {
+            let data = request.body.data;
+            data = JSON.parse(data);
+            let resultData= await materialFacade.deleteLibByID(data.ID);
+            result.data=resultData;
+        }catch (err){
+            console.log(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        response.json(result);
+    }
+    async edit(request,response){
+        //先取出替换库信息:
+        let libID = request.params.libID;
+        let materialLib = await materialFacade.findByCondition({'ID':libID});
+        if(materialLib){
+            let randerData = {
+                title:'主要工料指标库',
+                mainURL:'/material/main',
+                libName:materialLib.name,
+                userAccount: request.session.managerData.username,
+                userID: request.session.managerData.userID,
+                originalInfo:JSON.stringify(materialLib.materials),
+                libID:libID,
+                LicenseKey:config.getLicenseKey(process.env.NODE_ENV),
+                layout: 'maintain/common/html/edit_layout'
+            };
+            response.render("maintain/material_lib/html/edit", randerData);
+        }else {
+            response.redirect(request.headers.referer);
+        }
+    }
+}
+
+export default MaterialController;

+ 41 - 0
modules/material_lib/facade/material_facade.js

@@ -0,0 +1,41 @@
+/**
+ * Created by zhang on 2018/9/10.
+ */
+
+import mongoose from "mongoose";
+
+const uuidV1 = require('uuid/v1');
+let moment = require("moment");
+let materialModel = mongoose.model('std_material_lib');
+
+let materialLib = {
+    findByCondition:async function(conditions,options,single=true){
+        if(single == true){
+            return await materialModel.findOne(conditions,options);
+        }else {
+            return await  materialModel.find(conditions,options);
+        }
+    },
+    addLib : async function (data){
+        let now = new Date().getTime();
+        let dateStr = moment(now).format('YYYY-MM-DD HH:mm:ss');
+        let newLib = {
+            creator: data.userAccount,
+            createDate: now,
+            recentOpr: [{operator: data.userAccount, operateDate: dateStr}],
+            name: data.name,
+        };
+        newLib.ID = uuidV1();
+        return await materialModel.create(newLib);
+
+
+    },
+    saveLib:async function(param) {
+        return await materialModel.findOneAndUpdate(param.query,param.data,{new:true});
+    },
+    deleteLibByID:async function(ID){
+        return await materialModel.deleteOne({ID:ID});
+    }
+};
+
+export default materialLib

+ 21 - 0
modules/material_lib/routes/material_routes.js

@@ -0,0 +1,21 @@
+/**
+ * Created by zhang on 2018/9/10.
+ */
+
+let express = require("express");
+let materialRouter =express.Router();
+import MaterialController from "../controllers/material_controller";
+let materialController = new MaterialController();
+
+module.exports =function (app) {
+
+    materialRouter.get("/main", materialController.auth, materialController.init, materialController.main);
+    materialRouter.post("/addLib", materialController.auth, materialController.init, materialController.addLib);
+    materialRouter.post("/findLib", materialController.auth, materialController.init, materialController.findLib);
+    materialRouter.post("/saveLib", materialController.auth, materialController.init, materialController.saveLib);
+    materialRouter.post("/deleteLibByID", materialController.auth, materialController.init, materialController.deleteLibByID);
+    materialRouter.get("/edit/:libID", materialController.auth, materialController.init, materialController.edit);
+
+
+    app.use("/material", materialRouter);
+};

+ 25 - 1
modules/users/controllers/compilation_controller.js

@@ -23,6 +23,11 @@ import mainColFacade from "../../main_col_lib/facade/main_col_facade";
 import billTemplateFacade from "../../bills_template_lib/facade/bills_template_facade";
 import billTemplateFacade from "../../bills_template_lib/facade/bills_template_facade";
 import projectFeatureFacade from "../../project_feature_lib/facade/project_feature_facade";
 import projectFeatureFacade from "../../project_feature_lib/facade/project_feature_facade";
 import basicInfoFacade from "../../basic_info_lib/facade/basic_info_facade";
 import basicInfoFacade from "../../basic_info_lib/facade/basic_info_facade";
+import engineerInfoFacade from "../../engineer_info_lib/facade/engineer_info_facade";
+import engineerFeatureFacade from "../../engineer_feature_lib/facade/engineer_feature_facade";
+import materialFacade from "../../material_lib/facade/material_facade";
+import quantityFacade from "../../main_quantity_lib/facade/quantity_facade";
+import economicFacade from "../../economic_lib/facade/economic_facade";
 import {default as category, List as categoryList} from "../../common/const/category_const.js";
 import {default as category, List as categoryList} from "../../common/const/category_const.js";
 let config = require("../../../config/config.js");
 let config = require("../../../config/config.js");
 const fs = require('fs');
 const fs = require('fs');
@@ -182,7 +187,7 @@ class CompilationController extends BaseController {
         let section = request.params.section;
         let section = request.params.section;
         let selectedCompilation = request.session.selectedCompilation;
         let selectedCompilation = request.session.selectedCompilation;
 
 
-        let compilationList = [],billList = [], rationList = [], gljList = [],feeRateList = [], libData = {}, billsTemplateData = [],featureList = [],infoList = [];
+        let compilationList = [],billList = [], rationList = [], gljList = [],feeRateList = [], libData = {}, billsTemplateData = [],featureList = [],infoList = [],engineerInfoList=[],engineerFeatureList=[],materialList=[],mainQuantityList=[],economicList=[];
         let valuationData = {}, valuationList = {}, artificialCoefficientList = [], calculationList = [], billsGuidanceList = [], mainTreeColList = [];
         let valuationData = {}, valuationList = {}, artificialCoefficientList = [], calculationList = [], billsGuidanceList = [], mainTreeColList = [];
         let billTemplateList = [];
         let billTemplateList = [];
         try {
         try {
@@ -242,6 +247,20 @@ class CompilationController extends BaseController {
             //获取基本信息库
             //获取基本信息库
             infoList = await basicInfoFacade.findByCondition({},null,false);
             infoList = await basicInfoFacade.findByCondition({},null,false);
 
 
+            engineerInfoList = await engineerInfoFacade.findByCondition({},null,false);
+
+            //工程特征指标库
+            engineerFeatureList = await engineerFeatureFacade.findByCondition({},null,false);
+
+            //主要工料指标
+            materialList = await materialFacade.findByCondition({},null,false);
+
+            //主要工程量指标
+            mainQuantityList = await quantityFacade.findByCondition({},null,false);
+
+            //主要工程量指标
+            economicList = await economicFacade.findByCondition({},null,false);
+
         } catch (error) {
         } catch (error) {
             console.log(error);
             console.log(error);
         }
         }
@@ -268,6 +287,11 @@ class CompilationController extends BaseController {
             billsGuidanceList: JSON.stringify(billsGuidanceList),
             billsGuidanceList: JSON.stringify(billsGuidanceList),
             featureList:JSON.stringify(featureList),
             featureList:JSON.stringify(featureList),
             infoList: JSON.stringify(infoList),
             infoList: JSON.stringify(infoList),
+            engineerInfoList:JSON.stringify(engineerInfoList),
+            engineerFeatureList:JSON.stringify(engineerFeatureList),
+            materialList:JSON.stringify(materialList),
+            mainQuantityList:JSON.stringify(mainQuantityList),
+            economicList:JSON.stringify(economicList),
             layout: 'users/views/layout/layout',
             layout: 'users/views/layout/layout',
             LicenseKey:config.getLicenseKey(process.env.NODE_ENV)
             LicenseKey:config.getLicenseKey(process.env.NODE_ENV)
         };
         };

+ 15 - 0
modules/users/models/engineering_lib_model.js

@@ -184,6 +184,21 @@ class EngineeringLibModel extends BaseModel {
         //判断基本信息
         //判断基本信息
         data.info_lib = this._validLib(data.info_lib);
         data.info_lib = this._validLib(data.info_lib);
 
 
+        //判断工程信息
+        data.engineer_info_lib = this._validLib(data.engineer_info_lib);
+
+        //判断工程特征指标信息
+        data.engineer_feature_lib = this._validLib(data.engineer_feature_lib);
+
+        //判断主要工料指标信息
+        data.material_lib = this._validLib(data.material_lib);
+
+        //判断主要工料指标信息
+        data.main_quantity_lib = this._validLib(data.main_quantity_lib);
+
+        //判断主要经济指标信息
+        data.economic_lib = this._validLib(data.economic_lib);
+
         //计税方式组合
         //计税方式组合
         data.tax_group = this._validLib(data.tax_group);
         data.tax_group = this._validLib(data.tax_group);
 
 

+ 69 - 1
web/maintain/bills_lib/scripts/bills_lib_setting.js

@@ -52,7 +52,7 @@ var billsLibSetting = {
                 hAlign: 0,
                 hAlign: 0,
                 font: 'Arial'
                 font: 'Arial'
             },
             },
-            width: 140
+            width: 80
         },
         },
         {
         {
             head: {
             head: {
@@ -87,6 +87,74 @@ var billsLibSetting = {
                 font: 'Arial'
                 font: 'Arial'
             },
             },
             width: 80
             width: 80
+        },
+        {
+            head: {
+                titleNames: ['工程经济\n指标类别'],
+                spanCols: [1],
+                spanRows: [2],
+                vAlign: [1, 1],
+                hAlign: [1, 1],
+                font: ' Arial'
+            },
+            data: {
+                field: 'economicType',
+                vAlign: 1,
+                hAlign: 1,
+                font: 'Arial'
+            },
+            width: 80
+        },
+        {
+            head: {
+                titleNames: ['工程量指\n标类别'],
+                spanCols: [1],
+                spanRows: [2],
+                vAlign: [1, 1],
+                hAlign: [1, 1],
+                font: ' Arial'
+            },
+            data: {
+                field: 'quantityIndexType',
+                vAlign: 1,
+                hAlign: 1,
+                font: 'Arial'
+            },
+            width: 80
+        },
+        {
+            head: {
+                titleNames: ['工程量指\n标单位'],
+                spanCols: [1],
+                spanRows: [2],
+                vAlign: [1, 1],
+                hAlign: [1, 1],
+                font: ' Arial'
+            },
+            data: {
+                field: 'quantityIndexUnit',
+                vAlign: 1,
+                hAlign: 1,
+                font: 'Arial'
+            },
+            width: 60
+        },
+        {
+            head: {
+                titleNames: ['单位转\n换系数'],
+                spanCols: [1],
+                spanRows: [2],
+                vAlign: [1, 1],
+                hAlign: [1, 1],
+                font: ' Arial'
+            },
+            data: {
+                field: 'quantityIndexCoe',
+                vAlign: 1,
+                hAlign: 1,
+                font: 'Arial'
+            },
+            width: 60
         }
         }
     ],
     ],
     headRows: 1,
     headRows: 1,

+ 37 - 0
web/maintain/economic_lib/html/edit.html

@@ -0,0 +1,37 @@
+<nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0 second_header">
+    <ul class="nav nav-tabs" role="tablist">
+        <li class="nav-item">
+            <a class="nav-link active px-3" href="javascript: void(0);">基本信息</a>
+        </li>
+    </ul>
+</nav>
+
+<div class="main">
+    <div class="content" >
+        <div class="container-fluid" >
+        <div class=" col-lg-12 p-0">
+            <nav class="navbar sticky-top navbar-toggleable-md navbar-light bg-faded tools-bar">
+                <div class="collapse navbar-collapse" id="navbarNav">
+                    <div class="tools-btn btn-group align-top">
+                        <a href="javascript:void(0)" class="btn btn-sm" id="createNormal"><i class="fa fa-list-alt" aria-hidden="true"></i> 生成默认</a>
+                        <a href="javascript:void(0)" class="btn btn-sm" id="format"><i class="fa fa-list-alt" aria-hidden="true"></i> 校验格式</a>
+                        <a href="javascript:void(0)" class="btn btn-sm" id="save"><i class="fa fa-floppy-o" aria-hidden="true"></i> 保存</a>
+                    </div>
+                </div>
+            </nav>
+            <textarea class="form-control" id="editValue" rows="38"></textarea>
+        </div>
+        </div>
+        <input type="hidden" id="libID" value="<%= libID %>">
+        <input type="hidden" id="originalInfo" value="<%= originalInfo %>">
+    </div>
+</div>
+
+
+
+<script type="text/javascript">
+
+</script>
+<script type="text/javascript" src="/public/web/PerfectLoad.js"></script>
+<script type="text/javascript" src="/lib/json/json2.js"></script>
+<script type="text/javascript" src="/web/maintain/economic_lib/js/edit.js"></script>

+ 108 - 0
web/maintain/economic_lib/html/main.html

@@ -0,0 +1,108 @@
+<div class="main">
+    <div class="content">
+        <div class="container-fluid">
+            <div class="row">
+                <div class="col-md-5">
+                    <div class="warp-p2 mt-3">
+                        <table class="table table-hover table-bordered">
+                            <thead><tr><th >库名称</th><th width="160">添加时间</th><th width="120">操作</th></tr></thead>
+                            <tbody id="showArea">
+                            <% for(let lib of economicLibs){ %>
+                            <tr class="libTr">
+                                <td id="<%= lib.ID%>"><a href="/economic/edit/<%= lib.ID%>"><%= lib.name%></a></td>
+                                <td><%= moment(lib.createDate).format('YYYY-MM-DD')%></td>
+                                <td>
+                                    <a style="color: #0275d8" onclick='getLibInfo("<%= lib.ID%>")' title="编辑"><i class="fa fa-pencil-square-o"></i></a>
+                                    <a style="color: #0275d8" onclick='showDeleteModal("<%= lib.ID%>")' class="text-danger" title="删除"><i class="fa fa-remove"></i></a>
+                                </td>
+                            </tr>
+                            <% } %>
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--弹出添加-->
+<div class="modal fade" id="add" data-backdrop="static" style="display: none;" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">添加主要经济指标库</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">×</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <form id="addLibForm" method="post" action="/economic/addLib" enctype="application/x-www-form-urlencoded21">
+                    <div class="form-group">
+                        <label>库名称</label>
+                        <input id="name" name="name" class="form-control" placeholder="请输入主要经济指标库名称" type="text">
+                        <small class="form-text text-danger" id="nameError" style="display: none">请输入主要经济指标库名称。</small>
+                    </div>
+                    <input type="hidden" name = "userAccount" value="<%= userAccount%>">
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button id="addLibs"  class="btn btn-primary">新建</button>
+                <button type="button" id="cancelBtn" class="btn btn-secondary" data-dismiss="modal">取消</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--弹出编辑-->
+<div class="modal fade" id="edit" data-backdrop="static" style="display: none;" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">主要经济指标库</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">×</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <form>
+                    <div class="form-group">
+                        <label>主要经济指标库名称</label>
+                        <input id="renameText" class="form-control" placeholder="输入名称" type="text" value="">
+                        <small class="form-text text-danger" id="renameError" style="display: none">请输入名称。</small>
+                        <input id="libID" type="hidden">
+                    </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <a id="rename" href="javascript: void(0);" class="btn btn-primary" >确定</a>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--弹出删除-->
+<div class="modal fade" id="del" data-backdrop="static" style="display: none;" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">删除确认</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">×</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <h5 class="text-danger">删除后无法恢复,确认是否删除?</h5>
+                <input type="hidden" id="libID_del">
+                <input type="hidden" id="delCount">
+            </div>
+            <div class="modal-footer">
+                <a id="delete" href="javascript:void(0);" class="btn btn-danger" >确认</a>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/javascript" src="/web/maintain/economic_lib/js/main.js"></script>

+ 74 - 0
web/maintain/economic_lib/js/edit.js

@@ -0,0 +1,74 @@
+/**
+ * Created by zhang on 2018/9/3.
+ */
+
+$(document).ready(function () {
+    try {
+        let tem = sortJson(JSON.parse($("#originalInfo").val()), compareInfo);
+        $("#editValue").val(JSON.stringify(tem,null,4));
+    }catch (err){
+        console.log(err);
+    }
+
+   $("#format").click( function() {
+       try {
+           let jsonText =  $("#editValue").val();
+           $("#editValue").val(JSON.stringify(JSON.parse(jsonText),null,4));
+       }catch (err){
+           console.log(err);
+           alert("输入的JSON格式有误,请重新输入!");
+       }
+   });
+    $("#save").click(async function() {
+        try {
+            $.bootstrapLoading.start();
+            let libID = $("#libID").val();
+            let jsonText =  $("#editValue").val();
+            if(jsonText.indexOf("'")!=-1){
+                alert("输入的格式不能包含 ' 位于:"+jsonText.substr(jsonText.indexOf("'")-15,18));
+                return;
+            }
+            await ajaxPost("/economic/saveLib",{query:{ID:libID},data:{index:JSON.parse(jsonText)}});
+            $.bootstrapLoading.end();
+        }catch (err){
+            $.bootstrapLoading.end();
+            console.log(err);
+            alert("保存失败,请查看输入数据");
+        }
+    });
+    $("#createNormal").click(async function() {
+        let normalInfo =  [
+            { "name": "土石方工程", "value": ""},
+            { "name": "路基处理",  "value": ""},
+            { "name": "道路基层",  "value": ""},
+            { "name": "道路面层",  "value": ""},
+            { "name": "人行道及其他",  "value": ""},
+            { "name": "交通管理设施", "value": ""},
+            { "name": "其他工程", "value": ""}
+        ];
+        try {
+            let jsonText =  JSON.stringify(normalInfo);
+            $("#editValue").val(JSON.stringify(JSON.parse(jsonText),null,4));
+        }catch (err){
+            console.log(err);
+        }
+
+    })
+
+
+});
+function compareInfo(a, b) {
+    let mapping = {
+        dispName: 1,
+        key: 2,
+        cellType: 3,
+        readOnly: 4,
+        required: 5,
+        value: 6,
+        options: 7,
+        items: 8
+    };
+    let aV = mapping[a] ? mapping[a] : 0,
+        bV = mapping[b] ? mapping[b] : 0;
+    return aV - bV;
+}

+ 77 - 0
web/maintain/economic_lib/js/main.js

@@ -0,0 +1,77 @@
+/**
+ * Created by zhang on 2018/9/3.
+ */
+let router = "economic";
+$(document).ready(function() {
+    // 保存按钮
+    $("#addLibs").click(async function() {
+        let name = $('#name').val();
+        if(name==''){
+            $("#nameError").show();
+            return;
+        }else {
+            $("#addLibs").attr("disabled",true);//防止重复提交
+            $("#addLibForm").submit();
+        }
+    });
+
+    $("#rename").click(async function() {
+        let libID = $("#libID").val();
+        let name = $('#renameText').val();
+        if(libID!=''){
+            if(name ==''){
+                $("#renameError").show();
+                return;
+            }else {
+                try {
+                    let newInfo = await ajaxPost(`/${router}/saveLib`,{query:{ID:libID},data:{name:name}});
+                    $("#"+libID).children("a").text(newInfo.name);
+                    $("#edit").modal('hide');
+                }catch(err) {
+                    console.log(err);
+                }
+            }
+        }
+    });
+
+    $("#delete").click(async function() {
+        let libID = $("#libID_del").val();
+        let delCount = parseInt($("#delCount").val());
+        delCount = delCount+1;
+        $("#delCount").val(delCount);
+        if(delCount == 3){
+            if(libID!=""){
+                try {
+                    let result = await ajaxPost(`/${router}/deleteLibByID`,{ID:libID});
+                    if(result.ok){
+                        $("#"+libID).parent(".libTr").remove();
+                    }
+                    $("#del").modal('hide');
+                }catch (err){
+                    console.log(err);
+                }
+            }
+        }
+    });
+});
+
+async function getLibInfo (ID) {
+    try {
+        let lib = await ajaxPost(`/${router}/findLib`,{ID:ID});
+        if(lib){
+            $("#renameText").val(lib.name);
+            $("#libID").val(ID);
+            $("#edit").modal({show:true});
+        }else {
+            alert("没有找到基本信息库");
+        }
+    }catch (err){
+        console.log(err);
+    }
+}
+
+function showDeleteModal(ID){
+    $("#libID_del").val(ID);
+    $("#delCount").val(0);
+    $("#del").modal({show:true});
+}

+ 37 - 0
web/maintain/engineer_feature_lib/html/edit.html

@@ -0,0 +1,37 @@
+<nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0 second_header">
+    <ul class="nav nav-tabs" role="tablist">
+        <li class="nav-item">
+            <a class="nav-link active px-3" href="javascript: void(0);">基本信息</a>
+        </li>
+    </ul>
+</nav>
+
+<div class="main">
+    <div class="content" >
+        <div class="container-fluid" >
+        <div class=" col-lg-12 p-0">
+            <nav class="navbar sticky-top navbar-toggleable-md navbar-light bg-faded tools-bar">
+                <div class="collapse navbar-collapse" id="navbarNav">
+                    <div class="tools-btn btn-group align-top">
+                        <a href="javascript:void(0)" class="btn btn-sm" id="createNormal"><i class="fa fa-list-alt" aria-hidden="true"></i> 生成默认</a>
+                        <a href="javascript:void(0)" class="btn btn-sm" id="format"><i class="fa fa-list-alt" aria-hidden="true"></i> 校验格式</a>
+                        <a href="javascript:void(0)" class="btn btn-sm" id="save"><i class="fa fa-floppy-o" aria-hidden="true"></i> 保存</a>
+                    </div>
+                </div>
+            </nav>
+            <textarea class="form-control" id="editValue" rows="38"></textarea>
+        </div>
+        </div>
+        <input type="hidden" id="libID" value="<%= libID %>">
+        <input type="hidden" id="originalInfo" value="<%= originalInfo %>">
+    </div>
+</div>
+
+
+
+<script type="text/javascript">
+
+</script>
+<script type="text/javascript" src="/public/web/PerfectLoad.js"></script>
+<script type="text/javascript" src="/lib/json/json2.js"></script>
+<script type="text/javascript" src="/web/maintain/engineer_feature_lib/js/edit.js"></script>

+ 108 - 0
web/maintain/engineer_feature_lib/html/main.html

@@ -0,0 +1,108 @@
+<div class="main">
+    <div class="content">
+        <div class="container-fluid">
+            <div class="row">
+                <div class="col-md-5">
+                    <div class="warp-p2 mt-3">
+                        <table class="table table-hover table-bordered">
+                            <thead><tr><th >库名称</th><th width="160">添加时间</th><th width="120">操作</th></tr></thead>
+                            <tbody id="showArea">
+                            <% for(let lib of engineerFeatureLibs){ %>
+                            <tr class="libTr">
+                                <td id="<%= lib.ID%>"><a href="/engineerFeature/edit/<%= lib.ID%>"><%= lib.name%></a></td>
+                                <td><%= moment(lib.createDate).format('YYYY-MM-DD')%></td>
+                                <td>
+                                    <a style="color: #0275d8" onclick='getLibInfo("<%= lib.ID%>")' title="编辑"><i class="fa fa-pencil-square-o"></i></a>
+                                    <a style="color: #0275d8" onclick='showDeleteModal("<%= lib.ID%>")' class="text-danger" title="删除"><i class="fa fa-remove"></i></a>
+                                </td>
+                            </tr>
+                            <% } %>
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--弹出添加-->
+<div class="modal fade" id="add" data-backdrop="static" style="display: none;" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">添加工程特征指标库</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">×</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <form id="addLibForm" method="post" action="/engineerFeature/addLib" enctype="application/x-www-form-urlencoded21">
+                    <div class="form-group">
+                        <label>库名称</label>
+                        <input id="name" name="name" class="form-control" placeholder="请输入工程特征指标库名称" type="text">
+                        <small class="form-text text-danger" id="nameError" style="display: none">请输入工程特征指标库名称。</small>
+                    </div>
+                    <input type="hidden" name = "userAccount" value="<%= userAccount%>">
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button id="addLibs"  class="btn btn-primary">新建</button>
+                <button type="button" id="cancelBtn" class="btn btn-secondary" data-dismiss="modal">取消</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--弹出编辑-->
+<div class="modal fade" id="edit" data-backdrop="static" style="display: none;" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">工程特征指标库</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">×</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <form>
+                    <div class="form-group">
+                        <label>工程特征指标库名称</label>
+                        <input id="renameText" class="form-control" placeholder="输入名称" type="text" value="">
+                        <small class="form-text text-danger" id="renameError" style="display: none">请输入名称。</small>
+                        <input id="libID" type="hidden">
+                    </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <a id="rename" href="javascript: void(0);" class="btn btn-primary" >确定</a>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--弹出删除-->
+<div class="modal fade" id="del" data-backdrop="static" style="display: none;" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">删除确认</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">×</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <h5 class="text-danger">删除后无法恢复,确认是否删除?</h5>
+                <input type="hidden" id="libID_del">
+                <input type="hidden" id="delCount">
+            </div>
+            <div class="modal-footer">
+                <a id="delete" href="javascript:void(0);" class="btn btn-danger" >确认</a>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/javascript" src="/web/maintain/engineer_feature_lib/js/main.js"></script>

+ 85 - 0
web/maintain/engineer_feature_lib/js/edit.js

@@ -0,0 +1,85 @@
+/**
+ * Created by zhang on 2018/9/3.
+ */
+
+$(document).ready(function () {
+    try {
+        let tem = sortJson(JSON.parse($("#originalInfo").val()), compareInfo);
+        $("#editValue").val(JSON.stringify(tem,null,4));
+    }catch (err){
+        console.log(err);
+    }
+
+   $("#format").click( function() {
+       try {
+           let jsonText =  $("#editValue").val();
+           $("#editValue").val(JSON.stringify(JSON.parse(jsonText),null,4));
+       }catch (err){
+           console.log(err);
+           alert("输入的JSON格式有误,请重新输入!");
+       }
+   });
+    $("#save").click(async function() {
+        try {
+            $.bootstrapLoading.start();
+            let libID = $("#libID").val();
+            let jsonText =  $("#editValue").val();
+            if(jsonText.indexOf("'")!=-1){
+                alert("输入的格式不能包含 ' 位于:"+jsonText.substr(jsonText.indexOf("'")-15,18));
+                return;
+            }
+            await ajaxPost("/engineerFeature/saveLib",{query:{ID:libID},data:{features:JSON.parse(jsonText)}});
+            $.bootstrapLoading.end();
+        }catch (err){
+            $.bootstrapLoading.end();
+            console.log(err);
+            alert("保存失败,请查看输入数据");
+        }
+    });
+    $("#createNormal").click(async function() {
+        let normalInfo =  [
+            { "ID": 1, "ParentID": null, "name": "建筑特征", "value": ""},
+            { "ID": 101, "ParentID": 1, "name": "建筑面积", "value": ""},
+            { "ID": 10101, "ParentID": 101, "name": "总建筑面积*", "value": "","required":true,cellType:'number',index:true,indexUnit:"100M2",coe:100},
+            { "ID": 10102, "ParentID": 101, "name": "标准层面积", "value": "","cellType":'number'},//cellType:'date'
+            { "ID": 102, "ParentID": 1, "name": "层数", "value": ""},
+            { "ID": 10201, "ParentID": 102, "name": "总层数*", "value": "","required":true},
+            { "ID": 10202, "ParentID": 102, "name": "标准层层数", "value": ""},
+            { "ID": 2, "ParentID": null, "name": "结构特征", "value": ""},
+            { "ID": 201, "ParentID": 2, "name": "结构类型", "value": ""},
+            { "ID": 202, "ParentID": 2, "name": "基础类型", "value": ""},
+            { "ID": 203, "ParentID": 2, "name": "混凝土强度等级", "value": ""},
+            { "ID": 20301, "ParentID": 203, "name": "基础", "value": ""},
+            { "ID": 20302, "ParentID": 203, "name": "柱", "value": ""},
+            { "ID": 2, "ParentID": null, "name": "装饰特征", "value": ""},
+            { "ID": 201, "ParentID": 2, "name": "楼地面", "value": ""},
+            { "ID": 20201, "ParentID": 201, "name": "整体面层", "value": ""},
+            { "ID": 2020101, "ParentID": 20201, "name": "整体面层1", "value": ""},
+            { "ID": 2020102, "ParentID": 20201, "name": "整体面层2", "value": ""}
+        ];
+        try {
+            let jsonText =  JSON.stringify(normalInfo);
+            $("#editValue").val(JSON.stringify(JSON.parse(jsonText),null,4));
+        }catch (err){
+            console.log(err);
+        }
+
+    })
+
+
+});
+function compareInfo(a, b) {
+    let mapping = {
+        dispName: 1,
+        key: 2,
+        cellType: 3,
+        readOnly: 4,
+        required: 5,
+        value: 6,
+        options: 7,
+        items: 8
+    };
+    let aV = mapping[a] ? mapping[a] : 0,
+        bV = mapping[b] ? mapping[b] : 0;
+    return aV - bV;
+}

+ 77 - 0
web/maintain/engineer_feature_lib/js/main.js

@@ -0,0 +1,77 @@
+/**
+ * Created by zhang on 2018/9/3.
+ */
+let router = "engineerFeature";
+$(document).ready(function() {
+    // 保存按钮
+    $("#addLibs").click(async function() {
+        let name = $('#name').val();
+        if(name==''){
+            $("#nameError").show();
+            return;
+        }else {
+            $("#addLibs").attr("disabled",true);//防止重复提交
+            $("#addLibForm").submit();
+        }
+    });
+
+    $("#rename").click(async function() {
+        let libID = $("#libID").val();
+        let name = $('#renameText').val();
+        if(libID!=''){
+            if(name ==''){
+                $("#renameError").show();
+                return;
+            }else {
+                try {
+                    let newInfo = await ajaxPost(`/${router}/saveLib`,{query:{ID:libID},data:{name:name}});
+                    $("#"+libID).children("a").text(newInfo.name);
+                    $("#edit").modal('hide');
+                }catch(err) {
+                    console.log(err);
+                }
+            }
+        }
+    });
+
+    $("#delete").click(async function() {
+        let libID = $("#libID_del").val();
+        let delCount = parseInt($("#delCount").val());
+        delCount = delCount+1;
+        $("#delCount").val(delCount);
+        if(delCount == 3){
+            if(libID!=""){
+                try {
+                    let result = await ajaxPost(`/${router}/deleteLibByID`,{ID:libID});
+                    if(result.ok){
+                        $("#"+libID).parent(".libTr").remove();
+                    }
+                    $("#del").modal('hide');
+                }catch (err){
+                    console.log(err);
+                }
+            }
+        }
+    });
+});
+
+async function getLibInfo (ID) {
+    try {
+        let lib = await ajaxPost(`/${router}/findLib`,{ID:ID});
+        if(lib){
+            $("#renameText").val(lib.name);
+            $("#libID").val(ID);
+            $("#edit").modal({show:true});
+        }else {
+            alert("没有找到基本信息库");
+        }
+    }catch (err){
+        console.log(err);
+    }
+}
+
+function showDeleteModal(ID){
+    $("#libID_del").val(ID);
+    $("#delCount").val(0);
+    $("#del").modal({show:true});
+}

+ 37 - 0
web/maintain/engineer_info_lib/html/edit.html

@@ -0,0 +1,37 @@
+<nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0 second_header">
+    <ul class="nav nav-tabs" role="tablist">
+        <li class="nav-item">
+            <a class="nav-link active px-3" href="javascript: void(0);">基本信息</a>
+        </li>
+    </ul>
+</nav>
+
+<div class="main">
+    <div class="content" >
+        <div class="container-fluid" >
+        <div class=" col-lg-12 p-0">
+            <nav class="navbar sticky-top navbar-toggleable-md navbar-light bg-faded tools-bar">
+                <div class="collapse navbar-collapse" id="navbarNav">
+                    <div class="tools-btn btn-group align-top">
+                        <a href="javascript:void(0)" class="btn btn-sm" id="createNormal"><i class="fa fa-list-alt" aria-hidden="true"></i> 生成默认</a>
+                        <a href="javascript:void(0)" class="btn btn-sm" id="format"><i class="fa fa-list-alt" aria-hidden="true"></i> 校验格式</a>
+                        <a href="javascript:void(0)" class="btn btn-sm" id="save"><i class="fa fa-floppy-o" aria-hidden="true"></i> 保存</a>
+                    </div>
+                </div>
+            </nav>
+            <textarea class="form-control" id="editValue" rows="38"></textarea>
+        </div>
+        </div>
+        <input type="hidden" id="libID" value="<%= libID %>">
+        <input type="hidden" id="originalInfo" value="<%= originalInfo %>">
+    </div>
+</div>
+
+
+
+<script type="text/javascript">
+
+</script>
+<script type="text/javascript" src="/public/web/PerfectLoad.js"></script>
+<script type="text/javascript" src="/lib/json/json2.js"></script>
+<script type="text/javascript" src="/web/maintain/engineer_info_lib/js/edit.js"></script>

+ 108 - 0
web/maintain/engineer_info_lib/html/main.html

@@ -0,0 +1,108 @@
+<div class="main">
+    <div class="content">
+        <div class="container-fluid">
+            <div class="row">
+                <div class="col-md-5">
+                    <div class="warp-p2 mt-3">
+                        <table class="table table-hover table-bordered">
+                            <thead><tr><th >库名称</th><th width="160">添加时间</th><th width="120">操作</th></tr></thead>
+                            <tbody id="showArea">
+                            <% for(let lib of engineerInfoLibs){ %>
+                            <tr class="libTr">
+                                <td id="<%= lib.ID%>"><a href="/engineerInfo/edit/<%= lib.ID%>"><%= lib.name%></a></td>
+                                <td><%= moment(lib.createDate).format('YYYY-MM-DD')%></td>
+                                <td>
+                                    <a style="color: #0275d8" onclick='getLibInfo("<%= lib.ID%>")' title="编辑"><i class="fa fa-pencil-square-o"></i></a>
+                                    <a style="color: #0275d8" onclick='showDeleteModal("<%= lib.ID%>")' class="text-danger" title="删除"><i class="fa fa-remove"></i></a>
+                                </td>
+                            </tr>
+                            <% } %>
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--弹出添加-->
+<div class="modal fade" id="add" data-backdrop="static" style="display: none;" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">添加工程信息库</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">×</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <form id="addLibForm" method="post" action="/engineerInfo/addLib" enctype="application/x-www-form-urlencoded21">
+                    <div class="form-group">
+                        <label>库名称</label>
+                        <input id="name" name="name" class="form-control" placeholder="请输入工程信息库名称" type="text">
+                        <small class="form-text text-danger" id="nameError" style="display: none">请输入工程信息库名称。</small>
+                    </div>
+                    <input type="hidden" name = "userAccount" value="<%= userAccount%>">
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button id="addLibs"  class="btn btn-primary">新建</button>
+                <button type="button" id="cancelBtn" class="btn btn-secondary" data-dismiss="modal">取消</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--弹出编辑-->
+<div class="modal fade" id="edit" data-backdrop="static" style="display: none;" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">工程信息库</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">×</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <form>
+                    <div class="form-group">
+                        <label>工程信息库名称</label>
+                        <input id="renameText" class="form-control" placeholder="输入名称" type="text" value="">
+                        <small class="form-text text-danger" id="renameError" style="display: none">请输入名称。</small>
+                        <input id="libID" type="hidden">
+                    </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <a id="rename" href="javascript: void(0);" class="btn btn-primary" >确定</a>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--弹出删除-->
+<div class="modal fade" id="del" data-backdrop="static" style="display: none;" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">删除确认</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">×</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <h5 class="text-danger">删除后无法恢复,确认是否删除?</h5>
+                <input type="hidden" id="libID_del">
+                <input type="hidden" id="delCount">
+            </div>
+            <div class="modal-footer">
+                <a id="delete" href="javascript:void(0);" class="btn btn-danger" >确认</a>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/javascript" src="/web/maintain/engineer_info_lib/js/main.js"></script>

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 83 - 0
web/maintain/engineer_info_lib/js/edit.js


+ 77 - 0
web/maintain/engineer_info_lib/js/main.js

@@ -0,0 +1,77 @@
+/**
+ * Created by zhang on 2018/9/3.
+ */
+$(document).ready(function() {
+    let router = "engineerInfo";
+    // 保存按钮
+    $("#addLibs").click(async function() {
+        let name = $('#name').val();
+        if(name==''){
+            $("#nameError").show();
+            return;
+        }else {
+            $("#addLibs").attr("disabled",true);//防止重复提交
+            $("#addLibForm").submit();
+        }
+    });
+
+    $("#rename").click(async function() {
+        let libID = $("#libID").val();
+        let name = $('#renameText').val();
+        if(libID!=''){
+            if(name ==''){
+                $("#renameError").show();
+                return;
+            }else {
+                try {
+                    let newInfo = await ajaxPost(`/${router}/saveLib`,{query:{ID:libID},data:{name:name}});
+                    $("#"+libID).children("a").text(newInfo.name);
+                    $("#edit").modal('hide');
+                }catch(err) {
+                    console.log(err);
+                }
+            }
+        }
+    });
+
+    $("#delete").click(async function() {
+        let libID = $("#libID_del").val();
+        let delCount = parseInt($("#delCount").val());
+        delCount = delCount+1;
+        $("#delCount").val(delCount);
+        if(delCount == 3){
+            if(libID!=""){
+                try {
+                    let result = await ajaxPost(`/${router}/deleteLibByID`,{ID:libID});
+                    if(result.ok){
+                        $("#"+libID).parent(".libTr").remove();
+                    }
+                    $("#del").modal('hide');
+                }catch (err){
+                    console.log(err);
+                }
+            }
+        }
+    });
+});
+
+async function getLibInfo (ID) {
+    try {
+        let lib = await ajaxPost(`/${router}/findLib`,{ID:ID});
+        if(lib){
+            $("#renameText").val(lib.name);
+            $("#libID").val(ID);
+            $("#edit").modal({show:true});
+        }else {
+            alert("没有找到基本信息库");
+        }
+    }catch (err){
+        console.log(err);
+    }
+}
+
+function showDeleteModal(ID){
+    $("#libID_del").val(ID);
+    $("#delCount").val(0);
+    $("#del").modal({show:true});
+}

+ 37 - 0
web/maintain/main_quantity_lib/html/edit.html

@@ -0,0 +1,37 @@
+<nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0 second_header">
+    <ul class="nav nav-tabs" role="tablist">
+        <li class="nav-item">
+            <a class="nav-link active px-3" href="javascript: void(0);">基本信息</a>
+        </li>
+    </ul>
+</nav>
+
+<div class="main">
+    <div class="content" >
+        <div class="container-fluid" >
+        <div class=" col-lg-12 p-0">
+            <nav class="navbar sticky-top navbar-toggleable-md navbar-light bg-faded tools-bar">
+                <div class="collapse navbar-collapse" id="navbarNav">
+                    <div class="tools-btn btn-group align-top">
+                        <a href="javascript:void(0)" class="btn btn-sm" id="createNormal"><i class="fa fa-list-alt" aria-hidden="true"></i> 生成默认</a>
+                        <a href="javascript:void(0)" class="btn btn-sm" id="format"><i class="fa fa-list-alt" aria-hidden="true"></i> 校验格式</a>
+                        <a href="javascript:void(0)" class="btn btn-sm" id="save"><i class="fa fa-floppy-o" aria-hidden="true"></i> 保存</a>
+                    </div>
+                </div>
+            </nav>
+            <textarea class="form-control" id="editValue" rows="38"></textarea>
+        </div>
+        </div>
+        <input type="hidden" id="libID" value="<%= libID %>">
+        <input type="hidden" id="originalInfo" value="<%= originalInfo %>">
+    </div>
+</div>
+
+
+
+<script type="text/javascript">
+
+</script>
+<script type="text/javascript" src="/public/web/PerfectLoad.js"></script>
+<script type="text/javascript" src="/lib/json/json2.js"></script>
+<script type="text/javascript" src="/web/maintain/main_quantity_lib/js/edit.js"></script>

+ 108 - 0
web/maintain/main_quantity_lib/html/main.html

@@ -0,0 +1,108 @@
+<div class="main">
+    <div class="content">
+        <div class="container-fluid">
+            <div class="row">
+                <div class="col-md-5">
+                    <div class="warp-p2 mt-3">
+                        <table class="table table-hover table-bordered">
+                            <thead><tr><th >库名称</th><th width="160">添加时间</th><th width="120">操作</th></tr></thead>
+                            <tbody id="showArea">
+                            <% for(let lib of quantityLibs){ %>
+                            <tr class="libTr">
+                                <td id="<%= lib.ID%>"><a href="/mainQuantity/edit/<%= lib.ID%>"><%= lib.name%></a></td>
+                                <td><%= moment(lib.createDate).format('YYYY-MM-DD')%></td>
+                                <td>
+                                    <a style="color: #0275d8" onclick='getLibInfo("<%= lib.ID%>")' title="编辑"><i class="fa fa-pencil-square-o"></i></a>
+                                    <a style="color: #0275d8" onclick='showDeleteModal("<%= lib.ID%>")' class="text-danger" title="删除"><i class="fa fa-remove"></i></a>
+                                </td>
+                            </tr>
+                            <% } %>
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--弹出添加-->
+<div class="modal fade" id="add" data-backdrop="static" style="display: none;" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">添加主要工程量指标库</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">×</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <form id="addLibForm" method="post" action="/mainQuantity/addLib" enctype="application/x-www-form-urlencoded21">
+                    <div class="form-group">
+                        <label>库名称</label>
+                        <input id="name" name="name" class="form-control" placeholder="请输入主要工程量指标库名称" type="text">
+                        <small class="form-text text-danger" id="nameError" style="display: none">请输入主要工程量指标库名称。</small>
+                    </div>
+                    <input type="hidden" name = "userAccount" value="<%= userAccount%>">
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button id="addLibs"  class="btn btn-primary">新建</button>
+                <button type="button" id="cancelBtn" class="btn btn-secondary" data-dismiss="modal">取消</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--弹出编辑-->
+<div class="modal fade" id="edit" data-backdrop="static" style="display: none;" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">主要工程量指标库</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">×</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <form>
+                    <div class="form-group">
+                        <label>主要工程量指标库名称</label>
+                        <input id="renameText" class="form-control" placeholder="输入名称" type="text" value="">
+                        <small class="form-text text-danger" id="renameError" style="display: none">请输入名称。</small>
+                        <input id="libID" type="hidden">
+                    </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <a id="rename" href="javascript: void(0);" class="btn btn-primary" >确定</a>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--弹出删除-->
+<div class="modal fade" id="del" data-backdrop="static" style="display: none;" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">删除确认</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">×</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <h5 class="text-danger">删除后无法恢复,确认是否删除?</h5>
+                <input type="hidden" id="libID_del">
+                <input type="hidden" id="delCount">
+            </div>
+            <div class="modal-footer">
+                <a id="delete" href="javascript:void(0);" class="btn btn-danger" >确认</a>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/javascript" src="/web/maintain/main_quantity_lib/js/main.js"></script>

+ 74 - 0
web/maintain/main_quantity_lib/js/edit.js

@@ -0,0 +1,74 @@
+/**
+ * Created by zhang on 2018/9/3.
+ */
+
+$(document).ready(function () {
+    try {
+        let tem = sortJson(JSON.parse($("#originalInfo").val()), compareInfo);
+        $("#editValue").val(JSON.stringify(tem,null,4));
+    }catch (err){
+        console.log(err);
+    }
+
+   $("#format").click( function() {
+       try {
+           let jsonText =  $("#editValue").val();
+           $("#editValue").val(JSON.stringify(JSON.parse(jsonText),null,4));
+       }catch (err){
+           console.log(err);
+           alert("输入的JSON格式有误,请重新输入!");
+       }
+   });
+    $("#save").click(async function() {
+        try {
+            $.bootstrapLoading.start();
+            let libID = $("#libID").val();
+            let jsonText =  $("#editValue").val();
+            if(jsonText.indexOf("'")!=-1){
+                alert("输入的格式不能包含 ' 位于:"+jsonText.substr(jsonText.indexOf("'")-15,18));
+                return;
+            }
+            await ajaxPost("/mainQuantity/saveLib",{query:{ID:libID},data:{index:JSON.parse(jsonText)}});
+            $.bootstrapLoading.end();
+        }catch (err){
+            $.bootstrapLoading.end();
+            console.log(err);
+            alert("保存失败,请查看输入数据");
+        }
+    });
+    $("#createNormal").click(async function() {
+        let normalInfo =  [
+            { "name": "挖土方量", "unit": "m2", "coe": 2.3},
+            { "name": "填方量", "unit": "m2", "coe": 1.2},
+            { "name": "连槽石基层", "unit": "t", "coe": 0.2},
+            { "name": "砂砾石基层", "unit": "t", "coe": 0.6},
+            { "name": "块片石", "unit":"m3", "coe": 0.8},
+            { "name": "多渣","unit": "m3", "coe": ""},
+            { "name": "砂", "unit":"t", "coe": ""}
+        ];
+        try {
+            let jsonText =  JSON.stringify(normalInfo);
+            $("#editValue").val(JSON.stringify(JSON.parse(jsonText),null,4));
+        }catch (err){
+            console.log(err);
+        }
+
+    })
+
+
+});
+function compareInfo(a, b) {
+    let mapping = {
+        dispName: 1,
+        key: 2,
+        cellType: 3,
+        readOnly: 4,
+        required: 5,
+        value: 6,
+        options: 7,
+        items: 8
+    };
+    let aV = mapping[a] ? mapping[a] : 0,
+        bV = mapping[b] ? mapping[b] : 0;
+    return aV - bV;
+}

+ 77 - 0
web/maintain/main_quantity_lib/js/main.js

@@ -0,0 +1,77 @@
+/**
+ * Created by zhang on 2018/9/3.
+ */
+let router = "mainQuantity";
+$(document).ready(function() {
+    // 保存按钮
+    $("#addLibs").click(async function() {
+        let name = $('#name').val();
+        if(name==''){
+            $("#nameError").show();
+            return;
+        }else {
+            $("#addLibs").attr("disabled",true);//防止重复提交
+            $("#addLibForm").submit();
+        }
+    });
+
+    $("#rename").click(async function() {
+        let libID = $("#libID").val();
+        let name = $('#renameText').val();
+        if(libID!=''){
+            if(name ==''){
+                $("#renameError").show();
+                return;
+            }else {
+                try {
+                    let newInfo = await ajaxPost(`/${router}/saveLib`,{query:{ID:libID},data:{name:name}});
+                    $("#"+libID).children("a").text(newInfo.name);
+                    $("#edit").modal('hide');
+                }catch(err) {
+                    console.log(err);
+                }
+            }
+        }
+    });
+
+    $("#delete").click(async function() {
+        let libID = $("#libID_del").val();
+        let delCount = parseInt($("#delCount").val());
+        delCount = delCount+1;
+        $("#delCount").val(delCount);
+        if(delCount == 3){
+            if(libID!=""){
+                try {
+                    let result = await ajaxPost(`/${router}/deleteLibByID`,{ID:libID});
+                    if(result.ok){
+                        $("#"+libID).parent(".libTr").remove();
+                    }
+                    $("#del").modal('hide');
+                }catch (err){
+                    console.log(err);
+                }
+            }
+        }
+    });
+});
+
+async function getLibInfo (ID) {
+    try {
+        let lib = await ajaxPost(`/${router}/findLib`,{ID:ID});
+        if(lib){
+            $("#renameText").val(lib.name);
+            $("#libID").val(ID);
+            $("#edit").modal({show:true});
+        }else {
+            alert("没有找到基本信息库");
+        }
+    }catch (err){
+        console.log(err);
+    }
+}
+
+function showDeleteModal(ID){
+    $("#libID_del").val(ID);
+    $("#delCount").val(0);
+    $("#del").modal({show:true});
+}

+ 37 - 0
web/maintain/material_lib/html/edit.html

@@ -0,0 +1,37 @@
+<nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0 second_header">
+    <ul class="nav nav-tabs" role="tablist">
+        <li class="nav-item">
+            <a class="nav-link active px-3" href="javascript: void(0);">基本信息</a>
+        </li>
+    </ul>
+</nav>
+
+<div class="main">
+    <div class="content" >
+        <div class="container-fluid" >
+        <div class=" col-lg-12 p-0">
+            <nav class="navbar sticky-top navbar-toggleable-md navbar-light bg-faded tools-bar">
+                <div class="collapse navbar-collapse" id="navbarNav">
+                    <div class="tools-btn btn-group align-top">
+                        <a href="javascript:void(0)" class="btn btn-sm" id="createNormal"><i class="fa fa-list-alt" aria-hidden="true"></i> 生成默认</a>
+                        <a href="javascript:void(0)" class="btn btn-sm" id="format"><i class="fa fa-list-alt" aria-hidden="true"></i> 校验格式</a>
+                        <a href="javascript:void(0)" class="btn btn-sm" id="save"><i class="fa fa-floppy-o" aria-hidden="true"></i> 保存</a>
+                    </div>
+                </div>
+            </nav>
+            <textarea class="form-control" id="editValue" rows="38"></textarea>
+        </div>
+        </div>
+        <input type="hidden" id="libID" value="<%= libID %>">
+        <input type="hidden" id="originalInfo" value="<%= originalInfo %>">
+    </div>
+</div>
+
+
+
+<script type="text/javascript">
+
+</script>
+<script type="text/javascript" src="/public/web/PerfectLoad.js"></script>
+<script type="text/javascript" src="/lib/json/json2.js"></script>
+<script type="text/javascript" src="/web/maintain/material_lib/js/edit.js"></script>

+ 108 - 0
web/maintain/material_lib/html/main.html

@@ -0,0 +1,108 @@
+<div class="main">
+    <div class="content">
+        <div class="container-fluid">
+            <div class="row">
+                <div class="col-md-5">
+                    <div class="warp-p2 mt-3">
+                        <table class="table table-hover table-bordered">
+                            <thead><tr><th >库名称</th><th width="160">添加时间</th><th width="120">操作</th></tr></thead>
+                            <tbody id="showArea">
+                            <% for(let lib of materialLibs){ %>
+                            <tr class="libTr">
+                                <td id="<%= lib.ID%>"><a href="/material/edit/<%= lib.ID%>"><%= lib.name%></a></td>
+                                <td><%= moment(lib.createDate).format('YYYY-MM-DD')%></td>
+                                <td>
+                                    <a style="color: #0275d8" onclick='getLibInfo("<%= lib.ID%>")' title="编辑"><i class="fa fa-pencil-square-o"></i></a>
+                                    <a style="color: #0275d8" onclick='showDeleteModal("<%= lib.ID%>")' class="text-danger" title="删除"><i class="fa fa-remove"></i></a>
+                                </td>
+                            </tr>
+                            <% } %>
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--弹出添加-->
+<div class="modal fade" id="add" data-backdrop="static" style="display: none;" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">添加主要工料指标库</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">×</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <form id="addLibForm" method="post" action="/material/addLib" enctype="application/x-www-form-urlencoded21">
+                    <div class="form-group">
+                        <label>库名称</label>
+                        <input id="name" name="name" class="form-control" placeholder="请输入主要工料指标库名称" type="text">
+                        <small class="form-text text-danger" id="nameError" style="display: none">请输入主要工料指标库名称。</small>
+                    </div>
+                    <input type="hidden" name = "userAccount" value="<%= userAccount%>">
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button id="addLibs"  class="btn btn-primary">新建</button>
+                <button type="button" id="cancelBtn" class="btn btn-secondary" data-dismiss="modal">取消</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--弹出编辑-->
+<div class="modal fade" id="edit" data-backdrop="static" style="display: none;" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">主要工料指标库</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">×</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <form>
+                    <div class="form-group">
+                        <label>主要工料指标库名称</label>
+                        <input id="renameText" class="form-control" placeholder="输入名称" type="text" value="">
+                        <small class="form-text text-danger" id="renameError" style="display: none">请输入名称。</small>
+                        <input id="libID" type="hidden">
+                    </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <a id="rename" href="javascript: void(0);" class="btn btn-primary" >确定</a>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--弹出删除-->
+<div class="modal fade" id="del" data-backdrop="static" style="display: none;" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">删除确认</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">×</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <h5 class="text-danger">删除后无法恢复,确认是否删除?</h5>
+                <input type="hidden" id="libID_del">
+                <input type="hidden" id="delCount">
+            </div>
+            <div class="modal-footer">
+                <a id="delete" href="javascript:void(0);" class="btn btn-danger" >确认</a>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/javascript" src="/web/maintain/material_lib/js/main.js"></script>

+ 77 - 0
web/maintain/material_lib/js/edit.js

@@ -0,0 +1,77 @@
+/**
+ * Created by zhang on 2018/9/3.
+ */
+
+$(document).ready(function () {
+    try {
+        let tem = sortJson(JSON.parse($("#originalInfo").val()), compareInfo);
+        $("#editValue").val(JSON.stringify(tem,null,4));
+    }catch (err){
+        console.log(err);
+    }
+
+   $("#format").click( function() {
+       try {
+           let jsonText =  $("#editValue").val();
+           $("#editValue").val(JSON.stringify(JSON.parse(jsonText),null,4));
+       }catch (err){
+           console.log(err);
+           alert("输入的JSON格式有误,请重新输入!");
+       }
+   });
+    $("#save").click(async function() {
+        try {
+            $.bootstrapLoading.start();
+            let libID = $("#libID").val();
+            let jsonText =  $("#editValue").val();
+            if(jsonText.indexOf("'")!=-1){
+                alert("输入的格式不能包含 ' 位于:"+jsonText.substr(jsonText.indexOf("'")-15,18));
+                return;
+            }
+            await ajaxPost("/material/saveLib",{query:{ID:libID},data:{materials:JSON.parse(jsonText)}});
+            $.bootstrapLoading.end();
+        }catch (err){
+            $.bootstrapLoading.end();
+            console.log(err);
+            alert("保存失败,请查看输入数据");
+        }
+    });
+    $("#createNormal").click(async function() {
+        let normalInfo =  [
+            { "name": "综合用工", "unit": "工日", "coe": 2.3},
+            { "name": "土石方用工", "unit": "工日", "coe": 1.2},
+            { "name": "钢材", "unit": "t", "coe": 0.2},
+            { "name": "水泥", "unit": "t", "coe": 0.6},
+            { "name": "商品混凝土", "unit":"m3", "coe": 0.8},
+            { "name": "锯材","unit": "m3", "coe": ""},
+            { "name": "砂", "unit":"t", "coe": ""},
+            { "name": "石子","unit": "t", "coe": ""},
+            { "name": "保温材料", "unit": "", "coe": ""},
+            { "name": "其它材料", "unit": "", "coe": ""},
+        ];
+        try {
+            let jsonText =  JSON.stringify(normalInfo);
+            $("#editValue").val(JSON.stringify(JSON.parse(jsonText),null,4));
+        }catch (err){
+            console.log(err);
+        }
+
+    })
+
+
+});
+function compareInfo(a, b) {
+    let mapping = {
+        dispName: 1,
+        key: 2,
+        cellType: 3,
+        readOnly: 4,
+        required: 5,
+        value: 6,
+        options: 7,
+        items: 8
+    };
+    let aV = mapping[a] ? mapping[a] : 0,
+        bV = mapping[b] ? mapping[b] : 0;
+    return aV - bV;
+}

+ 77 - 0
web/maintain/material_lib/js/main.js

@@ -0,0 +1,77 @@
+/**
+ * Created by zhang on 2018/9/3.
+ */
+let router = "material";
+$(document).ready(function() {
+    // 保存按钮
+    $("#addLibs").click(async function() {
+        let name = $('#name').val();
+        if(name==''){
+            $("#nameError").show();
+            return;
+        }else {
+            $("#addLibs").attr("disabled",true);//防止重复提交
+            $("#addLibForm").submit();
+        }
+    });
+
+    $("#rename").click(async function() {
+        let libID = $("#libID").val();
+        let name = $('#renameText').val();
+        if(libID!=''){
+            if(name ==''){
+                $("#renameError").show();
+                return;
+            }else {
+                try {
+                    let newInfo = await ajaxPost(`/${router}/saveLib`,{query:{ID:libID},data:{name:name}});
+                    $("#"+libID).children("a").text(newInfo.name);
+                    $("#edit").modal('hide');
+                }catch(err) {
+                    console.log(err);
+                }
+            }
+        }
+    });
+
+    $("#delete").click(async function() {
+        let libID = $("#libID_del").val();
+        let delCount = parseInt($("#delCount").val());
+        delCount = delCount+1;
+        $("#delCount").val(delCount);
+        if(delCount == 3){
+            if(libID!=""){
+                try {
+                    let result = await ajaxPost(`/${router}/deleteLibByID`,{ID:libID});
+                    if(result.ok){
+                        $("#"+libID).parent(".libTr").remove();
+                    }
+                    $("#del").modal('hide');
+                }catch (err){
+                    console.log(err);
+                }
+            }
+        }
+    });
+});
+
+async function getLibInfo (ID) {
+    try {
+        let lib = await ajaxPost(`/${router}/findLib`,{ID:ID});
+        if(lib){
+            $("#renameText").val(lib.name);
+            $("#libID").val(ID);
+            $("#edit").modal({show:true});
+        }else {
+            alert("没有找到基本信息库");
+        }
+    }catch (err){
+        console.log(err);
+    }
+}
+
+function showDeleteModal(ID){
+    $("#libID_del").val(ID);
+    $("#delCount").val(0);
+    $("#del").modal({show:true});
+}

+ 18 - 7
web/maintain/std_glj_lib/js/glj.js

@@ -97,7 +97,7 @@ let repositoryGljObj = {
     distTypeTree: null,//add
     distTypeTree: null,//add
     setting: {
     setting: {
         owner: "glj",
         owner: "glj",
-        header:[
+        header:[//这个header会被覆盖的,不靠谱
             {headerName:"编码",headerWidth:80,dataCode:"code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
             {headerName:"编码",headerWidth:80,dataCode:"code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
             {headerName:"名称",headerWidth:160,dataCode:"name", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
             {headerName:"名称",headerWidth:160,dataCode:"name", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
             {headerName:"规格型号",headerWidth:120,dataCode:"specs", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
             {headerName:"规格型号",headerWidth:120,dataCode:"specs", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
@@ -107,7 +107,8 @@ let repositoryGljObj = {
             {headerName:"调整系数",headerWidth:60,dataCode:"adjCoe", dataType: "Number", hAlign: "center", vAlign: "center"},
             {headerName:"调整系数",headerWidth:60,dataCode:"adjCoe", dataType: "Number", hAlign: "center", vAlign: "center"},
             {headerName:"三材类别",headerWidth:90,dataCode:"materialType", dataType: "String", hAlign: "center", vAlign: "center"},
             {headerName:"三材类别",headerWidth:90,dataCode:"materialType", dataType: "String", hAlign: "center", vAlign: "center"},
             {headerName:"三材系数",headerWidth:60,dataCode:"materialCoe", dataType: "Number", hAlign: "center", vAlign: "center"},
             {headerName:"三材系数",headerWidth:60,dataCode:"materialCoe", dataType: "Number", hAlign: "center", vAlign: "center"},
-            {headerName:"机型",headerWidth:60,dataCode:"model", dataType: "Number", hAlign: "center", vAlign: "center"},
+            {headerName:"机型",headerWidth:60,dataCode:"model", dataType: "Number", hAlign: "center", vAlign: "center"}
+
         ],
         ],
         view:{
         view:{
             comboBox:[
             comboBox:[
@@ -173,7 +174,7 @@ let repositoryGljObj = {
         let headers = [
         let headers = [
             {headerName:"编码",headerWidth:80,dataCode:"code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
             {headerName:"编码",headerWidth:80,dataCode:"code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
             {headerName:"名称",headerWidth:160,dataCode:"name", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
             {headerName:"名称",headerWidth:160,dataCode:"name", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
-            {headerName:"规格型号",headerWidth:120,dataCode:"specs", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
+            {headerName:"规格型号",headerWidth:80,dataCode:"specs", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
             {headerName:"单位",headerWidth:60,dataCode:"unit", dataType: "String", hAlign: "center", vAlign: "center"},
             {headerName:"单位",headerWidth:60,dataCode:"unit", dataType: "String", hAlign: "center", vAlign: "center"},
             {headerName:"类型",headerWidth:90,dataCode:"gljType", dataType: "String", hAlign: "center", vAlign: "center"},
             {headerName:"类型",headerWidth:90,dataCode:"gljType", dataType: "String", hAlign: "center", vAlign: "center"},
         ];
         ];
@@ -199,7 +200,10 @@ let repositoryGljObj = {
             {headerName:"调整系数",headerWidth:60,dataCode:"adjCoe", dataType: "Number", hAlign: "center", vAlign: "center"},
             {headerName:"调整系数",headerWidth:60,dataCode:"adjCoe", dataType: "Number", hAlign: "center", vAlign: "center"},
             {headerName:"三材类别",headerWidth:90,dataCode:"materialType", dataType: "String", hAlign: "center", vAlign: "center"},
             {headerName:"三材类别",headerWidth:90,dataCode:"materialType", dataType: "String", hAlign: "center", vAlign: "center"},
             {headerName:"三材系数",headerWidth:60,dataCode:"materialCoe", dataType: "Number", hAlign: "center", vAlign: "center"},
             {headerName:"三材系数",headerWidth:60,dataCode:"materialCoe", dataType: "Number", hAlign: "center", vAlign: "center"},
-            {headerName:"机型",headerWidth:60,dataCode:"model", dataType: "Number", hAlign: "center", vAlign: "center"}
+            {headerName:"机型",headerWidth:60,dataCode:"model", dataType: "Number", hAlign: "center", vAlign: "center"},
+            {headerName:"工料指标类别",headerWidth:90,dataCode:"materialIndexType", dataType: "String", hAlign: "center", vAlign: "center"},
+            {headerName:"工料指标单位",headerWidth:90,dataCode:"materialIndexUnit", dataType: "String", hAlign: "center", vAlign: "center"},
+            {headerName:"单位转换系数",headerWidth:90,dataCode:"materialIndexCoe", dataType: "Number", hAlign: "center", vAlign: "center"}
         ];
         ];
         headers = headers.concat(tailHeaders);
         headers = headers.concat(tailHeaders);
         return headers;
         return headers;
@@ -748,7 +752,6 @@ let repositoryGljObj = {
         return objA[me.colMapping.colToField[col]] !== objB[[me.colMapping.colToField[col]]];
         return objA[me.colMapping.colToField[col]] !== objB[[me.colMapping.colToField[col]]];
     },
     },
     onCellEditEnd: function(sender, args) {
     onCellEditEnd: function(sender, args) {
-        debugger;
         let me = repositoryGljObj, that = gljComponentOprObj,
         let me = repositoryGljObj, that = gljComponentOprObj,
             updateArr = [], addArr = [], updateBasePrcArr = [];
             updateArr = [], addArr = [], updateBasePrcArr = [];
         let deESCFields = ['code', 'name', 'specs'];//消除转义字符
         let deESCFields = ['code', 'name', 'specs'];//消除转义字符
@@ -1231,8 +1234,7 @@ let repositoryGljObj = {
             if(!me.materialType.textArr.includes(pasteObj.materialType)){
             if(!me.materialType.textArr.includes(pasteObj.materialType)){
                 isValid = false;
                 isValid = false;
                 materialTypeValid = false;
                 materialTypeValid = false;
-            }
-            else {
+            } else {
                 me.materialType.comboItems.forEach(function (item) {
                 me.materialType.comboItems.forEach(function (item) {
                    if(item.text === pasteObj.materialType){
                    if(item.text === pasteObj.materialType){
                        tempObj.materialType = item.value;
                        tempObj.materialType = item.value;
@@ -1274,6 +1276,15 @@ let repositoryGljObj = {
                 }
                 }
             }
             }
         }
         }
+        if(typeof pasteObj.materialIndexType !== 'undefined'){
+            tempObj.materialIndexType = pasteObj.materialIndexType;
+        }
+        if(typeof pasteObj.materialIndexUnit !== 'undefined'){
+            tempObj.materialIndexUnit = pasteObj.materialIndexUnit;
+        }
+        if(typeof pasteObj.materialIndexCoe !== 'undefined'){
+            tempObj.materialIndexCoe = pasteObj.materialIndexCoe;
+        }
         if(isValid){
         if(isValid){
             rst.updateGlj.push(tempObj);
             rst.updateGlj.push(tempObj);
             if(reCalBasePrc){
             if(reCalBasePrc){

+ 98 - 2
web/users/js/compilation.js

@@ -245,6 +245,26 @@ $(document).ready(function() {
                 $('#info-area').show();
                 $('#info-area').show();
                 $('#add-compilation-title').text('添加基本信息');
                 $('#add-compilation-title').text('添加基本信息');
                 break;
                 break;
+            case 'engineer_info':
+                $('#engineer-info-area').show();
+                $('#add-compilation-title').text('添加工程信息');
+                break;
+            case 'engineer_feature':
+                $('#engineer-feature-area').show();
+                $('#add-compilation-title').text('添加工程特征指标');
+                break;
+            case 'material':
+                $('#material-area').show();
+                $('#add-compilation-title').text('添加主要工料指标');
+                break;
+            case 'main_quantity':
+                $('#main-quantity-area').show();
+                $('#add-compilation-title').text('添加主要工程量指标');
+                break;
+            case 'economic':
+                $('#economic-area').show();
+                $('#add-compilation-title').text('添加主要经济指标');
+                break;
         }
         }
         $("#addcompilation").modal('show');
         $("#addcompilation").modal('show');
     });
     });
@@ -261,7 +281,10 @@ $(document).ready(function() {
     });
     });
 
 
     // 移除操作
     // 移除操作
-    $(".bill-list, .ration-list, .glj-list, .fee-list, .artificial-list, .program-list, .billsGuidance-list,.feature-list,.info-list").on("click", ".remove-lib", function() {
+    /*$(".remove-lib").on("click", function() {
+        $(this).parent().remove();
+    })*/
+    $(".bill-list, .ration-list, .glj-list, .fee-list, .artificial-list, .program-list, .billsGuidance-list,.feature-list,.info-list,.engineer_info-list,.engineer_feature-list,.material-list,.main_quantity-list,.economic-list").on("click", ".remove-lib", function() {
         $(this).parent().remove();
         $(this).parent().remove();
     });
     });
 
 
@@ -453,6 +476,12 @@ function initCompilation() {
     let mainTreeColData= mainTreeColList == undefined ? [] : JSON.parse(mainTreeColList);
     let mainTreeColData= mainTreeColList == undefined ? [] : JSON.parse(mainTreeColList);
     let featureData = featureList == undefined?[]: JSON.parse(featureList);
     let featureData = featureList == undefined?[]: JSON.parse(featureList);
     let infoData = infoList == undefined ? [] : JSON.parse(infoList);
     let infoData = infoList == undefined ? [] : JSON.parse(infoList);
+    let engineerInfoData = engineerInfoList == undefined ? [] : JSON.parse(engineerInfoList);
+    let engineerFeatureData = engineerFeatureList == undefined ? [] : JSON.parse(engineerFeatureList);
+    let materialData = materialList == undefined ? [] : JSON.parse(materialList);
+    let mainQuantityData = mainQuantityList == undefined ? [] : JSON.parse(mainQuantityList);
+    let economicData = economicList == undefined ? [] : JSON.parse(economicList);
+
     /*mainTreeCol = mainTreeCol !== '' ? mainTreeCol.replace(/\n/g, '\\n') : mainTreeCol;
     /*mainTreeCol = mainTreeCol !== '' ? mainTreeCol.replace(/\n/g, '\\n') : mainTreeCol;
     billsTemplateData = billsTemplateData.replace(/\n/g, '\\n');
     billsTemplateData = billsTemplateData.replace(/\n/g, '\\n');
 
 
@@ -559,6 +588,44 @@ function initCompilation() {
         html += tmpHtml;
         html += tmpHtml;
     }
     }
     $("select[name='info_lib']").children("option").first().after(html);
     $("select[name='info_lib']").children("option").first().after(html);
+    //工程信息库
+    html = '';
+    for(let tmp of engineerInfoData){
+        let tmpHtml = '<option value="' + tmp.ID + '">' + tmp.name + '</option>';
+        html += tmpHtml;
+    }
+    $("select[name='engineer_info_lib']").children("option").first().after(html);
+    //工程特征指标库
+    html = '';
+    for(let tmp of engineerFeatureData){
+        let tmpHtml = '<option value="' + tmp.ID + '">' + tmp.name + '</option>';
+        html += tmpHtml;
+    }
+    $("select[name='engineer_feature_lib']").children("option").first().after(html);
+
+    //主要工料指标库
+    html = '';
+    for(let tmp of materialData){
+        let tmpHtml = '<option value="' + tmp.ID + '">' + tmp.name + '</option>';
+        html += tmpHtml;
+    }
+    $("select[name='material_lib']").children("option").first().after(html);
+
+    //主要工程量指标库
+    html = '';
+    for(let tmp of mainQuantityData){
+        let tmpHtml = '<option value="' + tmp.ID + '">' + tmp.name + '</option>';
+        html += tmpHtml;
+    }
+    $("select[name='main_quantity_lib']").children("option").first().after(html);
+
+    //主要经济指标库
+    html = '';
+    for(let tmp of economicData){
+        let tmpHtml = '<option value="' + tmp.ID + '">' + tmp.name + '</option>';
+        html += tmpHtml;
+    }
+    $("select[name='economic_lib']").children("option").first().after(html);
 }
 }
 
 
 /**
 /**
@@ -578,7 +645,11 @@ function getAndValidData(model) {
     let billsGuidanceLib = $("select[name='billsGuidance_lib']").children("option:selected").val();
     let billsGuidanceLib = $("select[name='billsGuidance_lib']").children("option:selected").val();
     let featureLib = $("select[name='feature_lib']").children("option:selected").val();
     let featureLib = $("select[name='feature_lib']").children("option:selected").val();
     let infoLib = $("select[name='info_lib']").children("option:selected").val();
     let infoLib = $("select[name='info_lib']").children("option:selected").val();
-
+    let engineerInfoLib = $("select[name='engineer_info_lib']").children("option:selected").val();
+    let engineerFeatureLib = $("select[name='engineer_feature_lib']").children("option:selected").val();
+    let materialLib = $("select[name='material_lib']").children("option:selected").val();
+    let mainQuantityLib = $("select[name='main_quantity_lib']").children("option:selected").val();
+    let economicLib = $("select[name='economic_lib']").children("option:selected").val();
 
 
     if (name === '' && model === 'all') {
     if (name === '' && model === 'all') {
         throw '编办名字不能为空';
         throw '编办名字不能为空';
@@ -620,6 +691,11 @@ function getAndValidData(model) {
     let billsGuidanceString = $("select[name='billsGuidance_lib']").children("option:selected").text();
     let billsGuidanceString = $("select[name='billsGuidance_lib']").children("option:selected").text();
     let featrueString = $("select[name='feature_lib']").children("option:selected").text();
     let featrueString = $("select[name='feature_lib']").children("option:selected").text();
     let infoString = $("select[name='info_lib']").children("option:selected").text();
     let infoString = $("select[name='info_lib']").children("option:selected").text();
+    let engineerInfoString = $("select[name='engineer_info_lib']").children("option:selected").text();
+    let engineerFeatureString = $("select[name='engineer_feature_lib']").children("option:selected").text();
+    let materialString = $("select[name='material_lib']").children("option:selected").text();
+    let mainQuantityString = $("select[name='main_quantity_lib']").children("option:selected").text();
+    let economicString = $("select[name='economic_lib']").children("option:selected").text();
 
 
 
 
     let result = {
     let result = {
@@ -659,6 +735,26 @@ function getAndValidData(model) {
         info: {
         info: {
             id: infoLib,
             id: infoLib,
             name: infoString
             name: infoString
+        },
+        engineer_info:{
+            id:engineerInfoLib,
+            name:engineerInfoString
+        },
+        engineer_feature:{
+            id:engineerFeatureLib,
+            name:engineerFeatureString
+        },
+        material:{
+            id:materialLib,
+            name:materialString
+        },
+        main_quantity:{
+            id:mainQuantityLib,
+            name:mainQuantityString
+        },
+        economic:{
+            id:economicLib,
+            name:economicString
         }
         }
     };
     };
     return result;
     return result;

+ 14 - 1
web/users/views/compilation/add.html

@@ -37,6 +37,7 @@
                                 <th>序号</th>
                                 <th>序号</th>
                                 <th>工程专业</th>
                                 <th>工程专业</th>
                                 <th>费用标准</th>
                                 <th>费用标准</th>
+                                <th>指标专业</th>
                                 <th>定额取费专业</th>
                                 <th>定额取费专业</th>
                                 <th>单位工程取费专业</th>
                                 <th>单位工程取费专业</th>
                                 <th>标准清单</th>
                                 <th>标准清单</th>
@@ -77,7 +78,19 @@
                                                 <button type="button" class="btn btn-success" onclick='confirmUpdate(this,"<%= engineering._id.toString()%>")'>
                                                 <button type="button" class="btn btn-success" onclick='confirmUpdate(this,"<%= engineering._id.toString()%>")'>
                                                     <span class="glyphicon glyphicon-ok"></span></button>
                                                     <span class="glyphicon glyphicon-ok"></span></button>
                                             </div>
                                             </div>
-                                        </div></td>
+                                        </div>
+                                    </td>
+                                    <td>
+                                        <div><span><%= engineering.indexName %></span> <a onclick='editEngineer(this)'><i class="glyphicon glyphicon-pencil"></i></a></div>
+                                        <div class="input-group input-group-sm input_group_div" style="width:200px;display: none">
+                                            <input class="form-control" name="indexName">
+                                            <div class="input-group-btn">
+                                                <button type="button" class="btn btn-success" onclick='confirmUpdate(this,"<%= engineering._id.toString()%>")'>
+                                                    <span class="glyphicon glyphicon-ok"></span></button>
+                                            </div>
+                                        </div>
+                                    </td>
+
                                     <td>
                                     <td>
                                         <div><span><%= engineering.engineering %></span> <a onclick='editEngineer(this)'><i class="glyphicon glyphicon-pencil"></i></a></div>
                                         <div><span><%= engineering.engineering %></span> <a onclick='editEngineer(this)'><i class="glyphicon glyphicon-pencil"></i></a></div>
                                         <div class="input-group input-group-sm input_group_div" style="width:200px;display: none">
                                         <div class="input-group input-group-sm input_group_div" style="width:200px;display: none">

+ 90 - 0
web/users/views/compilation/engineering.html

@@ -123,6 +123,91 @@
                                 </div>
                                 </div>
                                 <a href="#" class="btn btn-link btn-sm add-compilation" data-model="info">添加</a>
                                 <a href="#" class="btn btn-link btn-sm add-compilation" data-model="info">添加</a>
                             </div>
                             </div>
+                            <div class="form-group col-md-3">
+                                <label>工程信息</label>
+                                <div class="engineer_info-list">
+                                    <% if (Object.keys(libData).length > 0 && libData.engineer_info_lib && libData.engineer_info_lib.length > 0) { %>
+                                    <% libData.engineer_info_lib.forEach(function (info, index){ %>
+                                    <p class="form-control-static">
+                                        <a class="pull-right text-danger remove-lib" data-model="engineer_info" title="移除" data-id="<%= info.id %>">
+                                            <span class="glyphicon glyphicon-remove"></span>
+                                        </a>
+                                        <input type="hidden" name="engineer_info_lib" data-id="<%= info.id %>" value="<%= JSON.stringify({id: info.id, name: info.name}) %>">
+                                        <% if (index === 0) {%><i class="glyphicon glyphicon-flag"></i>&nbsp;<% } %><%= info.name %>
+                                    </p>
+                                    <% }) %>
+                                    <% } %>
+                                </div>
+                                <a href="#" class="btn btn-link btn-sm add-compilation" data-model="engineer_info">添加</a>
+                            </div>
+                            <div class="form-group col-md-3">
+                                <label>工程特征指标</label>
+                                <div class="engineer_feature-list">
+                                    <% if (Object.keys(libData).length > 0 && libData.engineer_feature_lib && libData.engineer_feature_lib.length > 0) { %>
+                                    <% libData.engineer_feature_lib.forEach(function (info, index){ %>
+                                    <p class="form-control-static">
+                                        <a class="pull-right text-danger remove-lib" data-model="engineer_feature" title="移除" data-id="<%= info.id %>">
+                                            <span class="glyphicon glyphicon-remove"></span>
+                                        </a>
+                                        <input type="hidden" name="engineer_feature_lib" data-id="<%= info.id %>" value="<%= JSON.stringify({id: info.id, name: info.name}) %>">
+                                        <% if (index === 0) {%><i class="glyphicon glyphicon-flag"></i>&nbsp;<% } %><%= info.name %>
+                                    </p>
+                                    <% }) %>
+                                    <% } %>
+                                </div>
+                                <a href="#" class="btn btn-link btn-sm add-compilation" data-model="engineer_feature">添加</a>
+                            </div>
+                            <div class="form-group col-md-3">
+                                <label>主要工料指标</label>
+                                <div class="material-list">
+                                    <% if (Object.keys(libData).length > 0 && libData.material_lib && libData.material_lib.length > 0) { %>
+                                    <% libData.material_lib.forEach(function (info, index){ %>
+                                    <p class="form-control-static">
+                                        <a class="pull-right text-danger remove-lib" data-model="material" title="移除" data-id="<%= info.id %>">
+                                            <span class="glyphicon glyphicon-remove"></span>
+                                        </a>
+                                        <input type="hidden" name="material_lib" data-id="<%= info.id %>" value="<%= JSON.stringify({id: info.id, name: info.name}) %>">
+                                        <% if (index === 0) {%><i class="glyphicon glyphicon-flag"></i>&nbsp;<% } %><%= info.name %>
+                                    </p>
+                                    <% }) %>
+                                    <% } %>
+                                </div>
+                                <a href="#" class="btn btn-link btn-sm add-compilation" data-model="material">添加</a>
+                            </div>
+                            <div class="form-group col-md-3">
+                                <label>主要工程量指标</label>
+                                <div class="main_quantity-list">
+                                    <% if (Object.keys(libData).length > 0 && libData.main_quantity_lib && libData.main_quantity_lib.length > 0) { %>
+                                    <% libData.main_quantity_lib.forEach(function (info, index){ %>
+                                    <p class="form-control-static">
+                                        <a class="pull-right text-danger remove-lib" data-model="main_quantity" title="移除" data-id="<%= info.id %>">
+                                            <span class="glyphicon glyphicon-remove"></span>
+                                        </a>
+                                        <input type="hidden" name="main_quantity_lib" data-id="<%= info.id %>" value="<%= JSON.stringify({id: info.id, name: info.name}) %>">
+                                        <% if (index === 0) {%><i class="glyphicon glyphicon-flag"></i>&nbsp;<% } %><%= info.name %>
+                                    </p>
+                                    <% }) %>
+                                    <% } %>
+                                </div>
+                                <a href="#" class="btn btn-link btn-sm add-compilation" data-model="main_quantity">添加</a>
+                            </div>
+                            <div class="form-group col-md-3">
+                                <label>主要经济指标</label>
+                                <div class="economic-list">
+                                    <% if (Object.keys(libData).length > 0 && libData.economic_lib && libData.economic_lib.length > 0) { %>
+                                    <% libData.economic_lib.forEach(function (info, index){ %>
+                                    <p class="form-control-static">
+                                        <a class="pull-right text-danger remove-lib" data-model="economic" title="移除" data-id="<%= info.id %>">
+                                            <span class="glyphicon glyphicon-remove"></span>
+                                        </a>
+                                        <input type="hidden" name="economic_lib" data-id="<%= info.id %>" value="<%= JSON.stringify({id: info.id, name: info.name}) %>">
+                                        <% if (index === 0) {%><i class="glyphicon glyphicon-flag"></i>&nbsp;<% } %><%= info.name %>
+                                    </p>
+                                    <% }) %>
+                                    <% } %>
+                                </div>
+                                <a href="#" class="btn btn-link btn-sm add-compilation" data-model="economic">添加</a>
+                            </div>
                     </div>
                     </div>
 
 
                     <div class="col-md-12">
                     <div class="col-md-12">
@@ -250,6 +335,11 @@
     let mainTreeColList = '<%- mainTreeColList %>';
     let mainTreeColList = '<%- mainTreeColList %>';
     let featureList = '<%- featureList %>';
     let featureList = '<%- featureList %>';
     let infoList = '<%- infoList %>';
     let infoList = '<%- infoList %>';
+    let engineerInfoList ='<%- engineerInfoList %>';
+    let engineerFeatureList ='<%- engineerFeatureList %>';
+    let materialList ='<%- materialList %>';
+    let mainQuantityList ='<%- mainQuantityList %>';
+    let economicList ='<%- economicList %>';
     let colSpread = null;
     let colSpread = null;
     let colEditSpread = null;
     let colEditSpread = null;
 </script>
 </script>

+ 50 - 0
web/users/views/compilation/modal.html

@@ -61,6 +61,56 @@
                         </div>
                         </div>
                     </div>
                     </div>
                 </div>
                 </div>
+                <div class="form-group" id="engineer-info-area">
+                    <label>工程信息</label>
+                    <div class="row">
+                        <div class="col-xs-12">
+                            <select class="form-control" name="engineer_info_lib">
+                                <option value="">请选择工程信息库</option>
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group" id="engineer-feature-area">
+                    <label>工程特征指标</label>
+                    <div class="row">
+                        <div class="col-xs-12">
+                            <select class="form-control" name="engineer_feature_lib">
+                                <option value="">请选择工程特征指标库</option>
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group" id="material-area">
+                    <label>主要工料指标</label>
+                    <div class="row">
+                        <div class="col-xs-12">
+                            <select class="form-control" name="material_lib">
+                                <option value="">请选择主要工料指标库</option>
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group" id="main-quantity-area">
+                    <label>主要工程量指标</label>
+                    <div class="row">
+                        <div class="col-xs-12">
+                            <select class="form-control" name="main_quantity_lib">
+                                <option value="">请选择主要工程量指标库</option>
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group" id="economic-area">
+                    <label>主要经济指标</label>
+                    <div class="row">
+                        <div class="col-xs-12">
+                            <select class="form-control" name="economic_lib">
+                                <option value="">请选择主要经济指标库</option>
+                            </select>
+                        </div>
+                    </div>
+                </div>
                 <div class="form-group" id="artificial-area">
                 <div class="form-group" id="artificial-area">
                     <label>人工系数</label>
                     <label>人工系数</label>
                     <div class="row">
                     <div class="row">