/** * Created by zhang on 2018/2/9. */ let mongoose = require('mongoose'); import SearchDao from '../../complementary_ration_lib/models/searchModel'; const scMathUtil = require('../../../public/scMathUtil').getUtil(); let ration_glj_facade = require("../../ration_glj/facade/ration_glj_facade") let quantity_detail = require("../facade/quantity_detail_facade"); let ration_glj = mongoose.model('ration_glj'); let ration_coe = mongoose.model('ration_coe'); let ration_model = require('../models/ration'); let bill_model = require('../models/bills'); let decimal_facade = require('./decimal_facade'); import installationFeeModel from "../models/installation_fee"; import rationInstallationModel from "../models/ration_installation"; const uuidV1 = require('uuid/v1'); let std_glj_lib_gljList_model = mongoose.model('std_glj_lib_gljList'); let coeMolde = mongoose.model('std_ration_lib_coe_list'); let _= require('lodash'); module.exports = { replaceRations: replaceRations, addNewRation:addNewRation }; async function addNewRation(data) { let query = data.itemQuery; let stdRation = null; if(query){ let searchDao = new SearchDao(); stdRation = await searchDao.getRationItem(query.userID,query.rationRepId,query.code); data.newData.code = query.code; } if(data.brUpdate.length>0){ await updateSerialNo(data.brUpdate); } let newRation =await insertNewRation(data.newData,stdRation,data.calQuantity); if(stdRation){ return await addRationSubList(stdRation,newRation); }else { return {ration:newRation}; } } async function updateSerialNo(serialNoUpdate){ let tasks=[]; for(let data of serialNoUpdate){ let task={ updateOne:{ filter:{ ID:data.ID, projectID:data.projectID }, update :{ serialNo:data.serialNo } } }; tasks.push(task); } await ration_model.model.bulkWrite(tasks); } async function insertNewRation(newData,std,calQuantity) {//插入新的定额 if(std){ newData.name = std.name; newData.caption = std.caption; newData.unit = std.unit; newData.libID = std.rationRepId; newData.content = std.jobContent; if (std.chapter) { newData.comments = std.chapter.explanation; newData.ruleText = std.chapter.ruleText; } newData.from = std.type === 'complementary' ? 'cpt' : 'std'; newData.programID = std.feeType; newData.rationAssList = createRationAss(std); // calculate ration Quantity } if(calQuantity){ await CalculateQuantity(newData,newData.billsItemID,newData.projectID); } let newRation = await ration_model.model.create(newData); return newRation; } async function replaceRations(userID,data) { let searchDao = new SearchDao(); let recodes = []; for(let recode of data.nodeInfo){ let stdRation = await searchDao.getRationItem(userID,data.libID,recode.newCode); let newRecode = await replaceRation(recode,stdRation,data.projectID,data.calQuantity); if(newRecode){ recodes.push(newRecode); }else { break; } } return recodes; } async function replaceRation(nodeInfo,stdRation,projectID,calQuantity) { if(stdRation){ await deleRationSubRecode(projectID,nodeInfo.ID); let newRation = await updateRation(stdRation,nodeInfo.ID,nodeInfo.billsItemID,projectID,calQuantity);//生成并插入新的定额 return await addRationSubList(stdRation,newRation); }else { return null; } } async function addRationSubList(stdRation,newRation) { let ration_gljs = await addRationGLJ(stdRation,newRation); let ration_coes = await addRationCoe(stdRation,newRation); let ration_installs = await addRationInstallFee(stdRation,newRation); return {ration:newRation,ration_gljs:ration_gljs,ration_coes:ration_coes,ration_installs:ration_installs}; } async function addRationInstallFee(std,newRation) { let install_fee_list = []; if(std.hasOwnProperty('rationInstList') && std.rationInstList.length > 0){ let installFee = await installationFeeModel.findOne({'projectID': newRation.projectID}); for(let ri of std.rationInstList){ let feeItem = _.find(installFee.installFeeItem,{'ID':ri.feeItemId}); let section = _.find(installFee.installSection,{'ID':ri.sectionId}); if(feeItem&§ion){ let tem_r_i = { libID:installFee.libID, projectID:newRation.projectID, rationID:newRation.ID, feeItemId:feeItem.ID, sectionId:section.ID, itemName:feeItem.feeItem, feeType:feeItem.feeType, sectionName:section.name, unifiedSetting:1, ruleId:'' }; if(feeItem.isCal==1&§ion.feeRuleId&§ion.feeRuleId!=''){//勾选记取时并且有规则ID时才读取 let feeRule = _.find(installFee.feeRule,{'ID':section.feeRuleId}); if(feeRule){ tem_r_i.ruleId = feeRule.ID; } } tem_r_i.ID = uuidV1(); install_fee_list.push(tem_r_i); } } if(install_fee_list.length>0){ await rationInstallationModel.insertMany(install_fee_list); } } return install_fee_list; } async function addRationCoe(std,newRation) { let ration_coe_list = []; let seq = 0; if(std.hasOwnProperty('rationCoeList')&&std.rationCoeList.length>0){//添加标准库的工料机 for(let sub of std.rationCoeList){ let libCoe = await coeMolde.findOne({'libID':std.rationRepId,'ID':sub.ID,"$or": [{"isDeleted": null}, {"isDeleted": false}]});//std.rationRepId; if(libCoe){ let newCoe = {}; newCoe.ID = uuidV1(); newCoe.coeID = sub.ID; newCoe.seq = seq; newCoe.name = libCoe.name; newCoe.content = libCoe.content; newCoe.isAdjust=0; newCoe.coes = libCoe.coes; newCoe.rationID = newRation.ID; newCoe.projectID = newRation.projectID; seq++; ration_coe_list.push(newCoe); } } } let lastCoe ={ coeID:-1, name : '自定义系数', content:'人工×1,材料×1,机械×1,主材×1,设备×1', isAdjust:0, seq:seq, rationID : newRation.ID, projectID : newRation.projectID }; lastCoe.ID = uuidV1(); lastCoe.coes = getCustomerCoeData(); ration_coe_list.push(lastCoe); await ration_coe.insertMany(ration_coe_list); return ration_coe_list; } function getCustomerCoeData() { var coeList = []; coeList.push({ amount:1, operator:'*', gljCode:null, coeType:'定额'}); coeList.push({ amount:1, operator:'*', gljCode:null, coeType:'人工'}); coeList.push({ amount:1, operator:'*', gljCode:null, coeType:'材料'}); coeList.push({ amount:1, operator:'*', gljCode:null, coeType:'机械'}); coeList.push({ amount:1, operator:'*', gljCode:null, coeType:'主材'}); coeList.push({ amount:1, operator:'*', gljCode:null, coeType:'设备'}); return coeList; }; async function addRationGLJ(std,newRation) { let newRationGLJList = []; let rationGLJShowList = []; if(std.hasOwnProperty('rationGljList') && std.rationGljList.length > 0){ for(let sub of std.rationGljList){ let newGLJ = {}; newGLJ.ID = uuidV1(); newGLJ.projectID = newRation.projectID; newGLJ.GLJID = sub.gljId; newGLJ.rationID = newRation.ID; newGLJ.billsItemID = newRation.billsItemID; newGLJ.rationItemQuantity = sub.consumeAmt; newGLJ.quantity = sub.consumeAmt; newGLJ.glj_repository_id = std.rationRepId; let std_glj = await std_glj_lib_gljList_model.findOne({'ID':sub.gljId}); if(std_glj){ newGLJ.name = std_glj.name; newGLJ.code = std_glj.code; newGLJ.original_code = std_glj.code; newGLJ.unit = std_glj.unit; newGLJ.specs = std_glj.specs; newGLJ.basePrice = std_glj.basePrice; newGLJ.shortName = std_glj.shortName; newGLJ.type = std_glj.gljType; newGLJ.repositoryId = std_glj.repositoryId; newGLJ.adjCoe = std_glj.adjCoe; let info = await ration_glj_facade.getInfoFromProjectGLJ(newGLJ); newGLJ = ration_glj_facade.createNewRecord(info); newRationGLJList.push(newGLJ); rationGLJShowList.push(info); } } } if(newRationGLJList.length>0){ await ration_glj.insertMany(newRationGLJList); } return rationGLJShowList; } async function deleRationSubRecode(projectID,rationID) {//删除挂在定额下的数据,如工程量明细,定额工料机等 let delete_query={projectID: projectID, rationID: rationID}; //删除工程量明细 await quantity_detail.deleteByQuery(delete_query) ; await ration_coe.deleteMany(delete_query);//删除附注条件 await ration_glj.deleteMany(delete_query);//删除定额工料机 await rationInstallationModel.deleteMany(delete_query);//删除安装增加费 } async function updateRation(std,rationID,billsItemID,projectID,calQuantity) { // insertNewRation let ration ={}; ration.code = std.code; ration.name = std.name; ration.caption = std.caption; ration.unit = std.unit; ration.libID = std.rationRepId; ration.content = std.jobContent; ration.adjustState = ''; ration.isFromDetail=0; ration.isSubcontract=false; ration.fees=[]; if (std.chapter) { ration.comments = std.chapter.explanation; ration.ruleText = std.chapter.ruleText; } ration.from = std.type === 'complementary' ? 'cpt' : 'std'; ration.programID = std.feeType; ration.rationAssList = createRationAss(std);//生成辅助定额 if(calQuantity){ await CalculateQuantity(ration,billsItemID,projectID); } let unsetObject = { "marketUnitFee":1, 'marketTotalFee':1, "maskName":1 } let newRation = await ration_model.model.findOneAndUpdate({ID:rationID,projectID:projectID},{"$set":ration,"$unset":unsetObject},{new: true});//; return newRation; } function createRationAss(std) { let rationAssList = [];//生成辅助定额 if(std.hasOwnProperty('rationAssList')&&std.rationAssList.length>0){ for(let i=0;i