|
@@ -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;
|
|
|
+}
|