Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Z
zjnyxcxServer
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
node_server
zjnyxcxServer
Commits
bd25b882
Commit
bd25b882
authored
Jan 27, 2026
by
chenjinjing
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
no message
parent
2a92cb38
Show whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
1773 additions
and
216 deletions
+1773
-216
package-lock.json
package-lock.json
+5
-4
package.json
package.json
+0
-1
caiShou.ts
src/biz/admin/caiShou.ts
+3
-3
nongzi.ts
src/biz/admin/nongzi.ts
+4
-3
user.ts
src/biz/admin/user.ts
+161
-4
xiaoShou.ts
src/biz/admin/xiaoShou.ts
+2
-2
zhongYang.ts
src/biz/admin/zhongYang.ts
+8
-2
dataOut.ts
src/biz/dataOut.ts
+369
-71
user.ts
src/biz/xcx/user.ts
+513
-112
zhongYang.ts
src/biz/xcx/zhongYang.ts
+270
-1
水产统计-万尾.ini
src/biz/xcx/水产统计-万尾.ini
+326
-0
zhongzhi.ts
src/data/zhongzhi.ts
+72
-2
main.ts
src/main.ts
+3
-2
http_server.ts
src/net/http_server.ts
+1
-1
router.ts
src/routers/router.ts
+30
-6
tsconfig.json
tsconfig.json
+6
-2
No files found.
package-lock.json
View file @
bd25b882
...
@@ -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.npm
js.org
/express-history-api-fallback/-/express-history-api-fallback-2.2.1.tgz"
,
"resolved"
:
"https://registry.npm
mirror.com
/express-history-api-fallback/-/express-history-api-fallback-2.2.1.tgz"
,
"integrity"
:
"sha
1-OirSf3vryQ/FM9EQ18bYMJe80Fc
="
"integrity"
:
"sha
512-swxwm3aP8vrOOvlzOdZvHlSZtJGwHKaY94J6AkrAgCTmcbko3IRwbkhLv2wKV1WeZhjxX58aLMpP3atDBnKuZg=
="
},
},
"extend"
:
{
"extend"
:
{
"version"
:
"3.0.2"
,
"version"
:
"3.0.2"
,
...
...
package.json
View file @
bd25b882
...
@@ -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"
},
},
...
...
src/biz/admin/caiShou.ts
View file @
bd25b882
...
@@ -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
,
...
...
src/biz/admin/nongzi.ts
View file @
bd25b882
...
@@ -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
,
...
...
src/biz/admin/user.ts
View file @
bd25b882
...
@@ -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
.
user
I
d
);
let
userInfo
=
await
findUserInfoByUserId
(
reqUserInfo
.
user
i
d
);
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};
// }
src/biz/admin/xiaoShou.ts
View file @
bd25b882
...
@@ -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
({
...
...
src/biz/admin/zhongYang.ts
View file @
bd25b882
...
@@ -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"
),
};
};
...
...
src/biz/dataOut.ts
View file @
bd25b882
...
@@ -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
=>
{
...
...
src/biz/xcx/user.ts
View file @
bd25b882
/**
/**
* 用户
* 用户
* 水产养殖和销售数量数据库默认单位-万尾
*/
*/
...
@@ -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
=
`
${
y
ear
}
-
${
month
}
`
;
strKey
=
`
${
dataY
ear
}
-
${
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
=
`
${
y
ear
}
-
${
month
}
`
;
strKey
=
`
${
dataY
ear
}
-
${
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
(
this
Year
==
year
)
count
+=
totalWeight
;
if
(
current
Year
==
year
)
count
+=
totalWeight
;
else
if
(
year
==
(
this
Year
-
1
))
lastYearCount
+=
totalWeight
;
// else if (year == (current
Year-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
==
(
this
Year
-
1
))
suiChanLastYearCount
+=
totalWeight
;
// else if (year == (current
Year-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
)
/
1
0
,
// 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() {
src/biz/xcx/zhongYang.ts
View file @
bd25b882
...
@@ -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
;
}
src/biz/xcx/水产统计-万尾.ini
0 → 100644
View file @
bd25b882
/**
*
统计页-农产品产量统计
*
@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
src/data/zhongzhi.ts
View file @
bd25b882
/**
/**
*
* 种植
*
*/
*/
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
;
}
src/main.ts
View file @
bd25b882
...
@@ -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
{
homePageStatisChanLiang
WithYear
,
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();
...
...
src/net/http_server.ts
View file @
bd25b882
...
@@ -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
)
{
...
...
src/routers/router.ts
View file @
bd25b882
...
@@ -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
)
{
...
...
tsconfig.json
View file @
bd25b882
...
@@ -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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment