Browse Source

例题进度条相关

zhongzewei 6 years ago
parent
commit
1066409bc3

+ 23 - 0
modules/all_models/compleGlj_section.js

@@ -0,0 +1,23 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Zhong
+ * @date 2018/12/13
+ * @version
+ */
+
+import mongoose from 'mongoose';
+
+const Schema = mongoose.Schema;
+const compleGljSection = new Schema({
+    userId: String,
+    compilationId: String,
+    Name: String,
+    ID: String,
+    ParentID: String,
+    NextSiblingID: String,
+});
+
+mongoose.model('complementary_glj_section', compleGljSection, 'complementary_glj_section');

+ 30 - 0
modules/all_models/compleGlj_sectionTemplate.js

@@ -0,0 +1,30 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Zhong
+ * @date 2018/12/13
+ * @version
+ */
+
+/*
+ * 我的补充人材机库章节树模板,一个费用定额有一个模板
+ * 模板的生成目前由手工生成(借助定额库编辑器的章节树编辑)
+ * 新用户第一次进入某费用定额的补充定额库时,拷贝模板给该用户
+ *
+ * */
+
+import mongoose from 'mongoose';
+
+const Schema = mongoose.Schema;
+const compleGljSectionTemp = new Schema({
+    compilationId: String,
+    Name: String,
+    ID: Number,
+    ParentID: Number,
+    NextSiblingID: Number,
+});
+
+mongoose.model('complementary_glj_section_templates', compleGljSectionTemp, 'complementary_glj_section_templates');
+

+ 15 - 12
modules/pm/controllers/pm_controller.js

@@ -251,20 +251,12 @@ module.exports = {
         sessionCompilation = request.session.sessionCompilation;
         //更新用户的使用过的费用定额列表
         let userData = await userModel.findOne({_id: mongoose.Types.ObjectId(request.session.sessionUser.id)}, '-_id used_list');
+        //是否第一次进入该费用定额
+        let isFirst = false;
         if (userData) {
-            let usedCompilation = _.find(userData.used_list, function (o) {
+            isFirst = !_.find(userData.used_list, function (o) {
                 return o.compilationId === compilationData._id.toString();
-            });
-            //第一次使用该费用定额
-            if (!usedCompilation) {
-                await userModel.update({_id: mongoose.Types.ObjectId(request.session.sessionUser.id)}, {$push: {used_list: {compilationId: compilationData._id}}});
-                //拷贝补充定额模板数据
-                await sectionTreeDao.copyDataFromTemplate(request.session.sessionUser.id, compilationData._id);
-                //拷贝例题数据
-                if (sessionCompilation.example && sessionCompilation.example.length > 0) {
-                   await pm_facade.copyExample(request.session.sessionUser.id, sessionCompilation._id, sessionCompilation.example);
-                }
-            }
+            });;
         }
         // 清单计价
         let billValuation = sessionCompilation.bill_valuation !== undefined ?
@@ -281,6 +273,7 @@ module.exports = {
         let absoluteUrl = compilationData.overWriteUrl ? request.app.locals.rootDir + compilationData.overWriteUrl : request.app.locals.rootDir;
         let overWriteUrl = fs.existsSync(absoluteUrl) && fs.statSync(absoluteUrl).isFile()? compilationData.overWriteUrl : null;
         let renderData = {
+            isFirst: isFirst,
             userAccount: request.session.userAccount,
             userID: request.session.sessionUser.id,
             compilationData: JSON.stringify(sessionCompilation),
@@ -295,6 +288,16 @@ module.exports = {
 
         response.render('building_saas/pm/html/project-management.html', renderData);
     },
+    //第一次进入该费用定额时准备的初始数据
+    prepareInitialData: async function(request, response) {
+        try {
+            let sessionCompilation = request.session.sessionCompilation;
+            await pm_facade.prepareInitialData(request.session.sessionUser.id, sessionCompilation._id, sessionCompilation.example);
+            callback(request, response, 0, 'success', null);
+        } catch(err) {
+            callback(request, response, 1, err, null);
+        }
+    },
     // 获取单价文件列表
     getUnitFileList: async function(request, response) {
         let data = request.body.data;

+ 54 - 1
modules/pm/facade/pm_facade.js

@@ -23,10 +23,15 @@ let rationGLJModel = mongoose.model('ration_glj');
 let rationCoeModel = mongoose.model('ration_coe');
 let rationInstallationModel = mongoose.model('ration_installation');
 let quantityDetailModel = mongoose.model('quantity_detail');
+let userModel = mongoose.model('user');
+let compleGljSectionModel = mongoose.model('complementary_glj_section');
+let compleGljSectionTModel = mongoose.model('complementary_glj_section_templates');
 
 let featureLibModel =  mongoose.model("std_project_feature_lib");
 let scMathUtil = require('../../../public/scMathUtil').getUtil();
 let counter = require('../../../public/counter/counter');
+import SectionTreeDao from '../../complementary_ration_lib/models/sectionTreeModel';
+let sectionTreeDao = new SectionTreeDao();
 import CounterModel from "../../glj/models/counter_model";
 import moment from 'moment';
 import billsFlags from '../../common/const/bills_fixed';
@@ -52,6 +57,7 @@ module.exports={
     projectType: projectType,
     getPosterityProjects: getPosterityProjects,
     isShare: isShare,
+    prepareInitialData: prepareInitialData,
 };
 
 //拷贝例题项目
@@ -878,4 +884,51 @@ async function isShare(userId, project){
         project = await projectModel.findOne({ID: project.ParentID}, '-_id shareInfo ID ParentID');
     }
     return false;
-}
+}
+
+//用户第一次进入费用定额的数据准备
+async function prepareInitialData(userId, compilation, example) {
+    let prepareTask = [
+        updateUsedList(userId, compilation),
+        copyCompleRationSection(userId, compilation),
+        copyCompleGljSection(userId, compilation)
+    ];
+    if (example && example.length > 0) {
+        prepareTask.push(copyExample(userId, compilation, example));
+    }
+    await Promise.all(prepareTask);
+}
+
+async function updateUsedList(userId, compilation) {
+    await userModel.update({_id: mongoose.Types.ObjectId(userId)}, {$push: {used_list: {compilationId: compilation}}});
+}
+
+//拷贝补充定额章节树
+async function copyCompleRationSection(userId, compilationId) {
+    await sectionTreeDao.copyDataFromTemplate(userId, compilationId);
+}
+//拷贝补充人材机分类树
+async function copyCompleGljSection(userId, compilationId) {
+    let templateData = await compleGljSectionTModel.find({compilationId: compilationId});
+    if (templateData.length > 0) {
+        let insertDatas = [],
+            uuidMapping = {};
+        //将ID替换成UUID
+        for (let temData of templateData) {
+            uuidMapping[temData.ID] = uuidV1();
+        }
+        for(let temData of templateData) {
+            let insertD = {
+                userId: userId,
+                compilationId: compilationId,
+                Name: temData.Name,
+                ID: uuidMapping[temData.ID],
+                ParentID: uuidMapping[temData.ParentID] || -1,
+                NextSiblingID: uuidMapping[temData.NextSiblingID] || -1,
+            };
+            insertDatas.push(insertD);
+        }
+        //插入数据
+        await compleGljSectionModel.insertMany(insertDatas);
+    }
+}

+ 3 - 0
modules/pm/routes/pm_route.js

@@ -24,6 +24,9 @@ module.exports = function (app) {
     /*
      req.body = {data: '{user_id}'}
      */
+
+    pmRouter.post('/prepareInitialData', pmController.prepareInitialData);
+
     pmRouter.post('/getProjects', pmController.getProjects);
     pmRouter.post('/getSummaryInfo', pmController.getSummaryInfo);
 

+ 2 - 0
web/building_saas/main/html/main.html

@@ -38,7 +38,9 @@
         let lockBills = '<%- projectData.property.lockBills %>';
         let userAccount = '<%- userAccount %>';
         let userID = '<%- userID %>';
+        console.log('<%- projectReadOnly %>');
         let projectReadOnly = JSON.parse('<%- projectReadOnly %>');
+        console.log(projectReadOnly);
         const G_SHOW_BLOCK_LIB = true;
 //        const G_SHOW_BLOCK_LIB = false;
     </script>

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

@@ -806,12 +806,15 @@ var projectObj = {
         };
     },
     mainSpreadEditEnded: function (sender, info) {
-        console.log('enterEDEnd');
         let project = projectObj.project;
         let node = project.mainTree.items[info.row];
         project.withinBillsLocked(node);
         let colSetting = projectObj.mainController.setting.cols[info.col];
         let fieldName = projectObj.mainController.setting.cols[info.col].data.field;
+        //提前处理
+        if (fieldName === 'code' || fieldName === 'name' || fieldName === 'unit') {
+            info.editingText = info.editingText ? info.editingText.toString().replace(new RegExp(/[\r,\n]/g), '') : info.editingText;
+        }
         // 检查输入类型等
         let value = projectObj.checkSpreadEditingText(info.editingText, colSetting);
         projectObj.updateCellValue(node, value, colSetting,info.editingText);

+ 17 - 1
web/building_saas/pm/html/project-management.html

@@ -22,7 +22,7 @@
         // 这里的变量供页面调用
         var userAccount = '<%- userAccount %>';
         var userID = '<%- userID %>';
-        console.log(userID);
+        let isFirst = JSON.parse('<%- isFirst %>');
     </script>
     <style type="text/css">
         .hidden-area{
@@ -680,6 +680,22 @@
         </div>
     </div>
 </div>
+<!--弹出 新用户第一次进度条-->
+<div class="modal fade" id="progress" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">欢迎使用纵横建筑计价</h5>
+            </div>
+            <div class="modal-body">
+                <h5 class="my-3">首次加载例题,请稍候……</h5>
+                <div class="progress mb-3">
+                    <div class="progress-bar progress-bar-striped progress-bar-animated" id="progressBar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%"></div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
 <!--弹出分享-->
 <!--<div class="modal fade" id="share" data-backdrop="static">
     <div class="modal-dialog" role="document">

+ 78 - 3
web/building_saas/pm/js/pm_newMain.js

@@ -1696,6 +1696,61 @@ function getWorkBookWidth(){
     return workBookWidth = $(window).width() - $('.pm-side').width() - 90;
 }
 
+function prepareInitialTimer() {
+    $('#progressBar').css('width', `0%`);
+    let outer = setInterval(function () {
+        let curWidth = parseInt($('#progressBar')[0].style.width.replace('%', ''));
+        curWidth = parseInt(curWidth + 2);
+        $('#progressBar').css('width', `${curWidth}%`);
+        if (curWidth >= 80) {
+            clearInterval(outer);
+        }
+    }, 100);
+    let inner = setInterval(function () {
+        let curWidth = parseFloat($('#progressBar')[0].style.width.replace('%', ''));
+        if (curWidth >= 80) {
+            curWidth = parseFloat(curWidth + 0.1);
+            $('#progressBar').css('width', `${curWidth}%`);
+            if (curWidth >= 95) {
+                clearInterval(inner);
+            }
+        }
+    }, 500);
+    return {outer, inner};
+}
+
+function initProjects(callback) {
+    GetAllProjectData(function (datas) {
+        //设置工程专业
+        for (let data of datas) {
+            if (data.projType === projectType.tender) {
+                data.feeStandardName = data.property.feeStandardName || '';
+            }
+        }
+        CommonAjax.post('/options/getOptions', [], function (rstData) {
+            projTreeObj.setting.style.selectedColor = rstData.COLOROPTS.SELECTED.backColor;
+            projTreeObj.tree = pmTree.createNew(projTreeObj.setting, datas);
+            projTreeObj.tree.selected = projTreeObj.tree.items[0];
+            projTreeObj.workBook = projTreeObj.buildSheet(projTreeObj.workBook,'projSpread',projTreeObj.setting);
+            projTreeObj.workBook.getSheet(0).frozenColumnCount(2);
+            sheetCommonObj.spreadDefaultStyle(projTreeObj.workBook);
+            projTreeObj.sumEngineeringCost();
+            projTreeObj.showTreeData(projTreeObj.tree.items, projTreeObj.setting.header, projTreeObj.workBook.getActiveSheet());
+            //初始选择
+            let initSel = projTreeObj.workBook.getSheet(0).getSelections()[0] ? projTreeObj.workBook.getSheet(0).getSelections()[0] : {row: 0, rowCount: 1};
+            projTreeObj.initSelection(initSel,null,projTreeObj.workBook.getActiveSheet());
+           // $.bootstrapLoading.end();
+            autoFlashHeight();
+            projTreeObj.workBook.refresh();
+            if (callback) {
+                callback();
+            }
+        }, function () {
+            $.bootstrapLoading.end();
+        });
+    });
+}
+
 /**
  * 初始化数据
  *
@@ -1706,8 +1761,28 @@ function init() {
     rationValuation = rationValuation.replace(/\n/g, '\\n');
     //init spread and pmTree
     socketObject.connect('pm');//socket 连接;
-    $.bootstrapLoading.start();
-    GetAllProjectData(function (datas) {
+    if (isFirst) {
+        $('#progress').modal('show');
+        let intervalTime = prepareInitialTimer();
+        CommonAjax.post('/pm/api/prepareInitialData', {user_id: userID}, function () {
+            initProjects(function () {
+                clearInterval(intervalTime.outer);
+                clearInterval(intervalTime.inner);
+                $('#progressBar').css('width', '100%');
+                setTimeout(function () {
+                    $('#progress').modal('hide');
+                }, 500);
+            });
+        });
+    } else {
+        $.bootstrapLoading.start();
+        initProjects(function () {
+            $.bootstrapLoading.end();
+        })
+    }
+    //return;
+    //$.bootstrapLoading.start();
+    /*GetAllProjectData(function (datas) {
         //设置工程专业
         for (let data of datas) {
             if (data.projType === projectType.tender) {
@@ -1730,7 +1805,7 @@ function init() {
             autoFlashHeight();
             projTreeObj.workBook.refresh();
         });
-    });
+    });*/
     engineering = engineeringList !== null && engineeringList !== undefined ? JSON.parse(engineeringList) : [];
 }