|
@@ -1,5 +1,7 @@
|
|
const mongoose = require('mongoose');
|
|
const mongoose = require('mongoose');
|
|
const uuidV1 = require('uuid/v1');
|
|
const uuidV1 = require('uuid/v1');
|
|
|
|
+const _ = require('lodash');
|
|
|
|
+const scMathUtil = require('../../../public/scMathUtil').getUtil();
|
|
const { CRAWL_LOG_KEY, ProcessStatus } = require('../../../public/constants/price_info_constant');
|
|
const { CRAWL_LOG_KEY, ProcessStatus } = require('../../../public/constants/price_info_constant');
|
|
|
|
|
|
const priceInfoLibModel = mongoose.model('std_price_info_lib');
|
|
const priceInfoLibModel = mongoose.model('std_price_info_lib');
|
|
@@ -8,6 +10,9 @@ const priceInfoItemModel = mongoose.model('std_price_info_items');
|
|
const priceInfoAreaModel = mongoose.model('std_price_info_areas');
|
|
const priceInfoAreaModel = mongoose.model('std_price_info_areas');
|
|
const compilationModel = mongoose.model('compilation');
|
|
const compilationModel = mongoose.model('compilation');
|
|
const importLogsModel = mongoose.model('import_logs');
|
|
const importLogsModel = mongoose.model('import_logs');
|
|
|
|
+const priceInfoIndexModel = mongoose.model('std_price_info_index');
|
|
|
|
+
|
|
|
|
+
|
|
|
|
|
|
async function getLibs(query) {
|
|
async function getLibs(query) {
|
|
return await priceInfoLibModel.find(query).lean();
|
|
return await priceInfoLibModel.find(query).lean();
|
|
@@ -532,6 +537,85 @@ async function editClassData(updateData) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+//计算指标平均值
|
|
|
|
+function calcIndexAvg (period, areaID,compilationID,preCodeMap){
|
|
|
|
+ const newData = [];
|
|
|
|
+ for(const code in preCodeMap){
|
|
|
|
+ const indexArr = preCodeMap[code];
|
|
|
|
+ let total = 0;
|
|
|
|
+
|
|
|
|
+ for(const index of indexArr){
|
|
|
|
+ total = scMathUtil.roundForObj(total + index,2);
|
|
|
|
+ }
|
|
|
|
+ const avg = scMathUtil.roundForObj(total/indexArr.length,2);
|
|
|
|
+ newData.push({ID:uuidV1(),code,period,areaID,compilationID,index:avg})
|
|
|
|
+ }
|
|
|
|
+ return newData
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+//一个月里有classCode相同,但是价格不同的情况,取平均值
|
|
|
|
+function getClassCodePriceAvgMap (items){
|
|
|
|
+ const classCodeMap = {};
|
|
|
|
+ for(const b of items){
|
|
|
|
+ classCodeMap[b.classCode]?classCodeMap[b.classCode].push(b):classCodeMap[b.classCode]=[b];
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for(const classCode in classCodeMap){
|
|
|
|
+ const baseItems = classCodeMap[classCode];
|
|
|
|
+ const item = baseItems[0];
|
|
|
|
+ if(baseItems.length > 1){
|
|
|
|
+ let sum = 0;
|
|
|
|
+ for(const b of baseItems){
|
|
|
|
+ sum += parseFloat(b.noTaxPrice);
|
|
|
|
+ }
|
|
|
|
+ classCodeMap[classCode] = {code:item.code,name:item.name,price:scMathUtil.roundForObj(sum/baseItems.length,2)};
|
|
|
|
+ }else{
|
|
|
|
+ classCodeMap[classCode] = {code:item.code,name:item.name,price:parseFloat(item.noTaxPrice)}
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return classCodeMap
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+async function calcPriceIndex(libID,period, areaID,compilationID){
|
|
|
|
+ const baseItems = await priceInfoItemModel.find({areaID,period:'2022年-01月'}).lean();//以珠海 22年1月的数据为基准
|
|
|
|
+ const currentItems = await priceInfoItemModel.find({areaID,period}).lean();
|
|
|
|
+ const preCodeMap = {};//编码前4位-指数映射
|
|
|
|
+ const baseAvgMap = getClassCodePriceAvgMap(baseItems);
|
|
|
|
+ const currentAvgMap = getClassCodePriceAvgMap(currentItems);
|
|
|
|
+
|
|
|
|
+ let message = '';
|
|
|
|
+
|
|
|
|
+ for(const classCode in currentAvgMap){
|
|
|
|
+ const c = currentAvgMap[classCode];
|
|
|
|
+ const preCode = c.code.substr(0,4);
|
|
|
|
+ let index = 1;
|
|
|
|
+ const baseItem = baseAvgMap[classCode];
|
|
|
|
+ const tem = {index,classCode,name:c.name,code:c.code};
|
|
|
|
+
|
|
|
|
+ if(baseItem && baseItem.price){//一个月份里有多个值时,先取平均再计算
|
|
|
|
+ index = scMathUtil.roundForObj(c.price/baseItem.price,2);
|
|
|
|
+ tem.baseName = baseItem.name;
|
|
|
|
+ }
|
|
|
|
+ tem.index = index;
|
|
|
|
+ if(Math.abs(index - 1) > 0.2){
|
|
|
|
+ const string = `classCode:${tem.classCode},编号:${tem.code},基础名称:${tem.baseName},当前库中名称:${tem.name},指数:${tem.index};\n`;
|
|
|
|
+ message +=string;
|
|
|
|
+ console.log(string)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ preCodeMap[preCode]?preCodeMap[preCode].push(index):preCodeMap[preCode]=[index];
|
|
|
|
+ }
|
|
|
|
+ const newIndexData = calcIndexAvg(period, areaID,compilationID,preCodeMap)
|
|
|
|
+ //删除旧数据
|
|
|
|
+ await priceInfoIndexModel.deleteMany({areaID,period});
|
|
|
|
+ //插入新数据
|
|
|
|
+ await priceInfoIndexModel.insertMany(newIndexData);
|
|
|
|
+ return message;
|
|
|
|
+}
|
|
|
|
+
|
|
module.exports = {
|
|
module.exports = {
|
|
getLibs,
|
|
getLibs,
|
|
createLib,
|
|
createLib,
|
|
@@ -546,6 +630,7 @@ module.exports = {
|
|
insertAreas,
|
|
insertAreas,
|
|
deleteAreas,
|
|
deleteAreas,
|
|
getClassData,
|
|
getClassData,
|
|
|
|
+ calcPriceIndex,
|
|
getPriceData,
|
|
getPriceData,
|
|
editPriceData,
|
|
editPriceData,
|
|
editClassData
|
|
editClassData
|