Browse Source

conflict fixed

caiaolin 8 years ago
parent
commit
b6c003b501
37 changed files with 1084 additions and 407 deletions
  1. 33 28
      modules/bills_lib/routes/bills_lib_routes.js
  2. 28 0
      modules/bills_lib/routes/maintain_bills_routes.js
  3. 16 11
      modules/fee_rates/routes/fee_rates_route.js
  4. 5 4
      modules/glj/routes/glj_router.js
  5. 10 7
      modules/main/routes/GLJ_route.js
  6. 11 7
      modules/main/routes/bills_route.js
  7. 22 0
      modules/main/routes/main_route.js
  8. 10 6
      modules/main/routes/project_route.js
  9. 10 7
      modules/main/routes/ration_route.js
  10. 39 27
      modules/pm/routes/pm_route.js
  11. 24 21
      modules/ration_glj/facade/glj_calculate_facade.js
  12. 1 1
      modules/ration_glj/facade/ration_ass_facade.js
  13. 5 7
      modules/ration_glj/facade/ration_coe_facade.js
  14. 39 14
      modules/ration_glj/facade/ration_glj_facade.js
  15. 27 21
      modules/ration_repository/routes/ration_front_end_routes.js
  16. 44 41
      modules/ration_repository/routes/ration_rep_routes.js
  17. 11 5
      modules/reports/routes/report_router.js
  18. 16 13
      modules/reports/routes/rpt_tpl_router.js
  19. 6 5
      modules/reports/routes/rpt_tpl_router_fe.js
  20. 43 0
      modules/reports/util/rpt_data_util.js
  21. 41 5
      modules/templates/routes/bills_template_router.js
  22. 6 5
      modules/users/routes/boot_route.js
  23. 13 12
      modules/users/routes/login_route.js
  24. 9 7
      modules/users/routes/user_route.js
  25. 19 6
      public/cache/std_glj_type_util.js
  26. 4 4
      public/calc_util.js
  27. 1 1
      public/web/sheet/sheet_common.js
  28. 4 97
      server.js
  29. 441 0
      test/calculation/test_ration_calc.js
  30. 1 1
      test/tmp_data/bills_grid_setting.js
  31. 4 1
      web/building_saas/main/html/main.html
  32. 17 9
      web/building_saas/main/js/models/ration.js
  33. 4 4
      web/building_saas/main/js/models/ration_coe.js
  34. 3 1
      web/building_saas/main/js/models/ration_glj.js
  35. 85 28
      web/building_saas/main/js/views/glj_view.js
  36. 31 0
      web/building_saas/main/js/views/ration_calc_view.js
  37. 1 1
      web/building_saas/main/js/views/sub_view.js

+ 33 - 28
modules/bills_lib/routes/bills_lib_routes.js

@@ -1,33 +1,38 @@
 /**
  * Created by vian on 2017/3/17.
  */
-var express = require("express");
-var billsController = require("./../controllers/bills_lib_controllers");
-var billsRouter =express.Router();
+let express = require("express");
+module.exports = function (app) {
+    let billsController = require("./../controllers/bills_lib_controllers");
+    let billsRouter =express.Router();
+
+    billsRouter.post('/getMaxNumber', billsController.getMaxNumber);
+    billsRouter.post('/getABillsLib', billsController.getABillsLib);
+    billsRouter.post("/getStdBillsLib", billsController.getStdBillsLib);
+    billsRouter.post("/createStdBillsLib", billsController.createStdBillsLib);
+    billsRouter.post("/deleteStdBillsLib", billsController.deleteStdBillsLib);
+    billsRouter.post("/renameStdBillsLib", billsController.renameStdBillsLib);
+    billsRouter.post("/getStdBillsLibName", billsController.getStdBillsLibName);
+    billsRouter.post("/getBills", billsController.getBills);
+    billsRouter.post("/createBills", billsController.createBills);
+    billsRouter.post("/updatePNId", billsController.updatePNId);
+    billsRouter.post("/updateBills", billsController.updateBills);
+    billsRouter.post("/updateBillsArr", billsController.updateBillsArr);
+    billsRouter.post("/pasteBills", billsController.pasteBills);
+    billsRouter.post('/updateRecharge', billsController.updateRecharge);
+    billsRouter.post("/deleteBills", billsController.deleteBills);
+    billsRouter.post("/getJobContent", billsController.getJobContent);
+    billsRouter.post("/createJobContent", billsController.createJobContent);
+    billsRouter.post("/updateJobContent", billsController.updateJobContent);
+    billsRouter.post("/deleteJobContent", billsController.deleteJobContent);
+    billsRouter.post("/getItemCharacter", billsController.getItemCharacter);
+    billsRouter.post("/createItemCharacter", billsController.createItemCharacter);
+    billsRouter.post("/updateItemCharacter", billsController.updateItemCharacter);
+    billsRouter.post("/updateValue", billsController.updateValue);
+    billsRouter.post("/deleteItemCharacter", billsController.deleteItemCharacter);
+
+    app.use("/stdBillsEditor", billsRouter);
+};
+
 
-billsRouter.post('/getMaxNumber', billsController.getMaxNumber);
-billsRouter.post('/getABillsLib', billsController.getABillsLib);
-billsRouter.post("/getStdBillsLib", billsController.getStdBillsLib);
-billsRouter.post("/createStdBillsLib", billsController.createStdBillsLib);
-billsRouter.post("/deleteStdBillsLib", billsController.deleteStdBillsLib);
-billsRouter.post("/renameStdBillsLib", billsController.renameStdBillsLib);
-billsRouter.post("/getStdBillsLibName", billsController.getStdBillsLibName);
-billsRouter.post("/getBills", billsController.getBills);
-billsRouter.post("/createBills", billsController.createBills);
-billsRouter.post("/updatePNId", billsController.updatePNId);
-billsRouter.post("/updateBills", billsController.updateBills);
-billsRouter.post("/updateBillsArr", billsController.updateBillsArr);
-billsRouter.post("/pasteBills", billsController.pasteBills);
-billsRouter.post('/updateRecharge', billsController.updateRecharge);
-billsRouter.post("/deleteBills", billsController.deleteBills);
-billsRouter.post("/getJobContent", billsController.getJobContent);
-billsRouter.post("/createJobContent", billsController.createJobContent);
-billsRouter.post("/updateJobContent", billsController.updateJobContent);
-billsRouter.post("/deleteJobContent", billsController.deleteJobContent);
-billsRouter.post("/getItemCharacter", billsController.getItemCharacter);
-billsRouter.post("/createItemCharacter", billsController.createItemCharacter);
-billsRouter.post("/updateItemCharacter", billsController.updateItemCharacter);
-billsRouter.post("/updateValue", billsController.updateValue);
-billsRouter.post("/deleteItemCharacter", billsController.deleteItemCharacter);
 
-module.exports = billsRouter;

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

@@ -0,0 +1,28 @@
+/**
+ * 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.ssoId});
+        }
+    });
+    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');
+    });
+};

+ 16 - 11
modules/fee_rates/routes/fee_rates_route.js

@@ -2,18 +2,23 @@
  * Created by CSL on 2017-03-22.
  */
 
-var express = require('express');
-var frRouter = express.Router();
-var frController = require('../controllers/fee_rates_controller');
+let express = require('express');
+let frController = require('../controllers/fee_rates_controller');
+
+module.exports = function (app) {
+
+    var frRouter = express.Router();
+    frRouter.get('/', function(req, res) {
+        res.render('building_saas/fee_rates/fee_rate', {});
+    });
+    frRouter.post('/getLibNames', frController.libNames);
+    frRouter.post('/getLibFeeRates', frController.libFeeRates);
+    frRouter.post('/getProjectFeeRates', frController.projectFeeRates);
+    frRouter.post('/updateProjectFeeRate', frController.projectFeeUpdateRate);
+
+    app.use('/feeRates',frRouter);
+}
 
-frRouter.get('/', function(req, res) {
-    res.render('building_saas/fee_rates/fee_rate', {});
-});
 
-frRouter.post('/getLibNames', frController.libNames);
-frRouter.post('/getLibFeeRates', frController.libFeeRates);
-frRouter.post('/getProjectFeeRates', frController.projectFeeRates);
-frRouter.post('/updateProjectFeeRate', frController.projectFeeUpdateRate);
 
 
-module.exports = frRouter;

+ 5 - 4
modules/glj/routes/glj_router.js

@@ -8,8 +8,9 @@
 import Express from "express";
 import GLJController from "../controllers/glj_controller";
 
-const router = Express.Router();
-let gljController = new GLJController();
+module.exports = function (app) {
+    const router = Express.Router();
+    let gljController = new GLJController();
 
 // action定义区域
 router.get('/', gljController.init, gljController.index);
@@ -20,5 +21,5 @@ router.post('/delete-ratio', gljController.init, gljController.deleteMixRatio);
 router.get('/test', gljController.init, gljController.test);
 router.get('/testModify', gljController.init, gljController.testModify);
 router.get('/testDelete', gljController.init, gljController.delete);
-
-module.exports = router;
+app.use('/glj',router);
+};

+ 10 - 7
modules/main/routes/GLJ_route.js

@@ -1,12 +1,15 @@
 /**
  * Created by jimiz on 2017/4/17.
  */
-var express = require('express');
-var GLJRouter = express.Router();
-var GLJController = require('../controllers/GLJ_controller');
+let express = require('express');
 
-GLJRouter.post('/getData', GLJController.getData);
-GLJRouter.post('/getItemTemplate', GLJController.getItemTemplate);
-GLJRouter.post('/allocIDs', GLJController.allocIDs);
+module.exports = function (app) {
+    let GLJRouter = express.Router();
+    let GLJController = require('../controllers/GLJ_controller');
 
-module.exports = GLJRouter;
+    GLJRouter.post('/getData', GLJController.getData);
+    GLJRouter.post('/getItemTemplate', GLJController.getItemTemplate);
+    GLJRouter.post('/allocIDs', GLJController.allocIDs);
+
+    app.use('/glj_bak', GLJRouter);
+};

+ 11 - 7
modules/main/routes/bills_route.js

@@ -1,12 +1,16 @@
 /**
  * Created by jimiz on 2017/4/7.
  */
-var express = require('express');
-var billsRouter = express.Router();
-var billsController = require('../controllers/bills_controller');
+let express = require('express');
+let billsController = require('../controllers/bills_controller');
+
+module.exports = function (app) {
+    let billsRouter = express.Router();
+    billsRouter.post('/getData', billsController.getData);
+    billsRouter.post('/getItemTemplate', billsController.getItemTemplate);
+    billsRouter.post('/allocIDs', billsController.allocIDs);
+    app.use('/bills', billsRouter);
+};
+
 
-billsRouter.post('/getData', billsController.getData);
-billsRouter.post('/getItemTemplate', billsController.getItemTemplate);
-billsRouter.post('/allocIDs', billsController.allocIDs);
 
-module.exports = billsRouter;

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

@@ -0,0 +1,22 @@
+/**
+ * Created by chen on 2017/7/17.
+ */
+
+
+
+module.exports =function (app) {
+    app.get('/main',  function(req, res) {
+        let pm = require('../../pm/controllers/pm_controller');
+        pm.checkProjectRight(req.session.sessionUser.ssoId, req.query.project, function (hasRight) {
+            if (hasRight) {
+                res.render('building_saas/main/html/main.html',
+                    {
+                        userAccount: req.session.userAccount,
+                        userID: req.session.sessionUser.ssoId
+                    });
+            } else {
+                res.redirect('/pm');
+            }
+        });
+    });
+}

+ 10 - 6
modules/main/routes/project_route.js

@@ -1,11 +1,15 @@
 /**
  * Created by jimiz on 2017/4/16.
  */
-var express = require('express');
-var projectRouter = express.Router();
-var projectController = require('../controllers/project_controller');
+let express = require('express');
+let projectController = require('../controllers/project_controller');
 
-projectRouter.post('/save', projectController.save);
-projectRouter.post('/getData', projectController.getData);
+module.exports = function (app) {
+    let projectRouter = express.Router();
+
+    projectRouter.post('/save', projectController.save);
+    projectRouter.post('/getData', projectController.getData);
+
+    app.use('/project',projectRouter);
+};
 
-module.exports = projectRouter;

+ 10 - 7
modules/main/routes/ration_route.js

@@ -1,12 +1,15 @@
 /**
  * Created by jimiz on 2017/4/7.
  */
-var express = require('express');
-var rationRouter = express.Router();
-var rationController = require('../controllers/ration_controller');
+let express = require('express');
 
-rationRouter.post('/getData', rationController.getData);
-rationRouter.post('/getItemTemplate', rationController.getItemTemplate);
-rationRouter.post('/allocIDs', rationController.allocIDs);
+module.exports = function (app) {
+    let rationRouter = express.Router();
+    let rationController = require('../controllers/ration_controller');
 
-module.exports = rationRouter;
+    rationRouter.post('/getData', rationController.getData);
+    rationRouter.post('/getItemTemplate', rationController.getItemTemplate);
+    rationRouter.post('/allocIDs', rationController.allocIDs);
+
+    app.use('/ration', rationRouter);
+};

+ 39 - 27
modules/pm/routes/pm_route.js

@@ -4,36 +4,48 @@
  */
 
 let express = require('express');
-let pmRouter = express.Router();
 let pmController = require('./../controllers/pm_controller');
 
-pmRouter.use(function (req, res, next) {
-    if (/\/getNewProjectID/.test(req.originalUrl) || pmController.checkRight(req, res)) {
-        next();
-    } else {
-        res.json({error: 1, message: '对不起,您无权限操作。', data: null});
-    }
-});
+module.exports = function (app) {
 
-/*
-  req.body = {data: '{user_id}'}
- */
-pmRouter.post('/getProjects', pmController.getProjects);
+    app.get('/pm', function(req, res){
+        res.render('building_saas/pm/html/project-management.html',
+            {userAccount: req.session.userAccount,
+                userID: req.session.sessionUser.ssoId});
+    });
 
-/*
- req.body = {data: '{user_id: user_id, updateData: [{updateType, updateData}]}'}
- data.updateData.updateType: 1 of ['new', 'update', 'delete']
- */
-pmRouter.post('/updateProjects', pmController.updateProjects);
+    let pmRouter = express.Router();
+
+    pmRouter.use(function (req, res, next) {
+        if (/\/getNewProjectID/.test(req.originalUrl) || pmController.checkRight(req, res)) {
+            next();
+        } else {
+            res.json({error: 1, message: '对不起,您无权限操作。', data: null});
+        }
+    });
+
+    /*
+     req.body = {data: '{user_id}'}
+     */
+    pmRouter.post('/getProjects', pmController.getProjects);
+
+    /*
+     req.body = {data: '{user_id: user_id, updateData: [{updateType, updateData}]}'}
+     data.updateData.updateType: 1 of ['new', 'update', 'delete']
+     */
+    pmRouter.post('/updateProjects', pmController.updateProjects);
+
+    /*
+     req.body = {data: '{user_id: user_id, updateData: [{updateType, updateData}]}'}
+     data.updateData.updateType: 1 of ['update', 'copy']
+     */
+    pmRouter.post('/copyProjects', pmController.copyProjects);
+    pmRouter.post('/renameProject', pmController.rename);
+    pmRouter.post('/beforeOpenProject', pmController.beforeOpenProject);
+    pmRouter.post('/getProject', pmController.getProject);
+    pmRouter.post('/getNewProjectID', pmController.getNewProjectID);
+
+    app.use('/pm/api', pmRouter);
+};
 
-/*
- req.body = {data: '{user_id: user_id, updateData: [{updateType, updateData}]}'}
- data.updateData.updateType: 1 of ['update', 'copy']
- */
-pmRouter.post('/copyProjects', pmController.copyProjects);
-pmRouter.post('/renameProject', pmController.rename);
-pmRouter.post('/beforeOpenProject', pmController.beforeOpenProject);
-pmRouter.post('/getProject', pmController.getProject);
-pmRouter.post('/getNewProjectID', pmController.getNewProjectID);
 
-module.exports = pmRouter;

+ 24 - 21
modules/ration_glj/facade/glj_calculate_facade.js

@@ -25,7 +25,7 @@ let stateSeq ={
 }
 
 
-async function calculateQuantity(query){
+async function calculateQuantity(query,isMarkPriceAjust){
     try {
          let  result ={
              glj_result:[],
@@ -43,15 +43,18 @@ async function calculateQuantity(query){
                  if(times!=0){
                      assRation = await  std_ration_lib_ration_items.findOne({rationRepId:impactRation.libID,code:impactRation.rationAssList[i].assistCode});
                      assList.push({times:times,assRation:assRation})
-                     adjustState.push({index:stateSeq.ass,content:"+"+impactRation.rationAssList[i].assistCode+"x"+times});
+                     adjustState.push({index:stateSeq.ass,content:impactRation.rationAssList[i].name+" "+impactRation.rationAssList[i].actualValue+" : +"+impactRation.rationAssList[i].assistCode+"x"+times});
                      }
                  }
          }
          for(let i =0;i<gljList.length;i++ ){
-             let r = await calculateQuantityPerGLJ(gljList[i],impactRation,coeList,assList,adjustState);
+             let r = await calculateQuantityPerGLJ(gljList[i],impactRation,coeList,assList,adjustState,isMarkPriceAjust);
              result.glj_result.push(r);
          }
-         await ration_glj.bulkWrite(generateUpdateTasks(result.glj_result));
+         console.log(result.glj_result);
+        if(isMarkPriceAjust==null){
+            await ration_glj.bulkWrite(generateUpdateTasks(result.glj_result));
+        }
          adjustState= _.sortByOrder(adjustState, ['index'], ['asc']);
          adjustState=_.map(adjustState, _.property('content'));
          let adjustStateString = adjustState.join(';');
@@ -79,7 +82,7 @@ function generateUpdateTasks(result) {
 }
 
 
-async function calculateQuantityPerGLJ(glj,ration,coeList,assList,adjustState) {
+async function calculateQuantityPerGLJ(glj,ration,coeList,assList,adjustState,isMarkPriceAjust) {
     let quantity =  glj.quantity;
     let result={
         query:{
@@ -87,25 +90,25 @@ async function calculateQuantityPerGLJ(glj,ration,coeList,assList,adjustState) {
             projectID:glj.projectID
         },
         doc:{
-            quantity: quantity,
-            customQuantity:glj.customQuantity
+            quantity: quantity
         }
     };
     try {
-        //to do 添加/替换工料机调整 内容
-
-        if(!glj._doc.hasOwnProperty('customQuantity')||glj.customQuantity==null){
-            quantity =glj.rationItemQuantity;
-            quantity =calculateAss(quantity,assList,glj);
-            quantity = calculateQuantityByCoes(quantity,coeList,glj);
-        }else {
-            quantity = glj.customQuantity;
-        }
-        let customerCoe = _.last(coeList);
-        if(customerCoe.isAdjust==1){
-            quantity = calculateQuantityByCustomerCoes(quantity,customerCoe,glj);
+        if(isMarkPriceAjust==null){
+            if(!glj._doc.hasOwnProperty('customQuantity')||glj.customQuantity==null){
+                quantity =glj.rationItemQuantity;
+                quantity =calculateAss(quantity,assList,glj);
+                quantity = calculateQuantityByCoes(quantity,coeList,glj);
+            }else {
+                quantity = glj.customQuantity;
+                result.doc.customQuantity = glj.customQuantity;
+            }
+            let customerCoe = _.last(coeList);
+            if(customerCoe.isAdjust==1){
+                quantity = calculateQuantityByCustomerCoes(quantity,customerCoe,glj);
+            }
+            result.doc.quantity =quantity;
         }
-        result.doc.quantity =quantity;
         generateAdjustState(glj,coeList,adjustState);
         return result;
     }catch (err){
@@ -137,7 +140,7 @@ function generateAdjustState(glj,coeList,adjustState) {
             if(i==coeList.length-1){
                 adjustState.push({index:stateSeq.cusCoe,content:coeList[i].content});
             }else {
-                adjustState.push({index:stateSeq.coe,content:coeList[i].content});
+                adjustState.push({index:stateSeq.coe,content:"调 : "+coeList[i].content});
             }
         }
     }

+ 1 - 1
modules/ration_glj/facade/ration_ass_facade.js

@@ -56,7 +56,7 @@ function update_ration_ass(user_id,datas) {
                     moduleName:'ration',
                     data:{
                         updateTpye:commonConsts.UT_UPDATE,
-                        quantityRefresh:true,
+                        stateRefresh:true,
                         rationID:result.cal_result.rationID,
                         adjustState:result.cal_result.adjustState
                     }

+ 5 - 7
modules/ration_glj/facade/ration_coe_facade.js

@@ -113,7 +113,7 @@ function updateCustomerCoe(user_id,datas) {
                     moduleName:'ration',
                     data:{
                         updateTpye:commonConsts.UT_UPDATE,
-                        quantityRefresh:true,
+                        stateRefresh:true,
                         rationID:result.cal_result.rationID,
                         adjustState:result.cal_result.adjustState
                     }
@@ -152,7 +152,7 @@ function updateCustomerCoe(user_id,datas) {
                     moduleName:'ration',
                     data:{
                         updateTpye:commonConsts.UT_UPDATE,
-                        quantityRefresh:true,
+                        stateRefresh:true,
                         rationID:result.cal_result.rationID,
                         adjustState:result.cal_result.adjustState
                     }
@@ -215,13 +215,11 @@ function generationContent(coes) {
     if(_.every(coes,'amount',rationAmount)){
         string = coes[0].coeType + 'x'+rationAmount;
     }else {
+        let context_arr =[];
         for(let i =1;i<coes.length;i++){
-            if(i==1){
-                string = coes[i].coeType + 'x'+coes[i].amount;
-            }else {
-                string +=', '+coes[i].coeType + 'x'+coes[i].amount;
-            }
+            context_arr.push( coes[i].coeType + 'x'+coes[i].amount);
         }
+        string = context_arr.join(',');
 
     }
     return string;

+ 39 - 14
modules/ration_glj/facade/ration_glj_facade.js

@@ -200,10 +200,6 @@ function customQuantityUpdate(user_id,datas){
             if(result.err){
                 callback(result.err,'');
             }else {
-                // cal_result ={
-              //  glj_result:[],
-                //    rationID:query.rationID
-
                 let ration_glj_data ={
                     moduleName:'ration_glj',
                     data:{
@@ -216,7 +212,7 @@ function customQuantityUpdate(user_id,datas){
                     moduleName:'ration',
                     data:{
                         updateTpye:commonConsts.UT_UPDATE,
-                        quantityRefresh:true,
+                        stateRefresh:true,
                         rationID:result.cal_result.rationID,
                         adjustState:result.cal_result.adjustState
                     }
@@ -234,6 +230,12 @@ async function doCustomQuantityUpdate(datas){
     try{
         await ration_glj.update(datas.query,datas.doc);
         let cal_result = await glj_calculate_facade.calculateQuantity({projectID:datas.query.projectID,rationID:datas.query.rationID});
+
+        cal_result.glj_result.forEach(function (item) {
+           if(!item.doc.hasOwnProperty('customQuantity')){
+               item.doc.customQuantity=null;
+           }
+        });
         result.cal_result =cal_result;
         console.log(result);
         return result;
@@ -248,21 +250,35 @@ async function doCustomQuantityUpdate(datas){
 function marketPriceAdjustUpdate(user_id,datas) {
     return function (callback) {
         updateprojectGljAndRationGLJ(datas.query,datas.doc).then((result)=>{
-            let returndata ={
-                moduleName:'ration_glj',
-                data:{
-                    updateTpye:commonConsts.UT_UPDATE,
-                    query:datas.query,
-                    doc:result
+            if(result.err){
+                callback(result.err,'');
+            }else {
+                let returndata ={
+                    moduleName:'ration_glj',
+                    data:{
+                        updateTpye:commonConsts.UT_UPDATE,
+                        query:datas.query,
+                        doc:result.doc
+                    }
+                };
+                let ration_data ={
+                    moduleName:'ration',
+                    data:{
+                        updateTpye:commonConsts.UT_UPDATE,
+                        stateRefresh:true,
+                        rationID:datas.query.rationID,
+                        adjustState:result.adjustState
+                    }
                 }
+                callback(null,[returndata,ration_data]);
             }
-            callback(null,returndata)
         })
 
     }
 }
 
 async function updateprojectGljAndRationGLJ(query,doc) {
+    let returnresult={};
     try {
         let gljListModel = new GLJListModel();
         let result = await gljListModel.modifyMarketPrice(doc);
@@ -274,11 +290,20 @@ async function updateprojectGljAndRationGLJ(query,doc) {
             name : result.name,
             code:result.code
         };
-        let updateresult = await ration_glj.findOneAndUpdate(query, updateDoc)
-        return updateDoc;
+        let updateresult = await ration_glj.findOneAndUpdate(query, updateDoc);
+        let stateResult =  await glj_calculate_facade.calculateQuantity({projectID:query.projectID,rationID:query.rationID},true);
+
+         returnresult ={
+            err:null,
+            doc :updateDoc,
+            adjustState:stateResult.adjustState
+        }
+        return returnresult;
 
         } catch (error) {
+           returnresult.err = error;
             console.log(error);
+            return returnresult
          }
 }
 

+ 27 - 21
modules/ration_repository/routes/ration_front_end_routes.js

@@ -1,33 +1,39 @@
 /**
  * Created by Tony on 2017/6/15.
  */
-var express = require("express");
-var apiRouter =express.Router();
+let express = require("express");
+
+module.exports = function (app) {
+    let apiRouter =express.Router();
 //var _rootDir = __dirname;
 
-var rationRepositoryController = require("../controllers/ration_repository_controller");
-var rationChapterTreeController = require("../controllers/ration_section_tree_controller");
-var rationController = require("../controllers/ration_controller");
-var repositoryGljController = require("../controllers/repository_glj_controller");
-var coeListController = require("../controllers/coe_controller");
-var searchController = require('../controllers/search_controller');
+    var rationRepositoryController = require("../controllers/ration_repository_controller");
+    var rationChapterTreeController = require("../controllers/ration_section_tree_controller");
+    var rationController = require("../controllers/ration_controller");
+    var repositoryGljController = require("../controllers/repository_glj_controller");
+    var coeListController = require("../controllers/coe_controller");
+    var searchController = require('../controllers/search_controller');
+
+    apiRouter.post("/getRationDisplayNames",rationRepositoryController.getDisPlayRationLibs);
+    apiRouter.post("/getRealLibName",rationRepositoryController.getRealLibName);
+    apiRouter.post("/getLibIDByName",rationRepositoryController.getLibIDByName);
+
+    apiRouter.post("/getRationTree",rationChapterTreeController.getRationChapterTree);
+
+    apiRouter.post("/getRationItems",rationController.getRationItemsBySection);
 
-apiRouter.post("/getRationDisplayNames",rationRepositoryController.getDisPlayRationLibs);
-apiRouter.post("/getRealLibName",rationRepositoryController.getRealLibName);
-apiRouter.post("/getLibIDByName",rationRepositoryController.getLibIDByName);
+    apiRouter.post("/getGljTree",repositoryGljController.getGljTree);
+    apiRouter.post("/getGljItems",repositoryGljController.getGljItems);
+    apiRouter.post("/getGljItemsByIds",repositoryGljController.getGljItemsByIds);
+    apiRouter.post("/getGljItemsByCodes",repositoryGljController.getGljItemsByCodes);
 
-apiRouter.post("/getRationTree",rationChapterTreeController.getRationChapterTree);
+    apiRouter.post("/getCoeList",coeListController.getCoeList);
 
-apiRouter.post("/getRationItems",rationController.getRationItemsBySection);
+    apiRouter.post('/getRationItem', searchController.getRationItem);
+    apiRouter.post('/findRation', searchController.findRation);
 
-apiRouter.post("/getGljTree",repositoryGljController.getGljTree);
-apiRouter.post("/getGljItems",repositoryGljController.getGljItems);
-apiRouter.post("/getGljItemsByIds",repositoryGljController.getGljItemsByIds);
-apiRouter.post("/getGljItemsByCodes",repositoryGljController.getGljItemsByCodes);
+    app.use("/rationRepository/api", apiRouter);
+};
 
-apiRouter.post("/getCoeList",coeListController.getCoeList);
 
-apiRouter.post('/getRationItem', searchController.getRationItem);
-apiRouter.post('/findRation', searchController.findRation);
 
-module.exports = apiRouter;

+ 44 - 41
modules/ration_repository/routes/ration_rep_routes.js

@@ -1,46 +1,49 @@
 /**
  * Created by Tony on 2017/4/20.
  */
-var express = require("express");
-var apiRouter =express.Router();
+let express = require("express");
+let apiRouter =express.Router();
 //var _rootDir = __dirname;
+module.exports = function (app) {
+    let rationRepositoryController = require("../controllers/ration_repository_controller");
+    let rationChapterTreeController = require("../controllers/ration_section_tree_controller");
+    let rationController = require("../controllers/ration_controller");
+    let repositoryGljController = require("../controllers/repository_glj_controller");
+    let coeListController = require("../controllers/coe_controller");
+    let searchController = require('../controllers/search_controller');
+
+    apiRouter.post("/getRationDisplayNames",rationRepositoryController.getDisPlayRationLibs);
+    apiRouter.post("/editRationLibs",rationRepositoryController.updateRationRepositoryName);
+    apiRouter.post("/addRationRepository",rationRepositoryController.addRationRepository);
+    apiRouter.post("/deleteRationLibs",rationRepositoryController.deleteRationLib);
+    apiRouter.post("/getRealLibName",rationRepositoryController.getRealLibName);
+    apiRouter.post("/getLibIDByName",rationRepositoryController.getLibIDByName);
+
+    apiRouter.post("/getRationTree",rationChapterTreeController.getRationChapterTree);
+    apiRouter.post("/createNewNode",rationChapterTreeController.createNewNode);
+    apiRouter.post("/updateNodes",rationChapterTreeController.updateNodes);
+    apiRouter.post("/deleteNodes",rationChapterTreeController.deleteNodes);
+
+    apiRouter.post("/getRationItems",rationController.getRationItemsBySection);
+    apiRouter.post("/mixUpdateRationItems",rationController.mixUpdateRationItems);
+
+    apiRouter.post("/createNewGljTypeNode",repositoryGljController.createNewGljTypeNode);
+    apiRouter.post("/updateGljNodes",repositoryGljController.updateGljNodes);
+    apiRouter.post("/deleteGljNodes",repositoryGljController.deleteGljNodes);
+    apiRouter.post("/getGljTree",repositoryGljController.getGljTree);
+    apiRouter.post("/getGljItems",repositoryGljController.getGljItems);
+    apiRouter.post("/mixUpdateGljItems",repositoryGljController.mixUpdateGljItems);
+    apiRouter.post("/getGljItemsByIds",repositoryGljController.getGljItemsByIds);
+    apiRouter.post("/getGljItemsByCodes",repositoryGljController.getGljItemsByCodes);
+
+    apiRouter.post("/getCoeList",coeListController.getCoeList);
+    apiRouter.post("/saveCoeList",coeListController.saveCoeList);
+    apiRouter.post("/getCoeItemsByIDs",coeListController.getCoeItemsByIDs);
+
+    apiRouter.post('/getRationItem', searchController.getRationItem);
+    apiRouter.post('/findRation', searchController.findRation);
+
+
+};
+
 
-var rationRepositoryController = require("../controllers/ration_repository_controller");
-var rationChapterTreeController = require("../controllers/ration_section_tree_controller");
-var rationController = require("../controllers/ration_controller");
-var repositoryGljController = require("../controllers/repository_glj_controller");
-var coeListController = require("../controllers/coe_controller");
-var searchController = require('../controllers/search_controller');
-
-apiRouter.post("/getRationDisplayNames",rationRepositoryController.getDisPlayRationLibs);
-apiRouter.post("/editRationLibs",rationRepositoryController.updateRationRepositoryName);
-apiRouter.post("/addRationRepository",rationRepositoryController.addRationRepository);
-apiRouter.post("/deleteRationLibs",rationRepositoryController.deleteRationLib);
-apiRouter.post("/getRealLibName",rationRepositoryController.getRealLibName);
-apiRouter.post("/getLibIDByName",rationRepositoryController.getLibIDByName);
-
-apiRouter.post("/getRationTree",rationChapterTreeController.getRationChapterTree);
-apiRouter.post("/createNewNode",rationChapterTreeController.createNewNode);
-apiRouter.post("/updateNodes",rationChapterTreeController.updateNodes);
-apiRouter.post("/deleteNodes",rationChapterTreeController.deleteNodes);
-
-apiRouter.post("/getRationItems",rationController.getRationItemsBySection);
-apiRouter.post("/mixUpdateRationItems",rationController.mixUpdateRationItems);
-
-apiRouter.post("/createNewGljTypeNode",repositoryGljController.createNewGljTypeNode);
-apiRouter.post("/updateGljNodes",repositoryGljController.updateGljNodes);
-apiRouter.post("/deleteGljNodes",repositoryGljController.deleteGljNodes);
-apiRouter.post("/getGljTree",repositoryGljController.getGljTree);
-apiRouter.post("/getGljItems",repositoryGljController.getGljItems);
-apiRouter.post("/mixUpdateGljItems",repositoryGljController.mixUpdateGljItems);
-apiRouter.post("/getGljItemsByIds",repositoryGljController.getGljItemsByIds);
-apiRouter.post("/getGljItemsByCodes",repositoryGljController.getGljItemsByCodes);
-
-apiRouter.post("/getCoeList",coeListController.getCoeList);
-apiRouter.post("/saveCoeList",coeListController.saveCoeList);
-apiRouter.post("/getCoeItemsByIDs",coeListController.getCoeItemsByIDs);
-
-apiRouter.post('/getRationItem', searchController.getRationItem);
-apiRouter.post('/findRation', searchController.findRation);
-
-module.exports = apiRouter;

+ 11 - 5
modules/reports/routes/report_router.js

@@ -3,10 +3,16 @@
  */
 
 let express = require('express');
-let rptRouter = express.Router();
-let reportController = require('./../controllers/rpt_controller');
 
-rptRouter.post('/getReport', reportController.getReportAllPages);
-rptRouter.get('/getExcel/:id/:size/:rptName', reportController.getExcel);
+module.exports = function (app) {
+    let rptRouter = express.Router();
+    let reportController = require('./../controllers/rpt_controller');
+
+    rptRouter.post('/getReport', reportController.getReportAllPages);
+    rptRouter.get('/getExcel/:id/:size/:rptName', reportController.getExcel);
+
+    app.use("/report_api", rptRouter);
+};
+
+
 
-module.exports = rptRouter;

+ 16 - 13
modules/reports/routes/rpt_tpl_router.js

@@ -1,17 +1,20 @@
 let express = require("express");
-let rptTplRouter = express.Router();
-let reportTplController = require('./../controllers/rpt_tpl_controller');
-let reportCfgController = require('./../controllers/rpt_cfg_controller');
+module.exports = function (app) {
+    let rptTplRouter = express.Router();
+    let reportTplController = require('./../controllers/rpt_tpl_controller');
 
-rptTplRouter.post('/createTplTreeNode', reportTplController.createTplTreeNode);
-rptTplRouter.post('/getRptTplTree', reportTplController.getRptTplTree);
-rptTplRouter.post('/updateRptTplNodes', reportTplController.updateTreeNodes);
-rptTplRouter.post('/deleteRptTplNodes', reportTplController.deleteRptTplNodes);
-rptTplRouter.post('/createDftRptTpl', reportTplController.createDftRptTpl);
-rptTplRouter.post('/getRefRptTpl', reportTplController.getRefRptTpl);
-rptTplRouter.post('/updateRptTpl', reportTplController.updateRptTpl);
+//let reportCfgController = require('./../controllers/rpt_controller');
+
+    rptTplRouter.post('/createTplTreeNode', reportTplController.createTplTreeNode);
+    rptTplRouter.post('/getRptTplTree', reportTplController.getRptTplTree);
+    rptTplRouter.post('/updateRptTplNodes', reportTplController.updateTreeNodes);
+    rptTplRouter.post('/deleteRptTplNodes', reportTplController.deleteRptTplNodes);
+    rptTplRouter.post('/createDftRptTpl', reportTplController.createDftRptTpl);
+    rptTplRouter.post('/getRefRptTpl', reportTplController.getRefRptTpl);
+    rptTplRouter.post('/updateRptTpl', reportTplController.updateRptTpl);
+
+//rptTplRouter.post('/getUserRptCfg', reportCfgController.getReportUserCfg);
+//rptTplRouter.post('/getMappingFields', reportCfgController.getAllMappingFields);
+};
 
-rptTplRouter.post('/getUserRptCfg', reportCfgController.getReportUserCfg);
-rptTplRouter.post('/getMappingFields', reportCfgController.getAllMappingFields);
 
-module.exports = rptTplRouter;

+ 6 - 5
modules/reports/routes/rpt_tpl_router_fe.js

@@ -3,9 +3,10 @@
  * 报表模板路由 - 前台专用(无任何update)
  */
 let express = require("express");
-let rptTplRouter = express.Router();
-let reportTplController = require('./../controllers/rpt_tpl_controller');
+module.exports = function (app) {
+    let rptTplRouter = express.Router();
+    let reportTplController = require('./../controllers/rpt_tpl_controller');
+    rptTplRouter.post('/getRptTplTree', reportTplController.getRptTplTree);
 
-rptTplRouter.post('/getRptTplTree', reportTplController.getRptTplTree);
-
-module.exports = rptTplRouter;
+    app.use("/report_tpl_api", rptTplRouter);
+};

+ 43 - 0
modules/reports/util/rpt_data_util.js

@@ -0,0 +1,43 @@
+/**
+ * Created by Tony on 2017/7/14.
+ * 报表数据提取class,是协助报表模板里指标字段自主提取数据的工具类
+ */
+class Rpt_Common{
+    initialize(Projects) {
+        this.Projects = Projects;
+    };
+};
+
+class Rpt_Data_Extractor {
+    initialize(Projects) {
+        this.Projects = Projects;
+        //Projects对象从前端传送过来,无需在后端重复查询及构建
+        /* 结构:
+         {
+            currentPrjId: int,
+            topPrj: [
+                //单项工程
+                {
+                    subPrjName: String,
+                    subPrjId: int,
+                    detailPrj: [
+                        //单位工程
+                        {
+                            detailPrjName: String,
+                            subPrjId: int,
+                        }
+                        ...
+                    ]
+                }
+                ...
+            ]
+         }
+         */
+    };
+
+    prepare($CURRENT_RPT) {
+        //在报表提取数据前的准备工作,主要有:
+        //1. 确认指标数据的类型,
+    };
+
+}

+ 41 - 5
modules/templates/routes/bills_template_router.js

@@ -3,11 +3,47 @@
  */
 
 var express = require('express');
-var billsTemplateRouter = express.Router();
+
 var billsTemplateController = require('./../controllers/bills_template_controller');
 
-billsTemplateRouter.post('/getBillsTemplate', billsTemplateController.getBillsTemplate);
-billsTemplateRouter.post('/updateBillsTemplate', billsTemplateController.updateBillsTemplate);
-billsTemplateRouter.post('/getNewBillsTemplateID', billsTemplateController.getNewBillsTemplateID);
 
-module.exports = billsTemplateRouter;
+module.exports = function (app) {
+    app.get('/template/bills', function (req, res) {
+        let checkAdmin = function (userAccount) {
+            return true;
+        }
+        if (checkAdmin(req.session.userAccount)) {
+            res.render('maintain/templates/html/bills.html',
+                {userAccount: req.session.userAccount,
+                    userID: req.session.userID});
+        } else {
+            res.redirect('/pm');
+        }
+    });
+
+    app.use('/template/bills/api', function (req, res, next) {
+        let checkAdmin = function (userAccount) {
+            return true;
+        }
+        if (checkAdmin(req.session.sessionUser)) {
+            next();
+        } else {
+            res.json({error: 1, message: '对不起,您无权限操作清单模板。', data: null});
+        }
+    });
+
+    var billsTemplateRouter = express.Router();
+
+    billsTemplateRouter.post('/getBillsTemplate', billsTemplateController.getBillsTemplate);
+    billsTemplateRouter.post('/updateBillsTemplate', billsTemplateController.updateBillsTemplate);
+    billsTemplateRouter.post('/getNewBillsTemplateID', billsTemplateController.getNewBillsTemplateID);
+    app.use('/template/bills/api', billsTemplateRouter);
+}
+
+
+
+
+
+
+
+

+ 6 - 5
modules/users/routes/boot_route.js

@@ -8,10 +8,11 @@
 import express from "express";
 import BootController from "../controllers/boot_controller";
 
-let router = express.Router();
-let bootController = new BootController();
+module.exports=function (app){
+    let router = express.Router();
+    let bootController = new BootController();
 
 // 引导页面
-router.get('/:area', bootController.boot);
-
-module.exports = router;
+    router.get('/:area', bootController.boot);
+    app.use('/boot', router);
+};

+ 13 - 12
modules/users/routes/login_route.js

@@ -8,19 +8,20 @@
 import express from "express";
 import LoginController from "../controllers/login_controller";
 
-let router = express.Router();
-let loginController = new LoginController();
 
-// 登录页面action
-router.get('/login', loginController.index);
-router.get('/', loginController.index);
+module.exports = function (app) {
+    let  router = express.Router();
+    let loginController = new LoginController();
+    // 登录页面action
+    router.get('/login', loginController.index);
+    router.get('/', loginController.index);
 
 // 登录操作
-router.post('/login', loginController.login);
+    router.post('/login', loginController.login);
 
-router.get("/logout", function (req, res) {
-    delete req.session.sessionUser;
-    res.redirect("/");
-});
-
-module.exports = router;
+    router.get("/logout", function (req, res) {
+        delete req.session.sessionUser;
+        res.redirect("/");
+    });
+    app.use('/',router)
+};

+ 9 - 7
modules/users/routes/user_route.js

@@ -8,12 +8,14 @@
 import Express from "express";
 import UserController from "../controllers/user_controller";
 
-const router = Express.Router();
-const userController = new UserController();
+module.exports = function (app) {
 
-// action定义区域
-router.get('/info', userController.info);
-router.get('/safe', userController.safe);
-router.post('/info', userController.saveData);
+    const router = Express.Router();
+    const userController = new UserController();
 
-module.exports = router;
+// action定义区域
+    router.get('/info', userController.info);
+    router.get('/safe', userController.safe);
+    router.post('/info', userController.saveData);
+    app.use('/user',router);
+};

+ 19 - 6
public/cache/std_glj_type_util.js

@@ -1,13 +1,13 @@
 /**
  * Created by Tony on 2017/7/6.
  */
-let cache = require('./cacheUtil');
+let cacheUtil = require('./cacheUtil');
 let std_glj_type_mdl = require('../models/std_glj_types');
 
 const STD_GLJ_GRP = 'std_glj_grp';
 
 function getStdGljTypeCache() {
-    let rst = cache.getCache(STD_GLJ_GRP,'default');
+    let rst = cacheUtil.getCache(STD_GLJ_GRP,'default');
     return rst;
 };
 
@@ -20,21 +20,23 @@ class StdGljTypeClass{
     build(cache){
         let me = this, rst = {};
         rst.items = [];
-        let private_combine_glj_type = function (item) {
+        let private_combine_glj_type = function (item, topParentId, parentId) {
             let tmpItem = {};
             tmpItem.ID = item.ID;
+            tmpItem.TopParentID = topParentId;
+            tmpItem.ParentID = parentId;
             tmpItem.fullName = item.fullName;
             tmpItem.shortName = item.shortName;
             rst["typeId" + item.ID] = tmpItem;
             rst.items.push(tmpItem);
             if (item.items) {
                 for (let subItem of item.items) {
-                    private_combine_glj_type(subItem);
+                    private_combine_glj_type(subItem, topParentId, item.ID);
                 }
             }
         }
         for (let item of cache.typesDefine) {
-            private_combine_glj_type(item);
+            private_combine_glj_type(item, item.ID, -1);
         }
         me.innerGljTypeObj = rst;
     };
@@ -47,6 +49,17 @@ class StdGljTypeClass{
         return rst;
     };
 
+    getTopParentIdByItemId(itemId) {
+        let me = this, rst = itemId;
+        if (me.innerGljTypeObj) {
+            let item = me.innerGljTypeObj["typeId" + itemId];
+            if (item) {
+                rst = item.TopParentID;
+            }
+        }
+        return rst;
+    };
+
     toArray(){
         let me = this, rst = null;
         return me.innerGljTypeObj.items;
@@ -58,7 +71,7 @@ module.exports = {
     setStdGljTypeCache: function () {
         std_glj_type_mdl.find({typeName: "默认"}, '-_id', function(err, typeObj){
             if(typeObj.length){
-                cache.setCache(STD_GLJ_GRP,'default',typeObj[0]);
+                cacheUtil.setCache(STD_GLJ_GRP,'default',typeObj[0]);
             }
         })
     },

+ 4 - 4
public/calc_util.js

@@ -99,10 +99,10 @@ class calculation {
             return rst;
         };
         let private_parse_ref = function(item, itemIdx){
-            let expr = item.expression.split('at(').join('@(');
+            let expr = item.expression.split('at(').join('A(');
             item.expression = expr;
             //console.log('expression: ' + expr);
-            let idx = expr.indexOf('@(', 0);
+            let idx = expr.indexOf('A(', 0);
             while (idx >= 0) {
                 let code = private_extract_code(expr, idx);
                 //console.log('提取code: ' + code);
@@ -119,7 +119,7 @@ class calculation {
                         console.log('invalid code: ' + code);
                     }
                 }
-                idx = expr.indexOf('@(', idx + code.length + 3);
+                idx = expr.indexOf('A(', idx + code.length + 3);
             }
             if (me.calcTpl.compiledSeq.indexOf(itemIdx) < 0) {
                 //console.log('the code ready to push: ' + item.code);
@@ -134,7 +134,7 @@ class calculation {
         let private_compile_items = function() {
             for (let idx of me.calcTpl.compiledSeq) {
                 let item = me.calcTpl.calcItems[idx];
-                item.compiledExpr = item.expression.split('@(').join('$CE.at(');
+                item.compiledExpr = item.expression.split('A(').join('$CE.at(');
                 item.compiledExpr = item.compiledExpr.split('base(').join('$CE.base(');
                 item.compiledExpr = item.compiledExpr.split('fee(').join('$CE.fee(');
                 item.compiledExpr = item.compiledExpr.split('factor(').join('$CE.factor(');

+ 1 - 1
public/web/sheet/sheet_common.js

@@ -110,7 +110,7 @@ var sheetCommonObj = {
                 //sheet.setStyle(row,col,style,GC.Spread.Sheets.SheetArea.viewport);
                 sheet.setFormatter(-1, col, setting.header[col].formatter, GC.Spread.Sheets.SheetArea.viewport);
             }
-            if(setting.header[col].cellType === "checkBox"){//clear and reset
+            if(setting.header[col].cellType === "checkBox"||setting.header[col].cellType === "button"){//clear and reset
                 var me = this, header = GC.Spread.Sheets.SheetArea.colHeader;
                 sheet.deleteColumns(col,1);
                 sheet.addColumns(col, 1);

+ 4 - 97
server.js

@@ -72,109 +72,16 @@ app.use(function (req, res, next) {
     }
 });
 
-// 用户相关路由区域
-app.use('/', require("./modules/users/routes/login_route"));
-app.use('/boot', require("./modules/users/routes/boot_route"));
-app.use('/user', require("./modules/users/routes/user_route"));
-
-// 项目工料机相关
-app.use('/glj', require("./modules/glj/routes/glj_router"));
-
-app.use('/feeRates', require('./modules/fee_rates/routes/fee_rates_route'));
-
-app.get('/template/bills', function (req, res) {
-    let checkAdmin = function (userAccount) {
-        return true;
-    }
-    if (checkAdmin(req.session.userAccount)) {
-        res.render('maintain/templates/html/bills.html',
-            {userAccount: req.session.userAccount,
-                userID: req.session.userID});
-    } else {
-        res.redirect('/pm');
-    }
-});
-
-app.use('/template/bills/api', function (req, res, next) {
-    let checkAdmin = function (userAccount) {
-        return true;
-    }
-    if (checkAdmin(req.session.sessionUser)) {
-        next();
-    } else {
-        res.json({error: 1, message: '对不起,您无权限操作清单模板。', data: null});
-    }
-});
-let billsTemplateRouter = require('./modules/templates/routes/bills_template_router');
-app.use('/template/bills/api', billsTemplateRouter);
-
-app.get('/pm', function(req, res){
-    res.render('building_saas/pm/html/project-management.html',
-        {userAccount: req.session.userAccount,
-            userID: req.session.sessionUser.ssoId});
-});
-let pmRouter = require('./modules/pm/routes/pm_route');
-app.use('/pm/api', pmRouter);
-
-app.get('/main',  function(req, res) {
-    let pm = require('./modules/pm/controllers/pm_controller');
-    pm.checkProjectRight(req.session.sessionUser.ssoId, req.query.project, function (hasRight) {
-        if (hasRight) {
-            res.render('building_saas/main/html/main.html',
-                {
-                    userAccount: req.session.userAccount,
-                    userID: req.session.sessionUser.ssoId
-                });
-        } else {
-            res.redirect('/pm');
-        }
-    });
-});
-
-let project_Router = require('./modules/main/routes/project_route');
-let bills_Router = require('./modules/main/routes/bills_route');
-let ration_Router = require('./modules/main/routes/ration_route');
-let GLJ_Router = require('./modules/main/routes/GLJ_route');
-app.use('/project', project_Router);
-app.use('/bills', bills_Router);
-app.use('/ration', ration_Router);
-app.use('/glj_bak', GLJ_Router);
+//加载路由文件
+fileUtils.getGlobbedFiles('./modules/**/routes/*.js').forEach(function(modelPath) {
+    require(path.resolve(modelPath))(app);
+})
 
 //app.use(express.static(_rootDir+"/web"));
 //app.use(express.static(_rootDir+"/lib"));
 //let rations_Router = require("./modules/rationLibEditor/routes/rationLibEditor_route");
 //app.use("/rationLibEditor",rations_Router);
 
-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.ssoId});
-    }
-});
-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');
-});
-let billsLibRouter = require("./modules/bills_lib/routes/bills_lib_routes");
-app.use("/stdBillsEditor", billsLibRouter);
-
-let rationRouter = require("./modules/ration_repository/routes/ration_front_end_routes");
-app.use("/rationRepository/api", rationRouter);
-
-let rpt_Router = require("./modules/reports/routes/report_router");
-app.use("/report_api", rpt_Router);
-let rptTpl_Router = require("./modules/reports/routes/rpt_tpl_router_fe");
-app.use("/report_tpl_api", rptTpl_Router);
-
 //-----------------
 
 app.use(function(req, res, next) {

+ 441 - 0
test/calculation/test_ration_calc.js

@@ -0,0 +1,441 @@
+/**
+ * Created by CSL on 2017/7/14.
+ */
+var test = require('tape');
+var rationCalc = require('../../public/calc_util');
+
+let dummyFee = [
+    {
+        "ID" : 1,
+        "ParentID" : null,
+        "name" : "企业管理费",
+        "rate" : null,
+        "memo" : null
+    },
+    {
+        "ID" : 2,
+        "ParentID" : 1,
+        "name" : "建筑工程",
+        "rate" : null,
+        "memo" : null
+    },
+    {
+        "ID" : 3,
+        "ParentID" : 2,
+        "name" : "一类工程",
+        "rate" : 16.03,
+        "memo" : null
+    },
+    {
+        "ID" : 4,
+        "ParentID" : 2,
+        "name" : "二类工程",
+        "rate" : 14.95,
+        "memo" : null
+    },
+    {
+        "ID" : 5,
+        "ParentID" : 2,
+        "name" : "三类工程",
+        "rate" : 12.47,
+        "memo" : null
+    },
+    {
+        "ID" : 6,
+        "ParentID" : 2,
+        "name" : "四类工程",
+        "rate" : 9.3,
+        "memo" : null
+    },
+    {
+        "ID" : 7,
+        "ParentID" : 1,
+        "name" : "市政工程",
+        "rate" : null,
+        "memo" : null
+    },
+    {
+        "ID" : 8,
+        "ParentID" : 7,
+        "name" : "一类工程",
+        "rate" : 16.33,
+        "memo" : null
+    },
+    {
+        "ID" : 9,
+        "ParentID" : 7,
+        "name" : "二类工程",
+        "rate" : 15,
+        "memo" : null
+    },
+    {
+        "ID" : 10,
+        "ParentID" : 7,
+        "name" : "三类工程",
+        "rate" : 12.5,
+        "memo" : null
+    },
+    {
+        "ID" : 11,
+        "ParentID" : 7,
+        "name" : "四类工程",
+        "rate" : 9.5,
+        "memo" : null
+    },
+    {
+        "ID" : 12,
+        "ParentID" : 1,
+        "name" : "机械土石方",
+        "rate" : 15.5,
+        "memo" : null
+    },
+    {
+        "ID" : 13,
+        "ParentID" : 1,
+        "name" : "仿古建筑工程",
+        "rate" : 12,
+        "memo" : null
+    },
+    {
+        "ID" : 14,
+        "ParentID" : 1,
+        "name" : "建筑修缮工程",
+        "rate" : 12.47,
+        "memo" : null
+    },
+    {
+        "ID" : 15,
+        "ParentID" : 1,
+        "name" : "炉窑砌筑工程",
+        "rate" : null,
+        "memo" : null
+    },
+    {
+        "ID" : 16,
+        "ParentID" : 15,
+        "name" : "一类工程",
+        "rate" : 14.25,
+        "memo" : null
+    },
+    {
+        "ID" : 17,
+        "ParentID" : 15,
+        "name" : "二类工程",
+        "rate" : 12.47,
+        "memo" : null
+    },
+    {
+        "ID" : 18,
+        "ParentID" : 15,
+        "name" : "三类工程",
+        "rate" : 10.8,
+        "memo" : null
+    },
+    {
+        "ID" : 19,
+        "ParentID" : 15,
+        "name" : "四类工程",
+        "rate" : null,
+        "memo" : null
+    },
+    {
+        "ID" : 20,
+        "ParentID" : null,
+        "name" : "规费",
+        "rate" : null,
+        "memo" : null
+    },
+    {
+        "ID" : 21,
+        "ParentID" : 20,
+        "name" : "建筑工程",
+        "rate" : 4.87,
+        "memo" : null
+    },
+    {
+        "ID" : 22,
+        "ParentID" : 20,
+        "name" : "市政工程",
+        "rate" : 3.61,
+        "memo" : null
+    },
+    {
+        "ID" : 23,
+        "ParentID" : 20,
+        "name" : "机械土石方",
+        "rate" : 2.15,
+        "memo" : null
+    },
+    {
+        "ID" : 24,
+        "ParentID" : 20,
+        "name" : "仿古建筑工程",
+        "rate" : 2.84,
+        "memo" : null
+    },
+    {
+        "ID" : 25,
+        "ParentID" : 20,
+        "name" : "建筑修缮工程",
+        "rate" : 2.84,
+        "memo" : null
+    },
+    {
+        "ID" : 26,
+        "ParentID" : 20,
+        "name" : "炉窑砌筑工程",
+        "rate" : 3.61,
+        "memo" : null
+    },
+    {
+        "ID" : 27,
+        "ParentID" : null,
+        "name" : "利润",
+        "rate" : null,
+        "memo" : null
+    },
+    {
+        "ID" : 28,
+        "ParentID" : 27,
+        "name" : "建筑工程",
+        "rate" : null,
+        "memo" : null
+    },
+    {
+        "ID" : 29,
+        "ParentID" : 28,
+        "name" : "一类工程",
+        "rate" : 8.73,
+        "memo" : null
+    },
+    {
+        "ID" : 30,
+        "ParentID" : 28,
+        "name" : "二类工程",
+        "rate" : 6.94,
+        "memo" : null
+    }
+]
+
+let dummyCalcTpl = {
+    calType: 3,
+    calTypeName: "测试用_重庆",
+    compiledSeq: [],
+    calcItems: [
+        {
+        code: "1",
+        name: "基价直接工程费",
+        dispExpr: "A2+A5+A6+A10",
+        expression: "A('2') + A('5') + A('6') + A('10')",
+        compiledExpr: "",
+        statement: "基价人工费+基价材料费+基价机械费+未计价材料费"
+    },
+        {
+        code: "2",
+        name: "基价人工费",
+        dispExpr: "A3+A4",
+        expression: "A('3') + A('4')",
+        compiledExpr: "",
+        statement: "定额基价人工费+定额人工单价(基价)调整"
+    },
+        {
+        code: "3",
+        name: "定额基价人工费",
+        dispExpr: "定额基价人工费",
+        expression: "base('定额基价人工费').toFixed(2)",
+        compiledExpr: "",
+        statement: "定额基价人工费"
+    },
+        {
+        code: "4",
+        name: "定额人工单价(基价)调整",
+        dispExpr: "A3*[1.89-1]",
+        expression: "A('3') * (1.89-1)",
+        compiledExpr: "",
+        statement: "定额基价人工费*[定额人工单价(基价)调整系数-1]"
+    },
+        {
+        code: "5",
+        name: "基价材料费",
+        dispExpr: "定额基价材料费",
+        expression: "base('定额基价材料费')",
+        compiledExpr: "",
+        statement: "定额基价材料费"
+    },
+        {
+        code: "6",
+        name: "基价机械费",
+        dispExpr: "A7+A9",
+        expression: "A('7') + A('9')",
+        compiledExpr: "",
+        statement: "定额基价机械费+定额机上人工单价(基价)调整"
+    },
+        {
+        code: "7",
+        name: "定额基价机械费",
+        dispExpr: "定额基价机械费",
+        expression: "base('定额基价机械费')",
+        compiledExpr: "",
+        statement: "定额基价机械费"
+    },
+        {
+        code: "8",
+        name: "其中:定额基价机上人工费",
+        dispExpr: "定额基价机上人工费",
+        expression: "base('定额基价机上人工费')",
+        compiledExpr: "",
+        statement: "定额基价机上人工费"
+    },
+        {
+        code: "9",
+        name: "定额机上人工单价(基价)调整",
+        dispExpr: "A8*[1.89-1]",
+        expression: "A('8') * (1.89-1)",
+        compiledExpr: "",
+        statement: "定额基价机上人工费*[定额机上人工单价(基价)调整系数-1]"
+    },
+        {
+        code: "10",
+        name: "未计价材料费",
+        dispExpr: "主材费+设备费",
+        expression: "base('主材费') + base('设备费')",
+        compiledExpr: "",
+        statement: "主材费+设备费"
+    },
+        {
+        code: "11",
+        name: "企业管理费",
+        dispExpr: "A3",
+        expression: "A('3')",
+        compiledExpr: "",
+        statement: "定额基价人工费"
+    },
+        {
+        code: "12",
+        name: "利润",
+        dispExpr: "A3",
+        expression: "A('3')",
+        compiledExpr: "",
+        statement: "定额基价人工费"
+    },
+        {
+        code: "13",
+        name: "风险因素",
+        dispExpr: "",
+        expression: "A('3')",
+        compiledExpr: "",
+        statement: "定额基价人工费"
+    },
+        {
+        code: "14",
+        name: "人材机价差",
+        dispExpr: "A15+A16+A17",
+        expression: "A('15') + A('16') + A('17')",
+        compiledExpr: "",
+        statement: "人工费价差+材料费价差+机械费价差"
+    },
+        {
+        code: "15",
+        name: "人工费价差",
+        dispExpr: "信息价或市场价格-调整后的定额人工费(基价)",
+        expression: "base('市场价格人工费') - base('定额基价人工费(调整后)')",
+        compiledExpr: "",
+        statement: "市场价格人工费-调整后的定额人工费(基价)"
+    },
+        {
+        code: "16",
+        name: "材料费价差",
+        dispExpr: "信息价或市场价格-定额基价材料费",
+        expression: "base('市场价格材料费') - base('定额基价材料费(调整后)')",
+        compiledExpr: "",
+        statement: "市场价格材料费-定额基价材料费"
+    },
+        {
+        code: "17",
+        name: "机械费价差",
+        dispExpr: "信息价或市场价格-调整后的定额基价机械费(基价)",
+        expression: "base('市场价格机械费') - base('定额基价机械费(调整后)')",
+        compiledExpr: "",
+        statement: "市场价格机械费-调整后的定额基价机械费(基价)"
+    },
+        {
+        code: "18",
+        name: "综合单价",
+        dispExpr: "A1+A11+A12+A13+A14",
+        expression: "A('1') + A('11') + A('12') + A('13') + A('14')",
+        compiledExpr: "",
+        statement: "基价直接工程费+企业管理费+利润+风险因素+人材机价差"
+    }
+    ]
+};
+
+let dummyRation = {
+    "sectionId" : 76,
+    "ID" : 15,
+    "code" : "AA0001",
+    "name" : "人工挖土方",
+    "unit" : "100m3",
+    "basePrice" : 840.84,
+    "caption" : "人工挖土方",
+    "feeType" : 2,
+    "rationGljList" : [
+        {
+            "glj" : {
+                "repositoryId" : 3,
+                "ID" : 17,
+                "code" : "00010201",
+                "name" : "土石方综合工日",
+                "specs" : null,
+                "unit" : "工日",
+                "basePrice" : 22,
+                "gljDistType" : "人工",
+                "gljType" : 2
+            },
+            "consumeAmt" : 38.22,
+            "proportion" : 0
+        },{
+            "glj": {
+                "repositoryId" : 3,
+                "ID" : 68,
+                "code" : "85030207",
+                "name" : "履带式起重机",
+                "specs" : "50t",
+                "unit" : "台班",
+                "basePrice" : 1194.05,
+                "gljDistType" : "机械",
+                "gljType" : 64
+            },
+            "consumeAmt" : 1.22,
+            "proportion" : 0
+        },{
+            "glj": {
+                "repositoryId" : 3,
+                "ID" : 200,
+                "code" : "36290101",
+                "name" : "水",
+                "specs" : "",
+                "unit" : "m3",
+                "basePrice" : 2,
+                "gljDistType" : "材料",
+                "gljType" : 6
+            },
+            "consumeAmt" : 9.2,
+            "proportion" : 0
+        }
+    ],
+    "rationRepId" : 3
+}
+
+//*
+test('计算式测试', function(t){
+    rationCalc.init(dummyCalcTpl, dummyFee);
+    rationCalc.compile();
+    rationCalc.calculate(dummyRation);
+    for (let idx of dummyCalcTpl.compiledSeq) {
+        let item = dummyCalcTpl.calcItems[idx];
+        console.log('code: ' + item.code + ' | expression: ' + item.compiledExpr +  ' | result: ' + item.execRst);
+    }
+    t.pass('just pass for calculation initialization!');
+    t.end();
+})
+

+ 1 - 1
test/tmp_data/bills_grid_setting.js

@@ -366,7 +366,7 @@ var BillsGridSetting ={
                 ]
             },
             "data":{
-                "field":"",
+                "field":"adjustState",
                 "vAlign":1,
                 "hAlign":0,
                 "font":"Arial"

File diff suppressed because it is too large
+ 4 - 1
web/building_saas/main/html/main.html


+ 17 - 9
web/building_saas/main/js/models/ration.js

@@ -56,16 +56,24 @@ var Ration = {
 
         // refresh after update
         ration.prototype.doAfterUpdate = function(err, data){
-            var controller = projectObj.mainController, project = projectObj.project;
-            //var selected = projectObj.mainController.tree.selected;
-            console.log(controller.sheet.getSelections());
-
-            // to do
-            console.log(controller.sheet.getCell(8, 9).value());
-            var selected = projectObj.project.mainTree.selected;
-            console.log(data);
-
+            if(data.stateRefresh){
+                this.refreshAdjustState(data);
+            }
         };
+        ration.prototype.refreshAdjustState = function(data){
+            var controller = projectObj.mainController;
+             var dataIndex = _.findIndex(this.datas,function(item) {
+                 return item.ID ==data.rationID;
+             });
+            this.datas[dataIndex].adjustState = data.adjustState;
+            var selected = controller.sheet.getSelections();
+            var col =   _.findIndex(BillsGridSetting.cols,function (col) {
+                return col.data.field =='adjustState';
+            })
+            controller.sheet.getCell(selected[0].row,col).value(data.adjustState);
+            console.log(data.adjustState);
+        }
+
 
         ration.prototype.getTempRationData = function (id, billsID, serialNo) {
             var newData = {'ID': id, 'serialNo': serialNo, projectID: this.project.ID()};

+ 4 - 4
web/building_saas/main/js/models/ration_coe.js

@@ -42,13 +42,13 @@ var ration_coe = {
             }else {
                 projectObj.project.ration_coe.datas = data;
             }
-            sheetCommonObj.showData(gljOprObj.coeSheet,gljOprObj.coeSetting,data);
+            gljOprObj.showCoeData(gljOprObj.coeSheet,gljOprObj.coeSetting,data);
             gljOprObj.coeSheetData=data;
             // SheetDataHelper.loadSheetData(setting, rationLibObj.sectionRationsSpread.getActiveSheet(), datas);
         };
         ration_coe.prototype.refreshAfterUpdate=function(data){
             var coe_list = projectObj.project.ration_coe.datas;
-            var coe_index= _.findIndex(coe_list,(coe)=>{
+            var coe_index= _.findIndex(coe_list,function(coe){
                 return coe.ID==data.query.ID&&coe.projectID==data.query.projectID;
             })
             _.forEach(data.doc, function(n, key) {
@@ -57,13 +57,13 @@ var ration_coe = {
 
             var showList = _.filter(coe_list,{'projectID':data.query.projectID,'rationID':coe_list[coe_index].rationID});
             gljOprObj.coeSheetData=showList;
-           sheetCommonObj.showData(gljOprObj.coeSheet,gljOprObj.coeSetting,showList);
+            gljOprObj.showCoeData(gljOprObj.coeSheet,gljOprObj.coeSetting,showList);
         };
         ration_coe.prototype.refreshAfterDelete=function(data){
             var glj_list = projectObj.project.ration_coe.datas;
             _.remove(glj_list,data.query);
             _.remove(gljOprObj.sheetData,data.query);
-            sheetCommonObj.showData(gljOprObj.coeSheet,gljOprObj.coeSetting,gljOprObj.sheetData);
+            gljOprObj.showCoeData(gljOprObj.coeSheet,gljOprObj.coeSetting,gljOprObj.sheetData);
         };
 
         ration_coe.prototype.getRationCoedata=function(newRation,data){

+ 3 - 1
web/building_saas/main/js/models/ration_glj.js

@@ -74,6 +74,7 @@ var ration_glj = {
             }else {
                 rationID= me.refreshEachItme(data.doc,data.query);
             }
+            //to do   ---refresh by selected ration id
             var showList = _.filter(projectObj.project.ration_glj.datas,{'rationID':rationID});
             gljOprObj.sheetData=showList;
             sheetCommonObj.showData(gljOprObj.sheet,gljOprObj.setting,showList);
@@ -249,7 +250,8 @@ var ration_glj = {
         ration_glj.prototype.marketPriceAdjustUpdate = function (recode,newVal) {
             var query = {
                 'ID':recode.ID,
-                'projectID': recode.projectID
+                'projectID': recode.projectID,
+                'rationID':recode.rationID
             };
             var doc ={
                 market_price:newVal,

File diff suppressed because it is too large
+ 85 - 28
web/building_saas/main/js/views/glj_view.js


+ 31 - 0
web/building_saas/main/js/views/ration_calc_view.js

@@ -0,0 +1,31 @@
+/**
+ * Created by CSL on 2017-07-17.
+ */
+
+var rationCalcOpr = {
+    sheet: null,
+    libID: null,
+    ration: null,
+    setting: {
+        header:[
+            {headerName:"费用代号",headerWidth:80, dataCode:"code", dataType: "String", hAlign: "center"},
+            {headerName:"费用名称",headerWidth:180, dataCode:"name", dataType: "String"},
+            {headerName:"计算基数",headerWidth:180, dataCode:"dispExpr", dataType: "String"},
+            {headerName:"基数说明",headerWidth:180, dataCode:"dispExprMemo", dataType: "String"},
+            {headerName:"费率",headerWidth:80, dataCode:"feeRate", dataType: "Number"},   // precision: 3
+            {headerName:"单价",headerWidth:100, dataCode:"unitFee", dataType: "Number"},
+            {headerName:"合价",headerWidth:100,dataCode:"totalFee", dataType: "Number"},
+            {headerName:"备注",headerWidth:120, dataCode:"memo", dataType: "String"}
+        ],
+        view:{
+            comboBox:[],
+            lockColumns:[1,2,3,4,5,6,7,8]
+        }
+    },
+
+    initSheet: function(sheet) {
+        var me = this;
+        me.sheet = sheet;
+        sheetCommonObj.initSheet(me.sheet, me.setting, 20);
+    }
+}

+ 1 - 1
web/building_saas/main/js/views/sub_view.js

@@ -46,7 +46,7 @@ $("#linkGCLMX").click(function(){
 
 $("#linkJSCX").click(function(){
     subSpread.setActiveSheetIndex(4);
-    // for test
+    rationCalcOpr.initSheet(subSpread.getSheet(4));
     subSpread.getActiveSheet().setValue(0, 0, "计算程序");
 });