| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721 | <script setup>	import {		ref,		reactive,		nextTick	} from "vue"	import {		onLoad,		onShow,	} from "@dcloudio/uni-app"	import {		getOverdueNum	} from "@/api/work/overdue.js"	import {		getannouncementList,		getUnwriteReportList,		getHomeStats,		getBanner	} from "@/api/home.js"	import {		getJSDDlist,		getZJLYlist,		getHYFLlist,	} from "@/api/work/projectInfo.js";	import {		getMessageNum	} from "@/api/work/message.js"	import store from '@/store'	import {		checkRoleById	} from "@/utils/permission.js"	import iconEnterpriseInfo from "@/static/func/enterpriseInfos.svg";	import jdglicon from "@/static/func/jdgl-icon.svg";	import wtdbicon from "@/static/func/wtdb-icon.svg";	import tjfxicon from "@/static/func/tjfx-icon.svg";	import zcwjicon from "@/static/func/zcwj-icon.svg";	import bslcicon from "@/static/func/bslc-icon.svg";	import xxjdicon from "@/static/func/xxjd-icon.svg";	import tzggicon from "@/static/func/tzgg-icon.svg";	import hhdicon from "@/static/func/hhd-icon.svg";	import zdxmicon from "@/static/func/zdxm-icon.svg";	import iconFundUse from "@/static/func/fundUse.svg";	import iconProjectPercents from "@/static/func/projectPercents.svg";	import iconImportant from "@/static/func/important.svg";	import iconPreFlow from "@/static/func/preFlow.svg";	import iconWeekly from "@/static/func/weekly.svg";	import iconMonthly from "@/static/func/monthly.svg";	import iconYearly from "@/static/func/yearly.svg";	import iconOverdued from "@/static/func/overdued.svg";	import iconOverdueWill from "@/static/func/overdueWill.svg";	// 项目信息	let projectYear = ref(2023);	// 选择年	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 = function() {		yearShow.value = true;	}	const yearClose = function(e) {		if (e) {			projectYear.value = e.value[0];			// 获取最新数据			getProjectInfo();		}		yearShow.value = false;	}	// 选择分类	let projectKind = ref(null);	let projectKindId = null;	let kindShow = ref(false);	let kindColumns = ref([]);	const kindShowChoose = function() {		kindShow.value = true;	}	const kindClose = function(e) {		if (e) {			projectKind.value = e.value[0];			projectKindId = hyflFull.find(item => item.value === projectKind.value).key;			// 获取最新数据			getProjectInfo();		}		kindShow.value = false;	}	let hyflFull = [];	const getHYFL = function() {		getHYFLlist().then(res => {			hyflFull = res.data.list;			hyflFull.push({				key: null,				value: "所有分类"			});			kindColumns.value = [res.data.list.map(item => item.value)];			kindColumns.value[0].unshift("所有分类");		})	};	// 选择地点	let projectArea = ref(null);	let projectAreaId = null;	let areaShow = ref(false);	let areaColumns = ref([]);	const areaShowChoose = function() {		areaShow.value = true;	}	const areaClose = function(e) {		if (e) {			projectArea.value = e.value[0];			projectAreaId = jsddFull.find(item => item.value === projectArea.value).key;			// 获取最新数据			getProjectInfo();		}		areaShow.value = false;	}	let jsddFull = [];	const getJSDD = function() {		getJSDDlist().then(res => {			jsddFull = res.data.list;			jsddFull.push({				key: null,				value: "所有地区"			});			areaColumns.value = [res.data.list.map(item => item.value)];			areaColumns.value[0].unshift("所有地区");		})	};	// 资金来源	let projectAmt = ref(null);	let projectAmtId = null;	let zjlyShow = ref(false);	let zjlyColumns = ref([]);	const zjlyShowChoose = () => {		zjlyShow.value = true	}	const zjlyClose = e => {		if (e) {			projectAmt.value = e.value[0];			projectAmtId = zjlyFull.find(item => item.value === projectAmt.value).key;			// 获取最新数据			getProjectInfo();		}		zjlyShow.value = false	}	let zjlyFull = []	const getZJLY = () => {		getZJLYlist().then(res => {			zjlyFull = res.data.list;			zjlyFull.unshift({				key: null,				value: "所有来源"			});			zjlyColumns.value = [res.data.list.map(item => item.value)];		})	}	let projectNum = ref([{		name: "亿元以下",		key: "numAmt1",		value: 0,	}, {		name: "1-5亿",		key: "numAmt2",		value: 0,	}, {		name: "5-10亿",		key: "numAmt3",		value: 0,	}, {		name: "10亿以上",		key: "numAmt4",		value: 0,	}]);	let fundNum = ref([{		name: "年度计划",		key: "amtJh",		value: 0,	}, {		name: "当月计划",		key: "monthPlan",		value: 0,	}, {		name: "年度完成",		key: "amtSj",		value: 0,	}]);	let newProjectNum = ref([{		name: "已开工",		key: "doing",		value: 0,	}, {		name: "已停工",		key: "stop",		value: 0,	}, {		name: "已完工",		key: "end",		value: 0,	}, {		name: "完工率",		key: "rate",		value: 0,	}]);	let fullPercents = ref(0);	let pieOpts = ref({		update: true,		color: ["#69E4E0", "#21DCD5", "#1ACEC8", "#12B9B4", "#07A19C"],		enableScroll: false,		// dataLabel: true,		legend: {			show: false,		},		extra: {			pie: {				activeOpacity: 0.5,				activeRadius: 10,				offsetAngle: 0,				customRadius: 50,				labelWidth: 10,				borderWidth: 1,				offsetAngle: -90			}		}	})	let ringOpts = ref({		update: true,		color: ["#0A0EE4", "#F05C17", "#FFAE89"],		enableScroll: false,		legend: {			show: false		},		title: {			name: "300",			fontSize: 12,			color: "#3D3D3D"		},		subtitle: {			name: "项目总数",			fontSize: 12,			color: "#3D3D3D"		},		extra: {			ring: {				customRadius: 50,				ringWidth: 18,				border: false,				offsetAngle: -90			}		}	})	let ringTotal = ref(0);	let ringChartData = ref({		series: [{			data: [{				name: '新建项目',				value: 100,				labelShow: false			}, {				name: '续建项目',				value: 100,				labelShow: false			}, {				name: '储备项目',				value: 100,				labelShow: false			}]		}]	})	let showRing = ref(false)	let showPie = ref(false)	let addreListOrginal = [];	let pieChartData = ref({		series: [{			data: [{				name: "无数据",				value: 0,				labelShow: false,			}, ],		}]	})	const pieClick = (e) => {		let subjectId = addreListOrginal[e.currentIndex]?.subjectId;		let throughObj = {			subjectId,			year: projectYear.value,			indusKind: projectKindId,			buildAddre: projectAreaId,			zjly: projectAmtId,			name: addreListOrginal[e.currentIndex]?.title			// name:projectAreaId		}		let url = "/pages/countAnalysis/through/index?key=home&";		for (let i in throughObj) {			let item = null;			item = ((throughObj[i] ?? "") === "") ? `${i}=&` : `${i}=${throughObj[i]}&`;			url = url += item;		}		url = url.substr(0, url.length - 1);		uni.navigateTo({			url		})	}	const ringClick = (e) => {		// let subjectId = ringChartData.value.series[0].data.[e.currentIndex]?.subjectId;		let name = ringChartData.value.series[0].data[e.currentIndex]?.name		let throughObj = {			year: projectYear.value,			indusKind: projectKindId,			buildAddre: projectAreaId,			zjly: projectAmtId,			queryType: '',			name: name		}		if (name == '新建项目') {			throughObj.queryType = 0			throughObj.propKind = 1			throughObj.otherStatus = '7,8,A'		} else if (name == '续建项目') {			throughObj.queryType = 0			throughObj.propKind = 2			throughObj.otherStatus = '7,8,A'		} else if (name == '储备项目') {			throughObj.queryType = 3		}		let url = "/pages/projectInfo/index?type=home&";		for (let i in throughObj) {			let item = null;			item = ((throughObj[i] ?? "") === "") ? `${i}=&` : `${i}=${throughObj[i]}&`;			url = url += item;		}		url = url.substr(0, url.length - 1);		uni.navigateTo({			url		})	}	function newProjectClick(e) {		let throughObj = {			year: projectYear.value,			indusKind: projectKindId,			buildAddre: projectAreaId,			zjly: projectAmtId,			queryType: ''		}		if (e == 'doing') {			throughObj.queryType = 0			throughObj.propKind = '1'			throughObj.status = '7'			throughObj.name = '已开工'		} else if (e == 'stop') {			throughObj.queryType = 0			throughObj.propKind = '1'			throughObj.status = '8'			throughObj.name = '已停工'		} else if (e == 'end') {			throughObj.queryType = 0			throughObj.propKind = '1'			throughObj.status = "A"			throughObj.name = '已完工'		} else if (e == 'rate') {			return		}		let url = "/pages/projectInfo/index?type=home&";		for (let i in throughObj) {			let item = null;			item = ((throughObj[i] ?? "") === "") ? `${i}=&` : `${i}=${throughObj[i]}&`;			url = url += item;		}		url = url.substr(0, url.length - 1);		uni.navigateTo({			url		})	}	function getProjectInfo() {		getHomeStats({			year: projectYear.value,			indusKind: projectKindId,			buildAddre: projectAreaId,			zjly: projectAmtId					}).then(res => {			const {				data			} = res;			//  亿元项目数			for (let i in projectNum.value) {				projectNum.value[i].value = data[projectNum.value[i].key] ?? "--";			}			// 资金投资情况			for (let i in fundNum.value) {				fundNum.value[i].value = data[fundNum.value[i].key] ?? "--";			}			// 新建项目数			for (let i in newProjectNum.value) {				newProjectNum.value[i].value = data.buildingCount[newProjectNum.value[i].key] ?? "--";			}			// 实际整体进度			fullPercents.value = (data.numBl ?? "") === "" ? 0 : parseFloat(data.numBl);			// 圆环图			numNew.value = ringChartData.value.series[0].data[0].value = data.numNew;			numOld.value = ringChartData.value.series[0].data[1].value = data.numOld;			numNo.value = ringChartData.value.series[0].data[2].value = data.numNo;			ringOpts.value.title.name = data.numTotal ?? "0";			showRing.value = true;			// 饼图			addreListOrginal = data.buildAddress;			let tempArr = [];			for (let i in data.buildAddress) {				tempArr.push({					name: data.buildAddress[i].title,					value: data.buildAddress[i].num,					labelShow: false,				})			}			if (data.buildAddress.length > 0) {				pieChartData.value.series[0].data = tempArr			} else {				pieChartData.value.series[0].data = [{					name: "无数据",					value: 0,					labelShow: false				}]			};			showPie.value = true;		})	}	let numNew = ref(0);	let numOld = ref(0);	let numNo = ref(0);	// 公告列表	let announcementList = ref([]);	function getAnnounceMent() {		getannouncementList({			pageNo: 1,			pageSize: 3		}).then(res => {			let titleList = res.data.list.map(item => {				return item.title			})			announcementList.value = titleList.length > 0 ? titleList : ['当前暂无公告'];			let bigItem = functionList.value.find(item => item.name === "通知公告");			bigItem.badgeValue = res.data.totalCount ?? 0;		})	}	// 逾期数量	let overdueTotal = ref(0);	let overdueWill = ref(0);	let overdued = ref(0);	function getOverdue() {		getOverdueNum().then(res => {			let bigItem = functionList.value.find(item => item.name === "问题督办");			bigItem.badgeValue = Number((res.data.willOver ?? 0) + (res.data.isOver ?? 0));		})	}	// 功能列表	let functionList = ref([{		name: '基本信息',		url: '/pages/functionList/index',		icon: iconEnterpriseInfo,		type: 'jbxx',		permissionCode: '711'	}, {		name: '进度管理',		url: '/pages/functionList/index',		icon: jdglicon,		type: 'jdgl',		permissionCode: '811'	}, {		name: '统计分析',		url: '/pages/functionList/index',		icon: tjfxicon,		type: 'tjfx',		permissionCode: '714'	}, {		name: '重点项目',		url: '/pages/projectImportant/index',		icon: zdxmicon,		type: 'zdxm',		permissionCode: '711',	}, {		name: '形象进度',		url: '/pages/projectImage/index',		icon: xxjdicon,		// permissionCode: '7112'	}, {		name: '政策文件',		url: '/pages/policy/search/index',		icon: zcwjicon,		// permissionCode: '7112'	}, {		name: '红黄灯',		url: '/pages/light/index',		icon: hhdicon,		type: 'hhd',		permissionCode: '711',	}, {		name: '办事流程',		url: '/pages/process/index',		icon: bslcicon,		// permissionCode: '7112'	}, {		name: '问题督办',		url: '/pages/functionList/index',		icon: wtdbicon,		type: 'wtdb',		permissionCode: '713',		showBadge: true,		badgeValue: 0,	}, {		name: '通知公告',		url: '/pages/announcement/list/index',		icon: tzggicon,		// permissionCode: '7112',		showBadge: true,		badgeValue: 0,	}])	// 判断功能菜单权限	const roles = store.getters && store.getters.permissions;	function judgeFuncList() {		// let tempList = JSON.parse(JSON.stringify(functionList.value))		// for (let i in tempList) {		// 	//如果父级都没权限 直接移除		// 	if (!roles.includes(tempList[i].permissionCode)) {		// 		tempList[i].ban = true		// 	} else {		// 		let funcListSon = tempList[i].funcList		// 		for (let j in funcListSon) {		// 			if (!roles.includes(funcListSon[j].permissionCode)) {		// 				funcListSon[j].ban = true		// 			}		// 		}		// 	}		// }		// let filterList = tempList.filter(item => {		// 	return !item.ban		// })		// for (let i in filterList) {		// 	let filterListSon = filterList[i].funcList.filter(item => {		// 		return !item.ban		// 	})		// 	filterList[i].funcList = filterListSon		// }		// functionList.value = filterList	}	function goToPage(url, permissionCode, type) {		if (permissionCode) {			let havePermission = checkRoleById([permissionCode])			if (!havePermission) return		}		uni.$u.route({			url: url,			params: {				type: type || null			}		})	}	// =============================未填写周报月报	let popupShow = ref(false)	let unWriteList = ref([])	let unWriteListTotal = ref(0)	function getUnwirteList() {		getUnwriteReportList().then(res => {			if (res.data.list.length > 0) {				popupShow.value = true;				unWriteList.value = res.data.list;				unWriteListTotal.value = res.data.list.length;			}		})	}	function goToWriteReport(item) {		const {			sub_id: subId,			month1: kj_month,		} = item;		let year = item.month1.substr(0, 4)		let startDate = item.month1.substr(0, 10)		if (item.kind === "1") { // 周报					uni.navigateTo({				url: `/pages/weekly/input/index?subId=${subId}&startDate=${startDate}&year=${year}&kj_month=${kj_month}`			})		} else { // 月报				let kjMonth = kj_month.substring(0, 4) + '年' + kj_month.substring(4, 6) + '月';			uni.navigateTo({				url: `/pages/monthly/input/index?subId=${subId}&startDate=${startDate}&year=${year}&kj_month=${kjMonth}`			})		}	}	function popupClose() {		popupShow.value = false	}	function getMessageCount() {		getMessageNum().then(res => {			if (res.data.count) {				uni.setTabBarBadge({ //显示数字					index: 1, //tabbar下标					text: res.data.count + '' //数字				})			} else {				uni.removeTabBarBadge({ //显示数字					index: 1, //tabbar下标				})			}		})	}	function projectgoto(e) {		let params = {			indusKind: projectKindId,			subjectId: projectAreaId,			zjly: projectAmtId,			year: projectYear.value,			startAmt: '',			endAmt: '',			type: 'home',			queryType: 0		}				if (e.key == 'numAmt1') {			params.startAmt = 0			params.endAmt = 10000			params.name = '亿元以下'		} else if (e.key == 'numAmt2') {			params.startAmt = 10000			params.endAmt = 50000			params.name = '1-5亿'		} else if (e.key == 'numAmt3') {			params.startAmt = 50000			params.endAmt = 100000			params.name = '5-10亿'		} else if (e.key == 'numAmt4') {			params.startAmt = 100000			params.endAmt = null			params.name = '10亿以上'		}		uni.$u.route({			url: '/pages/projectInfo/index',			params: params		})	}	function amtgoto(e) {		let params = {			indusKind: projectKindId,			subjectId: projectAreaId,			zjly: projectAmtId,			isCurrMonth: null,			year: null,			key: null		}		if (e.key == 'amtJh') {			params.year = projectYear.value			params.key = 'year'			params.name = '年度计划'			uni.$u.route({				url: '/pages/countAnalysis/through/index',				params: params			})		} else if (e.key == "monthPlan") {			params.isCurrMonth = true			params.key = 'mothAmt'			params.name = '当月计划'			uni.$u.route({				url: '/pages/countAnalysis/through/index',				params: params			})		} else if (e.key == 'amtSj') {			params.year = projectYear.value			params.key = 'ndjh'			params.name = '年度完成'			uni.$u.route({				url: '/pages/countAnalysis/through/index',				params: params			})		}	}	//轮播图	let bannerList = reactive([])	async function getBannerList() {		getBanner().then(res => {			bannerList = res.data.pictureList		})	}	function bannerClick(e) {		let result = {}		for (let i = 0; i < bannerList.length; i++) {			if (i == e) {				result = bannerList[i]			}		}		nextTick(() => {			// uni.navigateTo({			// 	url: `/pages/policy/detail/index?title=${result.title}&id=${result.id}`			// })			uni.$u.route({				url: '/pages/policy/detail/index',				params: {					title: result.title,					id: result.id				}			})		})	}	onLoad(() => {		let now = new Date();		projectYear.value = now.getFullYear();		defaultIndex.value = [projectYear.value - 2000];		// judgeFuncList(); //判断权限		getAnnounceMent(); //获取公告		getHYFL(); //获取行业分类		getJSDD(); //获取建设地点		getZJLY(); // 获取资金来源		getProjectInfo(); //获取项目数据		getOverdue(); //获取逾期数量		// getUnwirteList(); //获取未填写周报月报信息		getBannerList(); //获取轮播图数据		getMessageCount(); //获取未读消息数量	});	onShow(() => {		if (popupShow.value) {			getUnwirteList();		}	})</script><template>	<view class="container">		<!-- 头 固定-->		<view class="title-content">			<text class="title">哈密市重点项目建设及工作可视化管理平台</text>			<!-- 搜索 -->			<view class="search">				<view class="search-input">					<view class="search-icon"></view>					<input @click="goToPage('/pages/search/index')" placeholder="项目、领导电话..."						placeholder-style="color: #D8D8D8;font-size:24rpx" />				</view>				<view class="search-focus" @click="goToPage('/pages/focus/index')">					<view class="search-focus-icon"></view>					<text class="text">关注</text>				</view>			</view>		</view>		<view class="top-blue">			<view class="banner-box">				<u-swiper :list="bannerList" indicator indicatorMode="line" keyName='coverImg' circular radius='20rpx'					height="254rpx" @click="bannerClick"></u-swiper>			</view>			<view class="function-list">				<u-grid :border="false" col="5">					<u-grid-item v-for="(item,index) in functionList" :key="index"						@click="goToPage(item.url,item.permissionCode,item.type)">						<view class="grid-item">							<u-badge v-if="item.showBadge" class="badge-num" type="error" max="99" :value="item.badgeValue"></u-badge>							<view class="grid-item-icon">								<image :src="item.icon"></image>							</view>							{{item.name}}						</view>					</u-grid-item>				</u-grid>			</view>			<!-- 项目信息 -->			<view class="project-info">				<view class="project-info-select">					<view class="choose-year" @click="yearShowChoose()">						{{projectYear??"年度"}}						<u-icon name="arrow-right" color="#343437" size="14" customStyle="margin-left:10rpx"></u-icon>					</view>					<view class="choose-year border" @click="kindShowChoose()">						{{projectKind ??"行业分类"}}						<u-icon name="arrow-right" color="#343437" size="14" customStyle="margin-left:10rpx"></u-icon>					</view>					<view class="choose-year border" @click="areaShowChoose()">						{{projectArea ??"建设地点"}}						<u-icon name="arrow-right" color="#343437" size="14" customStyle="margin-left:10rpx"></u-icon>					</view>					<view class="choose-year border" @click="zjlyShowChoose()">						<view class="choose-year-text">{{projectAmt ??"资金来源"}}</view>						<u-icon name="arrow-right" color="#343437" size="14" customStyle="margin-left:10rpx"></u-icon>					</view>				</view>				<view class="project-num-box">					<view class="project-num-box-item text-color1">						<view class="item-title">							亿元项目数(个)						</view>						<view class="item-box" v-for="(item,index) in projectNum" :key="index" @click="projectgoto(item)">							<view class="name">								{{item.name}}							</view>							<view class="num">								{{item.value}}							</view>						</view>					</view>					<view class="project-num-box-item text-color2">						<view class="item-title">							资金投资情况(万元)						</view>						<view class="item-box high-gap" v-for="(item,index) in fundNum" :key="index" @click="amtgoto(item)">							<view class="name">								{{item.name}}							</view>							<view class="num">								{{item.value}}							</view>						</view>						<!-- <view class="item-box-horizon">            	<view class="item-box" v-for="(item,index) in fundNum" :key="index"            		@click="amtgoto(item)">            		<view class="name">{{item.name}}</view>            		<view class="num">{{item.value}}</view>            	</view>            </view> -->					</view>				</view>				<view class="project-num-box">					<view class="project-num-box-item text-color3">						<view class="item-title">							新建项目数(个)						</view>						<view class="item-box-horizon">							<view class="item-box" v-for="(item,index) in newProjectNum" :key="index"								@click="newProjectClick(item.key)">								<view class="name">{{item.name}}</view>								<view class="num">{{item.value}}{{item.key === "rate" ? "%" : ""}}</view>							</view>						</view>					</view>				</view>				<view class="project-process">					<view class="title">实际整体进度</view>					<view class="line-progress">						<u-line-progress :percentage="fullPercents" inactiveColor="#C1CEED" activeColor="#5D5AFF" :showText="false"							height="13"></u-line-progress>					</view>					<view class="percent">{{fullPercents}}%</view>				</view>				<!-- 饼图 -->				<view class="charts">					<view class="charts-item" style="width: 40%;">						<view class="charts-item-title">							项目个数						</view>						<view class="charts-item-ring">							<view class="pie-back">								<image src="@/static/echarts-pie.png" mode=""></image>							</view>							<qiun-data-charts v-if="showRing" type="ring" :opts="ringOpts" :chartData="ringChartData" :ontouch="true"								@getIndex="ringClick" />						</view>						<view class="charts-item-description">							<view class="charts-item-key">								<view class="charts-item-color" style="border-color: #0A0EE4;"></view>								<view class="charts-item-name">新建项目</view>							</view>							<view class="charts-item-value">{{numNew}}</view>						</view>						<view class="charts-item-description">							<view class="charts-item-key">								<view class="charts-item-color" style="border-color: #F05C17;"></view>								<view class="charts-item-name">续建项目</view>							</view>							<view class="charts-item-value">{{numOld}}</view>						</view>						<view class="charts-item-description">							<view class="charts-item-key">								<view class="charts-item-color" style="border-color: #FFAE89;"></view>								<view class="charts-item-name">储备项目</view>							</view>							<view class="charts-item-value">{{numNo}}</view>						</view>					</view>					<view class="charts-item" style="width: 60%; padding: 0 20rpx; box-sizing: border-box;">						<view class="charts-item-title">							建设地点实际投资占比						</view>						<view class="charts-item-pie">							<qiun-data-charts v-if="showPie" type="pie" :opts="pieOpts" :chartData="pieChartData"								tooltipFormat="tooltipDemo1" :ontouch="true" @getIndex="pieClick" />						</view>						<view class="charts-item-description" v-for="(item,index) in pieChartData.series[0].data" :key="index">							<view class="charts-item-key">								<view class="charts-item-color" :style="{borderColor:pieOpts.color[index]}"></view>								<view class="charts-item-name">{{item.name ?? "--"}}</view>							</view>							<view class="charts-item-value">{{item.value ?? "--"}}%</view>						</view>					</view>				</view>			</view>			<!-- 底部间隔 -->			<view class="gap-bottom"></view>		</view>		<!-- 周报月报弹窗 -->		<u-popup :show="popupShow" :round="20" @close="popupClose()" mode="center" closeable>			<view class="remind-box">				<text class="remind-title">提示</text>				<view class="remind-card" v-for="(item,index) in unWriteList" :key="index">					<view class="remind-item">						<view class="remind-item-name">类型</view>						<view class="remind-item-content">{{item.kind==='1'?'缺失周报':'缺失月报'}}</view>					</view>					<view class="remind-item">						<view class="remind-item-name">项目名称</view>						<view class="remind-item-content">{{item.sub_name || '--'}}</view>					</view>					<view class="remind-item">						<view class="remind-item-name">说明</view>						<view class="remind-item-content">{{item.remark || '--'}}</view>					</view>					<view class="remind-item">						<view class="remind-item-btn" @click="goToWriteReport(item)">							{{item.kind==='1'?'填写周报':'填写月报'}}						</view>					</view>					<view class="remind-count">						{{index + 1}}/{{unWriteListTotal}}					</view>				</view>			</view>		</u-popup>		<!-- 年度选择 -->		<u-picker :show="yearShow" :defaultIndex="defaultIndex" :columns="yearColumns" @confirm="yearClose"			@cancel="yearClose" @close="yearClose" closeOnClickOverlay></u-picker>		<!-- 行业选择 -->		<u-picker :show="kindShow" :columns="kindColumns" @confirm="kindClose" @cancel="kindClose" @close="kindClose"			closeOnClickOverlay></u-picker>		<!-- 地点选择 -->		<u-picker :show="areaShow" :columns="areaColumns" @confirm="areaClose" @cancel="areaClose" @close="areaClose"			closeOnClickOverlay></u-picker>		<!-- 资金来源 -->		<u-picker :show="zjlyShow" :columns="zjlyColumns" @confirm="zjlyClose" @cancel="zjlyClose" @close="zjlyClose"			closeOnClickOverlay></u-picker>	</view></template><style lang="scss" scoped>	@font-face {		font-family: TITLETEXT;		src: url('@/font/RuiZiAoYunJingShenPinBoJianMianFei-Shan(REEJI-PinboGB-Flash)-2.ttf');	}	page {		height: 100%;		background-color: #EAF1FF;	}	.text-color1 {		color: #003FA8;		background: #F0F4FC;		border-radius: 16rpx 16rpx 16rpx 16rpx;	}	.text-color2 {		color: #8F5F00;		background: #FFFAF0;		border-radius: 16rpx 16rpx 16rpx 16rpx;	}	// .text-color2 {	// 	width: 100% !important;	// 	height: 140rpx !important;	// 	margin-top: 12rpx;	// 	padding: 14rpx 15rpx 20rpx 15rpx;	// 	color: #8F5F00;	// 	background: #FFFAF0;	// 	border-radius: 16rpx 16rpx 16rpx 16rpx;	// }	.text-color3 {		width: 100% !important;		height: 140rpx !important;		margin-top: 12rpx;		padding: 14rpx 15rpx 20rpx 15rpx;		color: #4E00A8;		background: #F8F3FF;		border-radius: 16rpx;	}	.container {		background: #EAF1FF;	}	.title-content {		position: fixed;		top: 0;		left: 0;		width: 100%;		height: 258rpx;		padding-top: 104rpx;		text-align: center;		background-color: #1763E7;		z-index: 1;		.title {			font-size: 36rpx;			font-weight: 700;			color: #FFF;		}	}	.search {		display: flex;		justify-content: space-between;		width: 92%;		height: 82rpx;		margin: auto;		padding: 25rpx 0 25rpx 0;		.search-input {			display: flex;			align-items: center;			width: 80%;			height: 52rpx;			padding: 0 30rpx;			box-sizing: border-box;			text-align: left;			background-color: #fff;			border-radius: 28rpx 28rpx 28rpx 28rpx;			.search-icon {				width: 28rpx;				height: 32rpx;				margin-right: 26rpx;				background-image: url('@/static/search-black.svg');				background-size: 100% 100%;			}		}		.search-focus {			display: flex;			align-items: center;			justify-content: flex-end;			width: 19%;			height: 52rpx;			background: linear-gradient(270deg, #63B4FF 29%, rgba(23, 99, 230, 0.32) 88%);			border-radius: 28rpx 28rpx 28rpx 28rpx;			.search-focus-icon {				width: 36rpx;				height: 32rpx;				margin-right: 10rpx;				background-image: url('@/static/focus.png');				background-size: 100% 100%;			}			.text {				margin-right: 20rpx;				font-size: 28rpx;				white-space: nowrap;				color: #FFFFFF;			}		}	}	.top-blue {		width: 100%;		height: 702rpx;		padding-top: 260rpx;		margin-bottom: 82rpx;		background: linear-gradient(180deg, #1763E7 60%, rgba(234, 241, 255, 0) 93%);		border-radius: 0 0 40rpx 40rpx;		.banner-box {			width: 92%;			height: 254rpx;			margin: auto;		}	}	.announcementList {		width: 92%;		height: 72rpx;		margin: 0 auto 32rpx;		padding: 10rpx 0;		color: #FF8D02;		background-color: #FFF7DC;		border-radius: 26rpx;		.announcementList-text {			margin-bottom: 18rpx;			font-size: 28rpx;		}	}	::v-deep .u-notice-bar {		width: 100%;		// padding: 0;		border-radius: 19rpx;	}	::v-deep .u-notice__swiper__item__text {		overflow: hidden;		text-overflow: ellipsis;		white-space: nowrap;	}	.special-funcs {		display: flex;		justify-content: space-between;		width: 92%;		height: 210rpx;		margin: 50rpx auto 32rpx;		background-size: 100% 100%;		.special-func-item {			width: 200rpx;			height: 210rpx;			padding: 34rpx 18rpx;			box-sizing: border-box;			background-size: 100% 100%;			.special-func-title {				display: flex;				justify-content: space-between;				align-items: flex-start;			}			.special-func-name {				color: #FFFFFF;				line-height: 34rpx;				font-size: 32rpx;				font-family: TITLETEXT;			}		}		.gov {			background-image: url('@/static/special-gov.png');		}		.todo {			background-image: url('@/static/special-todo.png');		}		.images {			background-image: url('@/static/special-image.png');		}	}	.project-info-select {		display: flex;		justify-content: space-between;		align-items: center;		width: 92%;		height: 80rpx;		background-color: #fff;		margin: auto;		border-radius: 16rpx 16rpx 16rpx 16rpx;		.lines {			height: 46rpx;			border-right: #D7DDEA;		}		.choose-year {			flex: 1;			display: flex;			align-items: center;			justify-content: center;			font-size: 24rpx;			font-weight: 500;			color: #343437;			.choose-year-text {				width: 3rem;				overflow: hidden;				text-overflow: ellipsis;				white-space: nowrap;			}		}		.border {			border-left: 3rpx solid #EAF0FD;		}	}	.project-info {		width: 92%;		min-height: 326rpx;		margin: auto;		margin-top: 20rpx;		border-radius: 16rpx 16rpx 16rpx 16rpx;		background-color: #FFFFFF;		padding-bottom: 20rpx;		.project-num-box {			display: flex;			justify-content: space-between;			align-items: center;			width: 92%;			margin: auto;			.project-num-box-item {				width: 48%;				height: 262rpx;				padding: 20rpx 15rpx 20rpx 15rpx;				.item-title {					font-size: 28rpx;					font-weight: 500;					font-family: OPPOSans-M;				}				.item-box {					display: flex;					justify-content: space-between;					align-items: center;					padding: 5rpx 0 5rpx 0;					.name {						font-size: 24rpx;						font-weight: 400;					}					.num {						font-size: 28rpx;						font-weight: 500;						font-family: OPPOSans-M;					}				}				.high-gap {					padding: 5rpx 0 16rpx 0;				}			}		}		.blue {			color: #1763E7		}		.project-num-minbox {			display: flex;		}		.project-num-item {			flex: 1;			margin: auto 0;			font-size: 24rpx;			color: #343437;			text-align: center;			.project-num-value {				margin-bottom: 8rpx;				font-size: 36rpx;				color: #343437;				font-weight: 700;			}		}		.project-process {			display: flex;			align-items: center;			justify-content: space-between;			width: 92%;			margin: auto;			height: 88rpx;			font-size: 28rpx;			font-weight: 500;			color: #4B17E7;			.line-progress {				width: 58%;			}			.title {				font-size: 28rpx;				font-weight: 500;				font-family: OPPOSans-M;				color: #001643;			}			.percent {				font-weight: 500;				font-size: 28rpx;				font-family: OPPOSans-M;				color: #001643;			}		}	}	.item-box-horizon {		display: flex;		align-items: center;		justify-content: space-evenly;		width: 100%;		margin-top: 4rpx;		.item-box {			display: block !important;			text-align: center;		}	}	.charts {		display: flex;		justify-content: space-between;		width: 92%;		margin: auto;		.charts-item {			height: 100%;			box-sizing: border-box;			border-radius: 40rpx;			// border: 3rpx solid rgba(200, 216, 247, 0.302);			.charts-item-title {				margin: auto;				text-align: center;				font-size: 28rpx;				font-weight: 500;				color: #001643;				font-family: OPPOSans-M;			}			.charts-item-ring {				position: relative;				height: 250rpx;				margin: 0 auto;				.pie-back {					position: absolute;					left: 50%;					top: 10rpx;					transform: translate(-49%);					image {						width: 268rpx;						height: 268rpx;						z-index: 0;					}				}			}			.charts-item-pie {				width: 100%;				// height: 400rpx;				height: 250rpx;				margin: 0 auto;			}			.charts-item-text {				width: 100%;				text-align: center;				font-size: 28rpx;				font-weight: 500;				color: #3D3D3D;			}		}	}	.charts-item-description {		display: flex;		align-items: center;		justify-content: space-between;		width: 100%;		margin: 20rpx 0;		font-size: 24rpx;		.charts-item-key {			display: flex;			align-items: center;		}		.charts-item-color {			width: 26rpx;			height: 26rpx;			margin-right: 16rpx;			border-radius: 50%;			border: 6rpx solid #fff;		}		.charts-item-name {			font-size: 24rpx;			color: #001643;		}		.charts-item-value {			font-weight: 500;			font-size: 24rpx;			color: #001643;		}	}	.overdue {		display: flex;		justify-content: space-between;		width: 92%;		height: 136rpx;		margin: 25rpx auto;		border-radius: 28rpx;		backdrop-filter: blur(40rpx);	}	.overdue-item {		display: flex;		justify-content: space-between;		align-items: center;		width: 328rpx;		height: 136rpx;		padding: 0 28rpx 0 44rpx;		box-sizing: border-box;		font-size: 32rpx;		color: #001D4F;		font-weight: 400;		font-family: TITLETEXT;		background-color: #fff;		border-radius: 28rpx;		.overdue-icon {			background-size: 100% 100%;			background-position: center center;		}		.overdue-will {			width: 52rpx;			height: 53rpx;			background-image: url('@/static/overdue-warn.png');			.badge-num {				position: absolute;				top: 40rpx;				right: -36rpx;			}		}		.overdued {			width: 61rpx;			height: 54rpx;			background-image: url('@/static/overdue.png');			.badge-num {				position: absolute;				top: 40rpx;				right: -36rpx			}		}		.badge-box {			position: relative;		}		.overdue-item-text {			display: flex;			align-items: center;		}	}	.report {		display: flex;		justify-content: space-between;		width: 92%;		margin: 25rpx auto 0;		padding: 0 78rpx;		height: 164rpx;		border-radius: 28rpx;		background: #fff;	}	.report-item {		width: 128rpx;		height: 142rpx;		margin: auto 0;		text-align: center;		.report-icon {			width: 96rpx;			height: 96rpx;			margin: 0 auto;			background-size: 100% 100%;		}		.weekly {			background-image: url('@/static/icon-weekly.svg');		}		.monthly {			background-image: url('@/static/icon-monthly.svg');		}		.yearly {			background-image: url('@/static/icon-yearly.svg');		}		.report-item-text {			margin-top: 10rpx;			color: #000;			font-size: 28rpx;		}	}	.gap-line {		width: 100%;		height: 20rpx;		background: #E8ECF4;	}	.function-list {		margin: 20rpx auto;		border-radius: 16rpx 16rpx 16rpx 16rpx;		background: #FFFFFF;		height: 278rpx;		width: 92%;		.grid-item {			height: 62rpx;			margin: 18rpx 0 46rpx;			font-size: 28rpx;			color: #343437;			font-weight: 400;			.badge-num {				position: absolute;				top: 5rpx;				right: 25rpx;			}			.grid-item-icon {				width: 60rpx;				height: 60rpx;				margin: 0 auto 6rpx;				image {					width: 100%;					height: 100%;				}			}		}		.bottom-item {			margin-bottom: 0;		}	}	.gap-bottom {		width: 100%;		height: 150rpx;	}	.remind-box {		width: 672rpx;		min-height: 464rpx;		max-height: 858rpx;		padding: 16rpx 40rpx;		overflow: hidden;		overflow-y: scroll;		.remind-title {			color: #FF4800;			font-size: 36rpx;		}		.remind-card {			position: relative;			min-height: 376rpx;			padding-bottom: 32rpx;			border-bottom: 2rpx solid #D8D8D8;			.remind-count {				position: absolute;				top: 0;				right: -40rpx;				display: flex;				align-items: center;				justify-content: center;				width: 134rpx;				height: 64rpx;				font-size: 32rpx;				color: #1869F6;				background: #CEE0FF;				border-radius: 32rpx 0rpx 0rpx 32rpx;			}		}		.remind-item {			display: flex;			align-items: flex-start;			margin-top: 40rpx;			font-size: 32rpx;			.remind-item-name {				min-width: 192rpx;				color: #9E9E9E;			}			.remind-item-content {				color: #343437;				float: left;			}			.remind-item-btn {				width: 100%;				height: 84rpx;				line-height: 84rpx;				font-size: 36rpx;				color: #fff;				text-align: center;				background: #1869F6;				border-radius: 16rpx;			}		}	}	::v-deep .u-popup__content {		overflow: hidden;	}</style>
 |