<script setup> import { ref, reactive, nextTick } from "vue" import { onLoad, onShow, onTabItemTap, onReachBottom } from "@dcloudio/uni-app" import { getOverdueNum } from "@/api/work/overdue.js" import { getannouncementList, getUnwriteReportList, getHomeStats, getBanner, getHomeStaticsEnter, } from "@/api/home.js" import { getJSDDlist, getZJLYlist, getHYFLlist, } from "@/api/work/projectInfo.js"; import { getProjectInfoList } from "@/api/work/projectInfo.js"; import store from '@/store' import { setAmt } from '@/utils/common.js' import { checkRoleById } from "@/utils/permission.js" import { addFocus, cancelFocus } from "@/api/work/focus.js"; import iconEnterpriseInfo from "@/static/func/enterpriseInfos.svg"; import yjtxIcon from '@/static/images/homeIcon/yjtx-icon.svg' import tzggIcon from '@/static/images/homeIcon/tzgg-icon.svg' import bslcIcon from '@/static/images/homeIcon/bslc-icon.svg' import wtdbIcon from '@/static/images/homeIcon/wtdb-icon.svg' import zcwjIcon from '@/static/images/homeIcon/zcwj-icon.svg' import zwzxIcon from '@/static/images/homeIcon/xwzx-icon.svg' import zjxmIcon from '@/static/images/homeIcon/zjxm-icon.svg' import zbIcon from '@/static/images/homeIcon/zb-icon.svg' import ybIcon from '@/static/images/homeIcon/yb-icon.svg' import zjfwIcon from '@/static/images/homeIcon/zjfw-icon.svg' import { getMessageNum } from "@/api/work/message.js" // 项目信息 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(); onclearList() } 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(); onclearList() } 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(); onclearList() } 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(); onclearList() } 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)]; }) } function goToPage(url, permissionCode, type) { // if (permissionCode) { // let havePermission = checkRoleById([permissionCode]) // if (!havePermission) return // } uni.$u.route({ url: url, params: { type: type || null } }) } //轮播图 let bannerList = ref([]) async function getBannerList() { getBanner().then(res => { bannerList.value = res.data.pictureList }) } function bannerClick(e) { let result = {} for (let i = 0; i < bannerList.value.length; i++) { if (i == e) { result = bannerList.value[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 } }) }) } // 功能列表 let functionList = ref([{ name: '办事流程', url: '/pages/process/index', icon: bslcIcon, type: 'jbxx', permissionCode: '711' }, { name: '问题督办', url: '/pages/morePage/wtdb/wtdbMorePage', icon: wtdbIcon, type: 'wtdb', permissionCode: '711' }, { name: '政策文件', url: '/pages/policy/search/index', icon: zcwjIcon, type: 'zcwj', permissionCode: '711' }, { name: '新闻资讯', url: '/pages/policy/search/index', icon: zwzxIcon, type: 'xwzx', permissionCode: '711' }, { name: '在建项目', url: '/pages/projectInfo/index', icon: zjxmIcon, type: 'all', permissionCode: '711' }, { name: '周报', url: '/pages/weekly/index', icon: zbIcon, type: 'jbxx', permissionCode: '711' }, { name: '月报', url: '/pages/monthly/index', icon: ybIcon, type: 'jbxx', permissionCode: '711' }, { name: '产业链共享服务', url: '/pages/intermediaryService/search/index', icon: zjfwIcon, type: 'jbxx', permissionCode: '711' }]) //建设进度 let fullPercents = ref(30); //获取项目列表 let listPage = ref({ pageNo: 1, pageSize: 10, }) let projectList = ref([]) let moreListFlag = ref(true) function getProjectList() { let params = { year: projectYear.value, indusKind: projectKindId, buildAddre: projectAreaId, zjly: projectAmtId } let info = { ...listPage.value, ...params } console.log(info, '项目列表'); getProjectInfoList(info).then(res => { if (listPage.value.pageNo <= res.data.totalPage) { projectList.value = projectList.value.concat(res.data.list) } else if (listPage.value.pageNo >= res.data.totalPage || res.data.totalPage == 0) { moreListFlag.value = false } }).catch(() => {}) } let cardCurrut = ref(0) function onChangeCard(e) { if (cardCurrut.value == e) { projectList.value[cardCurrut.value].isOpen = !projectList.value[cardCurrut.value].isOpen } else { projectList.value[cardCurrut.value].isOpen = false projectList.value[e].isOpen = true cardCurrut.value = e } } //重置列表 function onclearList() { listPage.value.pageNo = 1; projectList.value = [] getProjectList() } function goToDetail(id, subName) { uni.navigateTo({ url: `/pages/projectInfo/detail/index?id=${id}&subName=${subName}` }) } // 收藏/取消 function changeFocus(id, status) { let item = projectList.value.find(item => item.id === id); if (status) { cancelFocus({ subId: id }).then(res => { if (res.code === 200) { item.isAttention = 0; } }).catch(() => { uni.showToast({ title: "更改收藏状态失败。", icon: "none", duration: 2000 }) }) } else { addFocus({ subId: id }).then(res => { if (res.code === 200) { item.isAttention = 1; } }).catch(() => { uni.showToast({ title: "更改收藏状态失败。", icon: "none", duration: 2000 }) }) } } function goToReport(type, subId, subName) { if (type === 'wtdb') { uni.navigateTo({ url: `/pages/problemSupervision/index?type=${type}&subId=${subId}&subName=${subName}` }) } else if (type === 'qtldjbm') { uni.navigateTo({ url: `/pages/leadersList/index?type=${type}&subId=${subId}&subName=${subName}` }) } else if (type === 'xcyx') { uni.navigateTo({ url: `/pages/projectImageAndVideo/index?type=${type}&subId=${subId}&subName=${subName}` }) } else if (type === 'more') { uni.navigateTo({ url: `/pages/morePage/index?type=${type}&subId=${subId}&subName=${subName}` }) } else { uni.navigateTo({ url: `/pages/projectInfo/report/index?type=${type}&subId=${subId}&subName=${subName}` }) } } //获取项目数据 let WKG = ref(0) let YKG = ref(0) let YWG = ref(0) let YYQ = ref(0) let amtRate = ref(0) let amtTotal = ref(0) let endRate = ref(0) let openRate = ref(0) let yearAmt = ref(0) let yearAmtSj = ref(0) let totalNum = ref(0) function getProjectInfo() { console.log({ year: projectYear.value, indusKind: projectKindId, buildAddre: projectAreaId, zjly: projectAmtId }); getHomeStaticsEnter({ year: projectYear.value, indusKind: projectKindId, buildAddre: projectAreaId, zjly: projectAmtId }).then(res => { WKG.value = res.data.WKG YKG.value = res.data.YKG YWG.value = res.data.YWG YYQ.value = res.data.YYQ amtRate.value = res.data.amtRate amtTotal.value = res.data.amtTotal endRate.value = res.data.endRate openRate.value = res.data.openRate yearAmt.value = res.data.yearAmt yearAmtSj.value = res.data.yearAmtSj totalNum.value = res.data.totalNum }) } 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 == 'amtSj') { params.year = projectYear.value params.key = 'ndjh' params.name = '年度实际投资' uni.$u.route({ url: '/pages/countAnalysis/through/index', params: params }) } } function newProjectClick(e, num) { if (num != 0) { let throughObj = { year: projectYear.value, indusKind: projectKindId, subjectId: projectAreaId, zjly: projectAmtId, queryTimeType: '4', queryType: 1, } let obj = { xmzs: { name: '项目总数' }, wkg: { name: '未开工', otherStatus: '1,6' }, ykg: { name: '已开工', otherStatus: '7' }, ywg: { name: '已竣工', otherStatus: 'A' }, ztz: { name: '总投资' }, ndjhtz: { name: '年度计划投资' }, ndsjtz: { name: '年度实际投资' } } throughObj = { ...throughObj, ...obj[e] } 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 }) } else { uni.showToast({ icon: 'none', title: '无该项数据' }) } } function gotoLateProject() { let throughObj = { year: projectYear.value, indusKind: projectKindId, buildAddre: projectAreaId, zjly: projectAmtId, queryType: '' } let url = "/pages/overdue/overdued/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 }) } let overdueWill = ref(0); let overdued = ref(0); //获取数量 function getHomeNum() { getOverdueNum().then(res => { let text = '99+' if (res.data.isOver > 99) { overdueWill.value = text } else { overdueWill.value = res.data.isOver } }) } onLoad(() => { let kind = uni.getStorageSync('userKind') let list = [{ index: 0, "pagePath": "pages/home/headHome", "iconPath": "../../static/images/tabbar/home.png", "selectedIconPath": "../../static/images/tabbar/home_.png", "visible": false, "text": "首页" }, { index: 1, "pagePath": "pages/home/oversawHome", "iconPath": "../../static/images/tabbar/home.png", "selectedIconPath": "../../static/images/tabbar/home_.png", "visible": false, "text": "首页" }, { index: 2, "pagePath": "pages/home/companyHome", "iconPath": "../../static/images/tabbar/home.png", "selectedIconPath": "../../static/images/tabbar/home_.png", "visible": false, "text": "首页" }, { index: 3, "pagePath": "pages/message/index", "iconPath": "../../static/images/tabbar/message.png", "selectedIconPath": "../../static/images/tabbar/message_.png", "text": "消息" }, { index: 4, "pagePath": "pages/mine/index", "iconPath": "../../static/images/tabbar/mine.png", "selectedIconPath": "../../static/images/tabbar/mine_.png", "text": "我的" }] //kind 1 监管单位, 2公司端 , 3 领导端 if (kind == '2') { list[0].visible = false list[1].visible = false list[2].visible = true for (let i = 0; i < list.length; i++) { uni.setTabBarItem(list[i]) } } else { list[0].visible = false list[1].visible = false list[2].visible = false for (let i = 0; i < list.length; i++) { uni.setTabBarItem(list[i]) } } if (kind == '2') { setTimeout(() => { let now = new Date(); projectYear.value = now.getFullYear(); defaultIndex.value = [projectYear.value - 2000]; // // judgeFuncList(); //判断权限 // getAnnounceMent(); //获取公告 getHYFL(); //获取行业分类 getJSDD(); //获取建设地点 getZJLY(); // 获取资金来源 getProjectInfo(); // getOverdue(); //获取逾期数量 // // getUnwirteList(); //获取未填写周报月报信息 // getMessageCount(); //获取未读消息数量 getProjectList() }, 1000) } }); onShow(() => { getHomeNum() getBannerList(); //获取轮播图数据 }) onReachBottom((e) => { if (!moreListFlag.value) { // uni.showToast({ // title: "已经到底了。", // icon: "none", // duration: 2000 // }) } else { listPage.value.pageNo++; getProjectList() } }) </script> <template> <view class="container"> <view class="top-back-pie"> </view> <view class="content-layer"> <view class="top-layer"> <view class="project-title"> 哈密市项目管理智慧平台 </view> <view class="search-layer"> <view class="search-input"> <view class="search-icon"></view> <input @click="goToPage('/pages/search/index')" placeholder="项目、领导电话..." placeholder-style="color: #343434;font-size:28rpx;" /> </view> <view class="search-line"> </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="banner-box"> <u-swiper :list="bannerList" indicator indicatorMode="line" keyName='coverImg' circular radius='20rpx' height="254rpx" @click="bannerClick"></u-swiper> </view> <view class="prompt-layer"> <view class="item" @click="goToPage('/pages/overdue/index')"> <view class="item-text"> 预警提醒 </view> <view class="item-image"> <image :src="yjtxIcon" mode=""></image> <view class="sign"> {{overdueWill}} </view> </view> </view> <view class="item" @click="goToPage('/pages/announcement/list/index')"> <view class="item-text"> 通知公告 </view> <view class="item-image"> <image :src="tzggIcon" mode=""></image> </view> </view> </view> <view class="button-layer"> <view class="btn-item" v-for="(item,index) in functionList" :key="index" @click='goToPage(item.url,null,item.type)'> <image :src="item.icon" class="item-icon" mode=""></image> <view class="item-text"> {{item.name}} </view> </view> </view> <view class="project-info-select"> <view class="choose-year" @click="yearShowChoose()"> {{projectYear??"年度"}} <image src="../../static/home-choose-iocn.svg" mode=""></image> </view> <view class="choose-year " @click="kindShowChoose()"> {{projectKind ??"行业分类"}} <image src="../../static/home-choose-iocn.svg" mode=""></image> </view> <view class="choose-year " @click="areaShowChoose()"> {{projectArea ??"建设地点"}} <image src="../../static/home-choose-iocn.svg" mode=""></image> </view> <view class="choose-year " @click="zjlyShowChoose()"> <view class="choose-year-text">{{projectAmt ??"资金来源"}}</view> <image src="../../static/home-choose-iocn.svg" mode=""></image> </view> </view> <view class="stats-layer"> <view class="bar-layer"> <view class="bar-item"> <view class="item-text"> <view class="text-name"> 总建设开工率 </view> <view class="text-rote"> {{openRate}}% </view> </view> <view class="line-progress"> <u-line-progress :percentage="openRate" inactiveColor="#E9F2FF" activeColor="#6EAAF7" :showText="false" height="16rpx"></u-line-progress> </view> </view> <view class="bar-item"> <view class="item-text"> <view class="text-name"> 总建设竣工率 </view> <view class="text-rote"> {{endRate}}% </view> </view> <view class="line-progress"> <u-line-progress :percentage="endRate" inactiveColor="#E9F2FF" activeColor="#6EAAF7" :showText="false" height="16rpx"></u-line-progress> </view> </view> </view> <view class="stats-list"> <view class="stats-item" @click="newProjectClick('xmzs',totalNum)"> <view class="item-num"> <text class="number">{{totalNum}}</text> <text class="unit">个</text> </view> <view class="item-name"> 项目总数 </view> </view> <view class="line"> </view> <view class="stats-item" @click="newProjectClick('wkg',WKG)"> <view class="item-num"> <text class="number">{{WKG}}</text> <text class="unit">个</text> </view> <view class="item-name"> 未开工 </view> </view> <view class="line"> </view> <view class="stats-item" @click="newProjectClick('ykg',YKG)"> <view class="item-num"> <text class="number">{{YKG}}</text> <text class="unit">个</text> </view> <view class="item-name"> 已开工 </view> </view> <view class="line"> </view> <view class="stats-item" @click="newProjectClick('ywg',YWG)"> <view class="item-num"> <text class="number">{{YWG}}</text> <text class="unit">个</text> </view> <view class="item-name"> 已竣工 </view> </view> </view> </view> <view class="stats-layer-next"> <view class="bar-layer"> <view class="bar-name"> 年度投资完成率 </view> <view class="" style="width: 16rpx;"> </view> <view class="line-progress"> <u-line-progress :percentage="amtRate" inactiveColor="#E9F2FF" activeColor="#6EAAF7" :showText="false" height="16rpx"></u-line-progress> </view> <view class="" style="width: 12rpx;"> </view> <view class="bar-rote"> {{amtRate}}% </view> </view> <view class="stats-list"> <view class="stats-item" @click="newProjectClick('ztz',amtTotal)"> <view class="item-num"> <text class="number">{{setAmt(amtTotal*10000)[0]}} </text> <text class="unit">{{setAmt(amtTotal*10000)[1]}}{{setAmt(amtTotal*10000)[2]}}</text> </view> <view class="item-name"> 总投资 </view> </view> <view class="line"> </view> <view class="stats-item" @click="newProjectClick('ndjhtz',yearAmt)"> <view class="item-num"> <text class="number">{{setAmt(yearAmt*10000)[0]}}</text> <text class="unit">{{setAmt(yearAmt*10000)[1]}}{{setAmt(yearAmt*10000)[2]}}</text> </view> <view class="item-name"> 年度计划投资 </view> </view> <view class="line"> </view> <view class="stats-item" @click="newProjectClick('ndsjtz',yearAmtSj)"> <view class="item-num"> <text class="number">{{setAmt(yearAmtSj*10000)[0]}}</text> <text class="unit">{{setAmt(yearAmtSj*10000)[1]}}{{setAmt(yearAmtSj*10000)[2]}}</text> </view> <view class="item-name"> 年度实际投资 </view> </view> </view> </view> <view class="cards-list"> <view v-for="(item,index) in projectList" :key="index"> <view class="card"> <view class="project-layer" :style="!item.isOpen ? {border:'none'}:''"> <text class="card-name-num">{{(index+1<10?'0'+(index+1):index+1)}}</text> <view class="name"> {{item.subName ?? "--"}} </view> <view class="card-status" @click="onChangeCard(index)"> <image class="status-light" src="../../static/images/red.svg" mode="" v-if="item.status_fgw=='2'"> </image> <image class="status-light" src="../../static/images/green.svg" mode="" v-if="item.status_fgw=='0'||item.status_fgw==null"></image> <image class="status-light" src="../../static/images/yellow.svg" mode="" v-if="item.status_fgw=='1'"> </image> <view class="status-name"> {{item.status ?? "--"}} </view> <image class="status-switch" src="../../static/images/liaghtUp.svg" mode="" :class="item.isOpen ?'card-status-icon-change' :''"> </image> </view> </view> <view class="card-content-box" :style="item.isOpen ? {height:'266rpx'} :''"> <view class="line"> </view> <view class="card-item" style="margin-top: 10rpx;"> <view class="card-item-name">总 投 资 金 额</view> <view class="card-item-content">{{item.amtTotal ?? "--"}}</view> </view> <!-- 年度计划投资-申报单位(万元) --> <view class="card-item"> <view class="card-item-name">年度计划投资</view> <view class="card-item-content">{{item.yearAmt ?? "--"}}</view> </view> <!-- 已完成投资(万元)--> <view class="card-item"> <view class="card-item-name">年度完成投资</view> <view class="card-item-content">{{item.yearAmtSj ?? "--"}}</view> </view> <!-- 当前状态 --> <view class="card-item"> <view class="card-item-name">项目状态</view> <view class="card-item-content">{{item.status ?? "--"}}</view> </view> <view class="card-btn-list"> <view class="button" @click="goToReport('weekly',item.id,item.subName)"> 周报 </view> <view class="button" @click="goToReport('monthly',item.id,item.subName)"> 月报 </view> <view class="button" v-if="!item.isAttention" @click="changeFocus(item.id,item.isAttention)"> 关注 </view> <view class="button" @click="changeFocus(item.id,item.isAttention)" v-else> 取消关注 </view> <view class="button" v-if="item.usersub == 1" @click="goToDetail(item.id,item.subName)"> 项目详情 </view> <view class="button" v-else @click="goToDetail(item.id,item.subName)"> 项目详情 </view> <view class="button" @click="goToReport('more',item.id,item.subName)"> 更多 </view> </view> </view> </view> </view> </view> <view class="bottom-size" v-if="!moreListFlag.value"> 到底了~ </view> </view> <!-- 年度选择 --> <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> $card-width: calc(100% - 58rpx); // .card .card-status { // // top: 32rpx; // height: 64rpx; // background: #F2F7FF; // font-weight: 500; // font-size: 12px; // color: #98B7DC; // } .bottom-size { margin-top: 30rpx; width: 100%; display: flex; justify-content: center; align-items: center; font-size: 29rpx; font-weight: 300; color: #B5B5B5; } .card .project-layer { justify-content: flex-start; // padding-bottom: 20rpx !important; .name { flex-grow: 1; font-weight: 500; font-size: 28rpx; color: #222222; } } .container { padding-top: 0 !important; width: 100%; min-height: 100vh; .top-back-pie { position: absolute; top: -2050rpx; left: 50%; transform: translate(-50%, 0); width: 2500rpx; height: 2500rpx; border-radius: 50%; background-color: #002F69; z-index: 0; } .content-layer { position: relative; position: absolute; z-index: 10; display: flex; flex-direction: column; align-items: center; justify-content: flex-start; width: 100%; padding-bottom: calc(var(--window-bottom) + 38rpx); .top-layer { position: fixed; z-index: 10000; display: flex; flex-direction: column; align-items: center; justify-content: flex-start; width: 100%; background-color: #002F69; padding-bottom: 20rpx; .project-title { display: flex; justify-content: center; align-items: center; margin-top: var(--status-bar-height); width: 100%; height: 88rpx; font-size: 36rpx; font-weight: 600; color: #FFF; } .search-layer { margin-top: 24rpx; display: flex; justify-content: space-between; align-items: center; width: 90%; background-color: #fff; border-radius: 16rpx; .search-input { display: flex; align-items: center; width: 78%; height: 72rpx; padding: 0 20rpx; box-sizing: border-box; text-align: left; .search-icon { width: 40rpx; height: 40rpx; margin-right: 26rpx; background-image: url('@/static/home-search-icon.svg'); background-size: 100% 100%; } } .search-line { width: 0; height: 28rpx; border-left: 1rpx solid rgba(0, 47, 105, 0.5); } .search-focus { display: flex; align-items: center; justify-content: flex-end; gap: 10rpx; width: 22%; .search-focus-icon { width: 40rpx; height: 40rpx; background-image: url('@/static/focus.svg'); background-size: 100% 100%; } .text { margin-right: 20rpx; font-size: 28rpx; font-weight: 600; white-space: nowrap; color: #06356D; } } } } .banner-box { margin-top: calc(var(--status-bar-height) + 210rpx); width: $card-width; } .prompt-layer { margin-top: 40rpx; display: flex; justify-content: space-between; align-items: center; width: $card-width; .item { display: flex; justify-content: center; align-items: center; gap: 24rpx; width: 338rpx; height: 120rpx; background-color: #fff; box-shadow: 0rpx 0rpx 8rpx 0rpx #D8EEFF, inset 0rpx 0rpx 6rpx 0rpx #D8EEFF, inset 2rpx 2rpx 0rpx 0rpx #FFFFFF; border-radius: 12rpx; .item-text { font-size: 28rpx; font-weight: 500; color: #222222; } .item-image { position: relative; image { width: 80rpx; height: 80rpx; border-radius: 50%; } .sign { position: absolute; left: 64rpx; top: 0; padding: 0 10rpx 0 10rpx; font-size: 12rpx; background-color: #FC5E74; color: #fff; border-radius: 16rpx; border: 2px solid #fff; } } } } .button-layer { margin-top: 30rpx; display: flex; flex-wrap: wrap; justify-content: space-between; align-content: space-between; row-gap: 32rpx; width: $card-width; .btn-item { display: flex; flex-direction: column; justify-content: center; align-items: center; gap: 14rpx; width: 160rpx; height: 160rpx; border-radius: 12rpx; background-color: #fff; box-shadow: 0rpx 0rpx 8rpx 0rpx #D8EEFF; .item-icon { width: 80rpx; height: 80rpx; } .item-text { font-size: 28rpx; font-weight: 500; color: #222222; line-height: 28rpx; text-align: center; } } } .sub-title { display: flex; justify-content: center; width: $card-width; font-size: 36rpx; font-weight: 500; color: #222222; } .project-info-select { margin: auto; margin-top: 40rpx; display: flex; justify-content: center; align-items: center; gap: 32rpx; width: $card-width; height: 88rpx; background: #F5F5F5; border-radius: 56rpx 56rpx 0rpx 0rpx; .choose-year { display: flex; align-items: center; justify-content: center; gap: 2rpx; font-size: 24rpx; font-weight: 500; color: #999999; .choose-year-text { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } image { width: 32rpx; height: 32rpx; } } } .stats-layer { display: flex; flex-direction: column; justify-content: center; align-items: center; justify-content: center; gap: 50rpx; width: $card-width; background-color: #FFF; border-radius: 10rpx; padding: 48rpx 0 44rpx 0; .bar-layer { display: flex; justify-content: center; gap: 72rpx; width: 100%; .bar-item { display: flex; flex-direction: column; align-items: flex-start; gap: 24rpx; width: 40%; .item-text { display: flex; justify-content: center; align-items: center; gap: 10rpx; .text-name { font-size: 28rpx; font-weight: 500; color: #666666; } .text-rote { font-size: 28rpx; font-weight: 700; color: #C44E00; } } .line-progress { width: 100%; } } } .stats-list { display: flex; justify-content: center; align-items: center; width: calc(100% - 88rpx); .line { margin-top: 40rpx; height: 24rpx; width: 0; border: none; border-right: 2rpx solid #EBEBEB; } .stats-item { width: 25%; display: flex; flex-direction: column; align-items: center; justify-content: center; .item-num { display: flex; justify-content: center; align-items: flex-end; gap: 5rpx; color: #0033A8; .number { font-size: 35rpx; font-weight: 800; } .unit { font-size: 20rpx; } } .item-name { font-size: 25rpx; } } } } .stats-layer-next { margin-top: 30rpx; display: flex; flex-direction: column; justify-content: center; align-items: center; justify-content: center; gap: 46rpx; width: $card-width; background-color: #FFF; border-radius: 10rpx; padding: 48rpx 0 44rpx 0; .bar-layer { display: flex; justify-content: center; align-items: center; width: calc(100% - 88rpx); .bar-name { font-size: 28rpx; font-weight: 500; font-size: 28rpx; } .line-progress { flex-grow: 1; } .bar-rote { font-size: 30rpx; font-weight: 600; color: #C44E00; } } .stats-list { width: calc(100% - 88rpx); display: flex; justify-content: space-between; align-items: center; .line { margin-top: 49rpx; width: 0; height: 24rpx; border: none; border-right: 2rpx solid #EBEBEB; } .stats-item { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 14rpx; width: 33%; .item-num { display: flex; justify-content: center; align-items: flex-end; gap: 5rpx; color: #0035A9; .number { font-size: 36rpx; font-weight: 600; line-height: 36rpx; white-space: nowrap; } .unit { font-size: 20rpx; } } .item-name { font-size: 24rpx; white-space: nowrap; } } } } } } </style>