| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451 | <script setup>	import {		ref	} from 'vue'	import {		onLoad,		onUnload	} from "@dcloudio/uni-app"	import {		getfundPlanDetail,	} from "@/api/work/countAnalysis.js"	import {		goToPage	} from "@/utils/common.js"	function backToBefore() {		uni.reLaunch({			url: "/pages/index"		});	};	function searchClick() {		goToPage('/pages/countAnalysis/search/index?page=fundPlanSearch')	}	let dataList = ref([{			name: '项目总数',			key: "projectsNum",			count: "",			throughKey: null,		}, {			name: '项目前期数',			key: 'XMQQ',			count: "",			throughKey: 1,		}, {			name: '待开工项目数',			key: 'DKG',			count: "",			throughKey: 6,		}, {			name: '施工阶段数',			key: 'SGJD',			count: "",			throughKey: 7,		},		{			name: '暂停施工数',			key: 'ZTSG',			count: "",			throughKey: 8,		}, {			name: '已完工项目数',			key: 'YWG',			count: "",			throughKey: "A",		}	])	// 柱状图	let opts = {		color: ["#1869F6", "#90B5F4"],		touchMoveLimit: 24,		enableScroll: true,		dataLabel: false,		legend: {			show: false		},		xAxis: {			disableGrid: true,			scrollShow: true,			itemCount: 8,		},		yAxis: {			showTitle: true,			data: [{				min: 0,				title: "单位:万元",			}]		},		extra: {			column: {				type: "group",				width: 14,				barBorderRadius: [12, 12, 12, 12],				activeBgColor: "#000000",				activeBgOpacity: 0.08,			}		}	}	let chartData = ref({		categories: [],		series: [{			name: "月统计金额",			data: []		}]	})	let showBar = ref(false)	let fullData = ref({})	function filterData(data) {		// 所有数据		fullData.value = data		// 上面六个数		for (let i in dataList.value) {			if (typeof(data[dataList.value[i].key]) === 'number') {				dataList.value[i].count = data[dataList.value[i].key].toString() ?? "--"			} else {				dataList.value[i].count = data[dataList.value[i].key] ?? "--"			}		}		// ucharts数		let categoriesList = []		let seriesList = []		for (let i in data.listMonthAmt) {			categoriesList.push(data.listMonthAmt[i].month + "月")			seriesList.push(data.listMonthAmt[i].amtYear)		}		chartData.value.categories = categoriesList.length > 0 ? categoriesList : ["无数据"]		chartData.value.series[0].data = seriesList		showBar.value = true	}	let projectYear = ref(null);	let yearShow = ref(false);	let defaultIndex = ref([0]);	let yearColumns = ref([		["2000", "2001", "2002", "2003", "2004", "2005", "2006", "2007", "2008", "2009", "2010", "2011", "2012",			"2013",			"2014", "2015", "2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023", "2024", "2025", "2026",			"2027", "2028", "2029", "2030", "2031", "2032", "2033"		]	])	const yearShowChoose = () => {		yearShow.value = true;	}	const yearClose = e => {		if (e) {			projectYear.value = e.value[0];			getPageDate();		}		yearShow.value = false;	}	let searchData = ref({});	const getPageDate = () => {		let params = Object.assign({}, searchData.value, {			year: projectYear.value		})		getfundPlanDetail(params).then(res => {			filterData(res.data)		});	}	// 穿透--项目	const throughToDetail = clickStatus => {		// 隐藏		let isHideObj = {			isHide: searchData.value.containHide ? null : 0		}		if ((searchData.value.containHide ?? "") === "") isHideObj.isHide = null;		let params = Object.assign(isHideObj, searchData.value, {			year: projectYear.value,			status: clickStatus,		})		// 状态		if (clickStatus !== null) {			// 如果点击的不是总数			if (searchData.value.status && searchData.value.status !== clickStatus) {				// 如果已选且与点击的不一样				params.status = -1;			}		} else {			params.status = searchData.value.status;		}		uni.$u.route({			url: "/pages/countAnalysis/fundPlan/through/index",			params		})	}	// 穿透--问题	const throughWithQuestion = () => {		let searchYear = searchData.value.year ? searchData.value.year : projectYear.value;		let beginDateStart = `${searchYear}/01/01`;		let beginDateEnd = `${searchYear}/12/31`;		uni.$u.route({			url: "/pages/oversee/index",			params: {				beginDate: beginDateStart,				endDate: beginDateEnd,				status: searchData.value.status,				subName: searchData.value.subName,				indusKind: searchData.value.indusKind,				containHide: searchData.value.containHide,				kind: searchData.value.kind,			}		})	}	// 穿透--金额	const throughWithAmt = key => {		let url = "/pages/countAnalysis/through/index?key=" + key + "&";		let params = Object.assign({}, searchData.value);		if (searchData.value.year) {			params = Object.assign(params, {				year: projectYear.value			});		}		// 隐藏		let isHideObj = {			isHide: searchData.value.containHide ? null : 0		}		if ((searchData.value.containHide ?? "") === "") isHideObj.isHide = null;		params = Object.assign(params, isHideObj);		Object.keys(params).forEach((key) => {			let value = params[key];			if ((value ?? "") === "") delete params[key]		})		for (let i in params) {			let item = null			if (!((params[i] ?? "") === "")) {				item = `${i}=${params[i]}&`;			} else {				item = `${i}=&`;			}			url = url += item;		}		if (!searchData.value.year) {			url = `${url}year=${projectYear.value}`		}		uni.navigateTo({			url		})	}	onLoad(() => {		uni.$on('fundPlanSearch', resolve => {			let optionFilter = Object.assign({}, resolve);			let filterArr = ["null", "undefined", ""];			for (let i in optionFilter) {				if (filterArr.includes(optionFilter[i])) {					optionFilter[i] = null;				}			}			if (optionFilter.year) {				projectYear.value = optionFilter.year;				defaultIndex.value = [projectYear.value - 2000];			}			searchData.value = optionFilter;			getfundPlanDetail(optionFilter).then(res => {				filterData(res.data)			});		});		projectYear.value = new Date().getFullYear();		defaultIndex.value = [projectYear.value - 2000];		getPageDate();	});	onUnload(() => {		uni.$off('fundPlanSearch');	})</script><template>	<view class="container">		<page-title @searchClick='searchClick' showSearch>资金计划</page-title>		<view class="main">			<view class="choose-year" @click="yearShowChoose()">				年度:{{projectYear}}				<u-icon name="arrow-right" color="#000" size="14" customStyle="margin-left:5rpx"></u-icon>			</view>			<view class="count">				<u-grid :border="false" col="3">					<u-grid-item v-for="(item,index) in dataList" :key="index">						<view class="count-item" @click="throughToDetail(item.throughKey)">							<view class="count-item-num">{{item.count}}个</view>							<view class="count-item-name">{{item.name}}</view>						</view>					</u-grid-item>				</u-grid>			</view>			<view class="status">				<view class="status-item question-num" @click="throughWithQuestion()">					<view class="status-item-name">问题项目数</view>					<view class="status-item-num">{{fullData.problemNum}}个</view>				</view>				<view class="status-item year-plan" @click="throughWithAmt('yearAmt')">					<view class="status-item-name">年度计划总金额(万元)</view>					<view class="status-item-num">{{fullData.yearAmt}}</view>				</view>				<view class="status-item real-cost" @click="throughWithAmt('compAmt')">					<view class="status-item-name">实际投入总金额(万元)</view>					<view class="status-item-num">{{fullData.compAmt}}</view>				</view>			</view>			<view class="charts" v-if="showBar">				<qiun-data-charts type="line" :opts="opts" :ontouch="true" :chartData="chartData" />			</view>			<view class="charts-description">月度实际投资情况</view>		</view>		<!-- 年度选择 -->		<u-picker :show="yearShow" :defaultIndex="defaultIndex" :columns="yearColumns" @confirm="yearClose"			@cancel="yearClose" @close="yearClose" closeOnClickOverlay></u-picker>	</view></template><style lang="scss" scoped>	.container {		background: #fff;	}	.main {		position: absolute;		top: 10%;		left: 0;		width: 100%;		height: 95%;		padding: 40rpx 4%;		background-color: #fff;	}	.choose-year {		display: flex;		align-items: center;		justify-content: flex-end;		font-size: 32rpx;		font-weight: 500;		color: #000;	}	.count {		width: 100%;		height: 300rpx;		margin-top: 34rpx;		.count-item {			display: flex;			flex-direction: column;			justify-content: space-evenly;			width: 100%;			height: 150rpx;			text-align: center;			.count-item-num {				font-size: 40rpx;				font-weight: 500;				color: #343437;			}			.count-item-name {				font-size: 32rpx;				color: #9E9E9E;			}		}	}	.status {		display: flex;		justify-content: space-between;		width: 100%;		height: 192rpx;		margin-top: 68rpx;		.status-item {			display: flex;			flex-direction: column;			justify-content: space-between;			width: 30%;			height: 100%;			padding: 30rpx;			border-radius: 40rpx;			.status-item-name {				font-size: 24rpx;			}			.status-item-num {				// word-break: break-all;				font-size: 26rpx;				text-align: left;				font-weight: 500;			}		}		.question-num {			background: #E3E1FF;			color: #1869F6;		}		.year-plan {			background: #DFFFF9;			color: #00B893		}		.real-cost {			background: #FFECE5;			color: #FF530F;		}	}	.charts {		width: 100%;		height: 508rpx;		margin-top: 100rpx;	}	.charts-description {		width: 100%;		margin-top: 34rpx;		text-align: center;		font-size: 32rpx;		font-weight: 500;		color: #343437;	}</style>
 |