Browse Source

Merge branch 'master' of http://smartcost.f3322.net:3000/SmartCost/ConstructionCost

zhangweicheng 7 years ago
parent
commit
9358d56e01
36 changed files with 411 additions and 236 deletions
  1. 1 0
      config/gulpConfig.js
  2. 1 1
      modules/all_models/fee_rates.js
  3. 1 1
      modules/all_models/projects.js
  4. 1 1
      modules/all_models/unit_price_file.js
  5. 1 1
      modules/bills_lib/routes/maintain_bills_routes.js
  6. 2 2
      modules/complementary_glj_lib/controllers/gljController.js
  7. 8 8
      modules/complementary_ration_lib/controllers/compleRationController.js
  8. 2 2
      modules/complementary_ration_lib/controllers/compleSectionTreeController.js
  9. 5 5
      modules/complementary_ration_lib/controllers/compleViewController.js
  10. 2 2
      modules/complementary_ration_lib/controllers/searchController.js
  11. 3 3
      modules/glj/controllers/glj_controller.js
  12. 7 3
      modules/main/controllers/bills_controller.js
  13. 6 0
      modules/main/controllers/project_controller.js
  14. 1 1
      modules/main/controllers/ration_controller.js
  15. 2 2
      modules/main/routes/main_route.js
  16. 11 11
      modules/pm/controllers/pm_controller.js
  17. 1 1
      modules/ration_glj/facade/ration_glj_facade.js
  18. 2 2
      modules/reports/controllers/rpt_controller.js
  19. 36 0
      modules/reports/rpt_component/helper/jpc_helper_discrete.js
  20. 31 17
      modules/reports/rpt_component/jpc_bill_tab.js
  21. 69 48
      modules/reports/rpt_component/jpc_flow_tab.js
  22. 51 16
      web/building_saas/complementary_glj_lib/html/tools-gongliaoji.html
  23. 54 30
      web/building_saas/complementary_glj_lib/js/components.js
  24. 10 6
      web/building_saas/css/main.css
  25. 1 44
      web/building_saas/main/html/main.html
  26. 0 1
      web/building_saas/main/js/models/cache_tree.js
  27. 1 0
      web/building_saas/main/js/views/project_view.js
  28. 12 15
      web/building_saas/pm/html/project-management.html
  29. 41 5
      web/building_saas/pm/js/pm_gc.js
  30. 45 7
      web/building_saas/pm/js/pm_newMain.js
  31. 3 1
      web/building_saas/pm/js/pm_tree.js
  32. BIN
      web/dest/css/img/engineering.png
  33. BIN
      web/dest/css/img/folder_close.png
  34. BIN
      web/dest/css/img/folder_open.png
  35. BIN
      web/dest/css/img/project.png
  36. BIN
      web/dest/css/img/tender.png

+ 1 - 0
config/gulpConfig.js

@@ -144,6 +144,7 @@ module.exports = {
         'public/web/common_ajax.js',
         'public/web/treeDataHelper.js',
         'public/web/QueryParam.js',
+        'lib/lodash/lodash.js',
         'public/web/id_tree.js',
         'public/web/tree_sheet/tree_sheet_controller.js',
         'public/web/tree_sheet/tree_sheet_helper.js',

+ 1 - 1
modules/all_models/fee_rates.js

@@ -49,7 +49,7 @@ mongoose.model('fee_rates', feeRatesSchema, 'fee_rates');
 let feeRateFileSchema = new Schema({
     ID: String,
     rootProjectID:Number,//顶层项目ID
-    userID:Number,
+    userID:String,
     name:String,
     libID: String,
     libName: String,

+ 1 - 1
modules/all_models/projects.js

@@ -11,7 +11,7 @@ const ProjectSchema = new Schema({
     "ID": Number,
     "ParentID": Number,
     "NextSiblingID": Number,
-    "userID": Number,
+    "userID": String,
     "name": String,
     "projType": String,
     "recentDateTime": Date,

+ 1 - 1
modules/all_models/unit_price_file.js

@@ -20,7 +20,7 @@ let modelSchema = {
     // 显示名称
     name: String,
     // 所属用户id
-    user_id: Number,
+    user_id: String,
     // 顶层projectId
     root_project_id: Number,
     deleteInfo: deleteSchema

+ 1 - 1
modules/bills_lib/routes/maintain_bills_routes.js

@@ -13,7 +13,7 @@ module.exports = function (app) {
         else {
             res.render("maintain/bills_lib/html/main.html",
                 {userAccount: req.session.userAccount,
-                    userID: req.session.sessionUser.ssoId});
+                    userID: req.session.sessionUser.id});
         }
     });
     app.get("/stdBills", function(req, res){

+ 2 - 2
modules/complementary_glj_lib/controllers/gljController.js

@@ -30,7 +30,7 @@ class GljController extends BaseController{
             gljLibId = engineeringInfo.glj_lib.length > 0 && typeof engineeringInfo.glj_lib !== 'undefined' ? engineeringInfo.glj_lib[0].id : null;
         }
         res.render('building_saas/complementary_glj_lib/html/tools-gongliaoji.html',{
-            userID: req.session.sessionUser.ssoId,
+            userID: req.session.sessionUser.id,
             gljLibId: gljLibId,
             compilationId: sessionCompilation._id
         });
@@ -96,7 +96,7 @@ class GljController extends BaseController{
         })
     }
     mixUpdateGljItems(req, res){
-        let user_id = req.session.sessionUser.ssoId,
+        let user_id = req.session.sessionUser.id,
             compilation_id = req.session.sessionCompilation._id;
         let data = JSON.parse(req.body.data);
         let updateItems = data.updateItems,

+ 8 - 8
modules/complementary_ration_lib/controllers/compleRationController.js

@@ -14,14 +14,14 @@ let callback = function (req, res, err, msg, data) {
 class CompleRationController extends BaseController{
     getRationItems(req, res){
         let data = JSON.parse(req.body.data);
-        compleRationDao.getRationItems(req.session.sessionUser.ssoId, data.rationRepId, data.sectionId, function (err, data) {
+        compleRationDao.getRationItems(req.session.sessionUser.id, data.rationRepId, data.sectionId, function (err, data) {
             callback(req, res, err, '', data);
         });
     }
 
     updateRations(req, res){
         let data = JSON.parse(req.body.data);
-        compleRationDao.updateRation(req.session.sessionUser.ssoId, req.session.sessionCompilation._id, data.updateData, function (err, data) {
+        compleRationDao.updateRation(req.session.sessionUser.id, req.session.sessionCompilation._id, data.updateData, function (err, data) {
             callback(req, res, err, '', data);
         });
     }
@@ -29,14 +29,14 @@ class CompleRationController extends BaseController{
     //更新补充定额价格
     updateRationBasePrc(req, res){
         let data = JSON.parse(req.body.data);
-        compleRationDao.updateRationBasePrc(req.session.sessionUser.ssoId, data.basePrcArr, function (err, data) {
+        compleRationDao.updateRationBasePrc(req.session.sessionUser.id, data.basePrcArr, function (err, data) {
             callback(req, res, err, '', data);
         });
     }
 
     mixUpdateRationItems(req, res){
         let data = JSON.parse(req.body.data);
-        compleRationDao.mixUpdateRationItems(req.session.sessionUser.ssoId, req.session.sessionCompilation._id,
+        compleRationDao.mixUpdateRationItems(req.session.sessionUser.id, req.session.sessionCompilation._id,
             data.rationRepId, data.sectionId, data.updateItems, data.addItems, data.removeIds, function (err, data) {
             callback(req, res, err, '', data);
         });
@@ -45,7 +45,7 @@ class CompleRationController extends BaseController{
     //获取所有定额的编号
     getRationsCodes(req, res){
         let data = JSON.parse(req.body.data);
-        compleRationDao.getRationsCodes(req.session.sessionUser.ssoId, data.rationRepId, function (err, data) {
+        compleRationDao.getRationsCodes(req.session.sessionUser.id, data.rationRepId, function (err, data) {
             callback(req, res, err, '', data);
         });
     }
@@ -66,21 +66,21 @@ class CompleRationController extends BaseController{
 
     getGljItemsByIds(req, res){
         let data = JSON.parse(req.body.data);
-        compleRationDao.getGljItemsByIds(req.session.sessionUser.ssoId, data.ids, function (err, data) {
+        compleRationDao.getGljItemsByIds(req.session.sessionUser.id, data.ids, function (err, data) {
             callback(req, res, err, '', data);
         });
     }
 
     getGljItemsByCodes(req, res){
         let data = JSON.parse(req.body.data);
-        compleRationDao.getGljItemsByCodes(req.session.sessionUser.ssoId, req.session.sessionCompilation._id, data.rationRepId, data.gljCodes, function (err, data) {
+        compleRationDao.getGljItemsByCodes(req.session.sessionUser.id, req.session.sessionCompilation._id, data.rationRepId, data.gljCodes, function (err, data) {
             callback(req, res, err, '', data);
         });
     }
 
     getRationGljItemsBySection(req, res){
         let data = JSON.parse(req.body.data);
-        compleRationDao.getRationGljItemsBySection(req.session.sessionUser.ssoId, data.sectionId, function (err, data) {
+        compleRationDao.getRationGljItemsBySection(req.session.sessionUser.id, data.sectionId, function (err, data) {
             callback(req, res, err, '', data);
         });
     }

+ 2 - 2
modules/complementary_ration_lib/controllers/compleSectionTreeController.js

@@ -20,14 +20,14 @@ class CompleSectionTreeController extends BaseController{
 
     getRationTree(req, res){
         let data = JSON.parse(req.body.data);
-        sectionTreeDao.getRationTree(req.session.sessionUser.ssoId, data.rationRepId, function (err, data) {
+        sectionTreeDao.getRationTree(req.session.sessionUser.id, data.rationRepId, function (err, data) {
             callback(req, res, err, '', data);
         });
     }
 
     updateRationSection(req, res){
         let data = JSON.parse(req.body.data);
-        sectionTreeDao.updateSection(req.session.sessionUser.ssoId, req.session.sessionCompilation._id, data.updateData, function (err, data) {
+        sectionTreeDao.updateSection(req.session.sessionUser.id, req.session.sessionCompilation._id, data.updateData, function (err, data) {
             callback(req, res, err, '', data);
         });
     }

+ 5 - 5
modules/complementary_ration_lib/controllers/compleViewController.js

@@ -13,32 +13,32 @@ let callback = function (req, res, err, msg, data) {
 class CompleViewController extends BaseController{
     redirectMain(req, res){
         res.render('building_saas/complementary_ration_lib/html/main.html', {
-            userID: req.session.sessionUser.ssoId,
+            userID: req.session.sessionUser.id,
             compilationId: req.session.sessionCompilation._id
         });
     }
 
     redirectRation(req, res){
         res.render('building_saas/complementary_ration_lib/html/dinge.html', {
-            userID: req.session.sessionUser.ssoId
+            userID: req.session.sessionUser.id
         });
     }
 
     redirectGljList(req, res){
         res.render('building_saas/complementary_ration_lib/html/gongliao.html', {
-            userID: req.session.sessionUser.ssoId
+            userID: req.session.sessionUser.id
         });
     }
 
     redirectCoeList(req, res){
         res.render('building_saas/complementary_ration_lib/html/fuzhu.html', {
-            userID: req.session.sessionUser.ssoId
+            userID: req.session.sessionUser.id
         });
     }
 
     redirectInstallation(req, res){
         res.render('building_saas/complementary_ration_lib/html/anzhuang.html', {
-            userID: req.session.sessionUser.ssoId
+            userID: req.session.sessionUser.id
         });
     }
 

+ 2 - 2
modules/complementary_ration_lib/controllers/searchController.js

@@ -13,14 +13,14 @@ let callback = function (req, res, err, message, data) {
 class SearchController extends BaseController{
     getRationItem(req, res){
         let data = JSON.parse(req.body.data);
-        searchDao.getRationItem(req.session.sessionUser.ssoId, data.rationRepId, data.code, function (err, data) {
+        searchDao.getRationItem(req.session.sessionUser.id, data.rationRepId, data.code, function (err, data) {
             callback(req, res, err, '', data);
         });
     }
 
     findRation(req, res){
         let data = JSON.parse(req.body.data);
-        searchDao.findRation(req.session.sessionUser.ssoId, data.rationRepId, data.keyword, function (err, data) {
+        searchDao.findRation(req.session.sessionUser.id, data.rationRepId, data.keyword, function (err, data) {
             callback(req, res, err, '', data);
         });
     }

+ 3 - 3
modules/glj/controllers/glj_controller.js

@@ -249,7 +249,7 @@ class GLJController extends BaseController {
         try {
             let sessionUserData = request.session.sessionUser;
             // 获取对应用户所有的建设项目数据
-            let projectList = await ProjectModel.getUserProjectData(sessionUserData.ssoId);
+            let projectList = await ProjectModel.getUserProjectData(sessionUserData.id);
             if (projectList === null) {
                 throw '没有找到对应的项目数据';
             }
@@ -315,7 +315,7 @@ class GLJController extends BaseController {
 
                 insertData = JSON.parse(JSON.stringify(currentUnitPrice));
                 insertData.root_project_id = rootProjectId;
-                insertData.user_id = insertData.user_id === undefined ? request.session.sessionUser.ssoId : insertData.user_id;
+                insertData.user_id = insertData.user_id === undefined ? request.session.sessionUser.id : insertData.user_id;
                 delete insertData._id;
                 delete insertData.ID;
             }
@@ -378,7 +378,7 @@ class GLJController extends BaseController {
             let insertData = {
                 name: name,
                 project_id: projectId,
-                user_id: request.session.sessionUser.ssoId,
+                user_id: request.session.sessionUser.id,
                 root_project_id: rootProjectId
             };
             let addResult = await unitPriceFileModel.add(insertData);

+ 7 - 3
modules/main/controllers/bills_controller.js

@@ -176,6 +176,7 @@ module.exports = {
             uploadDir: './public'
         };
         const form = new multiparty.Form(uploadOption);
+        let uploadFullName;
         form.parse(req, async function(err, fields, files) {
             try{
                 const projectID = fields.projectID !== undefined && fields.projectID.length > 0 ?
@@ -192,7 +193,7 @@ module.exports = {
                     throw '不支持该类型';
                 }
                 // 重命名文件名
-                const uploadFullName = uploadOption.uploadDir + '/' + file.originalFilename;
+                uploadFullName = uploadOption.uploadDir + '/' + file.originalFilename;
                 fs.renameSync(file.path, uploadFullName);
 
                 const sheet = excel.parse(uploadFullName);
@@ -235,14 +236,14 @@ module.exports = {
                 const billsLibId = fields.billsLibId !== undefined && fields.billsLibId.length > 0 && fields.billsLibId[0]? parseInt(fields.billsLibId[0]) : null;
                 let stdBills = [], stdJobs = [], stdCharacters = [];
                 if(billsLibId){
-                    stdBills = await stdBillsModel.find({billsLibId: billsLibId, deleted: false});
+                    stdBills = await stdBillsModel.find({billsLibId: billsLibId, deleted: false}, '-_id code jobs items engineering');
                     stdJobs = await stdBillJobsModel.find({billsLibId: billsLibId, deleted: false});
                     stdCharacters = await stdBillCharacterModel.find({billsLibId: billsLibId, deleted: false});
                 }
                 //将excel数据转换成清单树结构数据
                 let insertDatas = parseToBillData(getValidImportData(sheet[0].data), getColMapping(sheet[0].data), fixedBill, projectID, {stdBills: stdBills, stdJobs: stdJobs, stdCharacters: stdCharacters});
                 //删除相关数据
-                let deleteDatas = await billsData.deepDeleteBill([fixedBill], req.session.sessionUser.ssoId);
+                let deleteDatas = await billsData.deepDeleteBill([fixedBill], req.session.sessionUser.id);
                 //新增清单数据
                 await billsData.importBills(insertDatas);
                 //返回数据以更新前端
@@ -255,6 +256,9 @@ module.exports = {
                 res.json(responseData);
             }
             catch (error){
+                if(fs.existsSync(uploadFullName)){
+                    fs.unlink(uploadFullName);
+                }
                 responseData.err = 1;
                 responseData.msg = error;
                 res.json(responseData);

+ 6 - 0
modules/main/controllers/project_controller.js

@@ -23,6 +23,12 @@ module.exports = {
         });
     },
     getData: function (req, res) {
+        //add
+        console.log(`------------------------------------------`);
+        console.log(req.session.sessionUser);
+        console.log(req.session.userAccount);
+        console.log(`------------------------------------------`);
+        //add
         var data = JSON.parse(req.body.data);
         // 注释代码用于测试getFilterData
         // Project.getFilterData(data.project_id, ['bills', 'projectGLJ'], function (err, result) {

+ 1 - 1
modules/main/controllers/ration_controller.js

@@ -71,7 +71,7 @@ async function replaceRations(req,res) {
     try {
         let data = req.body.data;
         data = JSON.parse(data);
-        let userID = req.session.sessionUser.ssoId;
+        let userID = req.session.sessionUser.id;
         result.data = await ration_facade.replaceRations(userID,data);
     }catch (err){
         logger.err(err);

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

@@ -10,7 +10,7 @@ module.exports =function (app) {
     app.get('/main', baseController.init, function(req, res) {
         let pm = require('../../pm/controllers/pm_controller');
 
-        pm.checkProjectRight(req.session.sessionUser.ssoId, req.query.project, async function (hasRight) {
+        pm.checkProjectRight(req.session.sessionUser.id, req.query.project, async function (hasRight) {
             if (hasRight) {
                 // 获取项目信息
                 const projectId = req.query.project;
@@ -18,7 +18,7 @@ module.exports =function (app) {
                 res.render('building_saas/main/html/main.html',
                     {
                         userAccount: req.session.userAccount,
-                        userID: req.session.sessionUser.ssoId,
+                        userID: req.session.sessionUser.id,
                         projectData: projectData,
                     });
             } else {

+ 11 - 11
modules/pm/controllers/pm_controller.js

@@ -25,7 +25,7 @@ module.exports = {
     checkRight: function (req, res) {
         let data = JSON.parse(req.body.data);
         if (data.user_id) {
-            return data.user_id === req.session.sessionUser.ssoId;
+            return data.user_id === req.session.sessionUser.id;
         } else {
             return false;
         }
@@ -46,7 +46,7 @@ module.exports = {
         });
     },
     getProjects: async function(req, res){
-         await ProjectsData.getUserProjects(req.session.sessionUser.ssoId, req.session.sessionCompilation._id, function(err, message, projects){
+         await ProjectsData.getUserProjects(req.session.sessionUser.id, req.session.sessionCompilation._id, function(err, message, projects){
             if (projects) {
                 callback(req, res, err, message, projects);
             } else {
@@ -56,7 +56,7 @@ module.exports = {
     },
     updateProjects: async function (req, res) {
         let data = JSON.parse(req.body.data);
-        await ProjectsData.updateUserProjects(req.session.sessionUser.ssoId, req.session.sessionCompilation._id, data.updateData, function (err, message, data) {
+        await ProjectsData.updateUserProjects(req.session.sessionUser.id, req.session.sessionCompilation._id, data.updateData, function (err, message, data) {
             if (err === 0) {
                 callback(req, res, err, message, data);
             } else {
@@ -119,13 +119,13 @@ module.exports = {
     updateFiles: async function(req, res){
         let data = JSON.parse(req.body.data);
         let updateDatas = data.updateDatas;
-        await ProjectsData.udpateUserFiles(req.session.sessionUser.ssoId, updateDatas, function (err, message, data) {
+        await ProjectsData.udpateUserFiles(req.session.sessionUser.id, updateDatas, function (err, message, data) {
             callback(req, res, err, message, data);
         });
     },
     copyProjects: function (req, res) {
         let data = JSON.parse(req.body.data);
-        ProjectsData.copyUserProjects(req.session.sessionUser.ssoId, req.session.sessionCompilation._id, data.updateData, function (err, message, data) {
+        ProjectsData.copyUserProjects(req.session.sessionUser.id, req.session.sessionCompilation._id, data.updateData, function (err, message, data) {
             if (err === 0) {
                 callback(req, res, err, message, data);
             } else {
@@ -135,13 +135,13 @@ module.exports = {
     },
     rename: function (req, res) {
         let data = JSON.parse(req.body.data);
-        ProjectsData.rename(req.session.sessionUser.ssoId, req.session.sessionCompilation._id, data, function (err, message) {
+        ProjectsData.rename(req.session.sessionUser.id, req.session.sessionCompilation._id, data, function (err, message) {
             callback(req, res, err, message, null);
         });
     },
     getProject: function(req, res){
         let data = JSON.parse(req.body.data);
-        ProjectsData.getUserProject(req.session.sessionUser.ssoId, data.proj_id, async function(err, message, data){
+        ProjectsData.getUserProject(req.session.sessionUser.id, data.proj_id, async function(err, message, data){
             if (err === 0) {
                 let engineeringLibModel = new EngineeringLibModel();
                 let engineeringInfo = data !== null && data.property.engineering_id !== undefined ?
@@ -159,7 +159,7 @@ module.exports = {
     },
     beforeOpenProject: function (req, res) {
         let data = JSON.parse(req.body.data);
-        ProjectsData.beforeOpenProject(req.session.sessionUser.ssoId, data.proj_id, data.updateData, function (err, message, data) {
+        ProjectsData.beforeOpenProject(req.session.sessionUser.id, data.proj_id, data.updateData, function (err, message, data) {
             callback(req, res, err, message, data);
         });
     },
@@ -192,7 +192,7 @@ module.exports = {
 
         let renderData = {
             userAccount: request.session.userAccount,
-            userID: request.session.sessionUser.ssoId,
+            userID: request.session.sessionUser.id,
             compilationData: JSON.stringify(sessionCompilation),
             billValuation: JSON.stringify(billValuation),
             rationValuation: JSON.stringify(rationValuation),
@@ -259,7 +259,7 @@ module.exports = {
     },
 
     getGCDatas: async function(request, response) {
-        let userID = request.session.sessionUser.ssoId;
+        let userID = request.session.sessionUser.id;
         let compilatoinId = request.session.sessionCompilation._id;
         let rst = [];
         let _projs = Object.create(null), _engs = Object.create(null), prefix = 'ID_';
@@ -347,7 +347,7 @@ module.exports = {
     },
 
     recGC: function(request, response){
-        let userID = request.session.sessionUser.ssoId;
+        let userID = request.session.sessionUser.id;
         let data = JSON.parse(request.body.data);
         let nodes = data.nodes;
         ProjectsData.recGC(userID, nodes, function (err, msg, data) {

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

@@ -517,7 +517,7 @@ async function getLibInfo(req) {
         gljLibId = engineeringInfo.glj_lib.length > 0 && typeof engineeringInfo.glj_lib !== 'undefined' ? engineeringInfo.glj_lib[0].id : null;
     }
     let data = {
-        userID: req.session.sessionUser.ssoId,
+        userID: req.session.sessionUser.id,
         gljLibId: gljLibId,
         compilationId: sessionCompilation._id
     };

+ 2 - 2
modules/reports/controllers/rpt_controller.js

@@ -136,7 +136,7 @@ module.exports = {
             rptName = req.params.rptName,
             isOneSheet = req.params.isOneSheet,
             option = req.params.option;
-        let user_id = req.session.sessionUser.ssoId;
+        let user_id = req.session.sessionUser.id;
         let dftOption = option||JV.PAGING_OPTION_NORMAL;
         getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, dftOption, function(err, pageRst){
             try {
@@ -228,7 +228,7 @@ module.exports = {
             pageSize = req.params.size,
             rptName = req.params.rptName
         ;
-        let user_id = req.session.sessionUser.ssoId;
+        let user_id = req.session.sessionUser.id;
         getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, JV.PAGING_OPTION_NORMAL, function(err, pageRst){
             rpt_pdf_util.export_pdf_file(pageRst, pageSize, rptName,function (newName) {
                 res.setHeader('Content-Type', 'application/vnd.openxmlformats');

+ 36 - 0
modules/reports/rpt_component/helper/jpc_helper_discrete.js

@@ -67,6 +67,42 @@ let JpcDiscreteHelper = {
                         rst.push(JpcTextHelper.outputText(discreteArray[i][JV.PROP_TEXTS][j], band, unitFactor, 1, 0, 1, 0, 1, 0));
                     }
                 }
+                if (discreteArray[i][JV.PROP_DISCRETE_FIELDS]) {
+                    for (let j = 0; j < discreteArray[i][JV.PROP_DISCRETE_FIELDS].length; j++) {
+                        let df = discreteArray[i][JV.PROP_DISCRETE_FIELDS][j];
+                        let value = "";
+                        let item = JpcCommonOutputHelper.createCommonOutputWithoutDecorate(df, value, null);
+                        //position
+                        item[JV.PROP_AREA] = JpcAreaHelper.outputArea(df[JV.PROP_AREA], band, unitFactor, 1, 0, 1, 0, 1, 0, false, false);
+                        rst.push(item);
+                    }
+                }
+
+            }
+        }
+        return rst;
+    },
+    outputPreviewSumInfoOutput: function (band, unitFactor, tab) {
+        let rst = [];
+        if (tab[JV.PROP_TEXT]) {
+            rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXT], band, unitFactor, 1, 0, 1, 0, 1, 0));
+        }
+        if (tab[JV.PROP_TEXTS]) {
+            for (let j = 0; j < tab[JV.PROP_TEXTS].length; j++) {
+                rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXTS][j], band, unitFactor, 1, 0, 1, 0, 1, 0));
+            }
+        }
+        if (tab[JV.PROP_SUM_FIELDS]) {
+            for (let i = 0; i < tab[JV.PROP_SUM_FIELDS].length; i++) {
+                let tab_field = tab[JV.PROP_SUM_FIELDS][i];
+                if (!(tab_field[JV.PROP_HIDDEN])) {
+                    // rst.push(me.outputTabField(band, tab_field, null, -1, -1, 1, 0, 1, 0, unitFactor, true, controls, 0));
+                    let value = "";
+                    let item = JpcCommonOutputHelper.createCommonOutputWithoutDecorate(tab_field, value, null);
+                    //position
+                    item[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, unitFactor, 1, 0, 1, 0, 1, 0, false, false);
+                    rst.push(item);
+                }
             }
         }
         return rst;

+ 31 - 17
modules/reports/rpt_component/jpc_bill_tab.js

@@ -46,23 +46,7 @@ JpcBillTabSrv.prototype.createNew = function(){
         let pageStatus = [true, true, false, true, false, false, false, false];
         JpcBandHelper.setBandArea(bands, rptTpl, pageStatus, true, false);
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
-        let tab = rptTpl[JV.NODE_BILL_INFO][JV.NODE_BILL_CONTENT];
-        let band = bands[tab[JV.PROP_BAND_NAME]];
-        if (band) {
-            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]]) {
-                if (tab[JV.PROP_TEXT]) {
-                    rst = rst.concat(JpcTextHelper.outputText(tab[JV.PROP_TEXT], band, unitFactor, 1, 0, 1, 0, 1, 0));
-                }
-                if (tab[JV.PROP_TEXTS]) {
-                    for (let j = 0; j < tab[JV.PROP_TEXTS].length; j++) {
-                        rst = rst.concat(JpcTextHelper.outputText(tab[JV.PROP_TEXTS][j], band, unitFactor, 1, 0, 1, 0, 1, 0));
-                    }
-                }
-                if (tab[JV.NODE_DISCRETE_INFO]) {
-                    rst = rst.concat(JpcDiscreteHelper.outputPreviewDiscreteInfo(tab[JV.NODE_DISCRETE_INFO], bands, unitFactor, pageStatus, page - 1, 1, 0));
-                }
-            }
-        }
+        rst = rst.concat(me.outputPreviewContent(rptTpl, bands, unitFactor, controls, pageStatus));
         rst = rst.concat(JpcDiscreteHelper.outputPreviewDiscreteInfo(rptTpl[JV.NODE_BILL_INFO][JV.NODE_DISCRETE_INFO], bands, unitFactor, pageStatus));
         return rst;
     };
@@ -83,6 +67,36 @@ JpcBillTabSrv.prototype.createNew = function(){
         }
         return rst;
     };
+    JpcBillTabResult.outputPreviewContent = function(rptTpl, bands, unitFactor, controls, pageStatus) {
+        let rst = [];
+        let tab = rptTpl[JV.NODE_BILL_INFO][JV.NODE_BILL_CONTENT];
+        let band = bands[tab[JV.PROP_BAND_NAME]];
+        if (band) {
+            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]]) {
+                let tab_fields = tab[JV.PROP_BILL_FIELDS];
+                for (let i = 0; i < tab_fields.length; i++) {
+                    let tab_field = tab_fields[i];
+                    if (!(tab_field[JV.PROP_HIDDEN])) {
+                        let cellItem = JpcCommonOutputHelper.createCommonOutput(tab_field, "", controls);
+                        cellItem[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, unitFactor, 1, 0, 1, 0, 1, 0, false, false);
+                        rst.push(cellItem);
+                    }
+                }
+                if (tab[JV.PROP_TEXT]) {
+                    rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXT], band, unitFactor, 1, 0, 1, 0, 1, 0));
+                }
+                if (tab[JV.PROP_TEXTS]) {
+                    for (let j = 0; j < tab[JV.PROP_TEXTS].length; j++) {
+                        rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXTS][j], band, unitFactor, 1, 0, 1, 0, 1, 0));
+                    }
+                }
+                if (tab[JV.NODE_DISCRETE_INFO]) {
+                    rst = rst.concat(JpcDiscreteHelper.outputPreviewDiscreteInfo(tab[JV.NODE_DISCRETE_INFO], bands, unitFactor, pageStatus));
+                }
+            }
+        }
+        return rst;
+    };
     JpcBillTabResult.outputContent = function(rptTpl, dataObj, page, bands, unitFactor, controls, pageStatus, $CURRENT_RPT) {
         let me = this, rst = [];
         let tab = rptTpl[JV.NODE_BILL_INFO][JV.NODE_BILL_CONTENT];

+ 69 - 48
modules/reports/rpt_component/jpc_flow_tab.js

@@ -597,30 +597,26 @@ JpcFlowTabSrv.prototype.createNew = function(){
     JpcFlowTabResult.outputAsPreviewPage = function (rptTpl, bands, controls, $CURRENT_RPT) {
         let me = this, rst = [], vIdx = [];
         //只预览第一页的数据
-        let pageStatus = [true, true, false, true, false, false, false, false];
+        let pageStatus = [true, true, true, true, true, true, true, true];
+        me.pageStatusLst.push(pageStatus);
+        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_FLOW_FIELDS], null, me.disp_fields_idx, false);
         JpcBandHelper.setBandArea(bands, rptTpl, pageStatus, true, false);
         let maxRowRec = JpcFlowTabHelper.getMaxRowsPerPage(bands, rptTpl, false);
         for (let i = 0; i < maxRowRec; i++) {
             vIdx.push([-1, JV.DISPLAY_VAL_TYPE_NORMAL, JV.BLANK_VALUE_INDEX]);
         }
-        let bkdispValueIdxLst = me.dispValueIdxLst;
-        me.pageStatusLst = [];
-        me.pageStatusLst.push(pageStatus);
-        me.dispValueIdxLst = [];
-        me.dispValueIdxLst.push(vIdx);
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
         // 2.2 Column tab
-        rst = rst.concat(me.outputColumn(rptTpl, null, 1, 0, bands, unitFactor, controls, 0));
+        rst = rst.concat(me.outputColumn(rptTpl, null, 1, 0, bands, unitFactor, 0));
         // 2.1 Content-Tab
-        // rst = rst.concat(me.outputContent(rptTpl, null, 1, bands, unitFactor, controls, 0, $CURRENT_RPT));
+        rst = rst.concat(me.outputPreviewContent(rptTpl, bands, unitFactor, controls, pageStatus, maxRowRec));
         // 2.3 Sum Seg
-        // rst = rst.concat(me.outputSegSum(rptTpl, dataObj, 1, 0, bands, unitFactor, controls));
+        rst = rst.concat(me.outputPreviewSegSum(rptTpl, bands, unitFactor, controls, pageStatus));
         // 2.4 Sum Page
-        // rst = rst.concat(me.outputPageSum(rptTpl, dataObj, 1, 0, bands, unitFactor, controls));
+        rst = rst.concat(me.outputPreviewPageSum(rptTpl, bands, unitFactor, controls, pageStatus));
         // 2.5 Group
         // 2.6 Discrete
         rst = rst.concat(JpcDiscreteHelper.outputPreviewDiscreteInfo(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_DISCRETE_INFO], bands, unitFactor, pageStatus));
-        me.dispValueIdxLst = bkdispValueIdxLst;
         return rst;
     };
     JpcFlowTabResult.outputAsSimpleJSONPage = function (rptTpl, dataObj, page, bands, controls, adHocMergePos, $CURRENT_RPT) {
@@ -640,7 +636,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
             // 2.1 Content-Tab
             tabRstLst.push(me.outputContent(rptTpl, dataObj, page, bands, unitFactor, controls, 0, $CURRENT_RPT));
             // 2.2 Column tab
-            tabRstLst.push(me.outputColumn(rptTpl, dataObj, page, segIdx, bands, unitFactor, controls, 0));
+            tabRstLst.push(me.outputColumn(rptTpl, dataObj, page, segIdx, bands, unitFactor, 0));
             // 2.3 Sum Seg
             tabRstLst.push(me.outputSegSum(rptTpl, dataObj, page, segIdx, bands, unitFactor, controls));
             // 2.4 Sum Page
@@ -674,7 +670,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
                 // 2.1 Content-Tab
                 tabRstLst.push(me.outputContent(rptTpl, dataObj, actualPage, bands, unitFactor, controls, pi, $CURRENT_RPT));
                 // 2.2 Column tab
-                tabRstLst.push(me.outputColumn(rptTpl, dataObj, actualPage, segIdx, bands, unitFactor, controls, pi));
+                tabRstLst.push(me.outputColumn(rptTpl, dataObj, actualPage, segIdx, bands, unitFactor, pi));
                 // 2.3 Sum Seg
                 tabRstLst.push(me.outputSegSum(rptTpl, dataObj, actualPage, segIdx, bands, unitFactor, controls));
                 // 2.4 Sum Page
@@ -692,6 +688,25 @@ JpcFlowTabSrv.prototype.createNew = function(){
         }
         return rst;
     };
+    JpcFlowTabResult.outputPreviewContent = function(rptTpl, bands, unitFactor, controls, pageStatus, maxRec) {
+        let me = this, rst = [];
+        let tab = rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT];
+        let band = bands[tab[JV.PROP_BAND_NAME]];
+        if (band) {
+            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]]) {
+                let tab_fields = tab[JV.PROP_FLOW_FIELDS];
+                for (let rowIdx = 0; rowIdx < maxRec; rowIdx++) {
+                    for (let i = 0; i < tab_fields.length; i++) {
+                        let tab_field = tab_fields[i];
+                        if (!(tab_field[JV.PROP_HIDDEN])) {
+                            rst.push(me.outputTabField(band, tab_field, null, -1, -1, maxRec, rowIdx, 1, 0, unitFactor, true, controls, 0));
+                        }
+                    }
+                }
+            }
+        }
+        return rst;
+    };
     JpcFlowTabResult.outputContent = function(rptTpl, dataObj, page, bands, unitFactor, controls, multiColIdx, $CURRENT_RPT) {
         let me = this, rst = [];
         let FLOW_NODE_STR = me.isEx?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;
@@ -730,7 +745,6 @@ JpcFlowTabSrv.prototype.createNew = function(){
                         }
                         if (!(tab_field[JV.PROP_HIDDEN])) {
                             // rst.push(me.outputTabField(band, tab_field, data_field, contentValuesIdx[rowIdx], -1, contentValuesIdx.length, rowIdx, 1, 0, unitFactor, true, controls, multiColIdx));
-                            //测试中
                             if (contentValuesIdx[rowIdx][0] !== JV.TYPE_FOLLOW_MODE && contentValuesIdx[rowIdx][1] === JV.DISPLAY_VAL_TYPE_NORMAL) {
                                 rst.push(me.outputTabField(band, tab_field, data_field, contentValuesIdx[rowIdx][2], -1, contentValuesIdx.length, rowIdx, 1, 0, unitFactor, true, controls, multiColIdx));
                             } else if (contentValuesIdx[rowIdx][1] === JV.DISPLAY_VAL_TYPE_AUTO_HEIGHT) {
@@ -794,7 +808,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
         }
         return rst;
     };
-    JpcFlowTabResult.outputColumn = function (rptTpl, dataObj, page, segIdx, bands, unitFactor, controls, multiColIdx) {
+    JpcFlowTabResult.outputColumn = function (rptTpl, dataObj, page, segIdx, bands, unitFactor, multiColIdx) {
         let me = this, rst = [];
         let FLOW_NODE_STR = me.isEx?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;
         let tab = rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_COLUMN];
@@ -802,17 +816,29 @@ JpcFlowTabSrv.prototype.createNew = function(){
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
             if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]]) {
-                if (tab[JV.PROP_TEXT]) {
-                    rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXT], band, unitFactor, 1, 0, 1, 0, me.multiCols, multiColIdx));
-                }
-                if (tab[JV.PROP_TEXTS]) {
-                    for (let j = 0; j < tab[JV.PROP_TEXTS].length; j++) {
-                        rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXTS][j], band, unitFactor, 1, 0, 1, 0, me.multiCols, multiColIdx));
-                    }
-                }
-                if (tab[JV.NODE_DISCRETE_INFO]) {
-                    rst = rst.concat(JpcDiscreteHelper.outputDiscreteInfo(tab[JV.NODE_DISCRETE_INFO], bands, dataObj, unitFactor, me.pageStatusLst[page - 1], segIdx, me.multiCols, multiColIdx));
-                }
+                rst = rst.concat(me.commonTabRestOutput(dataObj, page, segIdx, bands, band, unitFactor, tab, multiColIdx));
+            }
+        }
+        return rst;
+    };
+    JpcFlowTabResult.outputPreviewSegSum = function (rptTpl, bands, unitFactor, controls, pageStatus) {
+        let rst = [];
+        let tab = rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_SEG_SUM];
+        let band = bands[tab[JV.PROP_BAND_NAME]];
+        if (band) {
+            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]]) {
+                rst = rst.concat(JpcDiscreteHelper.outputPreviewSumInfoOutput(band, unitFactor, tab));
+            }
+        }
+        return rst;
+    };
+    JpcFlowTabResult.outputPreviewPageSum = function (rptTpl, bands, unitFactor, controls, pageStatus) {
+        let rst = [];
+        let tab = rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_PAGE_SUM];
+        let band = bands[tab[JV.PROP_BAND_NAME]];
+        if (band) {
+            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]]) {
+                rst = rst.concat(JpcDiscreteHelper.outputPreviewSumInfoOutput(band, unitFactor, tab));
             }
         }
         return rst;
@@ -831,17 +857,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
                     cellItem[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_fields[i][JV.PROP_AREA], band, unitFactor, 1, 0, 1, 0, me.multiCols, 0, true, false);
                     rst.push(cellItem);
                 }
-                if (tab[JV.PROP_TEXT]) {
-                    rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXT], band, unitFactor, 1, 0, 1, 0, me.multiCols, 0));
-                }
-                if (tab[JV.PROP_TEXTS]) {
-                    for (let j = 0; j < tab[JV.PROP_TEXTS].length; j++) {
-                        rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXTS][j], band, unitFactor, 1, 0, 1, 0, me.multiCols, 0));
-                    }
-                }
-                if (tab[JV.NODE_DISCRETE_INFO]) {
-                    rst = rst.concat(JpcDiscreteHelper.outputDiscreteInfo(tab[JV.NODE_DISCRETE_INFO], bands, dataObj, unitFactor, me.pageStatusLst[page - 1], segIdx, me.multiCols, 0));
-                }
+                rst = rst.concat(me.commonTabRestOutput(dataObj, page, segIdx, bands, band, unitFactor, tab, 0));
             }
         }
         return rst;
@@ -860,17 +876,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
                     cellItem[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_fields[i][JV.PROP_AREA], band, unitFactor, 1, 0, 1, 0, me.multiCols, 0, true, false);
                     rst.push(cellItem);
                 }
-                if (tab[JV.PROP_TEXT]) {
-                    rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXT], band, unitFactor, 1, 0, 1, 0, me.multiCols, 0));
-                }
-                if (tab[JV.PROP_TEXTS]) {
-                    for (let j = 0; j < tab[JV.PROP_TEXTS].length; j++) {
-                        rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXTS][j], band, unitFactor, 1, 0, 1, 0, me.multiCols, 0));
-                    }
-                }
-                if (tab[JV.NODE_DISCRETE_INFO]) {
-                    rst = rst.concat(JpcDiscreteHelper.outputDiscreteInfo(tab[JV.NODE_DISCRETE_INFO], bands, dataObj, unitFactor, me.pageStatusLst[page - 1], segIdx, me.multiCols, 0));
-                }
+                rst = rst.concat(me.commonTabRestOutput(dataObj, page, segIdx, bands, band, unitFactor, tab, 0));
             }
         }
         return rst;
@@ -929,6 +935,21 @@ JpcFlowTabSrv.prototype.createNew = function(){
         // console.log(rst);
         return rst;
     };
+    JpcFlowTabResult.commonTabRestOutput = function(dataObj, page, segIdx, bands, band, unitFactor, tab, multiColIdx){
+        let me = this, rst = [];
+        if (tab[JV.PROP_TEXT]) {
+            rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXT], band, unitFactor, 1, 0, 1, 0, me.multiCols, multiColIdx));
+        }
+        if (tab[JV.PROP_TEXTS]) {
+            for (let j = 0; j < tab[JV.PROP_TEXTS].length; j++) {
+                rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXTS][j], band, unitFactor, 1, 0, 1, 0, me.multiCols, multiColIdx));
+            }
+        }
+        if (tab[JV.NODE_DISCRETE_INFO]) {
+            rst = rst.concat(JpcDiscreteHelper.outputDiscreteInfo(tab[JV.NODE_DISCRETE_INFO], bands, dataObj, unitFactor, me.pageStatusLst[page - 1], segIdx, 1, 0));
+        }
+        return rst;
+    };
 
     return JpcFlowTabResult;
 };

+ 51 - 16
web/building_saas/complementary_glj_lib/html/tools-gongliaoji.html

@@ -83,7 +83,7 @@
       </div>
       <!--弹出组成物-->
     <button id="componentBtn" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#component" style="display: none"></button>
-      <div class="modal fade" id="component" data-backdrop="static">
+      <!--<div class="modal fade" id="component" data-backdrop="static">
           <div class="modal-dialog modal-lg" role="document" id="modalCon">
               <div class="modal-content" >
                   <div class="modal-header">
@@ -96,11 +96,11 @@
                     <div class="row">
                       <div class="col-4">
                         <div  class="modal-auto-height" id="componentTreeDiv" style="overflow: hidden">
-                            <!--<div class="print-list">-->
+                            &lt;!&ndash;<div class="print-list">&ndash;&gt;
                                 <div style="width: 100%; height: 100%; overflow: auto">
                                     <ul id="componentTree" class="ztree"></ul>
                                 </div>
-                            <!--</div>-->
+                            &lt;!&ndash;</div>&ndash;&gt;
                         </div>
                       </div>
                       <div class="col-8">
@@ -109,20 +109,9 @@
                                   <input type="radio" class="glj-radio" name="glj" value="allGljs">所有工料机&nbsp;&nbsp;
                                   <input type="radio" class="glj-radio" name="glj" value="stdGljs">标准工料机&nbsp;&nbsp;
                                   <input type="radio" class="glj-radio" name="glj" value="complementaryGljs">补充工料机&nbsp;&nbsp;
-                                 <!-- <div class="form-group"><input id="searchGlj" type="text" class="form-control-sm" placeholder="查询工料机"></div>-->
+                                 &lt;!&ndash; <div class="form-group"><input id="searchGlj" type="text" class="form-control-sm" placeholder="查询工料机"></div>&ndash;&gt;
                               </div>
                               <div class="modal-auto-height col-12" style="overflow: hidden" id="componentSheet">
-                               <!--   <table class="table table-sm table-bordered m-0">
-                                      <thead>
-                                      <tr><th></th><th>编码</th><th>名称</th><th>规格型号</th><th>计量单位</th><th>单价</th><th>类型</th></tr>
-                                      </thead>
-                                      <tbody>
-                                      <tr><td>1</td><td></td><td></td><td></td><td></td><td></td></tr>
-                                      <tr><td>2</td><td></td><td></td><td></td><td></td><td></td></tr>
-                                      <tr><td>3</td><td></td><td></td><td></td><td></td><td></td></tr>
-                                      <tr><td>4</td><td></td><td></td><td></td><td></td><td></td></tr>
-                                      </tbody>
-                                  </table>-->
                               </div>
                           </div>
                       </div>
@@ -134,7 +123,52 @@
                   </div>
               </div>
           </div>
-      </div>
+      </div>-->
+    <div class="modal fade" id="component" data-backdrop="static">
+        <div class="modal-dialog modal-lg" role="document" id="modalCon">
+            <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 style="width: 33%; float: left;">
+                            <div  class="modal-auto-height" id="componentTreeDiv" style="overflow: hidden">
+                                <!--<div class="print-list">-->
+                                <div style="width: 100%; height: 100%; overflow: auto">
+                                    <ul id="componentTree" class="ztree"></ul>
+                                </div>
+                                <!--</div>-->
+                            </div>
+                        </div>
+                        <div style="width: 67%; padding-left: 8px; float: left;">
+                            <div class="row">
+                                <div class="col-12" id="gljRadios">
+                                    <div class="row">
+                                        <div class="col-7" style="margin-top: 5px;">
+                                            <input type="radio" class="glj-radio" name="glj" value="allGljs">所有工料机&nbsp;&nbsp;
+                                            <input type="radio" class="glj-radio" name="glj" value="stdGljs">标准工料机&nbsp;&nbsp;
+                                            <input type="radio" class="glj-radio" name="glj" value="complementaryGljs">补充工料机&nbsp;&nbsp;
+                                        </div>
+                                        <div class="input-group col-5" style="margin-bottom: 5px;">
+                                            <input type="text" class="form-control form-control-sm" placeholder="请输入筛选编码或名称" value="" id="gljSearchKeyword">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="modal-auto-height col-12" style="overflow: hidden" id="componentSheet">
+                                </div>
+                            </div>
+                        </div>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" id="componentsCacnel" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                    <a href="javascript:void(0);" id="componentsConf" class="btn btn-primary">确定</a>
+                </div>
+            </div>
+        </div>
+    </div>
     <!--弹出警告-->
     <button id="gljAlertBtn" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#gljAlert" style="display: none"></button>
     <button id="codeAlertBtn" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#codeAlert" style="display: none"></button>
@@ -194,6 +228,7 @@
     <script type="text/javascript" src="/public/web/common_ajax.js"></script>
     <script type="text/javascript" src="/public/web/treeDataHelper.js"></script>
     <script type="text/javascript" src="/public/web/QueryParam.js"></script>
+    <script type="text/javascript" src="/lib/lodash/lodash.js"></script>
     <script type="text/javascript" src="/public/web/id_tree.js"></script>
     <script type="text/javascript" src="/public/web/tree_sheet/tree_sheet_controller.js"></script>
     <script type="text/javascript" src="/public/web/tree_sheet/tree_sheet_helper.js"></script>

+ 54 - 30
web/building_saas/complementary_glj_lib/js/components.js

@@ -103,7 +103,7 @@ let componentOprObj = {
     //初始默认radio
     initRadio: function () {
         let that = repositoryGljObj, me = componentOprObj;
-        //$('#searchGlj').val('');//恢复搜索文本
+        $('#gljSearchKeyword').val('');//恢复搜索文本
         //初始化组成物列表
         me.selectedList = [].concat(that.currentComponent);
         //默认radio所有工料机
@@ -120,39 +120,52 @@ let componentOprObj = {
             that.sortGlj(me.showGljList);
         }
     },
+    filterDatasAndShow: function () {
+        let me = componentOprObj, re = repositoryGljObj;
+        let materialArr = [202, 203, 204];//混凝土、砂浆、配合比, 201普通材料
+        let val = $("input[name='glj']:checked").val();
+        me.radiosSelected = val;
+        //选择改变,数据重新筛选显示
+        me.showGljList = [];
+        if(me.radiosSelected === 'allGljs'){
+            me.setShowGljList(re.stdGljList);
+            me.setShowGljList(re.complementaryGljList);
+        }
+        else if(me.radiosSelected === 'stdGljs'){
+            me.setShowGljList(re.stdGljList);
+        }
+        else if(me.radiosSelected === 'complementaryGljs'){
+            me.setShowGljList(re.complementaryGljList);
+        }
+        //搜索匹配
+        let searchStr = $('#gljSearchKeyword').val();
+        if(searchStr && searchStr.trim() != ''){
+            let reg = new RegExp(searchStr);
+            me.showGljList = _.filter(me.showGljList, function (data) {
+                return reg.test(data.code) || reg.test(data.name);
+            });
+        }
+        re.sortGlj(me.showGljList);
+        //重新显示
+        me.showGljItems(me.showGljList, me.gljCurTypeId);
+        //切换radio后更新cache
+        if (me.currentOprParent = 1) {
+            if(re.parentNodeIds["_pNodeId_" + me.gljCurTypeId]){
+                me.currentCache = me.getParentCache(re.parentNodeIds["_pNodeId_" + me.gljCurTypeId]);
+            }
+            else{
+                me.currentCache = [];
+            }
+        } else {
+            me.currentCache = me.getCache();
+        }
+    },
     //监听radios选择事件
     radiosChange: function () {
         let me = componentOprObj, re = repositoryGljObj;
         let materialArr = [202, 203, 204];//混凝土、砂浆、配合比, 201普通材料
         $('.glj-radio').change(function () {
-            let val = $("input[name='glj']:checked").val();
-            me.radiosSelected = val;
-            //选择改变,数据重新筛选显示
-            me.showGljList = [];
-            if(me.radiosSelected === 'allGljs'){
-                me.setShowGljList(re.stdGljList);
-                me.setShowGljList(re.complementaryGljList);
-            }
-            else if(me.radiosSelected === 'stdGljs'){
-               me.setShowGljList(re.stdGljList);
-            }
-            else if(me.radiosSelected === 'complementaryGljs'){
-                me.setShowGljList(re.complementaryGljList);
-            }
-            re.sortGlj(me.showGljList);
-            //重新显示
-            me.showGljItems(me.showGljList, me.gljCurTypeId);
-            //切换radio后更新cache
-            if (me.currentOprParent = 1) {
-                if(re.parentNodeIds["_pNodeId_" + me.gljCurTypeId]){
-                    me.currentCache = me.getParentCache(re.parentNodeIds["_pNodeId_" + me.gljCurTypeId]);
-                }
-                else{
-                    me.currentCache = [];
-                }
-            } else {
-                me.currentCache = me.getCache();
-            }
+            me.filterDatasAndShow();
         });
     },
 
@@ -257,4 +270,15 @@ let componentTypeTreeOprObj = {
         }
         me.showGljItems(me.showGljList, gljTypeId);
     }
-}
+}
+$(document).ready(function () {
+    $('#gljSearchKeyword').change(function () {
+        componentOprObj.filterDatasAndShow();
+    });
+    $('#gljSearchKeyword').bind('keypress', function (e) {
+        if(e.keyCode === 13){
+            $(this).blur();
+            return false;
+        }
+    });
+});

+ 10 - 6
web/building_saas/css/main.css

@@ -27,6 +27,10 @@ body {
     font-size: 1.25rem;
     line-height: inherit
 }
+.header .header-logo sup{
+    font-size:10px;
+    top:-1.2em
+}
 .top-msg{
     position: fixed;
     top:0;
@@ -54,7 +58,6 @@ body {
     width: 28px;
     text-align: center;
     line-height: 18px;
-    color: #999;
     padding: 10px 0;
     border-right: 1px solid #ccc;
 }
@@ -64,7 +67,7 @@ body {
     text-decoration: none;
 }
 .main-nav .nav a.active {
-    border: 1px solid #ccc;
+    border: 1px solid #ff6501;
     border-right: 1px solid #fff;
     background: #fff;
     color: #333
@@ -82,10 +85,10 @@ body {
 .poj-cate .nav-pills .nav-link{
     border-radius: 0;
     font-size: 24px;
-    color: #6c757d
+    color: #007bff
 }
 .poj-cate .nav-pills .nav-link:hover{
-    color:#007bff
+    color:#0056b3
 }
 .poj-cate .nav-pills .nav-link.active, .nav-pills .show > .nav-link{
     background-color: #6c757d;
@@ -143,7 +146,7 @@ body {
 }
 .bottom-content .nav {
     background: #f7f7f9;
-    padding:0 0 0 2px
+    padding:1px 0 0 2px
 }
 .bottom-content .nav-tabs .nav-link, .side-tabs .nav-tabs .nav-link {
     border-radius: 0;
@@ -163,7 +166,8 @@ body {
     z-index: 999
 }
 .bottom-content .nav-tabs .nav-link.active {
-    border-top: 1px solid #f7f7f9
+    border:1px solid #ff6501;
+    border-bottom: 1px solid #fff
 }
 .side-tabs .nav-tabs .nav-link.active {
     border-top: none;

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

@@ -601,49 +601,6 @@
         </div>
     </div>
     <!--工料机选择窗口-->
-    <!--<div class="modal fade" id="glj_tree_div" data-backdrop="static">
-        <div class="modal-dialog modal-lg" role="document" id="modalCon">
-            <div class="modal-content" style="width: 910px;">
-                <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>
-                    <input type="hidden" id="actionType">
-                </div>
-                <div class="modal-body">
-                    <div class="row">
-                        <div class="col-4" >
-                            <div  class="modal-auto-height" id="componentTreeDiv" style="overflow: hidden;">
-                                &lt;!&ndash;<div class="print-list">&ndash;&gt;
-                                <div style="width: 100%; height: 100%; overflow: auto">
-                                    <ul id="gljTree" class="ztree"></ul>
-                                </div>
-                                &lt;!&ndash;</div>&ndash;&gt;
-                            </div>
-                        </div>
-                        <div class="col-8">
-                            <div class="row">
-                                <div class="col-12" id="gljRadios">
-                                    <input type="radio" class="glj-radio" name="glj" value="allGljs" checked>所有工料机&nbsp;&nbsp;
-                                    <input type="radio" class="glj-radio" name="glj" value="stdGLJ">标准工料机&nbsp;&nbsp;
-                                    <input type="radio" class="glj-radio" name="glj" value="complementaryGLJs">补充工料机&nbsp;&nbsp;
-                                    &lt;!&ndash; <div class="form-group"><input id="searchGlj" type="text" class="form-control-sm" placeholder="查询工料机"></div>&ndash;&gt;
-                                </div>
-                                <div class="modal-auto-height col-12" style="overflow: hidden" id="gljLibSheet">
-
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-                <div class="modal-footer">
-                    <button type="button" id="componentsCacnel" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                    <a href="javascript:void(0);" id="glj_selected_conf" class="btn btn-primary">确定</a>
-                </div>
-            </div>
-        </div>
-    </div>-->
     <div class="modal fade" id="glj_tree_div" data-backdrop="static">
         <div class="modal-dialog modal-lg" role="document" id="modalCon">
             <div class="modal-content" style="width: 1020px;">
@@ -1122,7 +1079,7 @@
         <script type="text/javascript" src="/lib/jquery-contextmenu/jquery.contextMenu.js"></script>
         <script type="text/javascript" src="/lib/jquery-contextmenu/jquery.ui.position.js"></script>
         <script type="text/javascript" src="/lib/lodash/lodash.js"></script>
-        <!-- Common -->
+    <!-- Common -->
         <script type="text/javascript" src="/public/web/common_ajax.js"></script>
         <script type="text/javascript" src="/public/web/url_util.js"></script>
         <script type="text/javascript" src="/public/web/number_util.js"></script>

+ 0 - 1
web/building_saas/main/js/models/cache_tree.js

@@ -393,7 +393,6 @@ var cacheTree = {
             //resort
             this.roots = tools.reSortNodes(this.roots, true);
             this.sortTreeItems();
-            console.log(this);
             return rst;
         };
         Tree.prototype.delete = function (node) {

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

@@ -1587,6 +1587,7 @@ $('#uploadConfirm').click(function () {
     }
     catch (err){
         alert(err);
+        $(me).removeClass('disabled');
     }
 });
 //导入后更新操作

+ 12 - 15
web/building_saas/pm/html/project-management.html

@@ -273,7 +273,7 @@
             </div>
             <div class="modal-body">
                 <form>
-                    <div class="form-group">
+                    <div>
                         <label>建设项目</label>
                         <div class="input-group">
                             <input type="text" class="form-control" placeholder="输入建设项目名称" id="poj-name" autocomplete="off">
@@ -288,7 +288,7 @@
                         </div>
                         <span class="form-text text-info" id="poj-name-info" style="display: none;">新建 “汽车生产车间5”</span>
                     </div>
-                    <div class="form-group">
+                    <div>
                         <label>单项工程</label>
                         <div class="input-group">
                             <input type="text" class="form-control" placeholder="输入单项工程名称" id="eng-name" autocomplete="off">
@@ -302,40 +302,38 @@
                         <span class="form-text text-info" id="eng-name-info" style="display: none;">新建 “左2号生产车间2”</span>
                     </div>
 
-                    <div class="form-group">
+                    <div>
                         <label>单位工程</label>
                         <input type="text" class="form-control" placeholder="输入单位工程名称" id="tender-name" autocomplete="off">
                         <span class="form-text text-danger" id="tender-name-info" style="display: none;">已存在 “建筑工程1”</span>
                     </div>
-                    <div class="form-group">
+                    <div>
                         <label>单价文件</label>
                         <select class="form-control" id="unit-price"><option value="">新建单价文件</option></select>
                     </div>
-                    <div class="form-group">
+                    <div>
                         <label>费率文件</label>
                         <select class="form-control" id="tender-fee-rate"><option value="">新建费率文件</option></select>
                     </div>
-                    <div class="form-group">
+                    <div>
                         <label>计价方式</label>
                         <div>
                             <label class="custom-control custom-radio">
-                                <input name="valuation_type" value="bill" type="radio" class="custom-control-input">
-                                <span class="custom-control-indicator"></span>
-                                <span class="custom-control-description">清单计价</span>
+                                <input name="valuation_type" id="radioBill" value="bill" type="radio" class="custom-control-input">
+                                <label class="custom-control-label" for="radioBill">清单计价</label>
                             </label>
                             <label class="custom-control custom-radio">
-                                <input name="valuation_type" value="ration" type="radio" class="custom-control-input">
-                                <span class="custom-control-indicator"></span>
-                                <span class="custom-control-description">定额计价</span>
+                                <input name="valuation_type" id="radioRation" value="ration" type="radio" class="custom-control-input">
+                                <label class="custom-control-label" for="radioRation">定额计价</label>
                             </label>
                         </div>
                     </div>
-                    <div class="form-group">
+                    <div>
                         <label>计价规则</label>
                         <select class="form-control" id="valuation"><option value="">请选择计价规则</option></select>
                         <span class="form-text text-danger" id="valuation-info" style="display: none;">请选择计价规则</span>
                     </div>
-                    <div class="form-group">
+                    <div>
                         <label>工程专业</label>
                         <select class="form-control" id="tender-engineering"><option value="">请选择对应的工程专业</option></select>
                         <span class="form-text text-danger" id="engineering-info" style="display: none;">请选择工程专业</span>
@@ -514,6 +512,5 @@
     let rationValuation = '<%- rationValuation %>';
     let engineeringList = '<%- engineeringList %>';
     let compilationData = JSON.parse('<%- compilationData %>');
-    console.log(billValuation);
 </script>
 </html>

+ 41 - 5
web/building_saas/pm/js/pm_gc.js

@@ -178,6 +178,11 @@ const gcTreeObj = {
             {name: '单价文件', dataCode: 'unitPriceFile', width: 170, vAlign: 'center', hAlign: 'left'},
             {name: '费率文件', dataCode: 'feeRateFile', width: 170, vAlign: 'center', hAlign: 'left'}
         ],
+        //选中行颜色
+        style: {
+            defalutBackColor: 'White',
+            selectedColor: '#BBFFFF'
+        },
         options: {
             tabStripVisible:  false,
             allowCopyPasteExcelStyle : false,
@@ -230,10 +235,40 @@ const gcTreeObj = {
             this.bindEvent(this.workBook);
         }
     },
-    initSelection: function (row) {
+    getSelStyle: function (backColor) {
+        let style = new GC.Spread.Sheets.Style();
+        style.backColor = backColor;
+        style.borderLeft = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
+        style.borderTop = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
+        style.borderRight = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
+        style.borderBottom = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
+        return style;
+    },
+    //设置选中行底色
+    setSelStyle: function (sel, backColor) {
         let me = this;
-        let node = me.tree.items[row];
+        let sheet = me.workBook.getSheet(0);
+        me.renderSheetFuc(sheet, function () {
+            let style = me.getSelStyle(backColor);
+            /*sel.row = sel.row === -1 ? 0 : sel.row;*/
+            for(let i = 0; i < sel.rowCount; i++){
+                let row = i + sel.row;
+                sheet.setStyle(row, -1, style);
+            }
+        });
+    },
+    initSelection: function (newSel, oldSel = null) {
+        let me = this;
+        let node = me.tree.items[newSel.row];
         me.tree.selected = node;
+        //恢复底色
+        if(oldSel){
+            me.setSelStyle(oldSel, me.setting.style.defalutBackColor);
+        }
+        //设置选中行底色
+        if(newSel){
+            me.setSelStyle(newSel, me.setting.style.selectedColor);
+        }
         $(".tools-btn > a").not(".disabled").addClass("disabled");
         $("#add-engineering-btn").addClass("disabled");
         $('#add-tender-btn').removeClass('disabled');
@@ -266,7 +301,7 @@ const gcTreeObj = {
     },
     onSelectionChanging: function (sender, args) {
         let me = gcTreeObj;
-        me.initSelection(args.newSelections[0].row);
+        me.initSelection(args.newSelections[0], args.oldSelections[0]);
     },
     //点击恢复列,弹出恢复项目窗口
     recoveryProj: function (node) {
@@ -592,7 +627,7 @@ const gcTreeObj = {
         me.renderSheetFuc(sheet, function () {
             sheet.deleteRows(rIdx, count);
             sheet.setRowCount(me.tree.items.length);
-            me.initSelection(sheet.getActiveRowIndex());
+            me.initSelection({row: sheet.getActiveRowIndex(), rowCount: 1});
         });
     },
     move: function (orgRow, newRow) {
@@ -622,7 +657,8 @@ function gc_init(){
         gcTreeObj.buildSheet();
         gcTreeObj.showTreeData(gcTreeObj.tree.items, gcTreeObj.setting.header);
         //初始选择
-        gcTreeObj.initSelection(0);
+        let initSel = gcTreeObj.workBook.getSheet(0).getSelections()[0] ? gcTreeObj.workBook.getSheet(0).getSelections()[0] : {row: 0, rowCount: 1};
+        gcTreeObj.initSelection(initSel);
         $.bootstrapLoading.end();
     });
 }

+ 45 - 7
web/building_saas/pm/js/pm_newMain.js

@@ -27,6 +27,7 @@ let fileType = {
 const projTreeObj = {
     tree: null,
     workBook: null,
+    preSelection: null,
     setting: {
         tree: {
             id: 'ID',
@@ -42,6 +43,11 @@ const projTreeObj = {
             {name: '费率文件', dataCode: 'feeRateFile', width: 250, vAlign: 'center', hAlign: 'left'},
             {name: '创建日期', dataCode: 'createDateTime', width: 170, vAlign: 'center', hAlign: 'left'}
         ],
+        //选中行颜色
+        style: {
+            defalutBackColor: 'White',
+            selectedColor: '#BBFFFF'
+        },
         options: {
             tabStripVisible:  false,
             allowCopyPasteExcelStyle : false,
@@ -94,10 +100,41 @@ const projTreeObj = {
             this.bindEvent(this.workBook);
         }
     },
-    initSelection: function (row) {
+    getSelStyle: function (backColor) {
+        let style = new GC.Spread.Sheets.Style();
+        style.backColor = backColor;
+        style.borderLeft = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
+        style.borderTop = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
+        style.borderRight = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
+        style.borderBottom = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
+        return style;
+    },
+    //设置选中行底色
+    setSelStyle: function (sel, backColor) {
         let me = this;
-        let node = me.tree.items[row];
+        let sheet = me.workBook.getSheet(0);
+        me.renderSheetFuc(sheet, function () {
+            let style = me.getSelStyle(backColor);
+            /*sel.row = sel.row === -1 ? 0 : sel.row;*/
+            for(let i = 0; i < sel.rowCount; i++){
+                let row = i + sel.row;
+                sheet.setStyle(row, -1, style);
+            }
+        });
+    },
+    initSelection: function (newSel, oldSel = null) {
+        let me = this;
+        let node = me.tree.items[newSel.row];
+        //恢复底色
+        if(oldSel){
+            me.setSelStyle(oldSel, me.setting.style.defalutBackColor);
+        }
+        //设置选中行底色
+        if(newSel){
+            me.setSelStyle(newSel, me.setting.style.selectedColor);
+        }
         me.tree.selected = node;
+        me.preSelection = newSel;
         $(".tools-btn > a").not(".disabled").addClass("disabled");
         $("#add-engineering-btn").addClass("disabled");
         $('#add-tender-btn').removeClass('disabled');
@@ -130,7 +167,7 @@ const projTreeObj = {
     },
     onSelectionChanging: function (sender, args) {
         let me = projTreeObj;
-        me.initSelection(args.newSelections[0].row);
+        me.initSelection(args.newSelections[0], args.oldSelections[0]);
     },
     getShowData: function (datas) {
         for(let data of datas){
@@ -438,6 +475,8 @@ const projTreeObj = {
     insert: function (data, parent, next) {
         let node = this.tree.addNodeData(data, parent, next);
         this.addRow(node);
+        let newSel = this.workBook.getSheet(0).getSelections()[0];
+        this.initSelection(newSel, this.preSelection);
         return node;
     },
     addRow: function (node) {
@@ -464,7 +503,7 @@ const projTreeObj = {
         me.renderSheetFuc(sheet, function () {
             sheet.deleteRows(rIdx, count);
             sheet.setRowCount(me.tree.items.length);
-            me.initSelection(sheet.getActiveRowIndex());
+            me.initSelection({row: sheet.getActiveRowIndex(), rowCount: 1});
         });
     },
     move: function (orgRow, newRow) {
@@ -913,7 +952,6 @@ $(document).ready(function() {
                     updateData['updateData'][projTreeObj.tree.setting.tree.id] = pre.id();
                     updateData['updateData'][projTreeObj.tree.setting.tree.nid] = projTreeObj.tree.maxNodeId() + 1;
                 }
-                console.log(updateData);
                 projTreeObj.tree.maxNodeId(IDs.lowID - 1);
                 CommonAjax.post('/pm/api/copyProjects', {updateData: updateData, user_id: userID}, function (data) {
                     dialog.modal('hide');
@@ -973,7 +1011,8 @@ function init() {
         projTreeObj.buildSheet();
         projTreeObj.showTreeData(projTreeObj.tree.items, projTreeObj.setting.header);
         //初始选择
-        projTreeObj.initSelection(0);
+        let initSel = projTreeObj.workBook.getSheet(0).getSelections()[0] ? projTreeObj.workBook.getSheet(0).getSelections()[0] : {row: 0, rowCount: 1};
+        projTreeObj.initSelection(initSel);
         $.bootstrapLoading.end();
     });
     engineering = engineeringList !== null && engineeringList !== undefined ? JSON.parse(engineeringList) : [];
@@ -2157,7 +2196,6 @@ function bindEvents_file_table(jqS, usedObj, targetBody, type){
         $(jqS + ' .btn-success').on('click', function () {
             let attrId = $(jqS).attr('id');
             let id = attrId.slice(5, attrId.length);
-            console.log(id);
             let newName = $(jqS + ' input').val().trim();
             if(newName !== orgName){
                 if(hasThisFileName(fileObjs, newName)){

+ 3 - 1
web/building_saas/pm/js/pm_tree.js

@@ -117,7 +117,9 @@ const pmTree = {
                     _view._hideNodes(this.children);
                 }
             };
-
+            Node.prototype.serialNo = function () {
+                return this.tree.items.indexOf(this);
+            };
             Node.prototype.preSibling = function () {
                 var iIndex = this.parent.childIndex(this);
                 if (iIndex === -1){

BIN
web/dest/css/img/engineering.png


BIN
web/dest/css/img/folder_close.png


BIN
web/dest/css/img/folder_open.png


BIN
web/dest/css/img/project.png


BIN
web/dest/css/img/tender.png