detail.vue 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959
  1. <!--
  2. * @Author: wangwei
  3. * @Date: 2020-12-28 16:06:28
  4. * @LastEditTime: 2021-01-15 .gitignore:25:31
  5. * @LastEditors: Please set LastEditors
  6. * @Description: 订单详情
  7. * @FilePath: /java-pc/src/views/member/order/List.vue
  8. -->
  9. <template>
  10. <div class="sld_order_detail">
  11. <el-breadcrumb
  12. separator-class="el-icon-arrow-right"
  13. class="breadcrumb"
  14. style="line-height: 40px; font-size: 10px"
  15. >
  16. <el-breadcrumb-item :to="{ path: '/' }">{{
  17. L["首页"]
  18. }}</el-breadcrumb-item>
  19. <el-breadcrumb-item :to="{ path: '/member/home' }">{{
  20. L["个人中心"]
  21. }}</el-breadcrumb-item>
  22. <el-breadcrumb-item>{{ L["订单详情"] }}</el-breadcrumb-item>
  23. </el-breadcrumb>
  24. <div class="container">
  25. <div class="top_info flex_row_start_center">
  26. <div class="top_info_state flex_column_center_center">
  27. <p class="state">{{ order_info.data.orderStateValue }}</p>
  28. <p
  29. v-if="
  30. (order_info.data.orderState == 0 &&
  31. order_info.data.payState == 0) ||
  32. (order_info.data.orderState == 0 && order_info.data.payState == 1)
  33. "
  34. class="refuse_reason"
  35. >
  36. {{ order_info.data.refuseReason }}
  37. </p>
  38. <p
  39. class="refuse_reason"
  40. v-if="
  41. order_info.data.orderType == 103 &&
  42. order_info.data.orderSubState == 102 &&
  43. !(
  44. order_info.data.presellInfo &&
  45. order_info.data.presellInfo.isStartRemainPay
  46. )
  47. "
  48. >
  49. {{ order_info.data.presellInfo.remainStartTime }}开始付尾款
  50. </p>
  51. <div
  52. v-if="order_info.data.orderState == 30"
  53. class="oprate_btn pointer"
  54. @click="confirmReceipt(order_info.data.orderSn)"
  55. >
  56. {{ L["确认收货"] }}
  57. </div>
  58. <template v-if="order_info.data.orderState == 10">
  59. <div
  60. v-if="
  61. !(
  62. (order_info.data.orderType == 105 &&
  63. order_info.data.orderSubState == 102 &&
  64. order_info.data.ladderGroupDetailInfo.depositRemainTime >
  65. 0) ||
  66. (order_info.data.orderType == 103 &&
  67. order_info.data.orderSubState == 102 &&
  68. order_info.data.presellInfo.remainEndTime > 0)
  69. ) ||
  70. (order_info.data.presellInfo &&
  71. order_info.data.presellInfo.isStartRemainPay)
  72. "
  73. >
  74. <div
  75. v-if="order_info.data.orderState == 10"
  76. class="oprate_btn pointer"
  77. @click="goPay(order_info.data.paySn)"
  78. >
  79. {{ L["立即支付"] }}
  80. </div>
  81. </div>
  82. </template>
  83. <div
  84. v-if="
  85. order_info.data.orderState == 40 &&
  86. order_info.data.evaluateState != 3
  87. "
  88. class="oprate_btn pointer"
  89. @click="remainEvaluated(order_info.data.orderSn)"
  90. >
  91. {{ L["评价"] }}
  92. </div>
  93. <p class="cancel flex_row_center_center" v-if="afsState">
  94. <span
  95. class="pointer"
  96. v-if="order_info.data.orderState == 10"
  97. @click="showSelectReasonDialog(order_info.data.parentSn)"
  98. >{{ L["取消订单"] }}</span
  99. >
  100. <span
  101. class="pointer"
  102. v-if="
  103. (order_info.data.orderState == 10 ||
  104. order_info.data.orderState == 20) &&
  105. order_info.data.isVirtualGoods == 1
  106. "
  107. @click="editAddress(order_info.data)"
  108. >{{ L["修改地址"] }}</span
  109. >
  110. <span
  111. class="pointer"
  112. v-if="
  113. order_info.data.orderState == 0 ||
  114. (order_info.data.orderState == 40 &&
  115. order_info.data.evaluateState == 3)
  116. "
  117. @click="delOrder(order_info.data.orderSn)"
  118. >{{ L["删除订单"] }}</span
  119. >
  120. </p>
  121. </div>
  122. <!-- 正常订单 -->
  123. <div
  124. v-if="order_info.data.orderState != 0"
  125. class="top_info_progress flex_row_center_center"
  126. >
  127. <div class="progress_item">
  128. <p>{{ L["提交订单"] }}</p>
  129. <div class="progress flex_row_center_center">
  130. <span
  131. :class="{
  132. active:
  133. order_info.data.orderLogs &&
  134. order_info.data.orderLogs.length >= 1,
  135. }"
  136. >1</span
  137. >
  138. <div class="progress_line">
  139. <div
  140. :class="{
  141. content: true,
  142. active:
  143. order_info.data.orderLogs &&
  144. order_info.data.orderLogs.length >= 1,
  145. current:
  146. order_info.data.orderLogs &&
  147. order_info.data.orderLogs.length == 1,
  148. }"
  149. ></div>
  150. </div>
  151. </div>
  152. </div>
  153. <div class="progress_item">
  154. <p>{{ L["支付订单"] }}</p>
  155. <div class="progress flex_row_center_center">
  156. <span
  157. :class="{
  158. active:
  159. order_info.data.orderLogs &&
  160. order_info.data.orderLogs.length >= 2,
  161. }"
  162. >2</span
  163. >
  164. <div class="progress_line">
  165. <div
  166. :class="{
  167. content: true,
  168. active:
  169. order_info.data.orderLogs &&
  170. order_info.data.orderLogs.length >= 2,
  171. current:
  172. order_info.data.orderLogs &&
  173. order_info.data.orderLogs.length == 2,
  174. }"
  175. ></div>
  176. </div>
  177. </div>
  178. </div>
  179. <div class="progress_item">
  180. <p>{{ L["商家发货"] }}</p>
  181. <div class="progress flex_row_center_center">
  182. <span
  183. :class="{
  184. active:
  185. order_info.data.orderLogs &&
  186. order_info.data.orderLogs.length >= 3,
  187. }"
  188. >3</span
  189. >
  190. <div class="progress_line">
  191. <div
  192. :class="{
  193. content: true,
  194. active:
  195. order_info.data.orderLogs &&
  196. order_info.data.orderLogs.length >= 3,
  197. current:
  198. order_info.data.orderLogs &&
  199. order_info.data.orderLogs.length == 3,
  200. }"
  201. ></div>
  202. </div>
  203. </div>
  204. </div>
  205. <div class="progress_item">
  206. <p>{{ L["确认收货"] }}</p>
  207. <div class="progress flex_row_center_center">
  208. <span
  209. :class="{
  210. active:
  211. order_info.data.orderLogs &&
  212. order_info.data.orderLogs.length >= 4,
  213. }"
  214. >4</span
  215. >
  216. <div class="progress_line">
  217. <div
  218. :class="{
  219. content: true,
  220. active:
  221. order_info.data.orderLogs &&
  222. order_info.data.orderLogs.length >= 4,
  223. current:
  224. order_info.data.orderLogs &&
  225. order_info.data.orderLogs.length == 4 &&
  226. order_info.data.evaluateState != 3,
  227. }"
  228. ></div>
  229. </div>
  230. </div>
  231. </div>
  232. <div class="progress_item">
  233. <p>{{ L["评价"] }}</p>
  234. <div class="progress flex_row_center_center">
  235. <span :class="{ active: order_info.data.evaluateState == 3 }"
  236. >5</span
  237. >
  238. </div>
  239. </div>
  240. </div>
  241. <!-- 交易关闭订单 -->
  242. <div
  243. v-if="order_info.data.orderState == 0"
  244. class="top_info_progress flex_row_center_center"
  245. >
  246. <div class="progress_item">
  247. <p>{{ L["提交订单"] }}</p>
  248. <div class="progress flex_row_center_center">
  249. <span
  250. :class="{
  251. active:
  252. order_info.data.orderLogs &&
  253. order_info.data.orderLogs.length >= 1,
  254. }"
  255. >1</span
  256. >
  257. <div class="progress_line">
  258. <div
  259. :class="{
  260. content: true,
  261. active:
  262. order_info.data.orderLogs &&
  263. order_info.data.orderLogs.length >= 1,
  264. current:
  265. order_info.data.orderLogs &&
  266. order_info.data.orderLogs.length == 1,
  267. }"
  268. ></div>
  269. </div>
  270. </div>
  271. </div>
  272. <div class="progress_item">
  273. <p>{{ L["交易关闭"] }}</p>
  274. <div class="progress flex_row_start_center">
  275. <span class="active">2</span>
  276. </div>
  277. </div>
  278. </div>
  279. </div>
  280. <div
  281. v-if="
  282. (order_info.data.orderState == 30 ||
  283. order_info.data.orderState == 40) &&
  284. order_info.data.isVirtualGoods == 1
  285. "
  286. class="logistics_info flex_row_start_center"
  287. >
  288. <div class="logistics_info_left flex_row_center_center">
  289. <div class="image flex_row_center_center">
  290. <img :src="logistics_info.data.goodsImage" alt />
  291. <!-- <coverImage :src='logistics_info.data.goodsImage' width="64" height="64"></coverImage> -->
  292. </div>
  293. <div class="info">
  294. <p>
  295. {{ L["送货方式"] }}:{{
  296. logistics_info.data.type == 1 ? "无需物流" : "快递"
  297. }}
  298. </p>
  299. <p>
  300. {{
  301. logistics_info.data.type == 1 ? L["联系电话"] : L["承运人"]
  302. }}:{{
  303. logistics_info.data.type == 1
  304. ? order_info.data.deliverMobile
  305. : logistics_info.data.expressName
  306. }}
  307. </p>
  308. <p>
  309. {{
  310. logistics_info.data.type == 1 ? L["联系人"] : L["运单号"]
  311. }}:{{
  312. logistics_info.data.type == 1
  313. ? order_info.data.deliverName
  314. : logistics_info.data.expressNumber
  315. }}
  316. </p>
  317. </div>
  318. </div>
  319. <div v-if="logistics_info.data.routeList" class="logistics_info_right">
  320. <div class="right_container">
  321. <img
  322. v-if="logistics_info.data.routeList.length == 0"
  323. :src="express_empty"
  324. alt
  325. />
  326. <p v-if="logistics_info.data.routeList.length == 0">
  327. {{ L["暂无物流信息"] }}
  328. </p>
  329. <el-timeline v-if="logistics_info.data.routeList.length > 0">
  330. <el-timeline-item
  331. v-for="(logistics, index) in logistics_info.data.routeList"
  332. :key="index"
  333. :timestamp="logistics.remark"
  334. >{{ logistics.acceptTime }}</el-timeline-item
  335. >
  336. </el-timeline>
  337. </div>
  338. </div>
  339. </div>
  340. <div class="order_info">
  341. <p>{{ L["订单信息"] }}</p>
  342. <div class="order_info_item flex">
  343. <div>
  344. <span>{{ L["订单号"] }}:</span>
  345. {{ order_info.data.orderSn }}
  346. </div>
  347. <div>
  348. <span>{{ L["发票抬头"] }}:</span>
  349. {{
  350. order_info.data.invoice
  351. ? order_info.data.invoice.invoiceTitle
  352. : "--"
  353. }}
  354. </div>
  355. </div>
  356. <div class="order_info_item flex">
  357. <div>
  358. <span>{{ L["下单时间"] }}:</span>
  359. {{ order_info.data.createTime }}
  360. </div>
  361. </div>
  362. <div class="order_info_item">
  363. <div>
  364. <span>{{ L["卖家"] }}:</span>
  365. {{
  366. order_info.data.childOrdersVOS
  367. ? order_info.data.childOrdersVOS[0].storeName
  368. : "--"
  369. }}
  370. </div>
  371. </div>
  372. <div class="order_info_item" v-if="order_info.data.isVirtualGoods == 1">
  373. <div
  374. class="overflow_ellipsis_two"
  375. :title="
  376. order_info.data.receiverAreaInfo + order_info.data.receiverAddress
  377. "
  378. >
  379. <span>{{ L["收货地址"] }}:</span>
  380. {{ order_info.data.receiverAreaInfo }}
  381. {{ order_info.data.receiverAddress }}
  382. </div>
  383. </div>
  384. <div class="order_info_item" v-if="order_info.data.isVirtualGoods == 1">
  385. <div>
  386. <span>{{ L["收货人信息"] }}:</span>
  387. {{ order_info.data.receiverName }}
  388. {{ order_info.data.receiverMobile }}
  389. </div>
  390. </div>
  391. <div class="order_info_item" v-if="order_info.data.tradeSn">
  392. <div>
  393. <span>{{ L["交易流水号"] }}:</span>
  394. {{ order_info.data.tradeSn }}
  395. </div>
  396. </div>
  397. <div
  398. v-if="
  399. order_info.data.isVirtualGoods == 2 &&
  400. order_info.data.orderReserveList.length
  401. "
  402. >
  403. <template
  404. v-for="(item, index) in order_info.data.orderReserveList"
  405. :key="index"
  406. >
  407. <div v-show="item.reserveValue" class="order_info_item">
  408. <div>
  409. <span>{{ item.reserveName }}:</span>
  410. {{ item.reserveValue }}
  411. </div>
  412. </div>
  413. </template>
  414. </div>
  415. </div>
  416. <div class="order_mark">
  417. <p>
  418. {{
  419. order_info.data.orderState == 0 && order_info.data.payState == 1
  420. ? "订单取消备注"
  421. : "订单备注"
  422. }}
  423. </p>
  424. <div
  425. class="order_mark_item"
  426. v-if="
  427. order_info.data.orderState == 0 && order_info.data.payState == 1
  428. "
  429. >
  430. <span>{{
  431. order_info.data.refuseRemark ? order_info.data.refuseRemark : "--"
  432. }}</span>
  433. </div>
  434. <div class="order_mark_item" v-else>
  435. <span>{{
  436. order_info.data.orderRemark ? order_info.data.orderRemark : "--"
  437. }}</span>
  438. </div>
  439. </div>
  440. <div class="shop_info" v-if="order_info.data.childOrdersVOS">
  441. <p>{{ L["商品信息"] }}</p>
  442. <div class="shop_title flex">
  443. <div class="detail">{{ L["商品详情"] }}</div>
  444. <div class="price">{{ L["单价"] }}</div>
  445. <div class="num">{{ L["数量"] }}</div>
  446. <div
  447. v-if="
  448. order_info.data.orderState == 20 ||
  449. order_info.data.orderState == 30 ||
  450. order_info.data.orderState == 40
  451. "
  452. class="oprate"
  453. >
  454. {{ L["操作"] }}
  455. </div>
  456. </div>
  457. <div
  458. v-for="(storeItem, index) in order_info.data.childOrdersVOS"
  459. :key="index"
  460. >
  461. <div
  462. v-for="(goodItem, index) in storeItem.orderProductListVOList"
  463. :key="index"
  464. class="good_item flex"
  465. >
  466. <div class="good_info flex">
  467. <div class="image flex_row_center_center">
  468. <!-- <img :src="goodItem.productImage" alt /> -->
  469. <coverImage
  470. :src="goodItem.productImage"
  471. width="64"
  472. height="64"
  473. ></coverImage>
  474. </div>
  475. <div class="good_info_con">
  476. <router-link
  477. :to="'/goods/detail/'+ calcProductName(goodItem.goodsName) +'_'+ goodItem.productId"
  478. class="name"
  479. target="_blank"
  480. >
  481. <span class="gift" v-if="goodItem.isGift == 1">赠品</span
  482. >{{ goodItem.goodsName }}
  483. </router-link>
  484. <!-- <div class="name">{{goodItem.goodsName}}</div> -->
  485. <div class="spec">{{ goodItem.specValues }}</div>
  486. </div>
  487. </div>
  488. <div class="price flex_row_center_center">
  489. {{ goodItem.productShowPrice }}
  490. </div>
  491. <div class="num flex_row_center_center">
  492. *{{ goodItem.productNum }}
  493. </div>
  494. <div
  495. v-if="
  496. order_info.data.orderState == 20 ||
  497. order_info.data.orderState == 30 ||
  498. order_info.data.orderState == 40
  499. "
  500. class="oprate flex_row_center_center"
  501. >
  502. <!-- 退款中 可查看退款详情 售后按钮,100-退款(商家未发货),200-退款(商家发货,买家未收货),300-申请售后,401-退款中,402-退款完成,403-换货中,404-换货完成 301,退款失败-平台审核失败-->
  503. <span
  504. class="refund_btn pointer"
  505. v-if="
  506. (goodItem.afsButton == 401 ||
  507. goodItem.afsButton == 402 ||
  508. goodItem.afsButton == 403 ||
  509. goodItem.afsButton == 404 ||
  510. goodItem.afsButton == 301) &&
  511. goodItem.isGift == 0
  512. "
  513. @click.stop="goRefundDetail(goodItem.afsSn)"
  514. >{{ goodItem.afsButtonValue }}</span
  515. >
  516. <!-- 退款 可申请退款-->
  517. <span
  518. class="refund_btn pointer"
  519. v-if="
  520. (goodItem.afsButton == 100 ||
  521. goodItem.afsButton == 200 ||
  522. goodItem.afsButton == 300) &&
  523. goodItem.isGift == 0
  524. "
  525. @click.stop="
  526. selectService(
  527. goodItem.orderProductId,
  528. order_info.data.orderSn
  529. )
  530. "
  531. >{{ goodItem.afsButtonValue }}</span
  532. >
  533. <!-- 赠品不能申请售后 -->
  534. <span class="refund_btn" v-if="goodItem.isGift == 1">--</span>
  535. </div>
  536. </div>
  537. </div>
  538. </div>
  539. <div class="settle_info">
  540. <p>
  541. {{ L["商品总额"] }}:
  542. <span>¥{{ order_info.data.totalMoney }}</span>
  543. </p>
  544. <p>
  545. {{ L["满优惠"] }}:
  546. <span>-¥{{ order_info.data.fullDiscountAmount }}</span>
  547. </p>
  548. <p>
  549. {{ L["运费金额"] }}:
  550. <span>+¥{{ order_info.data.totalExpress }}</span>
  551. </p>
  552. <p v-if="order_info.data.storeVoucherAmount > 0">
  553. {{ L["店铺优惠券"] }}:
  554. <span>-¥{{ order_info.data.storeVoucherAmount }}</span>
  555. </p>
  556. <p v-if="order_info.data.platformVoucherAmount > 0">
  557. {{ L["平台优惠券"] }}:
  558. <span>-¥{{ order_info.data.platformVoucherAmount }}</span>
  559. </p>
  560. <p v-if="order_info.data.integralCashAmount > 0">
  561. {{ L["积分抵扣"] }}:
  562. <span>-¥{{ order_info.data.integralCashAmount }}</span>
  563. </p>
  564. <p class="total">
  565. {{ L["实际金额"] }}:
  566. <span>¥{{ order_info.data.actualPayment }}</span>
  567. </p>
  568. </div>
  569. </div>
  570. <!-- 取消地址理由弹窗 start -->
  571. <el-dialog
  572. :title="L['取消订单理由']"
  573. v-model="cancel_order"
  574. customClass="select_reason_width"
  575. :before-close="handleClose"
  576. lock-sroll="false"
  577. >
  578. <div class="cancel_list_con">
  579. <div
  580. v-for="(reasonItem, index) in cancel_list.data"
  581. :key="index"
  582. :class="{
  583. reason_item: true,
  584. flex_row_between_center: true,
  585. active: current_reason_id == reasonItem.reasonId,
  586. }"
  587. @click="selectReason(reasonItem.reasonId)"
  588. >
  589. <span class="reason_text">{{ reasonItem.content }}</span>
  590. <img
  591. :src="
  592. current_reason_id == reasonItem.reasonId ? selected : not_select
  593. "
  594. alt
  595. />
  596. </div>
  597. </div>
  598. <div class="confirm_cancel_btn" @click="confirmCancel()">
  599. {{ L["确定"] }}
  600. </div>
  601. </el-dialog>
  602. <!-- 取消地址理由弹窗 end -->
  603. <!-- 地址选择弹窗 start -->
  604. <el-dialog
  605. :title="L['更换地址']"
  606. v-model="show_select_address"
  607. customClass="select_address_width"
  608. :before-close="handleClose"
  609. lock-sroll="false"
  610. >
  611. <div class="out_stock_dialog address_con">
  612. <div
  613. v-for="(item, index) in address_list.data"
  614. :key="index"
  615. @click="selectAddress(index)"
  616. :class="{
  617. address_item: true,
  618. flex_column_start_start: true,
  619. select: current_address_index == index,
  620. }"
  621. >
  622. <span>{{ L["收货人"] }}:{{ item.memberName }}</span>
  623. <span>{{ L["联系方式"] }}:{{ item.telMobile }}</span>
  624. <span class="address_text">
  625. <div>{{ L["收货地址"] }}:</div>
  626. <div>{{ item.addressAll }} {{ item.detailAddress }}</div>
  627. </span>
  628. <img
  629. v-if="current_address_index == index"
  630. class="selected"
  631. :src="invoice_selected"
  632. alt
  633. />
  634. </div>
  635. </div>
  636. <div class="btn_con flex_row_center_center">
  637. <div class="confirm_cancel_btn" @click="confirmChangeAddress()">
  638. {{ L["提交修改"] }}
  639. </div>
  640. </div>
  641. </el-dialog>
  642. <!-- 地址选择弹窗 end -->
  643. </div>
  644. </template>
  645. <script setup>
  646. import { reactive, getCurrentInstance, ref, onMounted } from "vue";
  647. import {
  648. ElBreadcrumb,
  649. ElBreadcrumbItem,
  650. ElMessage,
  651. ElDialog,
  652. ElMessageBox,
  653. ElTimeline,
  654. ElTimelineItem,
  655. } from "element-plus";
  656. import { useRouter, useRoute } from "vue-router";
  657. // import { lang_zn } from "@/assets/language/zh";
  658. import { getCurLanguage } from '@/composables/common.js';
  659. import { useFiltersStore } from "@/store/filter.js";
  660. const filtersStore = useFiltersStore();
  661. // const L = lang_zn;
  662. const L = getCurLanguage();
  663. definePageMeta({
  664. layout: "orderdetail",
  665. middleware: ["auth"],
  666. });
  667. // const balance = require("../../assets/buy/balance.png");
  668. const router = useRouter();
  669. const route = useRoute();
  670. const { proxy } = getCurrentInstance();
  671. const order_info = reactive({ data: {} });
  672. const express_empty = ref("/order/express_empty.png");
  673. const not_select = ref("/order/not_select.png");
  674. const selected = ref("/order/selected.png");
  675. const invoice_selected = ref("/buy/invoice_selected.png");
  676. const cancel_list = reactive({ data: [] });
  677. const cancel_order = ref(false); //是否显示取消订单弹窗
  678. const current_reason_id = ref(); //记录当前已选择理由id
  679. const order_sn = ref(""); //记录当前操作的订单号
  680. const show_select_address = ref(false); //是否显示选择地址弹窗
  681. const address_list = reactive({ data: [] }); //地址列表
  682. const current_address_index = ref(0); //记录当前选择的地址
  683. const logistics_info = reactive({ data: {} }); //物流信息
  684. const afsState = ref(true);
  685. const getOrderDetail = () => {
  686. post("v3/business/front/orderInfo/detail", {
  687. orderSn: route.query.orderSn,
  688. })
  689. .then((res) => {
  690. if (res.state == 200) {
  691. order_info.data = res.data;
  692. if (
  693. (order_info.data.orderState == 30 ||
  694. order_info.data.orderState == 40) &&
  695. order_info.data.isVirtualGoods == 1
  696. ) {
  697. lookLogistics(order_info.data.orderSn);
  698. }
  699. order_info.data.childOrdersVOS.map((child) => {
  700. child.orderProductListVOList.map((item) => {
  701. if (item.afsButton == 200 || item.afsButton == 201) {
  702. afsState.value = false;
  703. }
  704. });
  705. });
  706. } else {
  707. ElMessage(res.msg);
  708. }
  709. })
  710. .catch(() => {
  711. //异常处理
  712. });
  713. };
  714. // 获取订单取消理由列表
  715. const getCancelList = () => {
  716. get("v3/system/front/reason/list", {
  717. type: 104,
  718. })
  719. .then((res) => {
  720. if (res.state == 200) {
  721. cancel_list.data = res.data;
  722. } else {
  723. ElMessage(res.msg);
  724. }
  725. })
  726. .catch(() => {
  727. //异常处理
  728. });
  729. };
  730. //选择理由
  731. const selectReason = (id) => {
  732. current_reason_id.value = id;
  733. };
  734. //显示选择理由弹窗
  735. const showSelectReasonDialog = (orderSn) => {
  736. if (
  737. !order_info.data.isRefundDeposit &&
  738. (order_info.data.orderType == 105 || order_info.data.orderType == 103) &&
  739. order_info.data.orderSubState == 102
  740. ) {
  741. ElMessageBox.confirm("取消该订单定金不予退还,确定取消?", "提示", {
  742. confirmButtonText: "确定",
  743. cancelButtonText: "取消",
  744. type: "warning",
  745. }).then(() => {
  746. cancel_order.value = true;
  747. order_sn.value = orderSn;
  748. });
  749. } else {
  750. cancel_order.value = true;
  751. order_sn.value = orderSn;
  752. }
  753. };
  754. //确认取消订单
  755. const confirmCancel = () => {
  756. if (!current_reason_id.value) {
  757. ElMessage.warning(L["请选择取消理由"]);
  758. return;
  759. }
  760. post("v3/business/front/orderOperate/cancel", {
  761. parentSn: order_sn.value,
  762. reasonId: current_reason_id.value,
  763. })
  764. .then((res) => {
  765. if (res.state == 200) {
  766. ElMessage.success(L["取消订单成功"]);
  767. cancel_order.value = false;
  768. getOrderDetail();
  769. } else {
  770. ElMessage(res.msg);
  771. }
  772. })
  773. .catch(() => {
  774. //异常处理
  775. });
  776. };
  777. //删除订单
  778. const delOrder = (orderSn) => {
  779. ElMessageBox.confirm(L["确认删除该订单?"], L["提示"], {
  780. confirmButtonText: L["确定"],
  781. cancelButtonText: L["取消"],
  782. type: "warning",
  783. }).then(() => {
  784. post("v3/business/front/orderOperate/delete", {
  785. orderSn,
  786. })
  787. .then((res) => {
  788. if (res.state == 200) {
  789. ElMessage.success(L["删除订单成功"]);
  790. router.go(-1);
  791. } else {
  792. ElMessage(res.msg);
  793. }
  794. });
  795. });
  796. };
  797. //确认收货
  798. const confirmReceipt = (orderSn) => {
  799. ElMessageBox.confirm(L["确认收货?"], L["提示"], {
  800. confirmButtonText: L["确定"],
  801. cancelButtonText: L["取消"],
  802. type: "warning",
  803. })
  804. .then(() => {
  805. post("v3/business/front/orderOperate/receive", {
  806. orderSn,
  807. })
  808. .then((res) => {
  809. if (res.state == 200) {
  810. ElMessage.success(L["确认收货成功"]);
  811. getOrderDetail();
  812. } else {
  813. ElMessage(res.msg);
  814. }
  815. })
  816. .catch(() => {
  817. //异常处理
  818. });
  819. })
  820. .catch(() => {});
  821. };
  822. //选择地址
  823. const editAddress = (order) => {
  824. show_select_address.value = true;
  825. order_sn.value = order.orderSn;
  826. let { receiverAddress, receiverAreaInfo, receiverMobile, receiverName } =
  827. order;
  828. let index = address_list.data.findIndex((i) => {
  829. let { addressAll, memberName, telMobile, detailAddress } = i;
  830. if (
  831. memberName == receiverName &&
  832. receiverMobile == telMobile &&
  833. receiverAddress == detailAddress &&
  834. addressAll == receiverAreaInfo
  835. ) {
  836. return true;
  837. } else {
  838. return false;
  839. }
  840. });
  841. if (index > -1) {
  842. current_address_index.value = index;
  843. } else {
  844. current_address_index.value = -1;
  845. }
  846. };
  847. //获取地址列表
  848. const getAddressList = () => {
  849. get("v3/member/front/memberAddress/list").then((res) => {
  850. if (res.state == 200) {
  851. address_list.data = res.data.list;
  852. } else {
  853. ElMessage(res.msg);
  854. }
  855. });
  856. };
  857. //切换地址
  858. const selectAddress = (index) => {
  859. current_address_index.value = index;
  860. };
  861. //确认修改地址
  862. const confirmChangeAddress = () => {
  863. post("v3/business/front/orderOperate/updateAddress", {
  864. orderSn: order_sn.value,
  865. addressId: address_list.data[current_address_index.value].addressId,
  866. })
  867. .then((res) => {
  868. if (res.state == 200) {
  869. ElMessage.success(L["切换地址成功"]);
  870. show_select_address.value = false;
  871. getOrderDetail();
  872. } else {
  873. ElMessage(res.msg);
  874. }
  875. });
  876. };
  877. //显示查看物流信息
  878. const lookLogistics = (orderSn) => {
  879. get("v3/business/front/logistics/order/getTrace", {
  880. orderSn,
  881. })
  882. .then((res) => {
  883. if (res.state == 200) {
  884. logistics_info.data = res.data;
  885. } else {
  886. ElMessage(res.msg);
  887. }
  888. })
  889. .catch(() => {
  890. //异常处理
  891. });
  892. };
  893. //评价订单
  894. const remainEvaluated = (orderSn) => {
  895. router.push({
  896. path: "/member/order/evaluate",
  897. query: {
  898. orderSn: orderSn,
  899. },
  900. });
  901. };
  902. //立即支付
  903. const goPay = (orderSn) => {
  904. router.push({
  905. path: "/buy/pay",
  906. query: {
  907. paySn: orderSn,
  908. payFrom: 2,
  909. },
  910. });
  911. };
  912. //选择售后服务
  913. const selectService = (orderProductId, orderSn) => {
  914. get("v3/business/front/after/sale/apply/applyInfo", {
  915. orderSn,
  916. orderProductId,
  917. })
  918. .then((res) => {
  919. if (res.state == 200) {
  920. router.push({
  921. path: "/member/order/refund/apply",
  922. query: {
  923. orderState: order_info.data.orderState,
  924. orderProductId,
  925. },
  926. });
  927. } else {
  928. ElMessage(res.msg);
  929. }
  930. });
  931. };
  932. //查看售后详情
  933. const goRefundDetail = (afsSn) => {
  934. router.push({
  935. path: "/member/order/refund/detail",
  936. query: {
  937. orderState: order_info.data.orderState,
  938. afsSn,
  939. },
  940. });
  941. };
  942. onMounted(() => {
  943. getOrderDetail();
  944. getCancelList();
  945. getAddressList();
  946. });
  947. </script>
  948. <style lang="scss">
  949. @use "@/assets/style/member/orderDetail.scss" as *;
  950. </style>