module.exports={ getData:getData, insertData:insertData, deleteEquipment:deleteEquipment, updateEquipments:updateEquipments, getEquipmentTotalCost:getEquipmentTotalCost, getEquipmentSummary:getEquipmentSummary }; let mongoose = require('mongoose'); let equipmentPurchaseModel = mongoose.model("equipment_purchase"); let consts = require('../../main/models/project_consts'); let decimal_facade = require('../../main/facade/decimal_facade'); const scMathUtil = require('../../../public/scMathUtil').getUtil(); let _ = require('lodash') //返回 ID - total 映射如: {2566:60} async function getEquipmentTotalCost(projectIDs) { let decimal =2; let totalMap ={}; if(projectIDs.length > 0){ let decimalObject =await decimal_facade.getProjectDecimal(projectIDs[0]); if(decimalObject&&decimalObject.glj&&decimalObject.glj.unitPrice)decimal = decimalObject.glj.unitPrice; let equipments = await equipmentPurchaseModel.find({projectID:{$in: projectIDs}}).lean(); for(let e of equipments){ let total =e.total?scMathUtil.roundForObj(e.total,decimal):0; totalMap[e.projectID] = total; } } return totalMap; } function sortEquipments(equipments) { let IDMap = {}; let parentMap = {}; equipments = _.sortBy(equipments,'seq'); for(let d of equipments){ IDMap[d.ID] = d; parentMap[d.ParentID] ?parentMap[d.ParentID].push(d):parentMap[d.ParentID]=[d]; } let treeData = []; let roots = parentMap['-1']; getChildren(roots,treeData); return treeData; function getChildren(nodes,data){ if(nodes){ for(let n of nodes){ data.push(n); getChildren(parentMap[n.ID],data) } } } } async function getEquipmentSummary(projectIDs) { let data = []; if (projectIDs.length > 0) { let map = {}; let equipments = await equipmentPurchaseModel.find({projectID:{$in: projectIDs}}).lean(); for (let e of equipments) { e.equipments = sortEquipments(e.equipments); map[e.projectID] = e; } for (let projectID of projectIDs ) { /* if(map[projectID]) data.push(map[projectID]); /*/ // 以下是根据实际来调整 if(map[projectID]) { for (let item of map[projectID].equipments) { let dtlData = {projectID: -1, total: 0, equipSummaryType: 'budget_equipment'}; // 属性summaryType是作为一个判断依据给后来代码用 dtlData.projectID = projectID; dtlData.total = item.total; for (let key in item) { dtlData[key] = item[key]; } data.push(dtlData); } } //*/ } } return data; } function getPreUpdate (pre, doc){ const update = {}; for (const key in doc) { update[`${pre}.${key}`] = doc[key]; } return update; }; async function deleteEquipment(projectID,ID){ await equipmentPurchaseModel.update({projectID},{'$pull':{equipments:{ ID }}}); } async function insertData (projectID,data){ await equipmentPurchaseModel.update({projectID},{'$push':{equipments:{ $each: data }}}); return data } async function updateEquipments (projectID,updateData,total){ let tasks = []; if(total !== undefined || total !== null) tasks.push({updateOne :{filter:{projectID},update:{$set:{total:total}}}}); for(let data of updateData){ if(data.type === 'insert' ){ tasks.push({updateOne:{ filter:{projectID},update:{'$push':{equipments:{ $each: data.documents }}}}}) }else if(data.type === 'delete' ){ tasks.push({updateOne:{ filter:{projectID},update:{'$pull':{equipments:{ ID: data.ID }}}}}) } else { let task = {updateOne : { filter:{projectID,'equipments.ID':data.ID}, update:{$set:getPreUpdate('equipments.$',data.doc)} }} tasks.push(task) } } if(tasks.length > 0) await equipmentPurchaseModel.bulkWrite(tasks); return updateData } function getData(projectID, callback) { equipmentPurchaseModel.findOne({'projectID': projectID}).lean().exec((err, data) => { if (err) { callback(1, '', null); } else { callback(0, consts.projectConst.EQUIPMENT_PURCHASE, data); } }) }