aftersales.vue 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. // 售后列表
  2. <template>
  3. <div class="sld_after_sales_list">
  4. <MemberTitle
  5. :memberTitle="curTitleId == 2 ? L['我的退货'] : L['我的退款']"
  6. style="padding-left: 20px"
  7. ></MemberTitle>
  8. <div class="after_sales_list_main">
  9. <div class="after_sales_title flex_row_start_center">
  10. <router-link
  11. :to="`/member/order/aftersales?${
  12. curTitleId == 2 ? 'type=return' : ''
  13. }`"
  14. class="after_sales_title_pre cursor_pointer"
  15. :class="{ active_title: titleItem.titleId == curTitleId }"
  16. v-for="(titleItem, titleIndex) in afterSalesTitle.data"
  17. :key="titleIndex"
  18. @click="titleNav(titleItem.titleId)"
  19. >
  20. {{ titleItem.content }}
  21. </router-link>
  22. </div>
  23. <div class="after_sales_list">
  24. <div class="after_sales_list_title flex_row_start_center">
  25. <div class="title_goods_des">{{ L["商品明细"] }}</div>
  26. <div class="title_apply_time">{{ L["申请时间"] }}</div>
  27. <div class="title_apply_type">{{ L["申请类型"] }}</div>
  28. <div class="title_status">{{ L["状态"] }}</div>
  29. <div class="title_options">{{ L["操作"] }}</div>
  30. </div>
  31. <div class="after_sales_list_con">
  32. <div
  33. class="list_con_pre"
  34. v-for="(afterSalesItem, afterSalesIndex) in afterSalesList.data"
  35. :key="afterSalesIndex"
  36. >
  37. <div class="list_con_pre_title flex_row_start_center">
  38. <p>{{ L["下单时间"] }}:{{ afterSalesItem.applyTime }}</p>
  39. <p>{{ L["订单号"] }}:{{ afterSalesItem.orderSn }}</p>
  40. <p
  41. class="storeName cursor_pointer"
  42. @click="toStore(afterSalesItem.storeId)"
  43. >
  44. {{ afterSalesItem.storeName }}
  45. </p>
  46. </div>
  47. <div class="list_con">
  48. <div class="list_pre flex_row_start_center">
  49. <div
  50. class="list_goods_des borderRight flex_row_start_center cursor_pointer"
  51. >
  52. <router-link
  53. target="_blank"
  54. :to="'/goods/detail/'+ calcProductName(afterSalesItem.goodsName) +'_'+ afterSalesItem.productId"
  55. >
  56. <div
  57. class="list_goods_img"
  58. :style="{
  59. backgroundImage:
  60. 'url(' + afterSalesItem.productImage + ')',
  61. }"
  62. ></div>
  63. <div class="goods_des">
  64. <p>{{ afterSalesItem.goodsName }}</p>
  65. <p>{{ afterSalesItem.specValues }}</p>
  66. </div>
  67. </router-link>
  68. </div>
  69. <div class="list_apply_time borderRight flex_row_center_center">
  70. {{ afterSalesItem.applyTime }}
  71. </div>
  72. <div class="list_apply_type borderRight flex_row_center_center">
  73. {{ afterSalesItem.returnTypeValue }}
  74. </div>
  75. <div class="list_status borderRight flex_row_center_center">
  76. {{ afterSalesItem.stateValue }}
  77. </div>
  78. <div class="list_options flex_column_center_center">
  79. <span
  80. class="cursor_pointer"
  81. @click="goRefundDetail(afterSalesItem)"
  82. >{{ L["查看详情"] }}</span
  83. >
  84. <span
  85. class="cursor_pointer"
  86. v-if="
  87. afterSalesItem.returnType == 2 &&
  88. afterSalesItem.state == 201
  89. "
  90. @click="logisticsBill(afterSalesItem)"
  91. >{{ L["发货"] }}</span
  92. >
  93. </div>
  94. </div>
  95. </div>
  96. </div>
  97. <SldCommonEmpty
  98. v-show="!afterSalesList.data.length"
  99. totalWidth="900"
  100. ></SldCommonEmpty>
  101. <div
  102. class="flex_row_end_center sld_pagination sld_page_bottom"
  103. v-if="
  104. aftersalesDetail.data &&
  105. aftersalesDetail.data.pagination &&
  106. aftersalesDetail.data.pagination.total
  107. "
  108. >
  109. <el-pagination
  110. @current-change="handleCurrentChange"
  111. v-model:currentPage="current"
  112. :page-size="pageSize"
  113. layout="prev, pager, next, jumper"
  114. :total="aftersalesDetail.data.pagination.total"
  115. :hide-on-single-page="true"
  116. >
  117. </el-pagination>
  118. </div>
  119. </div>
  120. </div>
  121. </div>
  122. </div>
  123. </template>
  124. <script setup>
  125. import { onMounted, reactive, ref, getCurrentInstance, watchEffect } from "vue";
  126. import { ElMessage, ElPagination } from "element-plus";
  127. // import { lang_zn } from "@/assets/language/zh";
  128. import { getCurLanguage } from '@/composables/common.js';
  129. // const L = lang_zn;
  130. const L = getCurLanguage();
  131. definePageMeta({
  132. layout: "member",
  133. middleware: ["auth"],
  134. });
  135. const { proxy } = getCurrentInstance();
  136. const router = useRouter();
  137. const afterSalesTitle = reactive({
  138. data: [
  139. {
  140. titleId: 1,
  141. content: L["仅退款"],
  142. },
  143. {
  144. titleId: 2,
  145. content: L["退货退款"],
  146. },
  147. ],
  148. });
  149. const curTitleId = ref(1); //当前选中的标题id
  150. const afterSalesList = reactive({ data: [] }); //售后列表
  151. const pageSize = ref(10);
  152. const current = ref(1);
  153. const aftersalesDetail = reactive({ data: {} }); //售后列表详情数据
  154. const toStore = (storeId) => {
  155. if (storeId == 0) {
  156. return;
  157. }
  158. let routeUrl = router.resolve({
  159. path: "/store",
  160. query: { vid: storeId }
  161. });
  162. window.open(routeUrl.href, '_blank');
  163. };
  164. onMounted(() => {
  165. getAfterSalesDet();
  166. });
  167. router.beforeEach((to, from, next) => {
  168. if (to.query.type == "return") {
  169. curTitleId.value = 2; //退款退货
  170. } else {
  171. curTitleId.value = 1; //仅退款
  172. }
  173. getAfterSalesDet();
  174. next();
  175. });
  176. watchEffect(() => {
  177. let tmpPath = router.currentRoute.value.fullPath;
  178. if (tmpPath == "/member/order/aftersales?type=return") {
  179. curTitleId.value = 2; //退款退货
  180. } else if (tmpPath == "/member/order/aftersales") {
  181. curTitleId.value = 1; //我的退款
  182. }
  183. });
  184. //获取售后订单列表
  185. const getAfterSalesDet = () => {
  186. let params = {
  187. returnType: curTitleId.value,
  188. current: current.value,
  189. pageSize: pageSize.value,
  190. };
  191. get("v3/business/front/after/sale/list", params).then((res) => {
  192. if (res.state == 200) {
  193. let result = res.data;
  194. aftersalesDetail.data = result;
  195. afterSalesList.data = result.list;
  196. } else {
  197. ElMessage.error(res.data);
  198. }
  199. });
  200. };
  201. //选择类型
  202. const titleNav = (titleId) => {
  203. curTitleId.value = titleId;
  204. getAfterSalesDet();
  205. };
  206. //上一页
  207. const handlePrevCilickChange = () => {
  208. current.value--;
  209. getAfterSalesDet();
  210. };
  211. //下一页
  212. const handleNextCilickChange = () => {
  213. current.value++;
  214. getAfterSalesDet();
  215. };
  216. //选择页面
  217. const handleCurrentChange = () => {
  218. getAfterSalesDet();
  219. };
  220. //查看售后详情
  221. const goRefundDetail = (afterSalesItem) => {
  222. router.push({
  223. path: "/member/order/refund/detail",
  224. query: {
  225. curTitleId: curTitleId.value,
  226. orderState: afterSalesItem.orderState,
  227. afsSn: afterSalesItem.afsSn,
  228. },
  229. });
  230. };
  231. //填写物流单号
  232. const logisticsBill = (afterSalesItem) => {
  233. router.push({
  234. path: "/member/order/logistics",
  235. query: {
  236. afsSn: afterSalesItem.afsSn,
  237. },
  238. });
  239. };
  240. </script>
  241. <style lang="scss" scoped>
  242. @use "@/assets/style/base.scss" as *;
  243. @import "@/assets/style/iconfont.css";
  244. @use "@/assets/style/afterSalesList.scss" as *;
  245. .storeName {
  246. color: #333;
  247. &:hover {
  248. color: $colorMain;
  249. }
  250. }
  251. </style>