Bladeren bron

Merge branch '1.0.0_online' of http://smartcost.f3322.net:3000/SmartCost/ConstructionOperation into 1.0.0_online

TonyKang 6 jaren geleden
bovenliggende
commit
f79f728b15
31 gewijzigde bestanden met toevoegingen van 1000 en 207 verwijderingen
  1. 25 0
      modules/all_models/basic_info_lib.js
  2. 4 0
      modules/all_models/engineering_lib.js
  3. 1 0
      modules/all_models/stdRation_lib.js
  4. 99 0
      modules/basic_info_lib/controllers/basic_info_controller.js
  5. 38 0
      modules/basic_info_lib/facade/basic_info_facade.js
  6. 21 0
      modules/basic_info_lib/routes/project_feature_router.js
  7. 13 1
      modules/bills_template_lib/controllers/bills_template_controller.js
  8. 4 1
      modules/bills_template_lib/facade/bills_template_facade.js
  9. 13 1
      modules/calc_program_lib/controllers/calc_program_controller.js
  10. 13 1
      modules/fee_rate_lib/controllers/fee_rate_controller.js
  11. 1 1
      modules/ration_repository/controllers/ration_repository_controller.js
  12. 18 1
      modules/ration_repository/controllers/repository_views_controller.js
  13. 3 2
      modules/ration_repository/models/repository_map.js
  14. 50 0
      modules/sys_tools/controllers/sys_controller.js
  15. 2 0
      modules/sys_tools/routes/routes.js
  16. 6 1
      modules/users/controllers/compilation_controller.js
  17. 3 0
      modules/users/models/engineering_lib_model.js
  18. 37 0
      web/maintain/basic_info_lib/html/edit.html
  19. 108 0
      web/maintain/basic_info_lib/html/main.html
  20. 76 0
      web/maintain/basic_info_lib/js/basic_info.js
  21. 102 0
      web/maintain/basic_info_lib/js/basic_info_edit.js
  22. 14 0
      web/maintain/bill_template_lib/html/main.html
  23. 14 0
      web/maintain/calc_program_lib/html/main.html
  24. 8 4
      web/maintain/common/js/util.js
  25. 14 0
      web/maintain/fee_rate_lib/html/main.html
  26. 132 189
      web/maintain/ration_repository/js/main.js
  27. 49 4
      web/maintain/ration_repository/main.html
  28. 20 1
      web/users/js/compilation.js
  29. 18 0
      web/users/views/compilation/engineering.html
  30. 10 0
      web/users/views/compilation/modal.html
  31. 84 0
      web/users/views/tool/index.html

+ 25 - 0
modules/all_models/basic_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 basicInfoLib = 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_basic_info_lib', basicInfoLib, 'std_basic_info_lib');

+ 4 - 0
modules/all_models/engineering_lib.js

@@ -58,6 +58,10 @@ let modelSchema = {
         type: Schema.Types.Mixed,
         default: []
     },
+    info_lib: {
+        type: Schema.Types.Mixed,
+        default: []
+    },
     //设置人材机显示列
     glj_col:{
         showAdjustPrice:Boolean//是否显示调整价列

+ 1 - 0
modules/all_models/stdRation_lib.js

@@ -8,6 +8,7 @@ const oprSchema = require('../all_schemas/opr_schema');
 const RepositoryMapSchema = new Schema({
     "ID": Number,
     "dispName" : String,
+    "libCode": String, //定额编号
     "appType" : String, //如:"建筑" / "公路"
     "localeType": String, //如 各个省份 / 部颁
     "descr" : String,

+ 99 - 0
modules/basic_info_lib/controllers/basic_info_controller.js

@@ -0,0 +1,99 @@
+/**
+ * Created by zhang on 2018/9/3.
+ */
+import BaseController from "../../common/base/base_controller";
+import basicInfoFacade from "../facade/basic_info_facade";
+let config = require("../../../config/config.js");
+
+class BasicInfoController extends BaseController{
+    async main(request, response) {
+        let baiscInfoLibs = await basicInfoFacade.findByCondition({},{feature:0},false);
+        let randerData = {
+            title:'基本信息库',
+            userAccount: request.session.managerData.username,
+            userID: request.session.managerData.userID,
+            basicInfoLibs:baiscInfoLibs,
+            layout: 'maintain/common/html/layout'
+        };
+        response.render("maintain/basic_info_lib/html/main", randerData);
+    }
+    async addLib(request, response){
+        try {
+            await basicInfoFacade.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 basicInfoFacade.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 basicInfoFacade.saveLib(data);
+            result.data=resultData;
+        }catch (err){
+            console.log(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        response.json(result);
+    }
+    async deleteLibByID(request,response){
+        let result={
+            error:0
+        };
+        try {
+            let data = request.body.data;
+            data = JSON.parse(data);
+            let resultData= await basicInfoFacade.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 basicInfoLib = await basicInfoFacade.findByCondition({'ID':libID});
+        if(basicInfoLib){
+            let randerData = {
+                title:'基本信息库',
+                mainURL:'/basicInfo/main',
+                libName:basicInfoLib.name,
+                userAccount: request.session.managerData.username,
+                userID: request.session.managerData.userID,
+                basicInfoList:JSON.stringify(basicInfoLib.info),
+                libID:libID,
+                LicenseKey:config.getLicenseKey(process.env.NODE_ENV),
+                layout: 'maintain/common/html/edit_layout'
+            };
+            response.render("maintain/basic_info_lib/html/edit", randerData);
+        }else {
+            response.redirect(request.headers.referer);
+        }
+    }
+}
+export default BasicInfoController;

+ 38 - 0
modules/basic_info_lib/facade/basic_info_facade.js

@@ -0,0 +1,38 @@
+/**
+ * Created by zhang on 2018/9/3.
+ */
+import mongoose from "mongoose";
+const uuidV1 = require('uuid/v1');
+let moment = require("moment");
+let basicInfoModel = mongoose.model('std_basic_info_lib');
+
+
+let basicInfoLib = {
+    findByCondition:async function(conditions,options,single=true){
+        if(single == true){
+            return await basicInfoModel.findOne(conditions,options);
+        }else {
+            return await  basicInfoModel.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 basicInfoModel.create(newLib);
+    },
+    saveLib:async function(param) {
+        return await basicInfoModel.findOneAndUpdate(param.query,param.data,{new:true});
+    },
+    deleteLibByID:async function(ID){
+        return await basicInfoModel.deleteOne({ID:ID});
+    },
+};
+
+export default basicInfoLib

+ 21 - 0
modules/basic_info_lib/routes/project_feature_router.js

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

+ 13 - 1
modules/bills_template_lib/controllers/bills_template_controller.js

@@ -9,6 +9,7 @@ import BaseController from "../../common/base/base_controller";
 import billsTemplateFacade from "../facade/bills_template_facade";
 import {default as BillsFixedFlagConst, List as BillsFixedFlagList} from "../../common/const/bills_fixed.js";
 import {default as BillsTypeFlagConst, List as BillsTypeFlagList} from "../../common/const/bills_type.js";
+import CompilationModel from '../../users/models/compilation_model';
 let config = require("../../../config/config.js");
 
 class BillsTemplateController extends BaseController {
@@ -21,12 +22,23 @@ class BillsTemplateController extends BaseController {
      * @return {void}
      */
     async main(request, response) {
-        let templateLibs = await billsTemplateFacade.getAllLibs();
+        let filter = request.query.filter ? {compilationId: request.query.filter} : null;
+        let templateLibs = await billsTemplateFacade.getAllLibs(filter);
+        let compilationModel = new CompilationModel();
+        let compilationList = await compilationModel.getCompilationList({_id: 1, name: 1});
+        compilationList.unshift({_id: 'all', name: '所有'});
+        let activeCompilation = compilationList.find(compilation => compilation._id.toString() === request.query.filter);
+        if (activeCompilation) {
+            activeCompilation.active = 'active';
+        } else {
+            compilationList[0].active = 'active'
+        }
         let randerData = {
             title:'清单模板',
             userAccount: request.session.managerData.username,
             userID: request.session.managerData.userID,
             templateLibs:templateLibs,
+            compilationList: compilationList,
             layout: 'maintain/common/html/layout',
             LicenseKey:config.getLicenseKey(process.env.NODE_ENV)
         };

+ 4 - 1
modules/bills_template_lib/facade/bills_template_facade.js

@@ -62,7 +62,10 @@ async function getLibByID(ID) {
     return await billTemplateLibModel.findOne({ID:ID});
 }
 
-async function getAllLibs() {
+async function getAllLibs(filter = null) {
+    if (filter) {
+        return await billTemplateLibModel.find(filter);
+    }
     return await billTemplateLibModel.find();
 }
 

+ 13 - 1
modules/calc_program_lib/controllers/calc_program_controller.js

@@ -4,15 +4,27 @@
 import BaseController from "../../common/base/base_controller";
 let config = require("../../../config/config.js");
 import calcProgramFacade from "../facade/calc_program_facade";
+import CompilationModel from '../../users/models/compilation_model';
 
 class CalcProgramController extends BaseController {
     async main(request, response) {
-        let calcProgramLibs = await calcProgramFacade.findByCondition({}, {templates: 0}, false);
+        let compilationModel = new CompilationModel();
+        let compilationList = await compilationModel.getCompilationList({_id: 1, name: 1});
+        compilationList.unshift({_id: 'all', name: '所有'});
+        let activeCompilation = compilationList.find(compilation => compilation._id.toString() === request.query.filter);
+        if (activeCompilation) {
+            activeCompilation.active = 'active';
+        } else {
+            compilationList[0].active = 'active'
+        }
+        let filter = request.query.filter ? {compilationId: request.query.filter} : {};
+        let calcProgramLibs = await calcProgramFacade.findByCondition(filter, {templates: 0}, false);
         let randerData = {
             title: '计算程序模板库',
             userAccount: request.session.managerData.username,
             userID: request.session.managerData.userID,
             calcProgramLibs: calcProgramLibs,
+            compilationList: compilationList,
             layout: 'maintain/common/html/layout'
         };
         response.render("maintain/calc_program_lib/html/main", randerData);

+ 13 - 1
modules/fee_rate_lib/controllers/fee_rate_controller.js

@@ -4,15 +4,27 @@
 import BaseController from "../../common/base/base_controller";
 let config = require("../../../config/config.js");
 import feeRateFacade from "../facade/fee_rate_facade";
+import CompilationModel from '../../users/models/compilation_model';
 
 class FeeRateController extends BaseController{
     async main(request, response) {
-        let feeRateLibs = await feeRateFacade.findByCondition({},{rates:0},false);
+        let compilationModel = new CompilationModel();
+        let compilationList = await compilationModel.getCompilationList({_id: 1, name: 1});
+        compilationList.unshift({_id: 'all', name: '所有'});
+        let activeCompilation = compilationList.find(compilation => compilation._id.toString() === request.query.filter);
+        if (activeCompilation) {
+            activeCompilation.active = 'active';
+        } else {
+            compilationList[0].active = 'active'
+        }
+        let filter = request.query.filter ? {compilationId: request.query.filter} : {};
+        let feeRateLibs = await feeRateFacade.findByCondition(filter,{rates:0},false);
         let randerData = {
             title:'费率标准库',
             userAccount: request.session.managerData.username,
             userID: request.session.managerData.userID,
             feeRateLibs:feeRateLibs,
+            compilationList: compilationList,
             layout: 'maintain/common/html/layout'
         };
         response.render("maintain/fee_rate_lib/html/main", randerData);

+ 1 - 1
modules/ration_repository/controllers/ration_repository_controller.js

@@ -102,7 +102,7 @@ class RationRepositoryController extends baseController {
         });
     }
 
-    getDisPlayRationLibs(req, res) {
+    async getDisPlayRationLibs(req, res) {
         rationRepository.getDisplayRationLibs(function (err, data) {
             if (data) {
                 callback(req, res, err, "has data", data);

+ 18 - 1
modules/ration_repository/controllers/repository_views_controller.js

@@ -2,15 +2,32 @@
  * Created by Zhong on 2017/8/3.
  */
 import BaseController from "../../common/base/base_controller";
+import CompilationModel from '../../users/models/compilation_model';
 let config = require("../../../config/config.js");
 import mongoose from 'mongoose';
 const compilationModel = mongoose.model('compilation');
 const rationLibModel = mongoose.model('std_ration_lib_map');
 const fs = require('fs');
 class ViewsController extends BaseController{
-    redirectMain(req, res){
+    async redirectMain(req, res){
+        let filter = req.query.filter ? {compilationId: req.query.filter} : null;
+        let allLibs = await rationLibModel.find({}, {_id: 0, recentOpr: 0}),
+            rationLibs = allLibs.filter(lib => filter && lib.compilationId === filter.compilationId || !filter),
+            allNames = allLibs.map(lib => lib.dispName);
+        let compilationModel = new CompilationModel();
+        let compilationList = await compilationModel.getCompilationList({_id: 1, name: 1});
+        compilationList.unshift({_id: 'all', name: '所有'});
+        let activeCompilation = compilationList.find(compilation => compilation._id.toString() === req.query.filter);
+        if (activeCompilation) {
+            activeCompilation.active = 'active';
+        } else {
+            compilationList[0].active = 'active'
+        }
         res.render('maintain/ration_repository/main.html',
             {
+                allNames: allNames,
+                rationLibs: rationLibs,
+                compilationList: compilationList,
                 userAccount: req.session.managerData.username,
                 userID: req.session.managerData.userID
             });

+ 3 - 2
modules/ration_repository/models/repository_map.js

@@ -18,6 +18,7 @@ const engLibModel = mongoose.model('engineering_lib');
 function createNewLibModel(rationLibObj){
     var rst = {};
     rst.dispName = rationLibObj.dispName;
+    rst.libCode = rationLibObj.libCode;
     rst.appType = rationLibObj.appType?rationLibObj.appType:'construct';
     rst.compilationId = rationLibObj.compilationId;
     rst.compilationName = rationLibObj.compilationName;
@@ -176,7 +177,7 @@ rationRepositoryDao.prototype.getRationLib = function(libId, callback) {
 };
 
 rationRepositoryDao.prototype.getDisplayRationLibs = function(callback) {
-    rationRepository.find({"deleted": false}, function(err, data){
+    rationRepository.find(filter, function(err, data){
         if (err) {
             callback( 'Error', null);
         } else {
@@ -186,7 +187,7 @@ rationRepositoryDao.prototype.getDisplayRationLibs = function(callback) {
 };
 
 rationRepositoryDao.prototype.updateName = function(oprtor, renameObj, callback){
-    rationRepository.update({ID: renameObj.ID, deleted: false}, {$set: {dispName: renameObj.newName}}, function (err) {
+    rationRepository.update({ID: renameObj.ID, deleted: false}, {$set: {dispName: renameObj.newName, libCode: renameObj.newLibCode}}, function (err) {
         if(err){
             callback(err, '重命名失败!');
         }

+ 50 - 0
modules/sys_tools/controllers/sys_controller.js

@@ -8,12 +8,16 @@
  * @version
  */
 
+import fs from 'fs';
+import path from 'path';
+import multiparty from 'multiparty';
 import BaseController from "../../common/base/base_controller";
 //import sysSchedule from '../models/sys_model';
 let sysSchedule = require('../models/sys_model');
 let callback = function(req, res, err, message, data){
     res.json({error: err, message: message, data: data});
 };
+const shareDir = 'public/share/';
 class SysTools extends BaseController{
     clearJunkData(req, res){
         sysSchedule.clearJunkData(function (err) {
@@ -38,6 +42,52 @@ class SysTools extends BaseController{
             callback(req, res, errCode, msg, null);
         });
     }
+
+    //上传文件:用户手册、升级说明pdf文件
+    /*
+     * 这两个文件在前台帮助下拉中使用,与产品绑定,即一个养护产品(重庆养护、浙江xx...)只有一份文件
+     * 所以保存到的文件夹直接分为两个:userGuide和upgradeGuide,前台到对应文件夹直接获取文件
+     * */
+    async uploadFile(req, res) {
+        const validTrigger = {
+            userGuide: 'userGuide', //用户手册
+            upgradeGuide: 'upgradeGuide' //升级说明
+        };
+        let uploadDir = path.join(req.app.locals.rootDir, shareDir);
+        let form = new multiparty.Form({uploadDir: uploadDir});
+        form.parse(req, async function(err, fields, files){
+            try {
+                const file = typeof files.file !== 'undefined' ? files.file[0] : null;
+                if(err || !file) {
+                    throw '上传失败';
+                }
+                //文件类型
+                const trigger = typeof fields.trigger !== 'undefined' && fields.trigger.length > 0 ? fields.trigger[0] : null;
+                if (!trigger || !trigger in validTrigger) {
+                    throw '该操作没有上传权限'
+                }
+                if (!fs.existsSync(uploadDir)) {
+                    fs.mkdirSync(uploadDir);
+                }
+                //根据触发源放置文件到相关文件夹
+                let triggerPath = path.join(uploadDir, trigger);
+                if (!fs.existsSync(triggerPath)) {
+                    fs.mkdirSync(triggerPath);
+                }
+                //文件后缀
+                let px = file.originalFilename.split('.').pop();
+                //重命名
+                let newFileName = trigger + '.' + px;
+                let newPath = path.join(triggerPath, newFileName);
+                fs.renameSync(file.path, newPath);
+                //返回图片域名后的url
+                res.json({error: 0, data: `${shareDir}/${trigger}/${newFileName}`, message: 'success'});
+            } catch (err) {
+                console.log(err);
+                res.json({error: 1, data: null, message: err});
+            }
+        });
+    }
 }
 
 export {SysTools as default};

+ 2 - 0
modules/sys_tools/routes/routes.js

@@ -17,6 +17,8 @@ module.exports = function (app) {
     router.post('/clearJunkData', sysToolsController.auth, sysToolsController.init, sysToolsController.clearJunkData);
     router.post('/clearFakeData', sysToolsController.auth, sysToolsController.init, sysToolsController.clearFakeData);
 
+    router.post('/uploadUserGuide', sysToolsController.auth, sysToolsController.init, sysToolsController.uploadFile);
+
     app.use("/sysTools/api", router);
 
 };

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

@@ -22,6 +22,7 @@ const billsGuidanceFc = require('../../std_billsGuidance_lib/facade/facades');
 import mainColFacade from "../../main_col_lib/facade/main_col_facade";
 import billTemplateFacade from "../../bills_template_lib/facade/bills_template_facade";
 import projectFeatureFacade from "../../project_feature_lib/facade/project_feature_facade";
+import basicInfoFacade from "../../basic_info_lib/facade/basic_info_facade";
 import {default as category, List as categoryList} from "../../common/const/category_const.js";
 let config = require("../../../config/config.js");
 const fs = require('fs');
@@ -180,7 +181,7 @@ class CompilationController extends BaseController {
         let section = request.params.section;
         let selectedCompilation = request.session.selectedCompilation;
 
-        let compilationList = [],billList = [], rationList = [], gljList = [],feeRateList = [], libData = {}, billsTemplateData = [],featureList = [];
+        let compilationList = [],billList = [], rationList = [], gljList = [],feeRateList = [], libData = {}, billsTemplateData = [],featureList = [],infoList = [];
         let valuationData = {}, valuationList = {}, artificialCoefficientList = [], calculationList = [], billsGuidanceList = [], mainTreeColList = [];
         let billTemplateList = [];
         try {
@@ -237,6 +238,9 @@ class CompilationController extends BaseController {
             //获取工程特征库
             featureList = await projectFeatureFacade.findByCondition({},null,false);
 
+            //获取基本信息库
+            infoList = await basicInfoFacade.findByCondition({},null,false);
+
         } catch (error) {
             console.log(error);
         }
@@ -262,6 +266,7 @@ class CompilationController extends BaseController {
             calculationList: JSON.stringify(calculationList),
             billsGuidanceList: JSON.stringify(billsGuidanceList),
             featureList:JSON.stringify(featureList),
+            infoList: JSON.stringify(infoList),
             layout: 'users/views/layout/layout',
             LicenseKey:config.getLicenseKey(process.env.NODE_ENV)
         };

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

@@ -181,6 +181,9 @@ class EngineeringLibModel extends BaseModel {
         //判断工程特征库
         data.feature_lib = this._validLib(data.feature_lib);
 
+        //判断基本信息
+        data.info_lib = this._validLib(data.info_lib);
+
         //计税方式组合
         data.tax_group = this._validLib(data.tax_group);
 

+ 37 - 0
web/maintain/basic_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="basicInfoList" rows="38"></textarea>
+        </div>
+        </div>
+        <input type="hidden" id="libID" value="<%= libID %>">
+        <input type="hidden" id="originalInfo" value="<%= basicInfoList %>">
+    </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/basic_info_lib/js/basic_info_edit.js"></script>

+ 108 - 0
web/maintain/basic_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 basicInfoLibs){ %>
+                            <tr class="libTr">
+                                <td id="<%= lib.ID%>"><a href="/basicInfo/edit/<%= lib.ID%>"><%= lib.name%></a></td>
+                                <td><%= moment(lib.createDate).format('YYYY-MM-DD')%></td>
+                                <td>
+                                    <a style="color: #0275d8" onclick='getBasicInfoLib("<%= 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="/basicInfo/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/basic_info_lib/js/basic_info.js"></script>

+ 76 - 0
web/maintain/basic_info_lib/js/basic_info.js

@@ -0,0 +1,76 @@
+/**
+ * Created by zhang on 2018/9/3.
+ */
+$(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("/basicInfo/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("/basicInfo/deleteLibByID",{ID:libID});
+                    if(result.ok){
+                        $("#"+libID).parent(".libTr").remove();
+                    }
+                    $("#del").modal('hide');
+                }catch (err){
+                    console.log(err);
+                }
+            }
+        }
+    });
+});
+
+async function getBasicInfoLib (ID) {
+    try {
+        let lib = await ajaxPost("/basicInfo/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});
+}

+ 102 - 0
web/maintain/basic_info_lib/js/basic_info_edit.js

@@ -0,0 +1,102 @@
+/**
+ * Created by zhang on 2018/9/3.
+ */
+
+$(document).ready(function () {
+    try {
+        let tem = sortJson(JSON.parse($("#originalInfo").val()), compareInfo);
+        $("#basicInfoList").val(JSON.stringify(tem,null,4));
+    }catch (err){
+        console.log(err);
+    }
+
+   $("#format").click( function() {
+       try {
+           let jsonText =  $("#basicInfoList").val();
+           $("#basicInfoList").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 =  $("#basicInfoList").val();
+            if(jsonText.indexOf("'")!=-1){
+                alert("输入的格式不能包含 ' 位于:"+jsonText.substr(jsonText.indexOf("'")-15,18));
+                return;
+            }
+            await ajaxPost("/basicInfo/saveLib",{query:{ID:libID},data:{info:JSON.parse(jsonText)}});
+            $.bootstrapLoading.end();
+        }catch (err){
+            $.bootstrapLoading.end();
+            console.log(err);
+            alert("保存失败,请查看输入数据");
+        }
+    });
+    $("#createNormal").click(async function() {
+        let basicInfo = [
+            {dispName: '基本信息', key: 'basicInfo', readOnly: true, items: [
+                {dispName: '合同号', key: 'contractNum', value: ''},
+                {dispName: '建设地点', key: 'constructionPlace', value: ''},
+                {dispName: '质量标准', key: 'qualityStandard', value: ''},
+                {dispName: '工程类别', key: 'projectCategory', value: ''},
+                {dispName: '建设日期', key: 'constructionDate', cellType: 'date', value: ''},
+                {dispName: '工程规模', key: 'projectScale', value: ''},
+                {dispName: '总建筑面积(m2)', key: 'grossArea', cellType: 'number', value: ''},
+                {dispName: '建设单位', key: 'constructionUnit', value: ''},
+                {dispName: '设计单位', key: 'designUnit', value: ''},
+                {dispName: '施工单位', key: 'buildingUnit', value: ''},
+                {dispName: '监理单位', key: 'supervisingUnit', value: ''},
+                {dispName: '审核单位', key: 'auditUnit', value: ''},
+                {dispName: '建设单位审核人', key: 'constructionUnitAudit', value: ''},
+                {dispName: '设计单位负责人', key: 'designUnitPrincipal', value: ''},
+                {dispName: '施工单位编制人', key: 'buildingUnitAuthor', value: ''},
+                {dispName: '监理单位审核人', key: 'supervisingUnitAuditor', value: ''},
+                {dispName: '审核单位审核人', key: 'auditUnitAuditor', value: ''},
+                {dispName: '编制时间', key: 'establishDate', cellType: 'date', value: ''}
+            ]},
+            {dispName: '招标信息', key: 'biddingInfo', readOnly: true, items: [
+                {dispName: '招标人', key: 'bidInviter', value: ''},
+                {dispName: '法定代表人或其他授权人', key: 'representative', value: ''},
+                {dispName: '造价工程师', key: 'costEngineer', value: ''}
+            ]},
+            {dispName: '投标信息', key: 'bidInfo', readOnly: true, items: [
+                {dispName: '投标人', key: 'bidder', value: ''},
+                {dispName: '法定代表人或其授权人', key: 'representative', value: ''},
+                {dispName: '造价工程师', key: 'costEngineer', value: ''}
+            ]},
+            {dispName: '工程造价咨询信息', key: 'engineeringCostConsultationInfo', readOnly: true, items: [
+                {dispName: '工程造价咨询人', key: 'consultant', value: ''},
+                {dispName: '法定代表人或其授权人', key: 'representative', value: ''},
+                {dispName: '造价工程师', key: 'costEngineer', value: ''}
+            ]}
+        ];
+        try {
+            let jsonText =  JSON.stringify(basicInfo);
+            $("#basicInfoList").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;
+}

+ 14 - 0
web/maintain/bill_template_lib/html/main.html

@@ -2,6 +2,20 @@
     <div class="content">
         <div class="container-fluid">
             <div class="row">
+                <div class="col-md-2">
+                    <div class="list-group mt-3">
+                        <% for (let compilation of compilationList) { %>
+                        <% if (compilation._id === 'all') { %>
+                        <a href="/billsTemplate/main" class="list-group-item list-group-item-action <%= compilation.active %>">
+                            所有
+                        </a>
+                        <% } else { %>
+                        <a id="<%= compilation._id %>" href="/billsTemplate/main/?filter=<%= compilation._id %>" class="list-group-item list-group-item-action <%= compilation.active %>">
+                            <%= compilation.name %>
+                        </a>
+                        <% }} %>
+                    </div>
+                </div>
                 <div class="col-md-8">
                     <div class="warp-p2 mt-3">
                         <table class="table table-hover table-bordered">

+ 14 - 0
web/maintain/calc_program_lib/html/main.html

@@ -2,6 +2,20 @@
     <div class="content">
         <div class="container-fluid">
             <div class="row">
+                <div class="col-md-2">
+                    <div class="list-group mt-3">
+                        <% for (let compilation of compilationList) { %>
+                        <% if (compilation._id === 'all') { %>
+                        <a href="/calcProgram/main" class="list-group-item list-group-item-action <%= compilation.active %>">
+                            所有
+                        </a>
+                        <% } else { %>
+                        <a id="<%= compilation._id %>" href="/calcProgram/main/?filter=<%= compilation._id %>" class="list-group-item list-group-item-action <%= compilation.active %>">
+                            <%= compilation.name %>
+                        </a>
+                        <% }} %>
+                    </div>
+                </div>
                 <div class="col-md-8">
                     <div class="warp-p2 mt-3">
                         <table class="table table-hover table-bordered">

+ 8 - 4
web/maintain/common/js/util.js

@@ -19,13 +19,13 @@ async function initCompilationSelect() {
 }
 
 //对JSON对象排序,按属性key的顺序显示
-function sortJson(obj) {
+function sortJson(obj, compare) {
     if(obj === null){
         return null;
     }
     if(obj instanceof Array){
         for(let o in obj){
-            obj[o] = sortJson(obj[o]);
+            obj[o] = sortJson(obj[o], compare);
         }
         return obj;
     }else if(typeof obj == 'object'){
@@ -34,9 +34,13 @@ function sortJson(obj) {
         for(let key in obj){
             arr.push(key);
         }
-        arr.sort();
+        if (compare) {
+            arr.sort(compare);
+        } else {
+            arr.sort();
+        }
         for(let a of arr){
-            newOjb[a]= sortJson(obj[a]);
+            newOjb[a]= sortJson(obj[a], compare);
         }
         return newOjb;
     }else {

+ 14 - 0
web/maintain/fee_rate_lib/html/main.html

@@ -2,6 +2,20 @@
     <div class="content">
         <div class="container-fluid">
             <div class="row">
+                <div class="col-md-2">
+                <div class="list-group mt-3">
+                    <% for (let compilation of compilationList) { %>
+                    <% if (compilation._id === 'all') { %>
+                    <a href="/feeRate/main" class="list-group-item list-group-item-action <%= compilation.active %>">
+                        所有
+                    </a>
+                    <% } else { %>
+                    <a id="<%= compilation._id %>" href="/feeRate/main?filter=<%= compilation._id %>" class="list-group-item list-group-item-action <%= compilation.active %>">
+                        <%= compilation.name %>
+                    </a>
+                    <% }} %>
+                </div>
+            </div>
                 <div class="col-md-8">
                     <div class="warp-p2 mt-3">
                         <table class="table table-hover table-bordered">

+ 132 - 189
web/maintain/ration_repository/js/main.js

@@ -3,7 +3,6 @@
  */
 
 $(function () {
-    let dispNameArr;
     let preDeleteId = null;
     let deleteCount = 0;
     let selCompilationId,
@@ -11,121 +10,125 @@ $(function () {
     $('#del').on('hidden.bs.modal', function () {
         deleteCount = 0;
     });
-    getAllRationLib(function (dispNames) {
-        dispNameArr = dispNames;
-        //添加
-        $('#addBtn').click(function () {
-            let compilationName = $('#compilationSels option:selected').text();
-            let compilationId = $('#compilationSels option:selected').val();
-            let gljLibName = $('#gljLibSels option:selected').text();
-            let gljLibId = $('#gljLibSels option:selected').val();
-            let libName = $('#libNameTxt').val();
-            if(libName.trim().length === 0){
-                alert('名称不可为空!');
-                $('#libNameTxt').val('')
-            }
-            else if(dispNames.indexOf(libName) !== -1){
-                alert('此定额库已存在!');
-                $('#libNameTxt').val('')
-            }
-            else if(compilationName.trim().length === 0){
-                alert('编办不可为空!');
-            }
-            else if(gljLibName.trim().length === 0){
-                alert("请选择工料机库!");
-            }
-            else{
-                let newRationLib = {};
-                newRationLib.dispName = libName;
-                newRationLib.compilationId = compilationId;
-                newRationLib.compilationName = compilationName;
-                newRationLib.gljLib = gljLibId;
-                newRationLib.creator = userAccount;
-                newRationLib.appType = "建筑";
-                $('#libNameTxt').val('');
-                createRationLib(newRationLib, dispNameArr);
-            }
-        });
-        //重命名
-        $("#showArea").on("click", "[data-target = '#edit']", function(){
-            let renameId = $(this).parent().parent().attr("id");
-            $('#renameText').val($(this).parent().parent().find('td:first-child').text());
-            $("#renameA").attr("renameId", renameId);
-        });
-        $("#renameA").click(function(){
-            let newName = $("#renameText").val();
-            let libId = $(this).attr("renameId");
-            let jqSel = "#" + libId + " td:first" + " a";
-            let orgName = $(jqSel).text();
-            if(newName.trim().length === 0){
-                alert("名称不可为空!");
-                $("#renameText").val('');
-            }
-            else if(dispNameArr.indexOf(newName) !== -1){
-                alert("该定额库已存在!");
-                $("#renameText").val('');
-            }
-            else{
-                renameRationLib({ID: libId, newName: newName, orgName: orgName}, dispNameArr);
-            }
-        });
-        $('#edit').on('shown.bs.modal', function () {
-            setTimeout(function () {
-                $('#renameText').focus();
-            }, 100);
-        });
-
-        $('#add').on('shown.bs.modal', function () {
-            setTimeout(function () {
-                $('#libNameTxt').focus();
-            }, 100);
-        });
-        $('#add').on('hidden.bs.modal', function () {
+    //添加
+    $('#addBtn').click(function () {
+        let compilationName = $('#compilationSels option:selected').text();
+        let compilationId = $('#compilationSels option:selected').val();
+        let gljLibName = $('#gljLibSels option:selected').text();
+        let gljLibId = $('#gljLibSels option:selected').val();
+        let libName = $('#libNameTxt').val();
+        let libCode = $('#libCode').val().trim();
+        if(libName.trim().length === 0){
+            alert('名称不可为空!');
+            $('#libNameTxt').val('')
+        } else if (!libCode) {
+            alert('定额编号不可为空');
+            $('#libCode').val('');
+        } else if(allNames.indexOf(libName) !== -1){
+            alert('此定额库已存在!');
+            $('#libNameTxt').val('')
+        } else if(compilationName.trim().length === 0){
+            alert('编办不可为空!');
+        } else if(gljLibName.trim().length === 0){
+            alert("请选择工料机库!");
+        } else{
+            let newRationLib = {};
+            newRationLib.dispName = libName;
+            newRationLib.libCode = libCode; //定额编号,标准数据导出xml需要
+            newRationLib.compilationId = compilationId;
+            newRationLib.compilationName = compilationName;
+            newRationLib.gljLib = gljLibId;
+            newRationLib.creator = userAccount;
+            newRationLib.appType = "建筑";
             $('#libNameTxt').val('');
+            createRationLib(newRationLib);
+        }
+    });
+    //重命名
+    $("#showArea").on("click", "[data-target = '#edit']", function(){
+        let renameId = $(this).parent().parent().attr("id");
+        $('#renameText').val($(this).parent().parent().find('td:first-child').text());
+        $('#renameCode').val($(this).parent().parent().find('td:eq(1)').text());
+        $("#renameA").attr("renameId", renameId);
+    });
+    $("#renameA").click(function(){
+        let newName = $("#renameText").val();
+        let newLibCode = $('#renameCode').val().trim();
+        let libId = $(this).attr("renameId");
+        let jqSel = "#" + libId + " td:first" + " a";
+        let orgName = $(jqSel).text();
+        let filterName = allNames.filter(function (v) {
+            return v === newName;
         });
-        //删除
-        $("#showArea").on("click", "[data-target = '#del']", function(){
-            let deleteId = $(this).parent().parent().attr("id");
-            $("#deleteA").attr("deleteId", deleteId);
-            let delLibName = $(`#${deleteId}`).find('td:first').text();
-            $('#del').find('.modal-body h5').text(`准备删除 “${delLibName}”,会导致已引用此库的地方出错,确定要删除吗?`);
-        });
-        $("#deleteA").click(function(){
-            let deleteId = $(this).attr("deleteId");
-            if(preDeleteId && preDeleteId !== deleteId){
-                deleteCount = 0;
-            }
-            preDeleteId = deleteId;
-            deleteCount++;
-            let jqSel = "#" + deleteId + " td:first" + " a";
-            let libName = $(jqSel).text();
-            if(deleteCount === 3){
-                deleteCount = 0;
-                removeRationLib({libId: deleteId, libName: libName}, dispNameArr);
-                $('#del').modal('hide');
-            }
-        });
-        //全部计算
-        $("#showArea").on("click", "[data-target = '#reCalcAll']", function(){
-            let recalcId = $(this).parent().parent().attr("id");
-            $("#reCalcConfirm").attr("recalcId", recalcId);
-        });
-        $("#reCalcConfirm").click(function(){
-            $('#reCalcConfirm').addClass('disabled');
-            $.bootstrapLoading.start();
-            let recalcId = $(this).attr("recalcId");
-            CommonAjax.post('/rationRepository/api/reCalcAll', {rationRepId: recalcId}, function (rstData) {
-                $.bootstrapLoading.end();
-                $('#reCalcAll').modal('hide');
-                $('#reCalcConfirm').removeClass('disabled');
-            }, function () {
-                $.bootstrapLoading.end();
-                $('#reCalcAll').modal('hide');
-                $('#reCalcConfirm').removeClass('disabled')
-            });
-        });
+        if(newName.trim().length === 0){
+            alert("名称不可为空!");
+            $("#renameText").val('');
+        } else if (!newLibCode) {
+            alert('定额编号不可为空!');
+            $('#renameCode').val('');
+        } else if(filterName.length > 0 && newName !== orgName){
+            alert("该定额库已存在!");
+            $("#renameText").val('');
+        } else{
+            renameRationLib({ID: libId, newName: newName, orgName: orgName, newLibCode: newLibCode});
+        }
+    });
+    $('#edit').on('shown.bs.modal', function () {
+        setTimeout(function () {
+            $('#renameText').focus();
+        }, 100);
+    });
 
+    $('#add').on('shown.bs.modal', function () {
+        setTimeout(function () {
+            $('#libNameTxt').focus();
+        }, 100);
+    });
+    $('#add').on('hidden.bs.modal', function () {
+        $('#libNameTxt').val('');
+    });
+    //删除
+    $("#showArea").on("click", "[data-target = '#del']", function(){
+        let deleteId = $(this).parent().parent().attr("id");
+        $("#deleteA").attr("deleteId", deleteId);
+        let delLibName = $(`#${deleteId}`).find('td:first').text();
+        $('#del').find('.modal-body h5').text(`准备删除 “${delLibName}”,会导致已引用此库的地方出错,确定要删除吗?`);
+    });
+    $("#deleteA").click(function(){
+        let deleteId = $(this).attr("deleteId");
+        if(preDeleteId && preDeleteId !== deleteId){
+            deleteCount = 0;
+        }
+        preDeleteId = deleteId;
+        deleteCount++;
+        let jqSel = "#" + deleteId + " td:first" + " a";
+        let libName = $(jqSel).text();
+        if(deleteCount === 3){
+            deleteCount = 0;
+            removeRationLib({libId: deleteId, libName: libName});
+            $('#del').modal('hide');
+        }
+    });
+    //全部计算
+    $("#showArea").on("click", "[data-target = '#reCalcAll']", function(){
+        let recalcId = $(this).parent().parent().attr("id");
+        $("#reCalcConfirm").attr("recalcId", recalcId);
+    });
+    $("#reCalcConfirm").click(function(){
+        $('#reCalcConfirm').addClass('disabled');
+        $.bootstrapLoading.start();
+        let recalcId = $(this).attr("recalcId");
+        CommonAjax.post('/rationRepository/api/reCalcAll', {rationRepId: recalcId}, function (rstData) {
+            $.bootstrapLoading.end();
+            $('#reCalcAll').modal('hide');
+            $('#reCalcConfirm').removeClass('disabled');
+        }, function () {
+            $.bootstrapLoading.end();
+            $('#reCalcAll').modal('hide');
+            $('#reCalcConfirm').removeClass('disabled')
+        });
     });
+
     getCompilationList(function (data) {
         compilationsArr = data.compilation;
     });
@@ -240,7 +243,7 @@ $(function () {
     });
     $('#compilations').change(function () {
         selCompilationId = $(this).select().val();
-        CommonAjax.get(`api/sectionTemplateCount/${selCompilationId}`, function (rstData) {
+        CommonAjax.get(`/rationRepository/api/sectionTemplateCount/${selCompilationId}`, function (rstData) {
             rstData.data.count > 0 ?
                 $('#templateText').text('该费用定额下已有定额章节树模板数据,是否确认覆盖数据?') :
                 $('#templateText').text('确认是否将此库的章节树设置成该费用定额下补充定额章节树模板?');
@@ -252,7 +255,7 @@ $(function () {
             return false;
         }
         $.bootstrapLoading.start();
-        CommonAjax.post('api/initSectionTemplate', {rationLibId: rationRepId, compilationId: selCompilationId}, function () {
+        CommonAjax.post('/rationRepository/api/initSectionTemplate', {rationLibId: rationRepId, compilationId: selCompilationId}, function () {
             $.bootstrapLoading.end();
             $('#template').modal('hide');
         }, function () {
@@ -262,48 +265,10 @@ $(function () {
     });
 });
 
-function getAllRationLib(callback){
-    $.ajax({
-        type: 'post',
-        url: 'api/getRationDisplayNames',
-        dataType: 'json',
-        success: function (result) {
-            let dispNames = [];
-            if(result.data.length > 0){
-                for(let i = 0; i < result.data.length; i++){
-                    storageUtil.setSessionCache("RationGrp","repositoryID_" + result.data[i].ID, result.data[i].dispName);
-                    if(result.data[i].gljLib){
-                        storageUtil.setSessionCache("gljLib","repositoryID_" + result.data[i].ID, result.data[i].gljLib);
-                    }
-                    let id = result.data[i].ID;
-                    let libName = result.data[i].dispName;
-                    let createDate = result.data[i].createDate.split(' ')[0];
-                    let compilationName = result.data[i].compilationName;
-                    dispNames.push(result.data[i].dispName);
-                    $("#showArea").append(
-                        "<tr id='"+id+"'>" +
-                        "<td><a href='/rationRepository/ration?repository=" + id +"'>"+libName+"</a></td>" +
-                        "<td>"+compilationName+" </td>" +
-                        "<td>"+createDate+" </td>" +
-                        "<td><a href='javascript:void(0);' data-toggle='modal' data-target='#edit' title='编辑'>" +
-                        "<i class='fa fa-pencil-square-o'></i></a> <a href='javascript:void(0);' data-toggle='modal' data-target='#del' class='text-danger' title='删除'>" +
-                        "<i class='fa fa-remove'></i></a>" +
-                        " <a href='javascript:void(0);' data-toggle='modal' data-target='#reCalcAll' title='全部计算'><i class='fa fa-calculator'></i></a></td>"+
-                        "<td><a class='btn btn-secondary btn-sm import-source' href='javacript:void(0);' data-id='"+ id +"' title='导入原始数据'><i class='fa fa-sign-in fa-rotate-90'></i>导入</a></td>" +
-                        "<td><a class='btn btn-success btn-sm export' href='javacript:void(0);' data-toggle='modal' data-id='"+ id +"' data-target='#emport' title='导出内部数据'><i class='fa fa-sign-out fa-rotate-270'></i>导出</a> " +
-                        "<a class='btn btn-secondary btn-sm import-data' href='javacript:void(0);' data-id='"+ id +"' title='导入内部数据'><i class='fa fa-sign-in fa-rotate-90'></i>导入</a></td>" +
-                        "<td><a class='btn btn-secondary btn-sm set-comple' href='javacript:void(0);' data-id='"+ id +"' title='将章节树设为补充模板数据'><i class='fa fa-sign-in fa-rotate-90'></i>设置</a></td>" +
-                        "</tr>");
-                }
-            }
-            callback(dispNames);
-        }
-    });
-}
 function getCompilationList(callback){
     $.ajax({
         type: 'post',
-        url: 'api/getCompilationList',
+        url: '/rationRepository/api/getCompilationList',
         dataType: 'json',
         success: function (result) {
             //addoptions
@@ -350,74 +315,52 @@ function getGljLibOps(compilationId, gljLibs){
     return rst;
 }
 
-function createRationLib(rationObj, dispNamesArr){
+function createRationLib(rationObj){
     $.ajax({
         type: 'post',
-        url: 'api/addRationRepository',
+        url: '/rationRepository/api/addRationRepository',
         data: {rationRepObj: JSON.stringify(rationObj)},
         dataType: 'json',
         success: function (result) {
-            if(result.data){
-                storageUtil.setSessionCache("RationGrp","repositoryID_" + result.data.ID, result.data.dispName);
-                if(result.data.gljLib){
-                    storageUtil.setSessionCache("gljLib","repositoryID_" + result.data.ID, result.data.gljLib);
-                }
-                let id = result.data.ID;
-                let libName = result.data.dispName;
-                let createDate = result.data.createDate.split(' ')[0];
-                let compilationName = result.data.compilationName;
-                dispNamesArr.push(libName);
-                $("#showArea").append(
-                    "<tr id='"+id+"'>" +
-                    "<td><a href='/rationRepository/ration?repository=" + id +"'>"+libName+"</a></td>" +
-                    "<td>"+compilationName+" </td>" +
-                    "<td>"+createDate+" </td>" +
-                    "<td><a href='javascript:void(0);' data-toggle='modal' data-target='#edit' title='编辑'>" +
-                    "<i class='fa fa-pencil-square-o'></i></a> <a href='javascript:void(0);' data-toggle='modal' data-target='#del' class='text-danger' title='删除'>" +
-                    "<i class='fa fa-remove'></i></a>" +
-                    " <a href='javascript:void(0);' data-toggle='modal' data-target='#reCalcAll' title='全部计算'><i class='fa fa-calculator'></i></a>"+
-                    "<td><a class='btn btn-secondary btn-sm import-source' href='javacript:void(0);' data-id='"+ id +"' title='导入原始数据'><i class='fa fa-sign-in fa-rotate-90'></i>导入</a></td>" +
-                    "<td><a class='btn btn-success btn-sm export' href='javacript:void(0);' data-toggle='modal' data-id='"+ id +"' data-target='#emport' title='导出内部数据'><i class='fa fa-sign-out fa-rotate-270'></i>导出</a> " +
-                    "<a class='btn btn-secondary btn-sm import-data' href='javacript:void(0);' data-id='"+ id +"' title='导入内部数据'><i class='fa fa-sign-in fa-rotate-90'></i>导入</a></td>" +
-                    "<td><a class='btn btn-secondary btn-sm set-comple' href='javacript:void(0);' data-id='"+ id +"' title='将章节树设为补充模板数据'><i class='fa fa-sign-in fa-rotate-90'></i>设置</a></td>" +
-                    "</tr>");
-            }
+            window.location.href = location.href;
             $('#cancelBtn').click();
         }
     })
 }
-function renameRationLib(renameObj, dispNames){
+function renameRationLib(renameObj){
     $.ajax({
         type: 'post',
-        url: 'api/editRationLibs',
+        url: '/rationRepository/api/editRationLibs',
         data: {oprtor: userAccount, renameObj: JSON.stringify(renameObj)},
         dataType: 'json',
         success: function (result) {
             if(!result.error){
                 let jqSel = "#" + renameObj.ID + " td:first" + " a";
                 $(jqSel).text(renameObj.newName);
-                let index = dispNames.indexOf(renameObj.orgName);
-                dispNames.splice(index, 1);
-                dispNames.splice(index, 0, renameObj.newName);
+                $(`#${renameObj.ID} td:eq(1)`).text(renameObj.newLibCode);
+                let index = allNames.indexOf(renameObj.orgName);
+                allNames.splice(index, 1);
+                allNames.splice(index, 0, renameObj.newName);
             }
             $('#editCancelBtn').click();
             $('#renameText').val('');
+            $('#renameCode').val('');
         }
     })
 }
-function removeRationLib(delObj, dispNames){
+function removeRationLib(delObj){
     $.bootstrapLoading.start();
     $.ajax({
         type: 'post',
-        url: 'api/deleteRationLibs',
+        url: '/rationRepository/api/deleteRationLibs',
         data: {oprtor: userAccount, libId: delObj.libId},
         dataType: 'json',
         success: function (result) {
             if(!result.error){
                 var jqSel = "#"+ delObj.libId;
                 $(jqSel).remove();
-                let index = dispNames.indexOf(delObj.libName);
-                dispNames.splice(index, 1);
+                let index = allNames.indexOf(delObj.libName);
+                allNames.splice(index, 1);
                 $('#delCancelBtn').click();
             }
             $.bootstrapLoading.end();

+ 49 - 4
web/maintain/ration_repository/main.html

@@ -32,11 +32,47 @@
         <div class="content">
             <div class="container-fluid">
                 <div class="row">
+                    <div class="col-md-2">
+                        <div class="list-group mt-3">
+                            <% for (let compilation of compilationList) { %>
+                            <% if (compilation._id === 'all') { %>
+                            <a href="/rationRepository/main" class="list-group-item list-group-item-action <%= compilation.active %>">
+                                所有
+                            </a>
+                            <% } else { %>
+                            <a id="<%= compilation._id %>" href="/rationRepository/main/?filter=<%= compilation._id %>" class="list-group-item list-group-item-action <%= compilation.active %>">
+                                <%= compilation.name %>
+                            </a>
+                            <% }} %>
+                        </div>
+                    </div>
                   <div class="col-md-8">
                     <div class="warp-p2 mt-3">
                       <table class="table table-hover table-bordered">
-                        <thead><tr><th>定额库名称</th><th width="160">费用定额</th><th width="160">添加时间</th><th width="90">操作</th><th width="90">原始数据</th><th width="150">内部数据</th><th width="90">补充模板</th></tr></thead>
+                        <thead><tr><th>定额库名称</th><th>定额编号</th><th width="160">费用定额</th><th width="160">添加时间</th><th width="90">操作</th><th width="90">原始数据</th><th width="150">内部数据</th><th width="90">补充模板</th></tr></thead>
                         <tbody id="showArea">
+                        <% for(let lib of rationLibs){ %>
+                        <tr id="<%= lib.ID %>">
+                            <td><a href="/rationRepository/ration?repository=<%= lib.ID%>"><%= lib.dispName%></a></td>
+                            <td><%= lib.libCode%></td>
+                            <td><%= lib.compilationName%></td>
+                            <td><%= moment(lib.createDate).format('YYYY-MM-DD')%></td>
+                            <td>
+                                <a href="javacript:void(0);" data-toggle="modal" data-target="#edit" title="编辑"><i class="fa fa-pencil-square-o"></i></a>
+                                <a href="javacript:void(0);" data-toggle="modal" data-target="#del" class="text-danger" title="删除"><i class="fa fa-remove"></i></a>
+                            </td>
+                            <td>
+                                <a class="btn btn-secondary btn-sm import-source" href="javacript:void(0);" data-id="<%= lib.ID %>" title="导入原始数据"><i class="fa fa-sign-in fa-rotate-90"></i>导入</a>
+                            </td>
+                            <td>
+                                <a class="btn btn-success btn-sm export" href="javacript:void(0);" data-toggle="modal" data-id="<%= lib.ID %>" data-target="#emport" title="导出内部数据"><i class="fa fa-sign-out fa-rotate-270"></i>导出</a>
+                                <a class="btn btn-secondary btn-sm import-data" href="javacript:void(0);" data-id="<%= lib.ID %>" title="导入内部数据"><i class="fa fa-sign-in fa-rotate-90"></i>导入</a>
+                            </td>
+                            <td>
+                                <a class="btn btn-secondary btn-sm set-comple" href="javacript:void(0);" data-id="<%= lib.ID %>" title="将章节树设为补充模板数据"><i class="fa fa-sign-in fa-rotate-90"></i>设置</a>
+                            </td>
+                        </tr>
+                        <% } %>
                         </tbody>
                       </table>
                     </div>
@@ -86,6 +122,10 @@
                             <input id="libNameTxt" class="form-control" placeholder="输入定额库名称" type="text">
                         </div>
                         <div class="form-group">
+                            <label>定额编号</label>
+                            <input id="libCode" class="form-control" placeholder="输入定额编号" type="text">
+                        </div>
+                        <div class="form-group">
                             <label>费用定额名称</label>
                             <select id="compilationSels" class="form-control"></select>
                         </div>
@@ -118,6 +158,10 @@
                       <label>定额库名称</label>
                       <input class="form-control" id="renameText" placeholder="输入定额库名称" type="text" value="">
                     </div>
+                      <div class="form-group">
+                          <label>定额编号</label>
+                          <input class="form-control" id="renameCode" placeholder="输入定额编号" type="text" value="">
+                      </div>
                   </form>
                 </div>
                 <div class="modal-footer">
@@ -254,6 +298,10 @@
         </div>
     </div>
     <!-- JS. -->
+    <script type="text/javascript">
+        let allNames = '<%= allNames %>'.split(',');
+        let userAccount = '<%=userAccount %>';
+    </script>
     <script src="/lib/jquery/jquery.min.js"></script>
     <script src="/lib/tether/tether.min.js"></script>
     <script src="/lib/bootstrap/bootstrap.min.js"></script>
@@ -267,8 +315,5 @@
     <script type="text/javascript" src="/web/maintain/ration_repository/js/main.js"></script>
     <script type="text/javascript" src="/public/web/storageUtil.js"></script>
 </body>
-<script type="text/javascript">
-    let userAccount = '<%=userAccount %>';
-</script>
 
 </html>

+ 20 - 1
web/users/js/compilation.js

@@ -241,6 +241,10 @@ $(document).ready(function() {
                 $("#feature-area").show();
                 $("#add-compilation-title").text('添加工程特征');
                 break;
+            case 'info':
+                $('#info-area').show();
+                $('#add-compilation-title').text('添加基本信息');
+                break;
         }
         $("#addcompilation").modal('show');
     });
@@ -257,7 +261,7 @@ $(document).ready(function() {
     });
 
     // 移除操作
-    $(".bill-list, .ration-list, .glj-list, .fee-list, .artificial-list, .program-list, .billsGuidance-list,.feature-list").on("click", ".remove-lib", function() {
+    $(".bill-list, .ration-list, .glj-list, .fee-list, .artificial-list, .program-list, .billsGuidance-list,.feature-list,.info-list").on("click", ".remove-lib", function() {
         $(this).parent().remove();
     });
 
@@ -448,6 +452,7 @@ function initCompilation() {
     let billTemplateData = billTemplateList == undefined ? [] : JSON.parse(billTemplateList);
     let mainTreeColData= mainTreeColList == undefined ? [] : JSON.parse(mainTreeColList);
     let featureData = featureList == undefined?[]: JSON.parse(featureList);
+    let infoData = infoList == undefined ? [] : JSON.parse(infoList);
     /*mainTreeCol = mainTreeCol !== '' ? mainTreeCol.replace(/\n/g, '\\n') : mainTreeCol;
     billsTemplateData = billsTemplateData.replace(/\n/g, '\\n');
 
@@ -546,6 +551,14 @@ function initCompilation() {
         html += tmpHtml;
     }
     $("select[name='feature_lib']").children("option").first().after(html);
+
+    //基本信息库
+    html = '';
+    for(let tmp of infoData){
+        let tmpHtml = '<option value="' + tmp.ID + '">' + tmp.name + '</option>';
+        html += tmpHtml;
+    }
+    $("select[name='info_lib']").children("option").first().after(html);
 }
 
 /**
@@ -564,6 +577,7 @@ function getAndValidData(model) {
     let programLib = $("select[name='program_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 infoLib = $("select[name='info_lib']").children("option:selected").val();
 
 
     if (name === '' && model === 'all') {
@@ -605,6 +619,7 @@ function getAndValidData(model) {
     let programString = $("select[name='program_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 infoString = $("select[name='info_lib']").children("option:selected").text();
 
 
     let result = {
@@ -640,6 +655,10 @@ function getAndValidData(model) {
         feature:{
             id:featureLib,
             name:featrueString
+        },
+        info: {
+            id: infoLib,
+            name: infoString
         }
     };
     return result;

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

@@ -106,6 +106,23 @@
                                 </div>
                                 <a href="#" class="btn btn-link btn-sm add-compilation" data-model="feature">添加</a>
                             </div>
+                            <div class="form-group col-md-3">
+                                <label>基本信息</label>
+                                <div class="info-list">
+                                    <% if (Object.keys(libData).length > 0 && libData.info_lib && libData.info_lib.length > 0) { %>
+                                    <% libData.info_lib.forEach(function (info, index){ %>
+                                    <p class="form-control-static">
+                                        <a class="pull-right text-danger remove-lib" data-model="info" title="移除" data-id="<%= info.id %>">
+                                            <span class="glyphicon glyphicon-remove"></span>
+                                        </a>
+                                        <input type="hidden" name="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="info">添加</a>
+                            </div>
                     </div>
 
                     <div class="col-md-12">
@@ -232,6 +249,7 @@
     let billTemplateList = '<%- billTemplateList %>';
     let mainTreeColList = '<%- mainTreeColList %>';
     let featureList = '<%- featureList %>';
+    let infoList = '<%- infoList %>';
     let colSpread = null;
     let colEditSpread = null;
 </script>

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

@@ -51,6 +51,16 @@
                         </div>
                     </div>
                 </div>
+                <div class="form-group" id="info-area">
+                    <label>基本信息</label>
+                    <div class="row">
+                        <div class="col-xs-12">
+                            <select class="form-control" name="info_lib">
+                                <option value="">请选择基本信息库</option>
+                            </select>
+                        </div>
+                    </div>
+                </div>
                 <div class="form-group" id="artificial-area">
                     <label>人工系数</label>
                     <div class="row">

+ 84 - 0
web/users/views/tool/index.html

@@ -14,6 +14,10 @@
                         <a id="clearJunkBtn" href="javascript:void(0);" class="btn btn-primary pull-right">清除</a>
                         <% } else if (tool.url === '/sysTools/api/clearFakeData' ) { %>
                         <a id="clearFakeBtn" href="javascript:void(0);" class="btn btn-primary pull-right">清除</a>
+                        <% } else if (tool.url === '/sysTools/api/uploadUserGuide' ) { %>
+                        <a id="uploadUserGuide" href="javascript:void(0);" class="btn btn-primary pull-right">上传</a>
+                        <% } else if (tool.url === '/sysTools/api/uploadUpgradeGuide' ) { %>
+                        <a id="uploadUpgradeGuide" href="javascript:void(0);" class="btn btn-primary pull-right">上传</a>
                         <% } else { %>
                         <a id="<%= tool.controller %>" href="<%= tool.url %>" target="_blank" class="btn btn-primary pull-right">进入</a>
                         <% } %>
@@ -156,6 +160,31 @@
         </div>
     </div>
 </div>
+<!--上传pdf-->
+<div class="modal fade" id="upload" data-backdrop="static">
+    <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>请选择pdf格式文件</label>
+                        <input id="upload-file" class="form-control-file" type="file" accept="application/pdf">
+                    </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <a href="javascript:void(0);" class="btn btn-primary" id="uploadConfirm">确定</a>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+            </div>
+        </div>
+    </div>
+</div>
 
 <script type="text/javascript" src="/public/web/common_ajax.js"></script>
 <script type="text/javascript" src="/public/web/PerfectLoad.js"></script>
@@ -223,5 +252,60 @@
                 $.bootstrapLoading.end();
             })
         });
+        let uploadType = {
+                userGuide: 'userGuide',
+                upgradeGuide: 'upgradeGuide'
+            },
+            curTrigger = null;
+        //用户手册
+        $('#uploadUserGuide').click(function () {
+            curTrigger = uploadType.userGuide;
+            $('#upload .modal-title').text('上传用户手册');
+            $('#upload').modal('show');
+        });
+        //升级说明
+        $('#uploadUpgradeGuide').click(function () {
+            curTrigger = uploadType.upgradeGuide;
+            $('#upload .modal-title').text('上传升级说明');
+            $('#upload').modal('show');
+        });
+        $('#upload').on('hide.bs.modal', function () {
+            $('#upload-file').val('');
+        });
+        $('#uploadConfirm').click(function () {
+            let file = $('#upload-file')[0],
+                pdf = file.files[0],
+                trigger = curTrigger;
+            if (!trigger) {
+                alert('无效的操作!(触发器为空)');
+                return;
+            }
+            if (!pdf) {
+                alert('请选择pdf文件!');
+                return;
+            }
+            let formData = new FormData();
+            formData.append('file', pdf);
+            formData.append('trigger', trigger);
+            $.ajax({
+                url: '/sysTools/api/uploadUserGuide',
+                type: 'POST',
+                data: formData,
+                cache: false,
+                contentType: false,
+                processData: false,
+                beforeSend: function() {
+                    $.bootstrapLoading.start();
+                },
+                success: function(response){
+                    $.bootstrapLoading.end();
+                    $('#upload').modal('hide');
+                },
+                error: function(){
+                    alert('上传失败');
+                    $.bootstrapLoading.end();
+                }
+            });
+        });
     });
 </script>