| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515 | <script setup>	import {		ref	} from "vue";	import {		onLoad,		onPullDownRefresh,		onReachBottom,		onPageScroll,	} from "@dcloudio/uni-app";	import {		getOverdueNum	} from "@/api/work/overdue.js";	import store from '@/store';	// 图标	import iconFundPlan from "@/static/func/func-fundPlan.svg";	import iconFundUse from "@/static/func/func-fundUse.svg";	import iconProjectProcess from "@/static/func/func-projectProcess.svg";	import iconImportant from "@/static/func/func-important.svg";	import iconPreFlow from "@/static/func/func-preFlow.svg";	import iconIndustyRateValue from "@/static/func/func-industyRateValue.svg";	import iconIndustyRateAmt from "@/static/func/func-industyRateAmt.svg";	import iconAreaRate from "@/static/func/func-areaRate.svg";	import iconYearRate from "@/static/func/func-yearRate.svg";	import iconReport from "@/static/func/func-report.svg";	let funType = ref(null)	let title = ref(null)	function goToPage(url, permissionCode, type) {		if (permissionCode) {			let havePermission = checkRoleById([permissionCode])			if (!havePermission) return		}		uni.$u.route({			url: url,			params: {				type: type || null			}		})	}	// 判断功能菜单权限	const roles = store.getters && store.getters.permissions;	let qyxxFalg = ref(false)	let xmtzFalg = ref(false)	let cbxmFalg = ref(false)	let lxrFalg = ref(false)	let zbFalg = ref(false)	let ybFalg = ref(false)	let ndjhFalg = ref(false)	let wtqdFalg = ref(false)	let wtlrFalg = ref(false)	let wtgzFalg = ref(false)	let yqtxFalg = ref(false)	let yyqFalg = ref(false)	function judgeFuncList() {		if (roles.includes('7112')) {			qyxxFalg.value = true		}		if (roles.includes('7111')) {			xmtzFalg.value = true		}		if (roles.includes('7113')) {			cbxmFalg.value = true		}		if (roles.includes('7114')) {			lxrFalg.value = true		}		if (roles.includes('8112')) {			zbFalg.value = true		}		if (roles.includes('8113')) {			ybFalg.value = true		}		if (roles.includes('8111')) {			ndjhFalg.value = true		}		if (roles.includes('7131')) {			wtqdFalg.value = true		}		if (roles.includes('7132')) {			wtlrFalg.value = true		}		if (roles.includes('7133')) {			wtgzFalg.value = true		}		if (roles.includes('7134')) {			yqtxFalg.value = true		}		if (roles.includes('7135')) {			yyqFalg.value = true		}		// 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	}	// 未读角标	let overdueWill = ref(0);	let overdued = ref(0);	// 功能列表	let funcType = ref({		tjfx: [{			name: "资金计划",			icon: iconFundPlan,			code: "7141",			url: "/pages/countAnalysis/fundPlan/index",		}, {			name: "资金使用",			icon: iconFundUse,			code: "7142",			url: "/pages/countAnalysis/fundUse/index"		}, {			name: "问题处理进度",			longName: true,			icon: iconProjectProcess,			code: "7143",			url: "/pages/countAnalysis/projectProcess/index"		}, {			name: "重大事项",			icon: iconImportant,			code: "7144",			url: "/pages/important/index"		}, {			name: "前期手续",			icon: iconPreFlow,			code: "7145",			url: "/pages/preFlow/index"		}, {			name: "行业占比分析-数量",			longName: true,			icon: iconIndustyRateValue,			url: "/pages/analysis/index?type=industyRateValue",		}, {			name: "行业占比分析-金额",			longName: true,			icon: iconIndustyRateAmt,			url: "/pages/analysis/index?type=industyRateAmt"		}, {			name: "区县占比分析",			longName: true,			icon: iconAreaRate,			url: "/pages/analysis/index?type=areaRate"		}, {			name: "年度投资分析",			longName: true,			icon: iconYearRate,			url: "/pages/analysis/index?type=yearRate"		}, {			name: "投资分析报告",			icon: iconReport,			url: "/pages/analysis/report/index"		}]	});	// 渲染列表	let showList = ref([])	const judgeFuncListByFilter = () => {		let funcList = funcType.value.tjfx;		showList.value = funcList.filter(item => !item.code || roles.includes(item.code));	}	onLoad((e) => {		funType.value = e.type		if (e.type === 'jbxx') {			title.value = '基本信息'		} else if (e.type === 'jdgl') {			title.value = '进度管理'		} else if (e.type === 'wtdb') {			title.value = '问题督办'			getOverdueNum().then(res => {				overdueWill.value = res.data.willOver ?? 0;				overdued.value = res.data.isOver ?? 0;			})		} else if (e.type === 'tjfx') {			title.value = '统计分析'			judgeFuncListByFilter();		}		judgeFuncList(); //判断权限	})</script><template>	<view class="content">		<view class="top-box"></view>		<page-title>{{title}}</page-title>		<view class="btnlist-box" v-if="funType==='jbxx'">			<view class="btn color1" @click="goToPage('/pages/enterpriseInfo/index')" v-if="qyxxFalg">				<view class="btn-icon">					<image src="@/static/func/qyxx-icon.svg" mode=""></image>				</view>				<view class="name">					企业信息				</view>			</view>			<view class="btn color2" @click="goToPage('/pages/projectInfo/index',null,'all')" v-if="xmtzFalg">				<view class="btn-icon">					<image src="@/static/func/xmtz-icon.svg" mode=""></image>				</view>				<view class="name">					项目台账				</view>			</view>			<view class="btn color3" @click="goToPage('/pages/cbProject/index')" v-if="cbxmFalg">				<view class="btn-icon">					<image src="@/static/func/cbxm-icon.svg" mode=""></image>				</view>				<view class="name">					储备项目				</view>			</view>			<view class="btn color4" @click="goToPage('/pages/contact/index')" v-if="lxrFalg">				<view class="btn-icon">					<image src="@/static/func/lxr-icon.svg" mode=""></image>				</view>				<view class="name">					联系人				</view>			</view>			<view class="btn intermediaryService" @click="goToPage('/pages/intermediaryService/search/index')">				<view class="btn-icon">					<image src="@/static/func/func-intermediaryService.svg" mode=""></image>				</view>				<view class="name">					中介服务库				</view>			</view>		</view>		<view class="btnlist-box" v-if="funType==='jdgl'">			<view class="btn color1" @click="goToPage('/pages/weekly/index')" v-if="zbFalg">				<view class="btn-icon">					<image src="@/static/func/week-icon.svg" mode=""></image>				</view>				<view class="name">					周报				</view>			</view>			<view class="btn color2" @click="goToPage('/pages/monthly/index')" v-if="ybFalg">				<view class="btn-icon">					<image src="@/static/func/month-icon.svg" mode=""></image>				</view>				<view class="name">					月报				</view>			</view>			<view class="btn color4" @click="goToPage('/pages/yearly/index')" v-if="ndjhFalg">				<view class="btn-icon">					<image src="@/static/func/ndjh-icon.svg" mode=""></image>				</view>				<view class="name">					年度计划				</view>			</view>		</view>		<view class="btnlist-box" v-if="funType==='wtdb'">			<view class="btn color1" @click="goToPage('/pages/oversee/index')" v-if="wtqdFalg">				<view class="btn-icon">					<image src="@/static/func/wtqd-icon.svg" mode=""></image>				</view>				<view class="name">					问题清单				</view>			</view>			<view class="btn color5" @click="goToPage('/pages/questionInput/index')" v-if="wtlrFalg">				<view class="btn-icon">					<image src="@/static/func/wtlr-icon.svg" mode=""></image>				</view>				<view class="name">					问题录入				</view>			</view>			<view class="btn color6" @click="goToPage('/pages/questionTrace/index')" v-if="wtgzFalg">				<view class="btn-icon">					<image src="@/static/func/wtgz-icon.svg" mode=""></image>				</view>				<view class="name">					问题跟踪				</view>			</view>			<view class="btn color7" @click="goToPage('/pages/overdue/index')" v-if="yqtxFalg">				<view class="btn-icon">					<image src="@/static/func/yqtx-icon.svg" mode=""></image>				</view>				<view class="name">					预期提醒				</view>				<u-badge class="badge-num" type="error" max="99" :value="overdueWill"></u-badge>			</view>			<view class="btn color8" @click="goToPage('/pages/overdue/overdued/index')" v-if="yyqFalg">				<view class="btn-icon">					<image src="@/static/func/yyq-icon.svg" mode=""></image>				</view>				<view class="name">					已逾期				</view>				<u-badge class="badge-num" type="error" max="99" :value="overdued"></u-badge>			</view>		</view>		<view class="btnlist-box" v-if="funType==='tjfx'">			<view class="func-area">				<u-grid :border="false" col="4">					<u-grid-item v-for="(item,index) in showList" :key="index">						<view class="func-item" @click="goToPage(item.url)">							<view class="func-item-icon">								<image :src="item.icon"></image>							</view>							<view class="func-item-name" :class="item.longName ? 'func-item-shortGap':''">								{{item.name}}							</view>						</view>					</u-grid-item>				</u-grid>			</view>		</view>	</view></template><style scoped lang="scss">	.func-area {		width: 100%;		min-height: 300rpx;		padding: 0 16rpx;		box-sizing: border-box;	}	.func-item {		width: 160rpx;		height: 168rpx;		margin-bottom: 16rpx;		padding: 28rpx 0;		box-sizing: border-box;		background: #FFF;		border-radius: 20rpx;		.func-item-icon {			width: 60rpx;			height: 50rpx;			margin: 0 auto 0;			image {				width: 100%;				height: 100%;			}		}		.func-item-name {			width: 116rpx;			margin: 26rpx auto 0;			font-size: 24rpx;			color: #343437;			text-align: center;		}		.func-item-shortGap {			margin: 16rpx auto 0;		}	}	.color1 {		background-color: #5773FF	}	.color2 {		background-color: #14B890	}	.color3 {		background-color: #744BF1	}	.color4 {		background-color: #F79721	}	.color5 {		background-color: #FC8181	}	.color6 {		background-color: #8187FC	}	.color7 {		background-color: #3ABF7A	}	.color8 {		background-color: #E8B923	}	.industyRate-value {		background: #22AD65;	}	.industyRate-amt {		background: #FDAF4D;	}	.areaRate {		background: #7073F0;	}	.yearRate {		background: #DC5652;	}	.reportRate {		background: #3B7CED;	}	.intermediaryService {		background: #FC8181;	}	.content {		padding-top: 100px;		position: relative;		width: 100%;		height: 100%;		background: #EAF1FF;	}	.btnlist-box {		width: 100%;		display: flex;		flex-direction: column;		align-items: center;		margin-top: 50rpx;		justify-content: flex-start;		gap: 50rpx;		.btn {			position: relative;			display: flex;			justify-content: center;			align-items: center;			width: 416rpx;			height: 116rpx;			border-radius: 20rpx 20rpx 20rpx 20rpx;			box-shadow: 0rpx 8rpx 20rpx 0rpx rgba(12, 69, 167, 0.35);			color: #FFFFFF;			font-weight: 500;			font-size: 36rpx;			font-family: OPPOSans-M;			.btn-icon {				width: 90rpx;				height: 88rpx;				margin-right: 40rpx;				image {					width: 100%;					height: 100%;				}			}			.name {				width: 180rpx;				margin-right: 50rpx;			}			.badge-num {				position: absolute;				top: -5rpx;				right: -15rpx;			}		}	}</style>
 |