|  | @@ -17,6 +17,7 @@ module.exports = {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  let mongoose = require('mongoose');
 | 
	
		
			
				|  |  |  import SearchDao from '../../complementary_ration_lib/models/searchModel';
 | 
	
		
			
				|  |  | +import GLJListModel from "../../glj/models/glj_list_model";
 | 
	
		
			
				|  |  |  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");
 | 
	
	
		
			
				|  | @@ -37,6 +38,13 @@ 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 projectGLJModel = mongoose.model("glj_list");
 | 
	
		
			
				|  |  | +let mixRatioModel = mongoose.model("mix_ratio");
 | 
	
		
			
				|  |  | +let complementaryGljLibModel = mongoose.model('complementary_glj_lib');
 | 
	
		
			
				|  |  | +let counterModel =  mongoose.model('counter');
 | 
	
		
			
				|  |  | +let unitPriceModel = mongoose.model('unit_price');
 | 
	
		
			
				|  |  | +let chongqingOverWrite = require("../../../web/over_write/js/chongqing_2018.js");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  let _= require('lodash');
 | 
	
		
			
				|  |  |  const projectDao = require('../../pm/models/project_model').project;
 | 
	
	
		
			
				|  | @@ -164,8 +172,8 @@ async function insertNewRation(newData,defaultLibID,std,calQuantity) {//插入
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      let addRationGLJTime = +new Date();
 | 
	
		
			
				|  |  |      console.log("计算消耗量时间-------------------------------"+(addRationGLJTime - startTime));
 | 
	
		
			
				|  |  | -    let newRation = await ration_model.model.create(newData);
 | 
	
		
			
				|  |  | -    return newRation;
 | 
	
		
			
				|  |  | +    await ration_model.model.insertMany(newData);
 | 
	
		
			
				|  |  | +    return newData;
 | 
	
		
			
				|  |  |      /*ration_model.model.create(newData);
 | 
	
		
			
				|  |  |      return newData;*/
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -313,34 +321,47 @@ async function addRationTemplate(std,newRation) {
 | 
	
		
			
				|  |  |  async function addRationCoe(std,newRation,compilation) {
 | 
	
		
			
				|  |  |      let ration_coe_list = [];
 | 
	
		
			
				|  |  |      let seq = 0;
 | 
	
		
			
				|  |  | +    let stdCoeIDs = [];//与comCoeIDs两者不共存
 | 
	
		
			
				|  |  | +    let comCoeIDs = [];
 | 
	
		
			
				|  |  | +    let coeMap={};
 | 
	
		
			
				|  |  |      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);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | +          std.type === 'std'?stdCoeIDs.push(sub.ID):comCoeIDs.push(sub.ID);  
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        let libCoeList = [];
 | 
	
		
			
				|  |  | +        let seqLibIDs = [];
 | 
	
		
			
				|  |  | +        if (std.type === 'std'){
 | 
	
		
			
				|  |  | +          libCoeList = await coeMolde.find({'ID':{'$in':stdCoeIDs}}).lean();
 | 
	
		
			
				|  |  | +          seqLibIDs = stdCoeIDs;
 | 
	
		
			
				|  |  | +        }else{
 | 
	
		
			
				|  |  | +          libCoeList = await compleCoeModel.find({'ID':{'$in':comCoeIDs}}).lean();
 | 
	
		
			
				|  |  | +          seqLibIDs = comCoeIDs;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        for(let lib of libCoeList){
 | 
	
		
			
				|  |  | +          coeMap[lib.ID] = lib;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        for(let ID of seqLibIDs){
 | 
	
		
			
				|  |  | +          let libCoe = coeMap[ID];
 | 
	
		
			
				|  |  | +          if(libCoe){
 | 
	
		
			
				|  |  | +            let newCoe = {};
 | 
	
		
			
				|  |  | +            newCoe.ID = uuidV1();
 | 
	
		
			
				|  |  | +            newCoe.coeID = 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);
 | 
	
		
			
				|  |  | +    let lastCoe = await getCustomerCoe(newRation.projectID,newRation.ID,seq,compilation);//这个地方加载overWrite需要一些时间
 | 
	
		
			
				|  |  |      ration_coe_list.push(lastCoe);
 | 
	
		
			
				|  |  |      await ration_coe.insertMany(ration_coe_list);
 | 
	
		
			
				|  |  |      return ration_coe_list;
 | 
	
	
		
			
				|  | @@ -376,9 +397,13 @@ async function getCustomerCoe(projectID,rationID,seq,compilation){//取自定义
 | 
	
		
			
				|  |  |      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();
 | 
	
		
			
				|  |  | +        if(compilation.overWriteUrl.indexOf("chongqing_2018")!= -1){
 | 
	
		
			
				|  |  | +          console.log("重庆overwrite");
 | 
	
		
			
				|  |  | +          let overWrite = chongqingOverWrite
 | 
	
		
			
				|  |  | +          if(overWrite.getCusCoeContent) lastCoe.content = overWrite.getCusCoeContent();
 | 
	
		
			
				|  |  | +          if(overWrite.getCustomerCoeData) lastCoe.coes = overWrite.getCustomerCoeData();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +         
 | 
	
		
			
				|  |  |       }
 | 
	
		
			
				|  |  |       return lastCoe
 | 
	
		
			
				|  |  |     }catch (err){
 | 
	
	
		
			
				|  | @@ -400,6 +425,9 @@ async function addRationGLJ(std,newRation,compilation) {
 | 
	
		
			
				|  |  |      let newRationGLJList = [];
 | 
	
		
			
				|  |  |      let rationGLJShowList = [];
 | 
	
		
			
				|  |  |      let projectGLJList = [];
 | 
	
		
			
				|  |  | +    let gljKeyMap = {};
 | 
	
		
			
				|  |  | +    let mixRatioMap={};
 | 
	
		
			
				|  |  | +    let gljCodes=[];
 | 
	
		
			
				|  |  |      let unitPriceFileId = 0;
 | 
	
		
			
				|  |  |      let property = await projectDao.getProjectProperty(newRation.projectID);
 | 
	
		
			
				|  |  |      if(property){
 | 
	
	
		
			
				|  | @@ -425,56 +453,66 @@ async function addRationGLJ(std,newRation,compilation) {
 | 
	
		
			
				|  |  |          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.taxRate= std_glj.taxRate;
 | 
	
		
			
				|  |  | -                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 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.taxRate= std_glj.taxRate;
 | 
	
		
			
				|  |  | +            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 tindex = getIndex(newGLJ);
 | 
	
		
			
				|  |  | +            if(std_glj.component && std_glj.component.length > 0) mixRatioMap[tindex] = std_glj.component;
 | 
	
		
			
				|  |  | +            let tdata = ration_glj_facade.getGLJSearchInfo(newGLJ);
 | 
	
		
			
				|  |  | +            gljKeyMap[tindex] = tdata;
 | 
	
		
			
				|  |  | +            gljCodes.push(tdata.code);
 | 
	
		
			
				|  |  | +            newRationGLJList.push(newGLJ);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +              // 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));
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +        [newRationGLJList, projectGLJList] =  await getProjectGLJinfo(newRation.projectID,newRationGLJList,gljKeyMap,gljCodes,mixRatioMap,unitPriceFileId,ext);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      let before = +new Date();
 | 
	
		
			
				|  |  |      console.log("总查询时间为-------------------------------"+(before-first));
 | 
	
	
		
			
				|  | @@ -484,9 +522,374 @@ async function addRationGLJ(std,newRation,compilation) {
 | 
	
		
			
				|  |  |      let after = +new Date();
 | 
	
		
			
				|  |  |      console.log("实际插入时间为-------------------------------"+(after-before));
 | 
	
		
			
				|  |  |      console.log("总操作时间为-------------------------------"+(after-first));
 | 
	
		
			
				|  |  | -    return [rationGLJShowList,projectGLJList]
 | 
	
		
			
				|  |  | +    return [newRationGLJList,projectGLJList]
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async function getProjectGLJinfo(projectID,t_newRationGLJList,gljKeyMap,gljCodes,mixRatioMap,unitPriceFileId,ext){//批量插入或查找项目工料机信息
 | 
	
		
			
				|  |  | +  //先根据工料机编号在项目工料机中查找工料机是否存在
 | 
	
		
			
				|  |  | +  let projectGLJMap={};
 | 
	
		
			
				|  |  | +  let projectGLJList = [];
 | 
	
		
			
				|  |  | +  let newProjectGLJList=[];//工料机ID要重新去取
 | 
	
		
			
				|  |  | +  let connectKeyList = [];
 | 
	
		
			
				|  |  | +  let newRationGLJList = [];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  let gljListModel = new GLJListModel();
 | 
	
		
			
				|  |  | +  let t_projectGLJList = await projectGLJModel.find({'project_id':projectID,'code':{'$in':gljCodes}}).lean();
 | 
	
		
			
				|  |  | +  for(let pg of t_projectGLJList){
 | 
	
		
			
				|  |  | +     let pindex = getIndex(pg);  
 | 
	
		
			
				|  |  | +     projectGLJMap[pindex] = pg;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  for(let key in gljKeyMap){
 | 
	
		
			
				|  |  | +    if(!projectGLJMap[key]){//如果项目工料机不存在,则添加
 | 
	
		
			
				|  |  | +      newProjectGLJList.push(gljKeyMap[key]);
 | 
	
		
			
				|  |  | +      projectGLJMap[key] = gljKeyMap[key];
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    //查看组成物
 | 
	
		
			
				|  |  | +    if(gljListModel.ownCompositionTypes.indexOf(gljKeyMap[key].type)!=-1){//有组成物的类型
 | 
	
		
			
				|  |  | +      connectKeyList.push(key);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  let [existMixRatioMap,mixRatioInsertData,missCodeList] = await getMixRatioInfo(projectID,projectGLJMap,newProjectGLJList,mixRatioMap,connectKeyList,unitPriceFileId,ext);
 | 
	
		
			
				|  |  | +  if(missCodeList.length > 0) gljCodes = gljCodes.concat(missCodeList);
 | 
	
		
			
				|  |  | + 
 | 
	
		
			
				|  |  | + 
 | 
	
		
			
				|  |  | +  let [unitPriceMap,newUnitPriceList] = await getUnitPriceData(newProjectGLJList,gljCodes,unitPriceFileId);
 | 
	
		
			
				|  |  | +  if(newUnitPriceList.length > 0) await unitPriceModel.insertMany(newUnitPriceList);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  if(mixRatioInsertData.length > 0) await mixRatioModel.insertMany(mixRatioInsertData);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  //插入项目工料机
 | 
	
		
			
				|  |  | +  if(newProjectGLJList.length > 0){
 | 
	
		
			
				|  |  | +    await setIDfromCounter("glj_list",newProjectGLJList);
 | 
	
		
			
				|  |  | +    await projectGLJModel.insertMany(newProjectGLJList);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  //组装数据
 | 
	
		
			
				|  |  | +  for(let ration_glj of t_newRationGLJList){
 | 
	
		
			
				|  |  | +    let rkey = getIndex(ration_glj);
 | 
	
		
			
				|  |  | +    let pglj = projectGLJMap[rkey];
 | 
	
		
			
				|  |  | +    let subList = [];
 | 
	
		
			
				|  |  | +    setUnitPrice(pglj,unitPriceMap);
 | 
	
		
			
				|  |  | +    if(existMixRatioMap[rkey]){//如果有组成物
 | 
	
		
			
				|  |  | +      for(let m of existMixRatioMap[rkey]){
 | 
	
		
			
				|  |  | +         let mpglj = projectGLJMap[getIndex(m)]
 | 
	
		
			
				|  |  | +         if(mpglj){
 | 
	
		
			
				|  |  | +          let cglj = _.clone(mpglj); 
 | 
	
		
			
				|  |  | +          setUnitPrice(cglj,unitPriceMap);
 | 
	
		
			
				|  |  | +          cglj.ratio_data = m;
 | 
	
		
			
				|  |  | +          subList.push(cglj);
 | 
	
		
			
				|  |  | +         }else{
 | 
	
		
			
				|  |  | +            throw  `组成物${m.name}对应的项目工料机没有找到`;
 | 
	
		
			
				|  |  | +         }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      pglj.subList =subList; 
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    ration_glj.projectGLJID = pglj.id;
 | 
	
		
			
				|  |  | +    newRationGLJList.push(ration_glj_facade.createNewRecord(ration_glj));
 | 
	
		
			
				|  |  | +    projectGLJList.push(pglj);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  return [newRationGLJList, projectGLJList];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  function setUnitPrice(p,unitPriceMap){
 | 
	
		
			
				|  |  | +    p.unit_price = unitPriceMap[getIndex(p)];
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async function getUnitPriceData(newProjectGLJList,gljCodes,unitPriceFileId){
 | 
	
		
			
				|  |  | +  let unitPriceMap = {};
 | 
	
		
			
				|  |  | +  let newUnitPriceList = [];
 | 
	
		
			
				|  |  | +  let unitPriceList = await unitPriceModel.find({unit_price_file_id: unitPriceFileId,'code':{'$in':gljCodes}}).lean();
 | 
	
		
			
				|  |  | +  for(let u of unitPriceList){
 | 
	
		
			
				|  |  | +    unitPriceMap[getIndex(u)]=u;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  for(let np of newProjectGLJList){
 | 
	
		
			
				|  |  | +    let pkey = getIndex(np);
 | 
	
		
			
				|  |  | +    if(unitPriceMap[pkey]) continue;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    let insertData = {
 | 
	
		
			
				|  |  | +      code: np.code,
 | 
	
		
			
				|  |  | +      base_price: np.base_price,
 | 
	
		
			
				|  |  | +      market_price: np.market_price,
 | 
	
		
			
				|  |  | +      unit_price_file_id: unitPriceFileId,
 | 
	
		
			
				|  |  | +      name: np.name,
 | 
	
		
			
				|  |  | +      specs:np.specs?np.specs:'',
 | 
	
		
			
				|  |  | +      original_code:np.original_code,
 | 
	
		
			
				|  |  | +      unit:np.unit?np.unit:'',
 | 
	
		
			
				|  |  | +      type: np.type,
 | 
	
		
			
				|  |  | +      short_name: np.shortName !== undefined ? np.shortName : '',
 | 
	
		
			
				|  |  | +      glj_id: np.glj_id,
 | 
	
		
			
				|  |  | +      is_add:0,
 | 
	
		
			
				|  |  | +      grossWeightCoe:np.grossWeightCoe,
 | 
	
		
			
				|  |  | +      purchaseStorageRate:np.purchaseStorageRate,
 | 
	
		
			
				|  |  | +      offSiteTransportLossRate:np.offSiteTransportLossRate,
 | 
	
		
			
				|  |  | +      handlingLossRate:np.handlingLossRate
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +    if(np.from=='cpt') insertData.is_add=1;//如果是来自补充工料机,则都添加新增标记
 | 
	
		
			
				|  |  | +    if(insertData.code != insertData.original_code) insertData.is_add=1;//添加的时候如果是复制整块来的,可能在源项目中是新增的工料机,这里也要添上(暂时可能还用不到)
 | 
	
		
			
				|  |  | +    newUnitPriceList.push(insertData);
 | 
	
		
			
				|  |  | +    unitPriceMap[pkey] = insertData;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  if(newUnitPriceList.length > 0) await setIDfromCounter("unit_price",newUnitPriceList);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  return [unitPriceMap,newUnitPriceList];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async function getMixRatioInfo(projectID,projectGLJMap,newProjectGLJList,mixRatioMap,connectKeyList,unitPriceFileId,ext){//取组成物信息,得到缺少的组成物情况
 | 
	
		
			
				|  |  | +  let missCodeList = []; //所有组成物信息的编码,用来统一查询对应的项目工料机是否存在
 | 
	
		
			
				|  |  | +  let existMixRatioMap ={};
 | 
	
		
			
				|  |  | +  let codeMap={};//用来去重
 | 
	
		
			
				|  |  | +  let mixRatioInsertData = [];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // 1. 先检查现在的组成物表中,是否有相关信息 - 生成映射记录
 | 
	
		
			
				|  |  | +  if(connectKeyList.length > 0){//有组成物的话从数据库中取出组成物信息
 | 
	
		
			
				|  |  | +    let mixRatioList = await mixRatioModel.find({'unit_price_file_id': unitPriceFileId,'connect_key': {'$in':connectKeyList}}).lean();
 | 
	
		
			
				|  |  | +    for(let m of mixRatioList){
 | 
	
		
			
				|  |  | +        //组成物信息分组,查看哪些是已经存在的
 | 
	
		
			
				|  |  | +       existMixRatioMap[m.connect_key]?existMixRatioMap[m.connect_key].push(m):existMixRatioMap[m.connect_key]=[m];
 | 
	
		
			
				|  |  | +       //查看组成物对应的项目工料机是否存在,如果不存在,要插入项目工料机
 | 
	
		
			
				|  |  | +       let mkey = getIndex(m);
 | 
	
		
			
				|  |  | +       if(!projectGLJMap[mkey] && !codeMap[m.code]){//如果之前查出来的项目工料机中不包含组成物的信息,要加到missCode里面再查找一次项目工料机看是否存在
 | 
	
		
			
				|  |  | +          missCodeList.push(m.code);
 | 
	
		
			
				|  |  | +          codeMap[m.code] = true;
 | 
	
		
			
				|  |  | +       } 
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 2 将第一步得到的映射表 与在标准库查询父工料机得到的映射表对比,得出哪些组物成还需要添加,获得库ID
 | 
	
		
			
				|  |  | +    let stdIDs = []; 
 | 
	
		
			
				|  |  | +    let comIDs = [];
 | 
	
		
			
				|  |  | +    let missMixRatioGroup = [];
 | 
	
		
			
				|  |  | +    for(let ck of connectKeyList){//查看项目中组成物信息是否已经存在,如果不存在,则用插定额时获取的组成物信息从数据库中获取
 | 
	
		
			
				|  |  | +       if(!existMixRatioMap[ck] && mixRatioMap[ck] && mixRatioMap[ck].length > 0){//组成物信息不存在
 | 
	
		
			
				|  |  | +         let pglj = projectGLJMap[ck];//取出父数据 
 | 
	
		
			
				|  |  | +         let from =  pglj.from === undefined|| pglj.from ===null || pglj.from === ""?'std' : pglj.from;
 | 
	
		
			
				|  |  | +         for(let c of mixRatioMap[ck]){
 | 
	
		
			
				|  |  | +            if(from == "std"){//标准的工料机只来自标准的
 | 
	
		
			
				|  |  | +                stdIDs.push(c.ID); 
 | 
	
		
			
				|  |  | +            }else{
 | 
	
		
			
				|  |  | +              c.isStd?stdIDs.push(c.ID):comIDs.push(c.ID);  
 | 
	
		
			
				|  |  | +            } 
 | 
	
		
			
				|  |  | +         } 
 | 
	
		
			
				|  |  | +         missMixRatioGroup.push({'connect_key':ck,'list':mixRatioMap[ck],'from':from});
 | 
	
		
			
				|  |  | +       }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    //3.统一查询所有组成物在标准库中的详细信息
 | 
	
		
			
				|  |  | +    let stdMixMap = {};
 | 
	
		
			
				|  |  | +    //整理需插入的组成物列表的数据
 | 
	
		
			
				|  |  | +    //来自标准工料机
 | 
	
		
			
				|  |  | +    if(stdIDs.length > 0){
 | 
	
		
			
				|  |  | +      stdIDs = _.uniq(stdIDs);//去重
 | 
	
		
			
				|  |  | +      let stdMixList =  await std_glj_lib_gljList_model.find({'ID':{'$in':stdIDs}}).lean();
 | 
	
		
			
				|  |  | +      for(let sm of stdMixList){
 | 
	
		
			
				|  |  | +        stdMixMap[sm.ID] = sm;
 | 
	
		
			
				|  |  | +        let skey = getIndex(sm,['code','name','specs','unit','gljType']);
 | 
	
		
			
				|  |  | +        if(!projectGLJMap[skey] && !codeMap[sm.code]){
 | 
	
		
			
				|  |  | +          missCodeList.push(sm.code);
 | 
	
		
			
				|  |  | +          codeMap[sm.code] = true;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    //来自组成物工料机
 | 
	
		
			
				|  |  | +    let comMixMap = {};
 | 
	
		
			
				|  |  | +    if(comIDs.length > 0){
 | 
	
		
			
				|  |  | +      comIDs = _.uniq(comIDs);//去重
 | 
	
		
			
				|  |  | +      let comMixList = await complementaryGljLibModel.find({'ID':{'$in':comIDs}}).lean();
 | 
	
		
			
				|  |  | +      for(let cm of comMixList){
 | 
	
		
			
				|  |  | +        comMixMap[cm.ID] = cm;
 | 
	
		
			
				|  |  | +        let ckey = getIndex(cm,['code','name','specs','unit','gljType']);
 | 
	
		
			
				|  |  | +        if(!projectGLJMap[ckey] && codeMap[cm.code]){
 | 
	
		
			
				|  |  | +          missCodeList.push(cm.code);
 | 
	
		
			
				|  |  | +          codeMap[cm.code] = true;
 | 
	
		
			
				|  |  | +        } 
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    //4.生成需要插入组成物表的数据
 | 
	
		
			
				|  |  | +    for(let mg of missMixRatioGroup){//整理需要插入组成物列表的数据
 | 
	
		
			
				|  |  | +        for(let tc of mg.list){
 | 
	
		
			
				|  |  | +          let consumpiton = tc.consumeAmt;
 | 
	
		
			
				|  |  | +          //只有标准的工料机的组成物才会有多单价、多组成物消耗量的情况
 | 
	
		
			
				|  |  | +          if(mg.from == 'std' && ext && ext.quantityField &&( tc.consumeAmtProperty[ext.quantityField]!= undefined && tc.consumeAmtProperty[ext.quantityField]!=null)){
 | 
	
		
			
				|  |  | +              consumpiton = tc.consumeAmtProperty[ext.quantityField];
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +          let mfrom = mg.from == 'std' || tc.isStd?'std':'cpt'; 
 | 
	
		
			
				|  |  | +          let tmp = mfrom == 'std'?stdMixMap[tc.ID]:comMixMap[tc.ID];//取出之前库中查到的工料机
 | 
	
		
			
				|  |  | +          let mixRatioData = {
 | 
	
		
			
				|  |  | +              consumption: consumpiton,
 | 
	
		
			
				|  |  | +              glj_id: tmp.ID,
 | 
	
		
			
				|  |  | +              unit_price_file_id: unitPriceFileId,
 | 
	
		
			
				|  |  | +              connect_key: mg.connect_key,
 | 
	
		
			
				|  |  | +              type: tmp.gljType,
 | 
	
		
			
				|  |  | +              code: tmp.code,
 | 
	
		
			
				|  |  | +              specs:tmp.specs?tmp.specs:"",
 | 
	
		
			
				|  |  | +              name:tmp.name,
 | 
	
		
			
				|  |  | +              unit:tmp.unit?tmp.unit:'',
 | 
	
		
			
				|  |  | +              from:mfrom
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  | +          mixRatioInsertData.push(mixRatioData);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if(mixRatioInsertData.length > 0) await setIDfromCounter("mix_ratio",mixRatioInsertData,existMixRatioMap,'connect_key');
 | 
	
		
			
				|  |  | +    //await mixRatioModel.insertMany(mixRatioInsertData);  因为没有事务添加组成物数据要放在添加单价文件数据之后
 | 
	
		
			
				|  |  | +     
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    //5.查询组成物对应的项目工料机是否存在,如果不存在,生成项目工料机信息
 | 
	
		
			
				|  |  | +    let projectGLJList = await projectGLJModel.find({'project_id':projectID,'code':{'$in':missCodeList}}).lean();
 | 
	
		
			
				|  |  | +    for(let pg of projectGLJList){
 | 
	
		
			
				|  |  | +      let pindex = getIndex(pg);  
 | 
	
		
			
				|  |  | +      projectGLJMap[pindex] = pg;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    let lessMix = [];//组成物表存在,项目工料机不存在的数据
 | 
	
		
			
				|  |  | +    let lessMixMap = {};//防止重复添加
 | 
	
		
			
				|  |  | +    for(let connect_key in existMixRatioMap){
 | 
	
		
			
				|  |  | +      let mixRatios = existMixRatioMap[connect_key]; 
 | 
	
		
			
				|  |  | +      for(let m of mixRatios){
 | 
	
		
			
				|  |  | +        let mk = getIndex(m);
 | 
	
		
			
				|  |  | +        if(!projectGLJMap[mk] && !lessMixMap[mk]){//如果组成物对应的项目工料机不存在
 | 
	
		
			
				|  |  | +          let nglj = null;
 | 
	
		
			
				|  |  | +          if(m.from == 'std'){//这里有值,说明是刚添加到组成物文件中的数据   
 | 
	
		
			
				|  |  | +            nglj = stdMixMap[m.glj_id];
 | 
	
		
			
				|  |  | +          }else if(m.from == 'cpt'){//这里有值,说明是刚添加到组成物文件中的数据   
 | 
	
		
			
				|  |  | +            nglj = comMixMap[m.glj_id];
 | 
	
		
			
				|  |  | +          }    
 | 
	
		
			
				|  |  | +          if(nglj){
 | 
	
		
			
				|  |  | +            nglj.from = m.from;
 | 
	
		
			
				|  |  | +            let np = getProjectGLJNewData(nglj,projectID,ext);
 | 
	
		
			
				|  |  | +            newProjectGLJList.push(np);
 | 
	
		
			
				|  |  | +            projectGLJMap[mk] = np;
 | 
	
		
			
				|  |  | +          }else{//这里没找到,说明是组成物文件里有,但是项目工料机没有的数据
 | 
	
		
			
				|  |  | +            lessMix.push(m);
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +          lessMixMap[mk] = true;//只要处理过一次,就不用再重新处理了,机械组成物,比如柴油这些,会出现多次
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   //6. 组成物文件里有,但是项目工料机没有的数据(共用单价文件等情况产生)    
 | 
	
		
			
				|  |  | +    let lessIDList=[];
 | 
	
		
			
				|  |  | +    let uniqMap ={};//去重
 | 
	
		
			
				|  |  | +    let lessStdMix = [];//防止组成物中改了名称等,但是通过glj_id取出来的是还没改前的原始数据
 | 
	
		
			
				|  |  | +    if(lessMix.length > 0){
 | 
	
		
			
				|  |  | +      for(let lm of lessMix){
 | 
	
		
			
				|  |  | +        let parentglj = projectGLJMap[lm.connect_key];
 | 
	
		
			
				|  |  | +        if(!parentglj) throw `含有组成物工料机${lm.connect_key},没有找到,添加定额失败`;
 | 
	
		
			
				|  |  | +        if((parentglj.from == "std" || lm.from == "std") && lm.code!="80CCS"){//车船税特殊处理
 | 
	
		
			
				|  |  | +          if(!uniqMap[lm.glj_id]){
 | 
	
		
			
				|  |  | +            lessIDList.push(lm.glj_id);
 | 
	
		
			
				|  |  | +            uniqMap[lm.glj_id] = lm;
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +          lessStdMix.push(lm);
 | 
	
		
			
				|  |  | +        }else {//来自组成物的直接设置    
 | 
	
		
			
				|  |  | +          lm.from = 'cpt';
 | 
	
		
			
				|  |  | +          lm.gljType = lm.type;
 | 
	
		
			
				|  |  | +          let t_mg = getProjectGLJNewData(lm,projectID);
 | 
	
		
			
				|  |  | +          newProjectGLJList.push(t_mg);
 | 
	
		
			
				|  |  | +          projectGLJMap[getIndex(lm)] = t_mg;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if(lessIDList.length > 0){
 | 
	
		
			
				|  |  | +      let less_stds =  await std_glj_lib_gljList_model.find({'ID':{'$in':lessIDList}}).lean();
 | 
	
		
			
				|  |  | +      let less_stds_map = {};
 | 
	
		
			
				|  |  | +      for(let les of  less_stds){
 | 
	
		
			
				|  |  | +        less_stds_map[les.ID] = les;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      for(let t_l_m of lessStdMix){
 | 
	
		
			
				|  |  | +        let t_nglj = less_stds_map[t_l_m.glj_id];
 | 
	
		
			
				|  |  | +        t_nglj.from = 'std';
 | 
	
		
			
				|  |  | +        //防止组成物中改了名称等,但是通过glj_id取出来的是还没改前的原始数据
 | 
	
		
			
				|  |  | +        t_nglj.name = t_l_m.name;
 | 
	
		
			
				|  |  | +        t_nglj.code = t_l_m.code;
 | 
	
		
			
				|  |  | +        t_nglj.gljType = t_l_m.type;
 | 
	
		
			
				|  |  | +        t_nglj.specs = t_l_m.specs;
 | 
	
		
			
				|  |  | +        t_nglj.unit = t_l_m.unit;
 | 
	
		
			
				|  |  | +        let t_np = getProjectGLJNewData(t_nglj,projectID,ext);
 | 
	
		
			
				|  |  | +        newProjectGLJList.push(t_np);
 | 
	
		
			
				|  |  | +        projectGLJMap[getIndex(t_l_m)] = t_np;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  return [existMixRatioMap,mixRatioInsertData,missCodeList]
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function getProjectGLJNewData(tmp,projectId,ext){
 | 
	
		
			
				|  |  | +  let gljData = {
 | 
	
		
			
				|  |  | +      glj_id: tmp.ID,
 | 
	
		
			
				|  |  | +      repositoryId:tmp.repositoryId,
 | 
	
		
			
				|  |  | +      project_id: projectId,
 | 
	
		
			
				|  |  | +      code: tmp.code,
 | 
	
		
			
				|  |  | +      name: tmp.name,
 | 
	
		
			
				|  |  | +      specs: tmp.specs?tmp.specs:'',
 | 
	
		
			
				|  |  | +      unit: tmp.unit === undefined ? '' : tmp.unit,
 | 
	
		
			
				|  |  | +      type: tmp.gljType,
 | 
	
		
			
				|  |  | +      adjCoe:tmp.adjCoe,
 | 
	
		
			
				|  |  | +      original_code:tmp.code,
 | 
	
		
			
				|  |  | +      materialType: tmp.materialType,   //三材类别
 | 
	
		
			
				|  |  | +      materialCoe: tmp.materialCoe,
 | 
	
		
			
				|  |  | +      base_price: tmp.basePrice,
 | 
	
		
			
				|  |  | +      market_price: tmp.basePrice,
 | 
	
		
			
				|  |  | +      from:tmp.from?tmp.from:"std"
 | 
	
		
			
				|  |  | +  };
 | 
	
		
			
				|  |  | +  if(gljData.from == 'std' && ext && ext.priceField &&( tmp.priceProperty[ext.priceField]!= undefined && tmp.priceProperty[ext.priceField]!=null)){
 | 
	
		
			
				|  |  | +    basePrice = scMathUtil.roundTo(tmp.priceProperty[ext.priceField],-6);
 | 
	
		
			
				|  |  | +    gljData.base_price = basePrice;
 | 
	
		
			
				|  |  | +    gljData.market_price = basePrice;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  return gljData;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async function setIDfromCounter(name,list,map,keyfield){//map,keyfield
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  let update = {$inc: {sequence_value: list.length}};
 | 
	
		
			
				|  |  | +  let condition = {_id: name};
 | 
	
		
			
				|  |  | +  let options = {new: true};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // 先查找更新
 | 
	
		
			
				|  |  | +  let counter = await counterModel.findOneAndUpdate(condition, update, options);
 | 
	
		
			
				|  |  | +  let firstID = counter.sequence_value - (list.length - 1);
 | 
	
		
			
				|  |  | +  for(let a of list){
 | 
	
		
			
				|  |  | +      a.id = firstID;
 | 
	
		
			
				|  |  | +      firstID+=1
 | 
	
		
			
				|  |  | +      if(map && keyfield){
 | 
	
		
			
				|  |  | +        let key = a[keyfield];
 | 
	
		
			
				|  |  | +        map[key]?map[key].push(a):map[key]=[a]
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  async function deleRationSubRecode(projectID,rationID,cleanzmhs=false) {//删除挂在定额下的数据,如工程量明细,定额工料机等
 | 
	
		
			
				|  |  |      let delete_query={projectID: projectID, rationID: rationID};
 | 
	
		
			
				|  |  |      //删除工程量明细
 | 
	
	
		
			
				|  | @@ -680,4 +1083,16 @@ function FilterNumberFromUnit (unit) {
 | 
	
		
			
				|  |  |      } else {
 | 
	
		
			
				|  |  |          return 1;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -};
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function getIndex(obj,tpops){
 | 
	
		
			
				|  |  | +  let pops = tpops?tpops:['code','name','specs','unit','type'];
 | 
	
		
			
				|  |  | +  let t_index = '';
 | 
	
		
			
				|  |  | +  let k_arr=[];
 | 
	
		
			
				|  |  | +  for(let p of pops){
 | 
	
		
			
				|  |  | +      let tmpK = (obj[p]==undefined||obj[p]==null||obj[p]=='')?'null':obj[p];
 | 
	
		
			
				|  |  | +      k_arr.push(tmpK);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  t_index=k_arr.join("|-|");
 | 
	
		
			
				|  |  | +  return t_index;
 | 
	
		
			
				|  |  | +}
 |