|
|
@@ -37,6 +37,9 @@ let _= require('lodash');
|
|
|
const projectDao = require('../../pm/models/project_model').project;
|
|
|
let projectModel = mongoose.model('projects');
|
|
|
let unitPriceModel = mongoose.model('unit_price');
|
|
|
+let unitPriceFileModel = mongoose.model('unit_price_file');
|
|
|
+let vvTaxModel = mongoose.model("std_vehicleVesselTax_items");
|
|
|
+
|
|
|
const fs = require('fs');
|
|
|
|
|
|
module.exports = {
|
|
|
@@ -254,8 +257,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;*/
|
|
|
}
|
|
|
@@ -400,6 +403,9 @@ async function addRationTemplate(std,newRation) {
|
|
|
async function addRationCoe(std,newRation,compilation) {
|
|
|
let ration_coe_list = [];
|
|
|
let seq = 0;
|
|
|
+ let stdCoeIDs = [];
|
|
|
+ let coeMap={}
|
|
|
+
|
|
|
if(std.hasOwnProperty('rationCoeList')&&std.rationCoeList.length>0){//添加标准库的工料机
|
|
|
for(let sub of std.rationCoeList){
|
|
|
let libCoe;
|
|
|
@@ -461,12 +467,12 @@ async function getCustomerCoe(projectID,rationID,seq,compilation){//取自定义
|
|
|
lastCoe.ID = uuidV1();
|
|
|
lastCoe.coes = getCustomerCoeData();
|
|
|
try {
|
|
|
- //查看编办中有没有重写路径
|
|
|
- if(compilation.overWriteUrl && compilation.overWriteUrl!=""){
|
|
|
+ //查看编办中有没有重写路径 -- 养护中暂时没用到
|
|
|
+ /* 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("读取自定义系数重写文件失败");
|
|
|
@@ -535,49 +541,43 @@ async function addRationGLJ(std,newRation,compilation,isMaterial,connect_key) {
|
|
|
newGLJ.adjustProportion = proportion;
|
|
|
let std_glj = getStdGlj(sub,stdGLJMap,cptGLJMap,{},ext);
|
|
|
if(std_glj){
|
|
|
- let tindex = getIndex(newGLJ);
|
|
|
ration_glj_facade.setPropertyFromStd(newGLJ,std_glj);
|
|
|
+ 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);
|
|
|
- /* 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 InfoFromProjectGLJ = +new Date();
|
|
|
+ console.log("找到项目工料机时间-------------------------------"+(InfoFromProjectGLJ - stdGLJMapTime));
|
|
|
|
|
|
}
|
|
|
- let before = +new Date();
|
|
|
- console.log("总查询时间为-------------------------------"+(before-first));
|
|
|
if(isMaterial == true) return [newRationGLJList,projectGLJList];//如果是材料计算的工料机,这里返回就可以了
|
|
|
|
|
|
if(newRationGLJList.length>0){
|
|
|
await ration_glj.insertMany(newRationGLJList);
|
|
|
}
|
|
|
let after = +new Date();
|
|
|
- console.log("实际插入时间为-------------------------------"+(after-before));
|
|
|
console.log("总操作时间为-------------------------------"+(after-first));
|
|
|
- return [rationGLJShowList,projectGLJList];
|
|
|
+ return [newRationGLJList,projectGLJList];
|
|
|
}
|
|
|
|
|
|
-async function getProjectGLJinfo(projectID,gljKeyMap,gljCodes,mixRatioMap,unitPriceFileId,ext){//批量插入或查找项目工料机信息
|
|
|
+async function getProjectGLJinfo(projectID,t_newRationGLJList,gljKeyMap,gljCodes,mixRatioMap,unitPriceFileId,ext){//批量插入或查找项目工料机信息
|
|
|
//先根据工料机编号在项目工料机中查找工料机是否存在
|
|
|
let projectGLJMap={};
|
|
|
- let unitPriceMap = {};
|
|
|
+ let projectGLJList = [];
|
|
|
let newProjectGLJList=[];//工料机ID要重新去取
|
|
|
let connectKeyList = [];
|
|
|
- let existMixRatioMap={};
|
|
|
+ let CCSMap = {keyMap:{},codes:[]};//需要添加车船税的机械台班
|
|
|
+ let newRationGLJList=[];
|
|
|
|
|
|
let gljListModel = new GLJListModel();
|
|
|
- let projectGLJList = await projectGLJModel.find({'project_id':projectID,'code':{'$in':gljCodes}}).lean();
|
|
|
- for(let pg of projectGLJList){
|
|
|
+ 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;
|
|
|
}
|
|
|
@@ -585,39 +585,127 @@ async function getProjectGLJinfo(projectID,gljKeyMap,gljCodes,mixRatioMap,unitPr
|
|
|
if(!projectGLJMap[key]){//如果项目工料机不存在,则添加
|
|
|
newProjectGLJList.push(gljKeyMap[key]);
|
|
|
projectGLJMap[key] = gljKeyMap[key];
|
|
|
+ if(gljKeyMap[key].type == 301){//如果是机械台班,需看看有没有车船税
|
|
|
+ CCSMap.keyMap[key] = true;
|
|
|
+ CCSMap.codes.push(gljKeyMap[key].code);
|
|
|
+ }
|
|
|
}
|
|
|
//查看组成物
|
|
|
- if(gljListModel.ownCompositionTypes.indexOf(data.type)!=-1){//有组成物的类型
|
|
|
+ if(gljListModel.ownCompositionTypes.indexOf(gljKeyMap[key].type)!=-1){//有组成物的类型
|
|
|
connectKeyList.push(key);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-//处理车般税相关 --- todo
|
|
|
|
|
|
-
|
|
|
+ let [existMixRatioMap,mixRatioInsertData,missCodeList] = await getMixRatioInfo(projectID,projectGLJMap,newProjectGLJList,mixRatioMap,connectKeyList,unitPriceFileId,CCSMap,ext);
|
|
|
+ if(missCodeList.length > 0) gljCodes = gljCodes.concat(missCodeList);
|
|
|
+
|
|
|
+ //处理车般税相关,车船税是添加项目时,项目工料机,和单价文件里自动添加的 --- todo
|
|
|
+
|
|
|
+ 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);
|
|
|
+ }
|
|
|
|
|
|
|
|
|
- let unitPriceList = await unitPriceModel.find({unit_price_file_id: unitPriceFileId,'code':{'$in':gljCodes}}).lean();
|
|
|
+ //组装数据
|
|
|
+ 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;
|
|
|
+ }
|
|
|
|
|
|
|
|
|
- gljListModel.ownCompositionTypes
|
|
|
+ if(newUnitPriceList.length > 0) await setIDfromCounter("unit_price",newUnitPriceList);
|
|
|
|
|
|
+ return [unitPriceMap,newUnitPriceList];
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
-async function getMixRatioInfo(projectID,projectGLJMap,mixRatioMap,connectKeyList,unitPriceFileId,ext){//取组成物信息,得到缺少的组成物情况
|
|
|
- let missCodeList = [];
|
|
|
+async function getMixRatioInfo(projectID,projectGLJMap,newProjectGLJList,mixRatioMap,connectKeyList,unitPriceFileId,CCSMap,ext){//取组成物信息,得到缺少的组成物情况
|
|
|
+ let missCodeList = []; //所有组成物信息的编码,用来统一查询对应的项目工料机是否存在
|
|
|
let existMixRatioMap ={};
|
|
|
let codeMap={};//用来去重
|
|
|
- let newProjectGLJList=[];
|
|
|
+ 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){
|
|
|
@@ -630,6 +718,8 @@ async function getMixRatioInfo(projectID,projectGLJMap,mixRatioMap,connectKeyLis
|
|
|
codeMap[m.code] = true;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ // 2 将第一步得到的映射表 与在标准库查询父工料机得到的映射表对比,得出哪些组物成还需要添加,获得库ID
|
|
|
let stdIDs = [];
|
|
|
let comIDs = [];
|
|
|
let missMixRatioGroup = [];
|
|
|
@@ -648,7 +738,7 @@ async function getMixRatioInfo(projectID,projectGLJMap,mixRatioMap,connectKeyLis
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+ //3.统一查询所有组成物在标准库中的详细信息
|
|
|
let stdMixMap = {};
|
|
|
//整理需插入的组成物列表的数据
|
|
|
//来自标准工料机
|
|
|
@@ -680,8 +770,7 @@ async function getMixRatioInfo(projectID,projectGLJMap,mixRatioMap,connectKeyLis
|
|
|
}
|
|
|
|
|
|
|
|
|
- let mixRatioInsertData = [];
|
|
|
-
|
|
|
+ //4.生成需要插入组成物表的数据
|
|
|
for(let mg of missMixRatioGroup){//整理需要插入组成物列表的数据
|
|
|
for(let tc of mg.list){
|
|
|
let consumpiton = tc.consumeAmt;
|
|
|
@@ -707,11 +796,29 @@ async function getMixRatioInfo(projectID,projectGLJMap,mixRatioMap,connectKeyLis
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ //4.5 处理车船税问题,查询机械台班是否需要添加车船税
|
|
|
+ if(CCSMap.codes.length > 0){
|
|
|
+ let unitFileInfo = await unitPriceFileModel.findOne({id:unitPriceFileId}).lean();
|
|
|
+ if(unitFileInfo.vvTaxFileID && unitFileInfo.vvTaxFileID!=""){
|
|
|
+ let needCCS = false;
|
|
|
+ let items = await vvTaxModel.find({libID:unitFileInfo.vvTaxFileID,'code':{'$in':CCSMap.codes}}).lean();
|
|
|
+ for(let i of items){
|
|
|
+ let ikey = getIndex(i);
|
|
|
+ if(CCSMap.keyMap[ikey]){
|
|
|
+ needCCS = true;
|
|
|
+ mixRatioInsertData.push(gljUtil.getBaseCCSMixRatio(unitPriceFileId,i.vehicleVesselTax,ikey))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(needCCS && !codeMap["80CCS"]) missCodeList.push("80CCS");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
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);
|
|
|
@@ -719,11 +826,12 @@ async function getMixRatioInfo(projectID,projectGLJMap,mixRatioMap,connectKeyLis
|
|
|
}
|
|
|
|
|
|
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]){//如果组成物对应的项目工料机不存在
|
|
|
+ if(!projectGLJMap[mk] && !lessMixMap[mk]){//如果组成物对应的项目工料机不存在
|
|
|
let nglj = null;
|
|
|
if(m.from == 'std'){//这里有值,说明是刚添加到组成物文件中的数据
|
|
|
nglj = stdMixMap[m.glj_id];
|
|
|
@@ -738,10 +846,13 @@ async function getMixRatioInfo(projectID,projectGLJMap,mixRatioMap,connectKeyLis
|
|
|
}else{//这里没找到,说明是组成物文件里有,但是项目工料机没有的数据
|
|
|
lessMix.push(m);
|
|
|
}
|
|
|
+ lessMixMap[mk] = true;//只要处理过一次,就不用再重新处理了,机械组成物,比如柴油这些,会出现多次
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ //6. 组成物文件里有,但是项目工料机没有的数据(共用单价文件等情况产生)
|
|
|
let lessIDList=[];
|
|
|
let uniqMap ={};//去重
|
|
|
let lessStdMix = [];//防止组成物中改了名称等,但是通过glj_id取出来的是还没改前的原始数据
|
|
|
@@ -749,7 +860,7 @@ async function getMixRatioInfo(projectID,projectGLJMap,mixRatioMap,connectKeyLis
|
|
|
for(let lm of lessMix){
|
|
|
let parentglj = projectGLJMap[lm.connect_key];
|
|
|
if(!parentglj) throw `含有组成物工料机${lm.connect_key},没有找到,添加定额失败`;
|
|
|
- if(parentglj.from == "std" || lm.from == "std"){
|
|
|
+ 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;
|
|
|
@@ -759,11 +870,12 @@ async function getMixRatioInfo(projectID,projectGLJMap,mixRatioMap,connectKeyLis
|
|
|
lm.from = 'cpt';
|
|
|
lm.gljType = lm.type;
|
|
|
let t_mg = getProjectGLJNewData(lm,projectID);
|
|
|
- newProjectGLJLis.push(t_mg);
|
|
|
+ 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 = {};
|
|
|
@@ -781,16 +893,12 @@ async function getMixRatioInfo(projectID,projectGLJMap,mixRatioMap,connectKeyLis
|
|
|
t_nglj.unit = t_l_m.unit;
|
|
|
let t_np = getProjectGLJNewData(t_nglj,projectID,ext);
|
|
|
newProjectGLJList.push(t_np);
|
|
|
- projectGLJMap[t_l_m.connect_key] = t_np;
|
|
|
+ projectGLJMap[getIndex(t_l_m)] = t_np;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
}
|
|
|
- return [existMixRatioMap,mixRatioInsertData,newProjectGLJList,missCodeList]
|
|
|
+ return [existMixRatioMap,mixRatioInsertData,missCodeList]
|
|
|
|
|
|
}
|
|
|
|
|
|
@@ -810,7 +918,7 @@ function getProjectGLJNewData(tmp,projectId,ext){
|
|
|
materialType: tmp.materialType, //三材类别
|
|
|
materialCoe: tmp.materialCoe,
|
|
|
base_price: tmp.basePrice,
|
|
|
- market_price: tmp.marketPrice,
|
|
|
+ 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)){
|
|
|
@@ -828,9 +936,9 @@ async function setIDfromCounter(name,list,map,keyfield){//map,keyfield
|
|
|
let options = {new: true};
|
|
|
|
|
|
// 先查找更新
|
|
|
- let maxID = await counterModel.findAndModify(condition, update, options);
|
|
|
- let firstID = maxID - list.length - 1;
|
|
|
- for(a of list){
|
|
|
+ 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){
|
|
|
@@ -839,13 +947,6 @@ async function setIDfromCounter(name,list,map,keyfield){//map,keyfield
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-async function getUnitPriceData(unitPriceMap){
|
|
|
-
|
|
|
}
|
|
|
|
|
|
|