From 8e99c3b1e12340c27ef71a3a3b0e7c93ae7f8464 Mon Sep 17 00:00:00 2001
From: wupengfei <834520024@qq.com>
Date: 星期五, 28 十一月 2025 13:04:29 +0800
Subject: [PATCH] feat: databoard
---
src/views/DataBoard/components/DataBoardContentItem.vue | 56 +
src/views/DataBoard/components/DataBoardCenterMapMark.vue | 84 ++
src/assets/dataBoard/data-board-center-bg.png | 0
src/assets/dataBoard/data-board-center-icon2.png | 0
src/assets/dataBoard/data-board-title-bg.png | 0
src/services/api/WaterDropCloud.ts | 11
src/assets/fonts/DrukWide-Bold.woff | 0
src/views/DataBoard/hooks/index.ts | 197 +++++
src/assets/dataBoard/data-board-data-info-bg1.png | 0
src/views/DataBoard/components/DataBoardCenterDataContent.vue | 46 +
src/assets/dataBoard/data-board-data-info-bg5.png | 0
src/views/DataBoard/components/DataOverviewContent.vue | 57 +
src/assets/dataBoard/data-board-map-choose.png | 0
src/services/api/DataBoard.ts | 174 +++++
src/assets/fonts/YouSheBiaoTiHei Regular.ttf | 0
src/style/index.scss | 21
src/assets/dataBoard/data-board-center-map.png | 0
src/views/DataBoard/components/DataBoardCenterMap.vue | 179 +++++
src/views/DataBoard/components/DataBoardTableView.vue | 117 +++
src/assets/dataBoard/data-board-center-icon1.png | 0
src/services/api/IndustrialPark.ts | 18
src/assets/dataBoard/data-board-data-info-bg4.png | 0
src/views/DataBoard/components/DataBoardDataInfoItem.vue | 64 +
src/assets/dataBoard/data-board-map-init.png | 0
src/assets/dataBoard/data-board-data-info-bg8.png | 0
src/views/DataBoard/DataBoardHome.vue | 306 +++++++++
src/assets/dataBoard/data-board-table-icon2.png | 0
src/views/DataBoard/utils/index.ts | 280 ++++++++
src/assets/dataBoard/data-board-table-icon3.png | 0
src/services/api/typings.d.ts | 211 ++++++
src/assets/dataBoard/data-board-data-info-bg7.png | 0
src/assets/fonts/Fontquan-XinYiGuanHeiTi Regular.ttf | 0
src/assets/dataBoard/data-board-center-chart-bg.png | 0
src/assets/dataBoard/data-board-data-info-bg3.png | 0
src/hooks/industrialPark.ts | 10
src/services/api/index.ts | 4
src/assets/dataBoard/data-board-footer.png | 0
src/assets/dataBoard/data-board-table-icon1.png | 0
src/assets/fonts/DrukWide-Bold.ttf | 0
src/assets/dataBoard/data-board-center-icon3.png | 0
src/assets/dataBoard/data-board-bg.png | 0
src/assets/dataBoard/data-board-data-info-bg6.png | 0
src/views/DataBoard/components/DataBoardCenterChart.vue | 92 ++
src/assets/dataBoard/data-board-data-info-bg2.png | 0
src/assets/fonts/DrukWide-Bold.woff2 | 0
src/views/DataBoard/components/DataBoardCenterDataItem.vue | 80 ++
46 files changed, 2,004 insertions(+), 3 deletions(-)
diff --git a/src/assets/dataBoard/data-board-bg.png b/src/assets/dataBoard/data-board-bg.png
new file mode 100644
index 0000000..15d656e
--- /dev/null
+++ b/src/assets/dataBoard/data-board-bg.png
Binary files differ
diff --git a/src/assets/dataBoard/data-board-center-bg.png b/src/assets/dataBoard/data-board-center-bg.png
new file mode 100644
index 0000000..1abd0d5
--- /dev/null
+++ b/src/assets/dataBoard/data-board-center-bg.png
Binary files differ
diff --git a/src/assets/dataBoard/data-board-center-chart-bg.png b/src/assets/dataBoard/data-board-center-chart-bg.png
new file mode 100644
index 0000000..12aaf93
--- /dev/null
+++ b/src/assets/dataBoard/data-board-center-chart-bg.png
Binary files differ
diff --git a/src/assets/dataBoard/data-board-center-icon1.png b/src/assets/dataBoard/data-board-center-icon1.png
new file mode 100644
index 0000000..754a590
--- /dev/null
+++ b/src/assets/dataBoard/data-board-center-icon1.png
Binary files differ
diff --git a/src/assets/dataBoard/data-board-center-icon2.png b/src/assets/dataBoard/data-board-center-icon2.png
new file mode 100644
index 0000000..baa1574
--- /dev/null
+++ b/src/assets/dataBoard/data-board-center-icon2.png
Binary files differ
diff --git a/src/assets/dataBoard/data-board-center-icon3.png b/src/assets/dataBoard/data-board-center-icon3.png
new file mode 100644
index 0000000..a7a3a1d
--- /dev/null
+++ b/src/assets/dataBoard/data-board-center-icon3.png
Binary files differ
diff --git a/src/assets/dataBoard/data-board-center-map.png b/src/assets/dataBoard/data-board-center-map.png
new file mode 100644
index 0000000..59862d9
--- /dev/null
+++ b/src/assets/dataBoard/data-board-center-map.png
Binary files differ
diff --git a/src/assets/dataBoard/data-board-data-info-bg1.png b/src/assets/dataBoard/data-board-data-info-bg1.png
new file mode 100644
index 0000000..d9f19a3
--- /dev/null
+++ b/src/assets/dataBoard/data-board-data-info-bg1.png
Binary files differ
diff --git a/src/assets/dataBoard/data-board-data-info-bg2.png b/src/assets/dataBoard/data-board-data-info-bg2.png
new file mode 100644
index 0000000..ac63e2a
--- /dev/null
+++ b/src/assets/dataBoard/data-board-data-info-bg2.png
Binary files differ
diff --git a/src/assets/dataBoard/data-board-data-info-bg3.png b/src/assets/dataBoard/data-board-data-info-bg3.png
new file mode 100644
index 0000000..bfef642
--- /dev/null
+++ b/src/assets/dataBoard/data-board-data-info-bg3.png
Binary files differ
diff --git a/src/assets/dataBoard/data-board-data-info-bg4.png b/src/assets/dataBoard/data-board-data-info-bg4.png
new file mode 100644
index 0000000..d65983b
--- /dev/null
+++ b/src/assets/dataBoard/data-board-data-info-bg4.png
Binary files differ
diff --git a/src/assets/dataBoard/data-board-data-info-bg5.png b/src/assets/dataBoard/data-board-data-info-bg5.png
new file mode 100644
index 0000000..daff347
--- /dev/null
+++ b/src/assets/dataBoard/data-board-data-info-bg5.png
Binary files differ
diff --git a/src/assets/dataBoard/data-board-data-info-bg6.png b/src/assets/dataBoard/data-board-data-info-bg6.png
new file mode 100644
index 0000000..a5f7d59
--- /dev/null
+++ b/src/assets/dataBoard/data-board-data-info-bg6.png
Binary files differ
diff --git a/src/assets/dataBoard/data-board-data-info-bg7.png b/src/assets/dataBoard/data-board-data-info-bg7.png
new file mode 100644
index 0000000..3fecb41
--- /dev/null
+++ b/src/assets/dataBoard/data-board-data-info-bg7.png
Binary files differ
diff --git a/src/assets/dataBoard/data-board-data-info-bg8.png b/src/assets/dataBoard/data-board-data-info-bg8.png
new file mode 100644
index 0000000..3d5b9df
--- /dev/null
+++ b/src/assets/dataBoard/data-board-data-info-bg8.png
Binary files differ
diff --git a/src/assets/dataBoard/data-board-footer.png b/src/assets/dataBoard/data-board-footer.png
new file mode 100644
index 0000000..0c7bc3c
--- /dev/null
+++ b/src/assets/dataBoard/data-board-footer.png
Binary files differ
diff --git a/src/assets/dataBoard/data-board-map-choose.png b/src/assets/dataBoard/data-board-map-choose.png
new file mode 100644
index 0000000..e4d4e2b
--- /dev/null
+++ b/src/assets/dataBoard/data-board-map-choose.png
Binary files differ
diff --git a/src/assets/dataBoard/data-board-map-init.png b/src/assets/dataBoard/data-board-map-init.png
new file mode 100644
index 0000000..590929b
--- /dev/null
+++ b/src/assets/dataBoard/data-board-map-init.png
Binary files differ
diff --git a/src/assets/dataBoard/data-board-table-icon1.png b/src/assets/dataBoard/data-board-table-icon1.png
new file mode 100644
index 0000000..8c71a84
--- /dev/null
+++ b/src/assets/dataBoard/data-board-table-icon1.png
Binary files differ
diff --git a/src/assets/dataBoard/data-board-table-icon2.png b/src/assets/dataBoard/data-board-table-icon2.png
new file mode 100644
index 0000000..1b362f6
--- /dev/null
+++ b/src/assets/dataBoard/data-board-table-icon2.png
Binary files differ
diff --git a/src/assets/dataBoard/data-board-table-icon3.png b/src/assets/dataBoard/data-board-table-icon3.png
new file mode 100644
index 0000000..585ea20
--- /dev/null
+++ b/src/assets/dataBoard/data-board-table-icon3.png
Binary files differ
diff --git a/src/assets/dataBoard/data-board-title-bg.png b/src/assets/dataBoard/data-board-title-bg.png
new file mode 100644
index 0000000..165d571
--- /dev/null
+++ b/src/assets/dataBoard/data-board-title-bg.png
Binary files differ
diff --git a/src/assets/fonts/DrukWide-Bold.ttf b/src/assets/fonts/DrukWide-Bold.ttf
new file mode 100644
index 0000000..3c5feb2
--- /dev/null
+++ b/src/assets/fonts/DrukWide-Bold.ttf
Binary files differ
diff --git a/src/assets/fonts/DrukWide-Bold.woff b/src/assets/fonts/DrukWide-Bold.woff
new file mode 100644
index 0000000..06100fa
--- /dev/null
+++ b/src/assets/fonts/DrukWide-Bold.woff
Binary files differ
diff --git a/src/assets/fonts/DrukWide-Bold.woff2 b/src/assets/fonts/DrukWide-Bold.woff2
new file mode 100644
index 0000000..c2a3c17
--- /dev/null
+++ b/src/assets/fonts/DrukWide-Bold.woff2
Binary files differ
diff --git a/src/assets/fonts/Fontquan-XinYiGuanHeiTi Regular.ttf b/src/assets/fonts/Fontquan-XinYiGuanHeiTi Regular.ttf
new file mode 100644
index 0000000..e651bf5
--- /dev/null
+++ b/src/assets/fonts/Fontquan-XinYiGuanHeiTi Regular.ttf
Binary files differ
diff --git a/src/assets/fonts/YouSheBiaoTiHei Regular.ttf b/src/assets/fonts/YouSheBiaoTiHei Regular.ttf
new file mode 100644
index 0000000..3729151
--- /dev/null
+++ b/src/assets/fonts/YouSheBiaoTiHei Regular.ttf
Binary files differ
diff --git a/src/hooks/industrialPark.ts b/src/hooks/industrialPark.ts
index d32c100..ac9adc3 100644
--- a/src/hooks/industrialPark.ts
+++ b/src/hooks/industrialPark.ts
@@ -37,6 +37,15 @@
return industrialPark?.parkName ?? '';
}
+ /**鏁版嵁鐪嬫澘 */
+ const dataBoardIndustrialParkList = computed(() => {
+ return industrialParkList.value.map((x, index) => ({
+ ...x,
+ choose: index === 0,
+ class: `init${index + 1}`,
+ }));
+ });
+
return {
industrialParkList,
getIndustrialParkNameById,
@@ -44,5 +53,6 @@
getIndustrialParkTypeNameById,
getIndustrialParkByName,
fourStreamsIndustrialParkList,
+ dataBoardIndustrialParkList,
};
}
diff --git a/src/services/api/DataBoard.ts b/src/services/api/DataBoard.ts
new file mode 100644
index 0000000..79bb9f7
--- /dev/null
+++ b/src/services/api/DataBoard.ts
@@ -0,0 +1,174 @@
+/* eslint-disable */
+// @ts-ignore
+import { request } from '@/utils/request';
+
+/** 鏌ヨ鏁版嵁鐪嬫澘濂栧姳閲戜娇鐢ㄦ帓琛� GET /api/DataBoard/GetDataBoardBountyUseAmountRank */
+export async function getDataBoardBountyUseAmountRank(
+ // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+ params: API.APIgetDataBoardBountyUseAmountRankParams,
+ options?: API.RequestConfig
+) {
+ return request<API.GetDataBoardBountyUseAmountRankOutput>(
+ '/api/DataBoard/GetDataBoardBountyUseAmountRank',
+ {
+ method: 'GET',
+ params: {
+ ...params,
+ },
+ ...(options || {}),
+ }
+ );
+}
+
+/** 鏌ヨ鏁版嵁鐪嬫澘鎶曚繚浜烘暟鎺掕 GET /api/DataBoard/GetDataBoardInsurePeopleCountRank */
+export async function getDataBoardInsurePeopleCountRank(
+ // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+ params: API.APIgetDataBoardInsurePeopleCountRankParams,
+ options?: API.RequestConfig
+) {
+ return request<API.GetDataBoardInsurePeopleCountRankOutput>(
+ '/api/DataBoard/GetDataBoardInsurePeopleCountRank',
+ {
+ method: 'GET',
+ params: {
+ ...params,
+ },
+ ...(options || {}),
+ }
+ );
+}
+
+/** 鏌ヨ鏁版嵁鐪嬫澘鏂板鐢虫姤鎵规 GET /api/DataBoard/GetDataBoardNewBountyApplyCount */
+export async function getDataBoardNewBountyApplyCount(
+ // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+ params: API.APIgetDataBoardNewBountyApplyCountParams,
+ options?: API.RequestConfig
+) {
+ return request<API.GetDataBoardNewBountyApplyCountOutput>(
+ '/api/DataBoard/GetDataBoardNewBountyApplyCount',
+ {
+ method: 'GET',
+ params: {
+ ...params,
+ input: undefined,
+ ...params['input'],
+ },
+ ...(options || {}),
+ }
+ );
+}
+
+/** 鏌ヨ鏁版嵁鐪嬫澘鏂板鍙戞斁棰� GET /api/DataBoard/GetDataBoardNewBountyReleaseAmountCount */
+export async function getDataBoardNewBountyReleaseAmountCount(
+ // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+ params: API.APIgetDataBoardNewBountyReleaseAmountCountParams,
+ options?: API.RequestConfig
+) {
+ return request<API.GetDataBoardNewBountyReleaseAmountCountOutput>(
+ '/api/DataBoard/GetDataBoardNewBountyReleaseAmountCount',
+ {
+ method: 'GET',
+ params: {
+ ...params,
+ input: undefined,
+ ...params['input'],
+ },
+ ...(options || {}),
+ }
+ );
+}
+
+/** 鏌ヨ鏁版嵁鐪嬫澘鏂板鍙戞斁棰� GET /api/DataBoard/GetDataBoardNewBountyUseAmountCount */
+export async function getDataBoardNewBountyUseAmountCount(
+ // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+ params: API.APIgetDataBoardNewBountyUseAmountCountParams,
+ options?: API.RequestConfig
+) {
+ return request<API.GetDataBoardNewBountyUseAmountCountOutput>(
+ '/api/DataBoard/GetDataBoardNewBountyUseAmountCount',
+ {
+ method: 'GET',
+ params: {
+ ...params,
+ input: undefined,
+ ...params['input'],
+ },
+ ...(options || {}),
+ }
+ );
+}
+
+/** 鏌ヨ鏁版嵁鐪嬫澘鏂板鍏ラ┗浼佷笟 GET /api/DataBoard/GetDataBoardNewCustomerCount */
+export async function getDataBoardNewCustomerCount(
+ // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+ params: API.APIgetDataBoardNewCustomerCountParams,
+ options?: API.RequestConfig
+) {
+ return request<API.GetDataBoardNewCustomerCountOutput>(
+ '/api/DataBoard/GetDataBoardNewCustomerCount',
+ {
+ method: 'GET',
+ params: {
+ ...params,
+ input: undefined,
+ ...params['input'],
+ },
+ ...(options || {}),
+ }
+ );
+}
+
+/** 鏌ヨ鏁版嵁鐪嬫澘鎶曚繚浜烘暟瀵规瘮 GET /api/DataBoard/GetDataBoardNewInsurePeopleCount */
+export async function getDataBoardNewInsurePeopleCount(
+ // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+ params: API.APIgetDataBoardNewInsurePeopleCountParams,
+ options?: API.RequestConfig
+) {
+ return request<API.GetDataBoardNewInsurePeopleCountOutput>(
+ '/api/DataBoard/GetDataBoardNewInsurePeopleCount',
+ {
+ method: 'GET',
+ params: {
+ ...params,
+ input: undefined,
+ ...params['input'],
+ },
+ ...(options || {}),
+ }
+ );
+}
+
+/** 鏌ヨ鏁版嵁鐪嬫澘姒傚喌 GET /api/DataBoard/GetDataBoardOverview */
+export async function getDataBoardOverview(
+ // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+ params: API.APIgetDataBoardOverviewParams,
+ options?: API.RequestConfig
+) {
+ return request<API.GetDataBoardOverviewOutput>('/api/DataBoard/GetDataBoardOverview', {
+ method: 'GET',
+ params: {
+ ...params,
+ input: undefined,
+ ...params['input'],
+ },
+ ...(options || {}),
+ });
+}
+
+/** 鏌ヨ鏁版嵁鐪嬫澘鍥尯姒傚喌 GET /api/DataBoard/GetDataBoardOverviewByPark */
+export async function getDataBoardOverviewByPark(
+ // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+ params: API.APIgetDataBoardOverviewByParkParams,
+ options?: API.RequestConfig
+) {
+ return request<API.GetDataBoardOverviewByParkOutput>(
+ '/api/DataBoard/GetDataBoardOverviewByPark',
+ {
+ method: 'GET',
+ params: {
+ ...params,
+ },
+ ...(options || {}),
+ }
+ );
+}
diff --git a/src/services/api/IndustrialPark.ts b/src/services/api/IndustrialPark.ts
index 2f0af63..d07dcca 100644
--- a/src/services/api/IndustrialPark.ts
+++ b/src/services/api/IndustrialPark.ts
@@ -99,6 +99,24 @@
);
}
+/** 鏌ヨ鍥尯濂栧姳閲戞ā鏉垮悕绉� POST /api/IndustrialPark/GetIndustrialPartBountyTemplates */
+export async function getIndustrialPartBountyTemplates(
+ body: API.GetIndustrialPartBountyTemplatesInput,
+ options?: API.RequestConfig
+) {
+ return request<API.GetIndustrialPartBountyTemplatesOutput>(
+ '/api/IndustrialPark/GetIndustrialPartBountyTemplates',
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ data: body,
+ ...(options || {}),
+ }
+ );
+}
+
/** 璁剧疆濂栧姳閲戠敵鎶ョ姸鎬� POST /api/IndustrialPark/SetIndustrialParkRewardEnable */
export async function setIndustrialParkRewardEnable(
body: API.SetIndustrialParkRewardEnableInput,
diff --git a/src/services/api/WaterDropCloud.ts b/src/services/api/WaterDropCloud.ts
new file mode 100644
index 0000000..b4cdc31
--- /dev/null
+++ b/src/services/api/WaterDropCloud.ts
@@ -0,0 +1,11 @@
+/* eslint-disable */
+// @ts-ignore
+import { request } from '@/utils/request';
+
+/** 鍚屾瀹㈡埛鏉愭枡 POST /api/WaterDropCloud/SyncCompanyMaterial */
+export async function syncCompanyMaterial(options?: API.RequestConfig) {
+ return request<any>('/api/WaterDropCloud/SyncCompanyMaterial', {
+ method: 'POST',
+ ...(options || {}),
+ });
+}
diff --git a/src/services/api/index.ts b/src/services/api/index.ts
index a0a2349..ec96c7f 100644
--- a/src/services/api/index.ts
+++ b/src/services/api/index.ts
@@ -23,6 +23,7 @@
import * as Consult from './Consult';
import * as CooperationApply from './CooperationApply';
import * as Customer from './Customer';
+import * as DataBoard from './DataBoard';
import * as ElectronSign from './ElectronSign';
import * as EnterpriseApplyFile from './EnterpriseApplyFile';
import * as EnterpriseMaterial from './EnterpriseMaterial';
@@ -90,6 +91,7 @@
import * as Version from './Version';
import * as Wallet from './Wallet';
import * as WalletChannel from './WalletChannel';
+import * as WaterDropCloud from './WaterDropCloud';
import * as Withdraw from './Withdraw';
import * as WxNotify from './WxNotify';
import * as WxPayNotify from './WxPayNotify';
@@ -115,6 +117,7 @@
Consult,
CooperationApply,
Customer,
+ DataBoard,
ElectronSign,
EnterpriseApplyFile,
EnterpriseMaterial,
@@ -182,6 +185,7 @@
Version,
Wallet,
WalletChannel,
+ WaterDropCloud,
Withdraw,
WxNotify,
WxPayNotify,
diff --git a/src/services/api/typings.d.ts b/src/services/api/typings.d.ts
index 3e48d67..e6dfa4b 100644
--- a/src/services/api/typings.d.ts
+++ b/src/services/api/typings.d.ts
@@ -249,7 +249,7 @@
/** 鏄惁鏀寔璐㈡斂鎷ㄤ粯 */
suportFinance?: boolean;
/** 鏂囦欢 */
- industrialParkApplyFileFile?: IndustrialParkApplyFileFile[];
+ bountTemplates?: AddIndustrialParkInputBountTemplate[];
/** 鏃犻渶鏀垮姟绔鏍� */
notNeedGovernmentAudit?: boolean;
/** 鏃犻渶杩愯惀绔鏍� */
@@ -258,6 +258,15 @@
dualReviewOfGovernmentAffairs?: boolean;
/** 鍏徃淇℃伅 */
industrialParkCompanyFile?: IndustrialParkCompanyFile[];
+ }
+
+ interface AddIndustrialParkInputBountTemplate {
+ /** 妯℃澘Id */
+ templateId?: string;
+ /** 妯℃澘鍚嶇О */
+ templateName?: string;
+ /** 鏂囦欢 */
+ items?: IndustrialParkApplyFileFile[];
}
interface AddIndustryBodyAuditInput {
@@ -467,6 +476,8 @@
interface AddParkBountyApplyStepOneInput {
batchNo?: string;
parkId?: string;
+ /** 濂栧姳閲戞ā鏉縄d */
+ bountyTemplateId?: string;
applyMonth?: string;
removeCompanyIds?: string[];
}
@@ -1398,6 +1409,7 @@
interface APIgetCustomerFileTypeHeadParams {
enterpriseId?: string;
+ templateId?: string;
}
interface APIgetCustomerTemplateDetailParams {
@@ -1410,6 +1422,44 @@
interface APIgetCustomerTemplateParamListByTemplateIdParams {
templateId?: string;
+ }
+
+ interface APIgetDataBoardBountyUseAmountRankParams {
+ /** 鏌ヨ鏁伴噺 */
+ take?: number;
+ }
+
+ interface APIgetDataBoardInsurePeopleCountRankParams {
+ /** 鏌ヨ鏁伴噺 */
+ take?: number;
+ }
+
+ interface APIgetDataBoardNewBountyApplyCountParams {
+ input?: GetDataBoardNewBountyApplyCountInput;
+ }
+
+ interface APIgetDataBoardNewBountyReleaseAmountCountParams {
+ input?: GetDataBoardNewBountyReleaseAmountCountInput;
+ }
+
+ interface APIgetDataBoardNewBountyUseAmountCountParams {
+ input?: GetDataBoardNewBountyUseAmountCountInput;
+ }
+
+ interface APIgetDataBoardNewCustomerCountParams {
+ input?: GetDataBoardNewCustomerCountInput;
+ }
+
+ interface APIgetDataBoardNewInsurePeopleCountParams {
+ input?: GetDataBoardNewInsurePeopleCountInput;
+ }
+
+ interface APIgetDataBoardOverviewByParkParams {
+ industrialParkId?: string;
+ }
+
+ interface APIgetDataBoardOverviewParams {
+ input?: GetDataBoardOverviewInput;
}
interface APIgetDefaultConnectionStringParams {
@@ -5851,6 +5901,8 @@
applyAmount?: number;
fileTypes?: CustomerUploadMonthApplyFileType[];
enterpriseId?: string;
+ /** 濂栧姳閲戞ā鏉縄d */
+ bountyTemplateId?: string;
/** 鏄惁鏄繍钀ョ浠d笂浼� */
isAdminFileUpload?: boolean;
}
@@ -5880,6 +5932,8 @@
applyAmount?: number;
fileTypes?: CustomerUploadMonthApplyFileType[];
enterpriseId?: string;
+ /** 濂栧姳閲戞ā鏉縄d */
+ bountyTemplateId?: string;
/** 鏄惁鏄繍钀ョ浠d笂浼� */
isAdminFileUpload?: boolean;
/** 姹囨�绘潗鏂� */
@@ -7722,6 +7776,8 @@
interface GetCustomerUploadApplyFilesInput {
id?: string;
enterpriseId?: string;
+ /** 濂栧姳閲戞ā鏉縄d */
+ bountyTemplateId?: string;
userId?: string;
withMonth?: string;
parkBountyApplyId?: string;
@@ -7746,6 +7802,8 @@
interface GetCustomerUploadApplyFilesResponse {
/** 鎵�灞炴湀浠� */
withMonth?: string;
+ /** 濂栧姳閲戞ā鏉縄d */
+ bountyTemplateId?: string;
/** 浼佷笟鍚嶇О */
enterpriseName?: string;
/** 鐢虫姤閲戦 */
@@ -7759,6 +7817,8 @@
interface GetCustomerUploadApplyFilesV2Response {
/** 鎵�灞炴湀浠� */
withMonth?: string;
+ /** 濂栧姳閲戞ā鏉縄d */
+ bountyTemplateId?: string;
/** 浼佷笟鍚嶇О */
enterpriseName?: string;
/** 鐢虫姤閲戦 */
@@ -7775,11 +7835,119 @@
interface GetCustomerUploadFileRecordInput {
withMonth?: string;
+ /** 濂栧姳閲戞ā鏉縄d */
+ bountyTemplateId?: string;
userId?: string;
+ isApply?: boolean;
}
interface GetCustomerUploadFileRecordOutput {
id?: string;
+ }
+
+ interface GetDataBoardBountyUseAmountRankOutput {
+ items?: GetDataBoardBountyUseAmountRankOutputItem[];
+ }
+
+ interface GetDataBoardBountyUseAmountRankOutputItem {
+ /** 浼佷笟鍚嶇О */
+ enterpriseName?: string;
+ /** 閲戦 */
+ amount?: number;
+ }
+
+ interface GetDataBoardInsurePeopleCountRankOutput {
+ items?: GetDataBoardInsurePeopleCountRankOutputItem[];
+ }
+
+ interface GetDataBoardInsurePeopleCountRankOutputItem {
+ /** 浼佷笟鍚嶇О */
+ enterpriseName?: string;
+ /** 浜烘暟 */
+ count?: number;
+ }
+
+ type GetDataBoardNewBountyApplyCountInput = Record<string, any>;
+
+ interface GetDataBoardNewBountyApplyCountOutput {
+ /** X杞� */
+ x?: string[];
+ /** 褰撴湀鏁版嵁 */
+ currentMonthData?: number[];
+ /** 涓婃湀鏁版嵁 */
+ lastMonthData?: number[];
+ }
+
+ type GetDataBoardNewBountyReleaseAmountCountInput = Record<string, any>;
+
+ interface GetDataBoardNewBountyReleaseAmountCountOutput {
+ /** X杞� */
+ x?: string[];
+ /** 褰撴湀鏁版嵁 */
+ currentMonthData?: number[];
+ /** 涓婃湀鏁版嵁 */
+ lastMonthData?: number[];
+ }
+
+ type GetDataBoardNewBountyUseAmountCountInput = Record<string, any>;
+
+ interface GetDataBoardNewBountyUseAmountCountOutput {
+ /** X杞� */
+ x?: string[];
+ /** 褰撴湀鏁版嵁 */
+ currentMonthData?: number[];
+ /** 涓婃湀鏁版嵁 */
+ lastMonthData?: number[];
+ }
+
+ type GetDataBoardNewCustomerCountInput = Record<string, any>;
+
+ interface GetDataBoardNewCustomerCountOutput {
+ /** X杞� */
+ x?: string[];
+ /** 褰撴湀鏁版嵁 */
+ currentMonthData?: number[];
+ /** 涓婃湀鏁版嵁 */
+ lastMonthData?: number[];
+ }
+
+ type GetDataBoardNewInsurePeopleCountInput = Record<string, any>;
+
+ interface GetDataBoardNewInsurePeopleCountOutput {
+ /** X杞� */
+ x?: string[];
+ /** 鏁版嵁 */
+ data?: number[];
+ }
+
+ interface GetDataBoardOverviewByParkOutput {
+ /** 鎬诲叆椹讳紒涓� */
+ totalCustomerCount?: number;
+ /** 濂栧姳閲戝彂鏀炬�婚 */
+ sumBountyReleaseAmount?: number;
+ /** 濂栧姳閲戜娇鐢ㄦ�婚 */
+ sumBountyUseAmount?: number;
+ /** 鎶曚繚浜烘暟 */
+ insurePeopleCount?: number;
+ }
+
+ type GetDataBoardOverviewInput = Record<string, any>;
+
+ interface GetDataBoardOverviewOutput {
+ /** 鎬诲叆椹讳紒涓� */
+ totalCustomerCount?: number;
+ /** 鎬荤敵鎶ユ暟閲� */
+ totalBountyApplyCount?: number;
+ /** 濂栧姳閲戝彂鏀炬�婚 */
+ sumBountyReleaseAmount?: number;
+ /** 濂栧姳閲戜娇鐢ㄦ�婚 */
+ sumBountyUseAmount?: number;
+ /** 褰撴湀鍙戞斁棰� */
+ currentMonthSumBountyReleaseAmount?: number;
+ /** 褰撴湀浣跨敤棰� */
+ currentMonthSumBountyUseAmount?: number;
+ /** 褰撴湀鎶曚繚浜烘暟 */
+ currentMonthInsurePeopleCount?: number;
}
interface GetEnterpriseBuntyTradeDto {
@@ -8215,6 +8383,21 @@
categoryId?: string;
/** 鏌ヨ鏉′欢锛氫骇鍝佸悕绉�/鏈嶅姟鍟嗗悕绉� */
queryCondition?: string;
+ }
+
+ interface GetIndustrialPartBountyTemplatesInput {
+ /** 鍥尯Id */
+ id?: string;
+ }
+
+ interface GetIndustrialPartBountyTemplatesOutput {
+ /** 濂栧姳閲戞ā鏉垮悕绉� */
+ bountyTemplates?: GetIndustrialPartBountyTemplatesOutputItem[];
+ }
+
+ interface GetIndustrialPartBountyTemplatesOutputItem {
+ id?: string;
+ templateName?: string;
}
interface GetInformationAdvertiseByCategoryInput {
@@ -9605,6 +9788,8 @@
interface GetParkCollectFileTypeListInput {
parkId?: string;
+ /** 濂栧姳閲戞ā鏉縄d */
+ bountyTemplateId?: string;
searchType?: number;
}
@@ -11725,8 +11910,18 @@
registerAddress?: string;
/** 澶囨敞 */
remark?: string;
- industrialParkFileTypeList?: IndustrialParkFileTypeOutput[];
+ /** 濂栧姳閲戞ā鏉� */
+ bountyTemplates?: IndustrialParkDetailOutputFileTypeTemplate[];
industrialParkCompanyList?: IndustrialParkCompanyOutput[];
+ }
+
+ interface IndustrialParkDetailOutputFileTypeTemplate {
+ /** 妯℃澘Id */
+ templateId?: string;
+ /** 妯℃澘鍚嶇О */
+ templateName?: string;
+ /** 鏉愭枡 */
+ items?: IndustrialParkFileTypeOutput[];
}
interface IndustrialParkDropDownOutput {
@@ -16659,6 +16854,10 @@
interface OutCheckParkBountyApplyBaseInfo {
/** 鐢宠鎵规鍙� */
batchNo?: string;
+ /** 濂栧姳閲戞ā鏉� */
+ bountyTemplateId?: string;
+ /** 濂栧姳閲戞ā鏉垮悕绉� */
+ bountyTemplateName?: string;
/** 鐢宠鍥尯Id */
parkId?: string;
/** 鐢宠鍥尯 */
@@ -16808,6 +17007,10 @@
interface ParkBountyApplyBaseInfo {
/** 鐢宠鎵规鍙� */
batchNo?: string;
+ /** 妯℃澘Id */
+ bountyTemplateId?: string;
+ /** 妯℃澘鍚嶇О */
+ bountyTemplateName?: string;
/** 鐢宠鍥尯Id */
parkId?: string;
/** 鐢宠鍥尯 */
@@ -22899,7 +23102,7 @@
/** 鏄惁鏀寔璐㈡斂鎷ㄤ粯 */
suportFinance?: boolean;
/** 鏂囦欢 */
- industrialParkApplyFileFile?: IndustrialParkApplyFileFile[];
+ bountTemplates?: AddIndustrialParkInputBountTemplate[];
/** 鏃犻渶鏀垮姟绔鏍� */
notNeedGovernmentAudit?: boolean;
/** 鏃犻渶杩愯惀绔鏍� */
@@ -23587,6 +23790,8 @@
fileSearchTypeId?: string;
listFiles?: CustomerUploadMonthApplyFileTypeDto[];
enterpriseId?: string;
+ /** 濂栧姳閲戞ā鏉縄d */
+ bountyTemplateId?: string;
}
interface UploadParkApplyCustomerFilesInput {
diff --git a/src/style/index.scss b/src/style/index.scss
index 16db70a..42de2c8 100644
--- a/src/style/index.scss
+++ b/src/style/index.scss
@@ -195,3 +195,24 @@
}
}
}
+
+@font-face {
+ font-family: DrukWide-Bold;
+ src: url('@/assets/fonts/DrukWide-Bold.woff2') format('woff2');
+ font-style: normal;
+ font-weight: normal;
+}
+
+@font-face {
+ font-family: 'YouSheBiaoTiHei Regular';
+ src: url('@/assets/fonts/YouSheBiaoTiHei Regular.ttf') format('truetype');
+ font-style: normal;
+ font-weight: normal;
+}
+
+@font-face {
+ font-family: 'Fontquan-XinYiGuanHeiTi Regular';
+ src: url('@/assets/fonts/Fontquan-XinYiGuanHeiTi Regular.ttf') format('truetype');
+ font-style: normal;
+ font-weight: normal;
+}
diff --git a/src/views/DataBoard/DataBoardHome.vue b/src/views/DataBoard/DataBoardHome.vue
new file mode 100644
index 0000000..f2cbf04
--- /dev/null
+++ b/src/views/DataBoard/DataBoardHome.vue
@@ -0,0 +1,306 @@
+<template>
+ <div class="data-board-home-wrapper">
+ <div class="data-board-home">
+ <div class="data-board-home-title">
+ <div class="data-board-home-title-logo"></div>
+ <div class="data-board-home-title-text">{{ '姹熻タ818缁煎悎鏁版嵁灞曠ず' }}</div>
+ <div class="data-board-home-title-time">
+ {{ dataBoardTime }}
+ </div>
+ </div>
+ <div class="data-board-home-content">
+ <div class="data-board-home-content-left">
+ <DataBoardContentItem title="鏁版嵁姒傚喌" class="data-overview">
+ <DataOverviewContent></DataOverviewContent>
+ </DataBoardContentItem>
+ <DataBoardContentItem title="鏂板鍏ラ┗浼佷笟" class="new-enter">
+ <div class="new-enter-content">
+ <v-chart :option="newEnterOption" />
+ </div>
+ </DataBoardContentItem>
+ <DataBoardContentItem title="鏂板鐢虫姤鎵规" :hasBottom="false" class="new-declare">
+ <div class="new-declare-content">
+ <v-chart :option="newDeclareOption" />
+ </div>
+ </DataBoardContentItem>
+ </div>
+ <div class="data-board-home-content-center">
+ <DataBoardCenterDataContent></DataBoardCenterDataContent>
+ <div class="data-board-home-content-center-map">
+ <img
+ class="data-board-home-content-center-map-bg left"
+ :src="DataBoardCenterBg"
+ alt=""
+ />
+ <img
+ class="data-board-home-content-center-map-bg right"
+ :src="DataBoardCenterBg"
+ alt=""
+ />
+ <DataBoardCenterMap></DataBoardCenterMap>
+ </div>
+ <DataBoardCenterChart></DataBoardCenterChart>
+ </div>
+ <div class="data-board-home-content-right">
+ <DataBoardContentItem title="濂栧姳閲戜娇鐢ㄦ帓琛�" class="data-table-content">
+ <DataBoardTableView
+ :tableData="bountyUseAmountRankList"
+ unit="鍏�"
+ :isMoney="true"
+ customerName="浣跨敤閲戦"
+ ></DataBoardTableView>
+ </DataBoardContentItem>
+ <DataBoardContentItem title="鎶曚繚浜烘暟鎺掕" class="data-table-content">
+ <DataBoardTableView
+ :tableData="insurePeopleCountRankList"
+ unit="浜�"
+ customerName="鎶曚繚浜烘暟"
+ ></DataBoardTableView>
+ </DataBoardContentItem>
+ <DataBoardContentItem title="鎶曚繚浜烘暟瀵规瘮" :hasBottom="false" class="insure-person">
+ <div class="insure-person-content">
+ <v-chart :option="insurePersonOption" />
+ </div>
+ </DataBoardContentItem>
+ </div>
+ </div>
+ <div class="data-board-home-footer"></div>
+ </div>
+ </div>
+</template>
+
+<script setup lang="ts">
+import DataBoardContentItem from './components/DataBoardContentItem.vue';
+import DataBoardTableView from './components/DataBoardTableView.vue';
+import DataBoardCenterMap from './components/DataBoardCenterMap.vue';
+import DataBoardCenterChart from './components/DataBoardCenterChart.vue';
+import DataOverviewContent from './components/DataOverviewContent.vue';
+import DataBoardCenterDataContent from './components/DataBoardCenterDataContent.vue';
+import DataBoardCenterBg from '@/assets/dataBoard/data-board-center-bg.png';
+import 'echarts';
+import vChart from 'vue-echarts';
+import * as dataBoardServices from '@/services/api/DataBoard';
+import { format } from '@/utils';
+import {
+ createNewEnterChartOptions,
+ createNewDeclareChartOptions,
+ createInsurePersonOptionChartOptions,
+} from './utils';
+import { useQuery } from '@tanstack/vue-query';
+import {
+ useGetDataBoardBountyUseAmountRank,
+ useGetDataBoardInsurePeopleCountRank,
+ useGetDataBoardNewBountyApplyCount,
+ useGetDataBoardNewCustomerCount,
+ useGetDataBoardNewInsurePeopleCount,
+} from './hooks';
+import { take } from 'lodash';
+
+defineOptions({
+ name: 'DataBoardHome',
+});
+
+const dataBoardTime = ref(null);
+let timer = null;
+
+const tableData = [
+ {
+ name: '鍏徃鍚�',
+ num: 3842,
+ },
+ {
+ name: '鍏徃鍚�',
+ num: 32,
+ },
+ {
+ name: '鍏徃鍚�',
+ num: 342,
+ },
+ {
+ name: '鍏徃鍚�',
+ num: 342,
+ },
+ {
+ name: '鍏徃鍚�',
+ num: 342,
+ },
+ {
+ name: '鍏徃鍚�',
+ num: 342,
+ },
+];
+
+const updateTime = () => {
+ dataBoardTime.value = format(new Date(), 'YYYY.MM.DD HH:mm:ss');
+};
+
+const { detail: newCustomerCount } = useGetDataBoardNewCustomerCount();
+const { detail: newBountyApplyCount } = useGetDataBoardNewBountyApplyCount();
+const { detail: newInsurePeopleCount } = useGetDataBoardNewInsurePeopleCount();
+
+const { bountyUseAmountRankList } = useGetDataBoardBountyUseAmountRank({
+ take: 6,
+});
+
+const { insurePeopleCountRankList } = useGetDataBoardInsurePeopleCountRank({
+ take: 6,
+});
+
+const newEnterOption = computed(() =>
+ createNewEnterChartOptions({
+ data: [newCustomerCount.value.lastMonthData, newCustomerCount.value.currentMonthData],
+ xAxisData: newCustomerCount.value.x,
+ name: ['涓婃湀', '鏈湀'],
+ color: ['#19DAB0', '#00A6FF'],
+ })
+);
+
+const newDeclareOption = computed(() =>
+ createNewDeclareChartOptions({
+ data: [newBountyApplyCount.value.lastMonthData, newBountyApplyCount.value.currentMonthData],
+ xAxisData: newBountyApplyCount.value.x,
+ name: ['涓婃湀', '鏈湀'],
+ color: ['#00A6FF', '#FECD07'],
+ })
+);
+
+const insurePersonOption = computed(() =>
+ createInsurePersonOptionChartOptions({
+ data: newInsurePeopleCount.value.data,
+ xAxisData: newInsurePeopleCount.value.x,
+ name: format(new Date(), 'YYYY-MM'),
+ })
+);
+
+onMounted(() => {
+ updateTime();
+ timer = setInterval(updateTime, 1000);
+});
+
+// 鍗歌浇鏃舵竻闄ゅ畾鏃跺櫒锛堥伩鍏嶅唴瀛樻硠婕忥級
+onUnmounted(() => {
+ clearInterval(timer);
+});
+</script>
+
+<style lang="scss" scoped>
+@use '@/style/common.scss' as *;
+
+.data-board-home-wrapper {
+ overflow: auto;
+ min-width: 0;
+ flex: 1;
+ height: 100%;
+}
+
+.data-board-home {
+ width: 1920px;
+ height: 1080px;
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+ background-color: #182234;
+ background-image: url('@/assets/dataBoard/data-board-bg.png');
+
+ .data-board-home-title {
+ position: relative;
+ display: flex;
+ justify-content: center;
+ align-items: flex-end;
+ padding: 0 34px;
+
+ .data-board-home-title-text {
+ display: inline-flex;
+ font-size: 36px;
+ line-height: 47px;
+ font-family: YouSheBiaoTiHei Regular;
+ background: linear-gradient(to bottom, #ffffff, #bef6ff);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ }
+
+ .data-board-home-title-time {
+ position: absolute;
+ right: 34px;
+ display: inline-flex;
+ font-size: 16px;
+ font-family: Fontquan-XinYiGuanHeiTi Regular;
+ background: linear-gradient(to bottom, #ffffff, #6fcdff);
+ -webkit-background-clip: text;
+ line-height: 19px;
+ -webkit-text-fill-color: transparent;
+ }
+ }
+
+ .data-board-home-content {
+ display: flex;
+ justify-content: space-between;
+ padding: 30px 30px 0;
+
+ .data-board-home-content-left {
+ width: 446px;
+
+ .new-enter {
+ .new-enter-content {
+ width: 100%;
+ height: 280px;
+ }
+ }
+
+ .new-declare {
+ .new-declare-content {
+ width: 100%;
+ height: 250px;
+ }
+ }
+ }
+
+ .data-board-home-content-center {
+ margin: 0 20px;
+ min-width: 0;
+ flex: 1;
+
+ .data-board-home-content-center-map {
+ position: relative;
+ margin-bottom: 10px;
+ width: 100%;
+ height: 560px;
+
+ .data-board-home-content-center-map-bg {
+ position: absolute;
+ top: 0;
+ width: 70px;
+ height: 560px;
+
+ &.left {
+ left: 0;
+ }
+
+ &.right {
+ right: 0;
+ transform: rotateY(180deg);
+ }
+ }
+ }
+ }
+
+ .data-board-home-content-right {
+ width: 446px;
+
+ .insure-person {
+ .insure-person-content {
+ width: 100%;
+ height: 250px;
+ }
+ }
+ }
+ }
+
+ .data-board-home-footer {
+ width: 100%;
+ height: 46px;
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+ background-image: url('@/assets/dataBoard/data-board-footer.png');
+ }
+}
+</style>
diff --git a/src/views/DataBoard/components/DataBoardCenterChart.vue b/src/views/DataBoard/components/DataBoardCenterChart.vue
new file mode 100644
index 0000000..e89d930
--- /dev/null
+++ b/src/views/DataBoard/components/DataBoardCenterChart.vue
@@ -0,0 +1,92 @@
+<template>
+ <div class="data-board-center-chart">
+ <div class="data-board-center-chart-item">
+ <div class="data-board-center-chart-item-title">鏂板鍙戞斁棰�</div>
+ <div class="data-board-center-chart-item-chart">
+ <v-chart :option="newBountyReleaseAmountOption" />
+ </div>
+ </div>
+ <div class="data-board-center-chart-item right">
+ <div class="data-board-center-chart-item-title">鏂板浣跨敤棰�</div>
+ <div class="data-board-center-chart-item-chart">
+ <v-chart :option="newBountyUseAmountCountOption" />
+ </div>
+ </div>
+ </div>
+</template>
+
+<script setup lang="ts">
+import 'echarts';
+import vChart from 'vue-echarts';
+import { createNewBountyReleaseAmountChartOptions } from '../utils';
+import {
+ useGetDataBoardNewBountyReleaseAmountCount,
+ useGetDataBoardNewBountyUseAmountCount,
+} from '../hooks';
+
+defineOptions({
+ name: 'DataBoardCenterChart',
+});
+
+const { detail: newBountyReleaseAmountCount } = useGetDataBoardNewBountyReleaseAmountCount();
+const { detail: newBountyUseAmountCount } = useGetDataBoardNewBountyUseAmountCount();
+
+const newBountyReleaseAmountOption = computed(() =>
+ createNewBountyReleaseAmountChartOptions({
+ data: [
+ newBountyReleaseAmountCount.value.lastMonthData,
+ newBountyReleaseAmountCount.value.currentMonthData,
+ ],
+ xAxisData: newBountyReleaseAmountCount.value.x,
+ name: ['涓婃湀', '鏈湀'],
+ color: ['#00A6FF', '#FECD07'],
+ })
+);
+
+const newBountyUseAmountCountOption = computed(() =>
+ createNewBountyReleaseAmountChartOptions({
+ data: [
+ newBountyUseAmountCount.value.lastMonthData,
+ newBountyUseAmountCount.value.currentMonthData,
+ ],
+ xAxisData: newBountyUseAmountCount.value.x,
+ name: ['涓婃湀', '鏈湀'],
+ color: ['#00A6FF', '#FECD07'],
+ })
+);
+</script>
+
+<style lang="scss" scoped>
+@use '@/style/common.scss' as *;
+
+.data-board-center-chart {
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ padding: 35px 20px;
+ height: 292px;
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+ background-image: url('@/assets/dataBoard/data-board-center-chart-bg.png');
+
+ .data-board-center-chart-item {
+ &.right {
+ margin-left: 20px;
+ }
+
+ .data-board-center-chart-item-title {
+ margin-bottom: 20px;
+ font-size: 22px;
+ font-family: YouSheBiaoTiHei Regular;
+ text-align: center;
+ background: linear-gradient(to bottom, #ffffff, #98ecff);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ }
+
+ .data-board-center-chart-item-chart {
+ width: 100%;
+ height: 200px;
+ }
+ }
+}
+</style>
diff --git a/src/views/DataBoard/components/DataBoardCenterDataContent.vue b/src/views/DataBoard/components/DataBoardCenterDataContent.vue
new file mode 100644
index 0000000..6357cdf
--- /dev/null
+++ b/src/views/DataBoard/components/DataBoardCenterDataContent.vue
@@ -0,0 +1,46 @@
+<template>
+ <div class="data-board-home-content-center-top">
+ <DataBoardCenterDataItem
+ :value="detail?.currentMonthSumBountyReleaseAmount"
+ label="褰撴湀鍙戞斁棰�"
+ :image="DataBoardCenterIcon1"
+ ></DataBoardCenterDataItem>
+ <DataBoardCenterDataItem
+ :value="detail?.currentMonthSumBountyUseAmount"
+ label="褰撴湀浣跨敤棰�"
+ :image="DataBoardCenterIcon2"
+ ></DataBoardCenterDataItem>
+ <DataBoardCenterDataItem
+ :value="detail?.currentMonthInsurePeopleCount"
+ label="褰撴湀鎶曚繚浜烘暟"
+ :precision="0"
+ :image="DataBoardCenterIcon3"
+ ></DataBoardCenterDataItem>
+ </div>
+</template>
+
+<script setup lang="ts">
+import DataBoardCenterIcon1 from '@/assets/dataBoard/data-board-center-icon1.png';
+import DataBoardCenterIcon2 from '@/assets/dataBoard/data-board-center-icon2.png';
+import DataBoardCenterIcon3 from '@/assets/dataBoard/data-board-center-icon3.png';
+import DataBoardCenterDataItem from './DataBoardCenterDataItem.vue';
+import { useGetDataBoardOverview } from '../hooks';
+
+defineOptions({
+ name: 'DataBoardCenterDataContent',
+});
+
+const { detail } = useGetDataBoardOverview();
+</script>
+
+<style lang="scss" scoped>
+@use '@/style/common.scss' as *;
+
+.data-board-home-content-center-top {
+ display: grid;
+ margin-bottom: 6px;
+ padding: 0 20px;
+ grid-template-columns: repeat(3, 1fr);
+ grid-column-gap: 16px;
+}
+</style>
diff --git a/src/views/DataBoard/components/DataBoardCenterDataItem.vue b/src/views/DataBoard/components/DataBoardCenterDataItem.vue
new file mode 100644
index 0000000..9006fb9
--- /dev/null
+++ b/src/views/DataBoard/components/DataBoardCenterDataItem.vue
@@ -0,0 +1,80 @@
+<template>
+ <div class="data-board-center-data-item">
+ <div class="data-board-data-info-item-icon">
+ <img :src="image" alt="" />
+ </div>
+ <div class="data-board-data-info-item-content">
+ <div class="data-board-data-info-item-value">
+ <el-statistic :value="value" :precision="precision" />
+ </div>
+ <div class="data-board-data-info-item-label">{{ label }}</div>
+ </div>
+ </div>
+</template>
+
+<script setup lang="ts">
+import { useTransition } from '@vueuse/core';
+
+defineOptions({
+ name: 'DataBoardCenterDataItem',
+});
+
+type Props = {
+ image: string;
+ label: string;
+ value: number;
+ precision?: number;
+};
+
+const props = withDefaults(defineProps<Props>(), {
+ value: 0,
+ precision: 2,
+});
+</script>
+
+<style lang="scss" scoped>
+@use '@/style/common.scss' as *;
+
+.data-board-center-data-item {
+ display: flex;
+ padding: 8px 12px;
+ background: rgba(0, 5, 18, 0.27);
+
+ .data-board-data-info-item-icon {
+ width: 64px;
+ height: 64px;
+
+ img {
+ width: 100%;
+ height: 100%;
+ }
+ }
+
+ .data-board-data-info-item-content {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: flex-start;
+ margin-left: 10px;
+
+ .data-board-data-info-item-value {
+ margin-bottom: 5px;
+ font-size: 22px;
+ font-family: DrukWide-Bold;
+ line-height: 30px;
+
+ :deep() {
+ .el-statistic__content {
+ color: #ffffff;
+ }
+ }
+ }
+
+ .data-board-data-info-item-label {
+ font-size: 16px;
+ line-height: 22px;
+ color: #ffffff;
+ }
+ }
+}
+</style>
diff --git a/src/views/DataBoard/components/DataBoardCenterMap.vue b/src/views/DataBoard/components/DataBoardCenterMap.vue
new file mode 100644
index 0000000..5a784c8
--- /dev/null
+++ b/src/views/DataBoard/components/DataBoardCenterMap.vue
@@ -0,0 +1,179 @@
+<template>
+ <div class="data-board-home-content-center-map">
+ <div class="data-board-home-content-center-map-data">
+ <DataBoardDataInfoItem
+ :backgroundImage="DataBoardDataInfoBg5"
+ label="浼佷笟鏁伴噺"
+ :value="form.totalCustomerCount"
+ ></DataBoardDataInfoItem>
+ <DataBoardDataInfoItem
+ :backgroundImage="DataBoardDataInfoBg6"
+ label="鍙戞斁棰�"
+ :value="form.sumBountyReleaseAmount"
+ ></DataBoardDataInfoItem>
+ <DataBoardDataInfoItem
+ :backgroundImage="DataBoardDataInfoBg7"
+ label="浣跨敤棰�"
+ :value="form.sumBountyUseAmount"
+ ></DataBoardDataInfoItem>
+ <DataBoardDataInfoItem
+ :backgroundImage="DataBoardDataInfoBg8"
+ label="鎶曚繚浜烘暟"
+ :value="form.insurePeopleCount"
+ ></DataBoardDataInfoItem>
+ </div>
+ <div class="data-board-home-content-center-map-img">
+ <img class="data-board-home-content-center-map-img-bg" :src="DataBoardCenterMap" alt="" />
+ <DataBoardCenterMapMark
+ v-for="(item, index) in form.mapList"
+ :key="index"
+ v-model:choose="item.choose"
+ :parkName="item.parkName"
+ :class="item.class"
+ @click="handleClick(item.id)"
+ ></DataBoardCenterMapMark>
+ </div>
+ </div>
+</template>
+
+<script setup lang="ts">
+import DataBoardCenterMap from '@/assets/dataBoard/data-board-center-map.png';
+import DataBoardDataInfoBg5 from '@/assets/dataBoard/data-board-data-info-bg5.png';
+import DataBoardDataInfoBg6 from '@/assets/dataBoard/data-board-data-info-bg6.png';
+import DataBoardDataInfoBg7 from '@/assets/dataBoard/data-board-data-info-bg7.png';
+import DataBoardDataInfoBg8 from '@/assets/dataBoard/data-board-data-info-bg8.png';
+import DataBoardDataInfoItem from './DataBoardDataInfoItem.vue';
+import DataBoardCenterMapMark from './DataBoardCenterMapMark.vue';
+import { useIntervalFn } from '@vueuse/core';
+import * as dataBoardServices from '@/services/api/DataBoard';
+import { useQuery, useQueryClient } from '@tanstack/vue-query';
+import { useIndustrialParkDropDownList } from '@/hooks';
+import _ from 'lodash';
+import { on } from 'events';
+
+defineOptions({
+ name: 'DataBoardCenterMap',
+});
+
+const queryClient = useQueryClient();
+
+const { dataBoardIndustrialParkList } = useIndustrialParkDropDownList();
+
+const form = reactive({
+ industrialParkId: '',
+ mapList: [],
+
+ totalCustomerCount: 0,
+ sumBountyReleaseAmount: 0,
+ sumBountyUseAmount: 0,
+ insurePeopleCount: 0,
+});
+
+// const { value } = useIntervalValue(12222);
+
+function handleClick(id: string) {
+ form.mapList.forEach((item, index) => {
+ item.choose = item.id === id;
+ });
+ form.industrialParkId = id;
+ refetch();
+}
+
+const { data: detail, refetch } = useQuery({
+ queryKey: ['dataBoardServices/getDataBoardOverviewByPark', form.industrialParkId],
+ queryFn: async () => {
+ return await dataBoardServices.getDataBoardOverviewByPark(
+ { industrialParkId: form.industrialParkId },
+ {
+ showLoading: false,
+ }
+ );
+ },
+ placeholderData: () => ({} as API.GetDataBoardOverviewByParkOutput),
+ enabled: () => !!form.industrialParkId,
+ onSuccess(data) {
+ form.totalCustomerCount = data.totalCustomerCount;
+ form.sumBountyReleaseAmount = data.sumBountyReleaseAmount;
+ form.sumBountyUseAmount = data.sumBountyUseAmount;
+ form.insurePeopleCount = data.insurePeopleCount;
+ },
+});
+
+onMounted(async () => {
+ await queryClient.invalidateQueries(['industrialParkServices/getIndustrialParkDropDownList']);
+ if (dataBoardIndustrialParkList.value.length > 0) {
+ form.industrialParkId = dataBoardIndustrialParkList.value[0].id;
+ form.mapList = dataBoardIndustrialParkList.value;
+ refetch();
+ }
+});
+</script>
+<style lang="scss" scoped>
+@use '@/style/common.scss' as *;
+
+.data-board-home-content-center-map {
+ position: relative;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 100%;
+ height: 100%;
+
+ .data-board-home-content-center-map-data {
+ position: absolute;
+ top: 30px;
+ left: 25px;
+ width: 223px;
+
+ .data-board-data-info-item {
+ margin-bottom: 16px;
+ padding: 9px 0;
+
+ :deep() {
+ .data-board-data-info-item-label {
+ margin-left: 65px;
+ }
+
+ .data-board-data-info-item-value {
+ margin-left: 65px;
+ }
+ }
+ }
+ }
+
+ .data-board-home-content-center-map-img {
+ position: relative;
+ height: 100%;
+ text-align: center;
+
+ .data-board-home-content-center-map-img-bg {
+ height: 100%;
+ }
+
+ .data-board-center-map-mark {
+ position: absolute;
+ cursor: pointer;
+
+ &.init1 {
+ top: 115px;
+ left: 230px;
+ }
+
+ &.init2 {
+ top: 260px;
+ left: 75px;
+ }
+
+ &.init3 {
+ top: 340px;
+ right: 90px;
+ }
+
+ &.init4 {
+ top: 305px;
+ right: 10px;
+ }
+ }
+ }
+}
+</style>
diff --git a/src/views/DataBoard/components/DataBoardCenterMapMark.vue b/src/views/DataBoard/components/DataBoardCenterMapMark.vue
new file mode 100644
index 0000000..1a1ed8f
--- /dev/null
+++ b/src/views/DataBoard/components/DataBoardCenterMapMark.vue
@@ -0,0 +1,84 @@
+<template>
+ <div class="data-board-center-map-mark">
+ <div class="data-board-center-map-mark-item init" v-if="!innerChoose">
+ <img :src="DataBoardMapInit" alt="" />
+ </div>
+ <div class="data-board-center-map-mark-item choose" v-else>
+ <div class="data-board-center-map-mark-item-park">{{ parkName }}</div>
+ <img :src="DataBoardMapChoose" alt="" />
+ </div>
+ </div>
+</template>
+
+<script setup lang="ts">
+import DataBoardMapInit from '@/assets/dataBoard/data-board-map-init.png';
+import DataBoardMapChoose from '@/assets/dataBoard/data-board-map-choose.png';
+
+defineOptions({
+ name: 'DataBoardCenterMapMark',
+});
+
+type Props = {
+ choose: boolean;
+ parkName: string;
+};
+
+const props = withDefaults(defineProps<Props>(), {
+ choose: false,
+});
+
+const emit = defineEmits<{
+ (e: 'update:choose', value: Props['choose']): void;
+}>();
+
+const innerChoose = computed({
+ get() {
+ return props.choose;
+ },
+ set(val) {
+ emit('update:choose', val);
+ },
+});
+</script>
+
+<style lang="scss" scoped>
+@use '@/style/common.scss' as *;
+
+.data-board-center-map-mark {
+ .data-board-center-map-mark-item {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 154px;
+ height: 104px;
+
+ &.init {
+ img {
+ width: 88px;
+ height: 72px;
+ }
+ }
+
+ &.choose {
+ position: relative;
+
+ img {
+ width: 100%;
+ height: 100%;
+ }
+
+ .data-board-center-map-mark-item-park {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ font-size: 24px;
+ line-height: 50px;
+ font-family: YouSheBiaoTiHei Regular;
+ text-align: center;
+ color: #ffffff;
+ }
+ }
+ }
+}
+</style>
diff --git a/src/views/DataBoard/components/DataBoardContentItem.vue b/src/views/DataBoard/components/DataBoardContentItem.vue
new file mode 100644
index 0000000..42d5937
--- /dev/null
+++ b/src/views/DataBoard/components/DataBoardContentItem.vue
@@ -0,0 +1,56 @@
+<template>
+ <div
+ class="data-board-content-item"
+ :style="{
+ marginBottom: hasBottom ? '18px' : '0',
+ }"
+ >
+ <div class="data-board-content-item-title">
+ <div class="data-board-content-item-title-text">{{ title }}</div>
+ </div>
+ <slot></slot>
+ </div>
+</template>
+
+<script setup lang="ts">
+defineOptions({
+ name: 'DataBoardContentItem',
+});
+
+type Props = {
+ title: string;
+ hasBottom?: boolean;
+};
+
+const props = withDefaults(defineProps<Props>(), {
+ hasBottom: true,
+});
+</script>
+
+<style lang="scss" scoped>
+@use '@/style/common.scss' as *;
+
+.data-board-content-item {
+ display: flex;
+ flex-direction: column;
+ background: rgba(0, 5, 18, 0.27);
+
+ .data-board-content-item-title {
+ display: flex;
+ height: 42px;
+ font-family: YouSheBiaoTiHei Regular;
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+ background-image: url('@/assets/dataBoard/data-board-title-bg.png');
+
+ .data-board-content-item-title-text {
+ padding-left: 36px;
+ font-size: 24px;
+ line-height: 32px;
+ background: linear-gradient(to bottom, #ffffff, #b5efff);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ }
+ }
+}
+</style>
diff --git a/src/views/DataBoard/components/DataBoardDataInfoItem.vue b/src/views/DataBoard/components/DataBoardDataInfoItem.vue
new file mode 100644
index 0000000..5826b80
--- /dev/null
+++ b/src/views/DataBoard/components/DataBoardDataInfoItem.vue
@@ -0,0 +1,64 @@
+<template>
+ <div
+ class="data-board-data-info-item"
+ :style="{
+ backgroundImage: `url(${backgroundImage})`,
+ }"
+ >
+ <div class="data-board-data-info-item-label">{{ label }}</div>
+ <div class="data-board-data-info-item-value">
+ <el-statistic :value="value" />
+ </div>
+ </div>
+</template>
+
+<script setup lang="ts">
+import { useTransition } from '@vueuse/core';
+
+defineOptions({
+ name: 'DataBoardDataInfoItem',
+});
+
+type Props = {
+ backgroundImage: string;
+ label: string;
+};
+
+const props = withDefaults(defineProps<Props>(), {});
+
+const value = defineModel<number>('value');
+
+// const _value = useTransition(value, {
+// duration: 500,
+// });
+</script>
+
+<style lang="scss" scoped>
+@use '@/style/common.scss' as *;
+
+.data-board-data-info-item {
+ display: flex;
+ justify-content: center;
+ text-align: left;
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+ flex-direction: column;
+
+ .data-board-data-info-item-label {
+ margin-bottom: 4px;
+ margin-left: 86px;
+ font-size: 13px;
+ color: #ffffff;
+ }
+
+ .data-board-data-info-item-value {
+ margin-left: 86px;
+ font-size: 16px;
+ font-family: YouSheBiaoTiHei Regular;
+ background: linear-gradient(to bottom, #ffffff, #6fcdff);
+ -webkit-background-clip: text;
+ line-height: 19px;
+ -webkit-text-fill-color: transparent;
+ }
+}
+</style>
diff --git a/src/views/DataBoard/components/DataBoardTableView.vue b/src/views/DataBoard/components/DataBoardTableView.vue
new file mode 100644
index 0000000..e0479fd
--- /dev/null
+++ b/src/views/DataBoard/components/DataBoardTableView.vue
@@ -0,0 +1,117 @@
+<template>
+ <div class="data-board-table">
+ <div class="data-board-table-item title">
+ <div class="data-board-table-item-icon">鎺掑悕</div>
+ <div class="data-board-table-item-content">浼佷笟鍚�</div>
+ <div class="data-board-table-item-num">{{ customerName }}</div>
+ </div>
+ <div
+ v-for="(item, index) in props.tableData"
+ :key="index"
+ class="data-board-table-item"
+ :class="{ isOdd: index % 2 === 0 }"
+ >
+ <div class="data-board-table-item-icon">
+ <img
+ class="data-board-table-item-icon-img"
+ v-if="index < 3"
+ :src="iconList[index]"
+ alt=""
+ />
+ <span class="data-board-table-item-icon-index" v-else>{{ index + 1 }}</span>
+ </div>
+ <div class="data-board-table-item-content ellipsis">{{ item.name }}</div>
+ <div class="data-board-table-item-num">
+ {{ `${isMoney ? toThousand(item.value) : item.value}${unit}` }}
+ </div>
+ </div>
+ </div>
+</template>
+
+<script setup lang="ts">
+import DataBoardTableIcon1 from '@/assets/dataBoard/data-board-table-icon1.png';
+import DataBoardTableIcon2 from '@/assets/dataBoard/data-board-table-icon2.png';
+import DataBoardTableIcon3 from '@/assets/dataBoard/data-board-table-icon3.png';
+import { toThousand } from '@/utils';
+
+defineOptions({
+ name: 'DataBoardTableView',
+});
+
+type Props = {
+ tableData: any[];
+ unit: string;
+ isMoney?: boolean;
+ customerName: string;
+};
+
+const props = withDefaults(defineProps<Props>(), {
+ isMoney: false,
+});
+
+const iconList = [DataBoardTableIcon1, DataBoardTableIcon2, DataBoardTableIcon3];
+</script>
+
+<style lang="scss" scoped>
+@use '@/style/common.scss' as *;
+
+.data-board-table {
+ display: flex;
+ padding: 0 14px 11px;
+ flex-direction: column;
+
+ .data-board-table-item {
+ display: grid;
+ align-items: center;
+ height: 37px;
+ font-size: 14px;
+ color: #ffffff;
+ background-position: bottom center;
+ background-repeat: no-repeat;
+ background-size: 100% 2px;
+ grid-template-columns: 60px 3fr 2fr;
+ background-image: linear-gradient(
+ to right,
+ rgba(150, 150, 150, 0),
+ rgb(121, 121, 121),
+ rgba(150, 150, 150, 0)
+ );
+
+ &.title {
+ font-size: 14px;
+ color: #9d9d9d;
+ }
+
+ &.isOdd {
+ background-color: #141c2f;
+ }
+
+ .data-board-table-item-icon {
+ display: flex;
+ justify-content: center;
+
+ .data-board-table-item-icon-img {
+ width: 24px;
+ height: 28px;
+ }
+
+ .data-board-table-item-icon-index {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 34px;
+ height: 16px;
+ font-size: 14px;
+ font-family: YouSheBiaoTiHei Regular;
+ color: #ffffff;
+ background-color: #3e4b68;
+ transform: skewX(-30deg);
+ }
+ }
+
+ .data-board-table-item-num {
+ text-align: right;
+ }
+ }
+}
+</style>
diff --git a/src/views/DataBoard/components/DataOverviewContent.vue b/src/views/DataBoard/components/DataOverviewContent.vue
new file mode 100644
index 0000000..6604d75
--- /dev/null
+++ b/src/views/DataBoard/components/DataOverviewContent.vue
@@ -0,0 +1,57 @@
+<template>
+ <div class="data-overview-content">
+ <DataBoardDataInfoItem
+ :backgroundImage="DataBoardDataInfoBg1"
+ label="鎬诲叆椹讳紒涓�"
+ :value="detail?.totalCustomerCount"
+ ></DataBoardDataInfoItem>
+ <DataBoardDataInfoItem
+ :backgroundImage="DataBoardDataInfoBg2"
+ label="鎬荤敵鎶ユ暟閲�"
+ :value="detail?.totalBountyApplyCount"
+ ></DataBoardDataInfoItem>
+ <DataBoardDataInfoItem
+ :backgroundImage="DataBoardDataInfoBg3"
+ label="濂栧姳閲戝彂鏀炬�婚"
+ :value="detail?.sumBountyReleaseAmount"
+ ></DataBoardDataInfoItem>
+ <DataBoardDataInfoItem
+ :backgroundImage="DataBoardDataInfoBg4"
+ label="濂栧姳閲戜娇鐢ㄦ�婚"
+ :value="detail?.sumBountyUseAmount"
+ ></DataBoardDataInfoItem>
+ </div>
+</template>
+
+<script setup lang="ts">
+import DataBoardDataInfoBg1 from '@/assets/dataBoard/data-board-data-info-bg1.png';
+import DataBoardDataInfoBg2 from '@/assets/dataBoard/data-board-data-info-bg2.png';
+import DataBoardDataInfoBg3 from '@/assets/dataBoard/data-board-data-info-bg3.png';
+import DataBoardDataInfoBg4 from '@/assets/dataBoard/data-board-data-info-bg4.png';
+import DataBoardDataInfoItem from './DataBoardDataInfoItem.vue';
+import { useGetDataBoardOverview } from '../hooks';
+
+defineOptions({
+ name: 'DataOverviewContent',
+});
+
+const { detail } = useGetDataBoardOverview();
+</script>
+
+<style lang="scss" scoped>
+@use '@/style/common.scss' as *;
+
+.data-overview-content {
+ display: grid;
+ justify-content: center;
+ align-items: center;
+ padding: 50px 18px;
+ grid-template-columns: repeat(2, 1fr);
+ grid-column-gap: 18px;
+ grid-row-gap: 30px;
+
+ .data-board-data-info-item {
+ padding: 14px 0;
+ }
+}
+</style>
diff --git a/src/views/DataBoard/hooks/index.ts b/src/views/DataBoard/hooks/index.ts
new file mode 100644
index 0000000..4d5a3f2
--- /dev/null
+++ b/src/views/DataBoard/hooks/index.ts
@@ -0,0 +1,197 @@
+import { useQuery } from '@tanstack/vue-query';
+import { useIntervalFn } from '@vueuse/core';
+import * as dataBoardServices from '@/services/api/DataBoard';
+
+export function useIntervalValue<T>(initValue: T) {
+ const value = ref(initValue);
+ const preValue = ref(initValue);
+
+ useIntervalFn(() => {
+ value.value = 0;
+ setTimeout(() => {
+ value.value = preValue.value;
+ }, 500);
+ }, 5000);
+
+ function changeValue(_value: T) {
+ value.value = _value;
+ preValue.value = _value;
+ }
+
+ return { value, changeValue };
+}
+
+export function useGetDataBoardOverview() {
+ const { data: detail, isLoading } = useQuery({
+ queryKey: ['dataBoardServices/getDataBoardOverview'],
+ queryFn: async () => {
+ return await dataBoardServices.getDataBoardOverview(
+ {},
+ {
+ showLoading: false,
+ }
+ );
+ },
+ placeholderData: () => ({} as API.GetDataBoardOverviewOutput),
+ });
+
+ return {
+ detail,
+ };
+}
+
+export function useGetDataBoardNewCustomerCount() {
+ const { data: detail, isLoading } = useQuery({
+ queryKey: ['dataBoardServices/getDataBoardNewCustomerCount'],
+ queryFn: async () => {
+ return await dataBoardServices.getDataBoardNewCustomerCount(
+ {},
+ {
+ showLoading: false,
+ }
+ );
+ },
+ placeholderData: () => ({} as API.GetDataBoardNewCustomerCountOutput),
+ });
+
+ return {
+ detail,
+ };
+}
+
+export function useGetDataBoardNewBountyApplyCount() {
+ const { data: detail, isLoading } = useQuery({
+ queryKey: ['dataBoardServices/getDataBoardNewBountyApplyCount'],
+ queryFn: async () => {
+ return await dataBoardServices.getDataBoardNewBountyApplyCount(
+ {},
+ {
+ showLoading: false,
+ }
+ );
+ },
+ placeholderData: () => ({} as API.GetDataBoardNewBountyApplyCountOutput),
+ });
+
+ return {
+ detail,
+ };
+}
+export function useGetDataBoardNewBountyReleaseAmountCount() {
+ const { data: detail, isLoading } = useQuery({
+ queryKey: ['dataBoardServices/getDataBoardNewBountyReleaseAmountCount'],
+ queryFn: async () => {
+ return await dataBoardServices.getDataBoardNewBountyReleaseAmountCount(
+ {},
+ {
+ showLoading: false,
+ }
+ );
+ },
+ placeholderData: () => ({} as API.GetDataBoardNewBountyReleaseAmountCountOutput),
+ });
+
+ return {
+ detail,
+ };
+}
+
+export function useGetDataBoardNewBountyUseAmountCount() {
+ const { data: detail, isLoading } = useQuery({
+ queryKey: ['dataBoardServices/getDataBoardNewBountyUseAmountCount'],
+ queryFn: async () => {
+ return await dataBoardServices.getDataBoardNewBountyUseAmountCount(
+ {},
+ {
+ showLoading: false,
+ }
+ );
+ },
+ placeholderData: () => ({} as API.GetDataBoardNewBountyUseAmountCountOutput),
+ });
+
+ return {
+ detail,
+ };
+}
+
+export function useGetDataBoardNewInsurePeopleCount() {
+ const { data: detail, isLoading } = useQuery({
+ queryKey: ['dataBoardServices/getDataBoardNewInsurePeopleCount'],
+ queryFn: async () => {
+ return await dataBoardServices.getDataBoardNewInsurePeopleCount(
+ {},
+ {
+ showLoading: false,
+ }
+ );
+ },
+ placeholderData: () => ({} as API.GetDataBoardNewInsurePeopleCountOutput),
+ });
+
+ return {
+ detail,
+ };
+}
+
+type UseGetDataBoardBountyUseAmountRankOptions = {
+ take: number;
+};
+
+export function useGetDataBoardBountyUseAmountRank(
+ options: UseGetDataBoardBountyUseAmountRankOptions
+) {
+ const { take } = options;
+ const { data: detail, isLoading } = useQuery({
+ queryKey: ['dataBoardServices/getDataBoardBountyUseAmountRank', take],
+ queryFn: async () => {
+ return await dataBoardServices.getDataBoardBountyUseAmountRank(
+ { take: take },
+ {
+ showLoading: false,
+ }
+ );
+ },
+ placeholderData: () => ({} as API.GetDataBoardBountyUseAmountRankOutput),
+ });
+
+ const bountyUseAmountRankList = computed(() =>
+ detail.value.items?.map((x) => ({
+ name: x.enterpriseName,
+ value: x.amount,
+ }))
+ );
+
+ return {
+ bountyUseAmountRankList,
+ };
+}
+
+export function useGetDataBoardInsurePeopleCountRank(
+ options: UseGetDataBoardBountyUseAmountRankOptions
+) {
+ const { take } = options;
+ const { data: detail, isLoading } = useQuery({
+ queryKey: ['dataBoardServices/getDataBoardInsurePeopleCountRank', take],
+ queryFn: async () => {
+ return await dataBoardServices.getDataBoardInsurePeopleCountRank(
+ { take: take },
+ {
+ showLoading: false,
+ }
+ );
+ },
+ placeholderData: () => ({} as API.GetDataBoardInsurePeopleCountRankOutput),
+ });
+
+ const insurePeopleCountRankList = computed(() =>
+ detail.value.items?.map((x) => ({
+ name: x.enterpriseName,
+ value: x.count,
+ }))
+ );
+
+ return {
+ insurePeopleCountRankList,
+ };
+}
diff --git a/src/views/DataBoard/utils/index.ts b/src/views/DataBoard/utils/index.ts
new file mode 100644
index 0000000..07b28c9
--- /dev/null
+++ b/src/views/DataBoard/utils/index.ts
@@ -0,0 +1,280 @@
+import _ from 'lodash';
+import { CustomSeriesOption, EChartsOption } from 'echarts';
+import * as echarts from 'echarts';
+
+export function getScreenImageUrlsByGlob() {
+ const modules = import.meta.glob('@/assets/parkScreen/*.png', { eager: true });
+
+ const imgUrls: string[] = [];
+
+ for (const path in modules) {
+ const mod = modules[path] as { default: any };
+ imgUrls.push(mod.default);
+ }
+
+ return imgUrls;
+}
+
+type CreateNewEnterChartOptionsOptions = {
+ data: number[][];
+ xAxisData: (number | string)[];
+ name: string[];
+ yAxisName?: string;
+ color: string[];
+};
+
+const CommonBarChartOptions: EChartsOption = {
+ tooltip: {
+ trigger: 'axis',
+ axisPointer: {
+ type: 'shadow',
+ },
+ },
+ legend: {
+ right: '5%',
+ textStyle: {
+ fontSize: 14,
+ color: '#D4F1FF',
+ },
+ itemHeight: 5,
+ itemWidth: 12,
+ },
+ xAxis: {
+ type: 'category',
+ nameTextStyle: {
+ color: '#D4F1FF',
+ fontSize: 12,
+ },
+ axisTick: {
+ show: false,
+ },
+ axisLabel: {
+ fontSize: 12,
+ color: '#D4F1FF',
+ },
+ },
+ yAxis: {
+ nameTextStyle: {
+ color: '#D4F1FF',
+ fontSize: 12,
+ },
+ axisLabel: {
+ fontSize: 12,
+ color: '#D4F1FF',
+ },
+ splitLine: {
+ show: true,
+ lineStyle: {
+ color: '#384658',
+ },
+ },
+ },
+ series: [],
+};
+
+export function createNewEnterChartOptions({
+ data,
+ xAxisData,
+ name,
+ yAxisName = '鍗曚綅/涓�',
+ color,
+}: CreateNewEnterChartOptionsOptions) {
+ return _.merge({}, CommonBarChartOptions, {
+ xAxis: {
+ data: xAxisData,
+ },
+ yAxis: {
+ name: yAxisName,
+ },
+ series: data.map((x, index) => ({
+ name: name[index],
+ type: 'bar',
+ data: x?.map((y) => ({
+ value: y,
+ })),
+ itemStyle: {
+ color: color[index],
+ },
+ barWidth: '15%',
+ })),
+ } as EChartsOption);
+}
+
+export function createNewDeclareChartOptions({
+ data,
+ xAxisData,
+ name,
+ yAxisName = '鍗曚綅/涓�',
+ color,
+}: CreateNewEnterChartOptionsOptions) {
+ return _.merge({}, CommonBarChartOptions, {
+ xAxis: {
+ data: xAxisData,
+ },
+ yAxis: {
+ name: yAxisName,
+ },
+ series: data.map((x, index) => ({
+ name: name[index],
+ type: 'bar',
+ data: x?.map((y) => ({
+ value: y,
+ })),
+ label: {
+ show: true,
+ position: 'top',
+ distance: 0,
+ formatter: '...',
+ fontSize: 16,
+ color: color[index],
+ },
+ itemStyle: {
+ color: color[index],
+ opacity: 0.6,
+ },
+ barWidth: 14,
+ })),
+ } as EChartsOption);
+}
+
+type CreatInsurePersonChartOptionsOptions = {
+ data: number[];
+ xAxisData: (number | string)[];
+ name: string;
+ yAxisName?: string;
+};
+
+export function createInsurePersonOptionChartOptions({
+ data,
+ xAxisData,
+ name,
+ yAxisName = '鍗曚綅/涓�',
+}: CreatInsurePersonChartOptionsOptions) {
+ return {
+ legend: {
+ right: '5%',
+ textStyle: {
+ fontSize: 14,
+ color: '#D4F1FF',
+ },
+ itemHeight: 0,
+ itemWidth: 0,
+ },
+ tooltip: {
+ trigger: 'axis',
+ axisPointer: {
+ type: 'cross',
+ label: {
+ backgroundColor: '#6a7985',
+ },
+ },
+ },
+ xAxis: {
+ nameTextStyle: {
+ color: '#D4F1FF',
+ fontSize: 12,
+ },
+ axisTick: {
+ show: false,
+ },
+ axisLabel: {
+ fontSize: 12,
+ color: '#D4F1FF',
+ },
+ data: xAxisData,
+ },
+ yAxis: {
+ axisLabel: {
+ fontSize: 12,
+ color: '#D4F1FF',
+ },
+ nameTextStyle: {
+ color: '#D4F1FF',
+ fontSize: 12,
+ },
+ name: yAxisName,
+ splitLine: {
+ show: true,
+ lineStyle: {
+ color: '#384658',
+ },
+ },
+ },
+ series: {
+ name: name,
+ type: 'line',
+ data: data,
+ areaStyle: {
+ color: new echarts.graphic.LinearGradient(
+ 0,
+ 0,
+ 0,
+ 1, // 娓愬彉鏂瑰悜锛�0,0锛堝彸涓婏級鈫� 0,1锛堝彸涓嬶級锛堝瀭鐩村悜涓嬶級
+ [
+ { offset: 0, color: `rgba(0, 166, 255, 0.2)` }, // 鎶樼嚎澶勯鑹诧紙涓嶉�忔槑锛�
+ { offset: 1, color: 'rgba(64, 158, 255, 0)' }, // X杞村棰滆壊锛堝畬鍏ㄩ�忔槑锛�
+ ]
+ ),
+ },
+ },
+ };
+}
+
+export function createNewBountyReleaseAmountChartOptions({
+ data,
+ xAxisData,
+ name,
+ yAxisName = '鍗曚綅/涓�',
+ color,
+}: CreateNewEnterChartOptionsOptions) {
+ return _.merge({}, CommonBarChartOptions, {
+ xAxis: {
+ data: xAxisData,
+ boundaryGap: false,
+ },
+ yAxis: {
+ name: yAxisName,
+ },
+ legend: {
+ itemWidth: 12,
+ itemHeight: 5,
+ },
+ tooltip: {
+ trigger: 'axis',
+ axisPointer: {
+ type: 'cross',
+ label: {
+ backgroundColor: '#6a7985',
+ },
+ },
+ },
+ series: data.map((x, index) => ({
+ name: name[index],
+ type: 'line',
+ data: x?.map((y) => ({
+ value: y,
+ })),
+ smooth: true,
+ lineStyle: {
+ width: 1,
+ color: color[index], // 鎶樼嚎棰滆壊
+ },
+ itemStyle: {
+ opacity: 0,
+ },
+ showSymbol: false,
+ areaStyle: {
+ color: new echarts.graphic.LinearGradient(
+ 0,
+ 0,
+ 0,
+ 1, // 娓愬彉鏂瑰悜锛�0,0锛堝彸涓婏級鈫� 0,1锛堝彸涓嬶級锛堝瀭鐩村悜涓嬶級
+ [
+ { offset: 0, color: `${color[index]}` }, // 鎶樼嚎澶勯鑹诧紙涓嶉�忔槑锛�
+ { offset: 0.5, color: 'rgba(64, 158, 255, 0)' }, // X杞村棰滆壊锛堝畬鍏ㄩ�忔槑锛�
+ ]
+ ),
+ },
+ })),
+ } as EChartsOption);
+}
--
Gitblit v1.9.1