orderStatus.vue 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950
  1. <template>
  2. <view class="container-view">
  3. <view class="time-info">
  4. <!-- order_status 0 待支付(可重新调起支付)1 已预约成功(未取车、激活电池则为取车)2 待激活 (可以激活电池)3 使用中(可续费、还车)
  5. 4 已逾期(可续费)5 还车申请中(待确认)6 还车中,等待门店取车 7 车辆已归还 8 订单已支付,已取消 9 订单未支付已取消
  6. 以及拖车工单状态
  7. workInfo.status 0 待商家确认拖车服务, 1门店拖车中, 2订单已结束, 3已取消拖车服务-->
  8. <!-- 拖车订单状态优先展示 -->
  9. <view v-if="workInfo.status">
  10. <view v-if="workInfo.status == 0">待商家确认拖车服务</view>
  11. <view v-else-if="workInfo.status == 1">门店拖车中</view>
  12. <!-- <view v-else-if="workInfo.status == 2">拖车服务已取消</view> -->
  13. <view v-else-if="workInfo.status == 2">订单已结束</view>
  14. </view>
  15. <view v-else>
  16. <view v-if="orderInfo.order_status == 1">
  17. {{orderInfo.return_type == 1?('请于'+tools.formatTimeSecond(orderInfo.hire_begin_time)+'到门店取车'):('将于'+tools.formatTimeSecond(orderInfo.hire_begin_time)+'送车上门')}}
  18. </view>
  19. <view v-else-if="orderInfo.order_status == 2">请上传车辆图片激活车辆</view>
  20. <view v-else-if="orderInfo.order_status == 3" class="blue-text">使用中...</view>
  21. <view v-else-if="orderInfo.order_status == 4" class="red-text">已逾期</view>
  22. <view v-else-if="orderInfo.order_status == 5">待门店确认</view>
  23. <view v-else-if="orderInfo.order_status == 6">还车中,等待门店取车</view>
  24. <view v-else-if="orderInfo.order_status == 7">已完成</view>
  25. <view v-else-if="orderInfo.order_status == 8||orderInfo.order_status == 9">已取消</view>
  26. <view v-else>
  27. <text>待支付 剩余</text>
  28. <u-count-down bg-color="none" font-size="50" :show-day="false" :timestamp="timer"
  29. @end="loadEnd"></u-count-down>
  30. </view>
  31. </view>
  32. <view class="time-money">
  33. <view class="flex-row flex-between">
  34. <view class="money-item">
  35. <view :class="orderInfo.order_status == 4?'red-status':''">
  36. {{orderInfo.hire_duration_time.day > 0 ? orderInfo.hire_duration_time.day :'' }}<text
  37. v-if="orderInfo.hire_duration_time.day>0">日</text>{{orderInfo.hire_duration_time.hour > 0 ? orderInfo.hire_duration_time.hour :'' }}<text
  38. v-if="orderInfo.hire_duration_time.hour>0">小时</text>{{orderInfo.hire_duration_time.minute > 0 ? orderInfo.hire_duration_time.minute :'' }}<text
  39. v-if="orderInfo.hire_duration_time.minute>0">分</text>
  40. </view>
  41. <view v-if="(orderInfo.order_status == 2&&orderInfo.hire_type==2) || orderInfo.order_status == 3">租期剩余</view>
  42. <view v-else-if="orderInfo.order_status == 4" class="red-status">逾期时长</view>
  43. <view v-else>租借周期</view>
  44. <!-- <view
  45. v-if="(orderInfo.order_status != 2&&orderInfo.hire_type==1) && orderInfo.order_status != 3 && orderInfo.order_status != 4">
  46. 租借周期</view> -->
  47. </view>
  48. <view class="money-item">
  49. <view :class="orderInfo.order_status == 4?'red-status':''">
  50. {{orderInfo.order_status == 4?tools.toFix(over_fee/100):tools.toFix(orderInfo.hire_money / 100)}}<text>元</text>
  51. </view>
  52. <view v-if="orderInfo.order_status == 4" class="red-status">逾期金额</view>
  53. <view v-else>订单金额</view>
  54. </view>
  55. <view @tap="bindExpanded">
  56. <text>{{isExpanded?'收起':'展开'}}</text>
  57. <img
  58. :src="isExpanded?'https://qiniu.bms16.com/FvRah8ro91B_TUVEmInBq6n69W2f':'https://qiniu.bms16.com/FtbxPP0aXYG8hyJTEJfNTXa_Puuc'" />
  59. </view>
  60. </view>
  61. <view v-if="isExpanded" class="dashed-border"></view>
  62. <view v-if="isExpanded">
  63. <view v-if="workInfo.status">
  64. <view class="big-text">拖车信息</view>
  65. <view class="sn-content flex-row flex-between">
  66. <view class="sn-title">拖车位置</view>
  67. <view class="sn-text" style="width: 420rpx;">{{workInfo.address}}</view>
  68. </view>
  69. <view class="sn-content flex-row flex-between">
  70. <view class="sn-title">还车门店</view>
  71. <view class="sn-text">{{workInfo.shop_name}}</view>
  72. </view>
  73. <view class="sn-content flex-row flex-between">
  74. <view class="sn-title">拖车距离</view>
  75. <view class="sn-text">{{tools.toFix(workInfo.distance/1000)}}KM</view>
  76. </view>
  77. <view class="sn-content flex-row flex-between">
  78. <view class="sn-title">拖车费用<image @tap="isShowDragMoney = true" class="chargeinfo_img"
  79. src="https://qiniu.bms16.com/FjJufAn7ewzRY0kfM2ABUoq7YeSk"></image>
  80. </view>
  81. <view class="sn-text">¥{{tools.toFix(workInfo.money/100)}}</view>
  82. </view>
  83. <view class="sn-content flex-row flex-between">
  84. <view class="sn-title">支付方式</view>
  85. <view v-if="workInfo.pay_type == 0" class="sn-text">微信支付</view>
  86. <view v-if="workInfo.pay_type == 2" class="sn-text">支付宝支付</view>
  87. <view v-if="workInfo.pay_type == 9" class="sn-text">钱包余额支付</view>
  88. </view>
  89. </view>
  90. <view class="big-text">订单信息</view>
  91. <view class="sn-content flex-row flex-between">
  92. <view class="sn-title">订单编号</view>
  93. <view class="sn-text">{{orderInfo.order_sn}}</view>
  94. </view>
  95. <view v-if="orderInfo.order_status == 0" class="sn-content flex-row flex-between">
  96. <view class="sn-title">下单时间</view>
  97. <view class="sn-text">{{tools.formatTime(orderInfo.ctime)}}</view>
  98. </view>
  99. <view v-if="orderInfo.order_status == 8||orderInfo.order_status == 9"
  100. class="sn-content flex-row flex-between">
  101. <view class="sn-title">取消时间</view>
  102. <view class="sn-text">{{tools.formatTime(orderInfo.close_time)}}</view>
  103. </view>
  104. <view v-if="(orderInfo.order_status == 8||orderInfo.order_status == 9)&&orderInfo.close_reason!=''"
  105. class="sn-content flex-row flex-between">
  106. <view class="sn-title">取消原因</view>
  107. <view class="sn-text">{{orderInfo.close_reason}}</view>
  108. </view>
  109. <view v-if="orderInfo.order_status != 8&&orderInfo.order_status != 9&&orderInfo.pay_time!=0"
  110. class="sn-content flex-row flex-between">
  111. <view class="sn-title">支付时间</view>
  112. <view class="sn-text">{{tools.formatTime(orderInfo.pay_time)}}</view>
  113. </view>
  114. <view v-if="orderInfo.order_status != 8&&orderInfo.order_status != 9"
  115. class="sn-content flex-row flex-between">
  116. <view class="sn-title">支付方式</view>
  117. <view v-if="orderInfo.pay_type == 0" class="sn-text">微信支付</view>
  118. <view v-if="orderInfo.pay_type == 2" class="sn-text">支付宝支付</view>
  119. <view v-if="orderInfo.pay_type == 9" class="sn-text">钱包余额支付</view>
  120. </view>
  121. <view v-if="orderInfo.order_status != 8&&orderInfo.order_status != 9"
  122. class="sn-content flex-row flex-between">
  123. <view class="sn-title">押金金额</view>
  124. <view class="sn-text flex-row">
  125. <text :class="orderInfo.pay_with_pledge == 5?'none-text':''">¥{{orderInfo.deposit / 100}}</text>
  126. <view v-if="orderInfo.pay_with_pledge == 5" style="margin-left: 20rpx;">0</view>
  127. </view>
  128. </view>
  129. <view v-if="orderInfo.order_status != 8&&orderInfo.order_status != 9"
  130. class="sn-content flex-row flex-between">
  131. <view class="sn-title">押金类型</view>
  132. <view v-if="orderInfo.pay_with_pledge == 1" class="sn-text">不需要押金</view>
  133. <view v-if="orderInfo.pay_with_pledge == 2" class="sn-text">线上支付</view>
  134. <view v-if="orderInfo.pay_with_pledge == 3" class="sn-text">押金已退</view>
  135. <view v-if="orderInfo.pay_with_pledge == 4" class="sn-text">已申请退押金</view>
  136. <view v-if="orderInfo.pay_with_pledge == 5" class="sn-text">支付宝信用免押</view>
  137. <view v-if="orderInfo.pay_with_pledge == 6" class="sn-text">支付宝免押已解约</view>
  138. <view v-if="orderInfo.pay_with_pledge == 7" class="sn-text">平台信任免押</view>
  139. <!-- <view v-if="orderInfo.pay_with_pledge == 6" class="sn-text flex-row">
  140. <text>已退回</text>
  141. <view class="g-border"></view>
  142. ¥{{orderInfo.deposit}} 充值押金
  143. </view> -->
  144. </view>
  145. <view v-if="orderInfo.order_status != 8&&orderInfo.order_status != 9&&orderInfo.insurance != 0"
  146. class="sn-content flex-row flex-between">
  147. <view class="sn-title">保险金额</view>
  148. <view class="sn-text">¥{{orderInfo.insurance / 100}}
  149. </view>
  150. </view>
  151. <view v-if="orderInfo.order_status != 8&&orderInfo.order_status != 9&&orderInfo.total_cabinet_order_money != 0"
  152. class="sn-content flex-row flex-between">
  153. <view class="sn-title">换电金额</view>
  154. <view class="sn-text">¥{{orderInfo.total_cabinet_order_money / 100}}
  155. </view>
  156. </view>
  157. <view v-if="orderInfo.order_status == 5||orderInfo.order_status == 6"
  158. class="sn-content flex-row flex-between">
  159. <view class="sn-title">归还时间</view>
  160. <view class="sn-text">{{tools.formatTime(orderInfo.return_time)}}</view>
  161. </view>
  162. <view v-if="orderInfo.order_status == 7&&orderInfo.return_time!=0"
  163. class="sn-content flex-row flex-between">
  164. <view class="sn-title">完成时间</view>
  165. <view class="sn-text">{{tools.formatTime(orderInfo.return_time)}}</view>
  166. </view>
  167. </view>
  168. </view>
  169. </view>
  170. <view class="show_mark_container" v-if="isShowDragMoney">
  171. <view class="pop_content">
  172. <view class="show_title">拖车费用说明</view>
  173. <view class="pop_foo">
  174. <view class="show_info_content flex-row flex-between">
  175. <view>起步费(含{{charge_standard.start_mil}}km)</view>
  176. <view>¥{{charge_standard.start_price}}</view>
  177. </view>
  178. <view class="show_info_content flex-row flex-between">
  179. <view>
  180. <view>公里费({{charge_standard.actual_start_mil}}km)</view>
  181. <view class="show_info_tips">
  182. 超出起步范围的距离,每{{charge_standard.step_mil}}公里{{charge_standard.step_price}}元
  183. </view>
  184. </view>
  185. <view>¥{{charge_standard.over_start_price}}</view>
  186. </view>
  187. </view>
  188. <view class="row-btn">
  189. <view class="left-btn" @tap="isShowDragMoney = false">我知道了</view>
  190. </view>
  191. </view>
  192. </view>
  193. <view class="car-info">
  194. <view>车辆信息</view>
  195. <view class="car-top flex-row flex-between">
  196. <view class="top-flex">
  197. <view>{{modelInfo.car_model}}</view>
  198. <view>续航{{modelInfo.endurance}}|重量{{modelInfo.weight}}</view>
  199. </view>
  200. <img
  201. :src="modelInfo.model_images!=''?modelInfo.model_images[0]:'https://qiniu.bms16.com/FhEvnKUckAHPtWaC04mi2s53IEVj'" />
  202. </view>
  203. </view>
  204. <view v-if="orderInfo.battery_sn!=''" class="exchange-info">
  205. <view class="flex-row flex-between">
  206. <view class="exchange-info-title">换电信息</view>
  207. <view @tap="navToExchange" class="flex-row" style="margin-bottom: 28rpx;">
  208. <view class="exchange-button">已换电<text>{{orderInfo.used_exchange_num}}</text>次</view>
  209. <image src="https://qiniu.bms16.com/FpIN7AVzFU75slFlX-SIdnSEmn1k" style="width: 28rpx;height: 28rpx;" />
  210. </view>
  211. </view>
  212. <view class="exchange-content">本单您可享受{{orderInfo.gift_exchange_num}}次免费换电,
  213. 当前免费换电剩余{{(orderInfo.gift_exchange_num - orderInfo.used_exchange_num) > 0 ? (orderInfo.gift_exchange_num - orderInfo.used_exchange_num) : '0' }}次,超出后需要单独支付换电费用
  214. </view>
  215. </view>
  216. <!-- <view v-if="orderInfo.pay_with_pledge != 1" class="deposit-info">
  217. <view>车辆押金</view>
  218. <view v-if="orderInfo.pay_with_pledge == 5" class="selected-deposit">
  219. <view class="deposit-item flex-row" style="align-items: center;">
  220. <view>支付宝芝麻信用</view>
  221. </view>
  222. <view class="blue-text" style="font-size: 32rpx;">免押</view>
  223. </view>
  224. <view
  225. v-if="orderInfo.pay_with_pledge == 2 || orderInfo.pay_with_pledge == 3 || orderInfo.pay_with_pledge == 4"
  226. class="selected-deposit">
  227. <view class="deposit-item flex-row">
  228. <view>押金租借</view>
  229. </view>
  230. <view class="blue-text" style="font-size: 36rpx;">
  231. ¥{{orderInfo.deposit / 100}}</view>
  232. </view>
  233. </view> -->
  234. <view v-if="orderInfo.hire_begin_time!=0&&orderInfo.hire_end_time!=0" class="return-info">
  235. <view class="return-top flex-row flex-between">
  236. <view>取还时间</view>
  237. <view>
  238. 共{{orderInfo.hire_return_time.day > 0 ? orderInfo.hire_return_time.day :'' }}<text
  239. v-if="orderInfo.hire_return_time.day>0">日</text>{{orderInfo.hire_return_time.hour > 0 ? orderInfo.hire_return_time.hour :'' }}<text
  240. v-if="orderInfo.hire_return_time.hour>0">小时</text>{{orderInfo.hire_return_time.minute > 0 ? orderInfo.hire_return_time.minute :'' }}<text
  241. v-if="orderInfo.hire_return_time.minute>0">分</text>
  242. </view>
  243. </view>
  244. <view class="return-bottom flex-row">
  245. <view>{{tools.formatTimeDate(orderInfo.hire_begin_time)}}</view>
  246. <img src="https://qiniu.bms16.com/FoXmBbj7YGWmjyeuVEY35nzieqnx" />
  247. <view>{{tools.formatTimeDate(orderInfo.hire_end_time)}}</view>
  248. </view>
  249. </view>
  250. <view v-if="orderInfo.return_type == 1" class="method-info">
  251. <view>自行去门店取还</view>
  252. <view class="method-item flex-row">
  253. <img
  254. :src="shopInfo.shop_image!=[]?shopInfo.shop_image[0]:'https://qiniu.bms16.com/FrfV4epBPSzUJNmTNWJ5z6vG_ScM'" />
  255. <view @tap="bindToNav" class="flex-row flex-between" style="width: 75%;">
  256. <view class="item-center">
  257. <view>{{shopInfo.shop_name}}</view>
  258. <view>{{shopInfo.address}}</view>
  259. <view class="flex-row" style="align-items: center;">
  260. <img src="https://qiniu.bms16.com/FlGVpR2fdrD1GfeHfDgt-dUMgkOq" />
  261. {{shopInfo.work_begin_time!=''&&shopInfo.work_end_time!=''?shopInfo.work_begin_time+'-'+shopInfo.work_end_time:'-'}}
  262. </view>
  263. </view>
  264. <view class="item-bottom flex-row flex-column" style="align-items: center;">
  265. <img src="https://qiniu.bms16.com/FqCVS_ihJb8IuxeJNGaqC6NKhYMY" />
  266. <view>{{shopInfo.distance}}</view>
  267. </view>
  268. </view>
  269. </view>
  270. </view>
  271. <view v-if="insurance_status != 0" class="guarantee-info flex-row flex-between">
  272. <view>保障服务</view>
  273. <view class="flex-row">
  274. <img v-if="orderInfo.order_status==2||orderInfo.order_status==3"
  275. src="https://qiniu.bms16.com/FnFvHiZzSKIve3qMEvtTuvtwgRch" />
  276. <img v-else src="https://qiniu.bms16.com/FpvVEi-w3d0jxwFmwZyw9Zf9EweG" />
  277. <!-- insurance_status 0 无保险 1 生效中 2 待生效 3 已失效 -->
  278. <text v-if="insurance_status == 1">已生效</text>
  279. <text v-else-if="insurance_status == 2">待生效</text>
  280. <text v-else>已失效</text>
  281. </view>
  282. </view>
  283. <view v-if="orderInfo.order_status==2||orderInfo.order_status==3||orderInfo.order_status==4"
  284. class="overdue-info">
  285. <view>逾期规则</view>
  286. <view class="overdue-one">
  287. <view>1. 逾期后还可用车吗?</view>
  288. <view>如果逾期将触发智能锁车逻辑,可能导致您无法正常用车,请及时续费或联系商家处理。</view>
  289. </view>
  290. <view class="overdue-two">
  291. <view>2. 逾期费计算标准是什么?</view>
  292. <view>小时租逾期费=每小时费用*逾期小时;当日还/日/周/月/季租逾期费=每天费用*逾期天数;如果不满1小时按1小时算,不满1天按1天算,最终收取的逾期费以门店确认的费用为准</view>
  293. </view>
  294. <view class="overdue-thr">
  295. <view>3. 逾期后续租如何收费?</view>
  296. <view>逾期后及时续租不收取逾期费,逾期时长将从续租订单的用车时间中抵扣</view>
  297. </view>
  298. </view>
  299. <!-- 考虑为空的情况 -->
  300. <view v-if="cancelInfo.cancel_setting.length != 0 && cancelInfo.cancel_setting" class="remove-info">
  301. <view>预约取消政策</view>
  302. <view class="remove-title flex-row">
  303. <view>预约取消时间</view>
  304. <view>扣费标准</view>
  305. </view>
  306. <view v-for="(item,index) in cancelInfo.cancel_setting" :key="index" class="remove-text flex-row">
  307. <view>支付{{item.hour}}小时内</view>
  308. <view v-if="item.hour-0 >= 0.1">扣除{{item.percent}}%租金总金额</view>
  309. <view v-else>免费取消</view>
  310. </view>
  311. </view>
  312. <view class="assort-info">
  313. <view>配套服务</view>
  314. <view class="assort-box flex-row">
  315. <view v-for="(item,index) in serviceList" :key="index" class="assort-text"
  316. :class="{'even-item': index % 2 !== 0, 'odd-item': index % 2 === 0}">
  317. {{item}}
  318. </view>
  319. </view>
  320. </view>
  321. <view class="payment-info flex-row flex-between">
  322. <view v-if="orderInfo.order_status == 1" class="flex-row"> <!-- 待取车 -->
  323. <view class="cancel" @tap="clickCancel">取消订单</view>
  324. <view @tap="callPhone" class="deposit-btn w_224">门店/客服</view>
  325. <view v-if="orderInfo.return_type == 1" @tap="navToInput" class="sesame-btn w_288">立即用车</view>
  326. <view v-else class="sesame-btn-s w_288">待商家送车</view>
  327. <!-- <view class="sesame-btn">待商家送车</view> -->
  328. </view>
  329. <view v-else-if="orderInfo.order_status == 2" class="flex-row"> <!-- 待激活 -->
  330. <!-- <view class="cancel">更多操作</view> -->
  331. <view class="cancel" @tap="clickCancel">取消订单</view>
  332. <view @tap="callPhone" class="deposit-btn w_224">门店/客服</view>
  333. <view @tap="navToActive" class="sesame-btn w_288">激活车辆</view>
  334. </view>
  335. <view v-else-if="orderInfo.order_status == 3" class="flex-row"> <!-- 使用中 -->
  336. <!-- <view class="cancel">更多操作</view> -->
  337. <view @tap="bindBattery" class="deposit-btn w_254">用车</view>
  338. <view @tap="bindRenew" class="sesame-btn w_418">我要续租</view>
  339. </view>
  340. <view v-else-if="orderInfo.order_status == 4" class="flex-row"> <!-- 已逾期 -->
  341. <!-- <view class="cancel">更多操作</view> -->
  342. <view @tap="callPhone" class="deposit-btn w_254">门店/客服</view>
  343. <view @tap="bindRenew" class="sesame-btn w_418">我要续租</view>
  344. </view>
  345. <view v-else-if="orderInfo.order_status == 5||orderInfo.order_status == 6" @tap="callPhone" class="pay-btn">
  346. 联系门店</view> <!-- 待门店确认||还车中,等待门店取车 -->
  347. <view v-else-if="orderInfo.order_status == 7" @tap="bindToHome" class="pay-btn">返回首页</view> <!-- 已完成 -->
  348. <!-- <view v-else-if="orderInfo.order_status == 7" class="pay-btn">去评价</view> -->
  349. <view v-else-if="orderInfo.order_status == 8||orderInfo.order_status == 9" class="pay-btn" @tap="callPhone">
  350. 门店/客服</view> <!-- 已取消 -->
  351. <view v-else class="to-pay flex-row flex-between"> <!-- 待支付 -->
  352. <allPrice :amount="waitMoney"></allPrice>
  353. <view class="bottom-right flex-row">
  354. <view @tap="clickCancel">取消订单</view>
  355. <view @tap="bindToPay">立即支付</view>
  356. </view>
  357. </view>
  358. </view>
  359. <view v-if="isShowCancel" class="cancel-b">
  360. <view class="cancel-box">
  361. <view class="cancel-title flex-row flex-between">
  362. <view>选择取消原因</view>
  363. <view @tap="isShowCancel = false" style="font-size: 60rpx;">×</view>
  364. </view>
  365. <view @tap="bindCancel" data-status="1" class="cancel-item flex-row flex-between">
  366. <view>行程变更无需用车</view>
  367. <img
  368. :src="reason == 1?'https://qiniu.bms16.com/FhWimtmWybKlYMB6mgIReVWArbfq':'https://qiniu.bms16.com/Fh0JH6_QbiXYmVy7FNYnDkVIGvLC'" />
  369. </view>
  370. <view @tap="bindCancel" data-status="2" class="cancel-item flex-row flex-between">
  371. <view>修改订单信息</view>
  372. <img
  373. :src="reason == 2?'https://qiniu.bms16.com/FhWimtmWybKlYMB6mgIReVWArbfq':'https://qiniu.bms16.com/Fh0JH6_QbiXYmVy7FNYnDkVIGvLC'" />
  374. </view>
  375. <view @tap="bindCancel" data-status="3" class="cancel-item flex-row flex-between">
  376. <view>不想要了</view>
  377. <img
  378. :src="reason == 3?'https://qiniu.bms16.com/FhWimtmWybKlYMB6mgIReVWArbfq':'https://qiniu.bms16.com/Fh0JH6_QbiXYmVy7FNYnDkVIGvLC'" />
  379. </view>
  380. </view>
  381. </view>
  382. <view v-if="isShowPrice" class="show_mark_patment">
  383. <view class="payment-info" style="border-radius: 32rpx 32rpx 0rpx 0rpx;">
  384. <view class="pay_money">
  385. <view class="flex-row flex-between">
  386. <view>价格明细</view>
  387. <view>
  388. <image style="width: 32rpx;height: 32rpx;" @tap="isShowPrice = false"
  389. src="https://qiniu.bms16.com/FtoTEHOJiUf_gjPCJGGHMsAtHI5M" />
  390. </view>
  391. </view>
  392. <view class="flex-row flex-between">
  393. <view>拖车费用</view>
  394. <view>¥{{charge_list.fare}}</view>
  395. </view>
  396. <view class="flex-row flex-between">
  397. <view>优惠金额</view>
  398. <view>-¥0.00</view>
  399. </view>
  400. <view class="charge_money_info">
  401. <view>支付金额</view>
  402. <view>¥{{charge_list.fare}}</view>
  403. </view>
  404. </view>
  405. <view class="pay_line"></view>
  406. <view class="pay_info">
  407. <view class="payment-top flex-row">
  408. <img @tap="isArgee = !isArgee"
  409. :src="isArgee?'https://qiniu.bms16.com/FhWimtmWybKlYMB6mgIReVWArbfq':'https://qiniu.bms16.com/FkmDjxBNZhFGFU5inza2usdtDlX8'" />
  410. 已阅读并同意
  411. <text>《小众电动车租赁用户协议》</text>
  412. </view>
  413. <view class="payment-bottom flex-row flex-between">
  414. <view class="bottom-left flex-row">
  415. <view>¥{{charge_list.fare}}</view>
  416. <view @tap="isShowPrice = false">明细<img
  417. src="https://qiniu.bms16.com/Fvl1d-AWRvwY_ehNrw7bMZOK6LBZ" /></view>
  418. </view>
  419. <view @tap="navToPage" data-url="/pages/orderStatus/orderStatus">立即支付</view>
  420. </view>
  421. </view>
  422. </view>
  423. </view>
  424. </view>
  425. </template>
  426. <script module="tools" lang="wxs" src="@/pages/common/wxs/tools.wxs"></script>
  427. <script module="tools" lang="sjs" src="@/pages/common/wxs/tools.sjs"></script>
  428. <script>
  429. var config = require('../../common/config.js');
  430. var common = require('../../common/common.js');
  431. var http = require('../../common/http.js');
  432. var storage = require('../../common/storage.js');
  433. var user = require('../../common/user.js');
  434. var appWhiteListFilter = require('../../common/appWhiteListFilter.js');
  435. import allPrice from '@/component/allPrice/allPrice';
  436. export default {
  437. components: {
  438. allPrice,
  439. },
  440. data() {
  441. return {
  442. isJumpReturn:false,
  443. isReturnHome:true,
  444. return_imgs: {},
  445. charge_standard: {},
  446. isShowDragMoney: false, // 是否显示拖车费用弹框
  447. work_sn: '',
  448. workInfo: {}, // 拖车工单信息
  449. isShowCancel: false,
  450. order_sn: '',
  451. cancelInfo: {
  452. cancel_setting: [],
  453. },
  454. reason: 0,
  455. orderInfo: {},
  456. modelInfo: {},
  457. shopInfo: {
  458. shop_image: [],
  459. },
  460. serviceList: [],
  461. waitMoney: '',
  462. longitude: '',
  463. latitude: '',
  464. shop_image: [],
  465. isExpanded: false,
  466. isShowPrice: false,
  467. timer: '',
  468. isSelectStatus: 1,
  469. price_list: [], //车辆价格 hire_duration_unit 1 日 4 小时 6 周
  470. insurance_status: 0,
  471. over_fee:0,//逾期金额
  472. plate_number: '',
  473. isScanCondeRentalCar: ''
  474. };
  475. },
  476. /**
  477. * 生命周期函数--监听页面加载
  478. */
  479. onLoad: function(options) {
  480. const myLocation = uni.getStorageSync('user_current_location')
  481. this.isJumpReturn = options.isJumpReturn ? false : true
  482. this.order_sn = options.order_sn || ''
  483. this.work_sn = options.work_sn || ''
  484. this.longitude = options.longitude ? options.longitude : (myLocation ? myLocation.longitude : '')
  485. this.latitude = options.latitude ? options.latitude : (myLocation ? myLocation.latitude : '')
  486. if (appWhiteListFilter.isScanCondeRentalCar()) {
  487. this.setData({
  488. isScanCondeRentalCar: true
  489. })
  490. }
  491. this.bindOrderInfo()
  492. },
  493. /**
  494. * 生命周期函数--监听页面显示
  495. */
  496. onShow: function() {
  497. this.isReturnHome = true
  498. },
  499. onUnload: function () {
  500. if(this.isReturnHome && this.isJumpReturn){
  501. uni.switchTab({
  502. url: '/pages/my/my' // 假设首页的路径是/pages/home/home
  503. });
  504. }
  505. },
  506. computed: {},
  507. methods: {
  508. bindOrderInfo() {
  509. const me = this
  510. if (!me.work_sn && !me.order_sn) return common.simpleToast('车辆订单不存在!')
  511. http.postApi(config.API_DAYHIRE_HIRE_ORDER_INFO, {
  512. work_sn: me.work_sn,
  513. order_sn: me.order_sn,
  514. longitude: me.longitude,
  515. latitude: me.latitude,
  516. }, (resp) => {
  517. if (resp.data.code === 200) {
  518. me.cancelInfo = resp.data.data.cancel_info
  519. me.cancelInfo.cancel_setting = resp.data.data.cancel_info.cancel_cost_setting || []
  520. me.orderInfo = resp.data.data.order_info
  521. me.modelInfo = resp.data.data.model_info
  522. me.modelInfo.model_images = me.modelInfo.model_images.split(',')
  523. me.modelInfo.endurance = common.formatDistance(me.modelInfo.endurance - 0)
  524. me.modelInfo.weight = common.formatWeight(me.modelInfo.weight - 0)
  525. me.shopInfo = resp.data.data.shop_info
  526. me.shopInfo.shop_image = JSON.parse(me.shopInfo.shop_image.split(','))
  527. me.shopInfo.distance = common.formatDistance(me.shopInfo.distance - 0)
  528. me.serviceList = resp.data.data.service_list
  529. me.waitMoney = resp.data.data.wait_money / 100
  530. me.workInfo = resp.data.data.work_info
  531. me.insurance_status = resp.data.data.insurance_status
  532. me.charge_standard = (me.workInfo && me.workInfo.status) ? this.calculateFare(me.workInfo.distance, JSON.parse(me.workInfo.drag_car_price_json)) : ''
  533. me.return_imgs = resp.data.data.return_imgs
  534. if(resp.data.data.order_info.order_status==4){
  535. me.setData({
  536. over_fee : resp.data.data.over_info.over_fee
  537. })
  538. }
  539. // if (this.orderInfo.order_status == 0) {
  540. // this.startCountDown()
  541. // this.updateCountdown()
  542. // }
  543. if (me.orderInfo.order_status == 0) {
  544. let _ctime = resp.data.data.order_info.ctime + 300 - 26
  545. let now = Date.parse(new Date()) / 1000
  546. me.timer = (_ctime - now) <= 330 ? (_ctime - now) : 0
  547. // me.timer=30
  548. }
  549. // 取还时间展示
  550. me.orderInfo.hire_return_time = common.getTimeToDay(Math.ceil(me.orderInfo.hire_end_time - me.orderInfo.hire_begin_time)/60)
  551. // 剩余租期判断
  552. if((me.orderInfo.hire_type==2&&me.orderInfo.order_status==2)||me.orderInfo.order_status==3){
  553. me.orderInfo.hire_duration_time = common.getTimeToDay(Math.ceil(me.orderInfo.hire_end_time-(Math.floor(new Date()) / 1000))/60)
  554. }else{
  555. if(me.orderInfo.order_status==4){
  556. me.orderInfo.hire_duration_time = common.getTimeToDay(Math.ceil(Math.floor(new Date()) / 1000-me.orderInfo.hire_end_time)/60)
  557. }else{
  558. me.orderInfo.hire_duration_time = me.orderInfo.hire_return_time
  559. }
  560. }
  561. } else {
  562. // 默认返回上一个页面再提示报错
  563. uni.navigateBack({
  564. delta: 1
  565. })
  566. common.simpleToast(resp.data.msg)
  567. }
  568. })
  569. },
  570. clickCancel() {
  571. const me = this
  572. uni.showModal({
  573. title: '取消订单',
  574. content: '您是否需要取消该订单',
  575. confirmText: '是',
  576. confirmColor: '#0074FF',
  577. cancelText: '否',
  578. cancelColor: '#191D23',
  579. success: function(res) {
  580. if (res.confirm) {
  581. me.isShowCancel = true
  582. }
  583. }
  584. });
  585. },
  586. bindCancel(e) {
  587. const me = this
  588. me.reason = e.currentTarget.dataset.status;
  589. me.cancel = true
  590. common.loading()
  591. setTimeout(function() {
  592. http.postApi(config.API_DAYHIRE_HIRE_CANCEL_ORDER, {
  593. order_sn: me.order_sn
  594. }, (resp) => {
  595. if (resp.data.code === 200) {
  596. uni.hideLoading()
  597. common.simpleToast('取消成功')
  598. setTimeout(()=> {
  599. me.bindOrderInfo()
  600. }, 500);
  601. } else{
  602. common.simpleToast('订单取消失败')
  603. }
  604. me.reason = 0
  605. me.isShowCancel = false
  606. })
  607. }, 600);
  608. },
  609. bindToNav() {
  610. console.log(111);
  611. const {
  612. address,
  613. latitude,
  614. longitude,
  615. shop_name
  616. } = this.shopInfo
  617. uni.openLocation({
  618. latitude: latitude - 0,
  619. longitude: longitude - 0,
  620. scale: 15,
  621. name: shop_name,
  622. address: address,
  623. success: function(res) {},
  624. })
  625. },
  626. bindToHome() {
  627. uni.reLaunch({
  628. url: '/pages/index/index',
  629. success: function(res) {},
  630. fail: function(res) {},
  631. complete: function(res) {}
  632. });
  633. },
  634. callPhone() {
  635. const me = this
  636. const phone = me.shopInfo.link_phone
  637. uni.showModal({
  638. content: `您是否要拨打电话${phone}?`,
  639. confirmText: '确定',
  640. success: (res) => {
  641. if (res.confirm) {
  642. uni.makePhoneCall({
  643. phoneNumber: phone,
  644. success() {},
  645. fail() {}
  646. })
  647. }
  648. },
  649. fail: (res) => {}
  650. })
  651. },
  652. bindRenew() {
  653. this.isReturnHome = false
  654. let isRenew = true
  655. uni.navigateTo({
  656. url: '/pages/carIntroduce/carIntroduce?plate_number=' + this.orderInfo.license_plate_number +
  657. '&isRenew=' + isRenew +
  658. '&order_sn=' + this.order_sn,
  659. success: function(res) {},
  660. fail: function(res) {},
  661. complete: function(res) {}
  662. });
  663. },
  664. bindBattery() {
  665. this.isReturnHome = false
  666. uni.navigateTo({
  667. url: '/pages/battery/battery?plate_number=' + this.orderInfo.license_plate_number,
  668. success: function(res) {},
  669. fail: function(res) {},
  670. complete: function(res) {}
  671. });
  672. },
  673. bindExpanded() {
  674. this.isExpanded = !this.isExpanded
  675. },
  676. navToInput() {
  677. this.isReturnHome = false
  678. uni.navigateTo({
  679. url: '/pages/inputLicensePlate/inputLicensePlate?order_sn=' + this.orderInfo.order_sn,
  680. success: function(res) {},
  681. fail: function(res) {},
  682. complete: function(res) {}
  683. });
  684. },
  685. // 激活车辆
  686. navToActive() {
  687. this.isReturnHome = false
  688. const me = this
  689. if (this.orderInfo.hire_type == 1) { // 预约
  690. if(me.isScanCondeRentalCar) {
  691. uni.scanCode({
  692. onlyFromCamera: true,
  693. success: function (res) {
  694. me.loadScanCode(res.result)
  695. },
  696. fail: function (res) { },
  697. complete: function (res) { },
  698. })
  699. } else {
  700. uni.navigateTo({
  701. url: '/pages/inputLicensePlate/inputLicensePlate?order_sn=' + this.order_sn +'&order_model_id='+this.orderInfo.model_id,
  702. success: function(res) {},
  703. fail: function(res) {},
  704. complete: function(res) {}
  705. });
  706. }
  707. } else { // 非预约
  708. const isJumpReturn = false
  709. uni.navigateTo({
  710. url: '/pages/activation/activation?order_sn=' + this.order_sn + '&plate_number=' + this
  711. .orderInfo.license_plate_number +'&isJumpReturn=' + isJumpReturn,
  712. success: function(res) {},
  713. fail: function(res) {},
  714. complete: function(res) {}
  715. });
  716. }
  717. },
  718. loadScanCode(battery_sn) {
  719. const pData = {
  720. longitude: this.longitude,
  721. latitude: this.latitude,
  722. battery_sn: battery_sn
  723. }
  724. const me = this
  725. http.postApi(config.API_DAYHIRE_CAR_CAR_INFO, pData, (resp) => {
  726. uni.hideLoading()
  727. if (resp.data.code === 200) {
  728. const timestamp = Date.now(); // 获取当前时间戳(毫秒)
  729. const isOffline = (Math.floor(timestamp / 1000) - resp.data.data.last_comm_time) > 1800
  730. me.plate_number = resp.data.data.license_plate_number
  731. if (resp.data.data.last_comm_time === 0 || isOffline) {
  732. common.simpleToast('此车辆已离线,请选择其他车辆')
  733. } else {
  734. let carInfo = JSON.stringify(resp.data.data)
  735. const car_model = resp.data.data.model_info.car_model
  736. const model_images = resp.data.data.model_info.model_images.split(',')
  737. const return_imgs = resp.data.data.return_imgs
  738. var model_id = resp.data.data.model_info.model_id
  739. if (resp.data.data.has_owner) { //车辆正在被使用
  740. if (resp.data.data.is_mine) { //是本人在使用
  741. wx.showModal({
  742. title: '提示',
  743. content: '已有正在使用的车辆,是否跳转至车辆详情页?',
  744. cancelText: '取消',
  745. confirmText: '确定',
  746. success: function(res) {
  747. this.isReturnHome = false
  748. uni.navigateTo({
  749. url: '/pages/battery/battery?plate_number=' +
  750. this.plate_number
  751. });
  752. },
  753. fail: function(res) {},
  754. complete: function(res) {},
  755. })
  756. } else {
  757. common.simpleToast('此车辆正在被使用')
  758. }
  759. } else {
  760. if (me.order_sn&&me.order_sn != '') {
  761. if (this.orderInfo.model_id != model_id) { // 预租车型与之前预约车型不一致
  762. common.simpleToast('与预约车型不符')
  763. } else {
  764. this.isReturnHome = false
  765. uni.navigateTo({
  766. url: '/pages/activation/activation?plate_number=' +
  767. this.plate_number + '&order_sn=' + this.order_sn +
  768. '&car_model=' + car_model + '&model_image=' +
  769. model_images[0] + '&return_imgs=' + JSON.stringify(
  770. return_imgs),
  771. fail() {}
  772. })
  773. }
  774. } else {
  775. this.isReturnHome = false
  776. uni.navigateTo({
  777. url: '/pages/carIntroduce/carIntroduce?carInfo=' +
  778. encodeURIComponent(carInfo) + '&plate_number=' + this.plate_number,
  779. fail() {}
  780. })
  781. }
  782. }
  783. }
  784. } else {
  785. common.simpleToast(resp.data.msg)
  786. }
  787. })
  788. },
  789. bindToPay() {
  790. const me = this
  791. //#ifdef MP-ALIPAY
  792. const _from = 'ali'
  793. const _pay_type = 2
  794. //#endif
  795. //#ifdef MP-WEIXIN
  796. const _from = 'wx'
  797. const _pay_type = 0
  798. //#endif
  799. http.postApi(config.API_DAYHIRE_HIRE_CONTINUE_PAY, {
  800. order_sn: me.order_sn,
  801. from: _from,
  802. pay_type: _pay_type
  803. }, (resp) => {
  804. common.loading()
  805. if (resp.data.code === 200) {
  806. uni.hideLoading()
  807. //#ifdef MP-ALIPAY
  808. my.tradePay({
  809. tradeNO: resp.data.data.trade_no,
  810. success: function(res) {
  811. if (res.resultCode == 9000) {
  812. common.simpleToast('支付成功');
  813. }
  814. setTimeout(function() {
  815. me.bindOrderInfo()
  816. }, 1000)
  817. },
  818. fail: function(res) {
  819. common.simpleToast('支付失败,请重试')
  820. },
  821. })
  822. //#endif
  823. //#ifdef MP-WEIXIN
  824. var payParams = JSON.parse(resp.data.data.payParams);
  825. user.wxPay(me.order_sn, payParams, function(isSuccess) {
  826. if (isSuccess) {
  827. common.simpleToast('支付成功')
  828. setTimeout(function() {
  829. me.bindOrderInfo()
  830. }, 1000)
  831. } else {
  832. common.simpleToast('支付失败,请重试')
  833. }
  834. });
  835. //#endif
  836. } else {
  837. uni.hideLoading()
  838. common.simpleToast(resp.data.msg)
  839. }
  840. })
  841. },
  842. // 计算拖车说明收费价格
  843. calculateFare(distance, charge_list) {
  844. let fare = 0
  845. if (distance <= charge_list.start_mil) {
  846. fare = charge_list.start_price / 100
  847. } else {
  848. // actual_start_mil:实际距离单位米
  849. // over_start_price:向上取整的公里数*超出首公里的费用
  850. var actual_start_mil = distance - charge_list.start_mil
  851. var over_start_price = (Math.ceil(actual_start_mil / charge_list.step_mil)) * charge_list.step_price
  852. fare = (charge_list.start_price + over_start_price) / 100
  853. }
  854. const fareArray = fare.toFixed(2).split('.'); //将价格拆分为整数部分和小数部分
  855. const price_list = {
  856. start_mil: (charge_list.start_mil / 1000).toFixed(2),
  857. start_price: (charge_list.start_price / 100).toFixed(2),
  858. step_mil: (charge_list.step_mil / 1000).toFixed(2),
  859. step_price: (charge_list.step_price / 100).toFixed(2),
  860. actual_start_mil: actual_start_mil ? (actual_start_mil / 1000).toFixed(2) : 0,
  861. over_start_price: over_start_price ? (over_start_price / 100).toFixed(2) : 0,
  862. fare: fare.toFixed(2), // 保留两位小数
  863. fareArray: fareArray //将价格拆分为整数部分和小数部分
  864. }
  865. return price_list
  866. },
  867. bindChangeStatus(e) {
  868. const {
  869. status,
  870. unit
  871. } = e.currentTarget.dataset
  872. this.setData({
  873. isSelectStatus: unit,
  874. selectIndex: status
  875. })
  876. // this.bindDuration()
  877. },
  878. //计算价格
  879. // bindDuration(){
  880. // const me = this
  881. // var _insurance_price //保险金
  882. // const unit_price=(me.price_list[0].hire_price/100) * me.leaseTime //租金
  883. // // insurance_setting 保险
  884. // if (me.insurance_setting!=null) { // 有保险的时候
  885. // // isSelectDeposit==0为免押 isOpenNoDeposit为是否成功开通免押 total_money为总金额
  886. // // unit_price 租金 insurance_setting.price 保险金 deposit 押金
  887. // if (me.duration_unit == 4) { // 时
  888. // _insurance_price = (me.insurance_setting.price - 0) * 1
  889. // } else if(me.duration_unit == 6) { // 周
  890. // _insurance_price = (me.insurance_setting.price - 0) * 7 * me.leaseTime
  891. // } else { //天
  892. // _insurance_price = (me.insurance_setting.price - 0) * me.leaseTime
  893. // }
  894. // } else { // 无保险
  895. // _insurance_price = 0
  896. // }
  897. // if (me.isOpenNoDeposit) {
  898. // // 金额=(周期数*周期价格)+保险金
  899. // me.amount = ((me.leaseTime * me.price_list[0].hire_price -0) + (_insurance_price - 0)) / 100
  900. // } else {
  901. // // 金额=(周期数*周期价格)+押金+保险金
  902. // me.amount = ((me.leaseTime * me.price_list[0].hire_price -0) + (me.modelInfo.deposit -0) + (_insurance_price - 0)) / 100
  903. // }
  904. // },
  905. loadEnd() {
  906. this.bindOrderInfo()
  907. },
  908. navToExchange(){
  909. console.log('跳转换电记录');
  910. uni.navigateTo({
  911. url: '/pages/exchangeRecord/exchangeRecord'+
  912. '?order_sn=' + this.orderInfo.order_sn
  913. })
  914. }
  915. }
  916. };
  917. </script>
  918. <style>
  919. @import './orderStatus.css';
  920. </style>