index.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. <template>
  2. <ContentWrap>
  3. <!-- 订单信息 -->
  4. <el-descriptions title="退款订单信息">
  5. <el-descriptions-item label="订单号: ">{{ formData.orderNo }}</el-descriptions-item>
  6. <el-descriptions-item label="配送方式: ">
  7. <dict-tag :type="DICT_TYPE.TRADE_DELIVERY_TYPE" :value="formData.order.deliveryType" />
  8. </el-descriptions-item>
  9. <el-descriptions-item label="订单类型: ">
  10. <dict-tag :type="DICT_TYPE.TRADE_ORDER_TYPE" :value="formData.order.type" />
  11. </el-descriptions-item>
  12. <el-descriptions-item label="收货人: ">
  13. {{ formData.order.receiverName }}
  14. </el-descriptions-item>
  15. <el-descriptions-item label="买家留言: ">
  16. {{ formData.order.userRemark }}
  17. </el-descriptions-item>
  18. <el-descriptions-item label="订单来源: ">
  19. <dict-tag :type="DICT_TYPE.TERMINAL" :value="formData.order.terminal" />
  20. </el-descriptions-item>
  21. <el-descriptions-item label="联系电话: ">
  22. {{ formData.order.receiverMobile }}
  23. </el-descriptions-item>
  24. <el-descriptions-item label="商家备注: ">{{ formData.order.remark }}</el-descriptions-item>
  25. <el-descriptions-item label="支付单号: ">
  26. {{ formData.order.payOrderId }}
  27. </el-descriptions-item>
  28. <el-descriptions-item label="付款方式: ">
  29. <dict-tag :type="DICT_TYPE.PAY_CHANNEL_CODE" :value="formData.order.payChannelCode" />
  30. </el-descriptions-item>
  31. <!-- TODO 芋艿:待实现:跳转会员 -->
  32. <!-- <el-descriptions-item label="买家: ">{{ formData.user.nickname }}</el-descriptions-item> -->
  33. </el-descriptions>
  34. <!-- 售后信息 -->
  35. <el-descriptions title="售后信息">
  36. <el-descriptions-item label="退款编号: ">{{ formData.no }}</el-descriptions-item>
  37. <el-descriptions-item label="申请时间: ">
  38. {{ formatDate(formData.auditTime) }}
  39. </el-descriptions-item>
  40. <!-- TODO 营销活动待实现 -->
  41. <el-descriptions-item label="售后类型: ">
  42. <dict-tag :type="DICT_TYPE.TRADE_AFTER_SALE_TYPE" :value="formData.type" />
  43. </el-descriptions-item>
  44. <el-descriptions-item label="售后方式: ">
  45. <dict-tag :type="DICT_TYPE.TRADE_AFTER_SALE_WAY" :value="formData.way" />
  46. </el-descriptions-item>
  47. <el-descriptions-item label="退款金额: ">{{ formData.refundPrice }}</el-descriptions-item>
  48. <el-descriptions-item label="退款原因: ">{{ formData.applyReason }}</el-descriptions-item>
  49. <el-descriptions-item label="补充描述: ">
  50. {{ formData.applyDescription }}
  51. </el-descriptions-item>
  52. <el-descriptions-item label="凭证图片: "> {{ formData.applyPicUrls }}</el-descriptions-item>
  53. </el-descriptions>
  54. <!-- 退款状态 -->
  55. <el-descriptions :column="1" title="退款状态">
  56. <el-descriptions-item label="退款状态: ">
  57. <dict-tag :type="DICT_TYPE.TRADE_AFTER_SALE_STATUS" :value="formData.status" />
  58. </el-descriptions-item>
  59. <el-descriptions-item label-class-name="no-colon">
  60. <el-button type="primary" @click="openForm('agree')">同意售后</el-button>
  61. <el-button type="primary" @click="openForm('disagree')">拒绝售后</el-button>
  62. <el-button type="primary" @click="openForm('receive')">确认收货</el-button>
  63. <el-button type="primary" @click="openForm('refuse')">拒绝收货</el-button>
  64. <el-button type="primary" @click="openForm('refund')">确认退款</el-button>
  65. </el-descriptions-item>
  66. <el-descriptions-item>
  67. <template #label><span style="color: red">提醒: </span></template>
  68. 如果未发货,请点击同意退款给买家。<br />
  69. 如果实际已发货,请主动与买家联系。<br />
  70. 如果订单整体退款后,优惠券和余额会退还给买家.
  71. </el-descriptions-item>
  72. </el-descriptions>
  73. <!-- 商品信息 -->
  74. <el-descriptions title="商品信息">
  75. <el-descriptions-item labelClassName="no-colon">
  76. <el-row :gutter="20">
  77. <el-col :span="15">
  78. <el-table :data="formData.items" border>
  79. <el-table-column label="商品" prop="spuName" width="auto">
  80. <template #default="{ row }">
  81. {{ row.spuName }}
  82. <el-tag v-for="property in row.properties" :key="property.propertyId">
  83. {{ property.propertyName }}: {{ property.valueName }}
  84. </el-tag>
  85. </template>
  86. </el-table-column>
  87. <el-table-column label="商品原价" prop="price" width="150">
  88. <template #default="{ row }">{{ floatToFixed2(row.price) }}元</template>
  89. </el-table-column>
  90. <el-table-column label="数量" prop="count" width="100" />
  91. <el-table-column label="合计" prop="payPrice" width="150">
  92. <template #default="{ row }">{{ floatToFixed2(row.payPrice) }}元</template>
  93. </el-table-column>
  94. <el-table-column label="售后状态" prop="afterSaleStatus" width="120">
  95. <template #default="{ row }">
  96. <dict-tag
  97. :type="DICT_TYPE.TRADE_ORDER_ITEM_AFTER_SALE_STATUS"
  98. :value="row.afterSaleStatus"
  99. />
  100. </template>
  101. </el-table-column>
  102. </el-table>
  103. </el-col>
  104. <el-col :span="10" />
  105. </el-row>
  106. </el-descriptions-item>
  107. </el-descriptions>
  108. <!-- 售后信息 -->
  109. <el-descriptions title="售后日志" />
  110. </ContentWrap>
  111. <!-- 各种操作的弹窗 -->
  112. <UpdateAuditReasonForm ref="updateAuditReasonFormRef" @success="getDetail" />
  113. </template>
  114. <script lang="ts" setup>
  115. import * as AfterSaleApi from '@/api/mall/trade/afterSale/index'
  116. import { floatToFixed2 } from '@/utils'
  117. import { DICT_TYPE } from '@/utils/dict'
  118. import { formatDate } from '@/utils/formatTime'
  119. import UpdateAuditReasonForm from '@/views/mall/trade/afterSale/components/UpdateAuditReasonForm.vue'
  120. defineOptions({ name: 'TradeOrderDetailForm' })
  121. const message = useMessage() // 消息弹窗
  122. const { params } = useRoute() // 查询参数
  123. const formData = ref({
  124. order: {}
  125. })
  126. const updateAuditReasonFormRef = ref() // 拒绝售后表单 Ref
  127. /** 获得详情 */
  128. const getDetail = async () => {
  129. const id = params.orderId as unknown as number
  130. if (id) {
  131. formData.value = await AfterSaleApi.getAfterSale(id)
  132. }
  133. }
  134. const openForm = (type: string) => {
  135. switch (type) {
  136. case 'agree':
  137. message.confirm('是否同意售后?').then(() => {
  138. AfterSaleApi.agree(formData.value.id)
  139. })
  140. break
  141. case 'disagree':
  142. updateAuditReasonFormRef.value?.open(formData.value)
  143. break
  144. case 'receive':
  145. message.confirm('是否确认收货?').then(() => {
  146. AfterSaleApi.receive(formData.value.id)
  147. })
  148. break
  149. case 'refuse':
  150. message.confirm('是否拒绝收货?').then(() => {
  151. AfterSaleApi.refuse(formData.value.id)
  152. })
  153. break
  154. case 'refund':
  155. message.confirm('是否确认退款?').then(() => {
  156. AfterSaleApi.refund(formData.value.id)
  157. })
  158. break
  159. }
  160. }
  161. onMounted(async () => {
  162. await getDetail()
  163. })
  164. </script>
  165. <style lang="scss" scoped>
  166. :deep(.el-descriptions) {
  167. &:not(:nth-child(1)) {
  168. margin-top: 20px;
  169. }
  170. .el-descriptions__title {
  171. display: flex;
  172. align-items: center;
  173. &::before {
  174. display: inline-block;
  175. width: 3px;
  176. height: 20px;
  177. margin-right: 10px;
  178. background-color: #409eff;
  179. content: '';
  180. }
  181. }
  182. .el-descriptions-item__container {
  183. margin: 0 10px;
  184. .no-colon {
  185. margin: 0;
  186. &::after {
  187. content: '';
  188. }
  189. }
  190. }
  191. }
  192. </style>