Преглед на файлове

Merge branch 'master' into new-node-version

# Conflicts:
#	modules/bills_lib/controllers/views_permissionController.js
#	modules/bills_lib/routes/bills_lib_routes.js
#	modules/reports/controllers/rpt_tpl_controller.js
#	modules/std_billsGuidance_lib/controllers/viewController.js
#	modules/users/controllers/boot_controller.js
#	modules/users/controllers/user_controller.js
#	modules/users/models/user_model.js
#	package.json
#	socket.js
vian преди 5 години
родител
ревизия
ac3d19ee59
променени са 41 файла, в които са добавени 432 реда и са изтрити 253 реда
  1. 26 4
      config/config.js
  2. 3 1
      config/db/db_manager.js
  3. 2 1
      importserver.js
  4. 2 7
      modules/bills_lib/routes/bills_lib_routes.js
  5. 0 28
      modules/bills_lib/routes/maintain_bills_routes.js
  6. 6 3
      modules/complementary_ration_lib/controllers/compleViewController.js
  7. 2 0
      modules/main/routes/main_route.js
  8. 3 1
      modules/pm/controllers/pm_controller.js
  9. 28 19
      modules/pm/facade/pm_facade.js
  10. 1 1
      modules/pm/models/project_model.js
  11. 6 4
      modules/reports/controllers/rpt_tpl_controller.js
  12. 3 1
      modules/unit_price_file/controllers/unit_price_controller.js
  13. 2 1
      modules/users/controllers/boot_controller.js
  14. 5 2
      modules/users/controllers/login_controller.js
  15. 6 1
      modules/users/controllers/user_controller.js
  16. 4 3
      modules/users/models/user_model.js
  17. 6 3
      package.json
  18. 9 2
      public/common_constants.js
  19. 11 0
      public/common_util.js
  20. 3 1
      public/web/socket/connection.js
  21. 8 2
      server.js
  22. 3 1
      socket.js
  23. 1 1
      web/building_saas/complementary_ration_lib/html/anzhuang.html
  24. 1 1
      web/building_saas/complementary_ration_lib/html/dinge.html
  25. 1 1
      web/building_saas/complementary_ration_lib/html/fuzhu.html
  26. 1 1
      web/building_saas/complementary_ration_lib/html/gongliao.html
  27. 1 1
      web/building_saas/main/html/main.html
  28. 4 1
      web/building_saas/main/js/views/divide_view.js
  29. 4 0
      web/building_saas/main/js/views/project_view.js
  30. 7 4
      web/building_saas/pm/html/project-management.html
  31. 258 145
      web/building_saas/pm/js/pm_newMain.js
  32. 1 1
      web/building_saas/unit_price_file/index.html
  33. 3 0
      web/common/html/header.html
  34. 1 1
      web/users/html/login-infoinput.html
  35. 2 2
      web/users/html/login-sms.html
  36. 2 2
      web/users/html/login-ver.html
  37. 2 2
      web/users/html/login.html
  38. 1 1
      web/users/html/user-buy.html
  39. 1 1
      web/users/html/user-info.html
  40. 1 1
      web/users/html/user-safe.html
  41. 1 1
      web/users/html/user-set.html

Файловите разлики са ограничени, защото са твърде много
+ 26 - 4
config/config.js


+ 3 - 1
config/db/db_manager.js

@@ -48,7 +48,9 @@ module.exports = {
     },
     },
     connect:function (env="local") {
     connect:function (env="local") {
         var config = require("../config.js");
         var config = require("../config.js");
-        var dbURL = 'mongodb://' + config[env].server + ":" + config[env].port + '/yanghu';
+        let dbname = 'yanghu';
+        if(config[env].dbname) dbname = config[env].dbname;
+        var dbURL = 'mongodb://' + config[env].server + ":" + config[env].port + '/'+dbname;
         if(config[env].dbURL){
         if(config[env].dbURL){
             mg.connect(config[env].dbURL,{connectTimeoutMS: 20000,useMongoClient: true});
             mg.connect(config[env].dbURL,{connectTimeoutMS: 20000,useMongoClient: true});
         } else if(config[env].options){
         } else if(config[env].options){

+ 2 - 1
importserver.js

@@ -62,8 +62,9 @@ app.use(function(err, req, res, next) {
 //设置外增的Date对象Format函数
 //设置外增的Date对象Format函数
 //备注: 经过测试nodejs 8.9.3版本不支持eval的方式修改prototype,为兼容考虑,把方法调整到stringUtil文件里
 //备注: 经过测试nodejs 8.9.3版本不支持eval的方式修改prototype,为兼容考虑,把方法调整到stringUtil文件里
 require('./public/stringUtil').setupDateFormat();
 require('./public/stringUtil').setupDateFormat();
+let importPort = config[process.env.NODE_ENV].importPor?config[process.env.NODE_ENV].importPor:2050; 
 
 
-app.listen(2050, function(){
+app.listen(importPort, function(){
     console.log('import server started!');
     console.log('import server started!');
 });
 });
 
 

+ 2 - 7
modules/bills_lib/routes/bills_lib_routes.js

@@ -3,12 +3,11 @@
  */
  */
 let express = require("express");
 let express = require("express");
 let billsRouter =express.Router();
 let billsRouter =express.Router();
-const ViewsPermContr = require("../controllers/views_permissionController");
 const BillsLibPermContr = require("../controllers/stdBillsLib_permissionController");
 const BillsLibPermContr = require("../controllers/stdBillsLib_permissionController");
 const BillsPermContr = require("../controllers/bills_permissionController");
 const BillsPermContr = require("../controllers/bills_permissionController");
 const JobsPermContr = require("../controllers/jobs_permissionController");
 const JobsPermContr = require("../controllers/jobs_permissionController");
 const ItemsPermContr = require("../controllers/items_permissionController");
 const ItemsPermContr = require("../controllers/items_permissionController");
-let viewsContr = new ViewsPermContr();
+
 let billsLibContr = new BillsLibPermContr();
 let billsLibContr = new BillsLibPermContr();
 let billsContr = new BillsPermContr();
 let billsContr = new BillsPermContr();
 let jobsContr = new JobsPermContr();
 let jobsContr = new JobsPermContr();
@@ -16,11 +15,7 @@ let itemsContr = new ItemsPermContr();
 
 
 
 
 module.exports =function (app) {
 module.exports =function (app) {
-    app.get("/stdBillsmain", viewsContr.init, viewsContr.redirectStdBillsMain);
-    app.get("/stdBills", viewsContr.init, viewsContr.redirectStdBills);
-    app.get('/stdJobs', viewsContr.init, viewsContr.redirectStdJobs);
-    app.get('/stdItems', viewsContr.init, viewsContr.redirectStdItems);
-
+  
     billsRouter.post('/getCompilationList', billsLibContr.init, billsLibContr.getCompilationList);
     billsRouter.post('/getCompilationList', billsLibContr.init, billsLibContr.getCompilationList);
     billsRouter.post('/getMaxNumber', billsLibContr.init, billsLibContr.getMaxNumber);
     billsRouter.post('/getMaxNumber', billsLibContr.init, billsLibContr.getMaxNumber);
     billsRouter.post('/getABillsLib', billsLibContr.init, billsLibContr.getABillsLib);
     billsRouter.post('/getABillsLib', billsLibContr.init, billsLibContr.getABillsLib);

+ 0 - 28
modules/bills_lib/routes/maintain_bills_routes.js

@@ -1,28 +0,0 @@
-/**
- * Created by chen on 2017/7/17.
- */
-
-let express = require("express");
-
-
-module.exports = function (app) {
-    app.get("/stdBillsmain", function(req, res){
-        if(!req.session.sessionUser){
-            res.redirect('/login');
-        }
-        else {
-            res.render("maintain/bills_lib/html/main.html",
-                {userAccount: req.session.userAccount,
-                    userID: req.session.sessionUser.id});
-        }
-    });
-    app.get("/stdBills", function(req, res){
-        res.render("maintain/bills_lib/html/qingdan.html");
-    });
-    app.get('/stdJobs', function(req, res){
-        res.render('maintain/bills_lib/html/neirong.html');
-    });
-    app.get('/stdItems', function(req, res){
-        res.render('maintain/bills_lib/html/tezheng.html');
-    });
-};

+ 6 - 3
modules/complementary_ration_lib/controllers/compleViewController.js

@@ -50,7 +50,8 @@ class CompleViewController extends BaseController{
             gljLibId: gljLibId,
             gljLibId: gljLibId,
             compilationName: req.session.sessionCompilation.name,
             compilationName: req.session.sessionCompilation.name,
             versionName: req.session.compilationVersion,
             versionName: req.session.compilationVersion,
-            LicenseKey:config.getLicenseKey(process.env.NODE_ENV)
+            LicenseKey:config.getLicenseKey(process.env.NODE_ENV),
+            title:config[process.env.NODE_ENV].title?config[process.env.NODE_ENV].title:"?????????"
         });
         });
     }
     }
 
 
@@ -79,7 +80,8 @@ class CompleViewController extends BaseController{
             gljLibId: gljLibId,
             gljLibId: gljLibId,
             compilationName: req.session.sessionCompilation.name,
             compilationName: req.session.sessionCompilation.name,
             versionName: req.session.compilationVersion,
             versionName: req.session.compilationVersion,
-            LicenseKey:config.getLicenseKey(process.env.NODE_ENV)
+            LicenseKey:config.getLicenseKey(process.env.NODE_ENV),
+            title:config[process.env.NODE_ENV].title?config[process.env.NODE_ENV].title:"?????????"
         });
         });
     }
     }
 
 
@@ -96,7 +98,8 @@ class CompleViewController extends BaseController{
             gljLibId: gljLibId,
             gljLibId: gljLibId,
             compilationName: req.session.sessionCompilation.name,
             compilationName: req.session.sessionCompilation.name,
             versionName: req.session.compilationVersion,
             versionName: req.session.compilationVersion,
-            LicenseKey:config.getLicenseKey(process.env.NODE_ENV)
+            LicenseKey:config.getLicenseKey(process.env.NODE_ENV),
+            title:config[process.env.NODE_ENV].title?config[process.env.NODE_ENV].title:"?????????"
         });
         });
     }
     }
 
 

+ 2 - 0
modules/main/routes/main_route.js

@@ -43,9 +43,11 @@ module.exports =function (app) {
                         projectReadOnly: projectReadOnly,
                         projectReadOnly: projectReadOnly,
                         projectCooperate: projectCooperate,
                         projectCooperate: projectCooperate,
                         LicenseKey:config.getLicenseKey(process.env.NODE_ENV),
                         LicenseKey:config.getLicenseKey(process.env.NODE_ENV),
+                        socketPort:config[process.env.NODE_ENV].socketPort?config[process.env.NODE_ENV].socketPort:5500,
                         options:JSON.stringify(options),
                         options:JSON.stringify(options),
                         overWriteUrl:req.session.sessionCompilation.overWriteUrl,
                         overWriteUrl:req.session.sessionCompilation.overWriteUrl,
                         markReadProjectIDs: JSON.stringify(markReadProjectIDs),
                         markReadProjectIDs: JSON.stringify(markReadProjectIDs),
+                        title:config[process.env.NODE_ENV].title?config[process.env.NODE_ENV].title:"纵横公路养护云造价",
                         version
                         version
                     });
                     });
             } else {
             } else {

+ 3 - 1
modules/pm/controllers/pm_controller.js

@@ -340,7 +340,9 @@ module.exports = {
             engineeringList: JSON.stringify(engineering.List),
             engineeringList: JSON.stringify(engineering.List),
             compilationName: sessionCompilation.name,
             compilationName: sessionCompilation.name,
             versionName: request.session.compilationVersion,
             versionName: request.session.compilationVersion,
-            LicenseKey:config.getLicenseKey(process.env.NODE_ENV)
+            socketPort:config[process.env.NODE_ENV].socketPort?config[process.env.NODE_ENV].socketPort:5500,
+            LicenseKey:config.getLicenseKey(process.env.NODE_ENV),
+            title:config[process.env.NODE_ENV].title?config[process.env.NODE_ENV].title:"纵横公路养护云造价"
         };
         };
 
 
         response.render('building_saas/pm/html/project-management.html', renderData);
         response.render('building_saas/pm/html/project-management.html', renderData);

+ 28 - 19
modules/pm/facade/pm_facade.js

@@ -1643,27 +1643,36 @@ async function downLoadProjectFile(info) {
 
 
 async function doDownLoadAndImport(privateDownloadUrl,info) {
 async function doDownLoadAndImport(privateDownloadUrl,info) {
     let stream = fs.createWriteStream(path.join(__dirname, "../../../tmp/"+info.key));//
     let stream = fs.createWriteStream(path.join(__dirname, "../../../tmp/"+info.key));//
-    request(privateDownloadUrl).pipe(stream).on("close", async function (err) {
-        console.log("文件[" + info.key + "]下载完毕");
-        let doc = {status:"finish"};
-        try {
-            let data = fs.readFileSync(stream.path,'utf-8');
-            let result = await importProject(data,{session:info.session},info.updateData);
-            if(result.error == 1){
-                doc.errorMsg = result.msg;
+    request(privateDownloadUrl)
+        .on('error', async function (err) {
+            await importLogsModel.update({ key: info.key }, { status: 'error', errorMsg: err.toString() });
+        })
+        .pipe(stream)
+        .on("close", async function () {
+            console.log('close');
+            console.log("文件[" + info.key + "]下载完毕");
+            let doc = { status: "finish" };
+            try {
+                let data = fs.readFileSync(stream.path, 'utf-8');
+                let result = await importProject(data, { session: info.session }, info.updateData);
+                if (result.error == 1) {
+                    doc.errorMsg = result.msg;
+                    doc.status = "error";
+                } else {
+                    doc.projectID = result.constructionProjectID;
+                }
+            } catch (error) {
+                console.log(error);
+                doc.errorMsg = "导入失败,请检查文件!";
                 doc.status = "error";
                 doc.status = "error";
-            } else {
-                doc.projectID = result.constructionProjectID;
+            } finally {
+                await importLogsModel.update({ key: info.key }, doc);
+                fs.unlinkSync(stream.path);
             }
             }
-        }catch (error){
-            console.log(error);
-            doc.errorMsg = "导入失败,请检查文件!";
-            doc.status = "error";
-        }finally {
-            await importLogsModel.update({key:info.key},doc);
-            fs.unlinkSync(stream.path);
-        }
-    });
+        })
+        .on('error', async function () {
+            await importLogsModel.update({ key: info.key }, { status: 'error', errorMsg: `文件[${info.key}]下载失败,请稍后再试。` });
+        });
 }
 }
 
 
 async function importProcessChecking(data){
 async function importProcessChecking(data){

+ 1 - 1
modules/pm/models/project_model.js

@@ -146,7 +146,7 @@ ProjectsDAO.prototype.updateUserProjects = async function (userId, compilationId
                 data.updateData['fileVer'] = G_FILE_VER;
                 data.updateData['fileVer'] = G_FILE_VER;
                 if(data.updateData.projType === projectType.project){
                 if(data.updateData.projType === projectType.project){
                     //设置建设项目基本信息,多个单位工程共用
                     //设置建设项目基本信息,多个单位工程共用
-                    data.updateData.property = {basicInformation: basicInformation};
+                    data.updateData.property.basicInformation = basicInformation;
                 }
                 }
                 // 如果没有选中单价文件则新增单价文件
                 // 如果没有选中单价文件则新增单价文件
                 if (data.updateData.projType === projectType.tender && data.updateData.property !== null &&
                 if (data.updateData.projType === projectType.tender && data.updateData.property !== null &&

+ 6 - 4
modules/reports/controllers/rpt_tpl_controller.js

@@ -15,6 +15,8 @@ let rptCustCfgFacade = require("../facade/rpt_cust_cfg_facade");
 const JV = require("../rpt_component/jpc_value_define");
 const JV = require("../rpt_component/jpc_value_define");
 const rttFacade = require("../facade/rpt_tpl_tree_node_facade");
 const rttFacade = require("../facade/rpt_tpl_tree_node_facade");
 const CompilationModel = require("../../users/models/compilation_model");
 const CompilationModel = require("../../users/models/compilation_model");
+const config = require("../../../config/config.js");
+const title = config[process.env.NODE_ENV].title?config[process.env.NODE_ENV].title:"纵横公路养护云造价";
 
 
 //统一回调函数
 //统一回调函数
 let callback = function(req, res, err, message, data){
 let callback = function(req, res, err, message, data){
@@ -143,10 +145,10 @@ let mExport = {
                     let rstData = {isFreeUser: isFreeUser, data: tplTreeRst};
                     let rstData = {isFreeUser: isFreeUser, data: tplTreeRst};
                     if (isFreeUser) {
                     if (isFreeUser) {
                         let waterMarks = [];
                         let waterMarks = [];
-                        waterMarks.push({label:"纵横公路养护云造价", font:{name:'楷体', height: 32, color:'GREEN', angle:45}, left_top:[10, 100]});
-                        waterMarks.push({label:"纵横公路养护云造价", font:{name:'楷体', height: 32, color:'GREEN', angle:45}, left_top:[100, 300]});
-                        waterMarks.push({label:"纵横公路养护云造价", font:{name:'楷体', height: 32, color:'GREEN', angle:45}, left_top:[200, 500]});
-                        waterMarks.push({label:"纵横公路养护云造价", font:{name:'楷体', height: 32, color:'GREEN', angle:45}, left_top:[600, 700]});
+                        waterMarks.push({label:title, font:{name:'楷体', height: 32, color:'GREEN', angle:45}, left_top:[10, 100]});
+                        waterMarks.push({label:title, font:{name:'楷体', height: 32, color:'GREEN', angle:45}, left_top:[100, 300]});
+                        waterMarks.push({label:title, font:{name:'楷体', height: 32, color:'GREEN', angle:45}, left_top:[200, 500]});
+                        waterMarks.push({label:title, font:{name:'楷体', height: 32, color:'GREEN', angle:45}, left_top:[600, 700]});
                         rstData.waterMarks = waterMarks;
                         rstData.waterMarks = waterMarks;
                     } else {
                     } else {
                         rstData.waterMarks = [];
                         rstData.waterMarks = [];

+ 3 - 1
modules/unit_price_file/controllers/unit_price_controller.js

@@ -49,7 +49,9 @@ module.exports={
           gljTypeMap:JSON.stringify(gljTypeMap),
           gljTypeMap:JSON.stringify(gljTypeMap),
           mixRatioMap:JSON.stringify(mixRatioMap),
           mixRatioMap:JSON.stringify(mixRatioMap),
           com_electrovalence:JSON.stringify(com_electrovalence),
           com_electrovalence:JSON.stringify(com_electrovalence),
-          LicenseKey:config.getLicenseKey(process.env.NODE_ENV)
+          socketPort:config[process.env.NODE_ENV].socketPort?config[process.env.NODE_ENV].socketPort:5500,
+          LicenseKey:config.getLicenseKey(process.env.NODE_ENV),
+          title:config[process.env.NODE_ENV].title?config[process.env.NODE_ENV].title:"纵横公路养护云造价"
         });
         });
     },
     },
     addMixRatio:async function(req,res){
     addMixRatio:async function(req,res){

+ 2 - 1
modules/users/controllers/boot_controller.js

@@ -8,7 +8,7 @@
 const BaseController = require("../../common/base/base_controller");
 const BaseController = require("../../common/base/base_controller");
 const UserModel = require("../models/user_model");
 const UserModel = require("../models/user_model");
 const CompilationModel = require("../models/compilation_model");
 const CompilationModel = require("../models/compilation_model");
-
+const config = require("../../../config/config.js");
 class BootController extends BaseController {
 class BootController extends BaseController {
 
 
     /**
     /**
@@ -50,6 +50,7 @@ class BootController extends BaseController {
             compilation: request.params.compilation,
             compilation: request.params.compilation,
             compilationName: request.session.sessionCompilation.name,
             compilationName: request.session.sessionCompilation.name,
             versionName: request.session.compilationVersion,
             versionName: request.session.compilationVersion,
+            title:config[process.env.NODE_ENV].title?config[process.env.NODE_ENV].title:"纵横公路养护云造价"
         };
         };
         response.render('users/html/login-infoinput', renderData);
         response.render('users/html/login-infoinput', renderData);
     }
     }

+ 5 - 2
modules/users/controllers/login_controller.js

@@ -17,7 +17,8 @@ const Captcha = require("../models/captcha");
 let mongoose = require("mongoose");
 let mongoose = require("mongoose");
 let systemSettingModel = mongoose.model("system_setting");
 let systemSettingModel = mongoose.model("system_setting");
 const uuidV1 = require('uuid/v1');
 const uuidV1 = require('uuid/v1');
-
+let config = require("../../../config/config.js");
+let title = config[process.env.NODE_ENV].title?config[process.env.NODE_ENV].title:"纵横公路养护云造价";
 class LoginController {
 class LoginController {
 
 
     /**
     /**
@@ -60,6 +61,7 @@ class LoginController {
                 if (userInfo !== undefined && userInfo !== null && userInfo.isSmsLogin === 1) {
                 if (userInfo !== undefined && userInfo !== null && userInfo.isSmsLogin === 1) {
                     let renderData = {
                     let renderData = {
                         mobile: userData.mobile,
                         mobile: userData.mobile,
+                        title:title
                     };
                     };
                     response.render('users/html/login-sms', renderData);
                     response.render('users/html/login-sms', renderData);
                     return;
                     return;
@@ -112,6 +114,7 @@ class LoginController {
                 if (preferenceSetting.login_ask === 1 || preferenceSetting.select_version === '') {
                 if (preferenceSetting.login_ask === 1 || preferenceSetting.select_version === '') {
                     let renderData = {
                     let renderData = {
                         versionData: compilationList,
                         versionData: compilationList,
+                        title:title
                     };
                     };
                     response.render('users/html/login-ver', renderData);
                     response.render('users/html/login-ver', renderData);
                 } else {
                 } else {
@@ -126,7 +129,7 @@ class LoginController {
             if (sessionUser !== undefined && sessionUser.ssoId >= 0) {
             if (sessionUser !== undefined && sessionUser.ssoId >= 0) {
                 return response.redirect("/pm");
                 return response.redirect("/pm");
             } else {
             } else {
-                response.render('users/html/login', {});
+                response.render('users/html/login', {title:title});
             }
             }
         }
         }
     }
     }

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

@@ -15,7 +15,8 @@ const CompilationModel = require("../models/compilation_model");
 const mongoose = require("mongoose");
 const mongoose = require("mongoose");
 const moment = require("moment");
 const moment = require("moment");
 const userData = mongoose.model('user');
 const userData = mongoose.model('user');
-
+const config = require("../../../config/config.js");
+const title=config[process.env.NODE_ENV].title?config[process.env.NODE_ENV].title:"纵横公路养护云造价";
 class UserController extends BaseController {
 class UserController extends BaseController {
 
 
     /**
     /**
@@ -40,6 +41,7 @@ class UserController extends BaseController {
             companyScaleList: userModel.companyScale,
             companyScaleList: userModel.companyScale,
             compilationName: request.session.sessionCompilation.name,
             compilationName: request.session.sessionCompilation.name,
             versionName: request.session.compilationVersion,
             versionName: request.session.compilationVersion,
+            title:title
         };
         };
         response.render('users/html/user-info', renderData);
         response.render('users/html/user-info', renderData);
     }
     }
@@ -123,6 +125,7 @@ class UserController extends BaseController {
             pages: pageData,
             pages: pageData,
             compilationName: request.session.sessionCompilation.name,
             compilationName: request.session.sessionCompilation.name,
             versionName: request.session.compilationVersion,
             versionName: request.session.compilationVersion,
+            title:title
         };
         };
         response.render('users/html/user-safe', renderData);
         response.render('users/html/user-safe', renderData);
     }
     }
@@ -166,6 +169,7 @@ class UserController extends BaseController {
             compilationList: compilationList,
             compilationList: compilationList,
             compilationName: request.session.sessionCompilation.name,
             compilationName: request.session.sessionCompilation.name,
             versionName: request.session.compilationVersion,
             versionName: request.session.compilationVersion,
+            title:title
         };
         };
         response.render('users/html/user-buy', renderData);
         response.render('users/html/user-buy', renderData);
     }
     }
@@ -199,6 +203,7 @@ class UserController extends BaseController {
             compilationList: compilationList,
             compilationList: compilationList,
             compilationName: request.session.sessionCompilation.name,
             compilationName: request.session.sessionCompilation.name,
             versionName: request.session.compilationVersion,
             versionName: request.session.compilationVersion,
+            title:title
         };
         };
         response.render('users/html/user-set', renderData);
         response.render('users/html/user-set', renderData);
     }
     }

+ 4 - 3
modules/users/models/user_model.js

@@ -9,7 +9,7 @@ const mongoose = require("mongoose");
 const Request = require("request");
 const Request = require("request");
 const BaseModel = require("../../common/base/base_model")
 const BaseModel = require("../../common/base/base_model")
 const LogModel = require("./log_model");
 const LogModel = require("./log_model");
-
+const config = require("../../../config/config.js");
 class UserModel extends BaseModel {
 class UserModel extends BaseModel {
 
 
     /**
     /**
@@ -347,7 +347,8 @@ class UserModel extends BaseModel {
      * @return {version}
      * @return {version}
      */
      */
     async getVersionFromUpgrade(ssoId, compilationId) {
     async getVersionFromUpgrade(ssoId, compilationId) {
-        let version = '纵横公路养护云造价(学习版)';//'纵横公路养护造价(免费云版)'; 2019-03-28 需求修改,听说不知道多久的以后还会改回来--勿删!!!!!
+        let title = config[process.env.NODE_ENV].title?config[process.env.NODE_ENV].title:"纵横公路养护云造价";
+        let version = title+'(学习版)';//'纵横公路养护造价(免费云版)'; 2019-03-28 需求修改,听说不知道多久的以后还会改回来--勿删!!!!!
         let deadline = '';
         let deadline = '';
         let userData = await this.findDataBySsoId(ssoId);
         let userData = await this.findDataBySsoId(ssoId);
         if (userData.upgrade_list !== undefined) {
         if (userData.upgrade_list !== undefined) {
@@ -355,7 +356,7 @@ class UserModel extends BaseModel {
                 return item.compilationID === compilationId;
                 return item.compilationID === compilationId;
             });
             });
             if (compilationInfo !== undefined && compilationInfo.isUpgrade === true) {
             if (compilationInfo !== undefined && compilationInfo.isUpgrade === true) {
-                version = '纵横公路养护云造价(专业版)';
+                version = title+'(专业版)';
                 if (compilationInfo.deadline !== undefined && compilationInfo.deadline !== '') {
                 if (compilationInfo.deadline !== undefined && compilationInfo.deadline !== '') {
                     deadline = compilationInfo.deadline;
                     deadline = compilationInfo.deadline;
                 }
                 }

+ 6 - 3
package.json

@@ -60,8 +60,11 @@
     "server": "pm2-docker pm2_server.json",
     "server": "pm2-docker pm2_server.json",
     "socket": "node socket.js",
     "socket": "node socket.js",
     "import": "pm2-docker pm2_import.json",
     "import": "pm2-docker pm2_import.json",
-    "dev_server": "SET NODE_ENV=qa&& server.js",
-    "dev_socket": "SET NODE_ENV=qa&& socket.js",
-    "dev_import": "SET NODE_ENV=qa&& importserver.js"
+    "dev_server": "SET NODE_ENV=qa&& node server.js",
+    "dev_socket": "SET NODE_ENV=qa&& node socket.js",
+    "dev_import": "SET NODE_ENV=qa&& node importserver.js",
+    "dev_server_sc": "SET NODE_ENV=qa_sc&& node server.js",
+    "dev_socket_sc": "SET NODE_ENV=qa_sc&& node socket.js",
+    "dev_import_sc": "SET NODE_ENV=qa_sc&& node importserver.js"
   }
   }
 }
 }

+ 9 - 2
public/common_constants.js

@@ -103,8 +103,14 @@
 
 
     // 项目类别,叫bill和ratoin,是建筑的计价类型为清单、定额计价,延用。
     // 项目类别,叫bill和ratoin,是建筑的计价类型为清单、定额计价,延用。
     const ValuationType = {
     const ValuationType = {
-        BUDGET: 'bill',
-        BOQ: 'ration'
+        BUDGET: 'bill', // 预算
+        BOQ: 'ration' // 工程量清单
+    };
+
+    // 工程量清单类型
+    const BOQType = {
+        TENDER: 1, // 招标
+        BIDDER: 2, // 投标
     };
     };
 
 
     const SourceType = {
     const SourceType = {
@@ -143,6 +149,7 @@
         COMPLEMENTARY_LIB,
         COMPLEMENTARY_LIB,
         COMPILATION,
         COMPILATION,
         ValuationType,
         ValuationType,
+        BOQType,
         SourceType,
         SourceType,
         StorageKey,
         StorageKey,
         SharePermissionChangeType,
         SharePermissionChangeType,

+ 11 - 0
public/common_util.js

@@ -22,6 +22,16 @@
     function isEmptyVal(val) {
     function isEmptyVal(val) {
         return val === null || val === undefined || val === '';
         return val === null || val === undefined || val === '';
     }
     }
+
+    // 是否近似相等(null = undefined = '', 1 = '1'...)
+    function similarEqual(a, b) {
+        // null == '' 为false,所以不能用非严等
+        if (isEmptyVal(a) && isEmptyVal(b)) {
+            return true;
+        }
+        return a == b;
+    }
+
     // 将树数据排序好
     // 将树数据排序好
     function getSortedTreeData(rootID, items) {
     function getSortedTreeData(rootID, items) {
         return sortSameDedth(rootID, items).reverse();
         return sortSameDedth(rootID, items).reverse();
@@ -111,6 +121,7 @@
     return {
     return {
         isDef,
         isDef,
         isEmptyVal,
         isEmptyVal,
+        similarEqual,
         getSortedTreeData,
         getSortedTreeData,
         handleFullscreen,
         handleFullscreen,
         standardNumber,
         standardNumber,

+ 3 - 1
public/web/socket/connection.js

@@ -8,7 +8,9 @@ socketObject = {
         // 连接socket服务器
         // 连接socket服务器
         var hostName = window.location.hostname;
         var hostName = window.location.hostname;
         let me = this;
         let me = this;
-        let port = window.location.protocol === 'http:' ? 5500 : 5501;
+        let socketPort = parseInt($("#socketPort").val());
+        if(!socketPort) socketPort= 5500;
+        let port = window.location.protocol === 'http:' ? socketPort : socketPort+1;
         socket = io(window.location.protocol + '//' + hostName + ':' + port);
         socket = io(window.location.protocol + '//' + hostName + ':' + port);
         socket.on('connect', function () {
         socket.on('connect', function () {
             if (from == 'pm') {
             if (from == 'pm') {

+ 8 - 2
server.js

@@ -39,8 +39,11 @@ let bodyParser = require('body-parser');
 app.use(bodyParser.urlencoded({limit: '100mb', extended: false}));
 app.use(bodyParser.urlencoded({limit: '100mb', extended: false}));
 app.use(bodyParser.json({limit: '100mb'}));
 app.use(bodyParser.json({limit: '100mb'}));
 
 
+let dbname = 'yanghu';
+if(config[process.env.NODE_ENV].dbname) dbname = config[process.env.NODE_ENV].dbname;
+
 app.use(session({
 app.use(session({
-    name: 'yanghuSession',
+    name: dbname+'Session',
     secret: 'session users secret',
     secret: 'session users secret',
     // @todo 上线前修改回正常值 (目前为24小时)
     // @todo 上线前修改回正常值 (目前为24小时)
     cookie: {maxAge: 3600 * 24 * 1000},
     cookie: {maxAge: 3600 * 24 * 1000},
@@ -89,7 +92,10 @@ app.use(function(err, req, res, next) {
 //备注: 经过测试nodejs 8.9.3版本不支持eval的方式修改prototype,为兼容考虑,把方法调整到stringUtil文件里
 //备注: 经过测试nodejs 8.9.3版本不支持eval的方式修改prototype,为兼容考虑,把方法调整到stringUtil文件里
 require('./public/stringUtil').setupDateFormat();
 require('./public/stringUtil').setupDateFormat();
 
 
-app.listen(2060, function(){
+let startPort = 2060;
+if(config[process.env.NODE_ENV].startPort) startPort = config[process.env.NODE_ENV].startPort;
+
+app.listen(startPort, function(){
     console.log('server started!');
     console.log('server started!');
 });
 });
 
 

+ 3 - 1
socket.js

@@ -6,10 +6,12 @@
  * @version
  * @version
  */
  */
 const socket = require("socket.io");
 const socket = require("socket.io");
+const config = require("./config/config.js");
 const moment = require('moment');
 const moment = require('moment');
 const { PageTarget } = require('./public/common_constants');
 const { PageTarget } = require('./public/common_constants');
+let socketPort = config[process.env.NODE_ENV].socketPort?config[process.env.NODE_ENV].socketPort:5500; 
 
 
-const socketIO = socket(5500);
+const socketIO = socket(socketPort);
 
 
 const userCache = {};
 const userCache = {};
 
 

+ 1 - 1
web/building_saas/complementary_ration_lib/html/anzhuang.html

@@ -5,7 +5,7 @@
     <meta charset="utf-8">
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
-    <title>定额库编辑器-纵横公路养护造价</title>
+    <title>定额库编辑器-<%= title%></title>
     <!--inject:css-->
     <!--inject:css-->
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/lib/spreadjs/sheets/css/gc.spread.sheets.sc.css" type="text/css">
     <link rel="stylesheet" href="/lib/spreadjs/sheets/css/gc.spread.sheets.sc.css" type="text/css">

+ 1 - 1
web/building_saas/complementary_ration_lib/html/dinge.html

@@ -5,7 +5,7 @@
     <meta charset="utf-8">
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
-    <title>定额库编辑器-纵横公路养护造价</title>
+    <title>定额库编辑器-<%= title%></title>
     <!--inject:css-->
     <!--inject:css-->
     <link rel="stylesheet" href="/lib/jquery-ui/jquery-ui.css" type="text/css">
     <link rel="stylesheet" href="/lib/jquery-ui/jquery-ui.css" type="text/css">
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">

+ 1 - 1
web/building_saas/complementary_ration_lib/html/fuzhu.html

@@ -5,7 +5,7 @@
     <meta charset="utf-8">
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
-    <title>定额库编辑器-纵横公路养护造价</title>
+    <title>定额库编辑器-<%= title%></title>
     <!--inject:css-->
     <!--inject:css-->
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">

+ 1 - 1
web/building_saas/complementary_ration_lib/html/gongliao.html

@@ -5,7 +5,7 @@
     <meta charset="utf-8">
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
-    <title>定额库编辑器-纵横公路养护造价</title>
+    <title>定额库编辑器-<%= title%></title>
     <!--inject:css-->
     <!--inject:css-->
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">

+ 1 - 1
web/building_saas/main/html/main.html

@@ -5,7 +5,7 @@
     <meta charset="utf-8">
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
-    <title><%= projectData.name !== undefined ? projectData.name : '造价书' %>-纵横公路养护云造价</title>
+    <title><%= projectData.name !== undefined ? projectData.name : '造价书' %>-<%= title%></title>
 
 
 
 
     <link rel="stylesheet" href="/lib/jquery-ui/jquery-ui.css" type="text/css">
     <link rel="stylesheet" href="/lib/jquery-ui/jquery-ui.css" type="text/css">

+ 4 - 1
web/building_saas/main/js/views/divide_view.js

@@ -81,6 +81,7 @@ let divideObj = {
     }else {
     }else {
       disableSpread(this.divideSpread);
       disableSpread(this.divideSpread);
       disableSpread(this.billsSpread);
       disableSpread(this.billsSpread);
+      disableSpread(this.divideSubSpread);
     }
     }
   },
   },
   initExecSpread:function(){
   initExecSpread:function(){
@@ -1390,7 +1391,8 @@ $('#tab_divide').on('shown.bs.tab', function (e) {
 })
 })
 
 
 $('.divide-nav-link').bind('click', function () {//$('.side-tabs ul li a').bind   2018-11-23  使用更多标签,所以不能这样绑定事件了
 $('.divide-nav-link').bind('click', function () {//$('.side-tabs ul li a').bind   2018-11-23  使用更多标签,所以不能这样绑定事件了
-   var tab = $(this), tabPanel = $(tab.attr('relaPanel'));
+    if(projectReadOnly) return;
+    var tab = $(this), tabPanel = $(tab.attr('relaPanel'));
     if(tab.hasClass('disabled')){
     if(tab.hasClass('disabled')){
         return;
         return;
     }
     }
@@ -1508,6 +1510,7 @@ function showDivideSide(tabPanel, show, id){
 }
 }
 
 
 $('#divide_stdRationTab').bind('click', function () {
 $('#divide_stdRationTab').bind('click', function () {
+  if(projectReadOnly) return;
   var select = $('#divide_stdRationLibSelect');
   var select = $('#divide_stdRationLibSelect');
   rationLibObj.checkSpread('divide');
   rationLibObj.checkSpread('divide');
   if (select[0].options.length === 0) {
   if (select[0].options.length === 0) {

+ 4 - 0
web/building_saas/main/js/views/project_view.js

@@ -3328,6 +3328,10 @@ function disableTools(){
     $('#tenderRationQuantity').prop('disabled', 'disabled');
     $('#tenderRationQuantity').prop('disabled', 'disabled');
     $('#tenderPrice').prop('disabled', 'disabled');
     $('#tenderPrice').prop('disabled', 'disabled');
     $('#cleanTender').prop('disabled', 'disabled');
     $('#cleanTender').prop('disabled', 'disabled');
+    //分摊
+    $('#exec_divide_btn').prop('disabled', 'disabled');
+    $('#cancel_divide_btn').prop('disabled', 'disabled');
+    $('#cancel_all_divide_btn').prop('disabled', 'disabled');
 }
 }
 //项目只读,表格只读
 //项目只读,表格只读
 function disableSpread(spread){
 function disableSpread(spread){

+ 7 - 4
web/building_saas/pm/html/project-management.html

@@ -5,7 +5,7 @@
     <meta charset="utf-8">
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
-    <title>项目管理-纵横公路养护造价</title>
+    <title>项目管理-<%= title%></title>
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
     <link rel="stylesheet" href="/web/building_saas/css/custom.css">
     <link rel="stylesheet" href="/web/building_saas/css/custom.css">
@@ -51,6 +51,7 @@
 <img src="/web/dest/css/img/copy.png" id="copy_pic" style="display: none">
 <img src="/web/dest/css/img/copy.png" id="copy_pic" style="display: none">
 <img src="/web/dest/css/img/edit.png" id="edit_pic" style="display: none">
 <img src="/web/dest/css/img/edit.png" id="edit_pic" style="display: none">
 <div class="header">
 <div class="header">
+    <input type="hidden" id="projectTitle" value="<%= title%>">
     <div class="top-msg clearfix">
     <div class="top-msg clearfix">
         <div class="alert alert-warning mb-0 py-0" role="alert" style="display: none;">
         <div class="alert alert-warning mb-0 py-0" role="alert" style="display: none;">
             <button type="button" class="close" data-dismiss="alert" aria-label="Close">
             <button type="button" class="close" data-dismiss="alert" aria-label="Close">
@@ -258,6 +259,7 @@
                         <input type="text" class="form-control" placeholder="输入建设项目名称" id="project-name">
                         <input type="text" class="form-control" placeholder="输入建设项目名称" id="project-name">
                         <span class="form-text text-danger" id="project-name-info" style="display: none;">已存在 “建筑工程1”</span>
                         <span class="form-text text-danger" id="project-name-info" style="display: none;">已存在 “建筑工程1”</span>
                     </div>
                     </div>
+                    <div id="project-reserve"></div>
                 </form>
                 </form>
             </div>
             </div>
             <div class="modal-footer">
             <div class="modal-footer">
@@ -293,7 +295,8 @@
                             </div>
                             </div>
                         </div>
                         </div>
                     </div>
                     </div>
-                    <span class="form-text text-info" id="poj-name-info" style="display: none;">新建 “汽车生产车间5”</span>
+                    <span class="form-text text-info" id="poj-name-info" style="display: none;"></span>
+                    <div id="tender-reserve"></div>
                     <!--<div class="form-group row">
                     <!--<div class="form-group row">
                         <label for="staticEmail" class="col-auto col-form-label col-form-label-sm">单项工程</label>
                         <label for="staticEmail" class="col-auto col-form-label col-form-label-sm">单项工程</label>
                         <div class="col">
                         <div class="col">
@@ -643,7 +646,7 @@
     <div class="modal-dialog" role="document">
     <div class="modal-dialog" role="document">
         <div class="modal-content">
         <div class="modal-content">
             <div class="modal-header">
             <div class="modal-header">
-                <h5 class="modal-title">欢迎使用纵横公路养护造价</h5>
+                <h5 class="modal-title">欢迎使用<%= title%></h5>
             </div>
             </div>
             <div class="modal-body">
             <div class="modal-body">
                 <h5 class="my-3">首次加载例题,请稍候……</h5>
                 <h5 class="my-3">首次加载例题,请稍候……</h5>
@@ -686,7 +689,7 @@
     <div class="modal-dialog modal-lg" role="document">
     <div class="modal-dialog modal-lg" role="document">
         <div class="modal-content">
         <div class="modal-content">
             <div class="modal-header">
             <div class="modal-header">
-                <h5 class="modal-title">欢迎使用纵横公路养护云造价</h5>
+                <h5 class="modal-title">欢迎使用<%= title%></h5>
                 <label id="countdown" ></label>
                 <label id="countdown" ></label>
                 <button type="button" id="welcomeCloseBtn" class="close text-danger" data-dismiss="modal" aria-label="Close">
                 <button type="button" id="welcomeCloseBtn" class="close text-danger" data-dismiss="modal" aria-label="Close">
                     <span aria-hidden="true">&times;</span>
                     <span aria-hidden="true">&times;</span>

+ 258 - 145
web/building_saas/pm/js/pm_newMain.js

@@ -35,9 +35,14 @@ let taxTypeMap = {
 * */
 * */
 let regions = [];
 let regions = [];
 
 
-function isDef(v) {
-    return typeof v !== 'undefined' && v !== null;
-}
+const { 
+    ValuationType: { BUDGET, BOQ },
+    BOQType: { TENDER, BIDDER },
+} = window.commonConstants;
+const { 
+    similarEqual,
+    isDef
+} = window.commonUtil;
 
 
 //操作状态
 //操作状态
 const STATE = {
 const STATE = {
@@ -1662,6 +1667,121 @@ const projTreeObj = {
 
 
 };
 };
 
 
+function changeValuationType(type) {
+    $('input[name="valuation_type"]:checked').prop('checked', false);
+    $(`input[name="valuation_type"][value="${type}"]`).prop('checked', true);
+    let targetData = type === 'bill' ? JSON.parse(billValuation) : JSON.parse(rationValuation);
+    let html = '';
+    for(let i = targetData.length - 1; i >=0; i--){
+        let valuation = targetData[i];
+        if (valuation === null) {
+            continue;
+        }
+        html += `<option ${i === targetData.length -1 ? 'selected' : ''} value="${valuation.id}">${valuation.name}</option>`;
+    }
+    $("#valuation").html(html);
+    let engineeringList = getEngineeringList();
+    let engineeringHtml = getEngineeringHtml(engineeringList);
+    $("#tender-engineering").html(engineeringHtml);
+    changeEngineering();
+    $('#engineering-info').hide();
+}
+
+function changeEngineering(){
+    $('#engineering-info').hide();
+    initFeeStandardSel();
+}
+
+function changeFeeRate(engLib) {
+    if(engLib){
+       /*
+         if (engLib.fee_lib !== undefined && engLib.fee_lib.length > 0) {
+            $("#tender-fee-rate").children("option").first().val("newFeeRate-"+engLib.fee_lib[0].id);
+        }*/
+       //2018-08-29  费率改为和计税方式绑定在一起 所以在这里还不能确定标准费率库ID
+        $("#tender-fee-rate").children("option").first().val("newFeeRate@@");
+        $("#tender-engineering").parent().siblings('.hidden-area').slideDown('fast');
+    }
+    else {
+        $("#tender-fee-rate").children("option").first().val($('#tender-name').val());
+    }
+}
+
+function initFeeStandardSel() {
+    $('#tender-feeStandard').empty();
+    let feeStandards = [];
+    let engineeringList = getEngineeringList();
+    let currentEngName = $('#tender-engineering').val();
+    for(let eng of engineeringList){
+        if(eng.lib.name && eng.lib.name === currentEngName && eng.lib.feeName && eng.lib.feeName !== ''){
+            feeStandards.push(eng.lib.feeName);
+        }
+    }
+    for(let feeName of feeStandards){
+        let $opt = $(`<option value="${feeName}">${feeName}</option>`);
+        $('#tender-feeStandard').append($opt);
+    }
+    if(feeStandards.length > 0){
+        if($('#feeStandard-info').is(':visible')){
+            $('#feeStandard-info').hide();
+        }
+    }
+    let currentEngLib = getEngineeringLib(currentEngName + $('#tender-feeStandard').val(), engineeringList);
+    changeFeeRate(currentEngLib);
+    setTaxGroupHtml();
+    getStdCalcProgramFiles();
+}
+
+function changeFeeStandard() {
+    let currentEngLib = getEngineeringLib($('#tender-engineering').val() + $('#tender-feeStandard').val(), getEngineeringList());
+    changeFeeRate(currentEngLib);
+    setTaxGroupHtml();
+    getStdCalcProgramFiles();
+}
+
+function setTaxGroupHtml() {
+    let groups = getTaxGroupList();
+    let taxTypeArray = [];
+    let htmlString = "";
+    if(groups && groups.length > 0){
+        taxTypeArray = _.uniq(_.map(groups,'taxType'));
+    }
+    for(let t of taxTypeArray){
+         htmlString += "<option value='"+t+"'>"+taxTypeMap[t]+"</option>"
+    }
+    $('#taxType').html(htmlString);
+    if(taxTypeArray.length <2){
+        $('#taxType_div').hide();
+    }else {
+        $('#taxType_div').show();
+    }
+}
+
+function getStdCalcProgramFiles(){
+    function getStdCPFilesHtml(taxGroups) {
+        let result = '';
+        if (taxGroups.length <= 0) {
+            return result;
+        };
+
+        for (let group of taxGroups){
+            let groupString = ""; //把计算程序、清单模板、列设置的ID生成一个组合的值
+            let p_id = group.program_lib?group.program_lib.id:"";
+            let t_id = group.template_lib?group.template_lib.id:"";
+            let c_id = group.col_lib?group.col_lib.id:"";
+            let f_id = group.fee_lib?group.fee_lib.id:"";
+            groupString = p_id + "|-|" +t_id+"|-|"+c_id+"|-|"+f_id;
+            result += '<option value='+ groupString +'>'+ group.program_lib.name +'</option>';
+        };
+        return result;
+    };
+    let taxType = $("#taxType").val();
+    let stdCPHtml = getStdCPFilesHtml(getTaxGroupList(taxType));
+    $("#tender-calcProgram").html(stdCPHtml);
+    if ($("#tender-calcProgram")[0].options.length > 1)
+        $("#tender-calcProgram")[0].selectedIndex = 0;
+}
+
 $(document).ready(function() {
 $(document).ready(function() {
     // 分享给的一些事件监听
     // 分享给的一些事件监听
     SHARE_TO.handleEventListener();
     SHARE_TO.handleEventListener();
@@ -1720,8 +1840,8 @@ $(document).ready(function() {
     bindInputs($('#project-name'), $('#folder-name'), $('#rename-name'));
     bindInputs($('#project-name'), $('#folder-name'), $('#rename-name'));
     //绑定新建窗口显示事件
     //绑定新建窗口显示事件
     bindModalShown($('#add-folder-dialog'), $('#add-project-dialog'), $('#add-tender-dialog'));
     bindModalShown($('#add-folder-dialog'), $('#add-project-dialog'), $('#add-tender-dialog'));
-    //绑定新建建设项目、新建文件夹、重命名弹窗隐藏事件
-    bindModalsHidden($('#add-project-dialog'), $('#add-folder-dialog'), $('#rename-dialog'));
+    //绑定新建建设项目、新建单位工程、新建文件夹、重命名弹窗隐藏事件
+    bindModalsHidden($('#add-project-dialog'), $('#add-tender-dialog'), $('#add-folder-dialog'), $('#rename-dialog'));
 
 
     // 新建子菜单有效性刷新
     // 新建子菜单有效性刷新
     $('#addMenuBtn').click(function () {
     $('#addMenuBtn').click(function () {
@@ -1747,22 +1867,7 @@ $(document).ready(function() {
     // 选择计价方式
     // 选择计价方式
     $("input[name='valuation_type']").click(function() {
     $("input[name='valuation_type']").click(function() {
         let type = $(this).val();
         let type = $(this).val();
-        let targetData = type === 'bill' ? JSON.parse(billValuation) : JSON.parse(rationValuation);
-        let html = '';
-        for(let i = targetData.length - 1; i >=0; i--){
-            let valuation = targetData[i];
-            if (valuation === null) {
-                continue;
-            }
-            html += `<option ${i === targetData.length -1 ? 'selected' : ''} value="${valuation.id}">${valuation.name}</option>`;
-        }
-        $("#valuation").html(html);
-        //$("#tender-engineering").html('<option value="">请选择对应的工程专业</option>');
-        let engineeringList = getEngineeringList();
-        let engineeringHtml = getEngineeringHtml(engineeringList);
-        $("#tender-engineering").html(engineeringHtml);
-        changeEngineering();
-        $('#engineering-info').hide();
+        changeValuationType(type);
     });
     });
 
 
     //选择计价规则
     //选择计价规则
@@ -1785,30 +1890,39 @@ $(document).ready(function() {
         let pojName = $('#poj-name').val().trim();
         let pojName = $('#poj-name').val().trim();
         let nameList = getNameList($('#poj-name-list').children());
         let nameList = getNameList($('#poj-name-list').children());
         let isExist = hasListName(nameList, pojName);
         let isExist = hasListName(nameList, pojName);
-        if(!isExist){
-            if(pojName !== ''){
+        if (!isExist) {
+            changeValuationType(BUDGET);
+            if (pojName !== '') {
                 replaceClass($('#poj-name-info'), 'text-danger', 'text-info');
                 replaceClass($('#poj-name-info'), 'text-danger', 'text-info');
                 setDangerInfo($('#poj-name-info'), `新建“${pojName}”`);
                 setDangerInfo($('#poj-name-info'), `新建“${pojName}”`);
-            }
-            else {
+                if (!$('#tender-reserve').children().length) {
+                    initProjectOptSet($('#tender-reserve'));
+                }
+                // 新建项目,需要选择项目类型了,单位工程就不需要选择项目类别
+                $('#val-type-group').hide();
+            } else {
+                $('#tender-reserve').empty();
                 $('#poj-name-info').hide();
                 $('#poj-name-info').hide();
             }
             }
             //清空文件下拉
             //清空文件下拉
             setFileOptions(null);
             setFileOptions(null);
-        }
-        else {
+        } else {
+            $('#val-type-group').show();
+            $('#tender-reserve').empty();
             //触发选项
             //触发选项
             let curName = $(this).val().trim();
             let curName = $(this).val().trim();
-            function getProjOpt(opts){
-                for(let opt of opts){
-                    if($(opt).text().trim() === curName){
+            function getProjOpt(opts) {
+                for (let opt of opts) {
+                    if ($(opt).text().trim() === curName) {
                         return $(opt);
                         return $(opt);
                     }
                     }
                 }
                 }
                 return null;
                 return null;
             }
             }
             let matchOpt = getProjOpt($('#poj-name-list').find('a'));
             let matchOpt = getProjOpt($('#poj-name-list').find('a'));
-            if(matchOpt){
+            const projectID = matchOpt.data('id');
+            handleTenderValuationTypeViewState(projectID);
+            if (matchOpt) {
                 matchOpt.click();
                 matchOpt.click();
             }
             }
             $('#poj-name-info').hide();
             $('#poj-name-info').hide();
@@ -1880,10 +1994,10 @@ $(document).ready(function() {
         let selected = projTreeObj.tree.selected;
         let selected = projTreeObj.tree.selected;
         let projs = getProjs(selected);
         let projs = getProjs(selected);
         setProjOptions(projs, selected);
         setProjOptions(projs, selected);
-        //恢复成默认选中预算项目类别。
-        $($("input[name='valuation_type']")[0]).prop('checked', true);
-        $($("input[name='valuation_type']")[1]).prop('checked', false);
-        $($("input[name='valuation_type']")[0]).click();
+        $('#val-type-group').show();
+        const firstProj = selected && selected.data.projType === projectType.project ? selected: projs[0];
+        const firstProjID = firstProj && firstProj.data.ID || null;
+        handleTenderValuationTypeViewState(firstProjID);
         //设置地区选项
         //设置地区选项
         if(regions.length > 0){
         if(regions.length > 0){
             setRegionOpts(regions);
             setRegionOpts(regions);
@@ -2148,101 +2262,6 @@ $(document).ready(function() {
         projTreeObj.confirmFileChange();
         projTreeObj.confirmFileChange();
     });
     });
 
 
-    function changeEngineering(){
-        $('#engineering-info').hide();
-        initFeeStandardSel();
-    }
-
-    function changeFeeRate(engLib) {
-        if(engLib){
-           /*
-             if (engLib.fee_lib !== undefined && engLib.fee_lib.length > 0) {
-                $("#tender-fee-rate").children("option").first().val("newFeeRate-"+engLib.fee_lib[0].id);
-            }*/
-           //2018-08-29  费率改为和计税方式绑定在一起 所以在这里还不能确定标准费率库ID
-            $("#tender-fee-rate").children("option").first().val("newFeeRate@@");
-            $("#tender-engineering").parent().siblings('.hidden-area').slideDown('fast');
-        }
-        else {
-            $("#tender-fee-rate").children("option").first().val($('#tender-name').val());
-        }
-    }
-
-    function initFeeStandardSel() {
-        $('#tender-feeStandard').empty();
-        let feeStandards = [];
-        let engineeringList = getEngineeringList();
-        let currentEngName = $('#tender-engineering').val();
-        for(let eng of engineeringList){
-            if(eng.lib.name && eng.lib.name === currentEngName && eng.lib.feeName && eng.lib.feeName !== ''){
-                feeStandards.push(eng.lib.feeName);
-            }
-        }
-        for(let feeName of feeStandards){
-            let $opt = $(`<option value="${feeName}">${feeName}</option>`);
-            $('#tender-feeStandard').append($opt);
-        }
-        if(feeStandards.length > 0){
-            if($('#feeStandard-info').is(':visible')){
-                $('#feeStandard-info').hide();
-            }
-        }
-        let currentEngLib = getEngineeringLib(currentEngName + $('#tender-feeStandard').val(), engineeringList);
-        changeFeeRate(currentEngLib);
-        setTaxGroupHtml();
-        getStdCalcProgramFiles();
-    }
-
-    function changeFeeStandard() {
-        let currentEngLib = getEngineeringLib($('#tender-engineering').val() + $('#tender-feeStandard').val(), getEngineeringList());
-        changeFeeRate(currentEngLib);
-        setTaxGroupHtml();
-        getStdCalcProgramFiles();
-    }
-
-    function setTaxGroupHtml() {
-        let groups = getTaxGroupList();
-        let taxTypeArray = [];
-        let htmlString = "";
-        if(groups && groups.length > 0){
-            taxTypeArray = _.uniq(_.map(groups,'taxType'));
-        }
-        for(let t of taxTypeArray){
-             htmlString += "<option value='"+t+"'>"+taxTypeMap[t]+"</option>"
-        }
-        $('#taxType').html(htmlString);
-        if(taxTypeArray.length <2){
-            $('#taxType_div').hide();
-        }else {
-            $('#taxType_div').show();
-        }
-    }
-
-    function getStdCalcProgramFiles(){
-        function getStdCPFilesHtml(taxGroups) {
-            let result = '';
-            if (taxGroups.length <= 0) {
-                return result;
-            };
-
-            for (let group of taxGroups){
-                let groupString = ""; //把计算程序、清单模板、列设置的ID生成一个组合的值
-                let p_id = group.program_lib?group.program_lib.id:"";
-                let t_id = group.template_lib?group.template_lib.id:"";
-                let c_id = group.col_lib?group.col_lib.id:"";
-                let f_id = group.fee_lib?group.fee_lib.id:"";
-                groupString = p_id + "|-|" +t_id+"|-|"+c_id+"|-|"+f_id;
-                result += '<option value='+ groupString +'>'+ group.program_lib.name +'</option>';
-            };
-            return result;
-        };
-        let taxType = $("#taxType").val();
-        let stdCPHtml = getStdCPFilesHtml(getTaxGroupList(taxType));
-        $("#tender-calcProgram").html(stdCPHtml);
-        if ($("#tender-calcProgram")[0].options.length > 1)
-            $("#tender-calcProgram")[0].selectedIndex = 0;
-    }
-
     // 选择工程专业后动态更改费率文件等数据
     // 选择工程专业后动态更改费率文件等数据
     $("#tender-engineering").change(function() {
     $("#tender-engineering").change(function() {
         changeEngineering()
         changeEngineering()
@@ -2349,7 +2368,7 @@ async function init(refresh = false, callback, expandCallback) {//refresh是刷
         if (refresh == false) socketObject.connect('pm');//socket 连接;
         if (refresh == false) socketObject.connect('pm');//socket 连接;
         if (isFirst) {
         if (isFirst) {
             isFirst = false;
             isFirst = false;
-            $.bootstrapLoading.progressStart('欢迎使用纵横公路养护造价', true);
+            $.bootstrapLoading.progressStart('欢迎使用'+$("#projectTitle").val(), true);
             $("#progress_modal_body").text('首次加载例题,请稍候……');
             $("#progress_modal_body").text('首次加载例题,请稍候……');
             await ajaxPost('/pm/api/prepareInitialData', { user_id: userID });
             await ajaxPost('/pm/api/prepareInitialData', { user_id: userID });
             await importProcessChecking(null, null, () => {
             await importProcessChecking(null, null, () => {
@@ -2362,7 +2381,7 @@ async function init(refresh = false, callback, expandCallback) {//refresh是刷
             }, true);
             }, true);
         } else {
         } else {
             await importProcessChecking(null, ({ content }) => {
             await importProcessChecking(null, ({ content }) => {
-                $.bootstrapLoading.progressStart('欢迎使用纵横公路养护造价', true);
+                $.bootstrapLoading.progressStart('欢迎使用'+$("#projectTitle").val(), true);
                 $("#progress_modal_body").text(content);
                 $("#progress_modal_body").text(content);
             }, () => {
             }, () => {
                 $.bootstrapLoading.start();
                 $.bootstrapLoading.start();
@@ -2424,7 +2443,12 @@ function AddProject() {
         }, 500);
         }, 500);
     };
     };
     let selectedItem = projTreeObj.tree.selected;
     let selectedItem = projTreeObj.tree.selected;
-
+    const property = {
+        valuationType: $('input[name="valuation-type"]:checked').val()
+    };
+    if (property.valuationType === BOQ) {
+        property.boqType = +$('input[name="boq-type-input"]:checked').val();
+    }
     /*
     /*
      * (1)、当前没有焦点行,新建建设项目为第一个节点。
      * (1)、当前没有焦点行,新建建设项目为第一个节点。
      (2)、当前定位在文件夹,新建建设项目为文件夹的最后一个子节点。
      (2)、当前定位在文件夹,新建建设项目为文件夹的最后一个子节点。
@@ -2432,28 +2456,70 @@ function AddProject() {
      (4)、当前定位在单项工程或单位工程,新建项目为当前所属建设项目的后兄弟。
      (4)、当前定位在单项工程或单位工程,新建项目为当前所属建设项目的后兄弟。
      * */
      * */
     if(!selectedItem){
     if(!selectedItem){
-        AddSiblingsItem(selectedItem, name, null, projectType.project, existCallback, sucCallback, errCB);
+        AddSiblingsItem(selectedItem, name, property, projectType.project, existCallback, sucCallback, errCB);
     }
     }
     else {
     else {
         if(selectedItem.data.projType === projectType.project){
         if(selectedItem.data.projType === projectType.project){
-            AddSiblingsItem(selectedItem, name, null, projectType.project, existCallback, sucCallback, errCB);
+            AddSiblingsItem(selectedItem, name, property, projectType.project, existCallback, sucCallback, errCB);
         }
         }
         else if(selectedItem.data.projType === projectType.tender){
         else if(selectedItem.data.projType === projectType.tender){
             let proj = selectedItem.parent;
             let proj = selectedItem.parent;
-            AddSiblingsItem(proj, name, null, projectType.project, existCallback, sucCallback, errCB);
+            AddSiblingsItem(proj, name, property, projectType.project, existCallback, sucCallback, errCB);
         }
         }
         else if(selectedItem.data.projType === projectType.folder){
         else if(selectedItem.data.projType === projectType.folder){
-            AddChildrenItem(selectedItem, name, null, projectType.project, existCallback, sucCallback, errCB);
+            AddChildrenItem(selectedItem, name, property, projectType.project, existCallback, sucCallback, errCB);
         }
         }
     }
     }
 }
 }
 
 
+// 创建建设项目可选项
+function initProjectOptSet($target) {
+    const html = `<div class="form-group row">
+                        <label for="staticEmail" class="col-auto col-form-label col-form-label-sm">项目类型</label>
+                        <div class="col">
+                            <div class="custom-control custom-radio custom-control-inline">
+                                <input type="radio" value="${BUDGET}" name="valuation-type" checked id="type-budget" class="custom-control-input">
+                                <label class="custom-control-label" for="type-budget">预算</label>
+                            </div>
+                            <div class="custom-control custom-radio custom-control-inline">
+                                <input type="radio" value="${BOQ}" name="valuation-type" id="type-boq" class="custom-control-input">
+                                <label class="custom-control-label" for="type-boq">工程量清单</label>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="form-group row hide-area" id="boq-type">
+                        <label for="staticEmail" class="col-auto col-form-label col-form-label-sm">清单类型</label>
+                        <div class="col">
+                            <div class="custom-control custom-radio custom-control-inline">
+                                <input type="radio" value="${TENDER}" name="boq-type-input" checked id="boq-type-tender" class="custom-control-input">
+                                <label class="custom-control-label" for="boq-type-tender">招标</label>
+                            </div>
+                            <div class="custom-control custom-radio custom-control-inline">
+                                <input type="radio" value="${BIDDER}" name="boq-type-input" id="boq-type-bidder" class="custom-control-input">
+                                <label class="custom-control-label" checked for="boq-type-bidder">投标</label>
+                            </div>
+                        </div>
+                    </div>`;
+    //const $children = $(html);
+    $target.empty();
+    $target.append($(html));
+    $('input[name="valuation-type"]').on('change', function () {
+        const valuationType = $(this).val();
+        // 当项目类型是“工程量清单”时,清单类型可见可选
+        changeValuationType(valuationType);
+        valuationType === BOQ
+            ? $('#boq-type').removeClass('hide-area')
+            : $('#boq-type').addClass('hide-area');
+    });
+}
+
 function bindModalShown(folderDialog, projDialog, tenderDialog) {
 function bindModalShown(folderDialog, projDialog, tenderDialog) {
     folderDialog.on('shown.bs.modal', function () {
     folderDialog.on('shown.bs.modal', function () {
         $('#folder-name').focus();
         $('#folder-name').focus();
     });
     });
     projDialog.on('shown.bs.modal', function () {
     projDialog.on('shown.bs.modal', function () {
         $('#project-name').focus();
         $('#project-name').focus();
+        initProjectOptSet($('#project-reserve'));
     });
     });
     tenderDialog.on('shown.bs.modal', function () {
     tenderDialog.on('shown.bs.modal', function () {
         $('#tender-name').focus();
         $('#tender-name').focus();
@@ -2461,10 +2527,14 @@ function bindModalShown(folderDialog, projDialog, tenderDialog) {
 }
 }
 
 
 //新建建设项目、新建单项工程、新建文件夹、重命名弹窗隐藏事件
 //新建建设项目、新建单项工程、新建文件夹、重命名弹窗隐藏事件
-function bindModalsHidden(projDialog, folderDialog, renameDialog){
+function bindModalsHidden(projDialog, tenderDialog, folderDialog, renameDialog){
     projDialog.on('hidden.bs.modal', function () {
     projDialog.on('hidden.bs.modal', function () {
         setDangerInfo($('#project-name-info'), '', false);
         setDangerInfo($('#project-name-info'), '', false);
         $('#project-name').val('');
         $('#project-name').val('');
+        $('#project-reserve').empty();
+    });
+    tenderDialog.on('hidden.bs.modal', function () {
+        $('#tender-reserve').empty();
     });
     });
     folderDialog.on('hidden.bs.modal', function () {
     folderDialog.on('hidden.bs.modal', function () {
         setDangerInfo($('#folder-name-info'), '', false);
         setDangerInfo($('#folder-name-info'), '', false);
@@ -2523,7 +2593,7 @@ function setInitSummaryData(data) {
     data.totalCost = 0;
     data.totalCost = 0;
 }
 }
 
 
-function AddTenderItems(selected, projName, tenderName, property, callback, errCB){
+function AddTenderItems(selected, projName, tenderName, projectProperty, property, callback, errCB){
     const addPath = {p_t: 'p_t', t: 't'};
     const addPath = {p_t: 'p_t', t: 't'};
     let path, updateDatas = [];
     let path, updateDatas = [];
     let tempProjs = getProjs(selected);
     let tempProjs = getProjs(selected);
@@ -2552,7 +2622,7 @@ function AddTenderItems(selected, projName, tenderName, property, callback, errC
                 pre = selectedProj;
                 pre = selectedProj;
                 next = selectedProj ? selectedProj.nextSibling : projTreeObj.tree.firstNode();
                 next = selectedProj ? selectedProj.nextSibling : projTreeObj.tree.firstNode();
             }
             }
-            let updateProjs = GetUpdateData(pre, parent, next, projName, null, projID, {updateType: 'new', projectType: projectType.project});
+            let updateProjs = GetUpdateData(pre, parent, next, projName, projectProperty, projID, {updateType: 'new', projectType: projectType.project});
             property.rootProjectID = projID;
             property.rootProjectID = projID;
             let updateTender = {updateType: 'new', updateData: {ID: tenderID, ParentID: projID, NextSiblingID: -1,
             let updateTender = {updateType: 'new', updateData: {ID: tenderID, ParentID: projID, NextSiblingID: -1,
                 name: tenderName, projType: projectType.tender, property: property}};
                 name: tenderName, projType: projectType.tender, property: property}};
@@ -2840,6 +2910,27 @@ function setFileOptions(projID){
     }
     }
 }
 }
 
 
+// 根据建设项目是否有项目类型属性,控制新建单位时,单位工程项目类别选项的可见性和只读性
+// 主要是兼容性处理:新建分段时,如果建设项目已有项目类型,则分段的项目类型、清单类型同建设项目的,窗口中只读;如果建设项目中没有,则可选择(是为了兼容养护的旧项目)
+function handleTenderValuationTypeViewState(projectID) {
+    if (!projectID) {
+        return changeValuationType(BUDGET);
+    }
+    const projectNode = projTreeObj.tree.findNode(projectID) ;// 建设项目节点
+    if (!projectNode) {
+        return changeValuationType(BUDGET);
+    }
+    const projectValuationType = projectNode.data.property.valuationType;
+    if (projectValuationType) {
+        changeValuationType(projectValuationType);
+        $('input[name="valuation_type"]').attr('disabled', 'disabled');
+    } else {
+        //恢复成默认选中预算项目类别。
+        changeValuationType(BUDGET);
+        $('input[name="valuation_type"]').removeAttr('disabled');
+    }
+}
+
 //建设项目下拉框
 //建设项目下拉框
 function setProjOptions(projs, selected){
 function setProjOptions(projs, selected){
     $("#poj-name-list").empty();
     $("#poj-name-list").empty();
@@ -2849,13 +2940,16 @@ function setProjOptions(projs, selected){
         $("#poj-name").val(firstProj.data.name);
         $("#poj-name").val(firstProj.data.name);
         setFileOptions(firstProj.data.ID);
         setFileOptions(firstProj.data.ID);
         for(let i = 0, len = projs.length; i < len; i++){
         for(let i = 0, len = projs.length; i < len; i++){
-            let $proj = $(`<a class='text-ellipsis' title="${projs[i].data.name}">`).val(projs[i].data.ID).text(projs[i].data.name);
+            let $proj = $(`<a class='text-ellipsis' title="${projs[i].data.name}" data-id="${projs[i].data.ID}">`).val(projs[i].data.ID).text(projs[i].data.name);
             $proj.addClass("dropdown-item");
             $proj.addClass("dropdown-item");
             $proj.attr("href", "javascript:void(0);");
             $proj.attr("href", "javascript:void(0);");
             $proj.click(function () {
             $proj.click(function () {
                 $("#poj-name").val(projs[i].data.name);
                 $("#poj-name").val(projs[i].data.name);
                 setFileOptions(projs[i].data.ID);
                 setFileOptions(projs[i].data.ID);
                 $('#poj-name-info').hide();
                 $('#poj-name-info').hide();
+                $('#tender-reserve').empty();
+                $('#val-type-group').show();
+                handleTenderValuationTypeViewState(projs[i].data.ID);
             });
             });
             $("#poj-name-list").append($proj);
             $("#poj-name-list").append($proj);
         }
         }
@@ -2958,10 +3052,27 @@ function AddTender() {
         //如果是新建费率的情况
         //如果是新建费率的情况
         if(feeFileObj.id.indexOf("newFeeRate")!=-1) feeFileObj.id +=feeLibID;
         if(feeFileObj.id.indexOf("newFeeRate")!=-1) feeFileObj.id +=feeLibID;
         let valuationName = $("#valuation").children("option:selected").text();
         let valuationName = $("#valuation").children("option:selected").text();
-        let valuationType = $("input[name='valuation_type']:checked").val();
+        const projectInfo = {};
+        // 单位工程项目类型、清单类型则跟着建设项目可选项走
+        const selectedItem = projTreeObj.tree.selected;
+        const tempProjs = getProjs(selectedItem);
+        const matchedProject = getNodeByName(projName, tempProjs);
+        let valuationType;
+        let boqType;
+        if (matchedProject) {
+            valuationType = matchedProject.data.property.valuationType || $("input[name='valuation_type']:checked").val();
+            boqType = matchedProject.data.property.boqType || null;
+        } else {
+            valuationType = $("input[name='valuation-type']:checked").val(); // 建设项目选项
+            projectInfo.valuationType = valuationType;
+            if (valuationType === BOQ) {
+                boqType = +$("input[name='boq-type-input']:checked").val(); // 建设项目选项
+                projectInfo.boqType = boqType;
+            }
+        }
 
 
         let engineering = undefined;
         let engineering = undefined;
-        let valuationData = valuationType === 'bill' ? JSON.parse(billValuation) : JSON.parse(rationValuation);
+        let valuationData = valuationType === BUDGET ? JSON.parse(billValuation) : JSON.parse(rationValuation);
         let engineeringList = [];
         let engineeringList = [];
         for(let tmp of valuationData) {
         for(let tmp of valuationData) {
             if (tmp.id === valuation) {
             if (tmp.id === valuation) {
@@ -3010,7 +3121,6 @@ function AddTender() {
                 STATE.addingTender = false;
                 STATE.addingTender = false;
             }, 500);
             }, 500);
         };
         };
-        let selectedItem = projTreeObj.tree.selected;
         //地区
         //地区
         let region = $('#regionDiv').find('select').val() || '全省';
         let region = $('#regionDiv').find('select').val() || '全省';
         let tenderInfo = {
         let tenderInfo = {
@@ -3033,7 +3143,10 @@ function AddTender() {
             progressiveLibID:progressiveLibID,
             progressiveLibID:progressiveLibID,
             region: region
             region: region
         };
         };
-        AddTenderItems(selectedItem, projName, tenderName, tenderInfo, callback, errCB);
+        if (boqType) {
+            tenderInfo.boqType = boqType;
+        }
+        AddTenderItems(selectedItem, projName, tenderName, projectInfo, tenderInfo, callback, errCB);
 
 
     } catch (error) {
     } catch (error) {
         alert(error);
         alert(error);

+ 1 - 1
web/building_saas/unit_price_file/index.html

@@ -5,7 +5,7 @@
     <meta charset="utf-8">
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
-    <title>纵横公路养护云造价</title>
+    <title><%= title%></title>
 
 
 
 
     <link rel="stylesheet" href="/lib/jquery-ui/jquery-ui.css" type="text/css">
     <link rel="stylesheet" href="/lib/jquery-ui/jquery-ui.css" type="text/css">

+ 3 - 0
web/common/html/header.html

@@ -1,4 +1,7 @@
 <img id="f_btn" src="/web/dest/css/img/feeRate_btn.jpg" alt="" style="display: none" />
 <img id="f_btn" src="/web/dest/css/img/feeRate_btn.jpg" alt="" style="display: none" />
+<% if(typeof socketPort != 'undefined'){ %>
+<input id="socketPort" value="<%= socketPort %>" type="hidden">
+<% } %>
 <div class="top-msg clearfix">
 <div class="top-msg clearfix">
     <div class="alert alert-warning alert-dismissible" role="alert" id="notify" style="display: none">
     <div class="alert alert-warning alert-dismissible" role="alert" id="notify" style="display: none">
         <button type="button" class="close" aria-label="Close" onclick="$('#notify').hide();">
         <button type="button" class="close" aria-label="Close" onclick="$('#notify').hide();">

+ 1 - 1
web/users/html/login-infoinput.html

@@ -5,7 +5,7 @@
     <meta charset="utf-8">
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
-    <title>用户信息填写-纵横公路养护云造价</title>
+    <title>用户信息填写-<%= title%></title>
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">

+ 2 - 2
web/users/html/login-sms.html

@@ -4,7 +4,7 @@
     <meta charset="utf-8">
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
-    <title>用户登录-纵横公路养护云造价</title>
+    <title>用户登录-<%= title%></title>
     <!-- inject:css -->
     <!-- inject:css -->
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
@@ -17,7 +17,7 @@
     <div class="login-bg"></div>
     <div class="login-bg"></div>
     <div class="container login-panel">
     <div class="container login-panel">
         <form class="form-signin">
         <form class="form-signin">
-            <h1 class="d-flex justify-content-center mb-5"><img src="/web/building_saas/img/building.png" width="40" height="40" class="mr-3" style="margin-top: 5px"> 纵横公路养护云造价</h1>
+            <h1 class="d-flex justify-content-center mb-5"><img src="/web/building_saas/img/building.png" width="40" height="40" class="mr-3" style="margin-top: 5px"> <%= title%></h1>
             <p class="mb-1">您关闭了「账号登录」,请通过手机验证码登录。</p>
             <p class="mb-1">您关闭了「账号登录」,请通过手机验证码登录。</p>
             <p class="">请点击“获取验证码”,验证码将发送至手机 <%= mobile.substr(0, 3) + '****' + mobile.substr(7, 11) %>,注意查收。</p>
             <p class="">请点击“获取验证码”,验证码将发送至手机 <%= mobile.substr(0, 3) + '****' + mobile.substr(7, 11) %>,注意查收。</p>
             <div class="form-row sms-login-modal">
             <div class="form-row sms-login-modal">

+ 2 - 2
web/users/html/login-ver.html

@@ -4,7 +4,7 @@
     <meta charset="utf-8">
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
-    <title>用户登录-纵横公路养护云造价</title>
+    <title>用户登录-<%= title%></title>
     <!-- inject:css -->
     <!-- inject:css -->
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
@@ -17,7 +17,7 @@
     <div class="login-bg"></div>
     <div class="login-bg"></div>
     <div class="container login-panel ver-panel">
     <div class="container login-panel ver-panel">
             <h1 class="d-flex justify-content-center mb-5">
             <h1 class="d-flex justify-content-center mb-5">
-                <img src="/web/building_saas/img/building.png" width="40" height="40" class="mr-3" style="margin-top: 5px"> 纵横公路养护云造价</h1>
+                <img src="/web/building_saas/img/building.png" width="40" height="40" class="mr-3" style="margin-top: 5px"> <%= title%></h1>
             <div class="d-flex justify-content-between">
             <div class="d-flex justify-content-between">
                 <h5 class="modal-title">选择费用定额</h5>
                 <h5 class="modal-title">选择费用定额</h5>
                 <p class=" text-warning"><i class="fa fa-exclamation-triangle"></i> <b>登录设置</b> 中可以修改您的登录习惯。</p>
                 <p class=" text-warning"><i class="fa fa-exclamation-triangle"></i> <b>登录设置</b> 中可以修改您的登录习惯。</p>

+ 2 - 2
web/users/html/login.html

@@ -4,7 +4,7 @@
     <meta charset="utf-8">
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
-    <title>用户登录-纵横公路养护云造价</title>
+    <title>用户登录-<%= title%></title>
     <!-- inject:css -->
     <!-- inject:css -->
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
@@ -20,7 +20,7 @@
         <form class="form-signin" method="post" onsubmit="return false">
         <form class="form-signin" method="post" onsubmit="return false">
             <h1 class="d-flex justify-content-center mb-5">
             <h1 class="d-flex justify-content-center mb-5">
                 <img src="/web/building_saas/img/building.png" width="40" height="40" class="mr-3" style="margin-top: 5px">
                 <img src="/web/building_saas/img/building.png" width="40" height="40" class="mr-3" style="margin-top: 5px">
-                纵横公路养护云造价
+                <%= title%>
             </h1>
             </h1>
             <div class="form-group user-login-modal">
             <div class="form-group user-login-modal">
                 <input id="inputEmail" class="form-control " name="inputEmail" placeholder="通行账号 邮箱/手机" autofocus="" />
                 <input id="inputEmail" class="form-control " name="inputEmail" placeholder="通行账号 邮箱/手机" autofocus="" />

+ 1 - 1
web/users/html/user-buy.html

@@ -5,7 +5,7 @@
     <meta charset="utf-8">
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
-    <title>产品激活-纵横公路养护造价</title>
+    <title>产品激活-<%= title%></title>
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">

+ 1 - 1
web/users/html/user-info.html

@@ -10,7 +10,7 @@
     <meta charset="utf-8">
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
-    <title>企业资料-纵横公路养护造价</title>
+    <title>企业资料-<%= title%></title>
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">

+ 1 - 1
web/users/html/user-safe.html

@@ -5,7 +5,7 @@
     <meta charset="utf-8">
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
-    <title>账号安全-纵横公路养护造价</title>
+    <title>账号安全-<%= title%></title>
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">

+ 1 - 1
web/users/html/user-set.html

@@ -5,7 +5,7 @@
     <meta charset="utf-8">
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
-    <title>登录设置-纵横公路养护造价</title>
+    <title>登录设置-<%= title%></title>
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">