Commit bd25b882 by chenjinjing

no message

parent 2a92cb38
......@@ -881,8 +881,9 @@
},
"node_modules/express-history-api-fallback": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/express-history-api-fallback/-/express-history-api-fallback-2.2.1.tgz",
"integrity": "sha1-OirSf3vryQ/FM9EQ18bYMJe80Fc="
"resolved": "https://registry.npmmirror.com/express-history-api-fallback/-/express-history-api-fallback-2.2.1.tgz",
"integrity": "sha512-swxwm3aP8vrOOvlzOdZvHlSZtJGwHKaY94J6AkrAgCTmcbko3IRwbkhLv2wKV1WeZhjxX58aLMpP3atDBnKuZg==",
"license": "ISC"
},
"node_modules/express/node_modules/qs": {
"version": "6.7.0",
......@@ -3634,8 +3635,8 @@
},
"express-history-api-fallback": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/express-history-api-fallback/-/express-history-api-fallback-2.2.1.tgz",
"integrity": "sha1-OirSf3vryQ/FM9EQ18bYMJe80Fc="
"resolved": "https://registry.npmmirror.com/express-history-api-fallback/-/express-history-api-fallback-2.2.1.tgz",
"integrity": "sha512-swxwm3aP8vrOOvlzOdZvHlSZtJGwHKaY94J6AkrAgCTmcbko3IRwbkhLv2wKV1WeZhjxX58aLMpP3atDBnKuZg=="
},
"extend": {
"version": "3.0.2",
......
......@@ -29,7 +29,6 @@
"ws": "^5.2.2",
"xml2js": "^0.4.23"
},
"devDependencies": {},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
......
......@@ -104,10 +104,10 @@ export async function caiShouList(zhongYangType:number, dId:string, plantType:nu
let {csId, plantType, dIdList, operationTime, weight, ct } = item;
let dIds = dIdList;
let didStr = "";
let purpose = "";
let purpose = "-";
dIds.forEach(dId => {
didStr += `${diKuaiMap[dId].code} `;
purpose += `${changeEnumValue(PURPOSE, diKuaiMap[dId].purpose)} `;
purpose = `${changeEnumValue(PURPOSE, diKuaiMap[dId].purpose)} `;
});
let operationTimeNum;
if (operationTime) operationTimeNum = operationTime;
......@@ -115,7 +115,7 @@ export async function caiShouList(zhongYangType:number, dId:string, plantType:nu
dataList.push({
csId,
plantType:changeEnumValue(PLANTTYPE, plantType),
code:didStr,
code:didStr || "-",
purpose,
operationTime:moment(operationTimeNum).format("YYYY-MM-DD"),
weight,
......
......@@ -189,8 +189,8 @@ export async function nongZiListToPage(nzType:number, dId:string, useTime:number
let dikuaiList = await dikuaiData.selectToParam({});
let diKuaiMap = {};
dikuaiList.forEach(info => {
let {dId, code} = info;
diKuaiMap[dId] = code;
let {dId, code, purpose} = info;
diKuaiMap[dId] = {code, purpose};
});
let nongziList = await nongziData.findDataToParamToSortPage( param, {useTime:-1}, pageNumber );
......@@ -204,7 +204,8 @@ export async function nongZiListToPage(nzType:number, dId:string, useTime:number
let purpose = "";
let size = "";
dIdList.forEach(dId => {
didStr += `${diKuaiMap[dId] || "-"}`;
didStr += `${diKuaiMap[dId].code || "-"}`;
purpose = diKuaiMap[dId].purpose;
})
dataList.push({
nzId,
......
......@@ -54,7 +54,7 @@ export async function adminUserLogin(loginId:string, pwd:string) {
* @param userInfo
*/
export async function adminUserLogout(reqUserInfo) {
let userInfo = await findUserInfoByUserId(reqUserInfo.userId);
let userInfo = await findUserInfoByUserId(reqUserInfo.userid);
userInfo.adminToken = getToken(userInfo.loginId);
userInfo.adminTokenMs = new Date().valueOf();
......@@ -65,10 +65,9 @@ export async function adminUserLogout(reqUserInfo) {
}
/**
* 统计页产量统计
* @param type
* @param type 统计类型:1-年,2-季度,3-月
* @returns
*/
export async function homePageStatisChanLiang(type:number) {
......@@ -82,7 +81,7 @@ export async function homePageStatisChanLiang(type:number) {
let {ct, weight} = info;
let year = moment(ct).year();
let month = moment(ct).month();
let month = moment(ct).month() + 1;
if (!map1[''+year+''+month]) map1[''+year+''+month] = {month, year, totalWeight:0}
map1[''+year+''+month].totalWeight += weight;
})
......@@ -205,5 +204,163 @@ export async function homePageStatisChanLiang(type:number) {
/**
* 统计页产量统计
* @param year 年份,如 2025
* @param type 统计类型:1-年,2-季度,3-月
* @returns
*/
// export async function homePageStatisChanLiang(year: number, type: number) {
// // 产量 时间分
// let zuoWuMonthDBList = await caishouData.selectToParam({plantType:{"$lt":PLANTTYPE.鲈鱼}});
// let zuoWuDistinctMap = {};
// let zuoWuCount = 0;
// let map1 = {};
// zuoWuMonthDBList.forEach(info => {
// let {ct, weight} = info;
// let dataYear = moment(ct).year();
// let month = moment(ct).month();
// // 添加年份过滤
// if (year && dataYear !== year) {
// return;
// }
// if (!map1[''+dataYear+''+month]) map1[''+dataYear+''+month] = {month, year: dataYear, totalWeight:0}
// map1[''+dataYear+''+month].totalWeight += weight;
// })
// let list1 = Object.values(map1);
// list1.forEach(info => {
// let {year: dataYear, month, totalWeight}: any = info;
// let strKey: any = "";
// if (type == 1) {//年
// strKey = dataYear;
// } else if (type == 2) {//季度
// let quarter = 1;
// if (month >= 10) quarter = 4;
// else if (month >= 7) quarter = 3;
// else if (month >= 4) quarter = 2;
// strKey = `${dataYear}-${quarter}`;
// } else {//月
// strKey = `${dataYear}-${month}`;
// }
// if (!zuoWuDistinctMap[strKey]) zuoWuDistinctMap[strKey] = {key: strKey, value: 0};
// zuoWuDistinctMap[strKey].value += totalWeight;
// zuoWuCount += totalWeight;
// });
// let nongChanPin = Object.values(zuoWuDistinctMap);
// for (let i = 0; i < nongChanPin.length; i++) {
// nongChanPin[i]["value"] = Math.ceil(nongChanPin[i]["value"] / 10) / 100;
// }
// // 农作物产量 - 添加年份过滤条件
// let zuoWuDBList = await selectChanLiangOfzuoWu({
// plantType: {"$lt": PLANTTYPE.鲈鱼},
// ...(year && {year: year}) // 如果有年份参数,添加过滤条件
// });
// let zuoWu = [];
// zuoWuDBList.forEach(info => {
// let {_id, totalWeight} = info;
// zuoWu.push({
// key: changeEnumValue(PLANTTYPE, _id),
// value: totalWeight / 1000
// });
// });
// zuoWu.sort((a, b) => {return b.value - a.value});
// // 产量
// let shuiChanMonthDBList = await selectChanLiangOfMonth({plantType:{"$gte":PLANTTYPE.鲈鱼}});
// let shuiChanDistinctMap = {};
// let shuiChanCount = 0;
// shuiChanMonthDBList.forEach(info => {
// let {year: dataYear, month, totalWeight} = info;
// // 添加年份过滤
// if (year && dataYear !== year) {
// return;
// }
// let strKey = "";
// if (type == 1) {//年
// strKey = dataYear;
// } else if (type == 2) {//季度
// let quarter = 1;
// if (month >= 10) quarter = 4;
// else if (month >= 7) quarter = 3;
// else if (month >= 4) quarter = 2;
// strKey = `${dataYear}-${quarter}`;
// } else {//月
// strKey = `${dataYear}-${month}`;
// }
// if (!shuiChanDistinctMap[strKey]) shuiChanDistinctMap[strKey] = {key: strKey, value: 0};
// shuiChanDistinctMap[strKey].value += totalWeight;
// shuiChanCount += totalWeight;
// });
// let shuiChanPin = Object.values(shuiChanDistinctMap);
// for (let i = 0; i < shuiChanPin.length; i++) {
// shuiChanPin[i]["value"] = Math.ceil(shuiChanPin[i]["value"] / 100) / 100;
// }
// // 水产品产量 - 添加年份过滤条件
// let shuiChanDBList = await selectChanLiangOfzuoWu({
// plantType: {"$gte": PLANTTYPE.鲈鱼},
// ...(year && {year: year}) // 如果有年份参数,添加过滤条件
// });
// let shuiChan = [];
// shuiChanDBList.forEach(info => {
// let {_id, totalWeight} = info;
// shuiChan.push({
// key: changeEnumValue(PLANTTYPE, _id),
// value: totalWeight / 10000
// });
// });
// shuiChan.sort((a, b) => {return b.value - a.value});
// // 水产品种植统计 - 添加年份过滤条件
// let shuiChanZhognYang = [];
// let shuiChanZhognYangCount = 0;
// let zhognYangDBList = await zhongZhiData.zhongYangTongJiCountByYear(year);
// zhognYangDBList.forEach(info => {
// let {_id, sizeCount} = info;
// shuiChanZhognYang.push({
// key: changeEnumValue(PLANTTYPE, _id),
// value: sizeCount
// });
// shuiChanZhognYangCount += sizeCount;
// });
// let dataInfo = {
// zuoWu: {
// count: Math.ceil(zuoWuCount / 10) / 100,
// nongChanPin,
// zuoWu: zuoWu,
// },
// shuiChan: {
// count: Math.ceil(shuiChanCount / 100) / 100,
// shuiChanPin,
// shuiChan,
// },
// shuiChanZhognYang: {
// shuiChanZhognYangList: shuiChanZhognYang,
// count: shuiChanZhognYangCount,
// }
// };
// return {dataInfo};
// }
......@@ -65,11 +65,11 @@ export async function xiaoShouList(quXiang:number, plantType:number, operationTi
param.operationTime = {"$gte":startMs, "$lte":endMs};
}
let nongShiList = await xiaoshouData.findDataToParamToSortPage(param, {operationTime:-1}, pageNumber);
let xiaoShouData = await xiaoshouData.findDataToParamToSortPage(param, {operationTime:-1}, pageNumber);
let dataCount = await xiaoshouData.selectCountByParam(param);
let dataList = [];
nongShiList.forEach(item => {
xiaoShouData.forEach(item => {
let {xsId, plantType, quXiang, operationTime, weight } = item;
dataList.push({
......
......@@ -79,13 +79,19 @@ export async function zhongYangDangQianListToPage(zhongYangType:number, plantTyp
let dataCount = await zhongzhiData.findDataToParamCouant(param);
let dataList = [];
zyList.forEach(info => {
let code = "-";
let purpose = "-";
if (diKuaiMap[info.dId]) {
code = diKuaiMap[info.dId].code;
purpose = changeEnumValue(PURPOSE, diKuaiMap[info.dId].purpose);
}
let addInfo = {
zId : info.zId,
size : info.size,
plantType : changeEnumValue(PLANTTYPE, info.plantType),
code:diKuaiMap[info.dId].code,
code,
plantTime:moment(info.plantTime).format("YYYY-MM-DD"),
purpose:changeEnumValue(PURPOSE, diKuaiMap[info.dId].purpose),
purpose,
plantTimeNum:info.plantTime,
ctTime:moment(info.ct).format("YYYY-MM-DD"),
};
......
......@@ -14,12 +14,11 @@ import { changeEnumValue } from "../util/verificationEnum";
import { selectChanLiangOfMonth } from "../data/caishou";
export async function getDataOut() {
let 种植总面积 = 0;
let 粮田面积 = 0;
let 菜田面积 = 0;
let 作物数量 = 0; isEnd: 0
let 作物数量 = 0;
let zhongZhiList = await zhongZhiTongJiCount({ isEnd: 0, plantType:{"$lt":PLANTTYPE.鲈鱼}});
let zhongZhiZuoWuList = []; //结果
......@@ -73,177 +72,478 @@ export async function getDataOut() {
});
let nongZiList = Object.values(农资情况Map); //结果
// 获取今年的时间范围
const currentYear = moment().year();
const startOfYear = moment().startOf('year');
const endOfYear = moment().endOf('year');
// 获取近两个月的时间范围(只用于趋势图)
const startOfTwoMonthsAgo = moment().subtract(2, 'months');
const endOfCurrentMonth = moment();
// 1. 肥料用药情况趋势图(feiliaoyongyaoqingkuang)改为近两个月
let nongZiAllMonthList = await nongziData.selectToParam({});
let nongZiCountInfo = {};//肥料用药情况
let nongZiCountInfo = {};
nongZiCountInfo[NONGZITYPE.农药] = {};
nongZiCountInfo[NONGZITYPE.肥料] = {};
// let lastMonthMs = moment().startOf('M').valueOf()
nongZiAllMonthList.forEach(info => {
let {useTime, count, nzType} = info;
// if (useTime < lastMonthMs ) return
let { useTime, count, nzType } = info;
const date = moment(useTime);
// 只保留近两个月内的数据(趋势图用)
if (date < startOfTwoMonthsAgo || date > endOfCurrentMonth) return;
let keyNum = 1;
switch (nzType) {
case NONGZITYPE.磷肥:
case NONGZITYPE.水溶肥:
case NONGZITYPE.有机肥:
case NONGZITYPE.复合肥:keyNum = NONGZITYPE.肥料; break;
case NONGZITYPE.好力克:
case NONGZITYPE.复合肥:
keyNum = NONGZITYPE.肥料; break;
case NONGZITYPE.好力克:
case NONGZITYPE.奥罗:
case NONGZITYPE.银法利:
case NONGZITYPE.啶虫脒:
case NONGZITYPE.龙克均:
case NONGZITYPE.三令:
case NONGZITYPE.追肥保果素:keyNum = NONGZITYPE.农药; break;
case NONGZITYPE.追肥保果素:
keyNum = NONGZITYPE.农药; break;
}
if (nongZiCountInfo[keyNum]) {
let keyStr = getKey(useTime);
let keyStr = date.format('YYMMDD');
if (!nongZiCountInfo[keyNum][keyStr]) nongZiCountInfo[keyNum][keyStr] = 0;
nongZiCountInfo[keyNum][keyStr] += count;
};
}
});
let 肥料 = [];
// 收集所有有数据的日期(肥料和用药)
let allDatesSet = new Set();
Object.keys(nongZiCountInfo[NONGZITYPE.肥料] || {}).forEach(dateStr => allDatesSet.add(dateStr));
Object.keys(nongZiCountInfo[NONGZITYPE.农药] || {}).forEach(dateStr => allDatesSet.add(dateStr));
let sortedDates = Array.from(allDatesSet).sort((a, b) => moment(a, 'YYMMDD').valueOf() - moment(b, 'YYMMDD').valueOf());
let 肥料 = [];
let 用药 = [];
let allKeyList = getAllKey(new Date().valueOf());
for (let i = 0; i < allKeyList.length; i++) {
let key = allKeyList[i];
for (let i = 0; i < sortedDates.length; i++) {
let key = sortedDates[i];
肥料.push({
key,
value:nongZiCountInfo[NONGZITYPE.肥料][key] || 0
value: nongZiCountInfo[NONGZITYPE.肥料][key] || 0
});
用药.push({
key,
value:nongZiCountInfo[NONGZITYPE.农药][key] || 0
value: nongZiCountInfo[NONGZITYPE.农药][key] || 0
});
}
let feiliaoyongyaoqingkuang = [ //结果
{name:"肥料", data:肥料},
{name:"用药", data:用药},
let feiliaoyongyaoqingkuang = [
{ name: "肥料", data: 肥料 },
{ name: "用药", data: 用药 },
];
let nongShiCount = await nongshiData.selectCountByParam({}); //结果
// 2. 农事操作趋势图(nongShiList)改为近两个月,农事操作总数改为今年数据
let nongshiTyptList = await nongshiData.selectToParam({});
let nongShiCount = 0; // 改为统计今年的农事操作数量
let 操作趋势 = {};
let nongShiList = [];//结果
let nongShiList = [];
nongshiTyptList.forEach(info => {
let {nsType, operationTime} = info;
let key = getKey(operationTime);
let { operationTime } = info;
const date = moment(operationTime);
// 统计今年的农事操作总数
if (date >= startOfYear && date <= endOfYear) {
nongShiCount += 1;
}
// 趋势图数据:只保留近两个月内的数据
if (date < startOfTwoMonthsAgo || date > endOfCurrentMonth) return;
let key = date.format('YYMMDD');
if (!操作趋势[key]) 操作趋势[key] = 0;
操作趋势[key] += 1;;
操作趋势[key] += 1;
});
for (let i= 0; i < allKeyList.length; i++) {
let key = allKeyList[i];
// 按日期排序
let nongShiDates = Object.keys(操作趋势).sort((a, b) => moment(a, 'YYMMDD').valueOf() - moment(b, 'YYMMDD').valueOf());
for (let i = 0; i < nongShiDates.length; i++) {
let key = nongShiDates[i];
nongShiList.push({
key,
value:操作趋势[key] || 0
value: 操作趋势[key] || 0
});
}
let monthDBList = await caishouData.selectToParam({plantType:{"$lt":PLANTTYPE.鲈鱼}});
// 3. 作物产量趋势图(chanLiangList)改为近两个月,但汇总数据保持全年
let monthDBList = await caishouData.selectToParam({ plantType: { "$lt": PLANTTYPE.鲈鱼 } });
let 作物产量Map = {};
let 今年产量总数 = 0;
let 去年产量总数 = 0;
monthDBList.forEach(info => {
let {ct, weight} = info;
if (new Date(ct).getFullYear() == 2025) 今年产量总数 += weight;
let key = getKey(ct)
let { ct, weight } = info;
const date = moment(ct);
// 汇总数据:全年统计
if (date.year() === currentYear) {
今年产量总数 += weight;
} else if (date.year() === currentYear - 1) {
去年产量总数 += weight;
}
// 趋势图数据:只保留近两个月内的数据
if (date < startOfTwoMonthsAgo || date > endOfCurrentMonth) return;
let key = date.format('YYMMDD');
if (!作物产量Map[key]) 作物产量Map[key] = 0;
作物产量Map[key] += weight;
});
// 按日期排序
let chanLiangDates = Object.keys(作物产量Map).sort((a, b) => moment(a, 'YYMMDD').valueOf() - moment(b, 'YYMMDD').valueOf());
let 今年 = [];
let 去年 = [];
let 去年产量总数 = 0;
for (let i =0 ; i < allKeyList.length; i++) {
let key = allKeyList[i];
let changeValue = 作物产量Map[key] ? Math.round(作物产量Map[key]/1000*100)/100 : 0;
今年.push({key: key, value:changeValue || 0 });
去年.push({key: key, value:0 });
for (let i = 0; i < chanLiangDates.length; i++) {
let key = chanLiangDates[i];
let changeValue = 作物产量Map[key] ? Math.round(作物产量Map[key] / 1000 * 100) / 100 : 0;
今年.push({ key: key, value: changeValue });
去年.push({ key: key, value: 0 }); // 若需去年数据请自行补充逻辑
}
let chanLiangList = [ //结果
{name:"今年", data:今年},
{name:"去年", data:去年},
let chanLiangList = [
{ name: "今年", data: 今年 },
{ name: "去年", data: 去年 },
];
let 产量年同比 = 0;
if (今年产量总数 && 去年产量总数) {
产量年同比 = Math.round((今年产量总数 - 去年产量总数)/ 去年产量总数*10000)/100
}
let chanLiangStatisList = [//结果
{key:"作物产量", value:Math.round(今年产量总数/1000*100)/100},
{key:"同比", value:产量年同比}
];
let xiaoshouStartMs = moment().subtract(1, "months").startOf('month').valueOf();
let xiaoshouEndMs = moment().startOf('month').valueOf();
// 4. 销售趋势图(lastMonthXiaoShouList)改为近两个月,销售总量改为今年数据
let xiaoshouDBList = await xiaoshouData.selectToParam({});
let lastMonthXiaoShou = 0;
let lastMonthXiaoShou = 0; // 改为统计今年的销售总量
let lastMonthXiaoShouMap = {};
xiaoshouDBList.forEach(info => {
let {operationTime, weight} = info;
lastMonthXiaoShou += weight;
let key = getKey(operationTime);
let { operationTime, weight } = info;
const date = moment(operationTime);
// 汇总数据:统计今年的销售总量
if (date >= startOfYear && date <= endOfYear) {
lastMonthXiaoShou += weight;
}
// 趋势图数据:只保留近两个月内的数据
if (date < startOfTwoMonthsAgo || date > endOfCurrentMonth) return;
let key = date.format('YYMMDD');
if (!lastMonthXiaoShouMap[key]) lastMonthXiaoShouMap[key] = 0;
lastMonthXiaoShouMap[key] += weight;
});
// let lastMonthXiaoShouList = Object.values(lastMonthXiaoShouMap);//结果
// 按日期排序
let xiaoshouDates = Object.keys(lastMonthXiaoShouMap).sort((a, b) => moment(a, 'YYMMDD').valueOf() - moment(b, 'YYMMDD').valueOf());
let lastMonthXiaoShouList = [];
let allxiaoshouKeyList = getAllKey(new Date().valueOf());
for (let i = 0; i < allxiaoshouKeyList.length; i++) {
let key = allxiaoshouKeyList[i];
for (let i = 0; i < xiaoshouDates.length; i++) {
let key = xiaoshouDates[i];
let value = lastMonthXiaoShouMap[key] || 0;
lastMonthXiaoShouList.push({
key,
value:Math.round(value/1000*100)/100,
})
value: Math.round(value / 1000 * 100) / 100,
});
}
// 产量统计(全年数据)- chanLiangStatisList[0].value 已经是今年数据,无需修改
let 产量年同比 = 0;
if (今年产量总数 && 去年产量总数) {
产量年同比 = Math.round((今年产量总数 - 去年产量总数)/ 去年产量总数*10000)/100
}
let chanLiangStatisList = [//结果
{key:"作物产量", value:Math.round(今年产量总数/1000*100)/100},
{key:"同比", value:产量年同比}
];
// 返回结果
return {
zhongZhiZuoWuList,
zhongZhiTypeList,
nongZiList,
feiliaoyongyaoqingkuang,
nongShiList,
nongShiCount,
nongShiCount, // 现在是今年的农事操作总数
chanLiangList,
chanLiangStatisList,
lastMonthXiaoShou:Math.round(lastMonthXiaoShou/1000*100)/100,
chanLiangStatisList, // 第一个值已经是今年作物产量
lastMonthXiaoShou: Math.round(lastMonthXiaoShou / 1000 * 100) / 100, // 现在是今年的销售总量
lastMonthXiaoShouList
}
};
}
// export async function getDataOut() {
// let 种植总面积 = 0;
// let 粮田面积 = 0;
// let 菜田面积 = 0;
// let 作物数量 = 0;
// let zhongZhiList = await zhongZhiTongJiCount({ isEnd: 0, plantType:{"$lt":PLANTTYPE.鲈鱼}});
// let zhongZhiZuoWuList = []; //结果
// zhongZhiList.forEach(info => {
// let {_id, sizeCount} = info;
// 种植总面积 += sizeCount;
// if (_id == LIANGSHI.水稻 || _id == LIANGSHI.蚕豆) {
// 粮田面积 += sizeCount;
// } else if (_id < 100) {
// 菜田面积 += sizeCount;
// }
// if ( !(_id > 100 && _id < 200)) {
// 作物数量 += 1;
// zhongZhiZuoWuList.push({key:changeEnumValue(PLANTTYPE, _id), value:sizeCount});
// }
// });
// let diKuaiInfo = await diKuaiSizeCountByParam({plotType:PLOTTYPE.地块});
// let 地块使用率 = 0;
// if (diKuaiInfo.totalSize && diKuaiInfo.totalUseSize) {
// 地块使用率 = Math.round(diKuaiInfo.totalUseSize/diKuaiInfo.totalSize * 100);
// }
// let zhongZhiTypeList = [
// {key:"种植总面积", value:731},//种植总面积
// {key:"菜田面积", value:370},//菜田面积
// {key:"粮田面积", value:361},
// {key:"作物数量", value:作物数量},
// {key:"地块使用率", value:地块使用率},
// ]; //结果
// let 农资类型 = await nongziData.statisNongZiType();
// let 农资情况Map = {};
// 农资情况Map[NONGZITYPE.肥料] = {key:changeEnumValue(NONGZITYPE, NONGZITYPE.肥料), value:0, unit:"KG"};
// 农资情况Map[NONGZITYPE.农药] = {key:changeEnumValue(NONGZITYPE, NONGZITYPE.农药), value:0, unit:"G"};
// 农资情况Map[NONGZITYPE.药剂] = {key:changeEnumValue(NONGZITYPE, NONGZITYPE.药剂), value:0, unit:"ML"};
// 农资类型.forEach(info => {
// let {_id, count} = info;
// switch (_id) {
// case NONGZITYPE.磷肥:
// case NONGZITYPE.水溶肥:
// case NONGZITYPE.有机肥:
// case NONGZITYPE.复合肥:农资情况Map[NONGZITYPE.肥料].value += count;break;
// case NONGZITYPE.好力克:
// case NONGZITYPE.奥罗:
// case NONGZITYPE.银法利:
// case NONGZITYPE.啶虫脒:
// case NONGZITYPE.龙克均:
// case NONGZITYPE.三令: 农资情况Map[NONGZITYPE.药剂].value += count; break;
// case NONGZITYPE.追肥保果素:农资情况Map[NONGZITYPE.农药].value += count;break;
// }
// });
// let nongZiList = Object.values(农资情况Map); //结果
// // 获取近两个月的时间范围(只用于趋势图)
// const startOfTwoMonthsAgo = moment().subtract(2, 'months');
// const endOfCurrentMonth = moment();
// // 1. 肥料用药情况趋势图(feiliaoyongyaoqingkuang)改为近两个月
// let nongZiAllMonthList = await nongziData.selectToParam({});
// let nongZiCountInfo = {};
// nongZiCountInfo[NONGZITYPE.农药] = {};
// nongZiCountInfo[NONGZITYPE.肥料] = {};
// nongZiAllMonthList.forEach(info => {
// let { useTime, count, nzType } = info;
// const date = moment(useTime);
// // 只保留近两个月内的数据(趋势图用)
// if (date < startOfTwoMonthsAgo || date > endOfCurrentMonth) return;
// let keyNum = 1;
// switch (nzType) {
// case NONGZITYPE.磷肥:
// case NONGZITYPE.水溶肥:
// case NONGZITYPE.有机肥:
// case NONGZITYPE.复合肥:
// keyNum = NONGZITYPE.肥料; break;
// case NONGZITYPE.好力克:
// case NONGZITYPE.奥罗:
// case NONGZITYPE.银法利:
// case NONGZITYPE.啶虫脒:
// case NONGZITYPE.龙克均:
// case NONGZITYPE.三令:
// case NONGZITYPE.追肥保果素:
// keyNum = NONGZITYPE.农药; break;
// }
// if (nongZiCountInfo[keyNum]) {
// let keyStr = date.format('YYMMDD');
// if (!nongZiCountInfo[keyNum][keyStr]) nongZiCountInfo[keyNum][keyStr] = 0;
// nongZiCountInfo[keyNum][keyStr] += count;
// }
// });
// // 收集所有有数据的日期(肥料和用药)
// let allDatesSet = new Set();
// Object.keys(nongZiCountInfo[NONGZITYPE.肥料] || {}).forEach(dateStr => allDatesSet.add(dateStr));
// Object.keys(nongZiCountInfo[NONGZITYPE.农药] || {}).forEach(dateStr => allDatesSet.add(dateStr));
// let sortedDates = Array.from(allDatesSet).sort((a, b) => moment(a, 'YYMMDD').valueOf() - moment(b, 'YYMMDD').valueOf());
// let 肥料 = [];
// let 用药 = [];
// for (let i = 0; i < sortedDates.length; i++) {
// let key = sortedDates[i];
// 肥料.push({
// key,
// value: nongZiCountInfo[NONGZITYPE.肥料][key] || 0
// });
// 用药.push({
// key,
// value: nongZiCountInfo[NONGZITYPE.农药][key] || 0
// });
// }
// let feiliaoyongyaoqingkuang = [
// { name: "肥料", data: 肥料 },
// { name: "用药", data: 用药 },
// ];
// // 2. 农事操作趋势图(nongShiList)改为近两个月
// let nongshiTyptList = await nongshiData.selectToParam({});
// let nongShiCount = await nongshiData.selectCountByParam({}); //结果
// let 操作趋势 = {};
// let nongShiList = [];
// nongshiTyptList.forEach(info => {
// let { operationTime } = info;
// const date = moment(operationTime);
// // 只保留近两个月内的数据(趋势图用)
// if (date < startOfTwoMonthsAgo || date > endOfCurrentMonth) return;
// let key = date.format('YYMMDD');
// if (!操作趋势[key]) 操作趋势[key] = 0;
// 操作趋势[key] += 1;
// });
// // 按日期排序
// let nongShiDates = Object.keys(操作趋势).sort((a, b) => moment(a, 'YYMMDD').valueOf() - moment(b, 'YYMMDD').valueOf());
// for (let i = 0; i < nongShiDates.length; i++) {
// let key = nongShiDates[i];
// nongShiList.push({
// key,
// value: 操作趋势[key] || 0
// });
// }
// // 3. 作物产量趋势图(chanLiangList)改为近两个月,但汇总数据保持全年
// let monthDBList = await caishouData.selectToParam({ plantType: { "$lt": PLANTTYPE.鲈鱼 } });
// let 作物产量Map = {};
// let 今年产量总数 = 0;
// let 去年产量总数 = 0;
// monthDBList.forEach(info => {
// let { ct, weight } = info;
// const date = moment(ct);
// // 汇总数据:全年统计
// if (date.year() === 2025) {
// 今年产量总数 += weight;
// } else if (date.year() === 2024) {
// 去年产量总数 += weight;
// }
// // 趋势图数据:只保留近两个月内的数据
// if (date < startOfTwoMonthsAgo || date > endOfCurrentMonth) return;
// let key = date.format('YYMMDD');
// if (!作物产量Map[key]) 作物产量Map[key] = 0;
// 作物产量Map[key] += weight;
// });
// // 按日期排序
// let chanLiangDates = Object.keys(作物产量Map).sort((a, b) => moment(a, 'YYMMDD').valueOf() - moment(b, 'YYMMDD').valueOf());
// let 今年 = [];
// let 去年 = [];
// for (let i = 0; i < chanLiangDates.length; i++) {
// let key = chanLiangDates[i];
// let changeValue = 作物产量Map[key] ? Math.round(作物产量Map[key] / 1000 * 100) / 100 : 0;
// 今年.push({ key: key, value: changeValue });
// 去年.push({ key: key, value: 0 }); // 若需去年数据请自行补充逻辑
// }
// let chanLiangList = [
// { name: "今年", data: 今年 },
// { name: "去年", data: 去年 },
// ];
// // 4. 销售趋势图(lastMonthXiaoShouList)改为近两个月
// let xiaoshouDBList = await xiaoshouData.selectToParam({});
// let lastMonthXiaoShou = 0;
// let lastMonthXiaoShouMap = {};
// xiaoshouDBList.forEach(info => {
// let { operationTime, weight } = info;
// const date = moment(operationTime);
// // 汇总数据:全年统计
// lastMonthXiaoShou += weight;
// // 趋势图数据:只保留近两个月内的数据
// if (date < startOfTwoMonthsAgo || date > endOfCurrentMonth) return;
// let key = date.format('YYMMDD');
// if (!lastMonthXiaoShouMap[key]) lastMonthXiaoShouMap[key] = 0;
// lastMonthXiaoShouMap[key] += weight;
// });
// // 按日期排序
// let xiaoshouDates = Object.keys(lastMonthXiaoShouMap).sort((a, b) => moment(a, 'YYMMDD').valueOf() - moment(b, 'YYMMDD').valueOf());
// let lastMonthXiaoShouList = [];
// for (let i = 0; i < xiaoshouDates.length; i++) {
// let key = xiaoshouDates[i];
// let value = lastMonthXiaoShouMap[key] || 0;
// lastMonthXiaoShouList.push({
// key,
// value: Math.round(value / 1000 * 100) / 100,
// });
// }
// // 产量统计(全年数据)
// let 产量年同比 = 0;
// if (今年产量总数 && 去年产量总数) {
// 产量年同比 = Math.round((今年产量总数 - 去年产量总数)/ 去年产量总数*10000)/100
// }
// let chanLiangStatisList = [//结果
// {key:"作物产量", value:Math.round(今年产量总数/1000*100)/100},
// {key:"同比", value:产量年同比}
// ];
// // 返回结果
// return {
// zhongZhiZuoWuList,
// zhongZhiTypeList,
// nongZiList,
// feiliaoyongyaoqingkuang,
// nongShiList,
// nongShiCount,
// chanLiangList,
// chanLiangStatisList,
// lastMonthXiaoShou: Math.round(lastMonthXiaoShou / 1000 * 100) / 100,
// lastMonthXiaoShouList
// };
// }
function getKey(timestamp) {
const date = new Date(timestamp);
const date = new Date(timestamp);
// 计算当前时间所在周期的周一(UTC时间)
const day = date.getUTCDay(); // 0(周日)到6(周六)
const diff = day === 0 ? 6 : day - 1; // 计算到上周一的差值
const start = new Date(date);
start.setUTCDate(start.getUTCDate() - diff); // 回退到周一
start.setUTCHours(0, 0, 0, 0); // 设置为UTC零点
// 计算周期结束时间(周日)
const end = new Date(start);
end.setUTCDate(end.getUTCDate() + 6); // 周一 + 6天 = 周日
end.setUTCHours(23, 59, 59, 999); // 设置为周日最后一刻(可选)
// 计算当前时间所在周期的周一(UTC时间)
const day = date.getUTCDay(); // 0(周日)到6(周六)
const diff = day === 0 ? 6 : day - 1; // 计算到上周一的差值
const start = new Date(date);
start.setUTCDate(start.getUTCDate() - diff); // 回退到周一
start.setUTCHours(0, 0, 0, 0); // 设置为UTC零点
return `${moment(start).format("M/D")}-${moment(end).format("M/D")}`;
// 计算周期结束时间(周日)
const end = new Date(start);
end.setUTCDate(end.getUTCDate() + 6); // 周一 + 6天 = 周日
end.setUTCHours(23, 59, 59, 999); // 设置为周日最后一刻(可选)
return `${moment(start).format("M/D")}-${moment(end).format("M/D")}`;
}
function getAllKey(timestamp) {
let cycles = [];
for (let i = 7; i >=0 ; i--) {
let ms = moment(timestamp).subtract(i*7, 'd').valueOf();
cycles.push(getKey(ms))
}
return cycles;
for (let i = 7; i >=0 ; i--) {
let ms = moment(timestamp).subtract(i*7, 'd').valueOf();
cycles.push(getKey(ms))
}
return cycles;
}
export async function getGuiYuOut() {
......@@ -268,8 +568,6 @@ export async function getGuiYuOut() {
{key:"鱼苗养殖", value:`${count}万尾`},
];
let xiaoshouList = await xiaoshouData.selectToParam({plantType:{"$gt":100, "$lt":200}});
let xsjl = [];
xiaoshouList.forEach(info => {
......
/**
* 用户
* 水产养殖和销售数量数据库默认单位-万尾
*/
......@@ -143,47 +144,186 @@ export async function homePageStatisBottom(userInfo) {
}
/**
* 统计页产量统计
* @param type
* 统计页-农产品产量统计
* @param type 统计类型:1-年,2-季度,3-月
* @returns
*/
export async function homePageStatisChanLiang(type:number) {
// export async function homePageStatisChanLiang(type:number) {
// //产量 时间分
// let zuoWuMonthDBList = await caishouData.selectToParam({plantType:{"$lt":PLANTTYPE.鲈鱼}});
// let zuoWuDistinctMap = {};
// let zuoWuCount = 0;
// let map1 = {};
// zuoWuMonthDBList.forEach(info => {
// let {ct, weight} = info;
// let year = moment(ct).year();
// let month = moment(ct).month();
// if (!map1[''+year+''+month]) map1[''+year+''+month] = {month, year, totalWeight:0}
// map1[''+year+''+month].totalWeight += weight;
// })
// let list1 = Object.values(map1);
// list1.forEach(info => {
// let {year, month, totalWeight}:any = info;
// let strKey:any = "";
// if (type == 1) {//年
// strKey = year;
// } else if (type == 2) {//季度
// let quarter = 1;
// if (month >= 10) quarter = 4;
// else if (month >= 7) quarter = 3;
// else if (month >= 4) quarter = 2;
// strKey = `${year}-${quarter}`;
// } else {//月
// strKey = `${year}-${month}`;
// }
// if (!zuoWuDistinctMap[strKey]) zuoWuDistinctMap[strKey] = {key:strKey, value:0};
// zuoWuDistinctMap[strKey].value += totalWeight;
// zuoWuCount += totalWeight;
// });
// let nongChanPin = Object.values(zuoWuDistinctMap);
// for (let i = 0; i < nongChanPin.length; i++) {
// nongChanPin[i]["value"] = Math.ceil(nongChanPin[i]["value"] / 10)/100;
// }
// //农作物产量
// let zuoWuDBList = await selectChanLiangOfzuoWu({plantType:{"$lt":PLANTTYPE.鲈鱼}});
// let zuoWu = [];
// zuoWuDBList.forEach(info => {
// let {_id, totalWeight} = info;
// zuoWu.push({
// key:changeEnumValue(PLANTTYPE, _id),
// value:totalWeight/1000
// });
// });
// zuoWu.sort((a,b) =>{return b.value - a.value});
// //产量
// let shuiChanMonthDBList = await selectChanLiangOfMonth({plantType:{"$gte":PLANTTYPE.鲈鱼}});
// let shuiChanDistinctMap = {};
// let shuiChanCount = 0;
// shuiChanMonthDBList.forEach(info => {
// let {year, month, totalWeight} = info;
// let strKey = "";
// if (type == 1) {//年
// strKey = year;
// } else if (type == 2) {//季度
// let quarter = 1;
// if (month >= 10) quarter = 4;
// else if (month >= 7) quarter = 3;
// else if (month >= 4) quarter = 2;
// strKey = `${year}-${quarter}`;
// } else {//月
// strKey = `${year}-${month}`;
// }
// if (!shuiChanDistinctMap[strKey]) shuiChanDistinctMap[strKey] = {key:strKey, value:0};
// shuiChanDistinctMap[strKey].value += totalWeight;
// shuiChanCount += totalWeight;
// });
// let shuiChanPin = Object.values(shuiChanDistinctMap);
// //农作物产量
// let shuiChanDBList = await selectChanLiangOfzuoWu({plantType:{"$gte":PLANTTYPE.鲈鱼}});
// let shuiChan = [];
// shuiChanDBList.forEach(info => {
// let {_id, totalWeight} = info;
// shuiChan.push({
// key:changeEnumValue(PLANTTYPE, _id),
// value:totalWeight/10000
// });
// });
// shuiChan.sort((a,b) =>{return b.value - a.value});
//产量 时间分
let zuoWuMonthDBList = await caishouData.selectToParam({plantType:{"$lt":PLANTTYPE.鲈鱼}});
// let shuiChanZhognYang = [];
// let shuiChanZhognYangCount = 0;
// let zhognYangDBList = await zhongZhiData.zhongYangTongJiCount();
// zhognYangDBList.forEach(info => {
// let {_id, sizeCount} = info;
// shuiChanZhognYang.push({
// key:changeEnumValue(PLANTTYPE, _id),
// value:sizeCount
// });
// shuiChanZhognYangCount += sizeCount;
// });
// let dataInfo = {
// zuoWu:{
// count:Math.ceil(zuoWuCount/10)/100,
// nongChanPin,
// zuoWu:zuoWu,
// },
// shuiChan:{
// count:Math.ceil(shuiChanCount/100)/100,
// shuiChanPin,
// shuiChan,
// },
// shuiChanZhognYang:{
// shuiChanZhognYangList:shuiChanZhognYang,
// count:shuiChanZhognYangCount,
// }
// };
// return {dataInfo};
// }
/**
* 统计页-农产品产量统计
* @param year 年份参数,用于筛选对应年份的数据
* @param type 统计类型:2-季度,3-月
* @returns
*/
export async function homePageStatisChanLiang(year: number, type: number) {
// 产量 时间分
let zuoWuMonthDBList = await caishouData.selectToParam({plantType: {"$lt": PLANTTYPE.鲈鱼}});
let zuoWuDistinctMap = {};
let zuoWuCount = 0;
let map1 = {};
zuoWuMonthDBList.forEach(info => {
let {ct, weight} = info;
let {operationTime, weight} = info; // 使用operationTime而不是ct
let dataYear = 0;
let month = 0;
if (operationTime) {
dataYear = moment(operationTime).year();
month = moment(operationTime).month()+1;
}
// 只处理指定年份的数据
if (dataYear !== year) return;
let year = moment(ct).year();
let month = moment(ct).month();
if (!map1[''+year+''+month]) map1[''+year+''+month] = {month, year, totalWeight:0}
map1[''+year+''+month].totalWeight += weight;
if (!map1['' + dataYear + '' + month]) map1['' + dataYear + '' + month] = {month, year: dataYear, totalWeight: 0}
map1['' + dataYear + '' + month].totalWeight += weight;
})
let list1 = Object.values(map1);
let list1 = Object.values(map1);
list1.forEach(info => {
let {year, month, totalWeight}:any = info;
let {year: dataYear, month, totalWeight}: any = info;
let strKey:any = "";
if (type == 1) {//年
strKey = year;
} else if (type == 2) {//季度
let quarter = 1;
if (month >= 10) quarter = 4;
else if (month >= 7) quarter = 3;
else if (month >= 4) quarter = 2;
strKey = `${year}-${quarter}`;
let strKey: any = "";
if (type == 2) {//季度
let quarter = "第一季度";
if (month >= 10) quarter = "第四季度";
else if (month >= 7) quarter = "第三季度";
else if (month >= 4) quarter = "第二季度";
// strKey = `${dataYear}-${quarter}`;
strKey = `${quarter}`;
} else {//月
strKey = `${year}-${month}`;
strKey = `${dataYear}-${month}`;
}
if (!zuoWuDistinctMap[strKey]) zuoWuDistinctMap[strKey] = {key:strKey, value:0};
if (!zuoWuDistinctMap[strKey]) zuoWuDistinctMap[strKey] = {key: strKey, value: 0};
zuoWuDistinctMap[strKey].value += totalWeight;
zuoWuCount += totalWeight;
......@@ -191,91 +331,142 @@ export async function homePageStatisChanLiang(type:number) {
let nongChanPin = Object.values(zuoWuDistinctMap);
for (let i = 0; i < nongChanPin.length; i++) {
nongChanPin[i]["value"] = Math.ceil(nongChanPin[i]["value"] / 10)/100;
nongChanPin[i]["value"] = Math.ceil(nongChanPin[i]["value"] / 10) / 100;
}
//农作物产量
let zuoWuDBList = await selectChanLiangOfzuoWu({plantType:{"$lt":PLANTTYPE.鲈鱼}});
// 农作物产量 - 需要根据年份筛选
let zuoWuDBList = await selectChanLiangOfzuoWu({plantType: {"$lt": PLANTTYPE.鲈鱼}});
let zuoWu = [];
zuoWuDBList.forEach(info => {
let {_id, totalWeight} = info;
let zuoWuTotalWeight = 0;
// 注意:这里需要重新查询原始数据来按年份筛选
let zuoWuRawData = await caishouData.selectToParam({plantType: {"$lt": PLANTTYPE.鲈鱼}});
let zuoWuMap = {};
zuoWuRawData.forEach(info => {
let {plantType, weight, operationTime} = info;
let dataYear = 0;
if (operationTime) dataYear = moment(operationTime).year();
// 只处理指定年份的数据
if (dataYear !== year) return;
if (!zuoWuMap[plantType]) zuoWuMap[plantType] = 0;
zuoWuMap[plantType] += weight;
});
// 将map转换为数组
Object.keys(zuoWuMap).forEach(plantType => {
let weight = zuoWuMap[plantType];
zuoWu.push({
key:changeEnumValue(PLANTTYPE, _id),
value:totalWeight/1000
key: changeEnumValue(PLANTTYPE, parseInt(plantType)),
value: weight / 1000
});
zuoWuTotalWeight += weight;
});
zuoWu.sort((a, b) => {
return b.value - a.value
});
zuoWu.sort((a,b) =>{return b.value - a.value});
//产量
let shuiChanMonthDBList = await selectChanLiangOfMonth({plantType:{"$gte":PLANTTYPE.鲈鱼}});
// 产量
let shuiChanMonthDBList = await selectChanLiangOfMonth({plantType: {"$gte": PLANTTYPE.鲈鱼}});
let shuiChanDistinctMap = {};
let shuiChanCount = 0;
shuiChanMonthDBList.forEach(info => {
let {year, month, totalWeight} = info;
let {year: dataYear, month, totalWeight} = info;
// 只处理指定年份的数据
if (dataYear !== year) return;
let strKey = "";
if (type == 1) {//年
strKey = year;
} else if (type == 2) {//季度
let quarter = 1;
if (month >= 10) quarter = 4;
else if (month >= 7) quarter = 3;
else if (month >= 4) quarter = 2;
strKey = `${year}-${quarter}`;
let strKey = `${dataYear}-${month}`;
if (type == 2) {//季度
let quarter = "第一季度";
if (month >= 10) quarter = "第四季度";
else if (month >= 7) quarter = "第三季度";
else if (month >= 4) quarter = "第二季度";
// strKey = `${dataYear}-${quarter}`;
strKey = `${quarter}`;
} else {//月
strKey = `${year}-${month}`;
strKey = `${dataYear}-${month}`;
}
if (!shuiChanDistinctMap[strKey]) shuiChanDistinctMap[strKey] = {key:strKey, value:0};
shuiChanDistinctMap[strKey].value += totalWeight;
if (!shuiChanDistinctMap[strKey]) shuiChanDistinctMap[strKey] = {key: strKey, value: 0};
// 水产单位转换:万尾 → 尾
let weightInTail = totalWeight * 10000;
shuiChanDistinctMap[strKey].value += weightInTail;
shuiChanCount += totalWeight;
shuiChanCount += weightInTail;
});
let shuiChanPin = Object.values(shuiChanDistinctMap);
/**重复换算了 */
// for (let i = 0; i < nongChanPin.length; i++) {
// nongChanPin[i]["value"] = Math.ceil(nongChanPin[i]["value"] / 100)/100;
// }
//农作物产量
let shuiChanDBList = await selectChanLiangOfzuoWu({plantType:{"$gte":PLANTTYPE.鲈鱼}});
// 水产品产量 - 需要根据年份筛选
let shuiChanDBList = await selectChanLiangOfzuoWu({plantType: {"$gte": PLANTTYPE.鲈鱼}});
let shuiChan = [];
shuiChanDBList.forEach(info => {
let {_id, totalWeight} = info;
let shuiChanTotalWeight = 0;
// 注意:这里也需要重新查询原始数据来按年份筛选
let shuiChanRawData = await caishouData.selectToParam({plantType: {"$gte": PLANTTYPE.鲈鱼}});
let shuiChanMap = {};
shuiChanRawData.forEach(info => {
let {plantType, weight, operationTime} = info;
let dataYear = 0;
if (operationTime) dataYear = moment(operationTime).year();
// 只处理指定年份的数据
if (dataYear !== year) return;
if (!shuiChanMap[plantType]) shuiChanMap[plantType] = 0;
// 水产单位转换:万尾 → 尾
let weightInTail = weight * 10000;
shuiChanMap[plantType] += weightInTail;
});
// 将map转换为数组
Object.keys(shuiChanMap).forEach(plantType => {
let weight = shuiChanMap[plantType];
shuiChan.push({
key:changeEnumValue(PLANTTYPE, _id),
value:totalWeight/10000
key: changeEnumValue(PLANTTYPE, parseInt(plantType)),
value: weight,
});
shuiChanTotalWeight += weight;
});
shuiChan.sort((a, b) => {
return b.value - a.value
});
shuiChan.sort((a,b) =>{return b.value - a.value});
let shuiChanZhognYang = [];
let shuiChanZhognYangCount = 0;
let zhognYangDBList = await zhongZhiData.zhongYangTongJiCount();
// 使用带年份筛选的方法
let zhognYangDBList = await zhongZhiData.zhongYangTongJiCountByYear(year);
zhognYangDBList.forEach(info => {
let {_id, sizeCount} = info;
// 水产单位转换:万尾 → 尾
let weightInTail = sizeCount * 10000;
shuiChanZhognYang.push({
key:changeEnumValue(PLANTTYPE, _id),
value:sizeCount
key: changeEnumValue(PLANTTYPE, _id),
value: weightInTail
});
shuiChanZhognYangCount += sizeCount;
shuiChanZhognYangCount += weightInTail;
});
let dataInfo = {
zuoWu:{
count:Math.ceil(zuoWuCount/10)/100,
nongChanPin,
zuoWu:zuoWu,
zuoWu: {
count: Math.ceil(zuoWuCount / 10) / 100, //农产品产量总数
nongChanPin, //农产品产量趋势
zuoWu: zuoWu, //农产品产量分类
},
shuiChan:{
count:Math.ceil(shuiChanCount/100)/100,
shuiChanPin,
shuiChan,
shuiChan: {
count: Math.ceil(shuiChanCount / 100) / 100, //水产品产量总数
shuiChanPin, //水产品产量
shuiChan, //水产品产量分类
},
shuiChanZhognYang:{
shuiChanZhognYangList:shuiChanZhognYang,
count:shuiChanZhognYangCount,
shuiChanZhognYang: {
shuiChanZhognYangList: shuiChanZhognYang,
count: shuiChanZhognYangCount,
}
};
......@@ -284,96 +475,301 @@ export async function homePageStatisChanLiang(type:number) {
}
/**
* 统计页销售量统计
* @param type
* @param year 年份参数,用于筛选对应年份的数据
* @returns
*/
export async function homePageStatisXiaoShou() {
let thisYear = new Date().getFullYear();
//产量
let monthDBList = await selectXiaoShouOfMonth({plantType:{"$lt":PLANTTYPE.鲈鱼}});
export async function homePageStatisXiaoShou(year?: number) {
// 构建查询条件,添加年份过滤
let currentYear = year || moment().year();
let startOfYear = moment().year(currentYear).startOf('year').valueOf();
let endOfYear = moment().year(currentYear).endOf('year').valueOf();
let timeFilter = {
operationTime: {
"$gte": startOfYear,
"$lte": endOfYear
}
};
// 农作物销售查询参数
let nonzuowuParam = {
...timeFilter,
plantType: {"$lt": PLANTTYPE.鲈鱼}
};
// 水产品销售查询参数
let shuichanParam = {
...timeFilter,
plantType: {"$gte": PLANTTYPE.鲈鱼}
};
// 农作物销售量统计
let monthDBList = await selectXiaoShouOfMonth(nonzuowuParam);
let distinctMap = {};
let count = 0;
let lastYearCount = 0;
// let lastYearCount = 0;
monthDBList.forEach(info => {
let {year, month, totalWeight} = info;
let strKey = `${year}-${month}`;
// if (type == 2) {//季度
// let quarter = "第一季度";
// if (month >= 10) quarter = "第四季度";
// else if (month >= 7) quarter = "第三季度";
// else if (month >= 4) quarter = "第二季度";
// // strKey = `${year}-${quarter}`;
// strKey = `${quarter}`;
// } else {//月
// strKey = `${year}-${month}`;
// }
if (!distinctMap[strKey]) distinctMap[strKey] = {key:strKey, value:0};
distinctMap[strKey].value += totalWeight;
if (thisYear == year) count += totalWeight;
else if (year == (thisYear-1)) lastYearCount += totalWeight;
if (currentYear == year) count += totalWeight;
// else if (year == (currentYear-1)) lastYearCount += totalWeight;
});
let xiaoShouList = Object.values(distinctMap);
let xiaoShouDBList = await selectXiaoShouOfzuoWu({plantType:{"$lt":PLANTTYPE.鲈鱼}});
let xiaoShouDBList = await selectXiaoShouOfzuoWu(nonzuowuParam);
let xiaoShou = [];
xiaoShouDBList.forEach(info => {
let {_id, totalWeight} = info;
xiaoShou.push({
key:changeEnumValue(PLANTTYPE, _id),
value:Math.ceil(totalWeight/10)/100
key: changeEnumValue(PLANTTYPE, _id),
value: Math.ceil(totalWeight/10)/100
});
});
xiaoShou.sort((a,b) =>{return b.value - a.value});
xiaoShou.sort((a,b) => {return b.value - a.value});
for (let i = 0; i < xiaoShouList.length; i++) {
xiaoShouList[i]["value"] = Math.ceil(xiaoShouList[i]["value"] / 10)/100;
xiaoShouList[i]["value"] = Math.ceil(xiaoShouList[i]["value"] / 10)/100;
}
//水产
//产量
let shuiChanMonthDBList = await selectXiaoShouOfMonth({plantType:{"$gte":PLANTTYPE.鲈鱼}});
// 水产品销售量统计
let shuiChanMonthDBList = await selectXiaoShouOfMonth(shuichanParam);
let shuiChanDistinctMap = {};
let shuiChanCount = 0;
let suiChanLastYearCount = 0;
// let suiChanLastYearCount = 0;
shuiChanMonthDBList.forEach(info => {
let {year, month, totalWeight} = info;
let strKey = `${year}-${month}`;
// if (type == 2) {//季度
// let quarter = "第一季度";
// if (month >= 10) quarter = "第四季度";
// else if (month >= 7) quarter = "第三季度";
// else if (month >= 4) quarter = "第二季度";
// // strKey = `${year}-${quarter}`;
// strKey = `${quarter}`;
// } else {//月
// strKey = `${year}-${month}`;
// }
if (!shuiChanDistinctMap[strKey]) shuiChanDistinctMap[strKey] = {key:strKey, value:0};
shuiChanDistinctMap[strKey].value += totalWeight;
// 水产单位转换:万尾 → 尾
let weightInTail = totalWeight * 10000;
shuiChanDistinctMap[strKey].value += weightInTail;
if (thisYear == year) shuiChanCount += totalWeight;
else if (year == (thisYear-1)) suiChanLastYearCount += totalWeight;
if (currentYear == year) shuiChanCount += weightInTail;
// else if (year == (currentYear-1)) suiChanLastYearCount += totalWeight;
});
let suiChanxiaoShouList = Object.values(shuiChanDistinctMap);
let shuiChanXiaoShouDBList = await selectXiaoShouOfzuoWu({plantType:{"$gte":PLANTTYPE.鲈鱼}});
let shuiChanXiaoShouDBList = await selectXiaoShouOfzuoWu(shuichanParam);
let shuiChanxiaoShou = [];
shuiChanXiaoShouDBList.forEach(info => {
let {_id, totalWeight} = info;
// 水产单位转换:万尾 → 尾
let weightInTail = totalWeight * 10000;
shuiChanxiaoShou.push({
key:changeEnumValue(PLANTTYPE, _id),
value:Math.ceil(totalWeight/10)/100
key: changeEnumValue(PLANTTYPE, _id),
value: weightInTail
});
});
shuiChanxiaoShou.sort((a,b) =>{return b.value - a.value});
shuiChanxiaoShou.sort((a,b) => {return b.value - a.value});
let dataInfo = {
zuoWu:{
count:Math.ceil(count/10)/100,
mom:Math.round( (count-lastYearCount)/lastYearCount * 1000 )/10,
xiaoShou:xiaoShouList,
zuoWu:xiaoShou
zuoWu: { //农产品销售
count: Math.ceil(count/10)/100,
// mom: lastYearCount > 0 ? Math.round((count - lastYearCount) / lastYearCount * 1000) / 10 : 0,
xiaoShou: xiaoShouList, //
zuoWu: xiaoShou
},
shuiChan:{
count:Math.ceil(shuiChanCount/10)/100,
mom:Math.round( (shuiChanCount-suiChanLastYearCount)/suiChanLastYearCount * 1000 )/10,
xiaoShou:suiChanxiaoShouList,
shuiChan:shuiChanxiaoShou
shuiChan: { //水产销售
count: Math.ceil(shuiChanCount/10)/100,
// mom: suiChanLastYearCount > 0 ? Math.round((shuiChanCount - suiChanLastYearCount) / suiChanLastYearCount * 1000) / 10 : 0,
xiaoShou: suiChanxiaoShouList,
shuiChan: shuiChanxiaoShou
}
};
return {dataInfo};
}
/**
* 统计页产量统计
* @param year 年份,如 2025
* @param type 统计类型:1-年,2-季度,3-月
* @returns
*/
export async function homePageStatisChanLiangWithYear(year: number, type: number) {
// 产量 时间分 - 农作物
let zuoWuMonthDBList = await caishouData.selectToParam({plantType: {"$lt": PLANTTYPE.鲈鱼}});
let zuoWuDistinctMap = {};
let zuoWuCount = 0;
let map1 = {};
zuoWuMonthDBList.forEach(info => {
let {ct, weight} = info;
let dataYear = 0;
let month = 0;
if (ct) {
dataYear = moment(ct).year();
month = moment(ct).month() + 1;
}
// 添加年份过滤
if (year && dataYear !== year) {
return;
}
if (!map1[''+dataYear+''+month]) {
map1[''+dataYear+''+month] = {month, year: dataYear, totalWeight: 0};
}
map1[''+dataYear+''+month].totalWeight += weight;
});
let list1 = Object.values(map1);
list1.forEach(info => {
let {year: dataYear, month, totalWeight}: any = info;
let strKey: any = "";
if (type == 1) { // 年
strKey = dataYear;
} else if (type == 2) { // 季度
let quarter = 1;
if (month >= 10) quarter = 4;
else if (month >= 7) quarter = 3;
else if (month >= 4) quarter = 2;
strKey = `${dataYear}-${quarter}`;
} else { // 月
strKey = `${dataYear}-${month}`;
}
if (!zuoWuDistinctMap[strKey]) {
zuoWuDistinctMap[strKey] = {key: strKey, value: 0};
}
zuoWuDistinctMap[strKey].value += totalWeight;
zuoWuCount += totalWeight;
});
let nongChanPin = Object.values(zuoWuDistinctMap);
for (let i = 0; i < nongChanPin.length; i++) {
nongChanPin[i]["value"] = Math.ceil(nongChanPin[i]["value"] / 10) / 100;
}
// 农作物产量 - 添加年份过滤
let zuoWuDBList = await selectChanLiangOfzuoWu({
plantType: {"$lt": PLANTTYPE.鲈鱼},
...(year && {year: year})
});
let zuoWu = [];
zuoWuDBList.forEach(info => {
let {_id, totalWeight} = info;
zuoWu.push({
key: changeEnumValue(PLANTTYPE, _id),
value: totalWeight / 1000
});
});
zuoWu.sort((a, b) => {return b.value - a.value});
// 产量 - 水产品
let shuiChanMonthDBList = await selectChanLiangOfMonth({plantType: {"$gte": PLANTTYPE.鲈鱼}});
let shuiChanDistinctMap = {};
let shuiChanCount = 0;
shuiChanMonthDBList.forEach(info => {
let {year: dataYear, month, totalWeight} = info;
// 添加年份过滤
if (year && dataYear !== year) {
return;
}
let strKey = "";
if (type == 1) { // 年
strKey = dataYear;
} else if (type == 2) { // 季度
let quarter = 1;
if (month >= 10) quarter = 4;
else if (month >= 7) quarter = 3;
else if (month >= 4) quarter = 2;
strKey = `${dataYear}-${quarter}`;
} else { // 月
strKey = `${dataYear}-${month}`;
}
if (!shuiChanDistinctMap[strKey]) {
shuiChanDistinctMap[strKey] = {key: strKey, value: 0};
}
shuiChanDistinctMap[strKey].value += totalWeight;
shuiChanCount += totalWeight;
});
let shuiChanPin = Object.values(shuiChanDistinctMap);
// 水产品产量 - 添加年份过滤
let shuiChanDBList = await selectChanLiangOfzuoWu({
plantType: {"$gte": PLANTTYPE.鲈鱼},
...(year && {year: year})
});
let shuiChan = [];
shuiChanDBList.forEach(info => {
let {_id, totalWeight} = info;
shuiChan.push({
key: changeEnumValue(PLANTTYPE, _id),
value: totalWeight / 10000
});
});
shuiChan.sort((a, b) => {return b.value - a.value});
// 水产品种植统计 - 使用新的年份过滤方法
let shuiChanZhognYang = [];
let shuiChanZhognYangCount = 0;
let zhognYangDBList = await zhongZhiData.zhongYangTongJiCountByYear(year);
zhognYangDBList.forEach(info => {
let {_id, sizeCount} = info;
shuiChanZhognYang.push({
key: changeEnumValue(PLANTTYPE, _id),
value: sizeCount
});
shuiChanZhognYangCount += sizeCount;
});
let dataInfo = {
zuoWu: {
count: Math.ceil(zuoWuCount / 10) / 100,
nongChanPin,
zuoWu: zuoWu,
},
shuiChan: {
count: Math.ceil(shuiChanCount / 100) / 100,
shuiChanPin,
shuiChan,
},
shuiChanZhognYang: {
shuiChanZhognYangList: shuiChanZhognYang,
count: shuiChanZhognYangCount,
}
};
return {dataInfo};
......@@ -381,3 +777,8 @@ export async function homePageStatisXiaoShou() {
......@@ -5,8 +5,9 @@
import moment = require("moment");
import { TABLENAME } from "../../config/dbEnum";
import { DiKuaiConfig, ZhongYangConfig } from "../../config/eccParam";
import { PLANTTYPE, PLOTTYPE, ZHONGYANGTYPE } from "../../config/enum";
import { PLANTTYPE, PLOTTYPE, XIAOSHOUQUXIANG, ZHONGYANGTYPE } from "../../config/enum";
import * as zhongzhiData from "../../data/zhongzhi";
import * as xiaoshouData from "../../data/xiaoshou";
import * as dikuaiData from "../../data/dikuai";
import { randomId, successResult } from "../../tools/system";
import { changeEnumValue, eccEnumValue } from "../../util/verificationEnum";
......@@ -103,7 +104,9 @@ export async function addZhongYang(reqUser, param) {
//校验地块大小是否符合扣除
let dkInfo = await dikuaiData.selectOne({dId:param.dId});
if (!dkInfo || !dkInfo.dId) throw new BizError(ERRORENUM.地块不存在);
if (dkInfo.size < param.size) throw new BizError(ERRORENUM.地块大小不足);
if (param.plantType < PLANTTYPE.鲈鱼 && param.plantType > PLANTTYPE.水稻 ) {
if (dkInfo.size < param.size) throw new BizError(ERRORENUM.地块大小不足);
}
let addInfo = {
zId:randomId(TABLENAME.种植表),
......@@ -227,3 +230,269 @@ export async function zhongYangJiLu(zhongYangType:number, selectStr:string, plan
}
/** =================================供大屏使用==================================== */
/**
* 种养列表
* @param zhongYangType
* @returns
*/
// export async function zhongYangList(zhongYangType:number) {
// let funName = `当前种养列表`;
// let param:any = { };
// // let startTime = moment().subtract(1, 'month').startOf('month').valueOf();
// // let endTime = moment().subtract(1, 'month').endOf('month').valueOf();
// let startTime = moment().subtract(90, 'days').startOf('day').valueOf();
// let endTime = moment().endOf('day').valueOf();
// if (zhongYangType) {
// eccEnumValue(funName, 'zhongYangType', ZHONGYANGTYPE, zhongYangType);
// param.plantType = {"$gte":zhongYangType, "$lt":zhongYangType+99};
// param.isEnd = 0;
// param.plantTime = {"$gte":startTime, "$lte":endTime}
// }
// let zyList = await zhongzhiData.selectToParam(param);
// let dataInfo = {};
// zyList.forEach(info => {
// let addInfo = {
// size : info.size,
// plantType : changeEnumValue(PLANTTYPE, info.plantType),
// plantTime : moment(info.plantTime).format("YYYY-MM-DD"),
// };
// let plantType = changeEnumValue(PLANTTYPE, info.plantType);
// if (!dataInfo[plantType]) dataInfo[plantType] = [];
// dataInfo[plantType].push(addInfo);
// });
// let dataList = [];
// let unit = "亩";
// if (zhongYangType == ZHONGYANGTYPE.水产) unit = "万尾";
// for (let key in dataInfo) {
// let size = 0;
// let zhongyang = dataInfo[key];
// zhongyang.forEach(item => {
// size += item.size;
// });
// dataList.push({
// key:key,
// value:Math.round(size*100)/100,
// unit
// });
// }
// dataList.sort((a, b) => {
// return b.value - a.value;
// })
// return dataList.slice(0, 10);
// }
/**
* 种养列表
* @param zhongYangType
* @returns
*/
export async function zhongYangList(zhongYangType:number) {
let funName = `当前种养列表`;
let param:any = { };
// 根据种养类型设置不同的时间范围
let startTime, endTime;
if (zhongYangType === ZHONGYANGTYPE.水产) {
// 水产类型:获取近一年的数据
startTime = moment().subtract(1, 'year').startOf('day').valueOf();
endTime = moment().endOf('day').valueOf();
} else {
// 其他类型:保持原来的90天范围
startTime = moment().subtract(90, 'days').startOf('day').valueOf();
endTime = moment().endOf('day').valueOf();
}
if (zhongYangType) {
eccEnumValue(funName, 'zhongYangType', ZHONGYANGTYPE, zhongYangType);
param.plantType = {"$gte":zhongYangType, "$lt":zhongYangType+99};
param.isEnd = 0;
param.plantTime = {"$gte":startTime, "$lte":endTime}
}
let zyList = await zhongzhiData.selectToParam(param);
let dataInfo = {};
zyList.forEach(info => {
let addInfo = {
size : info.size,
plantType : changeEnumValue(PLANTTYPE, info.plantType),
plantTime : moment(info.plantTime).format("YYYY-MM-DD"),
};
let plantType = changeEnumValue(PLANTTYPE, info.plantType);
if (!dataInfo[plantType]) dataInfo[plantType] = [];
dataInfo[plantType].push(addInfo);
});
let dataList = [];
let unit = "亩";
if (zhongYangType == ZHONGYANGTYPE.水产) unit = "万尾";
for (let key in dataInfo) {
let size = 0;
let zhongyang = dataInfo[key];
zhongyang.forEach(item => {
size += item.size;
});
dataList.push({
key:key,
value:Math.round(size*100)/100,
unit
});
}
dataList.sort((a, b) => {
return b.value - a.value;
})
return dataList.slice(0, 10);
}
/**
* 鱼苗数据
* @returns
*/
export async function yuMiaoList() {
/**鱼苗销售记录 */
let param:any = {};
param.plantType = {"$gte":PLANTTYPE.鲈鱼, "$lt":PLANTTYPE.水稻};
// let lastMonth = moment().subtract(1, 'years').format('YYYY-MM-DD');
// let startMs = moment(lastMonth).startOf("day").valueOf();
// let endMs = moment(new Date()).endOf("day").valueOf();
// param.operationTime = {"$gte":startMs, "$lte":endMs};
let xiaoShouData = await xiaoshouData.selectToParam(param);
console.log(`xiaoShouData: ${JSON.stringify(xiaoShouData)}`);
xiaoShouData.sort( (a, b) => {
return b.operationTime - a.operationTime;
})
let xiaoShouList = [];
xiaoShouData.forEach(item => {
let {plantType, quXiang, operationTime, weight } = item;
xiaoShouList.push({
plantType:changeEnumValue(PLANTTYPE, plantType),
quXiang:changeEnumValue(XIAOSHOUQUXIANG, quXiang),
weight,
unit:"尾",
operationTime:moment(operationTime).format("YYYY-MM-DD"),
});
});
/**鱼苗养殖记录 */
let param2:any = {};
param2.plantType = {"$gte":PLANTTYPE.鲈鱼, "$lt":PLANTTYPE.水稻};
param2.isEnd = 0;
// param2.plantTime = {"$gte":startMs, "$lte":endMs};
let yangZhiData = await zhongzhiData.selectToParam(param2);
let yangZhiList = [];
yangZhiData.forEach(item => {
let {plantType, size, plantTime } = item;
yangZhiList.push({
plantType:changeEnumValue(PLANTTYPE, plantType),
size,
plantTime:moment(plantTime).format("YYYY-MM-DD"),
plantTimeNum:plantTime
});
});
yangZhiList.sort( (a, b) => {
return b.plantTimeNum - a.plantTimeNum;
})
/**各类鱼苗库存数量:养殖-销售 */
let kuCunData = calculateKuCun(yangZhiList, xiaoShouList);
let dataList = {
鱼苗销售记录:xiaoShouList,
鱼苗养殖记录:yangZhiList,
鱼苗库存数据:kuCunData
}
return dataList;
}
/**
* 计算各类鱼苗库存
* @param {Array} yangZhiList 养殖记录
* @param {Array} xiaoShouList 销售记录
* @returns {Array} 库存数据
*/
function calculateKuCun(yangZhiList, xiaoShouList) {
// 按鱼苗类型统计总养殖量
let yangZhiTotal = {};
yangZhiList.forEach(item => {
const type = item.plantType;
const size = parseFloat(item.size) || 0;
if (!yangZhiTotal[type]) {
yangZhiTotal[type] = 0;
}
yangZhiTotal[type] += size;
});
// 按鱼苗类型统计总销售量
let xiaoShouTotal = {};
xiaoShouList.forEach(item => {
const type = item.plantType;
const weight = parseFloat(item.weight) * 10000 || 0; //单位转换为万尾
if (!xiaoShouTotal[type]) {
xiaoShouTotal[type] = 0;
}
xiaoShouTotal[type] += weight;
});
// 计算库存并格式化结果
let kuCunList = [];
const allTypes = new Set([
...Object.keys(yangZhiTotal),
...Object.keys(xiaoShouTotal)
]);
allTypes.forEach(type => {
const yangZhi = yangZhiTotal[type] || 0;
const xiaoShou = xiaoShouTotal[type] || 0;
let kuCun = yangZhi - xiaoShou;
// 如果库存为负数,直接置零
if (kuCun < 0) {
kuCun = 0;
}
kuCunList.push({
plantType: type,
yangZhiTotal: yangZhi,
xiaoShouTotal: xiaoShou,
kuCun: kuCun,
unit: "万尾",
updateTime: moment().format("YYYY-MM-DD HH:mm:ss")
});
});
// 按库存量降序排列
kuCunList.sort((a, b) => b.kuCun - a.kuCun);
return kuCunList;
}
/**
* 统计页-农产品产量统计
* @param year 年份参数,用于筛选对应年份的数据
* @param type 统计类型:2-季度,3-月
* @returns
*/
export async function homePageStatisChanLiang(year: number, type: number) {
// 产量 时间分
let zuoWuMonthDBList = await caishouData.selectToParam({plantType: {"$lt": PLANTTYPE.鲈鱼}});
let zuoWuDistinctMap = {};
let zuoWuCount = 0;
let map1 = {};
zuoWuMonthDBList.forEach(info => {
let {operationTime, weight} = info; // 使用operationTime而不是ct
let dataYear = 0;
let month = 0;
if (operationTime) {
dataYear = moment(operationTime).year();
month = moment(operationTime).month()+1;
}
// 只处理指定年份的数据
if (dataYear !== year) return;
if (!map1['' + dataYear + '' + month]) map1['' + dataYear + '' + month] = {month, year: dataYear, totalWeight: 0}
map1['' + dataYear + '' + month].totalWeight += weight;
})
let list1 = Object.values(map1);
list1.forEach(info => {
let {year: dataYear, month, totalWeight}: any = info;
let strKey: any = "";
if (type == 2) {//季度
let quarter = "第一季度";
if (month >= 10) quarter = "第四季度";
else if (month >= 7) quarter = "第三季度";
else if (month >= 4) quarter = "第二季度";
// strKey = `${dataYear}-${quarter}`;
strKey = `${quarter}`;
} else {//月
strKey = `${dataYear}-${month}`;
}
if (!zuoWuDistinctMap[strKey]) zuoWuDistinctMap[strKey] = {key: strKey, value: 0};
zuoWuDistinctMap[strKey].value += totalWeight;
zuoWuCount += totalWeight;
});
let nongChanPin = Object.values(zuoWuDistinctMap);
for (let i = 0; i < nongChanPin.length; i++) {
nongChanPin[i]["value"] = Math.ceil(nongChanPin[i]["value"] / 10) / 100;
}
// 农作物产量 - 需要根据年份筛选
let zuoWuDBList = await selectChanLiangOfzuoWu({plantType: {"$lt": PLANTTYPE.鲈鱼}});
let zuoWu = [];
let zuoWuTotalWeight = 0;
// 注意:这里需要重新查询原始数据来按年份筛选
let zuoWuRawData = await caishouData.selectToParam({plantType: {"$lt": PLANTTYPE.鲈鱼}});
let zuoWuMap = {};
zuoWuRawData.forEach(info => {
let {plantType, weight, operationTime} = info;
let dataYear = 0;
if (operationTime) dataYear = moment(operationTime).year();
// 只处理指定年份的数据
if (dataYear !== year) return;
if (!zuoWuMap[plantType]) zuoWuMap[plantType] = 0;
zuoWuMap[plantType] += weight;
});
// 将map转换为数组
Object.keys(zuoWuMap).forEach(plantType => {
let weight = zuoWuMap[plantType];
zuoWu.push({
key: changeEnumValue(PLANTTYPE, parseInt(plantType)),
value: weight / 1000
});
zuoWuTotalWeight += weight;
});
zuoWu.sort((a, b) => {
return b.value - a.value
});
// 产量
let shuiChanMonthDBList = await selectChanLiangOfMonth({plantType: {"$gte": PLANTTYPE.鲈鱼}});
let shuiChanDistinctMap = {};
let shuiChanCount = 0;
shuiChanMonthDBList.forEach(info => {
let {year: dataYear, month, totalWeight} = info;
// 只处理指定年份的数据
if (dataYear !== year) return;
let strKey = `${dataYear}-${month}`;
if (type == 2) {//季度
let quarter = "第一季度";
if (month >= 10) quarter = "第四季度";
else if (month >= 7) quarter = "第三季度";
else if (month >= 4) quarter = "第二季度";
// strKey = `${dataYear}-${quarter}`;
strKey = `${quarter}`;
} else {//月
strKey = `${dataYear}-${month}`;
}
if (!shuiChanDistinctMap[strKey]) shuiChanDistinctMap[strKey] = {key: strKey, value: 0};
shuiChanDistinctMap[strKey].value += totalWeight;
shuiChanCount += totalWeight;
});
let shuiChanPin = Object.values(shuiChanDistinctMap);
// 水产品产量 - 需要根据年份筛选
let shuiChanDBList = await selectChanLiangOfzuoWu({plantType: {"$gte": PLANTTYPE.鲈鱼}});
let shuiChan = [];
let shuiChanTotalWeight = 0;
// 注意:这里也需要重新查询原始数据来按年份筛选
let shuiChanRawData = await caishouData.selectToParam({plantType: {"$gte": PLANTTYPE.鲈鱼}});
let shuiChanMap = {};
shuiChanRawData.forEach(info => {
let {plantType, weight, operationTime} = info;
let dataYear = 0;
if (operationTime) dataYear = moment(operationTime).year();
// 只处理指定年份的数据
if (dataYear !== year) return;
if (!shuiChanMap[plantType]) shuiChanMap[plantType] = 0;
shuiChanMap[plantType] += weight;
});
// 将map转换为数组
Object.keys(shuiChanMap).forEach(plantType => {
let weight = shuiChanMap[plantType];
shuiChan.push({
key: changeEnumValue(PLANTTYPE, parseInt(plantType)),
value: weight / 10000
});
shuiChanTotalWeight += weight;
});
shuiChan.sort((a, b) => {
return b.value - a.value
});
let shuiChanZhognYang = [];
let shuiChanZhognYangCount = 0;
// 使用带年份筛选的方法
let zhognYangDBList = await zhongZhiData.zhongYangTongJiCountByYear(year);
zhognYangDBList.forEach(info => {
let {_id, sizeCount} = info;
shuiChanZhognYang.push({
key: changeEnumValue(PLANTTYPE, _id),
value: sizeCount
});
shuiChanZhognYangCount += sizeCount;
});
let dataInfo = {
zuoWu: {
count: Math.ceil(zuoWuCount / 10) / 100, //农产品产量总数
nongChanPin, //农产品产量趋势
zuoWu: zuoWu, //农产品产量分类
},
shuiChan: {
count: Math.ceil(shuiChanCount / 100) / 100, //水产品产量总数
shuiChanPin, //水产品产量
shuiChan, //水产品产量分类
},
shuiChanZhognYang: {
shuiChanZhognYangList: shuiChanZhognYang,
count: shuiChanZhognYangCount,
}
};
return {dataInfo};
}
/**
* 统计页销售量统计
* @param year 年份参数,用于筛选对应年份的数据
* @returns
*/
export async function homePageStatisXiaoShou(year?: number) {
// 构建查询条件,添加年份过滤
let currentYear = year || moment().year();
let startOfYear = moment().year(currentYear).startOf('year').valueOf();
let endOfYear = moment().year(currentYear).endOf('year').valueOf();
let timeFilter = {
operationTime: {
"$gte": startOfYear,
"$lte": endOfYear
}
};
// 农作物销售查询参数
let nonzuowuParam = {
...timeFilter,
plantType: {"$lt": PLANTTYPE.鲈鱼}
};
// 水产品销售查询参数
let shuichanParam = {
...timeFilter,
plantType: {"$gte": PLANTTYPE.鲈鱼}
};
// 农作物销售量统计
let monthDBList = await selectXiaoShouOfMonth(nonzuowuParam);
let distinctMap = {};
let count = 0;
// let lastYearCount = 0;
monthDBList.forEach(info => {
let {year, month, totalWeight} = info;
let strKey = `${year}-${month}`;
// if (type == 2) {//季度
// let quarter = "第一季度";
// if (month >= 10) quarter = "第四季度";
// else if (month >= 7) quarter = "第三季度";
// else if (month >= 4) quarter = "第二季度";
// // strKey = `${year}-${quarter}`;
// strKey = `${quarter}`;
// } else {//月
// strKey = `${year}-${month}`;
// }
if (!distinctMap[strKey]) distinctMap[strKey] = {key:strKey, value:0};
distinctMap[strKey].value += totalWeight;
if (currentYear == year) count += totalWeight;
// else if (year == (currentYear-1)) lastYearCount += totalWeight;
});
let xiaoShouList = Object.values(distinctMap);
let xiaoShouDBList = await selectXiaoShouOfzuoWu(nonzuowuParam);
let xiaoShou = [];
xiaoShouDBList.forEach(info => {
let {_id, totalWeight} = info;
xiaoShou.push({
key: changeEnumValue(PLANTTYPE, _id),
value: Math.ceil(totalWeight/10)/100
});
});
xiaoShou.sort((a,b) => {return b.value - a.value});
for (let i = 0; i < xiaoShouList.length; i++) {
xiaoShouList[i]["value"] = Math.ceil(xiaoShouList[i]["value"] / 10)/100;
}
// 水产品销售量统计
let shuiChanMonthDBList = await selectXiaoShouOfMonth(shuichanParam);
let shuiChanDistinctMap = {};
let shuiChanCount = 0;
// let suiChanLastYearCount = 0;
shuiChanMonthDBList.forEach(info => {
let {year, month, totalWeight} = info;
let strKey = `${year}-${month}`;
// if (type == 2) {//季度
// let quarter = "第一季度";
// if (month >= 10) quarter = "第四季度";
// else if (month >= 7) quarter = "第三季度";
// else if (month >= 4) quarter = "第二季度";
// // strKey = `${year}-${quarter}`;
// strKey = `${quarter}`;
// } else {//月
// strKey = `${year}-${month}`;
// }
if (!shuiChanDistinctMap[strKey]) shuiChanDistinctMap[strKey] = {key:strKey, value:0};
shuiChanDistinctMap[strKey].value += totalWeight;
if (currentYear == year) shuiChanCount += totalWeight;
// else if (year == (currentYear-1)) suiChanLastYearCount += totalWeight;
});
let suiChanxiaoShouList = Object.values(shuiChanDistinctMap);
let shuiChanXiaoShouDBList = await selectXiaoShouOfzuoWu(shuichanParam);
let shuiChanxiaoShou = [];
shuiChanXiaoShouDBList.forEach(info => {
let {_id, totalWeight} = info;
shuiChanxiaoShou.push({
key: changeEnumValue(PLANTTYPE, _id),
value: Math.ceil(totalWeight/10)/100
});
});
shuiChanxiaoShou.sort((a,b) => {return b.value - a.value});
let dataInfo = {
zuoWu: { //农产品销售
count: Math.ceil(count/10)/100,
// mom: lastYearCount > 0 ? Math.round((count - lastYearCount) / lastYearCount * 1000) / 10 : 0,
xiaoShou: xiaoShouList, //
zuoWu: xiaoShou
},
shuiChan: { //水产销售
count: Math.ceil(shuiChanCount/10)/100,
// mom: suiChanLastYearCount > 0 ? Math.round((shuiChanCount - suiChanLastYearCount) / suiChanLastYearCount * 1000) / 10 : 0,
xiaoShou: suiChanxiaoShouList,
shuiChan: shuiChanxiaoShou
}
};
return {dataInfo};
}
\ No newline at end of file
/**
*
*
* 种植
*/
import {Schema} from 'mongoose';
......@@ -122,3 +121,74 @@ export async function zhongYangTongJiCount() {
return list;
}
/**
* 按年份统计种植面积
* @param year 年份,可选
* @returns 按种植类型分组的面积统计
*/
export async function zhongYangTongJiCountByYear(year?: number) {
// 构建基础查询条件
let matchCondition: any = { plantType: {"$gt": 100, "$lt": 200} };
// 如果传入了年份参数,添加时间过滤
if (year) {
const startTime = new Date(year, 0, 1).getTime(); // 年份开始时间戳
const endTime = new Date(year + 1, 0, 1).getTime(); // 年份结束时间戳
matchCondition.plantTime = {
"$gte": startTime,
"$lt": endTime
};
}
let list = await zhongzhiModel.aggregate([
{ $match: matchCondition },
{
"$group": {
_id: "$plantType",
sizeCount: {"$sum": "$size"}
}
}
]);
return list;
}
/**
* 按年份统计种植数量
* @param year 年份,可选
* @returns 按种植类型分组的数量统计
*/
export async function pingZhongCountByYear(year?: number) {
let matchCondition: any = {};
// 如果传入了年份参数,添加时间过滤
if (year) {
const startTime = new Date(year, 0, 1).getTime(); // 年份开始时间戳
const endTime = new Date(year + 1, 0, 1).getTime(); // 年份结束时间戳
matchCondition.plantTime = {
"$gte": startTime,
"$lt": endTime
};
}
let list = await zhongzhiModel.aggregate([
{ $match: matchCondition },
{
"$group": {
_id: "$plantType",
count: {"$sum": 1}
}
}
]);
return list;
}
......@@ -4,7 +4,7 @@ import { httpServer } from "./net/http_server";
import { initDB } from "./db/dbInit";
import { dataInit0516, dataInit, dataInit0508, yjDataInit0508, dataInit0522, dataInit0604, dataInit0609, dataInit0618 } from "./biz/dataInt";
import { getDataOut, getGuiYuOut } from "./biz/dataOut";
import { homePageStatisChanLiang } from "./biz/xcx/user";
import { homePageStatisChanLiangWithYear, homePageStatisXiaoShou } from "./biz/xcx/user";
import { getPwdMd5, md5PwdStr } from "./tools/system";
async function lanuch() {
......@@ -17,7 +17,8 @@ async function lanuch() {
httpServer.createServer(systemConfig.port);
console.log('This indicates that the server is started successfully.');
// await homePageStatisChanLiang(1);
// await homePageStatisXiaoShou(1, 2025);
// await homePageStatisChanLiangWithYear(2025, 1);
// await dataInit();
await getDataOut();
// await dataInit0508();
......
......@@ -5,7 +5,7 @@ import compression = require('compression');
import { watch } from '../middleware/watch';
import { httpErrorHandler } from '../middleware/httpErrorHandler';
import * as path from "path";
import * as fallback from 'express-history-api-fallback';
import fallback from 'express-history-api-fallback';
export class httpServer {
static createServer(port:number) {
......
......@@ -26,7 +26,7 @@ export function setRouter(httpServer){
httpServer.post('/zjnt/xcx/zhongyang/dangqian/list', checkUserToken, asyncHandler(zhongyang_dangqian_list));//当前列表
httpServer.post('/zjnt/xcx/zhongyang/jilu/list', checkUserToken, asyncHandler(zhongyang_jilu_list));//种养记录
httpServer.post('/zjnt/xcx/zhongyang/add', checkUserToken, asyncHandler(zhongyang_add));//添加种养
/**农资 */
httpServer.post('/zjnt/xcx/nongzi/list', checkUserToken, asyncHandler(nongzi_list));
httpServer.post('/zjnt/xcx/nongzi/add', checkUserToken, asyncHandler(nongzi_add));
......@@ -55,9 +55,11 @@ export function setRouter(httpServer){
httpServer.post('/zjnt/xcx/user/login', asyncHandler(user_login));//登录
httpServer.post('/zjnt/xcx/user/logout', checkUserToken, asyncHandler(user_logout));//登出
/**大屏用 */
httpServer.post('/zjnt/xcx/dataout/zzzmj', asyncHandler(data_out));//
httpServer.post('/zjnt/xcx/dataout/guiyu', asyncHandler(data_out_guiyu));//
httpServer.post('/zjnt/xcx/dataout/guiyu', asyncHandler(data_out_guiyu));//鳜鱼
httpServer.post('/zjnt/xcx/dataout/zhongyang', asyncHandler(zhongyang_list));//种养列表
httpServer.post('/zjnt/xcx/dataout/yumiao', asyncHandler(yuMiao_list));//鱼苗销售列表
/**公用 */
......@@ -79,14 +81,16 @@ async function data_out_guiyu(req, res) {
/**================================================================首页 */
async function home_statis_chanliang(req, res) {
let reqConf = {type:'Number'};
let { type } = eccReqParamater(reqConf, req.body);
let result = await userBiz.homePageStatisChanLiang(type);
let reqConf = {type:'Number', year:'Number'};
let { type, year } = eccReqParamater(reqConf, req.body);
let result = await userBiz.homePageStatisChanLiang(year, type);
res.success(result);
}
async function home_statis_xiaoshou(req, res) {
let result = await userBiz.homePageStatisXiaoShou();
let reqConf = {year:'Number'};
let { year } = eccReqParamater(reqConf, req.body);
let result = await userBiz.homePageStatisXiaoShou(year);
res.success(result);
}
......@@ -286,6 +290,26 @@ async function zhongyang_jilu_list(req, res) {
res.success(result);
}
async function zhongyang_list(req, res) {
let reqConf = {zhongYangType:"Number"};
const NotMustHaveKeys = [];
let { zhongYangType } = eccReqParamater(reqConf, req.body, NotMustHaveKeys);
const UserInfo = req.userInfo;
let result = await zhongYangBiz.zhongYangList(zhongYangType);
res.success(result);
}
async function yuMiao_list(req, res) {
const UserInfo = req.userInfo;
let result = await zhongYangBiz.yuMiaoList();
res.success(result);
}
/**================================================================地块 */
async function dikuai_add(req, res) {
......
......@@ -4,9 +4,12 @@
"target": "es2017",
"sourceMap": true,
"rootDir":"./src",
"outDir":"./out"
"outDir":"./out",
"esModuleInterop": true,
"allowSyntheticDefaultImports": true
},
"exclude": [
"node_modules"
"node_modules",
"public"
]
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment