parkingInfo.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. <template>
  2. <view>
  3. <u-navbar
  4. :title="title"
  5. title-color="#fff"
  6. :is-back="true"
  7. :custom-back="customBack"
  8. :border-bottom="false"
  9. back-icon-color="#CCE8FF"
  10. :background="{background: 'linear-gradient(99deg, #7A4398 0%, #5A5DB9 100%)' }"></u-navbar>
  11. <u-cell-item class="road-select-cell" icon="map-fill" bg-color="#fff" :border-bottom="false" :title="roadName" :arrow="true" @click="roadSelectShow = true" arrow-direction="right"></u-cell-item>
  12. <u-select v-model="roadSelectShow" :list="roadListData" value-name="roadNo" label-name="roadName" @confirm="roadSelectConfirm"></u-select>
  13. <u-gap height="12" bg-color="#e7e7e7"></u-gap>
  14. <!-- <u-tabs :list="tabList" :is-scroll="false" height="108" bar-width="100" :current="tabCurrent" @change="tabChange"></u-tabs> -->
  15. <!-- <u-gap height="20" bg-color="#F6F6F6"></u-gap> -->
  16. <view class="base-info">
  17. <view class="park-num u-flex u-row-between">
  18. <view class="">
  19. 停车情况:
  20. <text v-if="parkNum.total&&parkNum.remaeNum">已停{{parkNum.total-parkNum.remaeNum}}个;</text>
  21. <text v-if="parkNum.remaeNum">空余{{parkNum.remaeNum}}个</text>
  22. </view>
  23. <!-- <view class="">异常上报</view> -->
  24. </view>
  25. <view class="u-flex u-row-between">
  26. <view class="">
  27. 道闸控制:
  28. <text @click="deviceSelectShow=true;deviceSelectConfirmType='close';deviceSelectTitle='关闸'" style="color: #5198ff;" class="u-m-r-30">关闸</text>
  29. <text @click="deviceSelectShow=true;deviceSelectConfirmType='open';deviceSelectTitle='开闸'" style="color: #dba80f;">开闸</text>
  30. <!-- <u-button type="success" size="mini">关闸</u-button>
  31. <u-button type="success" size="mini" :plain="true">开闸</u-button> -->
  32. </view>
  33. <!-- <text @click="goDeviceList" style="color: #0082FF;">
  34. 出入口信息
  35. <u-icon name="arrow-right" color="#0082FF" size="32" style="vertical-align: middle;"></u-icon>
  36. </text> -->
  37. <text @click="deviceSelectShow=true;deviceSelectConfirmType='report';deviceSelectTitle='异常上报'" style="color: #6b79ff;">异常上报</text>
  38. </view>
  39. </view>
  40. <mescroll-uni ref="mescrollRef01" @init="mescrollInit" :top="config.platform=='h5'?350:450" :down="downOption" @down="downCallback" :up="upOption" @up="upCallback" @emptyclick="emptyClick">
  41. <view class="device-list u-flex u-flex-wrap u-row-start" v-if="dataList.length>1">
  42. <view class="device-list-item u-m-b-24" v-for="item in dataList" :key="item.id">
  43. <view class="top u-text-center">
  44. <view class="space-name">
  45. <text>{{item.vehicleNo}}</text>
  46. <image v-if="item.vehicleNoStatus" class="arrearage-img" src="../../static/img/arrearage.png" mode="heightFix"></image>
  47. </view>
  48. <view class="signal">
  49. <text>{{item.roadwayName}}</text>
  50. </view>
  51. </view>
  52. <view class="carImg-wrap">
  53. <image class="carImg" :src="item.inImage||'../../static/img/default-car.png'" mode="scaleToFill"></image>
  54. </view>
  55. <view class="time">入场:{{item.inTime}}</view>
  56. <view class="time">时长:{{item.parkingTime}}</view>
  57. </view>
  58. </view>
  59. <view v-else class="empty">
  60. <image src="../../static/img/empty.png" mode="widthFix"></image>
  61. <view class="text">该停车场还没有车辆!</view>
  62. </view>
  63. </mescroll-uni>
  64. <u-select
  65. :title="deviceSelectTitle"
  66. v-model="deviceSelectShow"
  67. :list="parkDeviceList"
  68. value-name="roadwayNo"
  69. label-name="roadwayName"
  70. @confirm="deviceSelectConfirm">
  71. </u-select>
  72. </view>
  73. </template>
  74. <script>
  75. import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
  76. export default{
  77. mixins: [MescrollMixin], // 使用mixin (在main.js注册全局组件)
  78. components:{
  79. },
  80. data(){
  81. return{
  82. roadName:'全部停车场',
  83. roadNo:'',
  84. title:"停车场",
  85. downOption:{
  86. auto:false // 不自动加载 (mixin已处理第一个tab触发downCallback)
  87. },
  88. upOption:{
  89. page: {
  90. size: 10 // 每页数据的数量
  91. },
  92. auto:true,
  93. // use:false,
  94. noMoreSize: 4, //如果列表已无数据,可设置列表的总数量要大于半页才显示无更多数据;避免列表数据过少(比如只有一条数据),显示无更多数据会不好看; 默认5
  95. empty:{
  96. tip: '~ 暂无数据 ~', // 提示
  97. // btnText: '去看看'
  98. }
  99. },
  100. dataList:[],
  101. parkNum:{
  102. remaeNum:null,
  103. total:null
  104. },
  105. roadSelectShow:false,
  106. roadListData:[],
  107. parkDeviceList:[],
  108. deviceSelectShow:false,
  109. deviceSelectConfirmType:'',
  110. deviceSelectTitle:'',
  111. }
  112. },
  113. onLoad(page){
  114. console.log('page',page);
  115. if(page.roadName){
  116. this.roadName = page.roadName;
  117. this.title = page.roadName;
  118. }
  119. if(page.roadNo){
  120. this.roadNo = page.roadNo
  121. }
  122. if(page.deviceType){
  123. this.deviceType = page.deviceType
  124. }
  125. this.getRoadList()
  126. },
  127. onShow(){
  128. this.selectParkNum();
  129. },
  130. methods:{
  131. customBack(){
  132. let canNavBack = getCurrentPages();
  133. if(canNavBack && canNavBack.length>1) {
  134. uni.navigateBack({
  135. delta: 1
  136. });
  137. } else {
  138. history.back();
  139. }
  140. },
  141. openPage(path,id) {
  142. this.$u.route({
  143. url: path,
  144. params:{
  145. id:id
  146. }
  147. })
  148. },
  149. goDetails(id){
  150. this.$u.route({
  151. url: 'pages/deviceList/deviceListType3/deviceInfo',
  152. params:{
  153. id:id,
  154. roadNo:this.roadNo,
  155. roadName:this.roadName,
  156. deviceType:this.deviceType,
  157. }
  158. })
  159. },
  160. goDeviceList(){
  161. this.$u.route({
  162. url: 'pages/deviceList/deviceListType3/deviceListType3',
  163. params:{
  164. roadNo:this.roadNo,
  165. roadName:this.roadName,
  166. deviceType:this.deviceType,
  167. }
  168. })
  169. },
  170. /*上拉加载的回调: 其中page.num:当前页 从1开始, page.size:每页数据条数,默认10 */
  171. upCallback(page) {
  172. // console.log('page',page);
  173. let params ={
  174. roadNo:this.roadNo,
  175. deviceType:this.deviceType,//设备类型: 1-地磁 2-车位锁
  176. breakStatus:this.breakStatus,//设备状态:低电量 (3200_b )、 低信号( -100_s)、有故障(0)
  177. pageNum:page.num,
  178. pageSize:page.size
  179. };
  180. this.$u.api.selectParkVehicleList(params).then(curPageData=>{
  181. // console.log('word',word);
  182. console.log('curPageData',curPageData);
  183. //联网成功的回调,隐藏下拉刷新和上拉加载的状态;
  184. this.mescroll.endSuccess(curPageData.data.total);
  185. this.mescroll.endBySize(curPageData.data.rows.length, curPageData.data.total);
  186. //设置列表数据
  187. if(page.num == 1) this.dataList = []; //如果是第一页需手动制空列表
  188. this.dataList=this.dataList.concat(curPageData.data.rows); //追加新数据
  189. console.log('this.dataList',this.dataList);
  190. this.selectParkNum();
  191. }).catch(()=>{
  192. console.log('catch');
  193. //联网失败, 结束加载
  194. this.mescroll.endErr();
  195. })
  196. },
  197. //点击空布局按钮的回调
  198. emptyClick(){
  199. uni.showToast({
  200. title:'点击了按钮,具体逻辑自行实现'
  201. })
  202. },
  203. refresh(){
  204. this.mescroll.resetUpScroll( );
  205. },
  206. selectParkNum(){
  207. if(!this.roadNo){return}
  208. this.$u.api.selectParkNum({roadNo:this.roadNo}).then(res=>{
  209. console.log('selectParkNum',res);
  210. this.parkNum = res.data;
  211. }).catch(()=>{
  212. console.log('catch');
  213. //联网失败, 结束加载
  214. this.mescroll.endErr();
  215. })
  216. },
  217. async getParkDeviceList(){
  218. let params ={
  219. roadNo:this.roadNo,
  220. deviceType:this.deviceType,//设备类型: 1-地磁 2-车位锁
  221. pageNum:1,
  222. pageSize:100
  223. };
  224. let {code,data} = await this.$u.api.selectParkDeviceList(params);
  225. this.parkDeviceList = data.rows
  226. // this.parkDeviceList = data.rows.map(item=>{
  227. // return {
  228. // label: item.roadwayName,
  229. // value: item.roadwayNo
  230. // }
  231. // });
  232. // console.log('this.parkDeviceList',this.parkDeviceList);
  233. },
  234. getRoadList(){
  235. let that = this;
  236. that.$u.api.getRoadList()
  237. .then(res=>{
  238. this.roadListData = res.data.filter(item => item.type== 3);
  239. console.log('this.roadListData111',this.roadListData);
  240. this.roadName = this.roadListData[0].roadName;
  241. this.roadNo = this.roadListData[0].roadNo;
  242. this.mescroll.resetUpScroll();
  243. this.getParkDeviceList()
  244. // console.log('this.getRoadList',res)
  245. }).catch(err=>{
  246. this.$refs.uToast.show({
  247. title: err.msg,
  248. type: 'error',
  249. });
  250. });
  251. },
  252. roadSelectConfirm(e){
  253. // console.log('roadSelectConfirm',e[0]);
  254. this.roadName = e[0].label;
  255. this.roadNo = e[0].value;
  256. console.log('this.roadNo',this.roadNo);
  257. this.mescroll.resetUpScroll();
  258. this.getParkDeviceList()
  259. },
  260. deviceSelectConfirm(e){
  261. console.log('deviceSelectConfirm',e);
  262. console.log('deviceSelectConfirmType',this.deviceSelectConfirmType);
  263. if(this.deviceSelectConfirmType=='close'||this.deviceSelectConfirmType=='open'){
  264. let param = {
  265. roadwayNo:e[0].value,
  266. command:this.deviceSelectConfirmType=='close'?0:1
  267. }
  268. this.$u.api.controlDevice(param).then(res=>{
  269. uni.showToast({
  270. icon:'none',
  271. title:res.msg
  272. })
  273. }).catch(()=>{
  274. console.log('catch');
  275. //联网失败, 结束加载
  276. this.mescroll.endErr();
  277. })
  278. }else if(this.deviceSelectConfirmType=='report'){
  279. let selectItem = this.parkDeviceList.filter(item => item.roadwayNo== e[0].value);
  280. this.$u.route({
  281. url: 'pages/report/report',
  282. params:{
  283. id:selectItem[0].id,
  284. deviceId:selectItem[0].deviceId,
  285. roadNo:selectItem[0].roadNo,
  286. roadName:selectItem[0].roadName,
  287. deviceType:selectItem[0].deviceType,
  288. }
  289. })
  290. }
  291. },
  292. }
  293. }
  294. </script>
  295. <style>
  296. page{background: #F3F3F3;}
  297. </style>
  298. <style lang="scss" scoped>
  299. .device-list{
  300. margin: 24rpx 0;
  301. .device-list-item{
  302. background-color: #fff;
  303. width: 45%;
  304. margin: 0 0 24rpx 3.3%;
  305. padding: 24rpx 15rpx;
  306. border-radius: 13rpx;
  307. .top{
  308. margin-bottom: 20rpx;
  309. .space-name{
  310. color: #212121;
  311. font-size: 30rpx;
  312. line-height: 42rpx;
  313. .arrearage-img{
  314. width: 35rpx;
  315. height: 35rpx;
  316. vertical-align: middle;
  317. margin-left: 8rpx;
  318. }
  319. }
  320. .signal{
  321. font-size: 26rpx;
  322. color: #5B5B5B;
  323. .img{
  324. display: inline-block;
  325. height: 26rpx;
  326. margin-left: 7rpx;
  327. }
  328. }
  329. .low{color: #f00;}
  330. }
  331. .vehicleNo{
  332. height: 42rpx;
  333. font-size: 30rpx;
  334. font-weight: 400;
  335. color: #212121;
  336. line-height: 42rpx;
  337. text-align: center;
  338. }
  339. .carImg-wrap{
  340. height: 229rpx;
  341. width: 100%;
  342. border-radius: 15rpx;
  343. overflow: hidden;
  344. margin: 16rpx auto 18rpx;
  345. text-align: center;
  346. .carImg{
  347. width: 100%;
  348. height: 100%;
  349. // display: block;
  350. }
  351. }
  352. .parkingTime{
  353. height: 37rpx;
  354. font-size: 26rpx;
  355. font-weight: 400;
  356. color: #5B5B5B;
  357. line-height: 37rpx;
  358. margin-bottom: 15rpx;
  359. text-align: center;
  360. }
  361. .time{
  362. text-align: center;
  363. color: #6a6a6a;
  364. font-size: 14rpx;
  365. margin-top: 8rpx;
  366. }
  367. }
  368. }
  369. .base-info{
  370. background-color: #fff;
  371. padding: 30rpx;
  372. .park-num{
  373. text{color: #767676;margin-left: 8rpx;}
  374. padding-bottom: 20rpx;
  375. }
  376. }
  377. .empty{
  378. padding-top: 20vh;
  379. text-align: center;
  380. image{
  381. width: 344rpx;
  382. }
  383. .text{
  384. margin-top: 60rpx;
  385. font-weight: 400;
  386. font-size: 40rpx;
  387. }
  388. }
  389. </style>