| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682 | /** * Created by zhang on 2018/2/9. *///先导出后require可以解决循环引用问题module.exports = {    replaceRations: replaceRations,    addNewRation:addNewRation,    addMultiRation: addMultiRation,    deleteMultiRation:deleteMultiRation,    getSameSectionRations:getSameSectionRations,    getExtendData:getExtendData,    getDefaultProgramID:getDefaultProgramID,    deleteSubListByQuery:deleteSubListByQuery,    updateCoeAdjust:updateCoeAdjust};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 glj_calculate_facade = require("../../ration_glj/facade/glj_calculate_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');let installationFeeModel = mongoose.model("installation_fee");let rationInstallationModel = mongoose.model('ration_installation');let rationTemplateModel = mongoose.model('ration_template');const uuidV1 = require('uuid/v1');let std_glj_lib_gljList_model = mongoose.model('std_glj_lib_gljList');let complementary_glj_model =  mongoose.model('complementary_glj_lib');let rationItemModel = mongoose.model("std_ration_lib_ration_items");let complementaryRationModel = mongoose.model('complementary_ration_items');let coeMolde = mongoose.model('std_ration_lib_coe_list');let compleCoeModel = mongoose.model('complementary_ration_coe_list');let _= require('lodash');const projectDao = require('../../pm/models/project_model').project;let projectModel = mongoose.model('projects');const fs = require('fs');async function addNewRation(data,compilation) {    let query = data.itemQuery;    let stdRation = null;    let startTime = +new Date();    if(query){        let searchDao = new SearchDao();        stdRation = await searchDao.getRationItem(query.userID, compilation._id, [query.rationRepId],query.code, query.ID);        //data.newData.code = query.code;    }    let stdRationTime = +new Date();    console.log("取std定额时间-------------------------------"+(stdRationTime - startTime));    if(data.brUpdate.length>0){        await updateSerialNo(data.brUpdate);    }    let newRation =await insertNewRation(data.newData,data.defaultLibID,stdRation,data.calQuantity);    let addRationGLJTime = +new Date();    console.log("插入新定额时间-------------------------------"+(addRationGLJTime - stdRationTime));    if(stdRation){        return await addRationSubList(stdRation,newRation,data.needInstall,compilation);    }else {        return {ration:newRation};    }}async function addMultiRation(datas,compilation) {    let rst = [];    for(let data of datas){        let r = await addNewRation(data,compilation);        rst.push(r);    }    return rst;}async function deleteMultiRation(rations) {//这里是只有删除的情况,删除定额的同时删除定额下挂的其它子项目    if(rations.length > 0){//删除定额下的        let rationIDS = _.map(rations,'ID');        await deleteSubListByQuery({projectID:rations[0].projectID,rationID:{"$in": rationIDS}});        await ration_model.model.deleteMany({ID:{"$in": rationIDS}});    }}async function getSameSectionRations(data,userId,compilationId){    //let userId    //要先根据定额获取所属章节的ID    let from = data.from;    //定额类型,是标准的还是用户定义的    let code = data.code;    let libID = data.libID;    let sectionId,rations=[];    if(from == 'std'){        let ration = await rationItemModel.findOne({rationRepId:libID,code:code},['sectionId']);        sectionId = ration? ration.sectionId:null;    }else {        let ration = await complementaryRationModel.findOne({userId:userId,compilationId: compilationId,code:code},['sectionId']);        sectionId = ration?ration.sectionId:null;    }    if(sectionId){        if (from == 'std') {            rations = await rationItemModel.find({sectionId: sectionId});        } else {            rations = await complementaryRationModel.find({userId: userId, sectionId: sectionId});        }        rations = _.sortBy(rations,'code');    }    return rations}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,defaultLibID,std,calQuantity) {//插入新的定额    let startTime = +new Date();    if(std){        newData.code = std.code;        newData.name = std.name;        newData.caption = std.caption;        newData.unit = std.unit;        newData.libID = std.rationRepId;        newData.stdID = std.ID;        newData.content = std.jobContent;        newData.annotation = std.annotation;        if (std.chapter) {            newData.comments = std.chapter.explanation;            newData.ruleText = std.chapter.ruleText;        }        newData.prefix = '';        newData.from = std.type === 'complementary' ? 'cpt' : 'std';        if(defaultLibID !== std.rationRepId){//定额是默认定额库中的时,只显示编号;            newData.prefix = '借';//定额不是默认定额库中的、且不是补充定额库中的时, 在定额编号前显示“借”。            if(newData.from === 'cpt') newData.prefix = '补';//定额是补充定额库中的时,在定额编号前显示“补”;        }        if(std.feeType == undefined || std.feeType == null || std.feeType ==''){//定额取费专业为空的情况下,取项目属性中的定额取费专业ID            newData.programID = await getProgramForProject(newData.projectID);        }else {            newData.programID = std.feeType;        }        newData.manageFeeRate = std.manageFeeRate;        newData.rationAssList =  createRationAss(std);        // calculate ration Quantity    }    if(calQuantity){        await CalculateQuantity(newData,newData.billsItemID,newData.projectID);    }    let addRationGLJTime = +new Date();    console.log("计算消耗量时间-------------------------------"+(addRationGLJTime - startTime));    let newRation = await ration_model.model.create(newData);    return newRation;    /*ration_model.model.create(newData);    return newData;*/}async function replaceRations(userID,data,compilation) {    let searchDao = new SearchDao();    let recodes = [];    for(let recode of data.nodeInfo){        let stdRation = await searchDao.getRationItem(userID,compilation._id,data.libIDs,recode.newCode, null);        let newRecode = await replaceRation(recode,stdRation,data.defaultLibID,data.projectID,data.calQuantity,compilation,data.cleanzmhs);        if(newRecode){            recodes.push(newRecode);        }else {            break;        }    }    return recodes;}async function getDefaultProgramID(data) {    let searchDao = new SearchDao();    let programID;    let std = await searchDao.getRationItem(data.userID,data.compilationId,[data.libID],data.code, null);    if(std == null||std ==undefined || std.feeType == undefined || std.feeType == null || std.feeType ==''){//定额取费专业为空的情况下,取项目属性中的定额取费专业ID        programID = await getProgramForProject(data.projectID);    }else {        programID = std.feeType;    }    return programID;}async function replaceRation(nodeInfo,stdRation,defaultLibID,projectID,calQuantity,compilation,cleanzmhs) {    if(nodeInfo.newCode == null||nodeInfo.newCode ==""){//说明是删除编号,则要变成一条空定额        await deleRationSubRecode(projectID,nodeInfo.ID);//删除定额下挂的各种数据,如定额工料机等        return await setEmptyRation(projectID,nodeInfo.ID);    }else if(stdRation){        await deleRationSubRecode(projectID,nodeInfo.ID,cleanzmhs);//删除定额下挂的各种数据,如定额工料机等        let newRation = await updateRation(stdRation,defaultLibID,nodeInfo.ID,nodeInfo.billsItemID,projectID,calQuantity,cleanzmhs);//生成并插入新的定额        return await addRationSubList(stdRation,newRation,nodeInfo.needInstall,compilation,cleanzmhs);    }else {        return null;    }}async function addRationSubList(stdRation,newRation,needInstall,compilation,cleanzmhs=false) {    let startTime = +new Date();    let [ration_gljs,projectGLJList] = await addRationGLJ(stdRation,newRation,compilation);    let addRationGLJTime = +new Date();    console.log("添加定额工料机时间-----"+(addRationGLJTime - startTime));    let ration_coes = await addRationCoe(stdRation,newRation,compilation);    let addRationCoeTime = +new Date();    console.log("添加定额coe时间-----"+(addRationCoeTime - addRationGLJTime));    let ration_installations = [];    let ration_template = [];    if(cleanzmhs == false){//清除子目换算即cleanzmh==true时 模板子目、安装增加费不用恢复成标准的        if(needInstall && stdRation.type == 'std'){//只有标准的定额才有安装增加费,补充的定额没有安装增加费            ration_installations =  await addRationInstallFee(stdRation,newRation);        }        let addRationInstallFeeTime = +new Date();        console.log("添加定额install时间-----"+(addRationInstallFeeTime - addRationCoeTime));        //添加定额模板子目        ration_template = await addRationTemplate(stdRation,newRation);    }else if(newRation.areaIncreaseFee == true){//清空子目换算时,如果有面积增加费,子目调整状态要生成        let t = await glj_calculate_facade.calculateQuantity({rationID:newRation.ID},true);        newRation.adjustState = t.adjustState;    }    return {ration:newRation,ration_gljs:ration_gljs,ration_coes:ration_coes,ration_installations:ration_installations,ration_templates:ration_template?[ration_template]:[],projectGLJList:projectGLJList};}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});        if(!installFee) return;//如果没有找到项目对应的安装增加费,则不添加        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 addRationTemplate(std,newRation) {    let templateList = [];    if(std.hasOwnProperty('rationTemplateList') && std.rationTemplateList.length > 0){        for(let tem of std.rationTemplateList){            let re_ration = await rationItemModel.findOne({rationRepId:std.rationRepId,ID:tem.rationID});            if(re_ration){                let template = {                    billID:"",                    fxID:"",                    quantity:"0",                    coe:"0"                };                template.code = re_ration.code;                template.name = re_ration.name;                template.type = tem.type;                template.unit = re_ration.unit;                template.billsLocation = tem.billsLocation;                template.defaultLocation = tem.billsLocation;                templateList.push(template)            }        }    }    if(templateList.length > 0){        let ration_template = {};        ration_template.ID = uuidV1();        ration_template.projectID = newRation.projectID;        ration_template.rationID = newRation.ID;        ration_template.createLocation = 1; //默认模板子目分别放在措施项目下        ration_template.templateList = templateList;        await  rationTemplateModel.create(ration_template);        return ration_template;    }    return null;}async function addRationCoe(std,newRation,compilation) {    let ration_coe_list = [];    let seq = 0;    if(std.hasOwnProperty('rationCoeList')&&std.rationCoeList.length>0){//添加标准库的工料机        for(let sub of std.rationCoeList){            let libCoe;            if (std.type === 'std') {                libCoe = await coeMolde.findOne({'libID':std.rationRepId,'ID':sub.ID,"$or": [{"isDeleted": null}, {"isDeleted": false}]});//std.rationRepId;            } else {                libCoe = await compleCoeModel.findOne({ID: sub.ID, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}]});            }            if(libCoe){                let newCoe = {};                newCoe.ID = uuidV1();                newCoe.coeID = sub.ID;                newCoe.seq = seq;                newCoe.name = libCoe.name;                newCoe.content = libCoe.content;                newCoe.original_code = libCoe.original_code;                newCoe.option_codes = libCoe.option_codes;                newCoe.option_list = libCoe.option_list;                newCoe.isAdjust=0;                newCoe.coes = libCoe.coes;                newCoe.rationID = newRation.ID;                newCoe.projectID = newRation.projectID;                seq++;                ration_coe_list.push(newCoe);            }        }    }    let lastCoe = await getCustomerCoe(newRation.projectID,newRation.ID,seq,compilation);    ration_coe_list.push(lastCoe);    await ration_coe.insertMany(ration_coe_list);    return ration_coe_list;}function getCustomerCoeData() {    var coeList = [         {amount:1, operator:'*', gljCode:null, coeType:'定额'},        { amount:1, operator:'*', gljCode:null, coeType:'人工'},        { amount:1, operator:'*', gljCode:null, coeType:'材料'},        { amount:1, operator:'*', gljCode:null, coeType:'机械'},        { amount:1, operator:'*', gljCode:null, coeType:'主材'},        { amount:1, operator:'*', gljCode:null, coeType:'设备'}    ];    return coeList;};async function getCustomerCoe(projectID,rationID,seq,compilation){//取自定义乘系数,根据编办不同,内容可能不同    //生成默认的自定义乘系数    let lastCoe ={        coeID:-1,        name : '自定义系数',        content:'人工×1,材料×1,机械×1,主材×1,设备×1',        isAdjust:1,        seq:seq,        rationID : rationID,        projectID : projectID    };    lastCoe.ID = uuidV1();    lastCoe.coes = getCustomerCoeData();    try {    //查看编办中有没有重写路径     if(compilation.overWriteUrl && compilation.overWriteUrl!=""){         let overWrite = require("../../.."+compilation.overWriteUrl);         if(overWrite.getCusCoeContent) lastCoe.content = overWrite.getCusCoeContent();         if(overWrite.getCustomerCoeData) lastCoe.coes = overWrite.getCustomerCoeData();     }     return lastCoe   }catch (err){       console.log("读取自定义系数重写文件失败");       console.log(err.message);       return lastCoe   }}//对于多单价,多组成物消耗量的编办,通过这个方法获取单价、组成物消耗量的字段,function getExtendData(property,compilation) {    return projectDao.getExtendData(property,compilation);}async function addRationGLJ(std,newRation,compilation) {    let newRationGLJList = [];    let rationGLJShowList = [];    let projectGLJList = [];    let unitPriceFileId = 0;    let property = await projectDao.getProjectProperty(newRation.projectID);    if(property){        unitPriceFileId = property.unitPriceFile !== undefined ? property.unitPriceFile.id : 0;    }    let ext = getExtendData(property,compilation);    let first = +new Date();    if(std.hasOwnProperty('rationGljList') && std.rationGljList.length > 0){        let stdGLJID =[];//标准工料机ID数组        let cptGLJID=[];//补充工料机ID数组            //let stdGLJID = _.map(std.rationGljList,'gljId');        for(let tem_g  of std.rationGljList){             if(tem_g.type == 'complementary'){                cptGLJID.push(tem_g.gljId);             }else {                stdGLJID.push(tem_g.gljId);             }        }       let stdGLJList = stdGLJID.length > 0 ? await std_glj_lib_gljList_model.find({'ID':{'$in':stdGLJID}}):[];//速度优化-------先一次性取出所有的工料机列表       let stdGLJMap = _.indexBy(stdGLJList, 'ID');       let cptGLJList =  cptGLJID.length > 0 ? await complementary_glj_model.find({'userId':std.userId,'ID':{'$in':cptGLJID}}):[];       let cptGLJMap = _.indexBy(cptGLJList, 'ID');        let stdGLJMapTime = +new Date();        console.log("找到工料机映射表时间-------------------------------"+(stdGLJMapTime - first));        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 = null;            if(sub.type == 'complementary'){//有可能来自标准工料机库或补充工料机库                std_glj = cptGLJMap[sub.gljId];                newGLJ.from = 'cpt';            }else {                std_glj = stdGLJMap[sub.gljId];                newGLJ.from = 'std';                //多单价情况处理                if(ext && ext.priceField && std_glj && std_glj.priceProperty){                    std_glj.basePrice =  std_glj.priceProperty[ext.priceField];                }            }            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.model = std_glj.model;                newGLJ.basePrice = std_glj.basePrice;                newGLJ.marketPrice = std_glj.basePrice;                newGLJ.shortName = std_glj.shortName;                newGLJ.type = std_glj.gljType;                newGLJ.repositoryId = std_glj.repositoryId;                newGLJ.adjCoe = std_glj.adjCoe;                newGLJ.materialType = std_glj.materialType;                newGLJ.materialCoe = std_glj.materialCoe;                newGLJ.materialIndexType = std_glj.materialIndexType;                newGLJ.materialIndexUnit = std_glj.materialIndexUnit;                newGLJ.materialIndexCoe = std_glj.materialIndexCoe;                newGLJ.createType = 'normal';                let [info,projectGLJ] =  await ration_glj_facade.getInfoFromProjectGLJ(newGLJ,unitPriceFileId,ext);                newGLJ = ration_glj_facade.createNewRecord(info);                newRationGLJList.push(newGLJ);                rationGLJShowList.push(info);                projectGLJList.push(projectGLJ)            }            //let InfoFromProjectGLJ = +new Date();            //console.log("找到项目工料机时间-------------------------------"+(InfoFromProjectGLJ - std_gljTime));        }    }    let before = +new Date();    console.log("总查询时间为-------------------------------"+(before-first));    if(newRationGLJList.length>0){        await ration_glj.insertMany(newRationGLJList);    }    let after = +new Date();    console.log("实际插入时间为-------------------------------"+(after-before));    console.log("总操作时间为-------------------------------"+(after-first));    return [rationGLJShowList,projectGLJList]}async function deleRationSubRecode(projectID,rationID,cleanzmhs=false) {//删除挂在定额下的数据,如工程量明细,定额工料机等    let delete_query={projectID: projectID, rationID: rationID};    //删除工程量明细    await deleteSubListByQuery(delete_query,cleanzmhs) ;}async function deleteSubListByQuery(delete_query,cleanzmhs=false) {    if(cleanzmhs == false){//清空子目换算即cleanzmh==true时不需要清空工程量明细、模板关联子目、安装增加费        await quantity_detail.deleteByQuery(delete_query) ;//删除工程量明细        await rationInstallationModel.deleteMany(delete_query);//删除安装增加费        await rationTemplateModel.deleteMany(delete_query);//删除模板关联子目    }    //to do稳定土也要删除    await ration_coe.deleteMany(delete_query);//删除附注条件    await ration_glj.deleteMany(delete_query);//删除定额工料机}async function updateCoeAdjust(data,compilation) {    let replace = [],projectGLJList=[];    await ration_coe.update({ID:data.ID},data.doc);    //添加单个工料机的情况    if (data.add.length > 0){      let [tg,pl] =  await ration_glj_facade.insertAddTypeGLJ(data.add,compilation);      if(pl.length > 0) projectGLJList = projectGLJList.concat(pl);    }    if(data.delete.length > 0) await ration_glj_facade.deleteGLJ(data.delete);    //替换工料机的情况    if (data.replace.length > 0){        for(let r of data.replace){            let [rg,pg] = await  ration_glj_facade.replaceGLJByData(r,compilation);            replace.push(rg) ;            projectGLJList.push(pg);        }    }    let cal_result = await glj_calculate_facade.calculateQuantity({projectID:data.projectID,rationID:data.rationID},null,true);    let coe = {        query:{ID:data.ID,projectID:data.projectID},        doc:data.doc    };    let ration_glj ={        quantityRefresh:true,        glj_result:cal_result.glj_result    };    let ration = {        ID:cal_result.rationID,        adjustState:cal_result.adjustState,        name:cal_result.rationName    };    return {coe:coe,ration_glj:ration_glj,ration:ration,add:data.add,delete:data.delete,replace:replace,projectGLJList:projectGLJList}}async function  updateRation(std,defaultLibID,rationID,billsItemID,projectID,calQuantity,cleanzmh=false) {    // insertNewRation    let ration ={};    ration.code = std.code;    ration.name = std.name;    ration.caption = std.caption;    ration.unit = std.unit;    if (std.type === 'std') {        ration.libID = std.rationRepId;        ration.stdID = std.ID;    }    ration.content = std.jobContent;    ration.manageFeeRate = std.manageFeeRate;    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';    //定额前缀 none:0, complementary:1, borrow: 2    ration.prefix = '';    if(parseInt(defaultLibID) !== std.rationRepId){//定额是默认定额库中的时,只显示编号;        ration.prefix = '借';//定额不是默认定额库中的、且不是补充定额库中的时, 在定额编号前显示“借”。        if(ration.from === 'cpt') ration.prefix = '补';//定额是补充定额库中的时,在定额编号前显示“补”;    }    ration.rationAssList = createRationAss(std);//生成辅助定额    if(cleanzmh==false){//如果是清空子目换算,即cleanzmh==true 保留定额工程量、工程量表达式、含量(分解系数)、取费专业(取费类别)        if(std.feeType == undefined || std.feeType == null || std.feeType ==''){//定额取费专业为空的情况下,取项目属性中的定额取费专业ID            ration.programID = await getProgramForProject(projectID);        }else {            ration.programID = std.feeType;        }        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;}async function setEmptyRation(projectID,rationID){    let ration ={};    ration.code = "";    ration.name = "";    ration.caption = "";    ration.unit = "";    ration.libID = null;    ration.content = "";    ration.adjustState = '';    ration.isFromDetail=0;    ration.isSubcontract=false;    ration.fees=[];    ration.comments = "";    ration.ruleText = "";    ration.quantity="";    ration.contain="";    ration.quantityEXP="";    ration.from = 'std';    //定额前缀 none:0, complementary:1, borrow: 2    ration.prefix = '';    ration.rationAssList = [];    ration.marketUnitFee ="";    ration.marketTotalFee ="";    ration.maskName = "";    ration.targetTotalFee ='';    ration.targetUnitFee = "";    ration.deleteInfo = null;    ration.quantityCoe = {};    ration.rationQuantityCoe="";    ration.tenderQuantity = "";    ration.programID = null;    let newRation = await ration_model.model.findOneAndUpdate({ID:rationID,projectID:projectID},{"$set":ration},{new: true});//;    return {ration:newRation,ration_gljs:[],ration_coes:[],ration_installs:[]};}function createRationAss(std) {    let  rationAssList = [];//生成辅助定额    if(std.hasOwnProperty('rationAssList')&&std.rationAssList.length>0){        let assGroup =  _.groupBy(std.rationAssList,'name');        for(let key in assGroup){            let assList = assGroup[key];            let ass = assList[0];            ass._doc.actualValue = ass.stdValue;            ass._doc.isAdjust = 0;            if(_.isString(ass._doc.assistCode)) ass._doc.assistCode = ass._doc.assistCode.replace("\n","");            if(_.isString(ass._doc.thirdRationCode)) ass._doc.thirdRationCode = ass._doc.thirdRationCode.replace("\n","");            if(assList.length > 1){                ass._doc.groupList = JSON.parse(JSON.stringify(assList))  ;                ass._doc.maxValue = assList[assList.length-1]._doc.maxValue;            }            rationAssList.push(ass);        }    }    return rationAssList;}async function CalculateQuantity (ration,billsItemID,projectID) {    // calculate ration Quantity    let project = await projectModel.findOne({ID:projectID});    let decimalObject =await decimal_facade.getProjectDecimal(projectID,project);    let quantity_decimal = (decimalObject&&decimalObject.ration&&decimalObject.ration.quantity)?decimalObject.ration.quantity:3;    let pbill = await bill_model.model.findOne({projectID:projectID,ID:billsItemID});    let  t_unit = ration.unit?ration.unit.replace(/^\d+/,""):"";    if(t_unit!=pbill.unit){//如果定额工程量的单位去除前面的数字后不等于清单单位,定额工程量保持不变        return ;    }    let billsQuantity = pbill.quantity ? pbill.quantity : 0;    let bill_decimal = await decimal_facade.getBillsQuantityDecimal(projectID,pbill.unit,project);    billsQuantity=scMathUtil.roundForObj(billsQuantity,bill_decimal);    ration.quantityEXP="QDL";    ration.quantity = scMathUtil.roundForObj(billsQuantity / FilterNumberFromUnit(ration.unit),quantity_decimal);//不管是否打勾都做转换    ration.contain =  scMathUtil.roundForObj(ration.quantity/billsQuantity,6);};async function getProgramForProject(projectID){    let project = await projectModel.findOne({ID:projectID});    return project.property.engineering;}function FilterNumberFromUnit (unit) {    let reg = new RegExp('^[0-9]+');    if (reg.test(unit)) {        return parseInt(unit.match(reg)[0]);    } else {        return 1;    }};
 |