Browse Source

限制单位工程数量

vian 6 years ago
parent
commit
1756936e92

+ 25 - 1
modules/main/middleware/system_setting.js

@@ -3,11 +3,20 @@
  */
 
 module.exports={
-    rationNumberChecking:rationNumberChecking
+    getSystemSetting,
+    rationNumberChecking:rationNumberChecking,
+    tenderNumberChecking
 };
 
 let mongoose = require("mongoose");
 let rationModel = mongoose.model("ration");
+const systemSettingModel = mongoose.model('system_setting');
+const pmFacade = require('../../pm/facade/pm_facade');
+
+// 获取系统设置,这个系统设置正常情况下有存在session中
+async function getSystemSetting() {
+    return await systemSettingModel.findOne({}).lean();
+}
 
 async function rationNumberChecking(req, res, next) {
     if(req.session.systemSetting){
@@ -25,4 +34,19 @@ async function rationNumberChecking(req, res, next) {
         }
     }
     next();
+}
+
+async function tenderNumberChecking(req, res, next) {
+    const data = JSON.parse(req.body.data);
+    const tenderCount = data.tenderCount;
+    if (tenderCount) {
+        const tenderOverrun = await pmFacade.isTenderOverrun(tenderCount, req.session);
+        if (tenderOverrun) {
+            return res.json({
+                error: 1,
+                message: '您创建的项目个数超限,请联系我们的客服人员,或者导出建设项目保存到本地备份,删除云上数据。'
+            });
+        }
+    }
+    next();
 }

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

@@ -32,7 +32,8 @@ module.exports={
     importProject:importProject,
     uploadToken:uploadToken,
     downLoadProjectFile:downLoadProjectFile,
-    importProcessChecking:importProcessChecking
+    importProcessChecking:importProcessChecking,
+    isTenderOverrun
 };
 
 
@@ -87,6 +88,7 @@ let qiniu = require("qiniu");
 let fs = require("fs");
 let path = require("path");
 let request = require("request");
+const systemSettingMiddleware = require('../../main/middleware/system_setting');
 
 let qiniu_config = {
     "AccessKey": "_gR1ed4vi1vT2G2YITGSf4_H0fJu_nRS9Tzk3T4z",
@@ -1218,6 +1220,12 @@ async function importProject(data,req,updateData) {
              result.error = 1;
              result.msg = `导入失败:您要导入的文件是由“${fileCompilationName}”导出,当前软件是“${curCompilationName}”,请选择正确的编制办法再进行操作!`;
          }else {
+            const tenders = mainData.projects.filter(item => item.projType === projectType.tender);
+            const tenderOverrun = await isTenderOverrun(tenders.length, req.session);
+            if (tenderOverrun) {
+                result.error = 1;
+                result.msg = `您创建的项目个数超限,请联系我们的客服人员,或者导出建设项目保存到本地备份,删除云上数据。`;
+            }
             let [projectIDMap,labourCoeFileIDMap,calcProgramFileIDMap] = await handleMainProjectDatas(mainData,updateData,req.session.sessionUser.id);
             if(datas.length > 1 ){
                 for(let i = 1;i<datas.length;i++){
@@ -1532,4 +1540,23 @@ function uploadToken() {
             domain: qiniu_config.Domain
         }
     return result
+}
+
+// 有些方法无法通过中间件就检查单位工程数量是否超限
+// 需要到具体的业务代码中进行判断
+// 这个方法就是具体业务代码中,需要检查单位工程数量是否超限用
+async function isTenderOverrun(tenderCount, session) {
+    const userID = session.sessionUser.id;
+    const compilation = session.sessionCompilation._id;
+    const compilationVersion = session.compilationVersion || '免费';
+    let systemSetting = session.systemSetting;
+    // 这种情况只有在刚上线此功能时会出现,不考虑时间差
+    if (!systemSetting) {
+        systemSetting = await systemSettingMiddleware.getSystemSetting();
+        session.systemSetting = systemSetting;
+    }
+    const type = compilationVersion.includes('免费') ? 'normal' : 'professional';
+    const limit = systemSetting[type].project;
+    const curTenderCount = await projectModel.count({userID, compilation, projType: 'Tender', '$or':[{deleteInfo: null}, {'deleteInfo.completeDeleted': false}]});
+    return tenderCount + curTenderCount > limit;
 }

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

@@ -6,6 +6,7 @@ import BaseController from "../../common/base/base_controller";
 let express = require('express');
 let pmController = require('./../controllers/pm_controller');
 const baseController = new BaseController();
+const systemMiddleware = require('../../main/middleware/system_setting');
 
 module.exports = function (app) {
 
@@ -34,7 +35,7 @@ module.exports = function (app) {
      req.body = {data: '{user_id: user_id, updateData: [{updateType, updateData}]}'}
      data.updateData.updateType: 1 of ['new', 'update', 'delete']
      */
-    pmRouter.post('/updateProjects', pmController.updateProjects);
+    pmRouter.post('/updateProjects', systemMiddleware.tenderNumberChecking, pmController.updateProjects);
     pmRouter.post('/updateMixDatas', pmController.updateMixDatas);
     pmRouter.post('/moveProject', pmController.moveProject);
 
@@ -43,7 +44,7 @@ module.exports = function (app) {
      data.updateData.updateType: 1 of ['update', 'copy']
      */
     pmRouter.post('/getProjectsByQuery', pmController.getProjectsByQuery);
-    pmRouter.post('/copyProjects', pmController.copyProjects);
+    pmRouter.post('/copyProjects', systemMiddleware.tenderNumberChecking, pmController.copyProjects);
     pmRouter.post('/renameProject', pmController.rename);
     pmRouter.post('/beforeOpenProject', pmController.beforeOpenProject);
     pmRouter.post('/getProject', pmController.getProject);

+ 3 - 3
public/web/common_ajax.js

@@ -6,21 +6,21 @@ var CommonAjax = {
     get:function (url,data,cb,dataType) {
         $.get(url,data,cb,dataType)
     },
-    post: function (url, data, successCallback, errorCallback) {
+    post: function (url, data, successCallback, errorCallback, timeout = 50000) {
         $.ajax({
             type:"POST",
             url: url,
             data: {'data': JSON.stringify(data)},
             dataType: 'json',
             cache: false,
-            timeout: 50000,
+            timeout: timeout,
             success: function(result){
                 if (result.error === 0) {
                     if (successCallback) {
                         successCallback(result.data);
                     }
                 } else {
-                    alert('error: ' + result.message);
+                    alert(result.message);
                     if (errorCallback) {
                         errorCallback();
                     }

+ 4 - 1
web/building_saas/css/custom.css

@@ -392,6 +392,9 @@ input.text-right{
     color:#ECE0F5 !important;
     -webkit-text-stroke:.5px #ced4da;
 }
+.z-index-3000 {
+    z-index: 3000;
+}
 .text-ellipsis {
     overflow: hidden;
     white-space: nowrap;
@@ -415,7 +418,7 @@ input.text-right{
     height: 500px;
 }
 
-@media screen and (max-width: 1366px) {
+@media screen and (max-width: 1366px), (max-height: 768px) {
     .middle-modal-width {
         max-width: 500px;
     }

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

@@ -382,7 +382,7 @@
                 </form>
             </div>
             <div class="modal-footer">
-                <a href="javascript:void(0);" class="btn btn-primary" id="add-tender-confirm">确定</a>
+                <a href="javascript:void(0);" class="btn btn-primary" data-dismiss="modal" id="add-tender-confirm">确定</a>
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
             </div>
         </div>

+ 3 - 2
web/building_saas/pm/js/pm_ajax.js

@@ -25,10 +25,11 @@ var GetAllProjectData = function (callback) {
 }
 // 更新数据到服务器
 var UpdateProjectData = function (updateData, callback, errCB) {
+    const tenderCount = updateData.filter(item => item.updateType === 'new' && item.updateData.projType === projectType.tender).length;
     $.ajax({
         type:"POST",
         url: '/pm/api/updateProjects',
-        data: {'data': JSON.stringify({"user_id": userID, "updateData": updateData})},
+        data: {'data': JSON.stringify({"user_id": userID, "updateData": updateData, tenderCount})},
         dataType: 'json',
         cache: false,
         timeout: 50000,
@@ -39,7 +40,7 @@ var UpdateProjectData = function (updateData, callback, errCB) {
                 if (errCB) {
                     errCB();
                 }
-                alert('error: ' + result.message);
+                alert(result.message);
             }
         },
         error: function(jqXHR, textStatus, errorThrown){

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

@@ -364,7 +364,7 @@ const projTreeObj = {
             }
         },
         refreshSummary: {
-            name: "刷新当前项目造价",
+            name: "刷新项目造价",
             icon: 'fa-refresh',
             disabled: function () {
                 let selectedItem = projTreeObj.tree.selected;
@@ -400,6 +400,8 @@ const projTreeObj = {
                             if(selectedItem.children[0] .projType === projectType.project ) return false;//如果文件夹有子项,并且是建设项目,可用
                         }
                     }
+                } else {
+                    return false;
                 }
                 return true;
             },
@@ -1588,6 +1590,9 @@ const projTreeObj = {
             parent = selectNode.parent;
             next = selectNode.nextSibling;
             updateData["update"] = {query:{ID:selectNode.id()}}
+        } else if (!selectNode) { // 默认在第一位
+            parent = selectNode ? selectNode.parent : projTreeObj.tree._root;
+            next = selectNode ? selectNode.nextSibling : projTreeObj.tree.firstNode();
         }
         updateData["self"] ={ParentID:parent.id(),NextSiblingID:next?next.id():-1};
         return updateData;
@@ -1601,6 +1606,13 @@ const projTreeObj = {
 };
 
 $(document).ready(function() {
+    // 单位工程超限提示后,弹出客服列表
+    $('#hintBox_form').on('hide.bs.modal', function () {
+        const text = $('#hintBox_caption').text();
+        if (text === '您创建的项目个数超限,请联系我们的客服人员,或者导出建设项目保存到本地备份,删除云上数据。') {
+            $('#customerService').click();
+        } 
+    });
     //绑定项目管理的升降级、上下移按钮事件
     projTreeObj.loadBtn();
     $('#sideTab').find('li').click(function () {
@@ -2013,12 +2025,12 @@ $(document).ready(function() {
         projectMap['copy'] = {document:projectData};
         $("#copy-to-dialog").modal('hide');
         $.bootstrapLoading.start();
-        CommonAjax.post('/pm/api/copyProjects',{projectMap:projectMap,user_id: userID},function (result) {
+        CommonAjax.post('/pm/api/copyProjects',{projectMap:projectMap,user_id: userID, tenderCount: 1},function (result) {
             let newNode = projTreeObj.insert(result['copy'].document,parent,next);
             let refreshNodes = projTreeObj.calEngineeringCost(newNode);
             projTreeObj.refreshNodeData(refreshNodes);
             $.bootstrapLoading.end();
-        })
+        }, null, 1000 * 60 * 5);
 
     });
     $('#selectSameTypeProject').click(function(){

+ 2 - 2
web/building_saas/pm/js/pm_share.js

@@ -954,11 +954,11 @@ const pmShare = (function () {
             copyMap.copy = {document: copyData};
             $('#copyShare').modal('hide');
             $.bootstrapLoading.start();
-            CommonAjax.post('/pm/api/copyProjects', {projectMap: copyMap, user_id: userID}, function (rstData) {
+            CommonAjax.post('/pm/api/copyProjects', {projectMap: copyMap, user_id: userID, tenderCount: 1}, function (rstData) {
                 $.bootstrapLoading.end();
             }, function () {
                 $.bootstrapLoading.end();
-            });
+            },  1000 * 60 * 5);
         });
 
     }

+ 1 - 1
web/common/html/header.html

@@ -171,7 +171,7 @@
 </div>
 <!--激活产品 & 售后服务 & 联系客服-->
 <!--办事处客服列表-->
-<div class="modal fade" id="activ" data-backdrop="static" style="display: none;" aria-hidden="true">
+<div class="modal fade z-index-3000" id="activ" data-backdrop="static" style="display: none;" aria-hidden="true">
     <div class="modal-dialog modal-lg" role="document">
         <div class="modal-content">
             <div class="modal-header">