index.vue 37 KB

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