Browse Source

Merge branch 'master' of http://192.168.1.12:3000/SmartCost/ConstructionCost

TonyKang 8 years ago
parent
commit
4b8e364d43
35 changed files with 4358 additions and 364 deletions
  1. 128 7
      modules/fee_rates/controllers/fee_rates_controller.js
  2. 5 7
      modules/fee_rates/controllers/feerate_template.js
  3. 186 6
      modules/fee_rates/facade/fee_rates_facade.js
  4. 31 5
      modules/fee_rates/models/fee_rates.js
  5. 9 1
      modules/fee_rates/routes/fee_rates_route.js
  6. 3 1
      modules/glj/models/glj_list_model.js
  7. 4 2
      modules/std_fee_rate_libs/models/std_fee_rate_libs.js
  8. 13 2
      modules/users/controllers/boot_controller.js
  9. 15 6
      modules/users/controllers/login_controller.js
  10. 15 7
      modules/users/controllers/user_controller.js
  11. 39 0
      modules/users/models/compilation_model.js
  12. 89 0
      modules/users/models/schema/compilation.js
  13. 0 26
      modules/users/models/schema/version.js
  14. 0 35
      modules/users/models/version_model.js
  15. 1 1
      modules/users/routes/boot_route.js
  16. 0 15
      public/web/socket/connection.js
  17. 1 0
      public/web/uuid.js
  18. 1 1
      socket.js
  19. 138 7
      web/building_saas/fee_rates/fee_rate.html
  20. 7 1
      web/building_saas/js/global.js
  21. 10 3
      web/building_saas/main/html/main.html
  22. 18 0
      web/building_saas/main/html/ration_pm.html
  23. 102 16
      web/building_saas/main/js/models/fee_rate.js
  24. 3190 142
      web/building_saas/main/js/models/ration_program.js
  25. 240 40
      web/building_saas/main/js/views/fee_rate_view.js
  26. 2 2
      web/building_saas/main/js/views/project_view.js
  27. 8 6
      web/building_saas/main/js/views/ration_calc_view.js
  28. 77 0
      web/building_saas/main/js/views/ration_programs_manage.js
  29. 0 10
      web/building_saas/main/js/views/sub_fee_rate_views.js
  30. 4 0
      web/building_saas/main/js/views/sub_view.js
  31. 2 2
      web/building_saas/pm/html/project-management.html
  32. 12 5
      web/glj/html/glj_index.html
  33. 1 1
      web/glj/js/project_glj_spread.js
  34. 3 3
      web/users/html/user-set.html
  35. 4 4
      web/users/js/login.js

+ 128 - 7
modules/fee_rates/controllers/fee_rates_controller.js

@@ -5,6 +5,9 @@
 const uuidV1 = require('uuid/v1');
 let mongoose = require('mongoose');
 let feeRateModel = mongoose.model('fee_rates');
+let feeRateFileModel = mongoose.model('fee_rate_file');
+let feeRateFacde=require('../facade/fee_rates_facade');
+
 let template = require('./feerate_template');
 /*
 var stdFeeRateLibs = require('../../std_fee_rate_libs/models/std_fee_rate_libs');
@@ -44,13 +47,131 @@ module.exports = {
 
 
 module.exports = {
-    libNames: function (req, res) {
-        var region = req.body.region;
-        let temObject = template.feerate_template2;
-        temObject.ID=uuidV1();
-        feeRateModel.create(temObject,function (err,doc) {
-            res.json({data: doc});
-        });
+    libNames: libNames,
+    getFeeRateStandards:getFeeRateStandards,
+    changeFeeRateStandard:changeFeeRateStandard,
+    checkFeeRateName:checkFeeRateName,
+    getChangeInfo:getChangeInfo,
+    changeFeeRateFileFromCurrent:changeFeeRateFileFromCurrent,
+    changeFeeRateFileFromOthers:changeFeeRateFileFromOthers
+}
+
+function libNames(req, res) {
+    // var region = req.body.region;
+    let temObject = template.feerate_template1;
+    var feeRate = {};
+    feeRate.ID = uuidV1();
+    feeRate.rates = temObject.rates;
+    var feeRateFile = {};
+    feeRateFile.ID = uuidV1();
+    feeRateFile.rootProjectID =99;
+    feeRateFile.name = '费率1';
+    feeRateFile.libID = temObject.ID;
+    feeRateFile.libName = temObject.libName;
+    feeRateFile.feeRateID = feeRate.ID;
+
+    feeRateModel.create(feeRate,function (err,doc) {
+
+    });
 
+    feeRateFileModel.create(feeRateFile,function (err,doc) {
+
+    });
+}
+
+
+function getFeeRateStandards(req, res) {
+    let result={
+        error:0
     }
+    try {
+        let data = req.body.data;
+        let feeRateStandards= feeRateFacde.getFeeRateStandardsByProjectID(data.rootProjectID);
+        result.data= feeRateStandards;
+    }catch (err){
+        console.log(err);
+        result.error=1;
+        result.message = err.message;
+    }
+    res.json(result);
 }
+
+async function changeFeeRateStandard(req, res) {
+    let result={
+        error:0
+    }
+    try {
+        let data = req.body.data;
+        let newFeeRateFile= await feeRateFacde.changeFeeRateStandard(data);
+        result.data= newFeeRateFile;
+    }catch (err){
+        console.log(err);
+        result.error=1;
+        result.message = err.message;
+    }
+    res.json(result);
+}
+
+async function checkFeeRateName(req, res) {
+    let result={
+        error:0
+    }
+    try {
+        let data = req.body.data;
+        let nameExist= await feeRateFacde.checkFeeRateName(data);
+        result.data= nameExist;
+    }catch (err){
+        console.log(err);
+        result.error=1;
+        result.message = err.message;
+    }
+    res.json(result);
+}
+
+async function getChangeInfo(req, res) {
+    let result={
+        error:0
+    }
+    try {
+        let data = req.body.data;
+        let info= await feeRateFacde.getChangeInfo(data);
+        result.data= info;
+    }catch (err){
+        console.log(err);
+        result.error=1;
+        result.message = err.message;
+    }
+    res.json(result);
+}
+
+async function changeFeeRateFileFromCurrent(req, res) {
+    let result={
+        error:0
+    }
+    try {
+        let data = req.body.data;
+        let feeRateFile= await feeRateFacde.changeFeeRateFileFromCurrent(data);
+        result.data= feeRateFile;
+    }catch (err){
+        console.log(err);
+        result.error=1;
+        result.message = err.message;
+    }
+    res.json(result);
+}
+
+async function changeFeeRateFileFromOthers(req, res) {
+    let result={
+        error:0
+    }
+    try {
+        let data = req.body.data;
+        let feeRateFile= await feeRateFacde.changeFeeRateFileFromOthers(data);
+        result.data= feeRateFile;
+    }catch (err){
+        console.log(err);
+        result.error=1;
+        result.message = err.message;
+    }
+    res.json(result);
+}

+ 5 - 7
modules/fee_rates/controllers/feerate_template.js

@@ -4,10 +4,9 @@
 
 module.exports={
     feerate_template1:{
-        "libID": 2,
-        "libName": "重庆2016年标准",
-        "projectID": 99,
-        "status": "activate",
+        "ID": '2',
+        "libName": "重庆渝建发[2016]35号",
+        "region": '重庆',
         "rates": [
             {
                 "ID": 1,
@@ -646,10 +645,9 @@ module.exports={
             }]
     },
     feerate_template2:{
-        "libID": 2,
+        "ID": '3',
         "libName": "北京2009年标准",
-        "projectID": 99,
-        "status": "disable",
+        "region": '北京',
         "rates": [
             {
                 "ID": 1,

+ 186 - 6
modules/fee_rates/facade/fee_rates_facade.js

@@ -5,12 +5,23 @@
 let async_n = require("async");
 let mongoose = require('mongoose');
 let feeRateModel = mongoose.model('fee_rates');
+let feeRateFileModel = mongoose.model('fee_rate_file');
+let std_fee_rate_lib_model = mongoose.model('std_fee_rate_libs');
+let project_feerate_temp = mongoose.model('project_feerate_temp');
 let consts = require('../../main/models/project_consts');
 let _=require("lodash");
+let template = require('../controllers/feerate_template');
+const uuidV1 = require('uuid/v1');
 
 module.exports={
     save:save,
-    getData:getData
+    getData:getData,
+    getFeeRateStandardsByProjectID:getFeeRateStandardsByProjectID,
+    changeFeeRateStandard:changeFeeRateStandard,
+    checkFeeRateName:checkFeeRateName,
+    getChangeInfo:getChangeInfo,
+    changeFeeRateFileFromCurrent:changeFeeRateFileFromCurrent,
+    changeFeeRateFileFromOthers:changeFeeRateFileFromOthers
 };
 let operationMap={
     'ut_create':create_fee_rate,
@@ -21,9 +32,19 @@ let operationMap={
 let updateFunctionMap = {
     'normalUpdate':normalUpdate,
     'update_rates':update_rates,
-    'updateStatusBySelected':updateStatusBySelected
+    'updateStatusBySelected':updateStatusBySelected,
+    'feeRateFileSaveAs':feeRateFileSaveAs
 }
 
+//测试数据 key projectID, value feeRateFileID
+let project_feeRateF_map={
+    99:'da059df1-7c18-11e7-9e2f-1390b52643b4'
+}
+
+
+
+
+
 function create_fee_rate() {
 
 }
@@ -45,6 +66,40 @@ function updateStatusBySelected(user_id,datas) {
 
     }
 }
+function feeRateFileSaveAs(user_id,datas) {
+    return function(callback){
+        let doc = datas.doc;
+        let projectID=datas.query.projectID;
+        let feeRate={
+            ID:doc.feeRateID,
+            rates:doc.rates
+        };
+        delete doc._id;
+        delete doc.rates;
+        creatFeeRateFile(doc,feeRate,projectID).then(function (result) {
+            commonCallback(callback,result,result.err);
+        })
+
+    }
+}
+
+
+async function creatFeeRateFile(feeRateFile,feeRate,projectID) {//预留projectID
+    let result={
+        err:null
+    }
+    try {
+        await project_feerate_temp.findOneAndUpdate({projectID:projectID},{feeRateFileID:feeRateFile.ID});
+        await feeRateFileModel.create(feeRateFile);
+        await  feeRateModel.create(feeRate);
+    }catch (err){
+        console.log(err);
+        result.err=err;
+    }
+    return result;
+}
+
+
 function normalUpdate(user_id,datas) {
     return function(callback){
         console.log(datas)
@@ -69,7 +124,6 @@ function  generateUpdateTaks(updateTasks) {
 
 function update_rates(user_id,datas) {
     return function(callback){
-        console.log(datas);
         feeRateModel.findOne(datas.query,['rates'],function(err, data){
             let doc = datas.doc;
             if(_.isArray(doc)){
@@ -113,19 +167,145 @@ function save (user_id, datas, callback) {
 }
 
 function getData(projectID, callback) {
-    feeRateModel.find({'projectID':projectID}).exec((err,datas)=>{
-        if(err){
+    getFeeRateData(projectID).then(function (result) {
+        if(result.err){
             callback(1, '', null);
         }else {
-            callback(0, consts.projectConst.FEERATE, datas);
+            //feeRateModel
+            callback(0, consts.projectConst.FEERATE, result.datas);
         }
     })
 }
 
+async function getFeeRateData(projectID) {
+    // to do 需根据projectID查找对应的费率文件
+    let result={
+        err:null
+    }
+    try {
+        //
+        let tem = await project_feerate_temp.findOne({projectID:projectID});//暂时取tem表的记录
+        let feeRateData = await feeRateFileModel.findOne({'ID':tem.feeRateFileID,deleteInfo:null});
+        let feeRate = await feeRateModel.findOne({ID:feeRateData.feeRateID});
+        feeRateData._doc.rates = feeRate.rates;
+        //
+        feeRateData._doc.usageProjects=getUsageProjects(feeRateData.ID);
+        result.datas = feeRateData;
+    }catch (err){
+        console.log(err);
+        result.err=err;
+    }
+    return result;
+}
+
+function getUsageProjects(feeRateID){
+   //从数据库中查,项目结构暂时还没做 todo
+    var projects = [];
+    projects.push({ID:99,name:'单价调整'});
+    projects.push({ID:100,name:'工程02'});
+    projects.push({ID:101,name:'建筑工程'});
+    return projects;
+}
+
+
 function commonCallback(callback,result,err) {
     if(err){
         callback(err,'');
     }else {
         callback(null,result);
     }
+}
+
+function getFeeRateStandardsByProjectID(rootProjectID) {
+    //这里应该从项目配置中读取 to do, 暂时使用模板文件里的数据
+    let t1 = template.feerate_template1;
+    let t2 = template.feerate_template2;
+
+    let feeRateStandards=[];
+    feeRateStandards.push({ID:t1.ID,libName:t1.libName});
+    feeRateStandards.push({ID:t2.ID,libName:t2.libName});
+    return feeRateStandards;
+}
+
+async function changeFeeRateStandard(jdata){
+    let data = JSON.parse(jdata);
+    let template = await std_fee_rate_lib_model.findOne({"ID":data.newLibID});
+    let newFeeRate = {};
+    newFeeRate.ID =uuidV1();
+    newFeeRate.rates=template.rates;
+    await feeRateModel.create(newFeeRate);
+    let doc={
+        libID:data.newLibID,
+        libName:template.libName,
+        feeRateID: newFeeRate.ID
+    };
+    let deleteInfo = {deleted: true, deleteDateTime: new Date(), deleteBy: data.user_id};
+    await feeRateFileModel.findOneAndUpdate({ID:data.feeRateFileID,deleteInfo:null},doc);
+    await feeRateModel.findOneAndUpdate({ID:data.feeRateID},{deleteInfo:deleteInfo});
+    doc.rates=newFeeRate.rates;
+    return doc;
+}
+
+async function checkFeeRateName(jdata) {
+    let data = JSON.parse(jdata);
+    let count = await feeRateFileModel.count({rootProjectID:data.rootProjectID,name:data.name,deleteInfo:null});
+    if(count>0){
+        return true;
+    }
+    return false;
+}
+
+async function getChangeInfo(jdata){
+    let data = JSON.parse(jdata);
+    //{ projectID: 99, user_id: '76075' }
+    let result={};
+    let currentProject = {projectID:99,name:'建设项目1'};//dummy 数据
+    currentProject.currentOptions=await feeRateFileModel.find({rootProjectID:data.projectID,deleteInfo:null},['ID','name']);
+    //根据用户ID 找除了当前项目的其它建设项目;
+    let others = [
+        {projectID:100,name:'建设项目2',optionList:[
+            {ID:'590cf860-7d99-11e7-90b0-e3a3dfdb2116',name:'2-test另存'},
+            {ID:'c55718d0-7d98-11e7-b3b4-cfc9038d29b0',name:'2-费率B'},
+            {ID:'da059df1-7c18-11e7-9e2f-1390b52643b4',name:'2-费率A'}
+        ] },
+        {projectID:101,name:'建设项目3',optionList:currentProject.currentOptions },
+        {projectID:102,name:'建设项目4',optionList:currentProject.currentOptions },
+    ]
+    result.currentProject=currentProject;
+    result.others = others;
+    return result;
+}
+
+async function changeFeeRateFileFromCurrent(jdata){
+    let data = JSON.parse(jdata);
+    let result = await  project_feerate_temp.findOneAndUpdate({projectID:data.projectID},{feeRateFileID:data.newFeeRateFileID});
+    let feeRateData = await feeRateFileModel.findOne({'ID':data.newFeeRateFileID});
+    let feeRate = await feeRateModel.findOne({ID:feeRateData.feeRateID});
+    feeRateData._doc.rates = feeRate.rates;
+    //
+    feeRateData._doc.usageProjects=getUsageProjects(feeRateData.ID);
+    return feeRateData;
+}
+
+async function changeFeeRateFileFromOthers(jdata) {
+    let data = JSON.parse(jdata);
+    console.log(data);
+    let feeRateFile = await feeRateFileModel.findOne({'ID':data.feeRateFileID});
+    let feeRate = await feeRateModel.findOne({ID:feeRateFile.feeRateID});
+    let newFeeRate={};
+    newFeeRate.ID=uuidV1();
+    newFeeRate.rates =feeRate.rates;
+    let newFeeRateFile = {};
+    newFeeRateFile.ID = uuidV1();
+    newFeeRateFile.name = data.name;
+    newFeeRateFile.libName = feeRateFile.libName;
+    newFeeRateFile.libID=feeRateFile.libID;
+    newFeeRateFile.rootProjectID = data.rootProjectID;
+    newFeeRateFile.feeRateID =newFeeRate.ID;
+    await feeRateModel.create(newFeeRate);
+    await feeRateFileModel.create(newFeeRateFile);
+    await project_feerate_temp.findOneAndUpdate({projectID:data.projectID},{feeRateFileID:newFeeRateFile.ID});
+    newFeeRateFile.rates=newFeeRate.rates;
+    newFeeRateFile.usageProjects=getUsageProjects(newFeeRateFile.ID);
+    return newFeeRateFile;
 }

+ 31 - 5
modules/fee_rates/models/fee_rates.js

@@ -4,6 +4,7 @@
 
 let mongoose = require('mongoose');
 let Schema = mongoose.Schema;
+let deleteSchema = require('../../../public/models/delete_schema');
 // {ID:1,name:'工程分类',optionList:[{name:'一类工程',value:1,selected:true},{name:'二类工程',value:2,selected:false},{name:'三类工程',value:3,selected:false},{name:'四类工程',value:4,selected:false}]},
 let optionSchema = new Schema({
     name:String,
@@ -38,15 +39,40 @@ let ratesSchema = new Schema({
 
 let feeRatesSchema = new Schema({
     ID: String,
-    libID: Number,
-    libName: String,
+    rates: [ratesSchema],
+    deleteInfo: deleteSchema
+},{versionKey:false});
+
+mongoose.model('fee_rates', feeRatesSchema, 'fee_rates');
+
+
+let feeRateFileSchema = new Schema({
+    ID: String,
+    rootProjectID:Number,//顶层项目ID
     name:String,
-    projectID:Number,
-    status:String,
+    libID: String,
+    libName: String,
+    feeRateID:String,//关联的费率ID
+    deleteInfo: deleteSchema
+},{versionKey:false});
+
+mongoose.model('fee_rate_file', feeRateFileSchema, 'fee_rate_file');
+
+
+
+let feeRatesLibSchema = new Schema({
+    ID: String,
+    region: String,                     // 工程所在地
+    libName: String,
     rates: [ratesSchema]
 },{versionKey:false});
 
-mongoose.model('fee_rates', feeRatesSchema, 'fee_rates');
+mongoose.model('std_fee_rate_libs', feeRatesLibSchema, 'std_fee_rate_libs');
 
 
+let temSchema = new Schema({
+    projectID:Number,
+    feeRateFileID:String
+},{versionKey:false})
 
+mongoose.model('project_feerate_temp', temSchema, 'project_feerate_temp');

+ 9 - 1
modules/fee_rates/routes/fee_rates_route.js

@@ -9,9 +9,17 @@ module.exports = function (app) {
 
     var frRouter = express.Router();
     frRouter.get('/', function(req, res) {
+        frController.libNames(req, res);
         res.render('building_saas/fee_rates/fee_rate', {});
     });
-    frRouter.post('/getLibNames', frController.libNames);
+    frRouter.post('/getFeeRateStandards', frController.getFeeRateStandards);
+    frRouter.post('/changeFeeRateStandard', frController.changeFeeRateStandard);
+    frRouter.post('/checkFeeRateName', frController.checkFeeRateName);
+    frRouter.post('/getChangeInfo', frController.getChangeInfo);
+    frRouter.post('/changeFeeRateFileFromCurrent', frController.changeFeeRateFileFromCurrent);
+    frRouter.post('/changeFeeRateFileFromOthers', frController.changeFeeRateFileFromOthers);
+
+    //
 /*    frRouter.post('/getLibNames', frController.libNames);
     frRouter.post('/getLibFeeRates', frController.libFeeRates);
     frRouter.post('/getProjectFeeRates', frController.projectFeeRates);

+ 3 - 1
modules/glj/models/glj_list_model.js

@@ -100,7 +100,6 @@ class GLJListModel extends BaseModel {
                     projectGLJCode.push(tmp.code);
                 }
             }
-
             // 从定额工料机库中获取消耗量
             condition = {
                 projectID: projectId,
@@ -144,8 +143,11 @@ class GLJListModel extends BaseModel {
 
             // 排序
             gljData.sort(function (a, b) {
+                a.unit_price = a.unit_price === null ? 0 : a.unit_price;
+                b.unit_price = b.unit_price === null ? 0 : b.unit_price;
                 return a.unit_price.type - b.unit_price.type;
             });
+
         } catch (error) {
             console.log("glj_list_model:" + error);
             gljData = [];

+ 4 - 2
modules/std_fee_rate_libs/models/std_fee_rate_libs.js

@@ -1,6 +1,7 @@
-/**
+/*
+/!**
  * Created by CSL on 2017-03-22.
- */
+ *!/
 
 var mg = require('mongoose');
 var dbm = require("../../../config/db/db_manager");
@@ -50,3 +51,4 @@ StdFeeRateLibs.prototype.rates = function(libID, controllerFun){
 module.exports = new StdFeeRateLibs();
 
 
+*/

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

@@ -5,8 +5,9 @@
  * @date 2017/6/12
  * @version
  */
-import UserModel from "../models/user_model";
 import BaseController from "../../common/base/base_controller";
+import UserModel from "../models/user_model";
+import CompilationModel from "../models/compilation_model";
 
 class BootController extends BaseController {
 
@@ -20,6 +21,16 @@ class BootController extends BaseController {
     async boot(request, response) {
         let userModel = new UserModel();
         let sessionUser = request.session.sessionUser;
+        let compilationId = request.params.compilation;
+        let sessionCompilation = request.session.sessionCompilation;
+
+        // 判断是否有存入编办信息
+        if (sessionCompilation === undefined && compilationId !== '') {
+            let compilationModel = new CompilationModel();
+            let compilationData = await compilationModel.findDataByCondition({_id: compilationId});
+
+            request.session.sessionCompilation = compilationData;
+        }
         // 判断是否已填写信息
         let userData = await userModel.findDataByCondition({_id: sessionUser.id});
         if (userData.company !== '' && userData.real_name !== '') {
@@ -30,7 +41,7 @@ class BootController extends BaseController {
             provinceList: userModel.province,
             companyTypeList: userModel.companyType,
             companyScaleList: userModel.companyScale,
-            version: request.params.version
+            compilation: request.params.compilation
         };
         response.render('users/html/login-infoinput', renderData);
     }

+ 15 - 6
modules/users/controllers/login_controller.js

@@ -7,7 +7,7 @@
  */
 import UserModel from "../models/user_model";
 import SettingModel from "../models/setting_model";
-import VersionModel from "../models/version_model";
+import CompilationModel from "../models/compilation_model";
 
 class LoginController {
 
@@ -38,7 +38,7 @@ class LoginController {
         let account = request.body.account;
         let password = request.body.pw;
         let preferenceSetting = {};
-        let versionList = [];
+        let compilationList = [];
         try {
             // 调用接口验证登录信息
             let userModel = new UserModel();
@@ -72,15 +72,24 @@ class LoginController {
                 throw '标记用户信息失败!';
             }
 
-            // 获取版本信息
-            let versionModel = new VersionModel();
-            versionList = await versionModel.getVersionData();
+            let compilationModel = new CompilationModel();
+            compilationList = preferenceSetting.login_ask === 1 ? await compilationModel.getList() : [];
+
+            // 获取编办信息
+            let sessionCompilation = request.session.sessionCompilation;
+            if (preferenceSetting.login_ask === 0 && sessionCompilation === undefined &&
+                preferenceSetting.select_version !== '') {
+                let compilationData = await compilationModel.findDataByCondition({_id: preferenceSetting.select_version});
+
+                request.session.sessionCompilation = compilationData;
+            }
+
 
         } catch (error) {
             console.log(error);
             return response.json({error: 1, msg: error});
         }
-        response.json({error: 0, msg: '', login_ask: preferenceSetting.login_ask, version_list: JSON.stringify(versionList)});
+        response.json({error: 0, msg: '', login_ask: preferenceSetting.login_ask, compilation_list: JSON.stringify(compilationList)});
     }
 
 }

+ 15 - 7
modules/users/controllers/user_controller.js

@@ -11,7 +11,7 @@ import LogType from "../../common/const/log_type_const";
 import LogModel from "../models/log_model";
 import SettingModel from "../models/setting_model";
 import SettingType from "../../common/const/setting_type_const";
-import VersionModel from "../models/version_model";
+import CompilationModel from "../models/compilation_model";
 
 class UserController extends BaseController {
 
@@ -89,7 +89,6 @@ class UserController extends BaseController {
             let sessionUser = request.session.sessionUser;
             let userModel = new UserModel();
             userData = await userModel.findDataByName(sessionUser.username);
-            userData = userData.length <= 0 ? [] : userData[0];
 
             let page = request.query.page === undefined ? 1 : request.query.page;
 
@@ -127,15 +126,15 @@ class UserController extends BaseController {
     async preferences(request, response) {
         let sessionUserData = request.session.sessionUser;
         let preferenceSetting = {};
-        let versionList = [];
+        let compilationList = [];
         try {
             // 获取配置信息
             let settingModel = new SettingModel();
             preferenceSetting = await settingModel.getPreferenceSetting(sessionUserData.id);
 
-            // 获取版本信息
-            let versionModel = new VersionModel();
-            versionList = await versionModel.getVersionData();
+            // 获取编办信息
+            let compilationModel = new CompilationModel();
+            compilationList = await compilationModel.getList();
 
         } catch(error) {
             console.log(error);
@@ -143,7 +142,7 @@ class UserController extends BaseController {
 
         let renderData = {
             preferenceSetting: preferenceSetting,
-            versionList: versionList
+            compilationList: compilationList
         };
         response.render('users/html/user-set', renderData);
     }
@@ -171,6 +170,15 @@ class UserController extends BaseController {
             if (!result) {
                 throw '保存失败';
             }
+
+            // 保存编办信息到session
+            if (data.login_ask === 1) {
+                // 查找对应编办
+                let compilationModel = new CompilationModel();
+                let compilationData = await compilationModel.findDataByCondition({_id: selectVersion});
+
+                request.session.sessionCompilation = compilationData;
+            }
         } catch (error) {
             console.log(error);
         }

+ 39 - 0
modules/users/models/compilation_model.js

@@ -0,0 +1,39 @@
+/**
+ * 编办业务逻辑
+ *
+ * @author CaiAoLin
+ * @date 2017/8/16
+ * @version
+ */
+import BaseModel from "../../common/base/base_model";
+import CompilationSchema from "./schema/compilation";
+
+class CompilationModel extends BaseModel {
+
+    /**
+     * 构造函数
+     *
+     * @return {void}
+     */
+    constructor() {
+        let parent = super();
+        parent.model = CompilationSchema;
+        parent.init();
+    }
+
+    /**
+     * 获取编办列表
+     *
+     * @return {Promise}
+     */
+    async getList() {
+        // 筛选字段
+        let field = {_id: 1, name: 1, is_release: 1};
+        let compilationData = await this.findDataByCondition({name: {$ne: ''}}, field, false);
+
+        return compilationData === null ? [] : compilationData;
+    }
+
+}
+
+export default CompilationModel;

+ 89 - 0
modules/users/models/schema/compilation.js

@@ -0,0 +1,89 @@
+/**
+ * 编办管理数据模型
+ *
+ * @author CaiAoLin
+ * @date 2017/7/28
+ * @version
+ */
+import mongoose from "mongoose";
+
+let Schema = mongoose.Schema;
+let collectionName = 'compilation';
+let childrenSchema = new Schema({
+    // 计价名称
+    name: String,
+    // 工程专业
+    engineering: {
+        type: Number,
+        default: ''
+    },
+    // 标准清单
+    bill_lib: {
+        type: Schema.Types.Mixed,
+        default: []
+    },
+    // 定额库
+    ration_lib: {
+        type: Schema.Types.Mixed,
+        default: []
+    },
+    // 工料机库
+    glj_lib: {
+        type: Schema.Types.Mixed,
+        default: []
+    },
+    // 是否启用
+    enable: {
+        type: Boolean,
+        default: false
+    },
+    // 类型
+    type: {
+        type: Number
+    },
+    // 列设置
+    main_tree_col: {
+        type: Schema.Types.Mixed,
+        default: {
+            "emptyRows":3,
+            "headRows":0,
+            "treeCol": 0,
+            "headRowHeight":[],
+            "cols":[]
+        }
+    }
+});
+let modelSchema = {
+    // 是否发布
+    is_release: {
+        type: Boolean,
+        default: false
+    },
+    // 自增id
+    id: {
+        type: Number
+    },
+    // 清单计价规则
+    bill_valuation: {
+        type: [childrenSchema],
+        default: []
+    },
+    // 定额计价规则
+    ration_valuation: {
+        type: [childrenSchema],
+        default: []
+    },
+    // 名称
+    name: String,
+    // 创建时间
+    create_time: Number,
+    // 创建者id
+    creator: String,
+    // 发布时间
+    release_time: {
+        type: Number,
+        default: 0
+    }
+};
+let model = mongoose.model(collectionName, new Schema(modelSchema, {versionKey: false, collection: collectionName}));
+export {model as default, collectionName as collectionName};

+ 0 - 26
modules/users/models/schema/version.js

@@ -1,26 +0,0 @@
-/**
- * 版本管理数据模型
- *
- * @author CaiAoLin
- * @date 2017/7/28
- * @version
- */
-import mongoose from "mongoose";
-
-let Schema = mongoose.Schema;
-let collectionName = 'version';
-let modelSchema = {
-    // 自增id
-    id: {
-        type: Number,
-        index: true
-    },
-    // 名称
-    name: String,
-    // 标准清单
-    standard_bill: Schema.Types.Mixed,
-    // 定额库
-    ration_lib: Schema.Types.Mixed
-};
-let model = mongoose.model(collectionName, new Schema(modelSchema, {versionKey: false, collection: collectionName}));
-export {model as default, collectionName as collectionName};

+ 0 - 35
modules/users/models/version_model.js

@@ -1,35 +0,0 @@
-/**
- * 版本管理业务逻辑模型
- *
- * @author CaiAoLin
- * @date 2017/8/1
- * @version
- */
-import BaseModel from "../../common/base/base_model";
-import VersionSchema from "./schema/version";
-
-class VersionModel extends BaseModel {
-
-    /**
-     * 构造函数
-     *
-     * @return {void}
-     */
-    constructor () {
-        let parent = super();
-        parent.model = VersionSchema;
-        parent.init();
-    }
-
-    /**
-     * 获取版本数据
-     *
-     * @return {Promise}
-     */
-    getVersionData() {
-        return this.findDataByCondition({name: {$ne: ''}}, {_id: 1, name: 1}, false);
-    }
-
-}
-
-export default VersionModel;

+ 1 - 1
modules/users/routes/boot_route.js

@@ -13,6 +13,6 @@ module.exports=function (app){
     let bootController = new BootController();
 
 // 引导页面
-    router.get('/:version', bootController.boot);
+    router.get('/:compilation', bootController.boot);
     app.use('/boot', router);
 };

+ 0 - 15
public/web/socket/connection.js

@@ -22,20 +22,5 @@ socketObject={
           //window.location.reload();
       })
 
-      /*   socket.on('connect', function () {
-       socket.emit('join', roomId);
-       console.log('连接成功');
-       });
-
-       // 接收到改变
-       socket.on('dataChange', function(data) {
-       data = JSON.parse(data);
-       if (data.newValue === undefined) {
-       return false;
-       }
-       changeInfo.push(data);
-       $("#message").html('市场单位已被修改,<a href="javascript:void(0);" id="load-data">点击加载</a>');
-       $("#notify").slideDown('fast');
-       });*/
   }
 }

File diff suppressed because it is too large
+ 1 - 0
public/web/uuid.js


+ 1 - 1
socket.js

@@ -12,7 +12,7 @@ const socketIO = socket(3300);
 // socket.io相关操作
 socketIO.on('connection', function(socket) {
     let roomId = '';
-
+    console.log("new connection");
     // 加入房间
     socket.on('join', function(data) {
         roomId = data;

+ 138 - 7
web/building_saas/fee_rates/fee_rate.html

@@ -11,8 +11,9 @@
 <body >
 <div class="toolsbar px-1">
     <div class="form-inline py-1">
-        <div class="col-lg-6" > <button id="selctFeeFile">选择费率文件</button></div>
-        <div class="col-lg-3" style="text-align: center"> 费率文件: <span id="projectName"></span></div>
+        <label class="mx-2" >当前使用:<span id="feeRateFileName">费率1</span>(<a href="#" id="pop-lv"><span id="projectCount">3</span> 单位工程使用</a>)
+            <a class="btn btn-sm ml-1" href="#" data-toggle="modal" data-target="#change-lv" id="changFeeRateFile"><i class="fa fa-exchange"></i> 选择其他</a>
+            <a class="btn btn-sm ml-1" href="#" data-toggle="modal" id="saveAs" data-target="#copy-lv"><i class="fa fa-files-o"></i> 另存单独用</a></label>
     </div>
 </div>
 <div class="container-fluid">
@@ -21,11 +22,8 @@
             <div class="row">
                 <div class="col-lg-6">
                     <div class="form-inline py-1">
-                        <label class="mx-2" for="inlineFormCustomSelect">费率标准:</label>
-                        <select class="form-control form-control-sm" id="inlineFormCustomSelect">
-
-                        </select>
-                        <span>&nbsp;</span>
+                        <label class="mx-2" >基于&nbsp;&nbsp;<span id="feeRateLibName">重庆渝建发[2016]35号</span></label>
+                        <a class="btn btn-sm ml-1" href="#" data-toggle="modal" data-target="#set-lv" id="setNewFeeRate"><i class="fa fa-cog"></i> 重选标准</a>
                     </div>
                     <div class=" grid  main-data-top" id="divFee"></div>
                 </div>
@@ -37,8 +35,141 @@
         </div>
     </div>
 </div>
+<!--弹出更换-->
+<div class="modal fade" id="change-lv" 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">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <div class="form-group">
+                    <label class="custom-control custom-radio">
+                        <input id="radio1" name="chaneg-lv-Radio" type="radio" value="0" onclick="changeFRadioClick()" class="custom-control-input" checked>
+                        <span class="custom-control-indicator"></span>
+                        <span class="custom-control-description">从本建设项目中选择</span>
+                    </label>
+                    <label class="custom-control custom-radio">
+                        <input id="radio2" name="chaneg-lv-Radio" type="radio" value="1" onclick="changeFRadioClick()" class="custom-control-input">
+                        <span class="custom-control-indicator"></span>
+                        <span class="custom-control-description">从其他建设项目中复制</span>
+                    </label>
+                </div>
+                <!--从本建设项目中选择-->
+                <div class="form-group" id="fromProject">
+                    <label id="currentProject">建设项目A</label>
+                    <select class="form-control" id="currentOptions"><option>费率1</option><option>费率2</option><option>费率3</option></select>
+                </div>
+                <!--从其他建设项目中复制-->
+                <div id="fromOther" >
+                    <div class="form-group">
+                        <label>选择建设项目</label>
+                        <select class="form-control" id="otherProject"><option>建设项目B</option><option>建设项目C</option><option>建设项目D</option></select>
+                    </div>
+                    <div class="form-group">
+                        <select class="form-control" id="otherFeeRateOption"><option>费率1</option><option>费率2</option><option>费率3</option></select>
+                        <small class="form-text text-muted">你选择的费率文件将复制一份至新项目,不会影响原建设项目的费率文件。</small>
+                    </div>
+                </div>
+
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <button type="button"  class="btn btn-primary" data-dismiss="modal" id="changeFeeRateConfirm">确定</button>
+            </div>
+        </div>
+    </div>
+</div>
+<!--弹出设置-->
+<div class="modal fade" id="set-lv" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">费率1 重选标准</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <div class="form-group">
+                    <label >费率标准</label>
+                    <select class="form-control" id="standardSelect"></select>
+                    <small class="form-text text-danger">重新选择费率标准将重置当前费率文件的所有费率,正在使用当前费率文件的其他单位工程也将受影响。</small>
+                </div>
+                <div class="form-group">
+                    <label>正在使用 费率1 的单位工程</label>
+                    <ul class="list-unstyled" id="usageProjectList">
+
+                    </ul>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <button type="button" class="btn btn-primary" id="changeConfirm" data-dismiss="modal">确定</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--弹出 另存新文件-->
+<div class="modal fade" id="copy-lv" 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">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <div class="form-group">
+                    <label>费率文件名称</label>
+                    <input class="form-control" id="copyFeeRateName" value="">
+                    <!--默认为复制费率文件名字+副本 2字,用户修改后需判断是否在同项目下存在同名-->
+                    <small class="form-text text-danger" id="nameError" style="display: none">已存在同名费率文件。</small>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <button type="button" class="btn btn-primary" data-dismiss="modal" id="saveAsConfirm">确定</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--弹出 重命名窗口-->
+<div class="modal fade" id="rename-lv" 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">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <div class="form-group">
+                    <label>费率文件名称</label>
+                    <input class="form-control" id="newFeeRateID" value="" style="display: none">
+                    <input class="form-control" id="newFeeRateName" value="">
+                    <small class="form-text text-danger" id="renameError">本建设项目中已存在同名费率文件。</small>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <button type="button" class="btn btn-primary" data-dismiss="modal" id="renameConfirm" disabled>确定</button>
+            </div>
+        </div>
+    </div>
+</div>
+
 
 </body>
+
 <script src="/web/glj/js/socket.io.slim.js"></script>
 <script src="/public/web/socket/connection.js"></script>
+<script src="/public/web/uuid.js"></script>
 </html>

+ 7 - 1
web/building_saas/js/global.js

@@ -13,9 +13,15 @@ function autoFlashHeight(){
     $(".side-content").height($(window).height()-headerHeight );
     $(".poj-list").height($(window).height()-headerHeight-toolsbarHeight);
     $(".form-list").height($(window).height()-headerHeight-50 );
-    $(".grid").height($(window).height()-headerHeight-50 );
+    $(".grid").height($(window).height()-headerHeight-toolsbarHeight-50);
 
 };
+// 获取get参数
+function getQueryString(name) {
+    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
+    var r = window.location.search.substr(1).match(reg);
+    if (r != null) return unescape(r[2]); return null;
+}
 $(window).resize(autoFlashHeight);
 /*全局自适应高度结束*/
 $(function(){

+ 10 - 3
web/building_saas/main/html/main.html

@@ -92,7 +92,7 @@
         <div class="main-nav">
             <ul class="nav nav-tabs flex-column" role="tablist">
                 <li class="nav-item"><a class="active" data-toggle="tab" href="#zaojiashu" role="tab">造价书</a></li>
-                <li class="nav-item"><a data-toggle="tab" href="#gongliaoji" role="tab">工料机</a></li>
+                <li class="nav-item"><a href="#" id="glj-link">工料机</a></li>
                 <li class="nav-item"><a data-toggle="tab" href="#fee_rates" id="tab_fee_rate" role="tab" onclick="">费率</a></li>
                 <li class="nav-item"><a data-toggle="tab" href="#baobiao" role="tab" onclick="">报表</a></li>
             </ul>
@@ -153,6 +153,9 @@
                                   <li class="nav-item">
                                       <a class="nav-link" id="linkDESM" data-toggle="tab" href="#subSpread" role="tab">定额说明</a>
                                   </li>
+                                  <li class="nav-item">
+                                      <a class="nav-link" id="linkJSCXGL" data-toggle="tab" href="#subSpread" role="tab">计算程序管理</a>
+                                  </li>
                               </ul>
                               <!-- Tab panes -->
                               <div class="tab-content">
@@ -491,7 +494,7 @@
     <script src="/lib/spreadjs/views/gc.spread.views.dataview.10.0.0.min.js" type="text/javascript"></script>
     <!--<script src="/lib/spreadjs/views/common/gc.spread.common.10.0.0.min.js" type="text/javascript"></script>-->
     <script src="/lib/spreadjs/views/plugins/gc.spread.views.gridlayout.10.0.0.min.js" type="text/javascript"></script>
-    <script src="/lib/spreadjs/views/locale/gc.spread.views.dataview.locale.zh-CN.10.0.0.min.js" type="text/javascript"></script>
+    <!--<script src="/lib/spreadjs/views/locale/gc.spread.views.dataview.locale.zh-CN.10.0.0.min.js" type="text/javascript"></script>-->
     <script>GC.Spread.Views.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</script>
 
 
@@ -547,6 +550,7 @@
     <script type="text/javascript" src="/web/building_saas/main/js/views/glj_view.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/views/ration_calc_view.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/views/sub_view.js"></script>
+    <script type="text/javascript" src="/web/building_saas/main/js/views/ration_programs_manage.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/views/fee_rate_view.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/views/sub_fee_rate_views.js"></script>
 
@@ -605,8 +609,11 @@
   			count();
   		}
 
-  		$(document).ready(function(){
+        $(document).ready(function(){
   			//createTree();
+            // 获取project
+            var projectId = getQueryString('project');
+            $("#glj-link").attr("href", "/glj?project=" + projectId);
             rptTplObj.iniPage();
   		});
   		//-->

+ 18 - 0
web/building_saas/main/html/ration_pm.html

@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head lang="en">
+    <meta charset="UTF-8">
+    <title>计算程序管理</title>
+    <script src="/lib/jquery/jquery.min.js"></script>
+    <link rel="stylesheet" href="/lib/spreadjs/sheets/css/gc.spread.sheets.excel2013lightGray.10.0.1.css" type="text/css">
+    <script type="text/javascript" src="/lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
+    <script type="text/javascript" src="/public/web/sheet/sheet_common.js"></script>
+    <script type="text/javascript" src="/web/building_saas/main/js/models/ration_program.js"></script>
+    <script type="text/javascript" src="/web/building_saas/main/js/views/ration_programs_manage.js"></script>
+</head>
+<body>
+<div id="mainSpread" style="width:30%;height:400px;position:absolute;"></div>
+<div id="detailSpread" style="width:100%;height:400px;position:absolute;bottom:5px;"></div>
+
+</body>
+</html>

+ 102 - 16
web/building_saas/main/js/models/fee_rate.js

@@ -25,12 +25,12 @@ var FeeRate = {
             return rates;
         };*/
         FeeRate.prototype.getActivateFeeRate = function () {
-            var feeRate=null;
-            _.forEach(this.datas,function (item) {
-                if(item.status == 'activate'){
-                    feeRate= item;
-                }
-            })
+            var feeRate={
+                rates:[]
+            };
+            if(this.datas){
+                feeRate = this.datas;
+            }
             return feeRate;
         };
         FeeRate.prototype.getActivateFeeRateID = function(){
@@ -106,8 +106,7 @@ var FeeRate = {
         };
         FeeRate.prototype.updateFeeRateByEdit = function(params,feerate){
             var query={
-                ID:feerate.ID,
-                projectID:feerate.projectID
+                ID:feerate.feeRateID
             };
             var doc ={
                 rateIndex:params.sourceIndex,
@@ -121,8 +120,7 @@ var FeeRate = {
 
         FeeRate.prototype.batchUpdateFeeRate = function (items,feerate) {
             var query={
-                ID:feerate.ID,
-                projectID:project.ID()
+                ID:feerate.feeRateID
             };
             this.updateFeeRate(query,items);
         };
@@ -143,26 +141,114 @@ var FeeRate = {
         };
         FeeRate.prototype.synchronizeFeeRate = function () {
             var node = project.mainTree.selected;
-            if (node.sourceType==='ration'&&rationCalcView.sheet) {
-                rationCalcView.showData(node);
+            if(node){
+                if (node.sourceType==='ration'&&rationCalcView.sheet) {
+                    rationCalcView.showData(node);
+                }
             }
         };
-
         FeeRate.prototype.ifRateChange=function (params) {
             if(params.dataItem.rate!=params.oldDataItem.rate){
                 return true;
             }else {
                 return false;
             }
+        };
+        FeeRate.prototype.changeFeeRateStandard=function(newVal,callback){
+            var me =this;
+            var feeRate = this.getActivateFeeRate();
+            var data={
+                "newLibID": newVal,
+                "feeRateFileID":feeRate.ID,
+                "feeRateID":feeRate.feeRateID,
+                "user_id":userID
+            };
+            CommonAjax.post('/feeRates/changeFeeRateStandard', data, function (data) {
+                if (data) {
+                    me.datas.libID=data.libID;
+                    me.datas.libName=data.libName;
+                    me.datas.feeRateID=data.feeRateID;
+                    me.datas.rates=data.rates;
+                    socket.emit('feeRateChangeNotify', me.getActivateFeeRateID());
+                    callback();
+                }
+            });
+        };
+        FeeRate.prototype.checkFeeRateName = function(newVal,callback){
+            var me =this;
+            var feeRate = this.getActivateFeeRate();
+            var data = {
+                name:newVal,
+                rootProjectID:feeRate.rootProjectID
+            }
+            CommonAjax.post('/feeRates/checkFeeRateName', data, function (data) {
+                callback(data);
+            });
+        };
+        FeeRate.prototype.feeRateFileSaveAs = function (newName) {
+            this.datas.name = newName;
+            this.datas.ID = uuid.v1();
+            this.datas.feeRateID=uuid.v1();
+            this.datas.usageProjects=[];
+            this.datas.usageProjects.push({name:projectInfoObj.projectInfo.name,ID:projectInfoObj.projectInfo.ID});
+            var updateData = this.getUpdateData('ut_update',{projectID:projectInfoObj.projectInfo.ID},this.datas,'feeRateFileSaveAs');
+            project.pushNow('updateFeeRate',[this.sourceType],updateData);
 
+            socket.emit('feeRateChangeNotify', this.getActivateFeeRateID());
+            return  this.datas;
+        };
+        FeeRate.prototype.getChangeInfo = function (callback) {
+            var projectID = projectInfoObj.projectInfo.ID; //这里暂时用的是当前项目的ID,以后要改成顶层的建设项目ID
+            var data={
+                "projectID": projectID,
+                "user_id":userID
+            };
+            CommonAjax.post('/feeRates/getChangeInfo', data, function (data) {
+                callback(data);
+            });
         };
 
-        FeeRate.prototype.getRate = function (fileID, rateID){
+        FeeRate.prototype.changeFeeRateFileFromCurrent = function (newFeeRateFileID,callback){
+            var me=this;
+            var projectID = projectInfoObj.projectInfo.ID;
+            var data={
+                "projectID": projectID,
+                "newFeeRateFileID":newFeeRateFileID
+            };
+            CommonAjax.post('/feeRates/changeFeeRateFileFromCurrent', data, function (data) {
+                if (data) {
+                    me.datas=data;
+                    socket.emit('feeRateChangeNotify', me.getActivateFeeRateID());
+                    callback();
+                }
+            });
+        };
 
+        FeeRate.prototype.changeFeeRateFileFromOthers=function (feeRateFileID,name,callback) {
+            var me = this;
+            var projectID = projectInfoObj.projectInfo.ID;
+            var data={
+                "projectID": projectID,
+                "feeRateFileID":feeRateFileID,
+                "name":name,
+                "rootProjectID":me.getActivateFeeRate().rootProjectID
+            };
+            CommonAjax.post('/feeRates/changeFeeRateFileFromOthers', data, function (data) {
+                if (data) {
+                    me.datas=data;
+                    socket.emit('feeRateChangeNotify', me.getActivateFeeRateID());
+                    callback();
+                }
+            });
+
+        };
+
+        FeeRate.prototype.getRate = function (fileID, rateID){
             return 1.25;
-        }
+        };
 
         var feeRate = new FeeRate(project);
         return feeRate;
-    }
+    },
+
 };

File diff suppressed because it is too large
+ 3190 - 142
web/building_saas/main/js/models/ration_program.js


+ 240 - 40
web/building_saas/main/js/views/fee_rate_view.js

@@ -2,36 +2,7 @@
  * Created by chen on 2017/8/1.
  */
 
-/*var rate_data = [
-    {"ID":1,"ParentID":null,"name":"企业管理费","rate":null,"memo":""},
-{"ID":101,"ParentID":1,"name":"建筑工程","rate":16.36,"memo":""},
-{"ID":102,"ParentID":1,"name":"市政工程","rate":17.43,"memo":""},
-{"ID":103,"ParentID":1,"name":"机械土石方","rate":10.82,"memo":""},
-{"ID":104,"ParentID":1,"name":"仿古建筑工程","rate":12,"memo":""},
-{"ID":105,"ParentID":1,"name":"建筑修缮工程","rate":12.47,"memo":""},
-{"ID":106,"ParentID":1,"name":"炉窑砌筑工程","rate":10.8,"memo":""},
-{"ID":2,   "ParentID":null,"name":"夜间施工费","rate":null,"memo":""},
-{"ID":201,"ParentID":2,"name":"建筑工程","rate":0.45,"memo":""},
-{"ID":202,"ParentID":2,"name":"市政工程","rate":0.4,"memo":""},
-{"ID":203,"ParentID":2,"name":"机械土石方","rate":0.7,"memo":""},
-{"ID":204,"ParentID":2,"name":"仿古建筑工程","rate":0.2,"memo":""},
-{"ID":205,"ParentID":2,"name":"建筑修缮工程","rate":0.35,"memo":""},
-{"ID":206,"ParentID":2,"name":"炉窑砌筑工程","rate":0.4,"memo":""},
-{"ID":3,   "ParentID":null,"name":"规费","rate":null,"memo":""},
-{"ID":301,"ParentID":3,"name":"建筑工程","rate":16.03,"memo":""},
-{"ID":302,"ParentID":3,"name":"市政工程","rate":16.33,"memo":""},
-{"ID":303,"ParentID":3,"name":"机械土石方","rate":15.5,"memo":""},
-{"ID":304,"ParentID":3,"name":"仿古建筑工程","rate":12,"memo":""},
-{"ID":305,"ParentID":3,"name":"建筑修缮工程","rate":12.47,"memo":""},
-{"ID":306,"ParentID":3,"name":"炉窑砌筑工程","rate":10.8,"memo":""},
-{"ID":4,"ParentID":null,"name":"利润","rate":null,"memo":""},
-{"ID":401,"ParentID":4,"name":"建筑工程","rate":8.73,"memo":""},
-{"ID":402,"ParentID":4,"name":"市政工程","rate":9.2,"memo":""},
-{"ID":403,"ParentID":4,"name":"机械土石方","rate":6.5,"memo":""},
-{"ID":404,"ParentID":4,"name":"仿古建筑工程","rate":7,"memo":""},
-{"ID":405,"ParentID":4,"name":"建筑修缮工程","rate":3.72,"memo":""},
-{"ID":406,"ParentID":4,"name":"炉窑砌筑工程","rate":4.9,"memo":""},
-{"ID":5,"ParentID":null,"name":"税金","rate":11,"memo":""}];*/
+
 
 var feeRateObject={
     mainViews:null,
@@ -40,6 +11,7 @@ var feeRateObject={
     activateFeeRate:null,
     needCascadeSet:false,
     selectionLoad:false,
+    changeInfo:null,
     columns: [
         {
             id: 'name',
@@ -242,6 +214,13 @@ var feeRateObject={
 
         projectObj.project.FeeRate.batchUpdateFeeRate(items,feeRateObject.activateFeeRate);
     },
+    loadPageContent:function(){
+        var feeRateFile = projectObj.project.FeeRate.getActivateFeeRate();
+        var usageProjects = feeRateFile.usageProjects;
+        $('#feeRateFileName').text(feeRateFile.name);
+        $('#feeRateLibName').text(feeRateFile.libName);
+        $('#projectCount').text(usageProjects.length);
+    },
     loadFeeRateSelection:function() {
         if(!this.selectionLoad){
             var selectedID=0;
@@ -254,22 +233,243 @@ var feeRateObject={
             })
             $('#inlineFormCustomSelect').val(selectedID);
         }
+    },
+    getFeeRateStandards:function (callback) {
+        CommonAjax.post('/feeRates/getFeeRateStandards', {"rootProjectID": this.activateFeeRate.rootProjectID}, function (data) {
+            if (data) {
+                callback(data);
+            }
+        });
+    },
+    changeFeeRateStandard:function(newVal){
+        var callback=function () {
+            feeRateObject.createSpreadView();
+            feeRateObject.loadPageContent();
+            projectObj.project.FeeRate.synchronizeFeeRate();
+        };
+        projectObj.project.FeeRate.changeFeeRateStandard(newVal,callback);
+    },
+    checkFeeRateName:function (newVal) {
+        if(!newVal||newVal==""){
+            $('#saveAsConfirm').attr("disabled","disabled");
+            $('#nameError').text("请输入文件名称。").show();
+            return;
+        }
+        var callback=function (data) {
+            if(data){
+                $('#saveAsConfirm').attr("disabled","disabled");
+                $('#nameError').text("已存在同名费率文件。").show();
+            }else {
+                $('#saveAsConfirm').removeAttr("disabled");
+                $('#nameError').hide();
+            }
+            console.log(data);
+        };
+        projectObj.project.FeeRate.checkFeeRateName(newVal,callback);
+    },
+    feeRateFileSaveAs:function (newName) {
+        this.activateFeeRate =  projectObj.project.FeeRate.feeRateFileSaveAs(newName);
+        feeRateObject.loadPageContent();
+    },
+    getChangeInfo:function () {
+        var me = this;
+        var callback=function (data) {
+            me.changeInfo=data;
+            me.loadChangePageContent(data);
+            console.log(data);
+        };
+        projectObj.project.FeeRate.getChangeInfo(callback);
+    },
+    loadChangePageContent:function (data) {
+        $('#currentProject').text(data.currentProject.name);
+        $('#currentOptions').empty();
+        _.forEach(data.currentProject.currentOptions,function (s) {
+            var option =  $("<option>").val(s.ID).text(s.name);
+            $('#currentOptions').append(option);
+        })
+        $('#currentOptions').val(projectObj.project.FeeRate.getActivateFeeRateID());
+        $('#otherProject').empty();
+        _.forEach(data.others,function (p) {
+            var option =  $("<option>").val(p.projectID).text(p.name);
+            $('#otherProject').append(option);
+        });
+        $('#otherFeeRateOption').empty();
+        if(data.others.length>0){
+            _.forEach(data.others[0].optionList,function (f) {
+                var option =  $("<option>").val(f.ID).text(f.name);
+                $('#otherFeeRateOption').append(option);
+            });
+        }
+    },
+    changeFeeRateFileFromCurrent:function(){
+        var newVal = $("#currentOptions").val();
+        if($("#currentOptions").val()==this.activateFeeRate.ID){
+            return;
+        }
+        var callback=function () {
+            feeRateObject.createSpreadView();
+            feeRateObject.loadPageContent();
+            projectObj.project.FeeRate.synchronizeFeeRate();
+        }
+        projectObj.project.FeeRate.changeFeeRateFileFromCurrent(newVal,callback);
+    },
+    changeFeeRateFileFromOthers:function () {
+        var feeRateFileID = $("#otherFeeRateOption").val();
+        var name =$("#otherFeeRateOption").find("option:selected").text();
+        var currentOption = _.find(this.changeInfo.currentProject.currentOptions,{name:name})
+        if(currentOption){
+            $("#rename-lv").modal({show:true});
+            $("#newFeeRateID").val(feeRateFileID);
+            $("#newFeeRateName").val(name);
+        }else {
+            this.changeFeeRateFileConfirm(feeRateFileID,name);
+        }
+    },
+    changeFeeRateFileConfirm:function(feeRateFileID,name){
+        var callback=function () {
+            feeRateObject.createSpreadView();
+            feeRateObject.loadPageContent();
+            projectObj.project.FeeRate.synchronizeFeeRate();
+        }
+        projectObj.project.FeeRate.changeFeeRateFileFromOthers(feeRateFileID,name,callback);
     }
 }
 
+function getPopoverContent() {
+    var feeRateFile = projectObj.project.FeeRate.getActivateFeeRate();
+    var usageProjects = feeRateFile.usageProjects;
+    var popover_content = "";
+    _.forEach(usageProjects,function (p,index) {
+        if(index>0){
+            popover_content+='<br>';
+        }
+        popover_content+=p.name;
+    })
+    return popover_content;
+}
+
+$('#pop-lv').popover({
+        placement:"bottom",
+        html:true,
+        trigger:"hover | focus",
+        content:getPopoverContent
+    }
+);
+
+
 $('#tab_fee_rate').bind('click', function () {
-    $("#de").trigger("click");
     feeRateObject.reFreshRateViews();
-    $('#projectName').text(projectInfoObj.projectInfo.name);
-    feeRateObject.loadFeeRateSelection();
+    feeRateObject.loadPageContent();
+    //feeRateObject.loadFeeRateSelection();
 });
 
-/*$('#fee_rates').bind('click', function () {
-    feeRateObject.datas[0].name = 'test';
-    feeRateObject.mainViews.refresh();
-    feeRateObject.mainViews.invalidate();
+$('#setNewFeeRate').bind('click', function () {
+    var feeRateFile = projectObj.project.FeeRate.getActivateFeeRate();
+    var usageProjects = feeRateFile.usageProjects;
+    var listString ='';
+    _.forEach(usageProjects,function (u) {
+        listString+="<li>"+u.name+"</li>"
+    })
+    $("#usageProjectList").html(listString);
+
+    feeRateObject.getFeeRateStandards(function (data) {
+        $('#standardSelect').empty();
+        _.forEach(data,function (s) {
+            var option =  $("<option>").val(s.ID).text(s.libName);
+            $('#standardSelect').append(option);
+        })
+        $('#standardSelect').val(feeRateFile.libID);
+    });
+
+});
+$('#changeConfirm').bind('click', function (){
+    var newVal=$('#standardSelect').val();
+    var feeRateFile = projectObj.project.FeeRate.getActivateFeeRate();
+    if(newVal&&newVal!=feeRateFile.libID){
+        feeRateObject.changeFeeRateStandard(newVal);
+    }
+});
+
+$('#saveAs').bind('click', function (){
+    var feeRateFile = projectObj.project.FeeRate.getActivateFeeRate();
+    $('#copyFeeRateName').val(feeRateFile.name+'副本');
+});
+
+$('#saveAsConfirm').bind('click',function () {
+    feeRateObject.feeRateFileSaveAs($('#copyFeeRateName').val());
+})
+
+
+$('#copyFeeRateName').change(function () {
+    feeRateObject.checkFeeRateName(this.value);
+});
+
+$('#newFeeRateName').change(function () {
+    var newName = $(this).val();
+    if(!newName||newName==""){
+        $('#renameConfirm').attr("disabled","disabled");
+        $('#renameError').text("请输入文件名称。").show();
+        return;
+    }
+    var callback=function (data) {
+        if(data){
+            $('#renameConfirm').attr("disabled","disabled");
+            $('#renameError').text("本建设项目中已存在同名费率文件。").show();
+        }else {
+            $('#renameConfirm').removeAttr("disabled");
+            $('#renameError').hide();
+        }
+    };
+    projectObj.project.FeeRate.checkFeeRateName(newName,callback);
+});
+
+
+function changeFRadioClick() {
+    var radioV= $("input[name='chaneg-lv-Radio']:checked").val();
+    if(radioV==='0'){
+        $("#fromProject").show();
+        $("#fromOther").hide();
+    }else {
+        $("#fromProject").hide();
+        $("#fromOther").show();
+    }
+}
+$('#changeFeeRateConfirm').bind('click',function (){
+    var radioV= $("input[name='chaneg-lv-Radio']:checked").val();
+    if(radioV==='0'){
+        feeRateObject.changeFeeRateFileFromCurrent();
+    }else {
+        feeRateObject.changeFeeRateFileFromOthers();
+    }
+
+})
+
+
+
+$('#changFeeRateFile').bind('click',function (){
+    $("input[name='chaneg-lv-Radio']")[0].checked=true;
+    $("#fromProject").show();
+    $("#fromOther").hide();
+    feeRateObject.getChangeInfo();
+})
+
+$('#otherProject').change(function(){
+    var newVal = $(this).val();
+    var projects = feeRateObject.changeInfo.others;
+    var selected = _.find(projects,{projectID:parseInt(newVal)});
+    $('#otherFeeRateOption').empty();
+    _.forEach(selected.optionList,function (f) {
+        var option =  $("<option>").val(f.ID).text(f.name);
+        $('#otherFeeRateOption').append(option);
+    });
+})
+
+$('#renameConfirm').bind('click',function (){
+    var feeRateFileID= $("#newFeeRateID").val();
+    var name = $("#newFeeRateName").val();
+    feeRateObject.changeFeeRateFileConfirm(feeRateFileID,name);
+})
 
-});*/
 
 $('#inlineFormCustomSelect').change(function(){
     var updateTask = [];
@@ -284,11 +484,11 @@ $('#inlineFormCustomSelect').change(function(){
         }else {
             feeRate.status='disable';
         }
-        updateTask.push({query:{ID:feeRate.ID,projectID:projectObj.project.ID()},doc:{status:feeRate.status}});
+        updateTask.push({query:{ID:feeRate.feeRateID},doc:{status:feeRate.status}});
     })
     projectObj.project.FeeRate.updateStatusBySelected(updateTask);
     feeRateObject.createSpreadView();
     subRateObject.destorySpreadView();
     socket.emit('changeActivateFeeRate',{oldRoom:oldValue,newRoom:selectID});
+})
 
-})

+ 2 - 2
web/building_saas/main/js/views/project_view.js

@@ -168,8 +168,8 @@ var projectObj = {
 
             }
         });
-        this.rationProgram = new RationProgram(this.project);
-        this.rationProgram.compileAllTemps();
+        this.project.rationProgram = new RationProgram(this.project);
+        this.project.rationProgram.compileAllTemps();
     },
     loadMainSpreadContextMenu: function () {
         var project = this.project, spread = this.mainSpread, controller = this.mainController;

+ 8 - 6
web/building_saas/main/js/views/ration_calc_view.js

@@ -4,7 +4,7 @@
 
 let rationCalcView = {
     sheet: null,
-    ration: null,
+    treeNode: null,
 
     setting: {
         header: [
@@ -29,17 +29,19 @@ let rationCalcView = {
         sheetCommonObj.initSheet(me.sheet, me.setting, 20);
     },
 
-    showData: function (ration) {
+    showData: function (treeNode) {
         var me = this;
-        me.ration = ration;
-        projectObj.rationProgram.calculate(me.ration);
-        me.datas = me.ration.data.calcTemplate.calcItems;
+        me.treeNode = treeNode;
+        projectObj.project.rationProgram.calculate(treeNode);
+        me.datas = me.treeNode.data.calcTemplate.calcItems;
+        //me.sheet.setRowCount(me.datas.length);
+        sheetCommonObj.initSheet(me.sheet, me.setting, me.datas.length);
         sheetCommonObj.showData(me.sheet, me.setting, me.datas);
     },
 
     clearData: function (){
         var me = this;
-        me.ration = null;
+        me.treeNode = null;
         sheetCommonObj.cleanSheet(me.sheet, me.setting, -1);
     }
 

+ 77 - 0
web/building_saas/main/js/views/ration_programs_manage.js

@@ -0,0 +1,77 @@
+/**
+ * Created by CSL on 2017-08-03.
+ * 计算程序管理。
+ */
+let rationPM = {
+    datas: [],
+    mainSpread: null,
+    detailSpread: null,
+
+    mainSetting: {
+        header:[
+            {headerName:"ID",headerWidth:80,dataCode:"ID", hAlign: "center"},
+            {headerName:"名称",headerWidth:200,dataCode:"name", dataType: "String"}
+        ],
+        view:{
+            comboBox:[],
+            lockColumns:[0,1]
+        }
+    },
+
+    detailSetting: {
+        header:[
+            {headerName:"ID",headerWidth:80,dataCode:"ID", hAlign: "center"},
+            {headerName:"费用代号",headerWidth:80,dataCode:"code", dataType: "String"},
+            {headerName:"费用名称",headerWidth:200,dataCode:"name", dataType: "String"},
+            {headerName:"计算基数",headerWidth:180,dataCode:"dispExpr", dataType: "String"},
+            {headerName:"基数说明",headerWidth:300,dataCode:"statement", dataType: "String"},
+            {headerName:"费率",headerWidth:80,dataCode:"feeRate", dataType: "Number"},
+            {headerName:"字段名称",headerWidth:180,dataCode:"fieldName", dataType: "String"},
+            {headerName:"备注",headerWidth:100,dataCode:"memo", dataType: "String"}
+        ],
+        view:{
+            comboBox:[],
+            lockColumns:[0,1,2,3,4,5,6,7]
+        }
+    },
+
+    buildSheet: function (){
+        let me = this;
+        me.datas = calcTemplates;
+        me.mainSpread = sheetCommonObj.buildSheet($('#mainSpread')[0], me.mainSetting, 16);
+        me.detailSpread = sheetCommonObj.buildSheet($('#detailSpread')[0], me.detailSetting, 18);
+
+        //var coeType = new GC.Spread.Sheets.CellTypes.ComboBox();
+        //coeType.items(["单个","定额","人工","材料","机械"]);
+        //me.detailSpread.getSheet(0).getRange(-1, 0, -1, 1).cellType(coeType);
+
+        me.mainSpread.options.showVerticalScrollbar = false;
+        me.detailSpread.options.showVerticalScrollbar = false;
+
+        me.mainSpread.getSheet(0).bind(GC.Spread.Sheets.Events.EnterCell, me.onMainEnterCell);
+        me.detailSpread.getSheet(0).bind(GC.Spread.Sheets.Events.CellChanged, me.onDetailCellChanged);
+
+        let mSheet = me.mainSpread.getSheet(0);
+        sheetCommonObj.showData(mSheet, me.mainSetting, me.datas);
+
+        let dSheet = me.detailSpread.getSheet(0);
+        sheetCommonObj.showData(dSheet, me.detailSetting, me.datas[0].calcItems);
+    },
+
+    onMainEnterCell: function(sender, args) {
+        var me = rationPM;
+        var row = args.sheet.getActiveRowIndex();
+
+        me.detailSpread.suspendPaint();
+        var dSheet = me.detailSpread.getSheet(0);
+        var dData = me.datas[row].calcItems;
+        sheetCommonObj.showData(dSheet, me.detailSetting, dData);
+        me.detailSpread.resumePaint();
+    }
+};
+
+$(document).ready(function(){
+    rationPM.buildSheet();
+});
+
+

+ 0 - 10
web/building_saas/main/js/views/sub_fee_rate_views.js

@@ -1,16 +1,6 @@
 /**
  * Created by chen on 2017/8/1.
  */
-var optionMap={
-"1":[{}]
-
-};
-
-
-var subRateData=[
-    {"ID":10101,"name":"工程分类","typeName":"一类工程",optionList:[{name:'一类工程',value:"1",selected:true},{name:'二类工程',value:"2",selected:false},{name:'三类工程',value:"3",selected:false}]},
-    {"ID":10102,"name":"地区","typeName":"在市区",optionList:[{name:'在市区',value:16.36,selected:false},{name:'县城镇',value:16.21,selected:true},{name:'不在市区、县城镇',value:15.94,selected:false}]}
-];
 
 var subRateObject={
     views:null,

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

@@ -82,6 +82,10 @@ $("#linkDESM").click(function(){
     subSpread.getActiveSheet().setValue(0, 0, "定额说明");
 });
 
+$("#linkJSCXGL").click(function(){
+    location.href = '/web/building_saas/main/html/ration_pm.html';
+});
+
 function SubActiveSheetNameIs(sheetName){
     let rst = subSpread.getActiveSheet().name() == sheetName;
     return rst;

+ 2 - 2
web/building_saas/pm/html/project-management.html

@@ -35,9 +35,9 @@
                 <div class="dropdown d-inline-block">
                     <button class="btn btn-link btn-sm dropdown-toggle" type="button" data-toggle="dropdown"><%- userAccount %></button>
                     <div class="dropdown-menu dropdown-menu-right">
-                        <a class="dropdown-item" href="user-info.html" target="_blank">账号资料</a>
+                        <a class="dropdown-item" href="/user/info" target="_blank">账号资料</a>
                         <a class="dropdown-item" href="user-buy.html" target="_blank">产品购买</a>
-                        <a class="dropdown-item" href="user-set.html" target="_blank">偏好设置</a>
+                        <a class="dropdown-item" href="/user/preferences" target="_blank">偏好设置</a>
                     </div>
                 </div>
                 <span class="btn btn-link btn-sm new-msg">

+ 12 - 5
web/glj/html/glj_index.html

@@ -3,10 +3,10 @@
 <div class="main">
     <div class="main-nav">
         <ul class="nav flex-column">
-            <li><a href="zaojiashu.html">造价书</a></li>
-            <li><a href="gongliaoji.html" class="active">工料机</a></li>
-            <li><a href="baobiao.html">报表</a></li>
-            <li><a href="feilv.html">费率</a></li>
+            <li><a href="">造价书</a></li>
+            <li><a href="#" class="active">工料机</a></li>
+            <li><a href="">报表</a></li>
+            <li><a href="">费率</a></li>
         </ul>
     </div>
     <div class="content">
@@ -87,4 +87,11 @@
 <script type="text/javascript" src="/web/glj/js/composition_spread.js"></script>
 <script type="text/javascript" src="/web/glj/js/project_glj_spread.js"></script>
 <script type="text/javascript" src="/web/glj/js/project_glj.js"></script>
-<script type="text/javascript" src="/web/glj/js/composition.js"></script>
+<script type="text/javascript" src="/web/glj/js/composition.js"></script>
+<script type="text/javascript" src="/web/building_saas/js/global.js"></script>
+<script type="text/javascript">
+$(document).ready(function() {
+    let projectId = getQueryString("project");
+    $(".nav li > a").not(".active").attr("href", "/main?project=" + projectId);
+});
+</script>

+ 1 - 1
web/glj/js/project_glj_spread.js

@@ -242,7 +242,7 @@ ProjectGLJSpread.prototype.specialColumn = function (sourceData) {
             activeSheet.getRange(rowCounter, marketPriceColumn, 1, 1).locked(true);
         }
         // 处理数据
-        if (data.ratio_data.length > 0) {
+        if (data.ratio_data !== undefined && data.ratio_data.length > 0) {
             let connectCode = [];
             let consumption = [];
             for (let tmp of data.ratio_data) {

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

@@ -61,9 +61,9 @@
                                 <label class="form-control-label">指定版本</label>
                                 <select class="form-control" name="select_version">
                                     <option value="">请选择版本</option>
-                                    <% if (versionList.length > 0) {%>
-                                    <% versionList.forEach(function(version) { %>
-                                    <option value="<%= version._id %>" <% if(preferenceSetting.select_version === version._id.toString()) { %>selected="selected" <% } %>><%= version.name %></option>
+                                    <% if (compilationList.length > 0) {%>
+                                    <% compilationList.forEach(function(compilation) { %>
+                                    <option value="<%= compilation._id %>" <% if(preferenceSetting.select_version === compilation._id.toString()) { %>selected="selected" <% } %>><%= compilation.name %></option>
                                     <% }) %>
                                     <% } %>
                                 </select>

+ 4 - 4
web/users/js/login.js

@@ -24,13 +24,13 @@ $(document).ready(function () {
                     if (response.login_ask === 0) {
                         location.href = '/pm';
                     } else {
-                        response.version_list = response.version_list === undefined || response.version_list === '' ?
-                            null : JSON.parse(response.version_list);
-                        if (response.version_list === null || response.version_list.length <= 0) {
+                        response.compilation_list = response.compilation_list === undefined || response.compilation_list === '' ?
+                            null : JSON.parse(response.compilation_list);
+                        if (response.compilation_list === null || response.compilation_list.length <= 0) {
                             location.href = '/pm';
                             return false;
                         }
-                        setVersion(response.version_list);
+                        setVersion(response.compilation_list);
                         $('#ver').modal('show');
                     }
                 } else {