浏览代码

debug, lock bills

zhongzewei 7 年之前
父节点
当前提交
e0e0d9532d

+ 69 - 0
modules/users/controllers/user_controller.js

@@ -12,6 +12,8 @@ import LogModel from "../models/log_model";
 import SettingModel from "../models/setting_model";
 import SettingType from "../../common/const/setting_type_const";
 import CompilationModel from "../models/compilation_model";
+import mongoose from "mongoose";
+import moment from "moment";
 
 class UserController extends BaseController {
 
@@ -189,6 +191,73 @@ class UserController extends BaseController {
         response.redirect(request.headers.referer);
     }
 
+    /*
+    * 版本激活
+    * */
+    async activateVersion(request, response){
+        try{
+            let userModel = new UserModel();
+            let sessionUser = request.session.sessionUser;
+            let data = JSON.parse(request.body.data);
+            let activateCode = data.activateCode,
+                activateCompilation = data.activateCompilation;
+            let isActivated = true;//调激活接口
+            if(!isActivated){
+                throw '激活失败';
+            }
+            //激活成功,更新入库
+            let userObjId = mongoose.Types.ObjectId(sessionUser.id);
+            let versionInfo = {};
+            versionInfo.compilationId = activateCompilation;
+            versionInfo.activatedDate = moment(Date.now()).format('YYYY-MM-DD HH:mm:ss');
+            await userModel.addVersion({_id: userObjId}, versionInfo);
+            response.json({error: 0, msg: 'success'});
+        }
+        catch (error){
+            response.json({error: 1, msg: error})
+        }
+    }
+    /*
+    * 更新版本状态
+    * */
+    async updateVersionState(request, response){
+        try{
+            let userModel = new UserModel();
+            let activated = request.body.activated,
+                userId = request.body.userId,
+                compilationId = request.body.compilationId;
+            if(activated){
+                let versionInfo = {};
+                versionInfo.compilationId = compilationId;
+                versionInfo.activatedDate = moment(Date.now()).format('YYYY-MM-DD HH:mm:ss');
+                await userModel.addVersion({_id: mongoose.Types.ObjectId(userId)}, versionInfo);
+            }
+            else{
+                await userModel.removeVersion(userId, compilationId);
+            }
+            response.json({error: 0, msg: 'success'});
+        }
+        catch (error){
+            response.json({error: 1, msg: error});
+        }
+    }
+
+    /*
+    * 获取用户版本信息
+    * */
+    async getVersionInfo(request, response){
+        try{
+            let userModel = new UserModel();
+            let userId = request.session.sessionUser.id;
+            let userData = await userModel.findDataById(userId);
+            let versionInfo = userData ? userData.versionInfo ? userData.versionInfo : [] : [];
+            response.json({error: 0, msg: 'success', data: versionInfo});
+        }
+        catch(error){
+            response.json({error: 1, msg: error, data: null});
+        }
+    }
+
 }
 
 export default UserController;

+ 9 - 0
modules/users/models/user_model.js

@@ -191,6 +191,15 @@ class UserModel extends BaseModel {
         return this.db.update(condition, updateData);
     }
 
+    async addVersion(condition, versionInfo){
+        return await this.db.findOneAndUpdate(condition, {$addToSet: {versionInfo: versionInfo}});
+    }
+
+    async removeVersion(userId, compilationId){
+        let userObjId = mongoose.Types.ObjectId(userId);
+        return await this.db.findOneAndUpdate({_id: userObjId}, {$pull: {versionInfo: {compilationId: compilationId}}});
+    }
+
 }
 
 export default UserModel;

+ 2 - 0
modules/users/routes/user_route.js

@@ -19,5 +19,7 @@ module.exports = function (app) {
     router.get('/preferences', userController.init, userController.preferences);
     router.post('/save-preferences', userController.init, userController.savePreferences);
     router.post('/info', userController.init, userController.saveData);
+
+    router.post('/getVersionInfo', userController.init, userController.getVersionInfo);
     app.use('/user',router);
 };

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

@@ -220,8 +220,15 @@
                                                   </select>
                                               </p>
                                               <p style="text-align: center">
+                                                  <% if (projectData.property.lockBills == true) { %>
+                                                  <button class="btn btn-primary btn-sm disabled" type="button" id="use-to-current">应用到选中清单</button>
+                                                  <button class="btn btn-primary btn-sm disabled" type="button" id="use-to-all">应用到所有清单</button>
+                                                  <% } else { %>
                                                   <button class="btn btn-primary btn-sm" type="button" id="use-to-current">应用到选中清单</button>
                                                   <button class="btn btn-primary btn-sm" type="button" id="use-to-all">应用到所有清单</button>
+                                                  <% } %>
+                                                  <!--<button class="btn btn-primary btn-sm" type="button" id="use-to-current">应用到选中清单</button>
+                                                  <button class="btn btn-primary btn-sm" type="button" id="use-to-all">应用到所有清单</button>-->
                                               </p>
                                           </div>
                                       </div>

+ 147 - 69
web/building_saas/main/js/views/character_content_view.js

@@ -24,6 +24,7 @@ let contentOprObj = {
         let sheet = workBook.getActiveSheet(), me = contentOprObj;
         const EVENTS = GC.Spread.Sheets.Events;
         workBook.bind(EVENTS.ButtonClicked, me.onButtonClicked);
+        sheet.bind(EVENTS.EditStarting, me.onEditStart);
         sheet.bind(EVENTS.EditEnded, me.onEditEnded);
         sheet.bind(EVENTS.ClipboardPasting, me.onClipboardPasting);
         sheet.bind(EVENTS.ClipboardPasted, me.onClipboardPasted);
@@ -116,6 +117,7 @@ let contentOprObj = {
         me.save(function () {
             me.workBook.focus();
             me.workBook.getSheet(0).setActiveCell(cell.row - 1, cell.col);
+            me.initSelection(cell.row - 1);
         });
     },
     downMove: function (cell) {
@@ -130,6 +132,7 @@ let contentOprObj = {
         me.save(function () {
             me.workBook.focus();
             me.workBook.getSheet(0).setActiveCell(cell.row + 1, cell.col);
+            me.initSelection(cell.row + 1);
         });
     },
     deleteContent: function (rowIdx) {
@@ -160,6 +163,12 @@ let contentOprObj = {
         const setting = projectObj.project.property.addRule !== undefined ? projectObj.project.property.addRule : getAddRuleSetting();
         pageCCOprObj.setCharacterBySetting(selectedNode, setting, callback, contentOprObj);
     },
+    onEditStart(sender, args){
+        if(projectInfoObj.projectInfo.property.lockBills){
+            args.cancel = true;
+            return;
+        }
+    },
     onEditEnded: function (sender, args) {
         let me = contentOprObj;
         if(me.setting.header[args.col].dataCode === 'isChecked'){
@@ -178,6 +187,10 @@ let contentOprObj = {
         if(args.sheet.isEditing()){
             args.sheet.endEdit(true);
         }
+        if(projectInfoObj.projectInfo.property.lockBills){
+            args.sheet.setValue(args.row, args.col, 0);
+            return;
+        }
         let isChecked = args.sheet.getValue(args.row, args.col);
         if(me.currentCache.length > args.row){
             me.currentCache[args.row].isChecked = isChecked;
@@ -191,6 +204,10 @@ let contentOprObj = {
     },
     //复制粘贴
     onClipboardPasting: function (sender, args) {
+        if(projectInfoObj.projectInfo.property.lockBills){
+            args.cancel = true;
+            return;
+        }
         if(args.cellRange.colCount > 1 || args.cellRange.col !== 0){
             args.cancel = true;
         }
@@ -211,21 +228,29 @@ let contentOprObj = {
         if(args.newSelections && args.newSelections.length > 0){
             me.initSelection(args.newSelections[0].row);
         }
-        me.initSelection(args.newSelections[0].row);
     },
     initSelection: function (row) {
         let me = contentOprObj;
         let disObj = {jobAdd: false, jobInsert: true, jobDel: true, jobUp: true, jobDown: true};
-        if(row !== -1){
-            //在表内
-            if(row < me.currentCache.length){
-                disObj.jobDel = false;
-                disObj.jobInsert = false;
-                if(row !== 0){
-                    disObj.jobUp = false;
-                }
-                if(row !== me.currentCache.length - 1){
-                    disObj.jobDown = false;
+        if(projectInfoObj.projectInfo.property.lockBills){
+            disObj.jobAdd = true;
+            disObj.jobInsert = true;
+            disObj.jobDel = true;
+            disObj.jobUp = true;
+            disObj.jobDown = true;
+        }
+        else{
+            if(row !== -1){
+                //在表内
+                if(row < me.currentCache.length){
+                    disObj.jobDel = false;
+                    disObj.jobInsert = false;
+                    if(row !== 0){
+                        disObj.jobUp = false;
+                    }
+                    if(row !== me.currentCache.length - 1){
+                        disObj.jobDown = false;
+                    }
                 }
             }
         }
@@ -263,46 +288,56 @@ let contentOprObj = {
                 let sheet = me.workBook.getSheet(0);
                 let addDis = pageCCOprObj.isBillsType() ? false : true,  insertDis = false, delDis = false, upDis = false, downDis = false;
                 if(target.hitTestType === 3){//在表格内&& typeof target.row !== 'undefined' && typeof target.col !== 'undefined'
-                    if(typeof target.row !== 'undefined'){
-                        //控制按钮是否可用
-                        sheet.setActiveCell(target.row, target.col);
-                        if(!me.currentCache ||target.row >= me.currentCache.length){//右键定位在有数据的行,删除键才显示可用
-                            insertDis = true;
-                            delDis = true;
-                            downDis = true;
-                            upDis = true;
-                        }
-                        else{//有数据
-                            if(typeof target.col === 'undefined'){//定位不在表格内
+                    //清单锁定,不可用
+                    if(projectInfoObj.projectInfo.property.lockBills){
+                        addDis = true;
+                        insertDis = true;
+                        delDis = true;
+                        upDis = true;
+                        downDis = true;
+                    }
+                    else{
+                        if(typeof target.row !== 'undefined'){
+                            //控制按钮是否可用
+                            sheet.setActiveCell(target.row, target.col);
+                            if(!me.currentCache ||target.row >= me.currentCache.length){//右键定位在有数据的行,删除键才显示可用
                                 insertDis = true;
+                                delDis = true;
                                 downDis = true;
                                 upDis = true;
-                                delDis = true;
                             }
-                            else{//定位在表格内
-                                if(target.row === me.currentCache.length -1){//定位在最后一行,不可下移
+                            else{//有数据
+                                if(typeof target.col === 'undefined'){//定位不在表格内
+                                    insertDis = true;
                                     downDis = true;
-                                }
-                                if(target.row === 0){//定位在第一行,不可上移
                                     upDis = true;
+                                    delDis = true;
+                                }
+                                else{//定位在表格内
+                                    if(target.row === me.currentCache.length -1){//定位在最后一行,不可下移
+                                        downDis = true;
+                                    }
+                                    if(target.row === 0){//定位在第一行,不可上移
+                                        upDis = true;
+                                    }
                                 }
                             }
                         }
-                    }
-                    else{
-                        insertDis = true;
-                        delDis = true;
-                        downDis = true;
-                        upDis = true;
+                        else{
+                            insertDis = true;
+                            delDis = true;
+                            downDis = true;
+                            upDis = true;
+                        }
                     }
                     me.refreshTools({jobAdd: addDis, jobInsert: insertDis, jobDel: delDis, jobUp: upDis, jobDown: downDis});
                     return {
                         callback: function(){},
                         items: {
-                            "insert": {name: "插入", disabled: insertDis, icon: "context-menu-icon context-menu-icon-add", callback: function (key, opt) {
+                            "insert": {name: "插入", disabled: insertDis, icon: "fa-sign-in", callback: function (key, opt) {
                                 me.insertContent(sheet, sheet.getActiveRowIndex(), '');
                             }},
-                            "add": {name: "添加", disabled: addDis, icon: "fa-sign-in", callback: function (key, opt) {
+                            "add": {name: "添加", disabled: addDis, icon: "context-menu-icon context-menu-icon-add", callback: function (key, opt) {
                                 me.insertContent(sheet, me.currentCache.length, '');
                             }},
                             "delete": {name: "删除", disabled: delDis, icon: "fa-remove", callback: function (key, opt) {
@@ -491,6 +526,7 @@ let characterOprObj = {
         me.save(function () {
             me.workBook.getSheet(0).setActiveCell(cell.row - 1, cell.col);
             me.workBook.focus();
+            me.initSelection(cell.row - 1);
         });
     },
     downMove: function (cell) {
@@ -505,6 +541,7 @@ let characterOprObj = {
         me.save(function () {
             me.workBook.getSheet(0).setActiveCell(cell.row + 1, cell.col);
             me.workBook.focus();
+            me.initSelection(cell.row + 1);
         });
     },
     deleteCharacter: function (rowIdx) {
@@ -585,6 +622,10 @@ let characterOprObj = {
     },
     onEditStart: function (sender, args) {
         let me = characterOprObj;
+        if(projectInfoObj.projectInfo.property.lockBills){
+            args.cancel = true;
+            return;
+        }
         if(args.col === 1){//改变选择的特征值
             me.currentSelectedValue = me.currentCache.length > args.row ?  me.getCurrentSelected(me.currentCache[args.row]) : null;
         }
@@ -623,6 +664,9 @@ let characterOprObj = {
         }
     },
     onClipboardPasting: function (sender, args) {
+        if(projectInfoObj.projectInfo.property.lockBills){
+            args.cancel = true;
+        }
         if(args.cellRange.col + args.colCount - 1 > 1){
             args.cancel = true;
         }
@@ -666,6 +710,10 @@ let characterOprObj = {
         if(args.sheet.isEditing()){
             args.sheet.endEdit(true);
         }
+        if(projectInfoObj.projectInfo.property.lockBills){
+            args.sheet.setValue(args.row, args.col, 0);
+            return;
+        }
         let isChecked = args.sheet.getValue(args.row, args.col);
         if(me.currentCache.length > args.row){
             me.currentCache[args.row].isChecked = isChecked;
@@ -685,16 +733,26 @@ let characterOprObj = {
     initSelection: function (row) {
         let me = characterOprObj;
         let disObj = {itemAdd: false, itemInsert: true, itemDel: true, itemUp: true, itemDown: true};
-        if(row !== -1){
-            //在表内
-            if(row < me.currentCache.length){
-                disObj.itemDel = false;
-                disObj.itemInsert = false;
-                if(row !== 0){
-                    disObj.itemUp = false;
-                }
-                if(row !== me.currentCache.length - 1){
-                    disObj.itemDown = false;
+        //清单锁定,不可用
+        if(projectInfoObj.projectInfo.property.lockBills){
+            disObj.itemAdd = true;
+            disObj.itemInsert = true;
+            disObj.itemDel = true;
+            disObj.itemUp = true;
+            disObj.itemDown = true;
+        }
+        else{
+            if(row !== -1){
+                //在表内
+                if(row < me.currentCache.length){
+                    disObj.itemDel = false;
+                    disObj.itemInsert = false;
+                    if(row !== 0){
+                        disObj.itemUp = false;
+                    }
+                    if(row !== me.currentCache.length - 1){
+                        disObj.itemDown = false;
+                    }
                 }
             }
         }
@@ -720,37 +778,47 @@ let characterOprObj = {
                 let sheet = me.workBook.getSheet(0);
                 let addDis = pageCCOprObj.isBillsType() ? false : true, insertDis = false, delDis = false, upDis = false, downDis = false;
                 if(target.hitTestType === 3){//在表格内 && typeof target.row !== 'undefined' && typeof target.col !== 'undefined'
-                    if(typeof target.row !== 'undefined'){
-                        //控制按钮是否可用
-                        sheet.setActiveCell(target.row, target.col);
-                        if(!me.currentCache ||target.row >= me.currentCache.length){//右键定位在有数据的行,删除键才显示可用
-                            insertDis = true;
-                            delDis = true;
-                            downDis = true;
-                            upDis = true;
-                        }
-                        else{//有数据
-                            if(typeof target.col === 'undefined'){//定位在表格外
+                    //清单锁定,则不可用
+                    if(projectInfoObj.projectInfo.property.lockBills){
+                        addDis = true;
+                        insertDis = true;
+                        delDis = true;
+                        upDis = true;
+                        downDis = true;
+                    }
+                    else{
+                        if(typeof target.row !== 'undefined'){
+                            //控制按钮是否可用
+                            sheet.setActiveCell(target.row, target.col);
+                            if(!me.currentCache ||target.row >= me.currentCache.length){//右键定位在有数据的行,删除键才显示可用
                                 insertDis = true;
+                                delDis = true;
                                 downDis = true;
                                 upDis = true;
-                                delDis = true;
                             }
-                            else{
-                                if(target.row === me.currentCache.length -1){//定位在最后一行,不可下移
+                            else{//有数据
+                                if(typeof target.col === 'undefined'){//定位在表格外
+                                    insertDis = true;
                                     downDis = true;
-                                }
-                                if(target.row === 0){//定位在第一行,不可上移
                                     upDis = true;
+                                    delDis = true;
+                                }
+                                else{
+                                    if(target.row === me.currentCache.length -1){//定位在最后一行,不可下移
+                                        downDis = true;
+                                    }
+                                    if(target.row === 0){//定位在第一行,不可上移
+                                        upDis = true;
+                                    }
                                 }
                             }
                         }
-                    }
-                    else{
-                        insertDis = true;
-                        delDis = true;
-                        downDis = true;
-                        upDis = true;
+                        else{
+                            insertDis = true;
+                            delDis = true;
+                            downDis = true;
+                            upDis = true;
+                        }
                     }
                     me.refreshTools({itemAdd: addDis, itemInsert: insertDis, itemDel: delDis, itemUp: upDis, itemDown: downDis});
                     return {
@@ -874,8 +942,8 @@ let pageCCOprObj = {
                 sheet.autoFitRow(row);
             }
         }
-        contentOprObj.initSelection(0);
-        characterOprObj.initSelection(0);
+        contentOprObj.initSelection(contentOprObj.workBook.getSheet(0).getActiveRowIndex());
+        characterOprObj.initSelection(characterOprObj.workBook.getSheet(0).getActiveRowIndex());
         sheet.resumeEvent();
         sheet.resumePaint();
     },
@@ -887,6 +955,16 @@ let pageCCOprObj = {
         sheetCommonObj.cleanSheet(theCha.workBook.getSheet(0), theCha.setting, -1);
         projectObj.mainSpread.focus(true);
     },
+    //锁定/解锁清单后添加规则的改变
+    refreshRuleTools: function (lockBills) {
+        $('#use-to-current').removeClass('disabled');
+        $('#use-to-all').removeClass('disabled');
+        if(lockBills){
+            $('#use-to-current').addClass('disabled');
+            $('#use-to-all').addClass('disabled');
+        }
+
+    },
     //更新特征及内容数据
     updateCharacterContent: function (findSet, updateObj, txtObj, oprObj, callback) {
         let me = pageCCOprObj, updateCol;

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

@@ -660,6 +660,7 @@ var projectObj = {
 
                 that.mainSpread.getActiveSheet().startEdit();
                 that.mainSpread.getActiveSheet().endEdit();
+                that.mainSpread.bind(GC.Spread.Sheets.Events.SelectionChanged, that.amountAreaNumber);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.LeaveCell, that.mainSpreadLeaveCell);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.EnterCell, that.mainSpreadEnterCell);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.EditStarting, that.mainSpreadEditStarting);
@@ -1364,6 +1365,7 @@ $("a[name='lockBills']").click(function () {
         controller.refreshTreeNode(nodes);
         projectObj.mainController.setTreeSelected(selected);//触发树节点选中事件
         projectObj.loadLockBillsButton();
+        pageCCOprObj.refreshRuleTools(lockBills);
     });
 });
 //显示至..
@@ -1865,6 +1867,15 @@ function doAfterImport(resData){
             projectObj.project.Bills.tree.m_delete(delIdNodes);
         }
         if(resData.insert.bill.length > 0){
+            //设置flagsIndex
+            for(let insertBill of resData.insert.bill){
+                insertBill.flagsIndex = {};
+                if (insertBill.flags) {
+                    insertBill.flags.forEach(function (flag) {
+                        insertBill.flagsIndex[flag.fieldName] = flag;
+                    });
+                }
+            }
             //插入清单节点
             projectObj.project.Bills.tree.insertByDatas(resData.insert.bill);
             //插入主树节点
@@ -1876,6 +1887,10 @@ function doAfterImport(resData){
             }
             ProjectController.syncDisplayNewNodes(projectObj.mainController, newNodes);
         }
+        //如果清单未锁定,导入后锁定清单
+        if(!projectInfoObj.projectInfo.property.lockBills){
+            $("a[name='lockBills']").click();
+        }
         $.bootstrapLoading.end();
         //重算
         projectObj.project.calcProgram.calcAllNodesAndSave(calcAllType.catAll, function () {

+ 3 - 0
web/building_saas/main/js/views/std_bills_lib.js

@@ -178,6 +178,9 @@ var billsLibObj = {
                 let selectNode = stdBillsTree.items[args.row];
                 let name = selectNode.data.name;
                 if (stdBillsTree.items[args.row].children.length === 0) {
+                    if(projectInfoObj.projectInfo.property.lockBills == true){
+                        return;
+                    }
                     //特征及内容转化
                     pageCCOprObj.setItemContentNode(stdBillsTree.items[args.row], getBillsJobs(stdBillsTree.items[args.row]), getBillsFeatures(stdBillsTree.items[args.row]), name);
                     if (/\//.test(selectNode.data.unit)) {

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

@@ -124,7 +124,7 @@
 
                         <legend>单价文件</legend>
                         <table class="table table-bordered table-hover table-sm" id="summary-project-unit-price-table">
-                            <thead><th style="width: 40px;"></th><th style="width: 500px;">名称</th><th style="width:50px;">使用</th></thead>
+                            <thead><th style="width: 25px;"></th><th style="width: 330px;">名称</th><th style="width:40px;">使用</th></thead>
                             <tbody>
                             <tr><td>1</td><td>A单价文件</td></tr>
                             <tr><td>2</td><td>B单价文件</td></tr>
@@ -135,7 +135,7 @@
 
                         <legend>费率文件</legend>
                         <table class="table table-bordered table-hover table-sm" id="summary-project-fee-table">
-                            <thead><th style="width: 40px;"></th><th style="width: 500px;">名称</th><th style="width:50px;">使用</th></thead>
+                            <thead><th style="width: 25px;"></th><th style="width: 330px;">名称</th><th style="width:40px;">使用</th></thead>
                             <tbody>
                             <tr><td>1</td><td>A费率文件</td></tr>
                             <tr><td>2</td><td>B费率文件</td></tr>

+ 5 - 2
web/building_saas/pm/js/pm_newMain.js

@@ -43,7 +43,7 @@ const projTreeObj = {
             {name: '工程造价', dataCode: 'engineeringCost', width: 170, vAlign: 'center', hAlign: 'right'},
             {name: '单价文件', dataCode: 'unitPriceFile', width: 250, vAlign: 'center', hAlign: 'left'},
             {name: '费率文件', dataCode: 'feeRateFile', width: 250, vAlign: 'center', hAlign: 'left'},
-            {name: '创建日期', dataCode: 'createDateTime', width: 170, vAlign: 'center', hAlign: 'center'}
+            {name: '创建日期', dataCode: 'createDateTime', width: 90, vAlign: 'center', hAlign: 'center'}
         ],
         //选中行颜色
         style: {
@@ -557,7 +557,7 @@ const projTreeObj = {
                 //建设项目,侧滑汇总
                 if(node.data.projType === projectType.project && withingClickArea()){
                     setDataToSideBar();
-                    $(".slide-sidebar").animate({width:"650"}).addClass("open");
+                    $(".slide-sidebar").animate({width:"440"}).addClass("open");
                     $('body').unbind('click');
                     setTimeout(function () {
                         $("body").bind('click', function (event) {
@@ -926,6 +926,7 @@ $(document).ready(function() {
 
     // 新增单位工程点击
     $("#add-tender-btn").click(function() {
+        //弹出新建单位工程之前,判断当前使用版本,且当前使用单位工程数是否已到最大值
         let selectedItem = projTreeObj.tree.selected;
         $("#add-tender-dialog").modal("show");
     });
@@ -2618,3 +2619,5 @@ function refreshTenderFile(tenders, type, newName){
        }
    });
 }
+
+//获取当前版本信息