orderStatus.vue 34 KB

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