Browse Source

批量替换单价、费率文件

zhangweicheng 6 years ago
parent
commit
fa9c06e696

+ 4 - 1
modules/fee_rates/facade/fee_rates_facade.js

@@ -421,6 +421,9 @@ async function changeFeeRateFile(projectData,feeRateFile,type,userID) {
         let oldFeeRateFile = await feeRateFileModel.findOne({'ID':feeRateFile.id});
         let oldFeeRateFile = await feeRateFileModel.findOne({'ID':feeRateFile.id});
         let feeRate = await feeRateModel.findOne({ID:oldFeeRateFile.feeRateID});
         let feeRate = await feeRateModel.findOne({ID:oldFeeRateFile.feeRateID});
         let newFeeRate={};
         let newFeeRate={};
+        if(! feeRate){
+            throw '不存在对应费率文件';
+        }
         newFeeRate.ID=uuidV1();
         newFeeRate.ID=uuidV1();
         newFeeRate.rates =feeRate.rates;
         newFeeRate.rates =feeRate.rates;
         newFeeRateFile.ID = uuidV1();
         newFeeRateFile.ID = uuidV1();
@@ -435,7 +438,7 @@ async function changeFeeRateFile(projectData,feeRateFile,type,userID) {
         temFile={
         temFile={
             id:newFeeRateFile.ID,
             id:newFeeRateFile.ID,
             name:feeRateFile.name
             name:feeRateFile.name
-        }
+        };
         newFeeRateFile.rates=newFeeRate.rates;//构建返回数据
         newFeeRateFile.rates=newFeeRate.rates;//构建返回数据
     }
     }
     await  projectsModel.findOneAndUpdate({ID:projectData.projectID},{'property.feeFile':temFile});
     await  projectsModel.findOneAndUpdate({ID:projectData.projectID},{'property.feeFile':temFile});

+ 80 - 0
modules/glj/facade/glj_facade.js

@@ -0,0 +1,80 @@
+/**
+ * Created by zhang on 2019/1/2.
+ */
+module.exports={ //先导出后require可以解决循环引用问题
+    changeUnitFile:changeUnitFile
+};
+
+const ProjectModel = require('../../pm/models/project_model').project;
+import UnitPriceFileModel from "../models/unit_price_file_model";
+import UnitPriceModel from "../models/unit_price_model";
+
+async function changeUnitFile(projectData,unitFile,type,userID) {
+    let projectId = projectData.projectID;
+    let changeUnitPriceId = unitFile.id;
+    let newName = unitFile.name;
+    type = parseInt(type);
+
+        let currentUnitPriceId = await ProjectModel.getUnitPriceFileId(projectId);
+        let unitPriceFileModel = new UnitPriceFileModel();
+
+        let insertData = null;
+        if (type > 0) {
+            let currentUnitPrice = await unitPriceFileModel.findDataByCondition({id: changeUnitPriceId});
+            if (currentUnitPrice === null) {
+                throw '不存在对应单价文件';
+            }
+            // 获取当前项目的rootProjectId
+            let projectData = await ProjectModel.getProject(projectId);
+            let rootProjectId = projectData.property.rootProjectID !== undefined ? projectData.property.rootProjectID : 0;
+
+            insertData = JSON.parse(JSON.stringify(currentUnitPrice));
+            insertData.root_project_id = rootProjectId;
+            newName?insertData.name = newName:'';
+            insertData.user_id = userID;
+            delete insertData._id;
+            delete insertData.ID;
+        }
+        // 获取即将更改的单价文件信息
+        let targetUnitPriceFile = type === 0 ? await unitPriceFileModel.findDataByCondition({id: changeUnitPriceId}) :
+            await unitPriceFileModel.add(insertData);
+        if (targetUnitPriceFile === null) {
+            throw '没有找到对应的单价文件';
+        }
+
+        // 查找对应单价文件的项目工料机数据
+        let unitPriceModel = new UnitPriceModel();
+        if(type ===1){//从其它项目复制,则先复制一份数据。
+            let needCopyList = await unitPriceModel.findDataByCondition({unit_price_file_id: changeUnitPriceId}, null, false);
+            if(needCopyList){
+                // 过滤mongoose格式
+                needCopyList = JSON.stringify(needCopyList);
+                needCopyList = JSON.parse(needCopyList);
+                let copyList = [];
+                for(let n of needCopyList){
+                    delete n._id;  // 删除原有id信息
+                    delete n.id;
+                    n.unit_price_file_id = targetUnitPriceFile.id;
+                    copyList.push(n);
+                }
+                copyList.length>0 ? await unitPriceModel.add(copyList):'';
+            }
+        }
+
+
+        let copyResult = await unitPriceModel.copyNotExist(currentUnitPriceId, targetUnitPriceFile.id,projectId);
+        // 复制成功后更改project数据
+        if (!copyResult) {
+            throw '复制数据失败';
+        }
+
+        let changeUnitPriceFileInfo = {
+            id: targetUnitPriceFile.id,
+            name: targetUnitPriceFile.name
+        };
+        let result = ProjectModel.changeUnitPriceFileInfo(projectId, changeUnitPriceFileInfo);
+        if (!result) {
+            throw '切换单价文件失败!';
+        }
+        return changeUnitPriceFileInfo;
+}

+ 2 - 3
modules/pm/controllers/pm_controller.js

@@ -650,12 +650,11 @@ module.exports = {
         try{
         try{
             let data = JSON.parse(req.body.data);
             let data = JSON.parse(req.body.data);
             console.log(data);
             console.log(data);
-            await pm_facade.changeFile(data.projects,data.userID,data.fileID,data.name,data.from,data.type);
-
-           // let summaryInfo = await pm_facade.getSummaryInfo(data.projectIDs);
+            await pm_facade.changeFile(data.projects,data.user_id,data.fileID,data.name,data.from,data.type);
             callback(req, res, 0, 'success', []);
             callback(req, res, 0, 'success', []);
         }
         }
         catch (err){
         catch (err){
+            console.log(err);
             callback(req, res, 1, err, null);
             callback(req, res, 1, err, null);
         }
         }
     }
     }

+ 36 - 32
modules/pm/facade/pm_facade.js

@@ -1,9 +1,37 @@
 /**
 /**
  * Created by zhang on 2018/4/17.
  * Created by zhang on 2018/4/17.
  */
  */
+const projectType = {
+    folder: 'Folder',
+    tender: 'Tender',
+    project: 'Project',
+    engineering: 'Engineering',
+};
+//先导出后require可以解决循环引用问题
+module.exports={
+    moveProject:moveProject,
+    copyProject:copyProject,
+    copyExample: copyExample,
+    getSummaryInfo: getSummaryInfo,
+    getSummaryInfoByTender: getSummaryInfoByTender,
+    getTendersFeeInfo: getTendersFeeInfo,
+    getConstructionProject: getConstructionProject,
+    getFullPath: getFullPath,
+    getProjectFeature:getProjectFeature,
+    projectType: projectType,
+    getPosterityProjects: getPosterityProjects,
+    isShare: isShare,
+    getShareInfo: getShareInfo,
+    prepareInitialData: prepareInitialData,
+    changeFile:changeFile
+};
+
+
+
 let mongoose = require('mongoose');
 let mongoose = require('mongoose');
 let _ = require("lodash");
 let _ = require("lodash");
 let feeRate_facade = require('../../fee_rates/facade/fee_rates_facade');
 let feeRate_facade = require('../../fee_rates/facade/fee_rates_facade');
+let glj_facade = require('../../glj/facade/glj_facade');
 let project_facade = require('../../main/facade/project_facade');
 let project_facade = require('../../main/facade/project_facade');
 let logger = require("../../../logs/log_helper").logger;
 let logger = require("../../../logs/log_helper").logger;
 const uuidV1 = require('uuid/v1');
 const uuidV1 = require('uuid/v1');
@@ -37,32 +65,9 @@ let sectionTreeDao = new SectionTreeDao();
 import CounterModel from "../../glj/models/counter_model";
 import CounterModel from "../../glj/models/counter_model";
 import moment from 'moment';
 import moment from 'moment';
 import billsFlags from '../../common/const/bills_fixed';
 import billsFlags from '../../common/const/bills_fixed';
-const projectType = {
-    folder: 'Folder',
-    tender: 'Tender',
-    project: 'Project',
-    engineering: 'Engineering',
-};
 const notDeleted = [{deleteInfo: null}, {'deleteInfo.deleted': false}];
 const notDeleted = [{deleteInfo: null}, {'deleteInfo.deleted': false}];
 
 
 
 
-module.exports={
-    moveProject:moveProject,
-    copyProject:copyProject,
-    copyExample: copyExample,
-    getSummaryInfo: getSummaryInfo,
-    getSummaryInfoByTender: getSummaryInfoByTender,
-    getTendersFeeInfo: getTendersFeeInfo,
-    getConstructionProject: getConstructionProject,
-    getFullPath: getFullPath,
-    getProjectFeature:getProjectFeature,
-    projectType: projectType,
-    getPosterityProjects: getPosterityProjects,
-    isShare: isShare,
-    getShareInfo: getShareInfo,
-    prepareInitialData: prepareInitialData,
-    changeFile:changeFile
-};
 
 
 //拷贝例题项目
 //拷贝例题项目
 //@param {String}userID {Array}projIDs拷贝的例题项目ID(建设项目、文件夹)@return {Boolean}
 //@param {String}userID {Array}projIDs拷贝的例题项目ID(建设项目、文件夹)@return {Boolean}
@@ -970,15 +975,14 @@ async function copyCompleGljSection(userId, compilationId) {
 async function changeFile(datas,userID,fileID,name,from,type){//from 费率或单价文件,type从单前建设项目还是从其它建设项目中复制
 async function changeFile(datas,userID,fileID,name,from,type){//from 费率或单价文件,type从单前建设项目还是从其它建设项目中复制
     let projectIDs = [],newFile = {id:fileID,name:name};//计录从其它项目中复制的文件,选中多个的时候只需复制一次
     let projectIDs = [],newFile = {id:fileID,name:name};//计录从其它项目中复制的文件,选中多个的时候只需复制一次
     let projectUpdateType = from == "feeRateFile"?"feeRate":"unitFile";
     let projectUpdateType = from == "feeRateFile"?"feeRate":"unitFile";
-    if(from == "feeRateFile"){
-        for(let d of datas){
-            let tem_file = await feeRate_facade.changeFeeRateFile(d, newFile,type,userID);
-            if(type == 1 && tem_file){//从建设项目复制时,只有第一次需要复制,剩下的就相当于使用同个建设项目的情况了
-                newFile = {id:tem_file.ID,name:tem_file.name};
-                type = 0;
-            }
-            projectIDs.push({ID:d.projectID})
-        }
+    for(let d of datas){
+        let tem_file = from == "feeRateFile"? await feeRate_facade.changeFeeRateFile(d, newFile,type,userID):await glj_facade.changeUnitFile(d, newFile,type,userID);
+        if(type == 1 && tem_file){//从建设项目复制时,只有第一次需要复制,剩下的就相当于使用同个建设项目的情况了
+            let newID =  from == "feeRateFile"?tem_file.ID:tem_file.id;
+            newFile = {id:newID,name:tem_file.name};
+            type = 0;
+        }
+        projectIDs.push({ID:d.projectID})
     }
     }
     await project_facade.markProjectsToChange(projectIDs,projectUpdateType)//项目标记为待刷新状态
     await project_facade.markProjectsToChange(projectIDs,projectUpdateType)//项目标记为待刷新状态
 
 

+ 18 - 19
modules/pm/models/project_model.js

@@ -1,6 +1,22 @@
 /**
 /**
  * Created by Mai on 2017/1/18.
  * Created by Mai on 2017/1/18.
  */
  */
+let projectType = {
+    folder: 'Folder',
+    tender: 'Tender',
+    project: 'Project',
+    engineering: 'Engineering',
+};
+let fileType = {
+    unitPriceFile: 'UnitPriceFile',
+    feeRateFile: 'FeeRateFile'
+};
+//先导出后require可以解决循环引用问题
+module.exports ={    project: new ProjectsDAO(),
+    projType: projectType,
+    fileType: fileType
+};
+
 import mongoose from 'mongoose';
 import mongoose from 'mongoose';
 import async_c from 'async';
 import async_c from 'async';
 import UnitPriceFileModel from "../../glj/models/unit_price_file_model";
 import UnitPriceFileModel from "../../glj/models/unit_price_file_model";
@@ -34,19 +50,9 @@ let Projects = mongoose.model('projects');
 let mainColLibModel = mongoose.model('std_main_col_lib');
 let mainColLibModel = mongoose.model('std_main_col_lib');
 let projSettingModel = mongoose.model('proj_setting');
 let projSettingModel = mongoose.model('proj_setting');
 let optionModel = mongoose.model('options');
 let optionModel = mongoose.model('options');
-let projectType = {
-    folder: 'Folder',
-    tender: 'Tender',
-    project: 'Project',
-    engineering: 'Engineering',
-};
-let fileType = {
-    unitPriceFile: 'UnitPriceFile',
-    feeRateFile: 'FeeRateFile'
-};
 
 
-let ProjectsDAO = function () {
-};
+function ProjectsDAO() {
+}
 
 
 let G_FILE_VER = '1.0.1';
 let G_FILE_VER = '1.0.1';
 
 
@@ -844,11 +850,4 @@ ProjectsDAO.prototype.defaultSettings = async function (userID, compilationId, p
     await optionModel.update({user_id: userID, compilation_id: compilationId}, {$set: {options: optionSetting}});
     await optionModel.update({user_id: userID, compilation_id: compilationId}, {$set: {options: optionSetting}});
     await Projects.update({ID: projectID}, {$set: {property: cloneProperty}});
     await Projects.update({ID: projectID}, {$set: {property: cloneProperty}});
     return true;
     return true;
-};
-
-
-
-module.exports ={    project: new ProjectsDAO(),
-    projType: projectType,
-    fileType: fileType
 };
 };

+ 0 - 1
public/web/socket/connection.js

@@ -41,7 +41,6 @@ socketObject={
           //window.location.reload();
           //window.location.reload();
       });
       });
       socket.on('unitFileChange', function (data) {
       socket.on('unitFileChange', function (data) {
-          data = JSON.parse(data);
           /*console.log(data);
           /*console.log(data);
           if (data.newValue === undefined) {
           if (data.newValue === undefined) {
               return false;
               return false;

+ 14 - 0
socket.js

@@ -15,6 +15,7 @@ socketIO.on('connection', function(socket) {
     console.log("new connection");
     console.log("new connection");
     // 加入房间
     // 加入房间
     socket.on('join', function(data) {
     socket.on('join', function(data) {
+        console.log(data);
         for(let key in data){
         for(let key in data){
             roomInfo[key] = data[key];
             roomInfo[key] = data[key];
             socket.join(data[key]);
             socket.join(data[key]);
@@ -44,6 +45,19 @@ socketIO.on('connection', function(socket) {
             socket.broadcast.to(data.userID).emit('refreshProjectIcon', data);
             socket.broadcast.to(data.userID).emit('refreshProjectIcon', data);
         }
         }
     });
     });
+    socket.on('multiFileChangeNotify', function(data) {
+        console.log(data);
+        let projectID = data.projects[0].projectID;
+        let userID = data.user_id;
+        if(projectID && userID){//通知项目管理页面
+            socket.broadcast.to(userID).emit('fileDataChange', {projectID:projectID});
+        }
+        for(let fileID of data.oldFileIDs){//通知已打开的项目页面
+            let messageTitle = data.from == "feeRateFile"?"feeRateChange":"unitFileChange";
+            socket.broadcast.to(fileID).emit(messageTitle, data);
+        }
+    });
+
 
 
     socket.on('disconnect', function () {
     socket.on('disconnect', function () {
         console.log("client disconnect =========="+JSON.stringify(roomInfo));
         console.log("client disconnect =========="+JSON.stringify(roomInfo));

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

@@ -680,7 +680,7 @@
             </div>
             </div>
             <div class="modal-footer">
             <div class="modal-footer">
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                <button type="button" class="btn btn-primary mr-3" data-dismiss="modal" id="changeFileConfirm">确定</button>
+                <button type="button" class="btn btn-primary mr-3" id="changeFileConfirm">确定</button>
             </div>
             </div>
         </div>
         </div>
     </div>
     </div>

+ 31 - 6
web/building_saas/pm/js/pm_newMain.js

@@ -1227,9 +1227,16 @@ const projTreeObj = {
         }
         }
     },
     },
     confirmFileChange :async function(){
     confirmFileChange :async function(){
-        let selectProjects =[],fileID=null,from = $("#mr_from").val(),name='';
-        for(let i of this.replaceTree.items){
-            if(i.data.selected === 1) selectProjects.push({projectID:i.data.ID,rootProjectID:i.data['property']['rootProjectID']})
+        let selectProjects =[],fileID=null,from = $("#mr_from").val(),name='',oldFileIDs = [],validate = true;
+        for(let i of this.replaceTree.items) {
+            if (i.data.selected === 1){
+                selectProjects.push({
+                    projectID: i.data.ID,
+                    rootProjectID: i.data['property']['rootProjectID']
+                });
+                let fileField = from == "feeRateFile" ? "feeFile" : "unitPriceFile";
+                oldFileIDs.push(i.data['property'][fileField]['id']);
+            }
         }
         }
         if(selectProjects.length > 0){
         if(selectProjects.length > 0){
             let type = parseInt($("input[name='select_from']:checked").val());//0 从当前建设项目,1从其它建设项目中复制
             let type = parseInt($("input[name='select_from']:checked").val());//0 从当前建设项目,1从其它建设项目中复制
@@ -1238,20 +1245,38 @@ const projTreeObj = {
                 name = $("#currentOptions").find("option:selected").text()
                 name = $("#currentOptions").find("option:selected").text()
             }else {
             }else {
                 fileID = $("#otherFileOptions").val();
                 fileID = $("#otherFileOptions").val();
-                name = $("#otherFileOptions").find("option:selected").text()
+                name = $("#otherFileOptions").find("option:selected").text();
             }
             }
             if(fileID == null || fileID == undefined|| fileID ==""){
             if(fileID == null || fileID == undefined|| fileID ==""){
                 alert("请选择替换文件")
                 alert("请选择替换文件")
             }
             }
-            await projTreeObj.postChangeFile({projects:selectProjects,fileID:fileID,name:name,type:type,from:from});
+            //从其它项目复制才要做重名检查
+            if(type == 1) validate = await projTreeObj.fileNameChecking({ name:name,rootProjectID:selectProjects[0].rootProjectID},from);
+            if (validate == true){
+                $('#m_replace_file').modal('hide');
+                await projTreeObj.postChangeFile({projects:selectProjects,fileID:fileID,name:name,type:type,from:from},oldFileIDs);
+            }else {
+                alert(`当前的建设项目中已经有相同名字的${from == "feeRateFile"?"费率":"单价"}文件!`);
+            }
+
         }
         }
     },
     },
-    postChangeFile:async function(data){
+    fileNameChecking:async function(data,from){
+        let url =from == "feeRateFile" ? "/feeRates/checkFeeRateName" : "/glj/checkUnitFileName";
+        let reuslt = await ajaxPost(url,data);
+        return reuslt == false;//result 为true 则有重名的文件
+    },
+
+    postChangeFile:async function(data,oldFileIDs){
         data.user_id = userID;
         data.user_id = userID;
         $.bootstrapLoading.start();
         $.bootstrapLoading.start();
         let result = await ajaxPost("/pm/api/changeFile",data);
         let result = await ajaxPost("/pm/api/changeFile",data);
         $.bootstrapLoading.end();
         $.bootstrapLoading.end();
         projTreeObj.refreshWhenFileDateChange(data.projects[0].projectID);
         projTreeObj.refreshWhenFileDateChange(data.projects[0].projectID);
+        //发送文件改变消息
+        data.oldFileIDs = _.uniq(oldFileIDs);
+        socket.emit('multiFileChangeNotify', data);
+
         console.log(result);
         console.log(result);
     },
     },
     checkFileName:async function (fileID,name,type) {
     checkFileName:async function (fileID,name,type) {