index.vue 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020
  1. <script setup>
  2. import {
  3. ref,
  4. getCurrentInstance
  5. } from "vue";
  6. import {
  7. onLoad,
  8. onPullDownRefresh,
  9. onReachBottom,
  10. onPageScroll
  11. } from "@dcloudio/uni-app";
  12. import {
  13. getJSDDlist,
  14. getHYFLlist,
  15. getJSXZlist,
  16. getXMLXlist,
  17. getProjectInfoList,
  18. getProjectGraphicList,
  19. } from "@/api/work/projectInfo.js";
  20. import {
  21. getInfo,
  22. } from "@/api/login.js"
  23. import {
  24. getXMXZlist,
  25. } from "@/api/home.js"
  26. import store from '@/store'
  27. import {
  28. timeFormat
  29. } from "@/utils/timeFormatter.js"
  30. let searchInfo = ref({
  31. pageNo: 1,
  32. pageSize: 10,
  33. subName: null,
  34. propKind: null,
  35. indusKind: null,
  36. subjectId: null,
  37. kind: null,
  38. orderType: null,
  39. })
  40. let listTotal = ref(0);
  41. let projectList = ref([{}]);
  42. const reSearch = function() {
  43. searchInfo.value.pageNo = 1;
  44. projectList.value = [];
  45. listTotal.value = 0;
  46. moreListFlag = true;
  47. getList();
  48. };
  49. let loading = ref(false);
  50. let moreListFlag = true;
  51. const getList = function() {
  52. const params = Object.assign({}, searchInfo.value);
  53. if (params.propKind) params.propKind = jsxzFull.find(item => item.value === params.propKind).key;
  54. if (params.indusKind) params.indusKind = hyflFull.find(item => item.value === params.indusKind).key;
  55. if (params.subjectId) params.subjectId = jsddFull.find(item => item.value === params.subjectId).key;
  56. if (params.kind) params.kind = xmlxFull.find(item => item.value === params.kind).key;
  57. if (params.orderType) params.orderType = orderFull.find(item => item.value === params.orderType).key;
  58. if (searchInfo.value.pageNo == 1) {
  59. loading.value = true
  60. };
  61. getProjectGraphicList(params).then(res => {
  62. loading.value = false
  63. projectList.value = projectList.value.concat(res.data.list);
  64. listTotal.value = res.data.total;
  65. if (res.data.total == searchInfo.value.pageNo * searchInfo.value.pageSize - (10 - res.data.list
  66. .length)) moreListFlag = false;
  67. }).catch(() => {
  68. loading.value = false
  69. })
  70. }
  71. // 建设性质
  72. let jsxzFull = [];
  73. let jsxzColumns = ref([]);
  74. const getJSXZ = function() {
  75. getJSXZlist().then(res => {
  76. jsxzFull = res.data.list;
  77. jsxzColumns.value = [res.data.list.map(item => item.value)];
  78. })
  79. };
  80. let jsxzShow = ref(false);
  81. const jsxzShowChoose = function() {
  82. jsxzShow.value = true;
  83. }
  84. const jsxzClose = function(e) {
  85. if (e) searchInfo.value.propKind = e.value[0];
  86. jsxzShow.value = false;
  87. }
  88. let hyflShow = ref(false);
  89. const hyflShowChoose = function() {
  90. hyflShow.value = true;
  91. }
  92. const hyflClose = function(e) {
  93. if (e) searchInfo.value.indusKind = e.value[0];
  94. hyflShow.value = false;
  95. }
  96. let jsddShow = ref(false);
  97. const jsddShowChoose = function() {
  98. jsddShow.value = true;
  99. }
  100. const jsddClose = function(e) {
  101. if (e) searchInfo.value.subjectId = e.value[0];
  102. jsddShow.value = false;
  103. }
  104. // 项目类型
  105. let xmlxFull = [];
  106. let xmlxShow = ref(false);
  107. const xmlxShowChoose = function() {
  108. xmlxShow.value = true;
  109. }
  110. const xmlxClose = function(e) {
  111. if (e) searchInfo.value.kind = e.value[0];
  112. xmlxShow.value = false;
  113. }
  114. // 按金额排序
  115. let orderFull = [{
  116. key: null,
  117. value: "默认"
  118. }, {
  119. key: "asc",
  120. value: "升序"
  121. }, {
  122. key: "desc",
  123. value: "降序"
  124. }];
  125. let orderColumns = ref([
  126. ["默认", "升序", "降序"]
  127. ]);
  128. let orderShow = ref(false);
  129. const orderShowChoose = () => {
  130. orderShow.value = true;
  131. }
  132. const orderClose = function(e) {
  133. if (e) searchInfo.value.orderType = e.value[0];
  134. orderShow.value = false;
  135. }
  136. let modalshow = ref(false)
  137. const clickItem = id => {
  138. // modalshow.value = true
  139. uni.navigateTo({
  140. url: `/pages/projectImageAndVideo/index?subId=${id}`
  141. })
  142. }
  143. // 折叠/展开
  144. const changeFoldItem = (status, id) => {
  145. let item = projectList.value.find(item => item.id === id);
  146. item.unfold = status;
  147. }
  148. //是否展开筛选条件
  149. let isUnfold = ref(false)
  150. //投资分析帅选条件
  151. let investmentAnalysisFrom = ref({
  152. kind: ''
  153. })
  154. let cardCurrut = ref(0)
  155. function onChangeCard(e) {
  156. if (cardCurrut.value == e) {
  157. projectList.value[cardCurrut.value].isOpen = !projectList.value[cardCurrut.value].isOpen
  158. } else {
  159. projectList.value[cardCurrut.value].isOpen = false
  160. projectList.value[e].isOpen = true
  161. cardCurrut.value = e
  162. }
  163. }
  164. let pageForm = ref({
  165. beginDateStart: null,
  166. beginDateEnd: null,
  167. kind: null,
  168. indusKind: null,
  169. propKind: null,
  170. subjectId: null,
  171. status: null,
  172. subName: null,
  173. startAmt: null,
  174. endAmt: null,
  175. isHide: null,
  176. light: ['红灯', '黄灯', '绿灯'],
  177. })
  178. // ====================================选择开始时间
  179. let beginDateStart = ref(null)
  180. let beginTimeShow = ref(false)
  181. function showBeginTimeChoose() {
  182. beginTimeShow.value = true
  183. }
  184. function beginTimeClose(e) {
  185. if (e) {
  186. let time = timeFormat(e.value)
  187. pageForm.value.beginDateStart = time
  188. }
  189. beginTimeShow.value = false
  190. }
  191. // ====================================选择结束时间
  192. let beginDateEnd = ref(null)
  193. let endTimeShow = ref(false)
  194. function showEndTimeChoose() {
  195. endTimeShow.value = true
  196. }
  197. function endTimeClose(e) {
  198. if (e) {
  199. let time = timeFormat(e.value)
  200. pageForm.value.beginDateEnd = time
  201. }
  202. endTimeShow.value = false
  203. }
  204. // ====================================选择项目类型
  205. let kindShow = ref(false);
  206. let kindColumns = ref([]);
  207. function showKindChoose() {
  208. kindShow.value = true
  209. }
  210. function kindClose(e) {
  211. if (e) pageForm.value.kind = e.value[0];
  212. kindShow.value = false;
  213. }
  214. let kindFull = [];
  215. const getXMLX = function() {
  216. getXMLXlist().then(res => {
  217. kindFull = res.data.list;
  218. kindFull.unshift({
  219. key: null,
  220. value: "所有类型"
  221. });
  222. kindColumns.value = [res.data.list.map(item => item.value)];
  223. })
  224. };
  225. // ====================================选择行业分类
  226. let industKindOrgin = []
  227. let IndustKindList = ref([])
  228. let IndustKindShow = ref(false)
  229. function showIndustKindChoose() {
  230. IndustKindShow.value = true
  231. }
  232. function IndustKindClose(e) {
  233. if (e) pageForm.value.indusKind = e.value[0];
  234. IndustKindShow.value = false
  235. }
  236. // ====================================选择行业状态
  237. // let statusList = ref([
  238. // ["请选择", "暂存", "项目申报", "待审批", "审批中", "核准备案中", "计划编制", "待开工", "施工中", "年度竣工", "不同意", "已竣工"]
  239. // ])
  240. let statusList = ref([
  241. ["请选择", "暂存", "项目前期", "待开工", "施工中", "暂停施工", "已竣工"]
  242. ])
  243. let statusShow = ref(false)
  244. function showStatusChoose() {
  245. statusShow.value = true
  246. }
  247. function statusClose(e) {
  248. if (e) pageForm.value.status = e.value[0];
  249. statusShow.value = false;
  250. }
  251. // ====================================选择隐藏状态
  252. let isHideNameList = ref([
  253. ["请选择",
  254. "正常",
  255. "隐藏"
  256. ]
  257. ])
  258. let isHideNameShow = ref(false)
  259. function showIsHideNameChoose() {
  260. isHideNameShow.value = true
  261. }
  262. function isHideNameClose(e) {
  263. if (e) pageForm.value.isHideName = e.value[0];
  264. isHideNameShow.value = false;
  265. }
  266. // =====================================地点
  267. let areaShow = ref(false);
  268. let areaColumns = ref([]);
  269. const showAreaChoose = function() {
  270. areaShow.value = true;
  271. }
  272. const areaClose = function(e) {
  273. if (e) pageForm.value.subjectId = e.value[0];
  274. areaShow.value = false;
  275. }
  276. let jsddFull = [];
  277. const getJSDD = function() {
  278. getJSDDlist().then(res => {
  279. jsddFull = res.data.list;
  280. jsddFull.push({
  281. key: null,
  282. value: "所有地区"
  283. });
  284. areaColumns.value = [res.data.list.map(item => item.value)];
  285. areaColumns.value[0].unshift("所有地区");
  286. })
  287. };
  288. // =====================================性质
  289. let xmxzShow = ref(false);
  290. let xmxzColumns = ref([]);
  291. const showXmxzChoose = function() {
  292. xmxzShow.value = true;
  293. }
  294. const xmxzClose = function(e) {
  295. if (e) pageForm.value.propKind = e.value[0];
  296. xmxzShow.value = false;
  297. }
  298. let xmxzFull = [];
  299. const getXMXZ = function() {
  300. getXMXZlist().then(res => {
  301. xmxzFull = res.data.list;
  302. xmxzFull.unshift({
  303. key: null,
  304. value: "所有性质"
  305. });
  306. xmxzColumns.value = [res.data.list.map(item => item.value)];
  307. })
  308. };
  309. // =====================================灯
  310. let lightShow = ref(false);
  311. const kindUnit = store.getters && store.getters.kindUnit;
  312. function judgeLightShow() {
  313. if ((kindUnit ?? '') === '') {
  314. // 为空就请求一下
  315. getInfo().then(res => {
  316. lightShow.value = res?.data?.user?.kindUnit === "1";
  317. })
  318. } else {
  319. lightShow.value = kindUnit === "1";
  320. }
  321. }
  322. function confirmParams() {
  323. // let statusObj = {
  324. // "请选择": "",
  325. // "暂存": "0",
  326. // "项目申报": "1",
  327. // "待审批": "2",
  328. // "审批中": "3",
  329. // "核准备案中": "4",
  330. // "计划编制": "5",
  331. // "待开工": "6",
  332. // "施工中": "7",
  333. // "不同意": "8",
  334. // "年度竣工": "9",
  335. // "已竣工": "A"
  336. // }
  337. let statusObj = {
  338. "请选择": "",
  339. "暂存": "0",
  340. "项目前期": "1",
  341. "待开工": "6",
  342. "施工中": "7",
  343. "暂停施工": "8",
  344. //"年度竣工": "9",
  345. "已竣工": "A"
  346. }
  347. let isHideNameObj = {
  348. "请选择": "",
  349. "正常": "0",
  350. "隐藏": "1",
  351. }
  352. let lightObj = {
  353. "绿灯": "0",
  354. "黄灯": "1",
  355. "红灯": "2"
  356. }
  357. let lightText = ""
  358. for (let i in pageForm.value.light) {
  359. lightText += lightObj[pageForm.value.light[i]] + ","
  360. }
  361. if (lightText.length > 0) lightText = lightText.substr(0, lightText.length - 1);
  362. let paramsData = {
  363. "beginDateStart": pageForm.value.beginDateStart,
  364. "beginDateEnd": pageForm.value.beginDateEnd,
  365. "kind": kindFull.find(item => item.value === pageForm.value.kind)?.key,
  366. "indusKind": industKindOrgin.find(item => item.value === pageForm.value.indusKind)?.key,
  367. "subjectId": jsddFull.find(item => item.value === pageForm.value.subjectId)?.key,
  368. "propKind": xmxzFull.find(item => item.value === pageForm.value.propKind)?.key,
  369. "status": statusObj[pageForm.value.status],
  370. "subName": pageForm.value.subName,
  371. "startAmt": pageForm.value.startAmt,
  372. "endAmt": pageForm.value.endAmt,
  373. "isHide": isHideNameObj[pageForm.value.isHideName],
  374. "light": lightText
  375. }
  376. searchInfo.value = Object.assign(searchInfo.value, paramsData);
  377. searchInfo.value.pageNo = 1;
  378. projectList.value = [];
  379. listTotal.value = 0;
  380. moreListFlag = true;
  381. console.log(searchInfo.value, '请求参数');
  382. getList();
  383. }
  384. let scrollTop = ref(0);
  385. onPageScroll((e) => {
  386. scrollTop.value = e.scrollTop
  387. })
  388. onPullDownRefresh(() => {
  389. try {
  390. reSearch();
  391. } finally {
  392. uni.stopPullDownRefresh()
  393. }
  394. })
  395. onLoad(async () => {
  396. let now = new Date();
  397. let year = now.getFullYear();
  398. // 开始时间
  399. beginDateStart.value = pageForm.value.beginDateStart = year + "/01/01";
  400. // 结束时间
  401. beginDateEnd.value = pageForm.value.beginDateEnd = year + "/12/31";
  402. // 行业分类列表
  403. const res = await getHYFLlist()
  404. industKindOrgin = res.data.list
  405. let titleList = res.data.list.map(item => item.value)
  406. titleList.unshift("请选择")
  407. IndustKindList.value = [titleList]
  408. getJSDD(); // 建设地点列表
  409. getXMXZ(); // 项目性质列表
  410. getXMLX(); // 项目类型列表
  411. judgeLightShow()
  412. getList();
  413. })
  414. onReachBottom(() => {
  415. if (!moreListFlag) {
  416. return uni.showToast({
  417. title: "已经到底了。",
  418. icon: "none",
  419. duration: 2000
  420. })
  421. }
  422. searchInfo.value.pageNo++;
  423. getList();
  424. })
  425. </script>
  426. <template>
  427. <view class="container">
  428. <page-title>项目形象进度({{listTotal}})</page-title>
  429. <view class="stats-layer-next">
  430. <view class="condition-btn">
  431. <view class="text">
  432. 2024
  433. </view>
  434. <image src="../../static/open-btn.png" mode="" :class="isUnfold ? 'open-btn':''"
  435. @click="isUnfold = !isUnfold"></image>
  436. </view>
  437. <view class="condition-from" :style="isUnfold ? {height:'800rpx'} :''">
  438. <view class="item">
  439. <view class="item-label">开始日期</view>
  440. <view class="item-text" @click="showBeginTimeChoose()">
  441. <view v-if="pageForm.beginDateStart">{{pageForm.beginDateStart}}</view>
  442. <view v-else class="text">请选择开始日期</view>
  443. <u-icon name="arrow-right" color="#DDDDDD" size="16" customStyle="margin-left:10rpx"></u-icon>
  444. </view>
  445. </view>
  446. <view class="item">
  447. <view class="item-label">结束日期</view>
  448. <view class="item-text" @click="showEndTimeChoose()">
  449. <view v-if="pageForm.beginDateEnd">{{pageForm.beginDateEnd}}</view>
  450. <view v-else class="text">请选择结束日期</view>
  451. <u-icon name="arrow-right" color="#DDDDDD" size="16" customStyle="margin-left:10rpx"></u-icon>
  452. </view>
  453. </view>
  454. <view class="item">
  455. <view class="item-label">项目类型</view>
  456. <view class="item-text" @click="showKindChoose()">
  457. <view v-if="pageForm.kind">{{pageForm.kind}}</view>
  458. <view v-else class="text">请选择类型</view>
  459. <u-icon name="arrow-right" color="#DDDDDD" size="16" customStyle="margin-left:10rpx"></u-icon>
  460. </view>
  461. </view>
  462. <view class="item">
  463. <view class="item-label">项目性质</view>
  464. <view class="item-text" @click="showXmxzChoose()">
  465. <view v-if="pageForm.propKind">{{pageForm.propKind}}</view>
  466. <view v-else class="text">请选择行业分类</view>
  467. <u-icon name="arrow-right" color="#DDDDDD" size="16" customStyle="margin-left:10rpx"></u-icon>
  468. </view>
  469. </view>
  470. <view class="item">
  471. <view class="item-label">建设地点</view>
  472. <view class="item-text" @click="showAreaChoose()">
  473. <view v-if="pageForm.subjectId">{{pageForm.subjectId}}</view>
  474. <view v-else class="text">请选择建设地点</view>
  475. <u-icon name="arrow-right" color="#DDDDDD" size="16" customStyle="margin-left:10rpx"></u-icon>
  476. </view>
  477. </view>
  478. <view class="item">
  479. <view class="item-label">行业分类</view>
  480. <view class="item-text" @click="showIndustKindChoose()">
  481. <view v-if="pageForm.indusKind">{{pageForm.indusKind}}</view>
  482. <view v-else class="text">请选择行业分类</view>
  483. <u-icon name="arrow-right" color="#DDDDDD" size="16" customStyle="margin-left:10rpx"></u-icon>
  484. </view>
  485. </view>
  486. <view class="item">
  487. <view class="item-label">状态</view>
  488. <view class="item-text" @click="showStatusChoose()">
  489. <view v-if="pageForm.status">{{pageForm.status}}</view>
  490. <view v-else class="text">请选择状态</view>
  491. <u-icon name="arrow-right" color="#DDDDDD" size="16" customStyle="margin-left:10rpx"></u-icon>
  492. </view>
  493. </view>
  494. <view class="item">
  495. <view class="item-label">隐藏状态</view>
  496. <view class="item-text" @click="showIsHideNameChoose()">
  497. <view v-if="pageForm.isHideName">{{pageForm.isHideName}}</view>
  498. <view v-else class="text">请选择隐藏状态</view>
  499. <u-icon name="arrow-right" color="#DDDDDD" size="16" customStyle="margin-left:10rpx"></u-icon>
  500. </view>
  501. </view>
  502. <view class="item">
  503. <view class="item-label">金额范围</view>
  504. <view class="card-item-range">
  505. <input v-model="pageForm.startAmt" class="card-item-input center-input" placeholder="最小值"
  506. placeholder-style="color: #D8D8D8" maxlength="20" type="number" />
  507. ~
  508. <input v-model="pageForm.endAmt" class="card-item-input center-input" placeholder="最大值"
  509. placeholder-style="color: #D8D8D8" maxlength="20" type="number" />
  510. </view>
  511. </view>
  512. <view class="item">
  513. <view class="item-label">项目名称</view>
  514. <view class="card-item-range">
  515. <input v-model="pageForm.subName" class="card-item-input center-input" placeholder="请输入项目名称"
  516. placeholder-style="color: #D8D8D8" maxlength="20" type="number" />
  517. </view>
  518. </view>
  519. <!-- 红黄绿灯 -->
  520. <!-- <view style="margin-top: 20rpx;">
  521. <u-checkbox-group v-model="pageForm.light" style="width: 500rpx">
  522. <u-checkbox :customStyle="{display:'flex',justifyContent:'space-evenly',width:'32%'}"
  523. label-size="16px" iconColor='#fff' activeColor='#002F69' v-for="(item, index) in lightList"
  524. :key="index" :label="item.name" :name="item.name">
  525. </u-checkbox>
  526. </u-checkbox-group>
  527. </view> -->
  528. <view class="form-confrom" style="margin-top: 20rpx;" @click="confirmParams()">
  529. 确定
  530. </view>
  531. </view>
  532. </view>
  533. <view class="cards-list" :style="isUnfold ? {marginTop:'30rpx'} :''">
  534. <view v-for="(item,index) in projectList" :key="index">
  535. <view class="card">
  536. <view class="project-layer" :style="!item.isOpen ? {border:'none'}:''">
  537. <text class="card-name-num">{{(index+1<10?'0'+(index+1):index+1)}}</text>
  538. <view class="name">
  539. {{item.subName ?? "--"}}
  540. </view>
  541. </view>
  542. <view class="card-status" @click="onChangeCard(index)">
  543. <image class="status-light" src="../../static/images/red.svg" mode="" v-if="item.status_fgw=='2'"></image>
  544. <image class="status-light" src="../../static/images/green.svg" mode="" v-if="item.status_fgw=='0'||item.status_fgw==null"></image>
  545. <image class="status-light" src="../../static/images/yellow.svg" mode="" v-if="item.status_fgw=='1'"></image>
  546. {{item.status ?? "--"}}
  547. <image src="../../static/images/liaghtUp.svg" mode=""
  548. :class="item.isOpen ?'card-status-icon-change' :''"></image>
  549. </view>
  550. <view class="card-content-box" :style="item.isOpen ? {height:'300rpx'} :''">
  551. <view class="card-item" style="margin-top: 5rpx;">
  552. <view class="card-item-name">总 投 资 金 额</view>
  553. <view class="card-item-content">{{item.amtTotal ?? "--"}}</view>
  554. </view>
  555. <!-- 年度计划投资-申报单位(万元) -->
  556. <view class="card-item">
  557. <view class="card-item-name">年度计划投资</view>
  558. <view class="card-item-content">{{item.yearAmt ?? "--"}}</view>
  559. </view>
  560. <!-- 已完成投资(万元)-->
  561. <view class="card-item">
  562. <view class="card-item-name">年度完成投资</view>
  563. <view class="card-item-content">{{item.yearAmtSj ?? "--"}}</view>
  564. </view>
  565. <!-- 当前状态 -->
  566. <view class="card-item">
  567. <view class="card-item-name">项目状态</view>
  568. <view class="card-item-content content-red">{{item.status ?? "--"}}</view>
  569. </view>
  570. <view class="card-item" style="margin-top: 20rpx;">
  571. <view class="item-button" @click="clickItem(item.id)">
  572. 形象进度展示
  573. </view>
  574. </view>
  575. <!-- <view class="card-btn-list">
  576. <view class="button" @click="goToReport('weekly',item.id,item.subName)">
  577. 周报
  578. </view>
  579. <view class="button" @click="goToReport('monthly',item.id,item.subName)">
  580. 月报
  581. </view>
  582. <view class="button" v-if="!item.isAttention"
  583. @click="changeFocus(item.id,item.isAttention)">
  584. 关注
  585. </view>
  586. <view class="button" @click="changeFocus(item.id,item.isAttention)" v-else>
  587. 取消关注
  588. </view>
  589. <view class="button" v-if="item.usersub == 1" @click="goToDetail(item.id,item.subName)">
  590. 特殊查看
  591. </view>
  592. <view class="button" v-else @click="goToDetail(item.id,item.subName)">
  593. 查看
  594. </view>
  595. <view class="button" @click="goToReport('more',item.id,item.subName)">
  596. 更多
  597. </view>
  598. </view> -->
  599. </view>
  600. </view>
  601. </view>
  602. <empty-show v-if="projectList.length===0"></empty-show>
  603. </view>
  604. <!-- <view class="cards-list">
  605. <view class="card only-card">
  606. <view class="card-item first-card-item">
  607. <view class="card-item-name">项目名称</view>
  608. <input v-model="searchInfo.subName" class="card-item-input" placeholder="请填写项目名称"
  609. placeholder-style="color: #D8D8D8" maxlength="20" />
  610. </view>
  611. <view class="card-item" @click="jsxzShowChoose()">
  612. <view class="card-item-name">建设性质</view>
  613. <view class="card-item-description">
  614. <view v-if="searchInfo.propKind">{{searchInfo.propKind}}</view>
  615. <view v-else class="remind-text">请选择性质</view>
  616. <u-icon name="arrow-right" color="#343437" size="16" customStyle="margin-left:10rpx"></u-icon>
  617. </view>
  618. </view>
  619. <view class="card-item" @click="hyflShowChoose()">
  620. <view class="card-item-name">行业分类</view>
  621. <view class="card-item-description">
  622. <view v-if="searchInfo.indusKind">{{searchInfo.indusKind}}</view>
  623. <view v-else class="remind-text">请选择分类</view>
  624. <u-icon name="arrow-right" color="#343437" size="16" customStyle="margin-left:10rpx"></u-icon>
  625. </view>
  626. </view>
  627. <view class="card-item" @click="jsddShowChoose()">
  628. <view class="card-item-name">建设地点</view>
  629. <view class="card-item-description">
  630. <view v-if="searchInfo.subjectId">{{searchInfo.subjectId}}</view>
  631. <view v-else class="remind-text">请选择地点</view>
  632. <u-icon name="arrow-right" color="#343437" size="16" customStyle="margin-left:10rpx"></u-icon>
  633. </view>
  634. </view>
  635. <view class="card-item" @click="xmlxShowChoose()">
  636. <view class="card-item-name">项目类型</view>
  637. <view class="card-item-description">
  638. <view v-if="searchInfo.kind">{{searchInfo.kind}}</view>
  639. <view v-else class="remind-text">请选择类型</view>
  640. <u-icon name="arrow-right" color="#343437" size="16" customStyle="margin-left:10rpx"></u-icon>
  641. </view>
  642. </view>
  643. <view class="card-item" @click="orderShowChoose()">
  644. <view class="card-item-name">按金额排序</view>
  645. <view class="card-item-description">
  646. <view v-if="searchInfo.orderType">{{searchInfo.orderType}}</view>
  647. <view v-else class="remind-text">请选择排序</view>
  648. <u-icon name="arrow-right" color="#343437" size="16" customStyle="margin-left:10rpx"></u-icon>
  649. </view>
  650. </view>
  651. </view>
  652. <view class="search-btn" @click="reSearch()">确定</view>
  653. <view v-for="(item,index) in projectList" :key="index">
  654. <view class="card card-padding" v-if="item.unfold">
  655. <view class="card-item">
  656. <view class="card-item-name">项目名称</view>
  657. <view class="card-item-content">{{item.subName ?? "--"}}</view>
  658. </view>
  659. <view class="card-item">
  660. <view class="card-item-name">总投资(万元)</view>
  661. <view class="card-item-content">{{item.amtTotal ?? "--"}}</view>
  662. </view>
  663. <view class="card-item">
  664. <view class="card-item-name">年度计划投资-申报单位(万元)</view>
  665. <view class="card-item-content">{{item.yearAmt ?? "--"}}</view>
  666. </view>
  667. <view class="card-item">
  668. <view class="card-item-name">已完成投资(万元)</view>
  669. <view class="card-item-content">{{item.yearAmtSj ?? "--"}}</view>
  670. </view>
  671. <view class="card-item">
  672. <view class="card-item-name">当前状态</view>
  673. <view class="card-item-content">{{item.status ?? "--"}}</view>
  674. </view>
  675. <view class="card-item" @click="clickItem(item.id)">
  676. <view class="card-btn fat-btn">形象进度展示</view>
  677. </view>
  678. <view class="card-fold-option"
  679. :class="item.status_fgw === '2' ? 'card-fold-red' :item.status_fgw === '1' ?'card-fold-yellow':''">
  680. <view class="card-fold-count">{{index + 1}} / {{listTotal}}</view>
  681. <view class="card-fold-center" @click.stop="changeFoldItem(false,item.id)">
  682. <view class="card-fold-btn card-unfold-btn"></view>
  683. </view>
  684. <view class="card-fold-chaos"></view>
  685. </view>
  686. </view>
  687. <view class="card-fold" v-else>
  688. {{item.subName ?? "--"}}
  689. <view class="card-fold-option"
  690. :class="item.status_fgw === '2' ? 'card-fold-red' :item.status_fgw === '1' ?'card-fold-yellow':''">
  691. <view class="card-fold-count">{{index + 1}} / {{listTotal}}</view>
  692. <view class="card-fold-center" @click.stop="changeFoldItem(true, item.id)">
  693. <view class="card-fold-btn"></view>
  694. </view>
  695. <view class="card-fold-chaos"></view>
  696. </view>
  697. </view>
  698. </view>
  699. <empty-show v-if="projectList.length===0"></empty-show>
  700. </view> -->
  701. <!-- 开始时间 -->
  702. <u-datetime-picker :show="beginTimeShow" @confirm="beginTimeClose" @cancel="beginTimeClose"
  703. @close="beginTimeClose" v-model="beginDateStart" mode="date" closeOnClickOverlay></u-datetime-picker>
  704. <!-- 结束时间 -->
  705. <u-datetime-picker :show="endTimeShow" @confirm="endTimeClose" @cancel="endTimeClose" @close="endTimeClose"
  706. v-model="beginDateEnd" mode="date" closeOnClickOverlay></u-datetime-picker>
  707. <!-- 行业分类 -->
  708. <u-picker :show="IndustKindShow" :columns="IndustKindList" @confirm="IndustKindClose" @cancel="IndustKindClose"
  709. @close="IndustKindClose" closeOnClickOverlay></u-picker>
  710. <!-- 行业状态 -->
  711. <u-picker :show="statusShow" :columns="statusList" @confirm="statusClose" @cancel="statusClose"
  712. @close="statusClose" closeOnClickOverlay></u-picker>
  713. <!-- 地点选择 -->
  714. <u-picker :show="areaShow" :columns="areaColumns" @confirm="areaClose" @cancel="areaClose" @close="areaClose"
  715. closeOnClickOverlay></u-picker>
  716. <!-- 性质选择 -->
  717. <u-picker :show="xmxzShow" :columns="xmxzColumns" @confirm="xmxzClose" @cancel="xmxzClose" @close="xmxzClose"
  718. closeOnClickOverlay></u-picker>
  719. <!-- 项目类型 -->
  720. <u-picker :show="kindShow" :columns="kindColumns" @confirm="kindClose" @cancel="kindClose" @close="kindClose"
  721. closeOnClickOverlay></u-picker>
  722. <!-- 隐藏状态 -->
  723. <u-picker :show="isHideNameShow" :columns="isHideNameList" @confirm="isHideNameClose" @cancel="isHideNameClose"
  724. @close="isHideNameClose" closeOnClickOverlay></u-picker>
  725. <u-modal :show="modalshow" title="提示" confirmText='退出' content='智慧工地在线正在建设中,请耐心等待!'
  726. @confirm='modalshow = false'></u-modal>
  727. <u-toast ref="uToastRef"></u-toast>
  728. <u-loading-page :loading="loading"></u-loading-page>
  729. </view>
  730. </template>
  731. <style lang="scss" scoped>
  732. .search-btn {
  733. width: 98%;
  734. height: 84rpx;
  735. margin: 40rpx auto 56rpx;
  736. line-height: 84rpx;
  737. text-align: center;
  738. color: #FFFFFF;
  739. font-size: 36rpx;
  740. background: #1763E7;
  741. border-radius: 16rpx;
  742. }
  743. .card {
  744. padding-top: 0;
  745. // overflow: hidden;
  746. .card-value {
  747. position: absolute;
  748. top: 0;
  749. left: 0;
  750. width: 255rpx;
  751. height: 68rpx;
  752. padding-left: 40rpx;
  753. line-height: 68rpx;
  754. color: #1869F6;
  755. font-size: 32rpx;
  756. background: linear-gradient(90deg, #B2CEFF 0%, rgba(219, 232, 255, 0) 100%);
  757. }
  758. .card-online {
  759. position: absolute;
  760. bottom: 0;
  761. right: 0;
  762. width: 422rpx;
  763. height: 68rpx;
  764. padding-right: 40rpx;
  765. text-align: right;
  766. line-height: 68rpx;
  767. color: #00737B;
  768. font-size: 32rpx;
  769. background: linear-gradient(270deg, #96F8FF 0%, rgba(219, 232, 255, 0) 100%);
  770. }
  771. .last-card-item {
  772. margin-bottom: 40rpx
  773. }
  774. }
  775. .card-fold {
  776. position: relative;
  777. width: 100%;
  778. min-height: 152rpx;
  779. margin-bottom: 20rpx;
  780. padding: 24rpx 30rpx 52rpx;
  781. box-sizing: border-box;
  782. background: #FFFFFF;
  783. border-radius: 40rpx;
  784. overflow: hidden;
  785. }
  786. .card-fold-option {
  787. position: absolute;
  788. display: flex;
  789. justify-content: space-between;
  790. align-items: center;
  791. left: 0;
  792. bottom: 0;
  793. width: 100%;
  794. height: 38rpx;
  795. padding: 0 40rpx;
  796. box-sizing: border-box;
  797. background: linear-gradient(270deg, #CADDFF 4%, rgba(219, 232, 255, 0) 100%);
  798. z-index: 999;
  799. .card-fold-count {
  800. flex: 1;
  801. font-size: 28rpx;
  802. color: #1869F6;
  803. }
  804. .card-fold-center {
  805. flex: 1;
  806. .card-fold-btn {
  807. width: 32rpx;
  808. height: 20rpx;
  809. margin: 0 auto;
  810. background-image: url("@/static/icon-fold.png");
  811. background-size: 100% 100%;
  812. }
  813. .card-unfold-btn {
  814. transform: rotate(180deg);
  815. }
  816. }
  817. .card-fold-chaos {
  818. flex: 1;
  819. }
  820. }
  821. .card-fold-red {
  822. background: linear-gradient(270deg, #FF8080 0%, rgba(219, 232, 255, 0) 100%);
  823. .card-fold-count {
  824. color: #FF0000;
  825. }
  826. .card-fold-center {
  827. .card-fold-btn {
  828. background-image: url("@/static/icon-fold-red.png");
  829. }
  830. }
  831. }
  832. .card-fold-yellow {
  833. background: linear-gradient(270deg, #FFAA00 4%, rgba(219, 232, 255, 0) 100%);
  834. .card-fold-count {
  835. color: #E19703;
  836. }
  837. .card-fold-center {
  838. .card-fold-btn {
  839. background-image: url("@/static/icon-fold-yellow.png");
  840. }
  841. }
  842. }
  843. .card-padding {
  844. padding: 16rpx 40rpx 60rpx;
  845. overflow: hidden;
  846. }
  847. .card-name-num{
  848. width: 64rpx;
  849. height: 64rpx;
  850. border-radius:4rpx;
  851. border: 2rpx solid #F4F4F4;
  852. font-size: 24rpx;
  853. color: #B5B5B5;
  854. display: flex;
  855. align-items: center;
  856. justify-content: center;
  857. }
  858. .card .project-layer {
  859. justify-content: flex-start;
  860. .name{
  861. font-weight: 500;
  862. font-size: 28rpx;
  863. color: #222222;
  864. }
  865. }
  866. .card{
  867. padding-top: 20rpx !important;
  868. }
  869. .card .card-status{
  870. top: 32rpx;
  871. height: 64rpx;
  872. background: #F2F7FF;
  873. font-weight: 500;
  874. font-size: 12px;
  875. color: #98B7DC;
  876. }
  877. .status-light{
  878. width: 60rpx !important;
  879. height: 60rpx !important;
  880. position: absolute !important;
  881. right:0;
  882. top: -46rpx !important;
  883. }
  884. .card-item{
  885. .card-item-name{
  886. font-weight: 500;
  887. font-size: 24rpx;
  888. color: #999999;
  889. }
  890. .card-item-content{
  891. font-weight: 500;
  892. font-size: 24rpx;
  893. color: #444444;
  894. }
  895. .content-red{
  896. color:#E02020 !important;
  897. }
  898. }
  899. </style>