list.vue 28 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030
  1. <!--
  2. * @Author: wangwei
  3. * @Date: 2020-12-28 16:06:28
  4. * @LastEditTime: 2021-01-15 09:44:38
  5. * @LastEditors: Please set LastEditors
  6. * @Description: In User Settings Edit
  7. * @FilePath: /java-pc/src/views/member/order/List.vue
  8. -->
  9. <template>
  10. <div class="sld_order_list">
  11. <MemberTitle :memberTitle="L['我的订单']"></MemberTitle>
  12. <div class="container">
  13. <h3>{{ L["我的订单"] }}</h3>
  14. <div class="sld_order_nav">
  15. <div
  16. class="sld_order_nav_con1 flex_row_start_center pointer sld_order_tag"
  17. >
  18. <div
  19. :class="{ item: true, active: current_state == '' }"
  20. @click="changeState('')"
  21. >
  22. {{ L["全部订单"] }}
  23. </div>
  24. <div
  25. :class="{ item: true, active: current_state == 10 }"
  26. @click="changeState(10)"
  27. >
  28. {{ L["待支付"] }}
  29. <div
  30. class="item_tag"
  31. :class="{
  32. item_tag_one: memberInfo.toPaidOrder > 9,
  33. item_tag_two: memberInfo.toPaidOrder > 99,
  34. }"
  35. v-if="memberInfo.toPaidOrder > 0"
  36. >
  37. {{ memberInfo.toPaidOrder < 99 ? memberInfo.toPaidOrder : "99+" }}
  38. </div>
  39. </div>
  40. <div
  41. :class="{ item: true, active: current_state == 20 }"
  42. @click="changeState(20)"
  43. >
  44. {{ L["待发货"] }}
  45. <div
  46. class="item_tag"
  47. :class="{
  48. item_tag_one: memberInfo.toDeliverOrder > 9,
  49. item_tag_two: memberInfo.toDeliverOrder > 99,
  50. }"
  51. v-if="memberInfo.toDeliverOrder > 0"
  52. >
  53. {{
  54. memberInfo.toDeliverOrder < 99
  55. ? memberInfo.toDeliverOrder
  56. : "99+"
  57. }}
  58. </div>
  59. </div>
  60. <div
  61. :class="{ item: true, active: current_state == 30 }"
  62. @click="changeState(30)"
  63. >
  64. {{ L["待收货"] }}
  65. <div
  66. class="item_tag"
  67. :class="{
  68. item_tag_one: memberInfo.toReceivedOrder > 9,
  69. item_tag_two: memberInfo.toReceivedOrder > 99,
  70. }"
  71. v-if="memberInfo.toReceivedOrder > 0"
  72. >
  73. {{
  74. memberInfo.toReceivedOrder < 99
  75. ? memberInfo.toReceivedOrder
  76. : "99+"
  77. }}
  78. </div>
  79. </div>
  80. <div
  81. :class="{
  82. item: true,
  83. active: current_state == 40 && evaluate_state != 1,
  84. }"
  85. @click="changeState(40)"
  86. >
  87. {{ L["已完成"] }}
  88. </div>
  89. <div
  90. :class="{
  91. item: true,
  92. active: current_state == 40 && evaluate_state == 1,
  93. }"
  94. @click="changeState(40, 1)"
  95. >
  96. {{ L["待评价"] }}
  97. <div
  98. class="item_tag"
  99. :class="{
  100. item_tag_one: memberInfo.toEvaluateOrder > 9,
  101. item_tag_two: memberInfo.toEvaluateOrder > 99,
  102. }"
  103. v-if="memberInfo.toEvaluateOrder > 0"
  104. >
  105. {{
  106. memberInfo.toEvaluateOrder < 99
  107. ? memberInfo.toEvaluateOrder
  108. : "99+"
  109. }}
  110. </div>
  111. </div>
  112. </div>
  113. <div class="search_con flex_row_between_center search_info">
  114. <!-- <el-select v-model="selectTime" placeholder="请选择" @change="changeTime"
  115. v-if="selectList.data.length > 0">
  116. <el-option v-for="item in selectList.data" :key="item" :value="item.id" :label="item.name">
  117. </el-option>
  118. </el-select> -->
  119. <div class="search_incon1 flex_row_start_center">
  120. <el-input
  121. class="search_input"
  122. v-model="keyword"
  123. :placeholder="L['订单号/商品名称/店铺名称']"
  124. clearable
  125. @clear="clear"
  126. >
  127. </el-input>
  128. <div class="search pointer" @click="getOrderList">
  129. {{ L["搜索"] }}
  130. </div>
  131. </div>
  132. </div>
  133. </div>
  134. <div class="order_title_info flex_row_start_center all_order_info">
  135. <el-select
  136. v-model="selectTime"
  137. placeholder="请选择"
  138. @change="changeTime"
  139. v-if="selectList.data.length > 0"
  140. size="small"
  141. class="select_el"
  142. :popper-append-to-body="false"
  143. >
  144. <el-option
  145. v-for="item in selectList.data"
  146. :key="item"
  147. :value="item.id"
  148. :label="item.name"
  149. >
  150. </el-option>
  151. </el-select>
  152. <div class="time_select select_time">{{ L["订单详情"] }}</div>
  153. <div class="good_price">{{ L["单价"] }}</div>
  154. <div class="num">{{ L["数量"] }}</div>
  155. <!-- <div class="after">{{L['售后维权']}}</div> -->
  156. <div class="order_price">{{ L["订单金额"] }}</div>
  157. <div class="state">{{ L["状态"] }}</div>
  158. <div class="oprate">{{ L["操作"] }}</div>
  159. </div>
  160. <div
  161. class="order_item"
  162. v-for="(orderItem, index) in order_list.data"
  163. :key="index"
  164. >
  165. <div class="title flex_row_start_center">
  166. <div>{{ L["下单时间"] }}:{{ orderItem.createTime }}</div>
  167. <div class="order_num" @click="goDetail(orderItem.orderSn)">
  168. {{ L["订单号"] }}: {{ orderItem.orderSn }}
  169. </div>
  170. <div class="store_name" @click="toStore(orderItem.storeId)">
  171. {{ orderItem.storeName }}
  172. </div>
  173. <div class="store_service" @click="toKefu(orderItem)">
  174. <img src="/goods/server.png" alt="" />
  175. </div>
  176. </div>
  177. <div class="good_info_con flex_row_start_center">
  178. <div class="good_info flex_column_center_start">
  179. <div
  180. class="item flex_row_start_center"
  181. v-for="(goodItem, index) in orderItem.orderProductListVOList"
  182. :key="index"
  183. >
  184. <div class="good flex_row_start_center">
  185. <div class="left">
  186. <div class="virtual_tag" v-if="orderItem.isVirtualGoods == 2">
  187. 虚拟
  188. </div>
  189. <coverImage
  190. :src="goodItem.productImage"
  191. @click="goGoodsDetail(goodItem.goodsName,goodItem.productId)"
  192. width="100"
  193. height="100"
  194. >
  195. </coverImage>
  196. </div>
  197. <div class="right">
  198. <div
  199. class="good_name overflow_ellipsis_two"
  200. @click="goGoodsDetail(goodItem.goodsName,goodItem.productId)"
  201. >
  202. {{ goodItem.goodsName }}
  203. </div>
  204. <div class="spec overflow_ellipsis">
  205. {{ goodItem.specValues }}
  206. </div>
  207. </div>
  208. </div>
  209. <div class="good_price">¥{{ goodItem.productShowPrice }}</div>
  210. <div class="num">*{{ goodItem.productNum }}</div>
  211. </div>
  212. </div>
  213. <!-- <div class="after flex_row_center_center">--</div> -->
  214. <div class="order_price flex_row_center_center">
  215. ¥{{ orderItem.totalMoney }}
  216. </div>
  217. <div class="state flex_column_center_center">
  218. <span class="state_value">{{ orderItem.orderStateValue }}</span>
  219. </div>
  220. <div class="oprate flex_column_center_center">
  221. <span class="detail" @click="goDetail(orderItem.orderSn)">{{
  222. L["订单详情"]
  223. }}</span>
  224. <!-- 待付款、待发货订单可以修改地址 -->
  225. <div
  226. v-if="
  227. (orderItem.orderState == 10 || orderItem.orderState == 20) &&
  228. orderItem.isVirtualGoods == 1
  229. "
  230. class="action-btn flex_row_center_center"
  231. @click="editAddress(orderItem)"
  232. >
  233. {{ L["修改地址"] }}
  234. </div>
  235. <!-- 待收货、已完成订单可以查看物流 -->
  236. <div
  237. v-if="
  238. (orderItem.orderState == 30 || orderItem.orderState == 40) &&
  239. orderItem.isVirtualGoods == 1
  240. "
  241. class="action-btn flex_row_center_center"
  242. @click="
  243. lookLogistics(orderItem.orderSn, orderItem.productLeadLittle)
  244. "
  245. >
  246. {{ L["查看物流"] }}
  247. </div>
  248. <!-- 待收货订单可以确认收货 -->
  249. <div
  250. v-if="orderItem.orderState == 30"
  251. class="action-btn recom flex_row_center_center"
  252. @click="confirmReceipt(orderItem.orderSn)"
  253. >
  254. {{ L["确认收货"] }}
  255. </div>
  256. <!-- 待评价订单可以评价 -->
  257. <div
  258. v-if="orderItem.orderState == 40 && orderItem.evaluateState != 3"
  259. class="action-btn recom flex_row_center_center"
  260. @click="remainEvaluated(orderItem.orderSn)"
  261. >
  262. {{ L["评价"] }}
  263. </div>
  264. <!-- 待付款订单可以取消订单 -->
  265. <div
  266. v-if="orderItem.orderState == 10"
  267. class="action-btn flex_row_center_center"
  268. @click="showSelectReasonDialog(orderItem)"
  269. >
  270. {{ L["取消订单"] }}
  271. </div>
  272. <!-- 待付款订单可以立即支付 -->
  273. <div
  274. v-if="
  275. orderItem.orderState == 10 &&
  276. !(
  277. (orderItem.orderType == 105 || orderItem.orderType == 103) &&
  278. orderItem.orderSubState == 102 &&
  279. orderItem.depositRemainTime > 0
  280. )
  281. "
  282. class="action-btn recom flex_row_center_center"
  283. @click="goPay(orderItem.paySn)"
  284. >
  285. {{ L["立即支付"] }}
  286. </div>
  287. <!-- 已取消、全部评价完成订单可以删除订单 -->
  288. <div
  289. v-if="
  290. orderItem.orderState == 0 ||
  291. (orderItem.orderState == 40 && orderItem.evaluateState == 3)
  292. "
  293. class="action-btn flex_row_center_center"
  294. @click="delOrder(orderItem.orderSn)"
  295. >
  296. {{ L["删除订单"] }}
  297. </div>
  298. </div>
  299. </div>
  300. </div>
  301. <el-pagination
  302. @current-change="handleCurrentChange"
  303. :currentPage="pageData.current"
  304. :page-size="pageData.pageSize"
  305. layout="prev, pager, next, jumper"
  306. :total="pageData.total"
  307. :hide-on-single-page="true"
  308. class="flex_row_end_center"
  309. >
  310. </el-pagination>
  311. <SldCommonEmpty
  312. v-if="order_list.data.length == 0"
  313. :tip="L['暂无订单~']"
  314. totalWidth="934px"
  315. />
  316. </div>
  317. <!-- 取消理由弹窗 start -->
  318. <el-dialog
  319. :title="L['取消订单理由']"
  320. v-model="cancel_order"
  321. customClass="select_reason_width"
  322. :before-close="(current_reason_id = '')"
  323. lock-sroll="false"
  324. >
  325. <div class="cancel_list_con">
  326. <div
  327. v-for="(reasonItem, index) in cancel_list.data"
  328. :key="index"
  329. :class="{
  330. reason_item: true,
  331. flex_row_between_center: true,
  332. active: current_reason_id == reasonItem.reasonId,
  333. }"
  334. @click="selectReason(reasonItem.reasonId)"
  335. >
  336. <span class="reason_text">{{ reasonItem.content }}</span>
  337. <img
  338. :src="
  339. current_reason_id == reasonItem.reasonId ? selected : not_select
  340. "
  341. alt
  342. />
  343. </div>
  344. </div>
  345. <div class="confirm_cancel_btn" @click="confirmCancel()">
  346. {{ L["确定"] }}
  347. </div>
  348. </el-dialog>
  349. <!-- 取消地址理由弹窗 end -->
  350. <!-- 查看物流弹窗 start -->
  351. <el-dialog
  352. :title="L['物流信息']"
  353. v-model="show_logistics"
  354. customClass="select_reason_width"
  355. :before-close="handleClose"
  356. lock-sroll="false"
  357. >
  358. <div class="logistics_info">
  359. <p>
  360. {{ logistics_info.data.type == 1 ? L["联系电话"] : L["承运人"] }}:{{
  361. logistics_info.data.expressName
  362. }}
  363. </p>
  364. <p>
  365. {{ logistics_info.data.type == 1 ? L["联系人"] : L["运单号"] }}:{{
  366. logistics_info.data.expressNumber
  367. }}
  368. </p>
  369. </div>
  370. <div class="logistics_list_con">
  371. <el-timeline>
  372. <el-timeline-item
  373. v-for="(logistics, index) in logistics_info.data.routeList"
  374. :key="index"
  375. :timestamp="logistics.remark"
  376. >{{ logistics.acceptTime }}
  377. </el-timeline-item>
  378. </el-timeline>
  379. </div>
  380. </el-dialog>
  381. <!-- 查看物流弹窗 end -->
  382. <!-- 地址选择弹窗 start -->
  383. <el-dialog
  384. :title="L['更换地址']"
  385. v-model="show_select_address"
  386. customClass="select_address_width"
  387. :before-close="handleClose"
  388. lock-sroll="false"
  389. >
  390. <div class="out_stock_dialog address_con">
  391. <div
  392. v-for="(item, index) in address_list.data"
  393. :key="index"
  394. @click="selectAddress(index)"
  395. :class="{
  396. address_item: true,
  397. flex_column_start_start: true,
  398. select: current_address_index == index,
  399. }"
  400. >
  401. <span>{{ L["收货人"] }}:{{ item.memberName }}</span>
  402. <span>{{ L["联系方式"] }}:{{ item.telMobile }}</span>
  403. <span class="address_text">
  404. <div>{{ L["收货地址"] }}:</div>
  405. <div>{{ item.addressAll }} {{ item.detailAddress }}</div>
  406. </span>
  407. <img
  408. v-if="current_address_index == index"
  409. class="selected"
  410. :src="invoice_selected"
  411. alt
  412. />
  413. </div>
  414. </div>
  415. <div class="btn_con flex_row_center_center">
  416. <div class="confirm_cancel_btn" @click="confirmChangeAddress()">
  417. {{ L["提交修改"] }}
  418. </div>
  419. </div>
  420. </el-dialog>
  421. <!-- 地址选择弹窗 end -->
  422. </div>
  423. </template>
  424. <script setup>
  425. import { reactive, getCurrentInstance, ref, onMounted, computed } from "vue";
  426. import {
  427. ElInput,
  428. ElMessage,
  429. ElMessageBox,
  430. ElTimeline,
  431. ElDialog,
  432. ElPagination,
  433. ElSelect,
  434. ElOption,
  435. ElTimelineItem,
  436. } from "element-plus";
  437. // import { lang_zn } from "@/assets/language/zh";
  438. import { getCurLanguage } from '@/composables/common.js';
  439. import { useFiltersStore } from "@/store/filter.js";
  440. const filtersStore = useFiltersStore();
  441. // const L = lang_zn;
  442. const L = getCurLanguage();
  443. definePageMeta({
  444. layout: "member",
  445. middleware: ["auth"],
  446. });
  447. const router = useRouter();
  448. const route = useRoute();
  449. const { proxy } = getCurrentInstance();
  450. const current_state = ref(""); //当前列表订单状态
  451. const evaluate_state = ref(0); //是否是待评价
  452. const order_list = reactive({ data: [] });
  453. const orderSn = ref("");
  454. const cancel_order = ref(false); //是否显示取消订单弹窗
  455. const not_select = ref("/order/not_select.png");
  456. const selected = ref("/order/selected.png");
  457. const invoice_selected = ref("/buy/invoice_selected.png");
  458. const cancel_list = reactive({ data: [] });
  459. const current_reason_id = ref(); //记录当前已选择理由id
  460. const order_sn = ref(); //记录当前操作的订单号
  461. const parentOrderSn = ref();
  462. const show_logistics = ref(false);
  463. const logistics_info = reactive({ data: {} });
  464. const show_select_address = ref(false); //是否显示选择地址弹窗
  465. const address_list = reactive({ data: [] }); //地址列表
  466. const current_address_index = ref(0); //记录当前选择的地址
  467. const selectTime = ref("");
  468. const selectList = reactive({ data: [] });
  469. const pageData = reactive({
  470. current: 1,
  471. pageSize: 10,
  472. total: 0,
  473. });
  474. const keyword = ref("");
  475. const memberInfo = computed(() => filtersStore.getMemberInfo);
  476. //去商品详情页
  477. const goGoodsDetail = (goodsName,productId) => {
  478. // let routeUrl = router.resolve({
  479. // path: "/goods/detail",
  480. // query: { productId: productId }
  481. // });
  482. let href = "/goods/detail/"+ calcProductName(goodsName) +'_'+ productId
  483. window.open(href, "_blank");
  484. };
  485. //去店铺详情
  486. const toStore = (storeId) => {
  487. if (storeId == 0) {
  488. return;
  489. }
  490. let routeUrl = router.resolve({
  491. path: "/store",
  492. query: { vid: storeId }
  493. });
  494. window.open(routeUrl.href, '_blank');
  495. };
  496. //获取下拉时间
  497. const getTime = () => {
  498. get("v3/business/front/orderInfo/timeList").then((res) => {
  499. if (res.data.length > 0) {
  500. selectList.data = res.data;
  501. selectTime.value = selectList.data[0].id;
  502. }
  503. });
  504. };
  505. //切换搜索时间
  506. const changeTime = () => {
  507. resetPageData();
  508. getOrderList();
  509. };
  510. //重置搜索页面数据
  511. const resetPageData = () => {
  512. pageData.current = 1;
  513. pageData.total = 0;
  514. };
  515. //改变订单状态
  516. const changeState = (orderState, evaluateState) => {
  517. if (evaluateState) {
  518. evaluate_state.value = evaluateState;
  519. } else {
  520. evaluate_state.value = "";
  521. }
  522. current_state.value = orderState;
  523. pageData.current = 1;
  524. router.push({
  525. path: "/member/order/list",
  526. query: {
  527. orderState,
  528. evaluateState,
  529. },
  530. });
  531. getOrderList();
  532. };
  533. //获取订单列表
  534. const getOrderList = () => {
  535. var param = {};
  536. if (evaluate_state.value == 1) {
  537. param.evaluateState = 1;
  538. }
  539. if (current_state.value) {
  540. param.orderState = current_state.value;
  541. }
  542. param.current = pageData.current;
  543. param.pageSize = pageData.pageSize;
  544. if (orderSn.value) {
  545. param.orderSn = orderSn.value;
  546. }
  547. param.time = selectTime.value;
  548. if (keyword.value) {
  549. param.keyword = keyword.value;
  550. }
  551. get("v3/business/front/orderInfo/list", param)
  552. .then((res) => {
  553. if (res.state == 200) {
  554. order_list.data = res.data.list;
  555. pageData.total = res.data.pagination.total;
  556. } else {
  557. ElMessage(res.msg);
  558. }
  559. })
  560. .catch(() => {
  561. //异常处理
  562. });
  563. };
  564. // 获取订单取消理由列表
  565. const getCancelList = () => {
  566. get("v3/system/front/reason/list", {
  567. type: 104,
  568. })
  569. .then((res) => {
  570. if (res.state == 200) {
  571. cancel_list.data = res.data;
  572. } else {
  573. ElMessage(res.msg);
  574. }
  575. })
  576. .catch(() => {
  577. //异常处理
  578. });
  579. };
  580. //选择理由
  581. const selectReason = (id) => {
  582. current_reason_id.value = id;
  583. };
  584. //显示选择理由弹窗
  585. const showSelectReasonDialog = (orderItem) => {
  586. if (
  587. !orderItem.isRefundDeposit &&
  588. (orderItem.orderType == 105 || orderItem.orderType == 103) &&
  589. orderItem.orderSubState == 102
  590. ) {
  591. ElMessageBox.confirm("取消该订单定金不予退还,确定取消?", "提示", {
  592. confirmButtonText: "确定",
  593. cancelButtonText: "取消",
  594. type: "warning",
  595. }).then(() => {
  596. cancel_order.value = true;
  597. parentOrderSn.value = orderItem.parentSn;
  598. });
  599. } else {
  600. cancel_order.value = true;
  601. parentOrderSn.value = orderItem.parentSn;
  602. }
  603. };
  604. //显示查看物流信息
  605. const lookLogistics = (orderSn) => {
  606. get("v3/business/front/logistics/order/getTrace", {
  607. orderSn,
  608. })
  609. .then((res) => {
  610. if (res.state == 200) {
  611. show_logistics.value = true;
  612. logistics_info.data = res.data;
  613. } else {
  614. ElMessage(res.msg);
  615. }
  616. })
  617. .catch(() => {
  618. //异常处理
  619. });
  620. };
  621. //删除订单
  622. const delOrder = (orderSn) => {
  623. ElMessageBox.confirm(L["确认删除该订单?"], L["提示"], {
  624. confirmButtonText: L["确定"],
  625. cancelButtonText: L["取消"],
  626. type: "warning",
  627. })
  628. .then(() => {
  629. post("v3/business/front/orderOperate/delete", {
  630. orderSn,
  631. })
  632. .then((res) => {
  633. if (res.state == 200) {
  634. ElMessage.success(L["删除订单成功"]);
  635. getOrderList();
  636. } else {
  637. ElMessage(res.msg);
  638. }
  639. })
  640. .catch(() => {
  641. //异常处理
  642. });
  643. })
  644. .catch(() => {});
  645. };
  646. //确认取消订单
  647. const confirmCancel = () => {
  648. if (!current_reason_id.value) {
  649. ElMessage.warning(L["请选择取消理由"]);
  650. return;
  651. }
  652. post("v3/business/front/orderOperate/cancel", {
  653. parentSn: parentOrderSn.value,
  654. reasonId: current_reason_id.value,
  655. })
  656. .then((res) => {
  657. if (res.state == 200) {
  658. ElMessage.success(L["取消订单成功"]);
  659. cancel_order.value = false;
  660. getOrderList();
  661. } else {
  662. ElMessage(res.msg);
  663. }
  664. })
  665. .catch(() => {
  666. //异常处理
  667. });
  668. };
  669. //确认收货
  670. const confirmReceipt = (orderSn) => {
  671. ElMessageBox.confirm(L["确认收货?"], L["提示"], {
  672. confirmButtonText: L["确定"],
  673. cancelButtonText: L["取消"],
  674. type: "warning",
  675. })
  676. .then(() => {
  677. post("v3/business/front/orderOperate/receive", {
  678. orderSn,
  679. })
  680. .then((res) => {
  681. if (res.state == 200) {
  682. ElMessage.success(L["确认收货成功"]);
  683. getOrderList();
  684. } else {
  685. ElMessage(res.msg);
  686. }
  687. })
  688. .catch(() => {
  689. //异常处理
  690. });
  691. })
  692. .catch(() => {});
  693. };
  694. //立即支付
  695. const goPay = (orderSn) => {
  696. router.push({
  697. path: "/buy/pay",
  698. query: {
  699. paySn: orderSn,
  700. payFrom: 2,
  701. },
  702. });
  703. };
  704. //选择地址
  705. const editAddress = (order) => {
  706. show_select_address.value = true;
  707. order_sn.value = order.orderSn;
  708. let { receiverAddress, receiverAreaInfo, receiverMobile, receiverName } =
  709. order;
  710. let index = address_list.data.findIndex((i) => {
  711. let { addressAll, memberName, telMobile, detailAddress } = i;
  712. if (
  713. memberName == receiverName &&
  714. receiverMobile == telMobile &&
  715. receiverAddress == detailAddress &&
  716. addressAll == receiverAreaInfo
  717. ) {
  718. return true;
  719. } else {
  720. return false;
  721. }
  722. });
  723. if (index > -1) {
  724. current_address_index.value = index;
  725. } else {
  726. current_address_index.value = -1;
  727. }
  728. };
  729. //获取地址列表
  730. const getAddressList = () => {
  731. get("v3/member/front/memberAddress/list").then((res) => {
  732. if (res.state == 200) {
  733. address_list.data = res.data.list;
  734. } else {
  735. ElMessage(res.msg);
  736. }
  737. });
  738. };
  739. //切换地址
  740. const selectAddress = (index) => {
  741. current_address_index.value = index;
  742. };
  743. //确认修改地址
  744. const confirmChangeAddress = () => {
  745. post("v3/business/front/orderOperate/updateAddress", {
  746. orderSn: order_sn.value,
  747. addressId: address_list.data[current_address_index.value].addressId,
  748. })
  749. .then((res) => {
  750. if (res.state == 200) {
  751. ElMessage.success(L["切换地址成功"]);
  752. show_select_address.value = false;
  753. } else {
  754. ElMessage(res.msg);
  755. }
  756. })
  757. .catch(() => {
  758. //异常处理
  759. });
  760. };
  761. //评价订单
  762. const remainEvaluated = (orderSn) => {
  763. router.push({
  764. path: "/member/order/evaluate",
  765. query: {
  766. orderSn: orderSn,
  767. },
  768. });
  769. };
  770. //详情
  771. const goDetail = (orderSn) => {
  772. router.push({
  773. path: "/member/order/detail",
  774. query: {
  775. orderSn: orderSn,
  776. },
  777. });
  778. };
  779. //向前翻页
  780. const handlePrevCilickChange = (e) => {
  781. pageData.current = e;
  782. getOrderList();
  783. };
  784. //向后翻页
  785. const handleNextCilickChange = () => {
  786. pageData.current++;
  787. getOrderList();
  788. };
  789. //页数改变
  790. const handleCurrentChange = (current) => {
  791. pageData.current = current;
  792. getOrderList();
  793. };
  794. onMounted(() => {
  795. if (route.query.orderState) {
  796. current_state.value = route.query.orderState;
  797. } else {
  798. current_state.value = "";
  799. }
  800. if (route.query.evaluateState) {
  801. evaluate_state.value = route.query.evaluateState;
  802. } else {
  803. evaluate_state.value = "";
  804. }
  805. getTime();
  806. getOrderList();
  807. getCancelList();
  808. getAddressList();
  809. });
  810. //清空搜索订单
  811. const clear = () => {
  812. orderSn.value = "";
  813. getOrderList();
  814. };
  815. const toKefu = (item) => {
  816. // let chatInfo = {
  817. // storeId: item.storeId,
  818. // vendorAvatar: item.storeLogo,
  819. // storeName: item.storeName,
  820. // source: "从订单列表进入",
  821. // };
  822. // store.commit("saveChatBaseInfo", chatInfo);
  823. // let newWin = router.resolve({
  824. // path: "/service",
  825. // query: {
  826. // vid: item.storeId,
  827. // },
  828. // });
  829. // window.open(newWin.href, "_blank");
  830. };
  831. router.beforeEach((to, from, next) => {
  832. if (to.query.orderState) {
  833. current_state.value = to.query.orderState;
  834. } else {
  835. current_state.value = "";
  836. }
  837. if (to.query.evaluateState) {
  838. evaluate_state.value = to.query.evaluateState;
  839. } else {
  840. evaluate_state.value = "";
  841. }
  842. if (to.path == "/member/order/list") {
  843. getOrderList();
  844. }
  845. next();
  846. });
  847. </script>
  848. <style lang="scss">
  849. @import "@/assets/style/orderList.scss";
  850. .el-pager li.active {
  851. color: $colorMain;
  852. cursor: default;
  853. }
  854. .el-pager li:hover {
  855. color: $colorMain;
  856. }
  857. .sld_order_list {
  858. .el-select-dropdown__item.selected {
  859. color: $colorMain;
  860. }
  861. .container {
  862. .sld_order_nav {
  863. display: flex;
  864. justify-content: space-between;
  865. .search_info {
  866. width: auto;
  867. border-top: 0;
  868. .search_input {
  869. height: 38px;
  870. }
  871. }
  872. .sld_order_nav_con1 {
  873. .item {
  874. margin-left: 18px;
  875. margin-right: 18px;
  876. padding-left: 0;
  877. padding-right: 0;
  878. height: 42px;
  879. line-height: 42px;
  880. font-size: 14px;
  881. text-align: center;
  882. border-bottom: 0;
  883. &:not(:first-child) {
  884. border-left: none;
  885. }
  886. &:hover {
  887. color: $colorMain2;
  888. }
  889. }
  890. .active {
  891. color: $colorMain2;
  892. font-weight: 600;
  893. position: relative;
  894. &::after {
  895. position: absolute;
  896. content: "";
  897. left: 0;
  898. bottom: -1px;
  899. width: 100%;
  900. height: 2px;
  901. background-color: $colorMain2;
  902. }
  903. }
  904. }
  905. .search_incon1 {
  906. width: 321px;
  907. height: 34px;
  908. background: #ffffff;
  909. border: 1px solid #e8e8f1;
  910. }
  911. }
  912. .all_order_info {
  913. position: relative;
  914. .select_el {
  915. position: absolute;
  916. border: 0;
  917. left: 20px;
  918. }
  919. .el-input__inner {
  920. border: 0;
  921. background-color: #f7f7f7;
  922. max-width: 123px;
  923. // height: 36px;
  924. font-size: 13px;
  925. padding: 0;
  926. }
  927. .el-select-dropdown__item {
  928. padding: 0;
  929. font-size: 13px;
  930. text-align: left;
  931. padding-left: 10px;
  932. // height: 39px;
  933. &::after {
  934. content: " ";
  935. width: 104px;
  936. height: 1px;
  937. border-bottom: 1px dotted #c0c4cc;
  938. opacity: 0.3;
  939. display: block;
  940. }
  941. &:last-child {
  942. &::after {
  943. content: "";
  944. width: 0;
  945. height: 0;
  946. border-bottom: 0;
  947. opacity: 0.3;
  948. display: block;
  949. }
  950. }
  951. &:hover {
  952. background-color: transparent;
  953. }
  954. }
  955. .el-select-dropdown__item.hover {
  956. background-color: transparent;
  957. }
  958. // .el-scrollbar__wrap{
  959. // height: 247px;
  960. // }
  961. }
  962. .select_time {
  963. padding-left: 52px;
  964. }
  965. .sld_order_tag {
  966. .item {
  967. position: relative;
  968. }
  969. .item_tag {
  970. position: absolute;
  971. background-color: #00985e;
  972. color: #fff;
  973. top: 4px;
  974. right: -16px;
  975. height: 18px;
  976. display: flex;
  977. line-height: 19px;
  978. justify-content: center;
  979. border-radius: 18px;
  980. font-size: 12px;
  981. text-align: center;
  982. padding: 0 5px;
  983. font-weight: 500;
  984. }
  985. .item_tag_one {
  986. right: -21px;
  987. }
  988. .item_tag_two {
  989. right: -30px;
  990. }
  991. }
  992. }
  993. }
  994. </style>