| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738 | <script setup>  import {    ref,    reactive,    nextTick  } from "vue"  import {    onLoad,    onShow,    onTabItemTap  } 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 = ''      throughObj.status = '7'      throughObj.name = '已开工'    } else if (e == 'stop') {      throughObj.queryType = 0      throughObj.propKind = ''      throughObj.status = '8'      throughObj.name = '已停工'    } else if (e == 'end') {      throughObj.queryType = 0      throughObj.propKind = ''      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/morePage/wtdb/wtdbMorePage',    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();    }  })  onTabItemTap((e) => {    console.log(e, '点击tab');    // uni.$u.route({    // 	url: 'pages/login/index',    // })  })</script><template>  <view class="container">    <!-- 头 固定-->    <view class="title-content">      <view class="status_bar">      </view>      <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;  }  .status_bar {    height: var(--status-bar-height);    width: 100%;  }  .title-content {    position: fixed;    top: 0;    left: 0;    width: 100%;    padding-top: 20rpx;    text-align: center;    background-color: #1763E7;    z-index: 1;    border: 1px solid red;    .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/searchs-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;    border: 1px solid red;    .banner-box {      width: 92%;      height: 254rpx;      margin: auto;      border: 1px solid red;    }  }  .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>
 |