index.vue 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738
  1. <script setup>
  2. import {
  3. ref,
  4. reactive,
  5. nextTick
  6. } from "vue"
  7. import {
  8. onLoad,
  9. onShow,
  10. onTabItemTap
  11. } from "@dcloudio/uni-app"
  12. import {
  13. getOverdueNum
  14. } from "@/api/work/overdue.js"
  15. import {
  16. getannouncementList,
  17. getUnwriteReportList,
  18. getHomeStats,
  19. getBanner
  20. } from "@/api/home.js"
  21. import {
  22. getJSDDlist,
  23. getZJLYlist,
  24. getHYFLlist,
  25. } from "@/api/work/projectInfo.js";
  26. import {
  27. getMessageNum
  28. } from "@/api/work/message.js"
  29. import store from '@/store'
  30. import {
  31. checkRoleById
  32. } from "@/utils/permission.js"
  33. import iconEnterpriseInfo from "@/static/func/enterpriseInfos.svg";
  34. import jdglicon from "@/static/func/jdgl-icon.svg";
  35. import wtdbicon from "@/static/func/wtdb-icon.svg";
  36. import tjfxicon from "@/static/func/tjfx-icon.svg";
  37. import zcwjicon from "@/static/func/zcwj-icon.svg";
  38. import bslcicon from "@/static/func/bslc-icon.svg";
  39. import xxjdicon from "@/static/func/xxjd-icon.svg";
  40. import tzggicon from "@/static/func/tzgg-icon.svg";
  41. import hhdicon from "@/static/func/hhd-icon.svg";
  42. import zdxmicon from "@/static/func/zdxm-icon.svg";
  43. import iconFundUse from "@/static/func/fundUse.svg";
  44. import iconProjectPercents from "@/static/func/projectPercents.svg";
  45. import iconImportant from "@/static/func/important.svg";
  46. import iconPreFlow from "@/static/func/preFlow.svg";
  47. import iconWeekly from "@/static/func/weekly.svg";
  48. import iconMonthly from "@/static/func/monthly.svg";
  49. import iconYearly from "@/static/func/yearly.svg";
  50. import iconOverdued from "@/static/func/overdued.svg";
  51. import iconOverdueWill from "@/static/func/overdueWill.svg";
  52. // 项目信息
  53. let projectYear = ref(2023);
  54. // 选择年
  55. let yearShow = ref(false);
  56. let defaultIndex = ref([0]);
  57. let yearColumns = ref([
  58. ["2000", "2001", "2002", "2003", "2004", "2005", "2006", "2007", "2008", "2009", "2010", "2011", "2012",
  59. "2013",
  60. "2014", "2015", "2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023", "2024", "2025", "2026",
  61. "2027", "2028", "2029", "2030", "2031", "2032", "2033"
  62. ]
  63. ])
  64. const yearShowChoose = function() {
  65. yearShow.value = true;
  66. }
  67. const yearClose = function(e) {
  68. if (e) {
  69. projectYear.value = e.value[0];
  70. // 获取最新数据
  71. getProjectInfo();
  72. }
  73. yearShow.value = false;
  74. }
  75. // 选择分类
  76. let projectKind = ref(null);
  77. let projectKindId = null;
  78. let kindShow = ref(false);
  79. let kindColumns = ref([]);
  80. const kindShowChoose = function() {
  81. kindShow.value = true;
  82. }
  83. const kindClose = function(e) {
  84. if (e) {
  85. projectKind.value = e.value[0];
  86. projectKindId = hyflFull.find(item => item.value === projectKind.value).key;
  87. // 获取最新数据
  88. getProjectInfo();
  89. }
  90. kindShow.value = false;
  91. }
  92. let hyflFull = [];
  93. const getHYFL = function() {
  94. getHYFLlist().then(res => {
  95. hyflFull = res.data.list;
  96. hyflFull.push({
  97. key: null,
  98. value: "所有分类"
  99. });
  100. kindColumns.value = [res.data.list.map(item => item.value)];
  101. kindColumns.value[0].unshift("所有分类");
  102. })
  103. };
  104. // 选择地点
  105. let projectArea = ref(null);
  106. let projectAreaId = null;
  107. let areaShow = ref(false);
  108. let areaColumns = ref([]);
  109. const areaShowChoose = function() {
  110. areaShow.value = true;
  111. }
  112. const areaClose = function(e) {
  113. if (e) {
  114. projectArea.value = e.value[0];
  115. projectAreaId = jsddFull.find(item => item.value === projectArea.value).key;
  116. // 获取最新数据
  117. getProjectInfo();
  118. }
  119. areaShow.value = false;
  120. }
  121. let jsddFull = [];
  122. const getJSDD = function() {
  123. getJSDDlist().then(res => {
  124. jsddFull = res.data.list;
  125. jsddFull.push({
  126. key: null,
  127. value: "所有地区"
  128. });
  129. areaColumns.value = [res.data.list.map(item => item.value)];
  130. areaColumns.value[0].unshift("所有地区");
  131. })
  132. };
  133. // 资金来源
  134. let projectAmt = ref(null);
  135. let projectAmtId = null;
  136. let zjlyShow = ref(false);
  137. let zjlyColumns = ref([]);
  138. const zjlyShowChoose = () => {
  139. zjlyShow.value = true
  140. }
  141. const zjlyClose = e => {
  142. if (e) {
  143. projectAmt.value = e.value[0];
  144. projectAmtId = zjlyFull.find(item => item.value === projectAmt.value).key;
  145. // 获取最新数据
  146. getProjectInfo();
  147. }
  148. zjlyShow.value = false
  149. }
  150. let zjlyFull = []
  151. const getZJLY = () => {
  152. getZJLYlist().then(res => {
  153. zjlyFull = res.data.list;
  154. zjlyFull.unshift({
  155. key: null,
  156. value: "所有来源"
  157. });
  158. zjlyColumns.value = [res.data.list.map(item => item.value)];
  159. })
  160. }
  161. let projectNum = ref([{
  162. name: "亿元以下",
  163. key: "numAmt1",
  164. value: 0,
  165. }, {
  166. name: "1-5亿",
  167. key: "numAmt2",
  168. value: 0,
  169. }, {
  170. name: "5-10亿",
  171. key: "numAmt3",
  172. value: 0,
  173. }, {
  174. name: "10亿以上",
  175. key: "numAmt4",
  176. value: 0,
  177. }]);
  178. let fundNum = ref([{
  179. name: "年度计划",
  180. key: "amtJh",
  181. value: 0,
  182. }, {
  183. name: "当月计划",
  184. key: "monthPlan",
  185. value: 0,
  186. }, {
  187. name: "年度完成",
  188. key: "amtSj",
  189. value: 0,
  190. }]);
  191. let newProjectNum = ref([{
  192. name: "已开工",
  193. key: "doing",
  194. value: 0,
  195. }, {
  196. name: "已停工",
  197. key: "stop",
  198. value: 0,
  199. }, {
  200. name: "已竣工",
  201. key: "end",
  202. value: 0,
  203. }, {
  204. name: "竣工率",
  205. key: "rate",
  206. value: 0,
  207. }]);
  208. let fullPercents = ref(0);
  209. let pieOpts = ref({
  210. update: true,
  211. color: ["#69E4E0", "#21DCD5", "#1ACEC8", "#12B9B4", "#07A19C"],
  212. enableScroll: false,
  213. // dataLabel: true,
  214. legend: {
  215. show: false,
  216. },
  217. extra: {
  218. pie: {
  219. activeOpacity: 0.5,
  220. activeRadius: 10,
  221. offsetAngle: 0,
  222. customRadius: 50,
  223. labelWidth: 10,
  224. borderWidth: 1,
  225. offsetAngle: -90
  226. }
  227. }
  228. })
  229. let ringOpts = ref({
  230. update: true,
  231. color: ["#0A0EE4", "#F05C17", "#FFAE89"],
  232. enableScroll: false,
  233. legend: {
  234. show: false
  235. },
  236. title: {
  237. name: "300",
  238. fontSize: 12,
  239. color: "#3D3D3D"
  240. },
  241. subtitle: {
  242. name: "项目总数",
  243. fontSize: 12,
  244. color: "#3D3D3D"
  245. },
  246. extra: {
  247. ring: {
  248. customRadius: 50,
  249. ringWidth: 18,
  250. border: false,
  251. offsetAngle: -90
  252. }
  253. }
  254. })
  255. let ringTotal = ref(0);
  256. let ringChartData = ref({
  257. series: [{
  258. data: [{
  259. name: '新建项目',
  260. value: 100,
  261. labelShow: false
  262. }, {
  263. name: '续建项目',
  264. value: 100,
  265. labelShow: false
  266. }, {
  267. name: '储备项目',
  268. value: 100,
  269. labelShow: false
  270. }]
  271. }]
  272. })
  273. let showRing = ref(false)
  274. let showPie = ref(false)
  275. let addreListOrginal = [];
  276. let pieChartData = ref({
  277. series: [{
  278. data: [{
  279. name: "无数据",
  280. value: 0,
  281. labelShow: false,
  282. }, ],
  283. }]
  284. })
  285. const pieClick = (e) => {
  286. let subjectId = addreListOrginal[e.currentIndex]?.subjectId;
  287. let throughObj = {
  288. subjectId,
  289. year: projectYear.value,
  290. indusKind: projectKindId,
  291. buildAddre: projectAreaId,
  292. zjly: projectAmtId,
  293. name: addreListOrginal[e.currentIndex]?.title
  294. // name:projectAreaId
  295. }
  296. let url = "/pages/countAnalysis/through/index?key=home&";
  297. for (let i in throughObj) {
  298. let item = null;
  299. item = ((throughObj[i] ?? "") === "") ? `${i}=&` : `${i}=${throughObj[i]}&`;
  300. url = url += item;
  301. }
  302. url = url.substr(0, url.length - 1);
  303. uni.navigateTo({
  304. url
  305. })
  306. }
  307. const ringClick = (e) => {
  308. // let subjectId = ringChartData.value.series[0].data.[e.currentIndex]?.subjectId;
  309. let name = ringChartData.value.series[0].data[e.currentIndex]?.name
  310. let throughObj = {
  311. year: projectYear.value,
  312. indusKind: projectKindId,
  313. buildAddre: projectAreaId,
  314. zjly: projectAmtId,
  315. queryType: '',
  316. name: name
  317. }
  318. if (name == '新建项目') {
  319. throughObj.queryType = 0
  320. throughObj.propKind = 1
  321. throughObj.otherStatus = '7,8,A'
  322. } else if (name == '续建项目') {
  323. throughObj.queryType = 0
  324. throughObj.propKind = 2
  325. throughObj.otherStatus = '7,8,A'
  326. } else if (name == '储备项目') {
  327. throughObj.queryType = 3
  328. }
  329. let url = "/pages/projectInfo/index?type=home&";
  330. for (let i in throughObj) {
  331. let item = null;
  332. item = ((throughObj[i] ?? "") === "") ? `${i}=&` : `${i}=${throughObj[i]}&`;
  333. url = url += item;
  334. }
  335. url = url.substr(0, url.length - 1);
  336. uni.navigateTo({
  337. url
  338. })
  339. }
  340. function newProjectClick(e) {
  341. let throughObj = {
  342. year: projectYear.value,
  343. indusKind: projectKindId,
  344. buildAddre: projectAreaId,
  345. zjly: projectAmtId,
  346. queryType: ''
  347. }
  348. if (e == 'doing') {
  349. throughObj.queryType = 0
  350. throughObj.propKind = ''
  351. throughObj.status = '7'
  352. throughObj.name = '已开工'
  353. } else if (e == 'stop') {
  354. throughObj.queryType = 0
  355. throughObj.propKind = ''
  356. throughObj.status = '8'
  357. throughObj.name = '已停工'
  358. } else if (e == 'end') {
  359. throughObj.queryType = 0
  360. throughObj.propKind = ''
  361. throughObj.status = "A"
  362. throughObj.name = '已竣工'
  363. } else if (e == 'rate') {
  364. return
  365. }
  366. let url = "/pages/projectInfo/index?type=home&";
  367. for (let i in throughObj) {
  368. let item = null;
  369. item = ((throughObj[i] ?? "") === "") ? `${i}=&` : `${i}=${throughObj[i]}&`;
  370. url = url += item;
  371. }
  372. url = url.substr(0, url.length - 1);
  373. uni.navigateTo({
  374. url
  375. })
  376. }
  377. function getProjectInfo() {
  378. getHomeStats({
  379. year: projectYear.value,
  380. indusKind: projectKindId,
  381. buildAddre: projectAreaId,
  382. zjly: projectAmtId
  383. }).then(res => {
  384. const {
  385. data
  386. } = res;
  387. // 亿元项目数
  388. for (let i in projectNum.value) {
  389. projectNum.value[i].value = data[projectNum.value[i].key] ?? "--";
  390. }
  391. // 资金投资情况
  392. for (let i in fundNum.value) {
  393. fundNum.value[i].value = data[fundNum.value[i].key] ?? "--";
  394. }
  395. // 新建项目数
  396. for (let i in newProjectNum.value) {
  397. newProjectNum.value[i].value = data.buildingCount[newProjectNum.value[i].key] ?? "--";
  398. }
  399. // 实际整体进度
  400. fullPercents.value = (data.numBl ?? "") === "" ? 0 : parseFloat(data.numBl);
  401. // 圆环图
  402. numNew.value = ringChartData.value.series[0].data[0].value = data.numNew;
  403. numOld.value = ringChartData.value.series[0].data[1].value = data.numOld;
  404. numNo.value = ringChartData.value.series[0].data[2].value = data.numNo;
  405. ringOpts.value.title.name = data.numTotal ?? "0";
  406. showRing.value = true;
  407. // 饼图
  408. addreListOrginal = data.buildAddress;
  409. let tempArr = [];
  410. for (let i in data.buildAddress) {
  411. tempArr.push({
  412. name: data.buildAddress[i].title,
  413. value: data.buildAddress[i].num,
  414. labelShow: false,
  415. })
  416. }
  417. if (data.buildAddress.length > 0) {
  418. pieChartData.value.series[0].data = tempArr
  419. } else {
  420. pieChartData.value.series[0].data = [{
  421. name: "无数据",
  422. value: 0,
  423. labelShow: false
  424. }]
  425. };
  426. showPie.value = true;
  427. })
  428. }
  429. let numNew = ref(0);
  430. let numOld = ref(0);
  431. let numNo = ref(0);
  432. // 公告列表
  433. let announcementList = ref([]);
  434. function getAnnounceMent() {
  435. getannouncementList({
  436. pageNo: 1,
  437. pageSize: 3
  438. }).then(res => {
  439. let titleList = res.data.list.map(item => {
  440. return item.title
  441. })
  442. announcementList.value = titleList.length > 0 ? titleList : ['当前暂无公告'];
  443. let bigItem = functionList.value.find(item => item.name === "通知公告");
  444. bigItem.badgeValue = res.data.totalCount ?? 0;
  445. })
  446. }
  447. // 逾期数量
  448. let overdueTotal = ref(0);
  449. let overdueWill = ref(0);
  450. let overdued = ref(0);
  451. function getOverdue() {
  452. getOverdueNum().then(res => {
  453. let bigItem = functionList.value.find(item => item.name === "问题督办");
  454. bigItem.badgeValue = Number((res.data.willOver ?? 0) + (res.data.isOver ?? 0));
  455. })
  456. }
  457. // 功能列表
  458. let functionList = ref([{
  459. name: '基本信息',
  460. url: '/pages/functionList/index',
  461. icon: iconEnterpriseInfo,
  462. type: 'jbxx',
  463. permissionCode: '711'
  464. }, {
  465. name: '进度管理',
  466. url: '/pages/functionList/index',
  467. icon: jdglicon,
  468. type: 'jdgl',
  469. permissionCode: '811'
  470. }, {
  471. name: '统计分析',
  472. url: '/pages/functionList/index',
  473. icon: tjfxicon,
  474. type: 'tjfx',
  475. permissionCode: '714'
  476. }, {
  477. name: '在建项目',
  478. url: '/pages/projectImportant/index',
  479. icon: zdxmicon,
  480. type: 'zdxm',
  481. permissionCode: '711',
  482. }, {
  483. name: '形象进度',
  484. url: '/pages/projectImage/index',
  485. icon: xxjdicon,
  486. // permissionCode: '7112'
  487. }, {
  488. name: '政策文件',
  489. url: '/pages/policy/search/index',
  490. icon: zcwjicon,
  491. // permissionCode: '7112'
  492. }, {
  493. name: '红黄灯',
  494. url: '/pages/light/index',
  495. icon: hhdicon,
  496. type: 'hhd',
  497. permissionCode: '711',
  498. }, {
  499. name: '办事流程',
  500. url: '/pages/process/index',
  501. icon: bslcicon,
  502. // permissionCode: '7112'
  503. }, {
  504. name: '问题督办',
  505. url: '/pages/morePage/wtdb/wtdbMorePage',
  506. icon: wtdbicon,
  507. // type: 'wtdb',
  508. permissionCode: '713',
  509. showBadge: true,
  510. badgeValue: 0,
  511. }, {
  512. name: '通知公告',
  513. url: '/pages/announcement/list/index',
  514. icon: tzggicon,
  515. // permissionCode: '7112',
  516. showBadge: true,
  517. badgeValue: 0,
  518. }])
  519. // 判断功能菜单权限
  520. const roles = store.getters && store.getters.permissions;
  521. function judgeFuncList() {
  522. // let tempList = JSON.parse(JSON.stringify(functionList.value))
  523. // for (let i in tempList) {
  524. // //如果父级都没权限 直接移除
  525. // if (!roles.includes(tempList[i].permissionCode)) {
  526. // tempList[i].ban = true
  527. // } else {
  528. // let funcListSon = tempList[i].funcList
  529. // for (let j in funcListSon) {
  530. // if (!roles.includes(funcListSon[j].permissionCode)) {
  531. // funcListSon[j].ban = true
  532. // }
  533. // }
  534. // }
  535. // }
  536. // let filterList = tempList.filter(item => {
  537. // return !item.ban
  538. // })
  539. // for (let i in filterList) {
  540. // let filterListSon = filterList[i].funcList.filter(item => {
  541. // return !item.ban
  542. // })
  543. // filterList[i].funcList = filterListSon
  544. // }
  545. // functionList.value = filterList
  546. }
  547. function goToPage(url, permissionCode, type) {
  548. if (permissionCode) {
  549. let havePermission = checkRoleById([permissionCode])
  550. if (!havePermission) return
  551. }
  552. uni.$u.route({
  553. url: url,
  554. params: {
  555. type: type || null
  556. }
  557. })
  558. }
  559. // =============================未填写周报月报
  560. let popupShow = ref(false)
  561. let unWriteList = ref([])
  562. let unWriteListTotal = ref(0)
  563. function getUnwirteList() {
  564. getUnwriteReportList().then(res => {
  565. if (res.data.list.length > 0) {
  566. popupShow.value = true;
  567. unWriteList.value = res.data.list;
  568. unWriteListTotal.value = res.data.list.length;
  569. }
  570. })
  571. }
  572. function goToWriteReport(item) {
  573. const {
  574. sub_id: subId,
  575. month1: kj_month,
  576. } = item;
  577. let year = item.month1.substr(0, 4)
  578. let startDate = item.month1.substr(0, 10)
  579. if (item.kind === "1") { // 周报
  580. uni.navigateTo({
  581. url: `/pages/weekly/input/index?subId=${subId}&startDate=${startDate}&year=${year}&kj_month=${kj_month}`
  582. })
  583. } else { // 月报
  584. let kjMonth = kj_month.substring(0, 4) + '年' + kj_month.substring(4, 6) + '月';
  585. uni.navigateTo({
  586. url: `/pages/monthly/input/index?subId=${subId}&startDate=${startDate}&year=${year}&kj_month=${kjMonth}`
  587. })
  588. }
  589. }
  590. function popupClose() {
  591. popupShow.value = false
  592. }
  593. function getMessageCount() {
  594. getMessageNum().then(res => {
  595. if (res.data.count) {
  596. uni.setTabBarBadge({ //显示数字
  597. index: 1, //tabbar下标
  598. text: res.data.count + '' //数字
  599. })
  600. } else {
  601. uni.removeTabBarBadge({ //显示数字
  602. index: 1, //tabbar下标
  603. })
  604. }
  605. })
  606. }
  607. function projectgoto(e) {
  608. let params = {
  609. indusKind: projectKindId,
  610. subjectId: projectAreaId,
  611. zjly: projectAmtId,
  612. year: projectYear.value,
  613. startAmt: '',
  614. endAmt: '',
  615. type: 'home',
  616. queryType: 0
  617. }
  618. if (e.key == 'numAmt1') {
  619. params.startAmt = 0
  620. params.endAmt = 10000
  621. params.name = '亿元以下'
  622. } else if (e.key == 'numAmt2') {
  623. params.startAmt = 10000
  624. params.endAmt = 50000
  625. params.name = '1-5亿'
  626. } else if (e.key == 'numAmt3') {
  627. params.startAmt = 50000
  628. params.endAmt = 100000
  629. params.name = '5-10亿'
  630. } else if (e.key == 'numAmt4') {
  631. params.startAmt = 100000
  632. params.endAmt = null
  633. params.name = '10亿以上'
  634. }
  635. uni.$u.route({
  636. url: '/pages/projectInfo/index',
  637. params: params
  638. })
  639. }
  640. function amtgoto(e) {
  641. let params = {
  642. indusKind: projectKindId,
  643. subjectId: projectAreaId,
  644. zjly: projectAmtId,
  645. isCurrMonth: null,
  646. year: null,
  647. key: null
  648. }
  649. if (e.key == 'amtJh') {
  650. params.year = projectYear.value
  651. params.key = 'year'
  652. params.name = '年度计划'
  653. uni.$u.route({
  654. url: '/pages/countAnalysis/through/index',
  655. params: params
  656. })
  657. } else if (e.key == "monthPlan") {
  658. params.isCurrMonth = true
  659. params.key = 'mothAmt'
  660. params.name = '当月计划'
  661. uni.$u.route({
  662. url: '/pages/countAnalysis/through/index',
  663. params: params
  664. })
  665. } else if (e.key == 'amtSj') {
  666. params.year = projectYear.value
  667. params.key = 'ndjh'
  668. params.name = '年度完成'
  669. uni.$u.route({
  670. url: '/pages/countAnalysis/through/index',
  671. params: params
  672. })
  673. }
  674. }
  675. //轮播图
  676. let bannerList = reactive([])
  677. async function getBannerList() {
  678. getBanner().then(res => {
  679. bannerList = res.data.pictureList
  680. })
  681. }
  682. function bannerClick(e) {
  683. let result = {}
  684. for (let i = 0; i < bannerList.length; i++) {
  685. if (i == e) {
  686. result = bannerList[i]
  687. }
  688. }
  689. nextTick(() => {
  690. // uni.navigateTo({
  691. // url: `/pages/policy/detail/index?title=${result.title}&id=${result.id}`
  692. // })
  693. uni.$u.route({
  694. url: '/pages/policy/detail/index',
  695. params: {
  696. title: result.title,
  697. id: result.id
  698. }
  699. })
  700. })
  701. }
  702. onLoad(() => {
  703. let now = new Date();
  704. projectYear.value = now.getFullYear();
  705. defaultIndex.value = [projectYear.value - 2000];
  706. // judgeFuncList(); //判断权限
  707. getAnnounceMent(); //获取公告
  708. getHYFL(); //获取行业分类
  709. getJSDD(); //获取建设地点
  710. getZJLY(); // 获取资金来源
  711. getProjectInfo(); //获取项目数据
  712. getOverdue(); //获取逾期数量
  713. // getUnwirteList(); //获取未填写周报月报信息
  714. getBannerList(); //获取轮播图数据
  715. getMessageCount(); //获取未读消息数量
  716. });
  717. onShow(() => {
  718. if (popupShow.value) {
  719. getUnwirteList();
  720. }
  721. })
  722. onTabItemTap((e) => {
  723. console.log(e, '点击tab');
  724. // uni.$u.route({
  725. // url: 'pages/login/index',
  726. // })
  727. })
  728. </script>
  729. <template>
  730. <view class="container">
  731. <!-- 头 固定-->
  732. <view class="title-content">
  733. <view class="status_bar">
  734. </view>
  735. <text class="title">哈密市重点项目建设及工作可视化管理平台</text>
  736. <!-- 搜索 -->
  737. <view class="search">
  738. <view class="search-input">
  739. <view class="search-icon"></view>
  740. <input @click="goToPage('/pages/search/index')" placeholder="项目、领导电话..."
  741. placeholder-style="color: #D8D8D8;font-size:24rpx" />
  742. </view>
  743. <view class="search-focus" @click="goToPage('/pages/focus/index')">
  744. <view class="search-focus-icon"></view>
  745. <text class="text">关注</text>
  746. </view>
  747. </view>
  748. </view>
  749. <view class="top-blue">
  750. <view class="banner-box">
  751. <u-swiper :list="bannerList" indicator indicatorMode="line" keyName='coverImg' circular radius='20rpx'
  752. height="254rpx" @click="bannerClick"></u-swiper>
  753. </view>
  754. <view class="function-list">
  755. <u-grid :border="false" col="5">
  756. <u-grid-item v-for="(item,index) in functionList" :key="index"
  757. @click="goToPage(item.url,item.permissionCode,item.type)">
  758. <view class="grid-item">
  759. <u-badge v-if="item.showBadge" class="badge-num" type="error" max="99" :value="item.badgeValue"></u-badge>
  760. <view class="grid-item-icon">
  761. <image :src="item.icon"></image>
  762. </view>
  763. {{item.name}}
  764. </view>
  765. </u-grid-item>
  766. </u-grid>
  767. </view>
  768. <!-- 项目信息 -->
  769. <view class="project-info">
  770. <view class="project-info-select">
  771. <view class="choose-year" @click="yearShowChoose()">
  772. {{projectYear??"年度"}}
  773. <u-icon name="arrow-right" color="#343437" size="14" customStyle="margin-left:10rpx"></u-icon>
  774. </view>
  775. <view class="choose-year border" @click="kindShowChoose()">
  776. {{projectKind ??"行业分类"}}
  777. <u-icon name="arrow-right" color="#343437" size="14" customStyle="margin-left:10rpx"></u-icon>
  778. </view>
  779. <view class="choose-year border" @click="areaShowChoose()">
  780. {{projectArea ??"建设地点"}}
  781. <u-icon name="arrow-right" color="#343437" size="14" customStyle="margin-left:10rpx"></u-icon>
  782. </view>
  783. <view class="choose-year border" @click="zjlyShowChoose()">
  784. <view class="choose-year-text">{{projectAmt ??"资金来源"}}</view>
  785. <u-icon name="arrow-right" color="#343437" size="14" customStyle="margin-left:10rpx"></u-icon>
  786. </view>
  787. </view>
  788. <view class="project-num-box">
  789. <view class="project-num-box-item text-color1">
  790. <view class="item-title">
  791. 亿元项目数(个)
  792. </view>
  793. <view class="item-box" v-for="(item,index) in projectNum" :key="index" @click="projectgoto(item)">
  794. <view class="name">
  795. {{item.name}}
  796. </view>
  797. <view class="num">
  798. {{item.value}}
  799. </view>
  800. </view>
  801. </view>
  802. <view class="project-num-box-item text-color2">
  803. <view class="item-title">
  804. 资金投资情况(万元)
  805. </view>
  806. <view class="item-box high-gap" v-for="(item,index) in fundNum" :key="index" @click="amtgoto(item)">
  807. <view class="name">
  808. {{item.name}}
  809. </view>
  810. <view class="num">
  811. {{item.value}}
  812. </view>
  813. </view>
  814. <!-- <view class="item-box-horizon">
  815. <view class="item-box" v-for="(item,index) in fundNum" :key="index"
  816. @click="amtgoto(item)">
  817. <view class="name">{{item.name}}</view>
  818. <view class="num">{{item.value}}</view>
  819. </view>
  820. </view> -->
  821. </view>
  822. </view>
  823. <view class="project-num-box">
  824. <view class="project-num-box-item text-color3">
  825. <view class="item-title">
  826. 新建项目数(个)
  827. </view>
  828. <view class="item-box-horizon">
  829. <view class="item-box" v-for="(item,index) in newProjectNum" :key="index"
  830. @click="newProjectClick(item.key)">
  831. <view class="name">{{item.name}}</view>
  832. <view class="num">{{item.value}}{{item.key === "rate" ? "%" : ""}}</view>
  833. </view>
  834. </view>
  835. </view>
  836. </view>
  837. <view class="project-process">
  838. <view class="title">实际整体进度</view>
  839. <view class="line-progress">
  840. <u-line-progress :percentage="fullPercents" inactiveColor="#C1CEED" activeColor="#5D5AFF" :showText="false"
  841. height="13"></u-line-progress>
  842. </view>
  843. <view class="percent">{{fullPercents}}%</view>
  844. </view>
  845. <!-- 饼图 -->
  846. <view class="charts">
  847. <view class="charts-item" style="width: 40%;">
  848. <view class="charts-item-title">
  849. 项目个数
  850. </view>
  851. <view class="charts-item-ring">
  852. <view class="pie-back">
  853. <image src="@/static/echarts-pie.png" mode=""></image>
  854. </view>
  855. <qiun-data-charts v-if="showRing" type="ring" :opts="ringOpts" :chartData="ringChartData" :ontouch="true"
  856. @getIndex="ringClick" />
  857. </view>
  858. <view class="charts-item-description">
  859. <view class="charts-item-key">
  860. <view class="charts-item-color" style="border-color: #0A0EE4;"></view>
  861. <view class="charts-item-name">新建项目</view>
  862. </view>
  863. <view class="charts-item-value">{{numNew}}</view>
  864. </view>
  865. <view class="charts-item-description">
  866. <view class="charts-item-key">
  867. <view class="charts-item-color" style="border-color: #F05C17;"></view>
  868. <view class="charts-item-name">续建项目</view>
  869. </view>
  870. <view class="charts-item-value">{{numOld}}</view>
  871. </view>
  872. <view class="charts-item-description">
  873. <view class="charts-item-key">
  874. <view class="charts-item-color" style="border-color: #FFAE89;"></view>
  875. <view class="charts-item-name">储备项目</view>
  876. </view>
  877. <view class="charts-item-value">{{numNo}}</view>
  878. </view>
  879. </view>
  880. <view class="charts-item" style="width: 60%; padding: 0 20rpx; box-sizing: border-box;">
  881. <view class="charts-item-title">
  882. 建设地点实际投资占比
  883. </view>
  884. <view class="charts-item-pie">
  885. <qiun-data-charts v-if="showPie" type="pie" :opts="pieOpts" :chartData="pieChartData"
  886. tooltipFormat="tooltipDemo1" :ontouch="true" @getIndex="pieClick" />
  887. </view>
  888. <view class="charts-item-description" v-for="(item,index) in pieChartData.series[0].data" :key="index">
  889. <view class="charts-item-key">
  890. <view class="charts-item-color" :style="{borderColor:pieOpts.color[index]}"></view>
  891. <view class="charts-item-name">{{item.name ?? "--"}}</view>
  892. </view>
  893. <view class="charts-item-value">{{item.value ?? "--"}}%</view>
  894. </view>
  895. </view>
  896. </view>
  897. </view>
  898. <!-- 底部间隔 -->
  899. <view class="gap-bottom"></view>
  900. </view>
  901. <!-- 周报月报弹窗 -->
  902. <u-popup :show="popupShow" :round="20" @close="popupClose()" mode="center" closeable>
  903. <view class="remind-box">
  904. <text class="remind-title">提示</text>
  905. <view class="remind-card" v-for="(item,index) in unWriteList" :key="index">
  906. <view class="remind-item">
  907. <view class="remind-item-name">类型</view>
  908. <view class="remind-item-content">{{item.kind==='1'?'缺失周报':'缺失月报'}}</view>
  909. </view>
  910. <view class="remind-item">
  911. <view class="remind-item-name">项目名称</view>
  912. <view class="remind-item-content">{{item.sub_name || '--'}}</view>
  913. </view>
  914. <view class="remind-item">
  915. <view class="remind-item-name">说明</view>
  916. <view class="remind-item-content">{{item.remark || '--'}}</view>
  917. </view>
  918. <view class="remind-item">
  919. <view class="remind-item-btn" @click="goToWriteReport(item)">
  920. {{item.kind==='1'?'填写周报':'填写月报'}}
  921. </view>
  922. </view>
  923. <view class="remind-count">
  924. {{index + 1}}/{{unWriteListTotal}}
  925. </view>
  926. </view>
  927. </view>
  928. </u-popup>
  929. <!-- 年度选择 -->
  930. <u-picker :show="yearShow" :defaultIndex="defaultIndex" :columns="yearColumns" @confirm="yearClose"
  931. @cancel="yearClose" @close="yearClose" closeOnClickOverlay></u-picker>
  932. <!-- 行业选择 -->
  933. <u-picker :show="kindShow" :columns="kindColumns" @confirm="kindClose" @cancel="kindClose" @close="kindClose"
  934. closeOnClickOverlay></u-picker>
  935. <!-- 地点选择 -->
  936. <u-picker :show="areaShow" :columns="areaColumns" @confirm="areaClose" @cancel="areaClose" @close="areaClose"
  937. closeOnClickOverlay></u-picker>
  938. <!-- 资金来源 -->
  939. <u-picker :show="zjlyShow" :columns="zjlyColumns" @confirm="zjlyClose" @cancel="zjlyClose" @close="zjlyClose"
  940. closeOnClickOverlay></u-picker>
  941. </view>
  942. </template>
  943. <style lang="scss" scoped>
  944. @font-face {
  945. font-family: TITLETEXT;
  946. src: url('@/font/RuiZiAoYunJingShenPinBoJianMianFei-Shan(REEJI-PinboGB-Flash)-2.ttf');
  947. }
  948. page {
  949. height: 100%;
  950. background-color: #EAF1FF;
  951. }
  952. .text-color1 {
  953. color: #003FA8;
  954. background: #F0F4FC;
  955. border-radius: 16rpx 16rpx 16rpx 16rpx;
  956. }
  957. .text-color2 {
  958. color: #8F5F00;
  959. background: #FFFAF0;
  960. border-radius: 16rpx 16rpx 16rpx 16rpx;
  961. }
  962. // .text-color2 {
  963. // width: 100% !important;
  964. // height: 140rpx !important;
  965. // margin-top: 12rpx;
  966. // padding: 14rpx 15rpx 20rpx 15rpx;
  967. // color: #8F5F00;
  968. // background: #FFFAF0;
  969. // border-radius: 16rpx 16rpx 16rpx 16rpx;
  970. // }
  971. .text-color3 {
  972. width: 100% !important;
  973. height: 140rpx !important;
  974. margin-top: 12rpx;
  975. padding: 14rpx 15rpx 20rpx 15rpx;
  976. color: #4E00A8;
  977. background: #F8F3FF;
  978. border-radius: 16rpx;
  979. }
  980. .container {
  981. background: #EAF1FF;
  982. }
  983. .status_bar {
  984. height: var(--status-bar-height);
  985. width: 100%;
  986. }
  987. .title-content {
  988. position: fixed;
  989. top: 0;
  990. left: 0;
  991. width: 100%;
  992. padding-top: 20rpx;
  993. text-align: center;
  994. background-color: #1763E7;
  995. z-index: 1;
  996. border: 1px solid red;
  997. .title {
  998. font-size: 36rpx;
  999. font-weight: 700;
  1000. color: #FFF;
  1001. }
  1002. }
  1003. .search {
  1004. display: flex;
  1005. justify-content: space-between;
  1006. width: 92%;
  1007. height: 82rpx;
  1008. margin: auto;
  1009. padding: 25rpx 0 25rpx 0;
  1010. .search-input {
  1011. display: flex;
  1012. align-items: center;
  1013. width: 80%;
  1014. height: 52rpx;
  1015. padding: 0 30rpx;
  1016. box-sizing: border-box;
  1017. text-align: left;
  1018. background-color: #fff;
  1019. border-radius: 28rpx 28rpx 28rpx 28rpx;
  1020. .search-icon {
  1021. width: 28rpx;
  1022. height: 32rpx;
  1023. margin-right: 26rpx;
  1024. background-image: url('@/static/searchs-black.svg');
  1025. background-size: 100% 100%;
  1026. }
  1027. }
  1028. .search-focus {
  1029. display: flex;
  1030. align-items: center;
  1031. justify-content: flex-end;
  1032. width: 19%;
  1033. height: 52rpx;
  1034. background: linear-gradient(270deg, #63B4FF 29%, rgba(23, 99, 230, 0.32) 88%);
  1035. border-radius: 28rpx 28rpx 28rpx 28rpx;
  1036. .search-focus-icon {
  1037. width: 36rpx;
  1038. height: 32rpx;
  1039. margin-right: 10rpx;
  1040. background-image: url('@/static/focus.png');
  1041. background-size: 100% 100%;
  1042. }
  1043. .text {
  1044. margin-right: 20rpx;
  1045. font-size: 28rpx;
  1046. white-space: nowrap;
  1047. color: #FFFFFF;
  1048. }
  1049. }
  1050. }
  1051. .top-blue {
  1052. width: 100%;
  1053. height: 702rpx;
  1054. padding-top: 260rpx;
  1055. margin-bottom: 82rpx;
  1056. background: linear-gradient(180deg, #1763E7 60%, rgba(234, 241, 255, 0) 93%);
  1057. border-radius: 0 0 40rpx 40rpx;
  1058. border: 1px solid red;
  1059. .banner-box {
  1060. width: 92%;
  1061. height: 254rpx;
  1062. margin: auto;
  1063. border: 1px solid red;
  1064. }
  1065. }
  1066. .announcementList {
  1067. width: 92%;
  1068. height: 72rpx;
  1069. margin: 0 auto 32rpx;
  1070. padding: 10rpx 0;
  1071. color: #FF8D02;
  1072. background-color: #FFF7DC;
  1073. border-radius: 26rpx;
  1074. .announcementList-text {
  1075. margin-bottom: 18rpx;
  1076. font-size: 28rpx;
  1077. }
  1078. }
  1079. ::v-deep .u-notice-bar {
  1080. width: 100%;
  1081. // padding: 0;
  1082. border-radius: 19rpx;
  1083. }
  1084. ::v-deep .u-notice__swiper__item__text {
  1085. overflow: hidden;
  1086. text-overflow: ellipsis;
  1087. white-space: nowrap;
  1088. }
  1089. .special-funcs {
  1090. display: flex;
  1091. justify-content: space-between;
  1092. width: 92%;
  1093. height: 210rpx;
  1094. margin: 50rpx auto 32rpx;
  1095. background-size: 100% 100%;
  1096. .special-func-item {
  1097. width: 200rpx;
  1098. height: 210rpx;
  1099. padding: 34rpx 18rpx;
  1100. box-sizing: border-box;
  1101. background-size: 100% 100%;
  1102. .special-func-title {
  1103. display: flex;
  1104. justify-content: space-between;
  1105. align-items: flex-start;
  1106. }
  1107. .special-func-name {
  1108. color: #FFFFFF;
  1109. line-height: 34rpx;
  1110. font-size: 32rpx;
  1111. font-family: TITLETEXT;
  1112. }
  1113. }
  1114. .gov {
  1115. background-image: url('@/static/special-gov.png');
  1116. }
  1117. .todo {
  1118. background-image: url('@/static/special-todo.png');
  1119. }
  1120. .images {
  1121. background-image: url('@/static/special-image.png');
  1122. }
  1123. }
  1124. .project-info-select {
  1125. display: flex;
  1126. justify-content: space-between;
  1127. align-items: center;
  1128. width: 92%;
  1129. height: 80rpx;
  1130. background-color: #fff;
  1131. margin: auto;
  1132. border-radius: 16rpx 16rpx 16rpx 16rpx;
  1133. .lines {
  1134. height: 46rpx;
  1135. border-right: #D7DDEA;
  1136. }
  1137. .choose-year {
  1138. flex: 1;
  1139. display: flex;
  1140. align-items: center;
  1141. justify-content: center;
  1142. font-size: 24rpx;
  1143. font-weight: 500;
  1144. color: #343437;
  1145. .choose-year-text {
  1146. width: 3rem;
  1147. overflow: hidden;
  1148. text-overflow: ellipsis;
  1149. white-space: nowrap;
  1150. }
  1151. }
  1152. .border {
  1153. border-left: 3rpx solid #EAF0FD;
  1154. }
  1155. }
  1156. .project-info {
  1157. width: 92%;
  1158. min-height: 326rpx;
  1159. margin: auto;
  1160. margin-top: 20rpx;
  1161. border-radius: 16rpx 16rpx 16rpx 16rpx;
  1162. background-color: #FFFFFF;
  1163. padding-bottom: 20rpx;
  1164. .project-num-box {
  1165. display: flex;
  1166. justify-content: space-between;
  1167. align-items: center;
  1168. width: 92%;
  1169. margin: auto;
  1170. .project-num-box-item {
  1171. width: 48%;
  1172. height: 262rpx;
  1173. padding: 20rpx 15rpx 20rpx 15rpx;
  1174. .item-title {
  1175. font-size: 28rpx;
  1176. font-weight: 500;
  1177. font-family: OPPOSans-M;
  1178. }
  1179. .item-box {
  1180. display: flex;
  1181. justify-content: space-between;
  1182. align-items: center;
  1183. padding: 5rpx 0 5rpx 0;
  1184. .name {
  1185. font-size: 24rpx;
  1186. font-weight: 400;
  1187. }
  1188. .num {
  1189. font-size: 28rpx;
  1190. font-weight: 500;
  1191. font-family: OPPOSans-M;
  1192. }
  1193. }
  1194. .high-gap {
  1195. padding: 5rpx 0 16rpx 0;
  1196. }
  1197. }
  1198. }
  1199. .blue {
  1200. color: #1763E7
  1201. }
  1202. .project-num-minbox {
  1203. display: flex;
  1204. }
  1205. .project-num-item {
  1206. flex: 1;
  1207. margin: auto 0;
  1208. font-size: 24rpx;
  1209. color: #343437;
  1210. text-align: center;
  1211. .project-num-value {
  1212. margin-bottom: 8rpx;
  1213. font-size: 36rpx;
  1214. color: #343437;
  1215. font-weight: 700;
  1216. }
  1217. }
  1218. .project-process {
  1219. display: flex;
  1220. align-items: center;
  1221. justify-content: space-between;
  1222. width: 92%;
  1223. margin: auto;
  1224. height: 88rpx;
  1225. font-size: 28rpx;
  1226. font-weight: 500;
  1227. color: #4B17E7;
  1228. .line-progress {
  1229. width: 58%;
  1230. }
  1231. .title {
  1232. font-size: 28rpx;
  1233. font-weight: 500;
  1234. font-family: OPPOSans-M;
  1235. color: #001643;
  1236. }
  1237. .percent {
  1238. font-weight: 500;
  1239. font-size: 28rpx;
  1240. font-family: OPPOSans-M;
  1241. color: #001643;
  1242. }
  1243. }
  1244. }
  1245. .item-box-horizon {
  1246. display: flex;
  1247. align-items: center;
  1248. justify-content: space-evenly;
  1249. width: 100%;
  1250. margin-top: 4rpx;
  1251. .item-box {
  1252. display: block !important;
  1253. text-align: center;
  1254. }
  1255. }
  1256. .charts {
  1257. display: flex;
  1258. justify-content: space-between;
  1259. width: 92%;
  1260. margin: auto;
  1261. .charts-item {
  1262. height: 100%;
  1263. box-sizing: border-box;
  1264. border-radius: 40rpx;
  1265. // border: 3rpx solid rgba(200, 216, 247, 0.302);
  1266. .charts-item-title {
  1267. margin: auto;
  1268. text-align: center;
  1269. font-size: 28rpx;
  1270. font-weight: 500;
  1271. color: #001643;
  1272. font-family: OPPOSans-M;
  1273. }
  1274. .charts-item-ring {
  1275. position: relative;
  1276. height: 250rpx;
  1277. margin: 0 auto;
  1278. .pie-back {
  1279. position: absolute;
  1280. left: 50%;
  1281. top: 10rpx;
  1282. transform: translate(-49%);
  1283. image {
  1284. width: 268rpx;
  1285. height: 268rpx;
  1286. z-index: 0;
  1287. }
  1288. }
  1289. }
  1290. .charts-item-pie {
  1291. width: 100%;
  1292. // height: 400rpx;
  1293. height: 250rpx;
  1294. margin: 0 auto;
  1295. }
  1296. .charts-item-text {
  1297. width: 100%;
  1298. text-align: center;
  1299. font-size: 28rpx;
  1300. font-weight: 500;
  1301. color: #3D3D3D;
  1302. }
  1303. }
  1304. }
  1305. .charts-item-description {
  1306. display: flex;
  1307. align-items: center;
  1308. justify-content: space-between;
  1309. width: 100%;
  1310. margin: 20rpx 0;
  1311. font-size: 24rpx;
  1312. .charts-item-key {
  1313. display: flex;
  1314. align-items: center;
  1315. }
  1316. .charts-item-color {
  1317. width: 26rpx;
  1318. height: 26rpx;
  1319. margin-right: 16rpx;
  1320. border-radius: 50%;
  1321. border: 6rpx solid #fff;
  1322. }
  1323. .charts-item-name {
  1324. font-size: 24rpx;
  1325. color: #001643;
  1326. }
  1327. .charts-item-value {
  1328. font-weight: 500;
  1329. font-size: 24rpx;
  1330. color: #001643;
  1331. }
  1332. }
  1333. .overdue {
  1334. display: flex;
  1335. justify-content: space-between;
  1336. width: 92%;
  1337. height: 136rpx;
  1338. margin: 25rpx auto;
  1339. border-radius: 28rpx;
  1340. backdrop-filter: blur(40rpx);
  1341. }
  1342. .overdue-item {
  1343. display: flex;
  1344. justify-content: space-between;
  1345. align-items: center;
  1346. width: 328rpx;
  1347. height: 136rpx;
  1348. padding: 0 28rpx 0 44rpx;
  1349. box-sizing: border-box;
  1350. font-size: 32rpx;
  1351. color: #001D4F;
  1352. font-weight: 400;
  1353. font-family: TITLETEXT;
  1354. background-color: #fff;
  1355. border-radius: 28rpx;
  1356. .overdue-icon {
  1357. background-size: 100% 100%;
  1358. background-position: center center;
  1359. }
  1360. .overdue-will {
  1361. width: 52rpx;
  1362. height: 53rpx;
  1363. background-image: url('@/static/overdue-warn.png');
  1364. .badge-num {
  1365. position: absolute;
  1366. top: 40rpx;
  1367. right: -36rpx;
  1368. }
  1369. }
  1370. .overdued {
  1371. width: 61rpx;
  1372. height: 54rpx;
  1373. background-image: url('@/static/overdue.png');
  1374. .badge-num {
  1375. position: absolute;
  1376. top: 40rpx;
  1377. right: -36rpx
  1378. }
  1379. }
  1380. .badge-box {
  1381. position: relative;
  1382. }
  1383. .overdue-item-text {
  1384. display: flex;
  1385. align-items: center;
  1386. }
  1387. }
  1388. .report {
  1389. display: flex;
  1390. justify-content: space-between;
  1391. width: 92%;
  1392. margin: 25rpx auto 0;
  1393. padding: 0 78rpx;
  1394. height: 164rpx;
  1395. border-radius: 28rpx;
  1396. background: #fff;
  1397. }
  1398. .report-item {
  1399. width: 128rpx;
  1400. height: 142rpx;
  1401. margin: auto 0;
  1402. text-align: center;
  1403. .report-icon {
  1404. width: 96rpx;
  1405. height: 96rpx;
  1406. margin: 0 auto;
  1407. background-size: 100% 100%;
  1408. }
  1409. .weekly {
  1410. background-image: url('@/static/icon-weekly.svg');
  1411. }
  1412. .monthly {
  1413. background-image: url('@/static/icon-monthly.svg');
  1414. }
  1415. .yearly {
  1416. background-image: url('@/static/icon-yearly.svg');
  1417. }
  1418. .report-item-text {
  1419. margin-top: 10rpx;
  1420. color: #000;
  1421. font-size: 28rpx;
  1422. }
  1423. }
  1424. .gap-line {
  1425. width: 100%;
  1426. height: 20rpx;
  1427. background: #E8ECF4;
  1428. }
  1429. .function-list {
  1430. margin: 20rpx auto;
  1431. border-radius: 16rpx 16rpx 16rpx 16rpx;
  1432. background: #FFFFFF;
  1433. height: 278rpx;
  1434. width: 92%;
  1435. .grid-item {
  1436. height: 62rpx;
  1437. margin: 18rpx 0 46rpx;
  1438. font-size: 28rpx;
  1439. color: #343437;
  1440. font-weight: 400;
  1441. .badge-num {
  1442. position: absolute;
  1443. top: 5rpx;
  1444. right: 25rpx;
  1445. }
  1446. .grid-item-icon {
  1447. width: 60rpx;
  1448. height: 60rpx;
  1449. margin: 0 auto 6rpx;
  1450. image {
  1451. width: 100%;
  1452. height: 100%;
  1453. }
  1454. }
  1455. }
  1456. .bottom-item {
  1457. margin-bottom: 0;
  1458. }
  1459. }
  1460. .gap-bottom {
  1461. width: 100%;
  1462. height: 150rpx;
  1463. }
  1464. .remind-box {
  1465. width: 672rpx;
  1466. min-height: 464rpx;
  1467. max-height: 858rpx;
  1468. padding: 16rpx 40rpx;
  1469. overflow: hidden;
  1470. overflow-y: scroll;
  1471. .remind-title {
  1472. color: #FF4800;
  1473. font-size: 36rpx;
  1474. }
  1475. .remind-card {
  1476. position: relative;
  1477. min-height: 376rpx;
  1478. padding-bottom: 32rpx;
  1479. border-bottom: 2rpx solid #D8D8D8;
  1480. .remind-count {
  1481. position: absolute;
  1482. top: 0;
  1483. right: -40rpx;
  1484. display: flex;
  1485. align-items: center;
  1486. justify-content: center;
  1487. width: 134rpx;
  1488. height: 64rpx;
  1489. font-size: 32rpx;
  1490. color: #1869F6;
  1491. background: #CEE0FF;
  1492. border-radius: 32rpx 0rpx 0rpx 32rpx;
  1493. }
  1494. }
  1495. .remind-item {
  1496. display: flex;
  1497. align-items: flex-start;
  1498. margin-top: 40rpx;
  1499. font-size: 32rpx;
  1500. .remind-item-name {
  1501. min-width: 192rpx;
  1502. color: #9E9E9E;
  1503. }
  1504. .remind-item-content {
  1505. color: #343437;
  1506. float: left;
  1507. }
  1508. .remind-item-btn {
  1509. width: 100%;
  1510. height: 84rpx;
  1511. line-height: 84rpx;
  1512. font-size: 36rpx;
  1513. color: #fff;
  1514. text-align: center;
  1515. background: #1869F6;
  1516. border-radius: 16rpx;
  1517. }
  1518. }
  1519. }
  1520. ::v-deep .u-popup__content {
  1521. overflow: hidden;
  1522. }
  1523. </style>