Commit bd25b882 by chenjinjing

no message

parent 2a92cb38
...@@ -881,8 +881,9 @@ ...@@ -881,8 +881,9 @@
}, },
"node_modules/express-history-api-fallback": { "node_modules/express-history-api-fallback": {
"version": "2.2.1", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/express-history-api-fallback/-/express-history-api-fallback-2.2.1.tgz", "resolved": "https://registry.npmmirror.com/express-history-api-fallback/-/express-history-api-fallback-2.2.1.tgz",
"integrity": "sha1-OirSf3vryQ/FM9EQ18bYMJe80Fc=" "integrity": "sha512-swxwm3aP8vrOOvlzOdZvHlSZtJGwHKaY94J6AkrAgCTmcbko3IRwbkhLv2wKV1WeZhjxX58aLMpP3atDBnKuZg==",
"license": "ISC"
}, },
"node_modules/express/node_modules/qs": { "node_modules/express/node_modules/qs": {
"version": "6.7.0", "version": "6.7.0",
...@@ -3634,8 +3635,8 @@ ...@@ -3634,8 +3635,8 @@
}, },
"express-history-api-fallback": { "express-history-api-fallback": {
"version": "2.2.1", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/express-history-api-fallback/-/express-history-api-fallback-2.2.1.tgz", "resolved": "https://registry.npmmirror.com/express-history-api-fallback/-/express-history-api-fallback-2.2.1.tgz",
"integrity": "sha1-OirSf3vryQ/FM9EQ18bYMJe80Fc=" "integrity": "sha512-swxwm3aP8vrOOvlzOdZvHlSZtJGwHKaY94J6AkrAgCTmcbko3IRwbkhLv2wKV1WeZhjxX58aLMpP3atDBnKuZg=="
}, },
"extend": { "extend": {
"version": "3.0.2", "version": "3.0.2",
......
...@@ -29,7 +29,6 @@ ...@@ -29,7 +29,6 @@
"ws": "^5.2.2", "ws": "^5.2.2",
"xml2js": "^0.4.23" "xml2js": "^0.4.23"
}, },
"devDependencies": {},
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1" "test": "echo \"Error: no test specified\" && exit 1"
}, },
......
...@@ -104,10 +104,10 @@ export async function caiShouList(zhongYangType:number, dId:string, plantType:nu ...@@ -104,10 +104,10 @@ export async function caiShouList(zhongYangType:number, dId:string, plantType:nu
let {csId, plantType, dIdList, operationTime, weight, ct } = item; let {csId, plantType, dIdList, operationTime, weight, ct } = item;
let dIds = dIdList; let dIds = dIdList;
let didStr = ""; let didStr = "";
let purpose = ""; let purpose = "-";
dIds.forEach(dId => { dIds.forEach(dId => {
didStr += `${diKuaiMap[dId].code} `; didStr += `${diKuaiMap[dId].code} `;
purpose += `${changeEnumValue(PURPOSE, diKuaiMap[dId].purpose)} `; purpose = `${changeEnumValue(PURPOSE, diKuaiMap[dId].purpose)} `;
}); });
let operationTimeNum; let operationTimeNum;
if (operationTime) operationTimeNum = operationTime; if (operationTime) operationTimeNum = operationTime;
...@@ -115,7 +115,7 @@ export async function caiShouList(zhongYangType:number, dId:string, plantType:nu ...@@ -115,7 +115,7 @@ export async function caiShouList(zhongYangType:number, dId:string, plantType:nu
dataList.push({ dataList.push({
csId, csId,
plantType:changeEnumValue(PLANTTYPE, plantType), plantType:changeEnumValue(PLANTTYPE, plantType),
code:didStr, code:didStr || "-",
purpose, purpose,
operationTime:moment(operationTimeNum).format("YYYY-MM-DD"), operationTime:moment(operationTimeNum).format("YYYY-MM-DD"),
weight, weight,
......
...@@ -189,8 +189,8 @@ export async function nongZiListToPage(nzType:number, dId:string, useTime:number ...@@ -189,8 +189,8 @@ export async function nongZiListToPage(nzType:number, dId:string, useTime:number
let dikuaiList = await dikuaiData.selectToParam({}); let dikuaiList = await dikuaiData.selectToParam({});
let diKuaiMap = {}; let diKuaiMap = {};
dikuaiList.forEach(info => { dikuaiList.forEach(info => {
let {dId, code} = info; let {dId, code, purpose} = info;
diKuaiMap[dId] = code; diKuaiMap[dId] = {code, purpose};
}); });
let nongziList = await nongziData.findDataToParamToSortPage( param, {useTime:-1}, pageNumber ); let nongziList = await nongziData.findDataToParamToSortPage( param, {useTime:-1}, pageNumber );
...@@ -204,7 +204,8 @@ export async function nongZiListToPage(nzType:number, dId:string, useTime:number ...@@ -204,7 +204,8 @@ export async function nongZiListToPage(nzType:number, dId:string, useTime:number
let purpose = ""; let purpose = "";
let size = ""; let size = "";
dIdList.forEach(dId => { dIdList.forEach(dId => {
didStr += `${diKuaiMap[dId] || "-"}`; didStr += `${diKuaiMap[dId].code || "-"}`;
purpose = diKuaiMap[dId].purpose;
}) })
dataList.push({ dataList.push({
nzId, nzId,
......
...@@ -54,7 +54,7 @@ export async function adminUserLogin(loginId:string, pwd:string) { ...@@ -54,7 +54,7 @@ export async function adminUserLogin(loginId:string, pwd:string) {
* @param userInfo * @param userInfo
*/ */
export async function adminUserLogout(reqUserInfo) { export async function adminUserLogout(reqUserInfo) {
let userInfo = await findUserInfoByUserId(reqUserInfo.userId); let userInfo = await findUserInfoByUserId(reqUserInfo.userid);
userInfo.adminToken = getToken(userInfo.loginId); userInfo.adminToken = getToken(userInfo.loginId);
userInfo.adminTokenMs = new Date().valueOf(); userInfo.adminTokenMs = new Date().valueOf();
...@@ -65,10 +65,9 @@ export async function adminUserLogout(reqUserInfo) { ...@@ -65,10 +65,9 @@ export async function adminUserLogout(reqUserInfo) {
} }
/** /**
* 统计页产量统计 * 统计页产量统计
* @param type * @param type 统计类型:1-年,2-季度,3-月
* @returns * @returns
*/ */
export async function homePageStatisChanLiang(type:number) { export async function homePageStatisChanLiang(type:number) {
...@@ -82,7 +81,7 @@ export async function homePageStatisChanLiang(type:number) { ...@@ -82,7 +81,7 @@ export async function homePageStatisChanLiang(type:number) {
let {ct, weight} = info; let {ct, weight} = info;
let year = moment(ct).year(); 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} if (!map1[''+year+''+month]) map1[''+year+''+month] = {month, year, totalWeight:0}
map1[''+year+''+month].totalWeight += weight; map1[''+year+''+month].totalWeight += weight;
}) })
...@@ -205,5 +204,163 @@ export async function homePageStatisChanLiang(type:number) { ...@@ -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 ...@@ -65,11 +65,11 @@ export async function xiaoShouList(quXiang:number, plantType:number, operationTi
param.operationTime = {"$gte":startMs, "$lte":endMs}; 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 dataCount = await xiaoshouData.selectCountByParam(param);
let dataList = []; let dataList = [];
nongShiList.forEach(item => { xiaoShouData.forEach(item => {
let {xsId, plantType, quXiang, operationTime, weight } = item; let {xsId, plantType, quXiang, operationTime, weight } = item;
dataList.push({ dataList.push({
......
...@@ -79,13 +79,19 @@ export async function zhongYangDangQianListToPage(zhongYangType:number, plantTyp ...@@ -79,13 +79,19 @@ export async function zhongYangDangQianListToPage(zhongYangType:number, plantTyp
let dataCount = await zhongzhiData.findDataToParamCouant(param); let dataCount = await zhongzhiData.findDataToParamCouant(param);
let dataList = []; let dataList = [];
zyList.forEach(info => { 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 = { let addInfo = {
zId : info.zId, zId : info.zId,
size : info.size, size : info.size,
plantType : changeEnumValue(PLANTTYPE, info.plantType), plantType : changeEnumValue(PLANTTYPE, info.plantType),
code:diKuaiMap[info.dId].code, code,
plantTime:moment(info.plantTime).format("YYYY-MM-DD"), plantTime:moment(info.plantTime).format("YYYY-MM-DD"),
purpose:changeEnumValue(PURPOSE, diKuaiMap[info.dId].purpose), purpose,
plantTimeNum:info.plantTime, plantTimeNum:info.plantTime,
ctTime:moment(info.ct).format("YYYY-MM-DD"), ctTime:moment(info.ct).format("YYYY-MM-DD"),
}; };
......
...@@ -14,12 +14,11 @@ import { changeEnumValue } from "../util/verificationEnum"; ...@@ -14,12 +14,11 @@ import { changeEnumValue } from "../util/verificationEnum";
import { selectChanLiangOfMonth } from "../data/caishou"; import { selectChanLiangOfMonth } from "../data/caishou";
export async function getDataOut() { export async function getDataOut() {
let 种植总面积 = 0; let 种植总面积 = 0;
let 粮田面积 = 0; let 粮田面积 = 0;
let 菜田面积 = 0; let 菜田面积 = 0;
let 作物数量 = 0; isEnd: 0 let 作物数量 = 0;
let zhongZhiList = await zhongZhiTongJiCount({ isEnd: 0, plantType:{"$lt":PLANTTYPE.鲈鱼}}); let zhongZhiList = await zhongZhiTongJiCount({ isEnd: 0, plantType:{"$lt":PLANTTYPE.鲈鱼}});
let zhongZhiZuoWuList = []; //结果 let zhongZhiZuoWuList = []; //结果
...@@ -73,151 +72,452 @@ export async function getDataOut() { ...@@ -73,151 +72,452 @@ export async function getDataOut() {
}); });
let nongZiList = Object.values(农资情况Map); //结果 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 nongZiAllMonthList = await nongziData.selectToParam({});
let nongZiCountInfo = {};//肥料用药情况 let nongZiCountInfo = {};
nongZiCountInfo[NONGZITYPE.农药] = {}; nongZiCountInfo[NONGZITYPE.农药] = {};
nongZiCountInfo[NONGZITYPE.肥料] = {}; nongZiCountInfo[NONGZITYPE.肥料] = {};
// let lastMonthMs = moment().startOf('M').valueOf()
nongZiAllMonthList.forEach(info => { nongZiAllMonthList.forEach(info => {
let {useTime, count, nzType} = info; let { useTime, count, nzType } = info;
// if (useTime < lastMonthMs ) return const date = moment(useTime);
// 只保留近两个月内的数据(趋势图用)
if (date < startOfTwoMonthsAgo || date > endOfCurrentMonth) return;
let keyNum = 1; let keyNum = 1;
switch (nzType) { switch (nzType) {
case NONGZITYPE.磷肥: case NONGZITYPE.磷肥:
case NONGZITYPE.水溶肥: case NONGZITYPE.水溶肥:
case NONGZITYPE.有机肥: case NONGZITYPE.有机肥:
case NONGZITYPE.复合肥:keyNum = NONGZITYPE.肥料; break; case NONGZITYPE.复合肥:
keyNum = NONGZITYPE.肥料; break;
case NONGZITYPE.好力克: case NONGZITYPE.好力克:
case NONGZITYPE.奥罗: case NONGZITYPE.奥罗:
case NONGZITYPE.银法利: case NONGZITYPE.银法利:
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]) { if (nongZiCountInfo[keyNum]) {
let keyStr = getKey(useTime); let keyStr = date.format('YYMMDD');
if (!nongZiCountInfo[keyNum][keyStr]) nongZiCountInfo[keyNum][keyStr] = 0; if (!nongZiCountInfo[keyNum][keyStr]) nongZiCountInfo[keyNum][keyStr] = 0;
nongZiCountInfo[keyNum][keyStr] += count; 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 肥料 = [];
let 用药 = []; let 用药 = [];
let allKeyList = getAllKey(new Date().valueOf()); for (let i = 0; i < sortedDates.length; i++) {
for (let i = 0; i < allKeyList.length; i++) { let key = sortedDates[i];
let key = allKeyList[i];
肥料.push({ 肥料.push({
key, key,
value:nongZiCountInfo[NONGZITYPE.肥料][key] || 0 value: nongZiCountInfo[NONGZITYPE.肥料][key] || 0
}); });
用药.push({ 用药.push({
key, key,
value:nongZiCountInfo[NONGZITYPE.农药][key] || 0 value: nongZiCountInfo[NONGZITYPE.农药][key] || 0
}); });
} }
let feiliaoyongyaoqingkuang = [ //结果 let feiliaoyongyaoqingkuang = [
{name:"肥料", data:肥料}, { name: "肥料", data: 肥料 },
{name:"用药", data:用药}, { name: "用药", data: 用药 },
]; ];
let nongShiCount = await nongshiData.selectCountByParam({}); //结果 // 2. 农事操作趋势图(nongShiList)改为近两个月,农事操作总数改为今年数据
let nongshiTyptList = await nongshiData.selectToParam({}); let nongshiTyptList = await nongshiData.selectToParam({});
let nongShiCount = 0; // 改为统计今年的农事操作数量
let 操作趋势 = {}; let 操作趋势 = {};
let nongShiList = [];//结果 let nongShiList = [];
nongshiTyptList.forEach(info => { nongshiTyptList.forEach(info => {
let {nsType, operationTime} = info; let { operationTime } = info;
let key = getKey(operationTime); 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; 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({ nongShiList.push({
key, key,
value:操作趋势[key] || 0 value: 操作趋势[key] || 0
}); });
} }
// 3. 作物产量趋势图(chanLiangList)改为近两个月,但汇总数据保持全年
let monthDBList = await caishouData.selectToParam({plantType:{"$lt":PLANTTYPE.鲈鱼}}); let monthDBList = await caishouData.selectToParam({ plantType: { "$lt": PLANTTYPE.鲈鱼 } });
let 作物产量Map = {}; let 作物产量Map = {};
let 今年产量总数 = 0; let 今年产量总数 = 0;
let 去年产量总数 = 0;
monthDBList.forEach(info => { monthDBList.forEach(info => {
let {ct, weight} = info; let { ct, weight } = info;
if (new Date(ct).getFullYear() == 2025) 今年产量总数 += weight; const date = moment(ct);
let key = getKey(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; if (!作物产量Map[key]) 作物产量Map[key] = 0;
作物产量Map[key] += weight; 作物产量Map[key] += weight;
}); });
// 按日期排序
let chanLiangDates = Object.keys(作物产量Map).sort((a, b) => moment(a, 'YYMMDD').valueOf() - moment(b, 'YYMMDD').valueOf());
let 今年 = []; let 今年 = [];
let 去年 = []; let 去年 = [];
for (let i = 0; i < chanLiangDates.length; i++) {
let key = chanLiangDates[i];
let 去年产量总数 = 0; let changeValue = 作物产量Map[key] ? Math.round(作物产量Map[key] / 1000 * 100) / 100 : 0;
for (let i =0 ; i < allKeyList.length; i++) { 今年.push({ key: key, value: changeValue });
let key = allKeyList[i]; 去年.push({ key: key, value: 0 }); // 若需去年数据请自行补充逻辑
let changeValue = 作物产量Map[key] ? Math.round(作物产量Map[key]/1000*100)/100 : 0;
今年.push({key: key, value:changeValue || 0 });
去年.push({key: key, value:0 });
} }
let chanLiangList = [ //结果 let chanLiangList = [
{name:"今年", data:今年}, { name: "今年", data: 今年 },
{name:"去年", data:去年}, { name: "去年", data: 去年 },
]; ];
let 产量年同比 = 0; // 4. 销售趋势图(lastMonthXiaoShouList)改为近两个月,销售总量改为今年数据
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();
let xiaoshouDBList = await xiaoshouData.selectToParam({}); let xiaoshouDBList = await xiaoshouData.selectToParam({});
let lastMonthXiaoShou = 0; // 改为统计今年的销售总量
let lastMonthXiaoShou = 0;
let lastMonthXiaoShouMap = {}; let lastMonthXiaoShouMap = {};
xiaoshouDBList.forEach(info => { xiaoshouDBList.forEach(info => {
let {operationTime, weight} = info; let { operationTime, weight } = info;
const date = moment(operationTime);
// 汇总数据:统计今年的销售总量
if (date >= startOfYear && date <= endOfYear) {
lastMonthXiaoShou += weight; lastMonthXiaoShou += weight;
let key = getKey(operationTime); }
// 趋势图数据:只保留近两个月内的数据
if (date < startOfTwoMonthsAgo || date > endOfCurrentMonth) return;
let key = date.format('YYMMDD');
if (!lastMonthXiaoShouMap[key]) lastMonthXiaoShouMap[key] = 0; if (!lastMonthXiaoShouMap[key]) lastMonthXiaoShouMap[key] = 0;
lastMonthXiaoShouMap[key] += weight; 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 lastMonthXiaoShouList = [];
let allxiaoshouKeyList = getAllKey(new Date().valueOf()); for (let i = 0; i < xiaoshouDates.length; i++) {
for (let i = 0; i < allxiaoshouKeyList.length; i++) { let key = xiaoshouDates[i];
let key = allxiaoshouKeyList[i];
let value = lastMonthXiaoShouMap[key] || 0; let value = lastMonthXiaoShouMap[key] || 0;
lastMonthXiaoShouList.push({ lastMonthXiaoShouList.push({
key, 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 { return {
zhongZhiZuoWuList, zhongZhiZuoWuList,
zhongZhiTypeList, zhongZhiTypeList,
nongZiList, nongZiList,
feiliaoyongyaoqingkuang, feiliaoyongyaoqingkuang,
nongShiList, nongShiList,
nongShiCount, nongShiCount, // 现在是今年的农事操作总数
chanLiangList, chanLiangList,
chanLiangStatisList, chanLiangStatisList, // 第一个值已经是今年作物产量
lastMonthXiaoShou:Math.round(lastMonthXiaoShou/1000*100)/100, lastMonthXiaoShou: Math.round(lastMonthXiaoShou / 1000 * 100) / 100, // 现在是今年的销售总量
lastMonthXiaoShouList 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) { function getKey(timestamp) {
const date = new Date(timestamp); const date = new Date(timestamp);
...@@ -268,8 +568,6 @@ export async function getGuiYuOut() { ...@@ -268,8 +568,6 @@ export async function getGuiYuOut() {
{key:"鱼苗养殖", value:`${count}万尾`}, {key:"鱼苗养殖", value:`${count}万尾`},
]; ];
let xiaoshouList = await xiaoshouData.selectToParam({plantType:{"$gt":100, "$lt":200}}); let xiaoshouList = await xiaoshouData.selectToParam({plantType:{"$gt":100, "$lt":200}});
let xsjl = []; let xsjl = [];
xiaoshouList.forEach(info => { xiaoshouList.forEach(info => {
......
/** /**
* 用户 * 用户
* 水产养殖和销售数量数据库默认单位-万尾
*/ */
...@@ -143,47 +144,186 @@ export async function homePageStatisBottom(userInfo) { ...@@ -143,47 +144,186 @@ export async function homePageStatisBottom(userInfo) {
} }
/** /**
* 统计页产量统计 * 统计页-农产品产量统计
* @param type * @param type 统计类型:1-年,2-季度,3-月
* @returns * @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 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};
// }
//产量 时间分 /**
let zuoWuMonthDBList = await caishouData.selectToParam({plantType:{"$lt":PLANTTYPE.鲈鱼}}); * 统计页-农产品产量统计
* @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 zuoWuDistinctMap = {};
let zuoWuCount = 0; let zuoWuCount = 0;
let map1 = {}; let map1 = {};
zuoWuMonthDBList.forEach(info => { 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(); if (!map1['' + dataYear + '' + month]) map1['' + dataYear + '' + month] = {month, year: dataYear, totalWeight: 0}
let month = moment(ct).month(); map1['' + dataYear + '' + month].totalWeight += weight;
if (!map1[''+year+''+month]) map1[''+year+''+month] = {month, year, totalWeight:0}
map1[''+year+''+month].totalWeight += weight;
}) })
let list1 = Object.values(map1); let list1 = Object.values(map1);
list1.forEach(info => { list1.forEach(info => {
let {year, month, totalWeight}:any = info; let {year: dataYear, month, totalWeight}: any = info;
let strKey:any = ""; let strKey: any = "";
if (type == 1) {//年 if (type == 2) {//季度
strKey = year; let quarter = "第一季度";
} else if (type == 2) {//季度 if (month >= 10) quarter = "第四季度";
let quarter = 1; else if (month >= 7) quarter = "第三季度";
if (month >= 10) quarter = 4; else if (month >= 4) quarter = "第二季度";
else if (month >= 7) quarter = 3; // strKey = `${dataYear}-${quarter}`;
else if (month >= 4) quarter = 2; strKey = `${quarter}`;
strKey = `${year}-${quarter}`;
} else {//月 } 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; zuoWuDistinctMap[strKey].value += totalWeight;
zuoWuCount += totalWeight; zuoWuCount += totalWeight;
...@@ -191,91 +331,142 @@ export async function homePageStatisChanLiang(type:number) { ...@@ -191,91 +331,142 @@ export async function homePageStatisChanLiang(type:number) {
let nongChanPin = Object.values(zuoWuDistinctMap); let nongChanPin = Object.values(zuoWuDistinctMap);
for (let i = 0; i < nongChanPin.length; i++) { 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 = []; let zuoWu = [];
zuoWuDBList.forEach(info => { let zuoWuTotalWeight = 0;
let {_id, totalWeight} = info;
// 注意:这里需要重新查询原始数据来按年份筛选
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({ zuoWu.push({
key:changeEnumValue(PLANTTYPE, _id), key: changeEnumValue(PLANTTYPE, parseInt(plantType)),
value:totalWeight/1000 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 shuiChanDistinctMap = {};
let shuiChanCount = 0; let shuiChanCount = 0;
shuiChanMonthDBList.forEach(info => { shuiChanMonthDBList.forEach(info => {
let {year, month, totalWeight} = info; let {year: dataYear, month, totalWeight} = info;
// 只处理指定年份的数据
let strKey = ""; if (dataYear !== year) return;
if (type == 1) {//年
strKey = year; let strKey = `${dataYear}-${month}`;
} else if (type == 2) {//季度 if (type == 2) {//季度
let quarter = 1; let quarter = "第一季度";
if (month >= 10) quarter = 4; if (month >= 10) quarter = "第四季度";
else if (month >= 7) quarter = 3; else if (month >= 7) quarter = "第三季度";
else if (month >= 4) quarter = 2; else if (month >= 4) quarter = "第二季度";
strKey = `${year}-${quarter}`; // strKey = `${dataYear}-${quarter}`;
strKey = `${quarter}`;
} else {//月 } else {//月
strKey = `${year}-${month}`; strKey = `${dataYear}-${month}`;
} }
if (!shuiChanDistinctMap[strKey]) shuiChanDistinctMap[strKey] = {key:strKey, value:0}; if (!shuiChanDistinctMap[strKey]) shuiChanDistinctMap[strKey] = {key: strKey, value: 0};
shuiChanDistinctMap[strKey].value += totalWeight; // 水产单位转换:万尾 → 尾
let weightInTail = totalWeight * 10000;
shuiChanDistinctMap[strKey].value += weightInTail;
shuiChanCount += totalWeight; shuiChanCount += weightInTail;
}); });
let shuiChanPin = Object.values(shuiChanDistinctMap); let shuiChanPin = Object.values(shuiChanDistinctMap);
/**重复换算了 */ // 水产品产量 - 需要根据年份筛选
// for (let i = 0; i < nongChanPin.length; i++) { let shuiChanDBList = await selectChanLiangOfzuoWu({plantType: {"$gte": PLANTTYPE.鲈鱼}});
// nongChanPin[i]["value"] = Math.ceil(nongChanPin[i]["value"] / 100)/100;
// }
//农作物产量
let shuiChanDBList = await selectChanLiangOfzuoWu({plantType:{"$gte":PLANTTYPE.鲈鱼}});
let shuiChan = []; let shuiChan = [];
shuiChanDBList.forEach(info => { let shuiChanTotalWeight = 0;
let {_id, totalWeight} = info;
// 注意:这里也需要重新查询原始数据来按年份筛选
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({ shuiChan.push({
key:changeEnumValue(PLANTTYPE, _id), key: changeEnumValue(PLANTTYPE, parseInt(plantType)),
value:totalWeight/10000 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 shuiChanZhognYang = [];
let shuiChanZhognYangCount = 0; let shuiChanZhognYangCount = 0;
let zhognYangDBList = await zhongZhiData.zhongYangTongJiCount();
// 使用带年份筛选的方法
let zhognYangDBList = await zhongZhiData.zhongYangTongJiCountByYear(year);
zhognYangDBList.forEach(info => { zhognYangDBList.forEach(info => {
let {_id, sizeCount} = info; let {_id, sizeCount} = info;
// 水产单位转换:万尾 → 尾
let weightInTail = sizeCount * 10000;
shuiChanZhognYang.push({ shuiChanZhognYang.push({
key:changeEnumValue(PLANTTYPE, _id), key: changeEnumValue(PLANTTYPE, _id),
value:sizeCount value: weightInTail
}); });
shuiChanZhognYangCount += sizeCount; shuiChanZhognYangCount += weightInTail;
}); });
let dataInfo = { let dataInfo = {
zuoWu:{ zuoWu: {
count:Math.ceil(zuoWuCount/10)/100, count: Math.ceil(zuoWuCount / 10) / 100, //农产品产量总数
nongChanPin, nongChanPin, //农产品产量趋势
zuoWu:zuoWu, zuoWu: zuoWu, //农产品产量分类
}, },
shuiChan:{ shuiChan: {
count:Math.ceil(shuiChanCount/100)/100, count: Math.ceil(shuiChanCount / 100) / 100, //水产品产量总数
shuiChanPin, shuiChanPin, //水产品产量
shuiChan, shuiChan, //水产品产量分类
}, },
shuiChanZhognYang:{ shuiChanZhognYang: {
shuiChanZhognYangList:shuiChanZhognYang, shuiChanZhognYangList: shuiChanZhognYang,
count:shuiChanZhognYangCount, count: shuiChanZhognYangCount,
} }
}; };
...@@ -284,96 +475,301 @@ export async function homePageStatisChanLiang(type:number) { ...@@ -284,96 +475,301 @@ export async function homePageStatisChanLiang(type:number) {
} }
/** /**
* 统计页销售量统计 * 统计页销售量统计
* @param type * @param year 年份参数,用于筛选对应年份的数据
* @returns * @returns
*/ */
export async function homePageStatisXiaoShou() { export async function homePageStatisXiaoShou(year?: number) {
let thisYear = new Date().getFullYear(); // 构建查询条件,添加年份过滤
//产量 let currentYear = year || moment().year();
let monthDBList = await selectXiaoShouOfMonth({plantType:{"$lt":PLANTTYPE.鲈鱼}}); 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 distinctMap = {};
let count = 0; let count = 0;
let lastYearCount = 0; // let lastYearCount = 0;
monthDBList.forEach(info => { monthDBList.forEach(info => {
let {year, month, totalWeight} = info; let {year, month, totalWeight} = info;
let strKey = `${year}-${month}`; 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}; if (!distinctMap[strKey]) distinctMap[strKey] = {key:strKey, value:0};
distinctMap[strKey].value += totalWeight; distinctMap[strKey].value += totalWeight;
if (thisYear == year) count += totalWeight; if (currentYear == year) count += totalWeight;
else if (year == (thisYear-1)) lastYearCount += totalWeight; // else if (year == (currentYear-1)) lastYearCount += totalWeight;
}); });
let xiaoShouList = Object.values(distinctMap); let xiaoShouList = Object.values(distinctMap);
let xiaoShouDBList = await selectXiaoShouOfzuoWu({plantType:{"$lt":PLANTTYPE.鲈鱼}}); let xiaoShouDBList = await selectXiaoShouOfzuoWu(nonzuowuParam);
let xiaoShou = []; let xiaoShou = [];
xiaoShouDBList.forEach(info => { xiaoShouDBList.forEach(info => {
let {_id, totalWeight} = info; let {_id, totalWeight} = info;
xiaoShou.push({ xiaoShou.push({
key:changeEnumValue(PLANTTYPE, _id), key: changeEnumValue(PLANTTYPE, _id),
value:Math.ceil(totalWeight/10)/100 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++) { 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(shuichanParam);
//产量
let shuiChanMonthDBList = await selectXiaoShouOfMonth({plantType:{"$gte":PLANTTYPE.鲈鱼}});
let shuiChanDistinctMap = {}; let shuiChanDistinctMap = {};
let shuiChanCount = 0; let shuiChanCount = 0;
let suiChanLastYearCount = 0; // let suiChanLastYearCount = 0;
shuiChanMonthDBList.forEach(info => { shuiChanMonthDBList.forEach(info => {
let {year, month, totalWeight} = info; let {year, month, totalWeight} = info;
let strKey = `${year}-${month}`; 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}; 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; if (currentYear == year) shuiChanCount += weightInTail;
else if (year == (thisYear-1)) suiChanLastYearCount += totalWeight; // else if (year == (currentYear-1)) suiChanLastYearCount += totalWeight;
}); });
let suiChanxiaoShouList = Object.values(shuiChanDistinctMap); let suiChanxiaoShouList = Object.values(shuiChanDistinctMap);
let shuiChanXiaoShouDBList = await selectXiaoShouOfzuoWu({plantType:{"$gte":PLANTTYPE.鲈鱼}}); let shuiChanXiaoShouDBList = await selectXiaoShouOfzuoWu(shuichanParam);
let shuiChanxiaoShou = []; let shuiChanxiaoShou = [];
shuiChanXiaoShouDBList.forEach(info => { shuiChanXiaoShouDBList.forEach(info => {
let {_id, totalWeight} = info; let {_id, totalWeight} = info;
// 水产单位转换:万尾 → 尾
let weightInTail = totalWeight * 10000;
shuiChanxiaoShou.push({ shuiChanxiaoShou.push({
key:changeEnumValue(PLANTTYPE, _id), key: changeEnumValue(PLANTTYPE, _id),
value:Math.ceil(totalWeight/10)/100 value: weightInTail
}); });
}); });
shuiChanxiaoShou.sort((a,b) =>{return b.value - a.value}); shuiChanxiaoShou.sort((a,b) => {return b.value - a.value});
let dataInfo = { let dataInfo = {
zuoWu:{ zuoWu: { //农产品销售
count:Math.ceil(count/10)/100, count: Math.ceil(count/10)/100,
mom:Math.round( (count-lastYearCount)/lastYearCount * 1000 )/10, // mom: lastYearCount > 0 ? Math.round((count - lastYearCount) / lastYearCount * 1000) / 10 : 0,
xiaoShou:xiaoShouList, xiaoShou: xiaoShouList, //
zuoWu:xiaoShou zuoWu: xiaoShou
}, },
shuiChan:{ shuiChan: { //水产销售
count:Math.ceil(shuiChanCount/10)/100, count: Math.ceil(shuiChanCount/10)/100,
mom:Math.round( (shuiChanCount-suiChanLastYearCount)/suiChanLastYearCount * 1000 )/10, // mom: suiChanLastYearCount > 0 ? Math.round((shuiChanCount - suiChanLastYearCount) / suiChanLastYearCount * 1000) / 10 : 0,
xiaoShou:suiChanxiaoShouList, xiaoShou: suiChanxiaoShouList,
shuiChan:shuiChanxiaoShou 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}; return {dataInfo};
...@@ -381,3 +777,8 @@ export async function homePageStatisXiaoShou() { ...@@ -381,3 +777,8 @@ export async function homePageStatisXiaoShou() {
...@@ -5,8 +5,9 @@ ...@@ -5,8 +5,9 @@
import moment = require("moment"); import moment = require("moment");
import { TABLENAME } from "../../config/dbEnum"; import { TABLENAME } from "../../config/dbEnum";
import { DiKuaiConfig, ZhongYangConfig } from "../../config/eccParam"; 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 zhongzhiData from "../../data/zhongzhi";
import * as xiaoshouData from "../../data/xiaoshou";
import * as dikuaiData from "../../data/dikuai"; import * as dikuaiData from "../../data/dikuai";
import { randomId, successResult } from "../../tools/system"; import { randomId, successResult } from "../../tools/system";
import { changeEnumValue, eccEnumValue } from "../../util/verificationEnum"; import { changeEnumValue, eccEnumValue } from "../../util/verificationEnum";
...@@ -103,7 +104,9 @@ export async function addZhongYang(reqUser, param) { ...@@ -103,7 +104,9 @@ export async function addZhongYang(reqUser, param) {
//校验地块大小是否符合扣除 //校验地块大小是否符合扣除
let dkInfo = await dikuaiData.selectOne({dId:param.dId}); let dkInfo = await dikuaiData.selectOne({dId:param.dId});
if (!dkInfo || !dkInfo.dId) throw new BizError(ERRORENUM.地块不存在); if (!dkInfo || !dkInfo.dId) throw new BizError(ERRORENUM.地块不存在);
if (param.plantType < PLANTTYPE.鲈鱼 && param.plantType > PLANTTYPE.水稻 ) {
if (dkInfo.size < param.size) throw new BizError(ERRORENUM.地块大小不足); if (dkInfo.size < param.size) throw new BizError(ERRORENUM.地块大小不足);
}
let addInfo = { let addInfo = {
zId:randomId(TABLENAME.种植表), zId:randomId(TABLENAME.种植表),
...@@ -227,3 +230,269 @@ export async function zhongYangJiLu(zhongYangType:number, selectStr:string, plan ...@@ -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'; import {Schema} from 'mongoose';
...@@ -122,3 +121,74 @@ export async function zhongYangTongJiCount() { ...@@ -122,3 +121,74 @@ export async function zhongYangTongJiCount() {
return list; 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"; ...@@ -4,7 +4,7 @@ import { httpServer } from "./net/http_server";
import { initDB } from "./db/dbInit"; import { initDB } from "./db/dbInit";
import { dataInit0516, dataInit, dataInit0508, yjDataInit0508, dataInit0522, dataInit0604, dataInit0609, dataInit0618 } from "./biz/dataInt"; import { dataInit0516, dataInit, dataInit0508, yjDataInit0508, dataInit0522, dataInit0604, dataInit0609, dataInit0618 } from "./biz/dataInt";
import { getDataOut, getGuiYuOut } from "./biz/dataOut"; 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"; import { getPwdMd5, md5PwdStr } from "./tools/system";
async function lanuch() { async function lanuch() {
...@@ -17,7 +17,8 @@ async function lanuch() { ...@@ -17,7 +17,8 @@ async function lanuch() {
httpServer.createServer(systemConfig.port); httpServer.createServer(systemConfig.port);
console.log('This indicates that the server is started successfully.'); console.log('This indicates that the server is started successfully.');
// await homePageStatisChanLiang(1); // await homePageStatisXiaoShou(1, 2025);
// await homePageStatisChanLiangWithYear(2025, 1);
// await dataInit(); // await dataInit();
await getDataOut(); await getDataOut();
// await dataInit0508(); // await dataInit0508();
......
...@@ -5,7 +5,7 @@ import compression = require('compression'); ...@@ -5,7 +5,7 @@ import compression = require('compression');
import { watch } from '../middleware/watch'; import { watch } from '../middleware/watch';
import { httpErrorHandler } from '../middleware/httpErrorHandler'; import { httpErrorHandler } from '../middleware/httpErrorHandler';
import * as path from "path"; import * as path from "path";
import * as fallback from 'express-history-api-fallback'; import fallback from 'express-history-api-fallback';
export class httpServer { export class httpServer {
static createServer(port:number) { static createServer(port:number) {
......
...@@ -55,9 +55,11 @@ export function setRouter(httpServer){ ...@@ -55,9 +55,11 @@ export function setRouter(httpServer){
httpServer.post('/zjnt/xcx/user/login', asyncHandler(user_login));//登录 httpServer.post('/zjnt/xcx/user/login', asyncHandler(user_login));//登录
httpServer.post('/zjnt/xcx/user/logout', checkUserToken, asyncHandler(user_logout));//登出 httpServer.post('/zjnt/xcx/user/logout', checkUserToken, asyncHandler(user_logout));//登出
/**大屏用 */
httpServer.post('/zjnt/xcx/dataout/zzzmj', asyncHandler(data_out));// 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) { ...@@ -79,14 +81,16 @@ async function data_out_guiyu(req, res) {
/**================================================================首页 */ /**================================================================首页 */
async function home_statis_chanliang(req, res) { async function home_statis_chanliang(req, res) {
let reqConf = {type:'Number'}; let reqConf = {type:'Number', year:'Number'};
let { type } = eccReqParamater(reqConf, req.body); let { type, year } = eccReqParamater(reqConf, req.body);
let result = await userBiz.homePageStatisChanLiang(type); let result = await userBiz.homePageStatisChanLiang(year, type);
res.success(result); res.success(result);
} }
async function home_statis_xiaoshou(req, res) { 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); res.success(result);
} }
...@@ -286,6 +290,26 @@ async function zhongyang_jilu_list(req, res) { ...@@ -286,6 +290,26 @@ async function zhongyang_jilu_list(req, res) {
res.success(result); 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) { async function dikuai_add(req, res) {
......
...@@ -4,9 +4,12 @@ ...@@ -4,9 +4,12 @@
"target": "es2017", "target": "es2017",
"sourceMap": true, "sourceMap": true,
"rootDir":"./src", "rootDir":"./src",
"outDir":"./out" "outDir":"./out",
"esModuleInterop": true,
"allowSyntheticDefaultImports": true
}, },
"exclude": [ "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