vian 1 год назад
Родитель
Сommit
ef40a80759

+ 118 - 117
modules/main/controllers/bills_controller.js

@@ -15,15 +15,15 @@ let stdBillCharacterModel = mongoose.model('std_bills_lib_itemCharacter');
 const { fixedFlag } = require('../../../public/common_constants');
 let LZString = require('lz-string');
 const uuidV1 = require('uuid/v1');
-const billType ={
-    DXFY:1,//大项费用
-    FB:2,//分部
-    FX:3,//分项
-    BILL:4,//清单
-    BX:5//补项
+const billType = {
+    DXFY: 1,//大项费用
+    FB: 2,//分部
+    FX: 3,//分项
+    BILL: 4,//清单
+    BX: 5//补项
 };
 //上传的09表、广联达表
-const uploadType = {lj: 'lj', gld: 'gld'};
+const uploadType = { lj: 'lj', gld: 'gld' };
 // 上传控件
 const multiparty = require("multiparty");
 const fs = require("fs");
@@ -31,14 +31,14 @@ const fs = require("fs");
 const excel = require("node-xlsx");
 const urlencode = require('urlencode');
 //统一回调函数
-var callback = function(req, res, err, message, data){
-    res.json({error: err, message: message, data: data});
+var callback = function (req, res, err, message, data) {
+    res.json({ error: err, message: message, data: data });
 };
 
 module.exports = {
-    getData: function(req, res){
+    getData: function (req, res) {
         var data = JSON.parse(req.body.data);
-        billsData.getData(data.projectId, function(err, message, billsList){
+        billsData.getData(data.projectId, function (err, message, billsList) {
             if (err === 0) {
                 callback(req, res, err, message, billsList);
             } else {
@@ -47,9 +47,9 @@ module.exports = {
         });
     },
 
-    getItemTemplate: function(req, res){
+    getItemTemplate: function (req, res) {
         //var data = JSON.parse(req.body.data);
-        billsData.getItemTemplate(function(err, message, billsItem){
+        billsData.getItemTemplate(function (err, message, billsItem) {
             if (billsItem) {
                 callback(req, res, err, message, billsItem);
             } else {
@@ -58,8 +58,8 @@ module.exports = {
         });
     },
 
-    allocIDs: function(req, res){
-        billsData.allocIDs(function(err, message, data){
+    allocIDs: function (req, res) {
+        billsData.allocIDs(function (err, message, data) {
             if (err) {
                 callback(req, res, err, message, data);
             } else {
@@ -78,16 +78,16 @@ module.exports = {
         });
     },
     updateBills: async function (req, res) {
-        try{
+        try {
             let data = JSON.parse(req.body.data);
             await billsData.updateBills(data.updateDatas);
             callback(req, res, 0, 'success', null);
         }
-        catch (err){
+        catch (err) {
             callback(req, res, 1, err, null);
         }
     },
-    updateBill: async function(request, response) {
+    updateBill: async function (request, response) {
         const data = JSON.parse(request.body.data);
         const findSet = data.findSet;
         const updateData = data.updateData;
@@ -111,90 +111,90 @@ module.exports = {
         const err = !result ? 1 : 0;
         callback(request, response, err, message, null);
     },
-    singleDelete:async function(req, res){
-        let result={
-            error:0
+    singleDelete: async function (req, res) {
+        let result = {
+            error: 0
         }
         try {
             let data = req.body.data;
             data = JSON.parse(data);
             let tasks = generateSingleDeleteTasks(data);
-            let resultData= await billsData.model.bulkWrite(tasks);
+            let resultData = await billsData.model.bulkWrite(tasks);
             //删除工程量明细
-            await quantity_detail.deleteByQuery({projectID: data.projectID, billID: data.ID}) ;
-            result.data=resultData;
-        }catch (err){
+            await quantity_detail.deleteByQuery({ projectID: data.projectID, billID: data.ID });
+            result.data = resultData;
+        } catch (err) {
             logger.err(err);
-            result.error=1;
+            result.error = 1;
             result.message = err.message;
         }
         res.json(result);
     },
-    multiDelete:async function(req, res){
-        let result={
-            error:0
+    multiDelete: async function (req, res) {
+        let result = {
+            error: 0
         };
         try {
             let data = req.body.data;
             data = JSON.parse(data);
-            result.data=await doBillsOrRationsDelete(data);
-        }catch (err){
+            result.data = await doBillsOrRationsDelete(data);
+        } catch (err) {
             logger.err(err);
-            result.error=1;
+            result.error = 1;
             result.message = err.message;
         }
         res.json(result);
     },
-    getSectionInfo:async function(req, res){
-        let result={
-            error:0
+    getSectionInfo: async function (req, res) {
+        let result = {
+            error: 0
         }
         try {
             let data = req.body.data;
             data = JSON.parse(data);
-            let sectionInfo= await bill_facade.getSectionInfo(data);
-            result.data=sectionInfo;
-        }catch (err){
+            let sectionInfo = await bill_facade.getSectionInfo(data);
+            result.data = sectionInfo;
+        } catch (err) {
             logger.err(err);
-            result.error=1;
+            result.error = 1;
             result.message = err.message;
         }
         res.json(result);
     },
-    reorganizeFBFX:async function(req,res){
-        let result={
-            error:0
+    reorganizeFBFX: async function (req, res) {
+        let result = {
+            error: 0
         }
         try {
             let data = req.body.data;
             data = JSON.parse(data);
-            let reorganizeResult= await bill_facade.reorganizeFBFX(data);
-            result.data=reorganizeResult;
-        }catch (err){
+            let reorganizeResult = await bill_facade.reorganizeFBFX(data);
+            result.data = reorganizeResult;
+        } catch (err) {
             logger.err(err);
-            result.error=1;
+            result.error = 1;
             result.message = err.message;
         }
         res.json(result);
     },
-    pasteBlock:async function(req,res){
-        let result={
-            error:0
+    pasteBlock: async function (req, res) {
+        let result = {
+            error: 0
         };
         try {
             let data = req.body.data;
             data = JSON.parse(data);
-            let pasteResult = await bill_facade.pasteBlock(data,req.session.sessionCompilation);
+            let pasteResult = await bill_facade.pasteBlock(data, req.session.sessionCompilation);
             result.data = pasteResult;
-        }catch (err){
+        } catch (err) {
             logger.err(err);
-            result.error=1;
+            result.error = 1;
             result.message = err.message;
         }
         res.json(result);
     },
     //下载导入清单示例
-    downloadExample: async function(request, response) {
+    downloadExample: async function (request, response) {
         try {
             const filePath = './public/static/清单示例.xlsx';
             const stats = fs.statSync(filePath);
@@ -213,15 +213,15 @@ module.exports = {
 
     },
     //导入清单
-    import: async function(req, res){
+    import: async function (req, res) {
         let responseData = {
             err: 0,
             msg: '',
             data: []
         };
         const form = new multiparty.Form();
-        form.parse(req, async function(err, fields, files) {
-            try{
+        form.parse(req, async function (err, fields, files) {
+            try {
                 const projectID = fields.projectID !== undefined && fields.projectID.length > 0 ?
                     parseInt(fields.projectID[0]) : 0;
                 if (projectID <= 0) {
@@ -230,21 +230,21 @@ module.exports = {
                 //导入清单数据
                 let compressData = fields.compressData !== undefined && fields.compressData.length > 0 ?
                     fields.compressData[0] : null;
-                if(compressData === null){
+                if (compressData === null) {
                     throw 'excel没有对应数据'
                 }
-                let importData = JSON.parse(LZString.decompressFromUTF16(compressData));
+                let { insertData, removeData } = JSON.parse(LZString.decompressFromUTF16(compressData));
                 //导入表
                 let importDateA = +new Date();
-                let updateFrontData = await importSheet(importData, req.session.sessionUser.id, projectID);
-                if(updateFrontData){
+                let updateFrontData = await importSheet(insertData, removeData, req.session.sessionUser.id, projectID);
+                if (updateFrontData) {
                     responseData.data.push(updateFrontData);
                 }
                 let importDateB = +new Date();
                 console.log(`导入时间: ${importDateB - importDateA}=========================================================================`);
                 res.json(responseData);
             }
-            catch (error){
+            catch (error) {
                 responseData.err = 1;
                 console.log(error);
                 responseData.msg = typeof error === 'object' ? '上传失败' : error;
@@ -264,77 +264,78 @@ module.exports = {
     }
 };
 
-async function importSheet(excelBills, userID, projectID,){
+async function importSheet(excelBills, removeData, userID, projectID,) {
     //导入位置的有固定行
     let flag = fixedFlag.ONE_SEVEN_BILLS;   //第100章至700章清单
-    let fixedBill = await billsData.model.findOne({projectID: projectID, 'flags.flag': flag, deleteInfo: null});
+    let fixedBill = await billsData.model.findOne({ projectID: projectID, 'flags.flag': flag, deleteInfo: null });
     //删除相关数据
-    let deleteDatas = await billsData.deepDeleteBill([fixedBill], userID, projectID);
+    // let deleteDatas = await billsData.deepDeleteBill([fixedBill], userID, projectID);
+    let deleteDatas = await billsData.newDeepDeleteBill(removeData.rBillIDs, removeData.rRationIDs);
     //新增清单数据
     await billsData.importBills(excelBills);
     //返回数据以更新前端
-    return {fixedBill: fixedBill, insert: {bill: excelBills, ration: []}, remove: {bill: deleteDatas.bill, ration: deleteDatas.ration}};
+    return { fixedBill: fixedBill, insert: { bill: excelBills, ration: [] }, remove: { bill: deleteDatas.bill, ration: deleteDatas.ration } };
 }
 
 
-function getImportFlag(position){
-    const fixedItem = {'fbfx': fixedFlag.SUB_ENGINERRING, 'jscsxm': fixedFlag.CONSTRUCTION_TECH, 'zzcsxm': fixedFlag.CONSTRUCTION_ORGANIZATION};
+function getImportFlag(position) {
+    const fixedItem = { 'fbfx': fixedFlag.SUB_ENGINERRING, 'jscsxm': fixedFlag.CONSTRUCTION_TECH, 'zzcsxm': fixedFlag.CONSTRUCTION_ORGANIZATION };
     return fixedItem[position] ? fixedItem[position] : null;
 }
-function isDef(data){
+function isDef(data) {
     return typeof data !== 'undefined' && data !== null && data !== '';
 }
 
 async function doBillsOrRationsDelete(data) {
     let billTask = [];
     let deleteBillIDs = [];
-    let rationTask=[];
-    let deleteRationIDs=[];
-    let qd_query=null;
-    let sub_query=null;
-    if(data['bills']){
-        billTask = generateUpdateTasks(data['bills'],data.projectID,data.user_id);
-        for(let b_key in data['bills']){
-            if(data['bills'][b_key]===true){
-                deleteBillIDs.push(b_key+'');
+    let rationTask = [];
+    let deleteRationIDs = [];
+    let qd_query = null;
+    let sub_query = null;
+    if (data['bills']) {
+        billTask = generateUpdateTasks(data['bills'], data.projectID, data.user_id);
+        for (let b_key in data['bills']) {
+            if (data['bills'][b_key] === true) {
+                deleteBillIDs.push(b_key + '');
             }
         }
-        if(deleteBillIDs.length>0){
-            qd_query={projectID: data.projectID, billID: {"$in": deleteBillIDs}};
+        if (deleteBillIDs.length > 0) {
+            qd_query = { projectID: data.projectID, billID: { "$in": deleteBillIDs } };
         }
     }
-    if(data['ration']){
-        rationTask = generateUpdateTasks(data['ration'],data.projectID,data.user_id);
-        for(let r_key in data['ration']){
-            if(data['ration'][r_key]===true){
-                deleteRationIDs.push(r_key+'');
+    if (data['ration']) {
+        rationTask = generateUpdateTasks(data['ration'], data.projectID, data.user_id);
+        for (let r_key in data['ration']) {
+            if (data['ration'][r_key] === true) {
+                deleteRationIDs.push(r_key + '');
             }
         }
-        if(deleteRationIDs.length>0){
-            if(qd_query==null){//说明没删除清单
-                qd_query={projectID: data.projectID, rationID: {"$in": deleteRationIDs}};
-            }else {
-                qd_query={
-                    "$or":[
-                        {projectID: data.projectID, billID: {"$in": deleteBillIDs}},
-                        {projectID: data.projectID, rationID: {"$in": deleteRationIDs}}
+        if (deleteRationIDs.length > 0) {
+            if (qd_query == null) {//说明没删除清单
+                qd_query = { projectID: data.projectID, rationID: { "$in": deleteRationIDs } };
+            } else {
+                qd_query = {
+                    "$or": [
+                        { projectID: data.projectID, billID: { "$in": deleteBillIDs } },
+                        { projectID: data.projectID, rationID: { "$in": deleteRationIDs } }
                     ]
                 }
             }
-            sub_query={projectID: data.projectID, rationID: {"$in": deleteRationIDs}};
+            sub_query = { projectID: data.projectID, rationID: { "$in": deleteRationIDs } };
         }
     }
     //先删除工程量明细
-    if(qd_query!=null){
-        await quantity_detail.deleteByQuery(qd_query) ;
+    if (qd_query != null) {
+        await quantity_detail.deleteByQuery(qd_query);
     }
-    if(sub_query!=null){
+    if (sub_query != null) {
         await raiton_facade.deleteSubListByQuery(sub_query);
     }
-    if(rationTask.length>0){
+    if (rationTask.length > 0) {
         await ration_model.model.bulkWrite(rationTask);//删除定额
     }
-    if(billTask.length>0){
+    if (billTask.length > 0) {
         await billsData.model.bulkWrite(billTask);//删除清单
     }
     return 'success';
@@ -342,41 +343,41 @@ async function doBillsOrRationsDelete(data) {
 
 
 
-function  generateSingleDeleteTasks(data) {
+function generateSingleDeleteTasks(data) {
     let updateData = data.updateData;
-    updateData[data.ID]=true;
-    let tasks = generateUpdateTasks(updateData,data.projectID,data.user_id);
+    updateData[data.ID] = true;
+    let tasks = generateUpdateTasks(updateData, data.projectID, data.user_id);
     return tasks;
 }
 
-function  generateUpdateTasks(data,projectID,user_id) {
-    let tasks=[];
+function generateUpdateTasks(data, projectID, user_id) {
+    let tasks = [];
     let updateData = data;
-    let deleteInfo={deleted: true, deleteDateTime: new Date(), deleteBy: user_id};
-    for(let key in updateData){
-        let task={
-            updateOne:{
-                filter:{
-                    ID:key,
-                    projectID:projectID
+    let deleteInfo = { deleted: true, deleteDateTime: new Date(), deleteBy: user_id };
+    for (let key in updateData) {
+        let task = {
+            updateOne: {
+                filter: {
+                    ID: key,
+                    projectID: projectID
                 }
             }
         };
-        if(updateData[key]===true){
+        if (updateData[key] === true) {
             //原先是假删除,现在改成真删除
             task = {
-                deleteOne:{
-                    filter:{
-                        ID:key,
-                        projectID:projectID
+                deleteOne: {
+                    filter: {
+                        ID: key,
+                        projectID: projectID
                     }
                 }
             }
             /* task.updateOne.update={
              deleteInfo:deleteInfo
              };*/
-        }else {
-            task.updateOne.update=updateData[key];
+        } else {
+            task.updateOne.update = updateData[key];
         }
         tasks.push(task);
     }

+ 93 - 69
modules/main/models/bills.js

@@ -19,35 +19,35 @@ const { fixedFlag } = require('../../../public/common_constants');
 let bills = mongoose.model("bills");
 let baseModel = require('./base_model');
 const uuidV1 = require('uuid/v1');
-const billType ={
-    DXFY:1,//大项费用
-    FB:2,//分部
-    FX:3,//分项
-    BILL:4,//清单
-    BX:5//补项
+const billType = {
+    DXFY: 1,//大项费用
+    FB: 2,//分部
+    FX: 3,//分项
+    BILL: 4,//清单
+    BX: 5//补项
 };
 
 class billsModel extends baseModel {
-    constructor () {
+    constructor() {
         super(bills);
     };
 
-    getData (projectID, callback, isReport = false) {
+    getData(projectID, callback, isReport = false) {
         //已经改成真删除了 {'$or': [{projectID: projectID, deleteInfo: null}, {projectID: projectID, 'deleteInfo.deleted': {$in: [null, false]}}]}
-        this.model.find({projectID: projectID}, '-_id', function(err, datas){
+        this.model.find({ projectID: projectID }, '-_id', function (err, datas) {
             if (!err) {
-                if (isReport){   // 调价中间件机制
+                if (isReport) {   // 调价中间件机制
                     for (let i = 0; i < datas.length; i++) {
-                       let fees = datas[i]._doc.fees;
-                       if (fees){
-                           for (let i = 0; i < fees.length; i++) {
-                               let doc = fees[i]._doc;
-                               if (doc){
-                                   if (doc.tenderTotalFee) doc.totalFee = doc.tenderTotalFee;
-                                   if (doc.tenderUnitFee) doc.unitFee = doc.tenderUnitFee;
-                               }
-                           }
-                       }
+                        let fees = datas[i]._doc.fees;
+                        if (fees) {
+                            for (let i = 0; i < fees.length; i++) {
+                                let doc = fees[i]._doc;
+                                if (doc) {
+                                    if (doc.tenderTotalFee) doc.totalFee = doc.tenderTotalFee;
+                                    if (doc.tenderUnitFee) doc.unitFee = doc.tenderUnitFee;
+                                }
+                            }
+                        }
                     }
                 };
                 callback(0, projectConsts.BILLS, datas);
@@ -57,7 +57,7 @@ class billsModel extends baseModel {
         });
     };
 
-    save (user_id, datas, callback) {
+    save(user_id, datas, callback) {
         let functions = [];
         let data;
 
@@ -67,17 +67,17 @@ class billsModel extends baseModel {
                     case commonConsts.UT_UPDATE:
                         async.parallel([      // CSL,2018.01.10 如果是总造价清单,要将4个汇总金额写到projects表中
                             function (asyncCB) {
-                                bills.update({projectID: doc.updateData.projectID, ID: doc.updateData.ID,deleteInfo: null}, doc.updateData, asyncCB);
+                                bills.update({ projectID: doc.updateData.projectID, ID: doc.updateData.ID, deleteInfo: null }, doc.updateData, asyncCB);
                             },
                             function (asyncCB) {
-                                if (doc.updateData.summaryFees){
+                                if (doc.updateData.summaryFees) {
                                     // console.log('%%%%%%%%%%%%%%%%%%%  ' + doc.updateData.projectID + ' | ' + JSON.stringify(doc.updateData.summaryFees));
-                                    projectModel.update({ID: doc.updateData.projectID}, {"summaryFees": doc.updateData.summaryFees}, asyncCB);
-                                }else {
+                                    projectModel.update({ ID: doc.updateData.projectID }, { "summaryFees": doc.updateData.summaryFees }, asyncCB);
+                                } else {
                                     asyncCB(null, {});
                                 };
                             }
-                        ], function(err,result){
+                        ], function (err, result) {
                             cb(err, {});
                         });
                         break;
@@ -85,59 +85,59 @@ class billsModel extends baseModel {
                         bills.create(doc.updateData, cb);
                         break;
                     case commonConsts.UT_DELETE:
-                        doc.updateData.deleteInfo = {deleted: true, deleteDateTime: new Date(), deleteBy: user_id};
-                       //bills.update({projectID: doc.updateData.projectID, ID: doc.updateData.ID}, doc.updateData, cb);
-                        bills.deleteOne({projectID: doc.updateData.projectID, ID: doc.updateData.ID},cb);
+                        doc.updateData.deleteInfo = { deleted: true, deleteDateTime: new Date(), deleteBy: user_id };
+                        //bills.update({projectID: doc.updateData.projectID, ID: doc.updateData.ID}, doc.updateData, cb);
+                        bills.deleteOne({ projectID: doc.updateData.projectID, ID: doc.updateData.ID }, cb);
                         break;
                 }
             }
         }
-        for (let i = 0; i < datas.length; i++){
+        for (let i = 0; i < datas.length; i++) {
             data = datas[i];
             functions.push(saveOne(data));
-            quantity_detial.quantityEditChecking(data,'bills',functions);
+            quantity_detial.quantityEditChecking(data, 'bills', functions);
         }
-        async.parallel(functions, function(err,result){
+        async.parallel(functions, function (err, result) {
             let returnData = {
-                moduleName:'bills',
-                data:result
+                moduleName: 'bills',
+                data: result
             };
             callback(err, returnData);
         });
     };
 
-    getItemTemplate (callback) {
+    getItemTemplate(callback) {
         let data = new bills;
         /* to do: 需要根据标准配置库填充fees和flags字段,是否需要更多的参数? */
         callback(0, '', data);
     };
 
-    allocIDs (IDStep, callback) {
-        counter.counterDAO.getIDAfterCount(counter.moduleName.bills, IDStep, function(err, highID){
+    allocIDs(IDStep, callback) {
+        counter.counterDAO.getIDAfterCount(counter.moduleName.bills, IDStep, function (err, highID) {
             let lowID = highID - IDStep + 1;
-            callback(0, '', {lowID: lowID, highID: highID});
+            callback(0, '', { lowID: lowID, highID: highID });
         });
     };
     //zhong 2017-9-1
     updateCharacterContent(findSet, updateObj, txtObj, callback) {
         let updateSet = {};
         updateSet[updateObj.field] = updateObj.updateArr;
-        if(txtObj && typeof txtObj !== 'undefined'){
+        if (txtObj && typeof txtObj !== 'undefined') {
             updateSet[txtObj.field] = txtObj.text;
         }
-       bills.update(findSet, updateSet, function (err) {
-           if(err){
-               callback(1, '更新失败');
-           }
-           else{
-               callback(0, '更新成功');
-           }
-       });
+        bills.update(findSet, updateSet, function (err) {
+            if (err) {
+                callback(1, '更新失败');
+            }
+            else {
+                callback(0, '更新成功');
+            }
+        });
     };
-    async updateBills(updateDatas){
+    async updateBills(updateDatas) {
         let bulk = [];
-        for(let updateData of updateDatas){
-            bulk.push({updateOne: {filter: updateData.findSet, update: {$set: updateData.updateData}}});
+        for (let updateData of updateDatas) {
+            bulk.push({ updateOne: { filter: updateData.findSet, update: { $set: updateData.updateData } } });
         }
         await bills.bulkWrite(bulk);
     };
@@ -160,21 +160,21 @@ class billsModel extends baseModel {
 
         return bills.update(findSet, update);
     };
-    async importBills(bills){
+    async importBills(bills) {
         let operations = [];
-        for(let bill of bills){
-            operations.push({insertOne: {document: bill}});
+        for (let bill of bills) {
+            operations.push({ insertOne: { document: bill } });
         }
         return await this.model.bulkWrite(operations);
     }
     //删除清单节点的所有子节点及其他附带数据
-    async deepDeleteBill(bills, userID, projectID){
+    async deepDeleteBill(bills, userID, projectID) {
         let bill_ids = [],
             ration_ids = [];
         let me = this;
-        function getIDs(datas){
+        function getIDs(datas) {
             let ids = [];
-            for(let data of datas){
+            for (let data of datas) {
                 ids.push(data.ID);
             }
             return ids;
@@ -191,13 +191,13 @@ class billsModel extends baseModel {
         await findBillsChildren(bills);
         /*/
         // 优化:一次性获取所有清单,再一个个剔除,剩下bills下所有的子清单,省的递归查询
-        const allBills = await me.model.find({projectID: projectID}, '-_id');
+        const allBills = await me.model.find({ projectID: projectID }, '-_id');
         function getAllSubIDs(topDatas) {
             bill_ids = bill_ids.concat(getIDs(topDatas));
             function _getSubs(datas, rstBills) {
                 let subIDs = []
                 for (let bill of allBills) {
-                    for(let data of datas){
+                    for (let data of datas) {
                         if (data.ID === bill.ParentID) {
                             subIDs.push(bill.ID);
                             rstBills.push(bill);
@@ -221,27 +221,51 @@ class billsModel extends baseModel {
         //剔除第一个节点
         bill_ids = bill_ids.slice(1);
         //获取删除清单下的所有定额
-        let rations = await rationModel.find({billsItemID: {$in: bill_ids}, deleteInfo: null}, 'ID');
+        let rations = await rationModel.find({ billsItemID: { $in: bill_ids }, deleteInfo: null }, 'ID');
         ration_ids = ration_ids.concat(getIDs(rations));
         //deep delete datas
-        let deleteInfo = {deleted: true, deleteDateTime: new Date(), deleteBy: userID};
-        if(bill_ids.length > 0){
+        let deleteInfo = { deleted: true, deleteDateTime: new Date(), deleteBy: userID };
+        if (bill_ids.length > 0) {
+            //删除bills
+            await me.model.deleteMany({ ID: { $in: bill_ids } });
+            //删除bill-quantity_detail
+            await quantityDelModel.deleteMany({ billID: { $in: bill_ids } });
+        }
+        if (ration_ids.length > 0) {
+            //删除rations
+            await rationModel.deleteMany({ ID: { $in: ration_ids } });
+            //删除ration-glj
+            await rationGljModel.deleteMany({ rationID: { $in: ration_ids } });
+            //删除ration-coe
+            await rationCoeModel.deleteMany({ rationID: { $in: ration_ids } });
+            //删除ration-quantity_detail
+            await quantityDelModel.deleteMany({ rationID: { $in: ration_ids } });
+        }
+        return { bill: bill_ids, ration: ration_ids };
+    }
+
+    async newDeepDeleteBill(bill_ids, ration_ids) {
+        let me = this;
+        //deep delete datas
+        if (bill_ids.length > 0) {
             //删除bills
-            await me.model.deleteMany({ID: {$in: bill_ids}});
+            await me.model.deleteMany({ ID: { $in: bill_ids } });
             //删除bill-quantity_detail
-            await quantityDelModel.deleteMany({billID: {$in: bill_ids}});
+            await quantityDelModel.deleteMany({ billID: { $in: bill_ids } });
         }
-        if(ration_ids.length > 0){
+        if (ration_ids.length > 0) {
             //删除rations
-            await rationModel.deleteMany({ID: {$in: ration_ids}});
+            await rationModel.deleteMany({ ID: { $in: ration_ids } });
             //删除ration-glj
-            await rationGljModel.deleteMany({rationID: {$in: ration_ids}});
+            await rationGljModel.deleteMany({ rationID: { $in: ration_ids } });
             //删除ration-coe
-            await rationCoeModel.deleteMany({rationID: {$in: ration_ids}});
+            await rationCoeModel.deleteMany({ rationID: { $in: ration_ids } });
+            //删除ration-installation
+            await rationInstModel.deleteMany({ rationID: { $in: ration_ids } });
             //删除ration-quantity_detail
-            await quantityDelModel.deleteMany({rationID: {$in: ration_ids}});
+            await quantityDelModel.deleteMany({ rationID: { $in: ration_ids } });
         }
-        return {bill: bill_ids, ration: ration_ids};
+        return { bill: bill_ids, ration: ration_ids };
     }
 }
 

+ 24 - 1
web/building_saas/main/js/views/importBills.js

@@ -401,5 +401,28 @@ const importBills = (function () {
     return rst;
   }
 
-  return { extactDatas };
+  // 获取需要删除的D
+  function getRemoveIDs(insertBills) {
+    const rBillIDs = [];
+    const rRationIDs = [];
+    const rst = { rBillIDs, rRationIDs };
+    if (!insertBills || !insertBills.length) {
+      return rst;
+    }
+    const flag = fixedFlag.ONE_SEVEN_BILLS;
+    const fixedNode = calcTools.getNodeByFlag(flag);
+    if (!fixedNode) {
+      return rst;
+    }
+    fixedNode.getPosterity().forEach(node => {
+      if (node.sourceType === 'bills') {
+        rBillIDs.push(node.data.ID);
+      } else {
+        rRationIDs.push(node.data.ID);
+      }
+    });
+    return rst;
+  }
+
+  return { extactDatas, getRemoveIDs };
 })();

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

@@ -1338,7 +1338,7 @@ var projectObj = {
       controller = this.mainController;
     let insertBillsName =
       project.projectInfo.property &&
-      [commonConstants.ValuationType.BOQ, commonConstants.ValuationType.BILL_BUDGET].includes(project.projectInfo.property.valuationType)
+        [commonConstants.ValuationType.BOQ, commonConstants.ValuationType.BILL_BUDGET].includes(project.projectInfo.property.valuationType)
         ? "插入清单"
         : "插入项目节"; //右键“插入清单”改文字为“插入项目节”,工程量清单中保持不变。
     $.contextMenu({
@@ -3248,7 +3248,9 @@ $("#importConfirm").click(function () {
     if (importBillsData.length === 0) {
       throw "excel无有效数据";
     }
-    let compressData = LZString.compressToUTF16(JSON.stringify(importBillsData));
+    debugger;
+    const removeData = importBills.getRemoveIDs(importBillsData);
+    let compressData = LZString.compressToUTF16(JSON.stringify({ insertData: importBillsData, removeData }));
     formData.append("compressData", compressData);
     let eDate = +new Date();
     console.log(`解析excel数据时间:${eDate - sDate}`);