parkinglog.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852
  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" lower-threshold="0.5" @scrolltolower="scrollbtm('off')">
  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 v-if="item.out_type=='3'">缴费金额:{{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" lower-threshold="0.5" @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 10rpx;">
  124. <u-button type="primary" size="medium" style="margin:0rpx 10rpx;" @tap="batchOff" v-show="false">批量出场</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" lower-threshold="0.5" @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. loadingMore:false,
  183. filter:{
  184. startDate:'',
  185. endDate:'',
  186. carNum:''
  187. },
  188. myParkSites:[],
  189. selectedParkVal:'all',
  190. allParkIds:'',
  191. selectedParkIdx:null,
  192. filterInputCss:{
  193. 'background-color':'#f2f5fa',
  194. 'padding-left':'10rpx',
  195. 'phstyle':'font-size:24rpx;'
  196. },
  197. pagedData:{},
  198. offPageData:{loadMoreStat:'loadmore',showMoreTip:false}, //已离场
  199. inPageData:{loadMoreStat:'loadmore',showMoreTip:false} ,//未离场
  200. markedPageData:{loadMoreStat:'loadmore',showMoreTip:false} //已标记
  201. }
  202. },
  203. onLoad(){
  204. this.loadMyParkSites()
  205. this.changePark()
  206. },
  207. onShow(){
  208. //this.loadPageData(this.getLoadParams(1),false,"in");
  209. //this.loadPageData(this.getLoadParams(1),false,"off");
  210. },
  211. computed:{
  212. selectedParkName(){
  213. let chk=this.myParkSites && this.selectedParkIdx!=null
  214. return chk ? this.myParkSites[this.selectedParkIdx].label:'选择停车场'
  215. }
  216. },
  217. methods: {
  218. getLoadParams(pnum){
  219. let selParkId=this.myParkSites[this.selectedParkIdx].park_id
  220. let status=this.currentTab==0?"off":"in"
  221. let {carNum,startDate:queryStart,endDate:queryEnd}=this.filter
  222. //let parkarg=this.selectedParkVal=="all"?this.allParkIds:this.selectedParkVal;
  223. /*
  224. if(!pnum){
  225. pnum=this.pagedData.pageNum!=null?(this.pagedData.pageNum+1):1;
  226. }*/
  227. return {parkId:selParkId,status,carNum,queryStart,queryEnd,pageNum:pnum,pageSize:10};
  228. },
  229. checkHadMore(offType){
  230. let rst=null
  231. if(offType=="off"){
  232. rst=this.offPageData.pageNum<this.offPageData.pageCount;
  233. this.offPageData.showMoreTip=true;
  234. this.offPageData.loadMoreStat=rst?'loadmore':'nomore';
  235. }
  236. else if(offType=="in"){
  237. rst=this.inPageData.pageNum<this.inPageData.pageCount;
  238. this.inPageData.showMoreTip=true;
  239. this.inPageData.loadMoreStat=rst?'loadmore':'nomore';
  240. }
  241. else if(offType=="marked"){
  242. rst=this.markedPageData.pageNum<this.markedPageData.pageCount;
  243. this.markedPageData.showMoreTip=true;
  244. this.markedPageData.loadMoreStat=rst?'loadmore':'nomore';
  245. }
  246. return rst;
  247. },
  248. changePark(val){
  249. //console.log(val)
  250. this.loadPageData(this.getLoadParams(1),false,"in");
  251. this.loadPageData(this.getLoadParams(1),false,"off");
  252. this.loadMarked(this.getLoadParams(1),false)
  253. },
  254. changeTab(idx){
  255. this.currentTab=idx;
  256. },
  257. searchHandler(type){
  258. //3个搜索框的搜索处理
  259. if(type=="off"){ //已离场
  260. this.loadPageData(this.getLoadParams(1),false,"off")
  261. }
  262. else if(type=="in"){
  263. this.loadPageData(this.getLoadParams(1),false,"in")
  264. }
  265. else if(type=="marked"){
  266. this.loadMarked(this.getLoadParams(1),false)
  267. }
  268. },
  269. changeCalendar(e){
  270. this.filter.startDate=e.startDate;
  271. this.filter.endDate=e.endDate;
  272. //日期查询目前只用于已离场
  273. this.loadPageData(this.getLoadParams(1),false,"off");
  274. },
  275. scrollbtm(offType){
  276. //console.log('scroll btm')
  277. //触底事件会反复触发,会导致同时发出多个相同请求,需要同步控制
  278. /*if(this.loadingMore){
  279. return;
  280. }
  281. this.loadingMore=true;
  282. */
  283. if(!this.checkHadMore(offType)){
  284. return;
  285. }
  286. let pnum=1;
  287. if(offType=="off" && this.offPageData.loadMoreStat!='loading'){
  288. this.offPageData.loadMoreStat='loading';
  289. pnum=this.offPageData.pageNum+1;
  290. this.loadPageData(this.getLoadParams(pnum),true,offType)
  291. }
  292. else if(offType=="in" && this.inPageData.loadMoreStat!='loading'){
  293. this.inPageData.loadMoreStat='loading';
  294. pnum=this.inPageData.pageNum+1;
  295. this.loadPageData(this.getLoadParams(pnum),true,offType)
  296. }
  297. else if(offType=="marked" && this.markedPageData.loadMoreStat!='loading'){
  298. this.markedPageData.loadMoreStat='loading';
  299. pnum=this.markedPageData.pageNum+1;
  300. this.loadMarked(this.getLoadParams(pnum),true)
  301. }
  302. },
  303. loadMyParkSites(){
  304. //本地缓存中获取停车场,需刷新首页才能更新
  305. let pks=api.getMyParkSites();
  306. if(!pks){
  307. return;
  308. }
  309. let ids=[];
  310. pks.forEach(function(item,index){
  311. ids.push(item.park_id);
  312. item['value']=index;
  313. item['label']=item.parking_name;
  314. });
  315. this.allParkIds=ids.join(",");
  316. this.myParkSites=pks;
  317. this.selectedParkIdx=0;
  318. },
  319. loadMarked(param,moreLoad){
  320. //加载已标记记录
  321. let offType='marked'
  322. if(!moreLoad){
  323. this.markedPageData.records=[] //避免加载失败后旧数据还在显示
  324. }
  325. uni.showLoading({
  326. title:'加载中...'
  327. });
  328. api.loadMarked(param).then(resp=>{
  329. uni.hideLoading()
  330. //console.log(resp)
  331. if(!resp.success){
  332. uni.showToast({
  333. title:resp.msg||'加载已标记数据失败',
  334. icon:'none'
  335. })
  336. return;
  337. }
  338. let pagedData=resp.data.pagedData
  339. this.parseDatas(pagedData);
  340. if(moreLoad && this.markedPageData && this.markedPageData.records){
  341. pagedData.records=this.markedPageData.records.concat(pagedData.records)
  342. }
  343. pagedData.showMoreTip=this.markedPageData.showMoreTip
  344. pagedData.loadMoreStat=this.markedPageData.loadMoreStat
  345. this.markedPageData=pagedData
  346. this.checkHadMore(offType);
  347. this.renderSortTab(pagedData,offType);
  348. }).catch(err=>{
  349. console.log(err)
  350. uni.hideLoading()
  351. uni.showToast({
  352. title:'加载已标记数据出错',
  353. icon:'none'
  354. })
  355. })
  356. },
  357. loadPageData(param,moreLoad,offType){
  358. uni.showLoading({
  359. title:'加载中...'
  360. });
  361. param.status=offType
  362. api.loadPageData(param).then(resp => {
  363. //console.log(resp)
  364. uni.hideLoading();
  365. if(!resp.success){
  366. uni.showToast({
  367. title:resp.msg||'加载数据失败',
  368. icon:'none'
  369. })
  370. return;
  371. }
  372. let pagedData=resp.data.pagedData;
  373. this.parseDatas(pagedData);
  374. if(offType=="off"){ //查询已离场数据结果
  375. if(moreLoad){
  376. pagedData.records=pagedData.records?this.offPageData.records.concat(pagedData.records):this.offPageData.records;
  377. }
  378. pagedData.showMoreTip=this.offPageData.showMoreTip
  379. pagedData.loadMoreStat=this.offPageData.loadMoreStat
  380. this.offPageData=pagedData
  381. }
  382. else{ //未离场
  383. if(moreLoad){
  384. pagedData.records=pagedData.records?this.inPageData.records.concat(pagedData.records):this.inPageData.records;
  385. }
  386. pagedData.showMoreTip=this.inPageData.showMoreTip
  387. pagedData.loadMoreStat=this.inPageData.loadMoreStat
  388. this.inPageData=pagedData
  389. }
  390. this.renderSortTab(pagedData,offType);
  391. this.checkHadMore(offType);
  392. }).catch(error => {
  393. console.log(error)
  394. uni.hideLoading();
  395. });
  396. },
  397. renderSortTab(pageMode,offType){ //rptData
  398. let [tab1,tab2,tab3]=this.tablist
  399. if(offType=="off"){
  400. let tmpname=this.filter.startDate && this.filter.startDate!=''?'已离场':'今日已离场';
  401. tab1={name:`${tmpname}(${pageMode.total!=null?pageMode.total:0})`}
  402. }
  403. else if(offType=="in"){
  404. tab2={name:`未离场(${pageMode.total!=null?pageMode.total:0})`}
  405. }
  406. else if(offType=="marked"){
  407. tab3={name:`已标记(${pageMode.total!=null?pageMode.total:0})`}
  408. }
  409. this.tablist=[tab1,tab2,tab3]
  410. },
  411. parseDatas(respData){
  412. respData['pageNum']=respData.current;
  413. respData['pageCount']=respData.pages;
  414. respData['pageSize']=respData.size;
  415. let outTypeOpt={'1':'手动抬杆','2':'手动移出','3':'缴费离场','4':'VIP会员'}
  416. let datas=respData.records;
  417. let tmp=null,pkh=null;
  418. datas.forEach((item) => {
  419. tmp=item.release_status=='0'?item.cal_parking_time:item.parking_time;
  420. tmp=!tmp?0:tmp;
  421. pkh=Math.floor(tmp/60);
  422. item['parking_time_txt']=pkh>0?(pkh.toFixed(0)+"小时"+(tmp-pkh*60)+"分钟"):(tmp+"分钟");
  423. item['car_img']=item.release_status=='0'?item.in_image:item.out_image;
  424. if(!item['car_img']){
  425. item['car_img']='../../static/img/def_car.png';
  426. }
  427. item['out_type_name']=outTypeOpt[item['out_type']] || '';
  428. item['pay_amount']=item['pay_amount']?item['pay_amount'].toFixed(2):null;
  429. //item['out_type']=='3' &&
  430. });
  431. },
  432. previewCarPhoto(img){
  433. let array = [];
  434. array.push(img);
  435. uni.previewImage({
  436. urls: array,
  437. current: array[0]
  438. });
  439. },
  440. manualOut(record){
  441. let con=`确定要对车辆【${record.car_num}](停车${record.parking_time_txt})进行手动出场吗?`;
  442. uni.showModal({
  443. title:'手动出场确认',
  444. content:con,
  445. success:(res)=>{
  446. if (res.confirm) {
  447. this.manualOutSubmit(record.id)
  448. } else if (res.cancel) {
  449. console.log('用户取消手动出场');
  450. }
  451. }
  452. })
  453. },
  454. manualOutSubmit(recordId){
  455. api.manualOut(recordId,app.takeSetting('user_id')).then(resp=>{
  456. if(!resp.success){
  457. uni.showToast({
  458. title:resp.msg||'手动出场失败',
  459. icon:'none'
  460. })
  461. return;
  462. }
  463. uni.showToast({
  464. title:'操作成功',
  465. icon:'success'
  466. })
  467. //避免成功提示跳过
  468. setTimeout(()=>{
  469. //let pn=this.inPageData.pageNum
  470. this.loadPageData(this.getLoadParams(1),false,'in') //刷新当前页
  471. this.loadPageData(this.getLoadParams(1),false,'off')
  472. },1000)
  473. }).catch(err=>{
  474. console.log(err)
  475. uni.showToast({
  476. title:'手动出场出错',
  477. icon:'none'
  478. })
  479. })
  480. },
  481. markCarIn(recordId){
  482. api.markCarIn(recordId,app.takeSetting('user_id')).then(resp=>{
  483. if(!resp.success){
  484. uni.showToast({
  485. title:resp.msg||'标记车辆失败',
  486. icon:'none'
  487. })
  488. return;
  489. }
  490. uni.showToast({
  491. title:'标记成功',
  492. icon:'success'
  493. })
  494. setTimeout(()=>{
  495. //let pn=this.inPageData.pageNum
  496. this.loadPageData(this.getLoadParams(1),false,'in')
  497. this.loadMarked(this.getLoadParams(1),false)
  498. },1000)
  499. }).catch(err=>{
  500. uni.showToast({
  501. title:'标记车辆出错',
  502. icon:'none'
  503. })
  504. })
  505. },
  506. cancelMarkCarIn(recordId){
  507. api.cancelMarkCarIn(recordId,app.takeSetting('user_id')).then(resp=>{
  508. if(!resp.success){
  509. uni.showToast({
  510. title:resp.msg||'取消标记失败',
  511. icon:'none'
  512. })
  513. return;
  514. }
  515. uni.showToast({
  516. title:'取消标记成功',
  517. icon:'success'
  518. })
  519. setTimeout(()=>{
  520. //let pn=this.inPageData.pageNum
  521. this.loadPageData(this.getLoadParams(1),false,'in')
  522. this.loadMarked(this.getLoadParams(1),false)
  523. },1000)
  524. }).catch(err=>{
  525. uni.showToast({
  526. title:'取消标记出错',
  527. icon:'none'
  528. })
  529. })
  530. },
  531. batchOff(){
  532. let markedCount=this.markedPageData ? this.markedPageData.total :0
  533. if(markedCount<=0){
  534. uni.showToast({
  535. title:'还未标记任何车辆',
  536. icon:'none'
  537. })
  538. return
  539. }
  540. let selPark=this.myParkSites?this.myParkSites[this.selectedParkIdx]:null
  541. if(!selPark){
  542. uni.showToast({
  543. title:'还未选择停车场',
  544. icon:'none'
  545. })
  546. return
  547. }
  548. if(this.markedPageData.records[0].park_id != selPark.park_id){
  549. uni.showModal({
  550. title:'操作提示',
  551. content:'标记车辆所在停车场与选择的停车场不一致',
  552. showCancel:false
  553. })
  554. return
  555. }
  556. uni.showModal({
  557. title:'批量出场确认',
  558. content:`请确认信息:停车场【${selPark.parking_name}】,已完成标记数【${markedCount}】`,
  559. showCancel:true,
  560. success:(res)=>{
  561. if (res.confirm) {
  562. this.batchOffSubmit(selPark.park_id);
  563. } else if (res.cancel) {
  564. console.log('用户点击取消');
  565. }
  566. }
  567. })
  568. },
  569. batchOffSubmit(parkId){
  570. uni.showLoading({
  571. title:'处理中...',
  572. mask:true
  573. });
  574. api.batchOffUnmarked(parkId).then(resp=>{
  575. uni.hideLoading()
  576. if(!resp.success){
  577. uni.showToast({
  578. title:resp.msg||'批量出场失败',
  579. icon:'none'
  580. })
  581. return;
  582. }
  583. uni.showToast({
  584. title:'批量出场成功',
  585. icon:'success'
  586. })
  587. setTimeout(()=>{
  588. this.changePark()
  589. },1000)
  590. }).catch(err=>{
  591. uni.hideLoading()
  592. console.log(err)
  593. uni.showToast({
  594. title:'批量出场失败',
  595. icon:'none'
  596. })
  597. })
  598. }
  599. }
  600. }
  601. </script>
  602. <style>
  603. page{
  604. background-color: #f4f4f4;
  605. overflow: hidden;
  606. }
  607. .top-navbar/deep/ .u-slot-content{
  608. justify-content: space-between;
  609. padding:0rpx;
  610. }
  611. .top-navbar/deep/ .u-dropdown__menu{
  612. justify-content: flex-end;
  613. }
  614. .top-navbar/deep/ .u-dropdown__menu .u-dropdown__menu__item{
  615. flex:none;
  616. margin-right: 40rpx;
  617. }
  618. .top-navbar/deep/ .u-dropdown__menu__item__text{
  619. color:#0055ff !important;
  620. }
  621. .top-navbar{
  622. font-size:28rpx;
  623. }
  624. uni-scroll-view{
  625. box-sizing: border-box;
  626. }
  627. .tab-con-item{
  628. background-color: #ffffff;
  629. border-radius: 10rpx;
  630. padding:20rpx;
  631. margin-bottom: 20rpx;
  632. }
  633. .tab-con-item .item-top{
  634. padding:0rpx;
  635. display: flex;
  636. flex-flow: row nowrap;
  637. justify-content:flex-start;
  638. align-items: center;
  639. margin-bottom: 10rpx;
  640. }
  641. .tab-con-item .item-top-right{
  642. display: flex;
  643. flex-flow: column nowrap;
  644. justify-content:space-between;
  645. margin-left:20rpx;
  646. }
  647. .tab-con-item .item-top-right>text{
  648. color:#000000;
  649. margin-bottom:20rpx;
  650. }
  651. .tab-con-item .item-top-right .top-right-con{
  652. font-size:24rpx;
  653. }
  654. .tab-con-item .item-top-right .top-right-con>view{
  655. margin-bottom:10rpx;
  656. }
  657. .tab-con-item .item-footer{
  658. display: flex;
  659. flex-flow: row nowrap;
  660. justify-content:space-between;
  661. align-items: center;
  662. font-size:24rpx;
  663. }
  664. .tab-con-item .item-footer .car-num{
  665. font-size:28rpx;
  666. font-weight: bold;
  667. }
  668. .tab-con-item .item-footer .item-footer-btn{
  669. padding:10rpx 15rpx;
  670. color:#ffffff;
  671. background-color: #185AC6;
  672. border-radius: 6rpx;
  673. }
  674. .dropdown-filter-con{
  675. display: flex;
  676. flex-direction: column;
  677. align-items: flex-start;
  678. justify-content: center;
  679. padding:20rpx 0rpx 0rpx;
  680. box-sizing: border-box;
  681. background-color: #fafafa;
  682. font-size: 26rpx;
  683. }
  684. .filter-item{
  685. width:100%;
  686. padding:0rpx 20rpx 30rpx;
  687. }
  688. .filter-item .filter-label{
  689. /* font-family: '楷体'; */
  690. }
  691. .filter-item .uni-input-wrapper{
  692. background-color: #f2f5fa;
  693. }
  694. .filter-date{
  695. width:100%;
  696. height:72rpx;
  697. line-height: 55rpx;
  698. background-color: #f2f5fa;
  699. margin-top: 20rpx;
  700. display: flex;
  701. align-items:center;
  702. padding-left:10rpx;
  703. }
  704. .filter-date text{
  705. flex:1;
  706. }
  707. .filter-con{
  708. display: flex;
  709. flex-flow: row wrap;
  710. justify-content:flex-start;
  711. align-items: center;
  712. margin-top: 20rpx;
  713. }
  714. .filter-con .filter-con-item{
  715. padding:10rpx 10rpx;
  716. text-align: center;
  717. background-color: #f2f5fa;
  718. /* color:#ffffff; */
  719. /* height: 45rpx; */
  720. width:28vw;
  721. margin-right: 3vw;
  722. margin-bottom: 20rpx;
  723. }
  724. .filter-con .selected-filter{
  725. background-color: #185ac6;
  726. color:#ffffff;
  727. }
  728. .filter-btn{
  729. display: flex;
  730. flex-flow: row wrap;
  731. justify-content:flex-start;
  732. align-items: center;
  733. height: 80rpx;
  734. width:100vw;
  735. border-top:1px solid #f2f2f2;
  736. }
  737. .filter-btn-reset{
  738. flex:1;
  739. text-align: center;
  740. line-height: 80rpx;
  741. background-color: #f2f2f2;
  742. }
  743. .filter-btn-sure{
  744. flex:2;
  745. text-align: center;
  746. background-color: #185ac6;
  747. color:#ffffff;
  748. line-height: 80rpx;
  749. }
  750. </style>