parkinglog.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795
  1. <template>
  2. <view class="content">
  3. <u-navbar title="" :is-back="false" :background="{backgroundColor: '#ffffff'}" class="top-navbar">
  4. <text style="position: absolute;z-index: 1;left:40rpx;">停车记录</text>
  5. <u-dropdown ref="filterDropdown">
  6. <u-dropdown-item v-model="selectedParkIdx" :title="selectedParkName" :options="myParkSites" @change="changePark">
  7. <!--
  8. <view class="slot-content dropdown-filter-con">
  9. <view class="filter-item">
  10. <text class="filter-label">出场日期</text>
  11. <view class="filter-date" @tap="showCalendar=true">
  12. <text>{{filter.endDate.length>0?(filter.startDate+' 至 '+filter.endDate):'请选择'}}</text>
  13. <u-icon name="search" style="margin:0rpx 20rpx;"></u-icon>
  14. </view>
  15. </view>
  16. <view class="filter-item">
  17. <text class="filter-label">停车场</text>
  18. <view class="filter-con">
  19. <view @tap="selectedParkVal='all'" class="filter-con-item" :class="{'selected-filter':selectedParkVal=='all'}" data-val="all">全部</view>
  20. <block v-for="(item,index) in myParkSites" :key="item.park_id">
  21. <view @tap="selectedParkVal=item.park_id" class="filter-con-item" :class="{'selected-filter':selectedParkVal==item.park_id}" :data-val="item.park_id">{{item.parking_name.length>7?(item.parking_name.substr(0,7)+'...'):item.parking_name}}</view>
  22. </block>
  23. </view>
  24. </view>
  25. <view class="filter-item">
  26. <text class="filter-label">车牌号</text>
  27. <view style="background-color:#f2f5fa;height:72rpx;margin-top:15rpx;"><u-input type="text" v-model="filter.carNum" :border="false" placeholder="请输入车牌号" :custom-style="filterInputCss" :placeholder-style="filterInputCss.phstyle"/></view>
  28. </view>
  29. <view class="filter-btn">
  30. <view class="filter-btn-reset" @tap="resetFilter">重置</view>
  31. <view class="filter-btn-sure" @tap="sureFilter">确定</view>
  32. </view>
  33. </view>-->
  34. </u-dropdown-item>
  35. </u-dropdown>
  36. </u-navbar>
  37. <u-calendar v-model="showCalendar" mode="range" @change="changeCalendar"></u-calendar>
  38. <!-- <view style="display: flex;align-items: center;">
  39. <u-search placeholder="输入车牌号模糊查找" v-model="filter.carNum" @search="sureFilter" @custom="sureFilter"></u-search>
  40. <u-button type="primary" size="mini" style="margin-left:50rpx;" @tap="batchOff" v-show="false">批量出场</u-button>
  41. </view> -->
  42. <u-tabs :list="tablist" :is-scroll="false" :current="currentTab" @change="changeTab"></u-tabs>
  43. <!--已离场列表 start-->
  44. <view class="tab-con-wrap" v-show="currentTab==0">
  45. <view class="tab-con-header">
  46. <view style="display: flex;align-items: center;padding:10rpx 0rpx;">
  47. <u-icon name="calendar" size="48" color="#5555ff" style="margin:0rpx 40rpx;" @tap="showCalendar=true"></u-icon>
  48. <u-search shape="round" border-color="#72b2ff" placeholder="输入车牌号模糊查找" v-model="filter.carNum" @search="searchHandler('off')" @custom="searchHandler('off')"></u-search>
  49. </view>
  50. </view>
  51. <view class="tab-con-body">
  52. <scroll-view style="padding:20rpx;height:calc(100vh - 170px)" scroll-y="true" @scrolltolower="scrollbtm('off')" v-show="currentTab==0">
  53. <view class="tab-con-item" v-for="(item,index) in offPageData.records" :key="index">
  54. <view class="item-top">
  55. <u-image width="200rpx" height="160rpx" :src="item.car_img" border-radius="5rpx" @click="previewCarPhoto(item.car_img)"></u-image>
  56. <view class="item-top-right">
  57. <view style="margin-bottom: 10rpx;"><text>{{item.parking_name}}</text></view>
  58. <view class="top-right-con">
  59. <view>进场时间:{{item.in_parking_time}}</view>
  60. <view v-if="item.release_status=='1'">离场时间:{{item.out_parking_time}}</view>
  61. <view>停车时长:{{item.parking_time_txt}}</view>
  62. <view>离场方式:{{item.out_type_name}}</view>
  63. <view>缴费金额:{{item.pay_amount?(item.pay_amount+'元'):''}}</view>
  64. </view>
  65. </view>
  66. </view>
  67. <view class="item-footer">
  68. <text class="car-num">{{item.car_num}}</text>
  69. </view>
  70. </view>
  71. <!-- <u-loadmore :status="loadMoreStat"/> -->
  72. <view v-show="offPageData.showMoreTip">
  73. <u-loadmore :status="offPageData.loadMoreStat" :load-text="loadMoreText"/>
  74. </view>
  75. </scroll-view>
  76. </view>
  77. </view>
  78. <!--已离场列表 end-->
  79. <!--未离场列表 start-->
  80. <view class="tab-con-wrap" v-show="currentTab==1">
  81. <view class="tab-con-header">
  82. <view style="display: flex;align-items: center;padding:10rpx 30rpx;">
  83. <u-search shape="round" border-color="#72b2ff" placeholder="输入车牌号模糊查找" v-model="filter.carNum" @search="searchHandler('in')" @custom="searchHandler('in')"></u-search>
  84. </view>
  85. </view>
  86. <view class="tab-con-body">
  87. <scroll-view style="padding:20rpx;height:calc(100vh - 340rpx)" scroll-y="true" @scrolltolower="scrollbtm('in')">
  88. <view class="tab-con-item" v-for="(item,index) in inPageData.records" :key="index">
  89. <view class="item-top">
  90. <u-image width="200rpx" height="160rpx" :src="item.car_img" border-radius="5rpx" @click="previewCarPhoto(item.car_img)"></u-image>
  91. <view class="item-top-right">
  92. <view style="margin-bottom: 10rpx;"><text>{{item.parking_name}}</text></view>
  93. <view class="top-right-con">
  94. <view>进场时间:{{item.in_parking_time}}</view>
  95. <view v-if="item.release_status=='1'">离场时间:{{item.out_parking_time}}</view>
  96. <view>停车时长:{{item.parking_time_txt}}</view>
  97. </view>
  98. </view>
  99. </view>
  100. <view class="item-footer">
  101. <text class="car-num">{{item.car_num}}</text>
  102. <template v-if="item.mark_in">
  103. <u-tag text="已标记在场" type="success" />
  104. <u-button type="warning" size="mini" style="margin:0rpx;" @tap="cancelMarkCarIn(item.id)">取消标记</u-button>
  105. </template>
  106. <template v-else>
  107. <u-button type="primary" size="mini" style="margin:0rpx;" @tap="manualOut(item)">手动出场</u-button>
  108. <u-button type="warning" size="mini" style="margin:0rpx;" @tap="markCarIn(item.id)">标记在场</u-button>
  109. </template>
  110. </view>
  111. </view>
  112. <!-- <u-loadmore :status="loadMoreStat"/> -->
  113. <view v-show="inPageData.showMoreTip">
  114. <u-loadmore :status="inPageData.loadMoreStat" :load-text="loadMoreText"/>
  115. </view>
  116. </scroll-view>
  117. </view>
  118. </view>
  119. <!--未离场列表 end-->
  120. <!--已标记列表 start-->
  121. <view class="tab-con-wrap" v-show="currentTab==2">
  122. <view class="tab-con-header">
  123. <view style="display: flex;align-items: center;padding:10rpx 0rpx;">
  124. <u-button type="primary" size="medium" style="margin:0rpx 10rpx;" @tap="batchOff" v-show="true">批量出场</u-button>
  125. <u-search shape="round" border-color="#72b2ff" placeholder="输入车牌号模糊查找" v-model="filter.carNum" @search="searchHandler('marked')" @custom="searchHandler('marked')"></u-search>
  126. </view>
  127. </view>
  128. <view class="tab-con-body">
  129. <scroll-view style="padding:20rpx;height:calc(100vh - 340rpx);" scroll-y="true" @scrolltolower="scrollbtm('marked')">
  130. <view class="tab-con-item" v-for="(item,index) in markedPageData.records" :key="index">
  131. <view class="item-top">
  132. <u-image width="200rpx" height="160rpx" :src="item.car_img" border-radius="5rpx" @click="previewCarPhoto(item.car_img)"></u-image>
  133. <view class="item-top-right">
  134. <view style="margin-bottom: 10rpx;"><text>{{item.parking_name}}</text></view>
  135. <view class="top-right-con">
  136. <view>进场时间:{{item.in_parking_time}}</view>
  137. <view>停车时长:{{item.parking_time_txt}}</view>
  138. </view>
  139. </view>
  140. </view>
  141. <view class="item-footer">
  142. <text class="car-num">{{item.car_num}}</text>
  143. <u-tag text="已标记在场" type="success" />
  144. <u-button type="warning" size="mini" style="margin:0rpx;" @tap="cancelMarkCarIn(item.id)">取消标记</u-button>
  145. </view>
  146. </view>
  147. <view v-show="markedPageData.showMoreTip">
  148. <u-loadmore :status="markedPageData.loadMoreStat" :load-text="loadMoreText"/>
  149. </view>
  150. </scroll-view>
  151. </view>
  152. </view>
  153. <!--已标记列表 end-->
  154. </view>
  155. </template>
  156. <script>
  157. import * as api from '@/apis/parkinglog.js'
  158. import app from '@/utils/app.js'
  159. export default {
  160. data() {
  161. return {
  162. showCalendar:false,
  163. tablist:[
  164. {
  165. name:'今日已离场'
  166. },
  167. {
  168. name:'未离场'
  169. },
  170. {
  171. name:'已标记'
  172. }
  173. ],
  174. currentTab:0,
  175. loadMoreStat:'loadmore',
  176. showMoreTip:false,
  177. loadMoreText: {
  178. loadmore: '轻轻上拉',
  179. loading: '努力加载中',
  180. nomore: '实在没有了'
  181. },
  182. filter:{
  183. startDate:'',
  184. endDate:'',
  185. carNum:''
  186. },
  187. myParkSites:[],
  188. selectedParkVal:'all',
  189. allParkIds:'',
  190. selectedParkIdx:null,
  191. filterInputCss:{
  192. 'background-color':'#f2f5fa',
  193. 'padding-left':'10rpx',
  194. 'phstyle':'font-size:24rpx;'
  195. },
  196. pagedData:{},
  197. offPageData:{loadMoreStat:'loadmore',showMoreTip:false}, //已离场
  198. inPageData:{loadMoreStat:'loadmore',showMoreTip:false} ,//未离场
  199. markedPageData:{loadMoreStat:'loadmore',showMoreTip:false} //已标记
  200. }
  201. },
  202. onLoad(){
  203. this.loadMyParkSites()
  204. this.changePark()
  205. },
  206. onShow(){
  207. //this.loadPageData(this.getLoadParams(1),false,"in");
  208. //this.loadPageData(this.getLoadParams(1),false,"off");
  209. },
  210. computed:{
  211. selectedParkName(){
  212. let chk=this.myParkSites && this.selectedParkIdx!=null
  213. return chk ? this.myParkSites[this.selectedParkIdx].label:'选择停车场'
  214. }
  215. },
  216. methods: {
  217. getLoadParams(pnum){
  218. let selParkId=this.myParkSites[this.selectedParkIdx].park_id
  219. let status=this.currentTab==0?"off":"in"
  220. let {carNum,startDate:queryStart,endDate:queryEnd}=this.filter
  221. //let parkarg=this.selectedParkVal=="all"?this.allParkIds:this.selectedParkVal;
  222. /*
  223. if(!pnum){
  224. pnum=this.pagedData.pageNum!=null?(this.pagedData.pageNum+1):1;
  225. }*/
  226. return {parkId:selParkId,status,carNum,queryStart,queryEnd,pageNum:pnum,pageSize:10};
  227. },
  228. checkHadMore(offType){
  229. let rst=null
  230. if(offType=="off"){
  231. rst=this.offPageData.pageNum<this.offPageData.pageCount;
  232. this.offPageData.showMoreTip=true;
  233. this.offPageData.loadMoreStat=rst?'loadmore':'nomore';
  234. }
  235. else if(offType=="in"){
  236. rst=this.inPageData.pageNum<this.inPageData.pageCount;
  237. this.inPageData.showMoreTip=true;
  238. this.inPageData.loadMoreStat=rst?'loadmore':'nomore';
  239. }
  240. else if(offType=="marked"){
  241. rst=this.markedPageData.pageNum<this.markedPageData.pageCount;
  242. this.markedPageData.showMoreTip=true;
  243. this.markedPageData.loadMoreStat=rst?'loadmore':'nomore';
  244. }
  245. return rst;
  246. },
  247. changePark(val){
  248. //console.log(val)
  249. this.loadPageData(this.getLoadParams(1),false,"in");
  250. this.loadPageData(this.getLoadParams(1),false,"off");
  251. this.loadMarked(this.getLoadParams(1),false)
  252. },
  253. changeTab(idx){
  254. this.currentTab=idx;
  255. },
  256. searchHandler(type){
  257. //3个搜索框的搜索处理
  258. if(type=="off"){ //已离场
  259. this.loadPageData(this.getLoadParams(1),false,"off")
  260. }
  261. else if(type=="in"){
  262. this.loadPageData(this.getLoadParams(1),false,"in")
  263. }
  264. else if(type=="marked"){
  265. this.loadMarked(this.getLoadParams(1),false)
  266. }
  267. },
  268. changeCalendar(e){
  269. this.filter.startDate=e.startDate;
  270. this.filter.endDate=e.endDate;
  271. //日期查询目前只用于已离场
  272. this.loadPageData(this.getLoadParams(1),false,"off");
  273. },
  274. scrollbtm(offType){
  275. console.log('scroll btm')
  276. if(!this.checkHadMore(offType)){
  277. return;
  278. }
  279. let pnum=1;
  280. if(offType=="off"){
  281. this.offPageData.loadMoreStat='loading';
  282. pnum=this.offPageData.pageNum+1;
  283. this.loadPageData(this.getLoadParams(pnum),true,offType)
  284. }
  285. else if(offType=="in"){
  286. this.inPageData.loadMoreStat='loading';
  287. pnum=this.inPageData.pageNum+1;
  288. this.loadPageData(this.getLoadParams(pnum),true,offType)
  289. }
  290. else if(offType=="marked"){
  291. this.markedPageData.loadMoreStat='loading';
  292. pnum=this.markedPageData.pageNum+1;
  293. this.loadMarked(this.getLoadParams(pnum),true)
  294. }
  295. },
  296. loadMyParkSites(){
  297. //本地缓存中获取停车场,需刷新首页才能更新
  298. let pks=api.getMyParkSites();
  299. if(!pks){
  300. return;
  301. }
  302. let ids=[];
  303. pks.forEach(function(item,index){
  304. ids.push(item.park_id);
  305. item['value']=index;
  306. item['label']=item.parking_name;
  307. });
  308. this.allParkIds=ids.join(",");
  309. this.myParkSites=pks;
  310. this.selectedParkIdx=0;
  311. },
  312. loadMarked(param,moreLoad){
  313. //加载已标记记录
  314. let offType='marked'
  315. uni.showLoading({
  316. title:'加载中...'
  317. });
  318. api.loadMarked(param).then(resp=>{
  319. uni.hideLoading()
  320. //console.log(resp)
  321. if(!resp.success){
  322. uni.showToast({
  323. title:resp.msg||'加载已标记数据失败',
  324. icon:'none'
  325. })
  326. return;
  327. }
  328. let pagedData=resp.data.pagedData
  329. this.parseDatas(pagedData);
  330. if(moreLoad && this.markedPageData && this.markedPageData.records){
  331. pagedData.records=this.markedPageData.records.concat(pagedData.records)
  332. }
  333. pagedData.showMoreTip=this.markedPageData.showMoreTip
  334. pagedData.loadMoreStat=this.markedPageData.loadMoreStat
  335. this.markedPageData=pagedData
  336. this.renderSortTab(pagedData,offType);
  337. this.checkHadMore(offType);
  338. }).catch(err=>{
  339. console.log(err)
  340. uni.hideLoading()
  341. uni.showToast({
  342. title:'加载已标记数据出错',
  343. icon:'none'
  344. })
  345. })
  346. },
  347. loadPageData(param,moreLoad,offType){
  348. uni.showLoading({
  349. title:'加载中...'
  350. });
  351. param.status=offType
  352. api.loadPageData(param).then(resp => {
  353. //console.log(resp)
  354. uni.hideLoading();
  355. if(!resp.success){
  356. uni.showToast({
  357. title:resp.msg||'加载数据失败',
  358. icon:'none'
  359. })
  360. return;
  361. }
  362. let pagedData=resp.data.pagedData;
  363. this.parseDatas(pagedData);
  364. if(offType=="off"){ //查询已离场数据结果
  365. if(moreLoad){
  366. pagedData.records=pagedData.records?this.offPageData.records.concat(pagedData.records):this.offPageData.records;
  367. }
  368. pagedData.showMoreTip=this.offPageData.showMoreTip
  369. pagedData.loadMoreStat=this.offPageData.loadMoreStat
  370. this.offPageData=pagedData
  371. }
  372. else{ //未离场
  373. if(moreLoad){
  374. pagedData.records=pagedData.records?this.inPageData.records.concat(pagedData.records):this.inPageData.records;
  375. }
  376. pagedData.showMoreTip=this.inPageData.showMoreTip
  377. pagedData.loadMoreStat=this.inPageData.loadMoreStat
  378. this.inPageData=pagedData
  379. }
  380. this.renderSortTab(pagedData,offType);
  381. this.checkHadMore(offType);
  382. }).catch(error => {
  383. console.log(error)
  384. uni.hideLoading();
  385. });
  386. },
  387. renderSortTab(pageMode,offType){ //rptData
  388. let [tab1,tab2,tab3]=this.tablist
  389. if(offType=="off"){
  390. let tmpname=this.filter.startDate && this.filter.startDate!=''?'已离场':'今日已离场';
  391. tab1={name:`${tmpname}(${pageMode.total!=null?pageMode.total:0})`}
  392. }
  393. else if(offType=="in"){
  394. tab2={name:`未离场(${pageMode.total!=null?pageMode.total:0})`}
  395. }
  396. else if(offType=="marked"){
  397. tab3={name:`已标记(${pageMode.total!=null?pageMode.total:0})`}
  398. }
  399. this.tablist=[tab1,tab2,tab3]
  400. },
  401. parseDatas(respData){
  402. respData['pageNum']=respData.current;
  403. respData['pageCount']=respData.pages;
  404. respData['pageSize']=respData.size;
  405. let outTypeOpt={'1':'手动抬杆','2':'手动移出','3':'缴费离场','4':'VIP会员'}
  406. let datas=respData.records;
  407. let tmp=null,pkh=null;
  408. datas.forEach((item) => {
  409. tmp=item.release_status=='0'?item.cal_parking_time:item.parking_time;
  410. tmp=!tmp?0:tmp;
  411. pkh=Math.floor(tmp/60);
  412. item['parking_time_txt']=pkh>0?(pkh.toFixed(0)+"小时"+(tmp-pkh*60)+"分钟"):(tmp+"分钟");
  413. item['car_img']=item.release_status=='0'?item.in_image:item.out_image;
  414. if(!item['car_img']){
  415. item['car_img']='../../static/img/def_car.png';
  416. }
  417. item['out_type_name']=outTypeOpt[item['out_type']] || '';
  418. item['pay_amount']=item['pay_amount']?item['pay_amount'].toFixed(2):null;
  419. //item['out_type']=='3' &&
  420. });
  421. },
  422. previewCarPhoto(img){
  423. let array = [];
  424. array.push(img);
  425. uni.previewImage({
  426. urls: array,
  427. current: array[0]
  428. });
  429. },
  430. manualOut(record){
  431. let con=`确定要对车辆【${record.car_num}](停车${record.parking_time_txt})进行手动出场吗?`;
  432. uni.showModal({
  433. title:'手动出场确认',
  434. content:con,
  435. success:(res)=>{
  436. if (res.confirm) {
  437. this.manualOutSubmit(record.id)
  438. } else if (res.cancel) {
  439. console.log('用户取消手动出场');
  440. }
  441. }
  442. })
  443. },
  444. manualOutSubmit(recordId){
  445. api.manualOut(recordId,app.takeSetting('user_id')).then(resp=>{
  446. if(!resp.success){
  447. uni.showToast({
  448. title:resp.msg||'手动出场失败',
  449. icon:'none'
  450. })
  451. return;
  452. }
  453. uni.showToast({
  454. title:'操作成功',
  455. icon:'success'
  456. })
  457. //避免成功提示跳过
  458. setTimeout(()=>{
  459. //let pn=this.inPageData.pageNum
  460. this.loadPageData(this.getLoadParams(1),false,'in') //刷新当前页
  461. this.loadPageData(this.getLoadParams(1),false,'off')
  462. },1000)
  463. }).catch(err=>{
  464. console.log(err)
  465. uni.showToast({
  466. title:'手动出场出错',
  467. icon:'none'
  468. })
  469. })
  470. },
  471. markCarIn(recordId){
  472. api.markCarIn(recordId,app.takeSetting('user_id')).then(resp=>{
  473. if(!resp.success){
  474. uni.showToast({
  475. title:resp.msg||'标记车辆失败',
  476. icon:'none'
  477. })
  478. return;
  479. }
  480. uni.showToast({
  481. title:'标记成功',
  482. icon:'success'
  483. })
  484. setTimeout(()=>{
  485. //let pn=this.inPageData.pageNum
  486. this.loadPageData(this.getLoadParams(1),false,'in')
  487. this.loadMarked(this.getLoadParams(1),false)
  488. },1000)
  489. }).catch(err=>{
  490. uni.showToast({
  491. title:'标记车辆出错',
  492. icon:'none'
  493. })
  494. })
  495. },
  496. cancelMarkCarIn(recordId){
  497. api.cancelMarkCarIn(recordId,app.takeSetting('user_id')).then(resp=>{
  498. if(!resp.success){
  499. uni.showToast({
  500. title:resp.msg||'取消标记失败',
  501. icon:'none'
  502. })
  503. return;
  504. }
  505. uni.showToast({
  506. title:'取消标记成功',
  507. icon:'success'
  508. })
  509. setTimeout(()=>{
  510. //let pn=this.inPageData.pageNum
  511. this.loadPageData(this.getLoadParams(1),false,'in')
  512. this.loadMarked(this.getLoadParams(1),false)
  513. },1000)
  514. }).catch(err=>{
  515. uni.showToast({
  516. title:'取消标记出错',
  517. icon:'none'
  518. })
  519. })
  520. },
  521. batchOff(){
  522. if(!this.selectedParkVal || this.selectedParkVal=='all' || this.selectedParkVal==''){
  523. uni.showModal({
  524. title:'操作提示',
  525. content:'请先选择1个停车场(不可多选),再继续',
  526. showCancel:false
  527. })
  528. return
  529. }
  530. else{
  531. let parkObj=this.myParkSites.find(itm=>itm.park_id==this.selectedParkVal)
  532. uni.showModal({
  533. title:'操作提示',
  534. content:`提交前请确认选择的停车场【${parkObj.parking_name}】,且已完成该停车场的标记`,
  535. showCancel:true,
  536. success:(res)=>{
  537. if (res.confirm) {
  538. this.batchOffSubmit();
  539. } else if (res.cancel) {
  540. console.log('用户点击取消');
  541. }
  542. }
  543. })
  544. }
  545. },
  546. batchOffSubmit(){
  547. }
  548. }
  549. }
  550. </script>
  551. <style>
  552. page{
  553. background-color: #f4f4f4;
  554. overflow: hidden;
  555. }
  556. .top-navbar/deep/ .u-slot-content{
  557. justify-content: space-between;
  558. padding:0rpx;
  559. }
  560. .top-navbar/deep/ .u-dropdown__menu{
  561. justify-content: flex-end;
  562. }
  563. .top-navbar/deep/ .u-dropdown__menu .u-dropdown__menu__item{
  564. flex:none;
  565. margin-right: 40rpx;
  566. }
  567. .top-navbar/deep/ .u-dropdown__menu__item__text{
  568. color:#0055ff !important;
  569. }
  570. .top-navbar{
  571. font-size:28rpx;
  572. }
  573. uni-scroll-view{
  574. box-sizing: border-box;
  575. }
  576. .tab-con-item{
  577. background-color: #ffffff;
  578. border-radius: 10rpx;
  579. padding:20rpx;
  580. margin-bottom: 20rpx;
  581. }
  582. .tab-con-item .item-top{
  583. padding:0rpx;
  584. display: flex;
  585. flex-flow: row nowrap;
  586. justify-content:flex-start;
  587. align-items: center;
  588. margin-bottom: 10rpx;
  589. }
  590. .tab-con-item .item-top-right{
  591. display: flex;
  592. flex-flow: column nowrap;
  593. justify-content:space-between;
  594. margin-left:20rpx;
  595. }
  596. .tab-con-item .item-top-right>text{
  597. color:#000000;
  598. margin-bottom:20rpx;
  599. }
  600. .tab-con-item .item-top-right .top-right-con{
  601. font-size:24rpx;
  602. }
  603. .tab-con-item .item-top-right .top-right-con>view{
  604. margin-bottom:10rpx;
  605. }
  606. .tab-con-item .item-footer{
  607. display: flex;
  608. flex-flow: row nowrap;
  609. justify-content:space-between;
  610. align-items: center;
  611. font-size:24rpx;
  612. }
  613. .tab-con-item .item-footer .car-num{
  614. font-size:28rpx;
  615. font-weight: bold;
  616. }
  617. .tab-con-item .item-footer .item-footer-btn{
  618. padding:10rpx 15rpx;
  619. color:#ffffff;
  620. background-color: #185AC6;
  621. border-radius: 6rpx;
  622. }
  623. .dropdown-filter-con{
  624. display: flex;
  625. flex-direction: column;
  626. align-items: flex-start;
  627. justify-content: center;
  628. padding:20rpx 0rpx 0rpx;
  629. box-sizing: border-box;
  630. background-color: #fafafa;
  631. font-size: 26rpx;
  632. }
  633. .filter-item{
  634. width:100%;
  635. padding:0rpx 20rpx 30rpx;
  636. }
  637. .filter-item .filter-label{
  638. /* font-family: '楷体'; */
  639. }
  640. .filter-item .uni-input-wrapper{
  641. background-color: #f2f5fa;
  642. }
  643. .filter-date{
  644. width:100%;
  645. height:72rpx;
  646. line-height: 55rpx;
  647. background-color: #f2f5fa;
  648. margin-top: 20rpx;
  649. display: flex;
  650. align-items:center;
  651. padding-left:10rpx;
  652. }
  653. .filter-date text{
  654. flex:1;
  655. }
  656. .filter-con{
  657. display: flex;
  658. flex-flow: row wrap;
  659. justify-content:flex-start;
  660. align-items: center;
  661. margin-top: 20rpx;
  662. }
  663. .filter-con .filter-con-item{
  664. padding:10rpx 10rpx;
  665. text-align: center;
  666. background-color: #f2f5fa;
  667. /* color:#ffffff; */
  668. /* height: 45rpx; */
  669. width:28vw;
  670. margin-right: 3vw;
  671. margin-bottom: 20rpx;
  672. }
  673. .filter-con .selected-filter{
  674. background-color: #185ac6;
  675. color:#ffffff;
  676. }
  677. .filter-btn{
  678. display: flex;
  679. flex-flow: row wrap;
  680. justify-content:flex-start;
  681. align-items: center;
  682. height: 80rpx;
  683. width:100vw;
  684. border-top:1px solid #f2f2f2;
  685. }
  686. .filter-btn-reset{
  687. flex:1;
  688. text-align: center;
  689. line-height: 80rpx;
  690. background-color: #f2f2f2;
  691. }
  692. .filter-btn-sure{
  693. flex:2;
  694. text-align: center;
  695. background-color: #185ac6;
  696. color:#ffffff;
  697. line-height: 80rpx;
  698. }
  699. </style>