logistics-tracking.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <template>
  2. <el-dialog v-model="showDialog" width="800px">
  3. <div class="min-h-[300px]" v-loading="loading">
  4. <div v-if="(Object.keys(detail).length)">
  5. <div class="flex mb-[20px]">
  6. <img class="w-[80px] h-[80px]" :src="img(detail.order_goods.goods_image ? detail.order_goods.goods_image : '')" alt="">
  7. <div class="ml-[10px] flex-1 flex flex-col justify-between">
  8. <div>
  9. <div class="text-[14px] text-[#333] leading-[20px] h-[40px]">{{ detail.order_goods.goods_name }}</div>
  10. <div class="mt-[8px] text-[12px] text-[#999] leading-[16px] oppoSans-R" v-if="detail.order_goods.sku_name">规格:{{ detail.order_goods.sku_name }}</div>
  11. </div>
  12. <div class="mt-auto flex justify-between w-[100%]">
  13. <span class="">¥{{ detail.order_goods.price }}</span>
  14. <span class="text-[12px] text-[#666]">x{{ detail.order_goods.num }}</span>
  15. </div>
  16. </div>
  17. </div>
  18. <el-form label-position="left" label-width="100px">
  19. <el-row>
  20. <el-col :span="12">
  21. <el-form-item label="联系人">{{ detail.refund_address.contact_name }}</el-form-item>
  22. </el-col>
  23. <el-col :span="12">
  24. <el-form-item label="手机号">{{ detail.refund_address.mobile }}</el-form-item>
  25. </el-col>
  26. <el-col :span="12">
  27. <el-form-item label="退货地址">{{ detail.refund_address.full_address || '--' }}</el-form-item>
  28. </el-col>
  29. </el-row>
  30. </el-form>
  31. <el-form :model="formData" label-width="100px" ref="formRef" :rules="formRules">
  32. <el-form-item :label="t('expressCompany')" prop="express_company">
  33. <el-input v-model.trim="formData.express_company" clearable :placeholder="t('expressCompanyPlaceholder')" class="input-width" />
  34. </el-form-item>
  35. <el-form-item :label="t('expressNumber')" prop="express_number">
  36. <el-input v-model.trim="formData.express_number" clearable :placeholder="t('expressNumberPlaceholder')" class="input-width" />
  37. </el-form-item>
  38. <el-form-item :label="t('remark')" prop="remark">
  39. <el-input v-model.trim="formData.remark" type="textarea" clearable :placeholder="t('remarkPlaceholder')" class="input-width" />
  40. </el-form-item>
  41. </el-form>
  42. </div>
  43. </div>
  44. <template #footer>
  45. <div class="dialog-footer">
  46. <el-button @click="showDialog = false" dark>取消</el-button>
  47. <el-button type="primary" class="!bg-[var(--el-color-primary)] !border-[var(--el-color-primary)]" @click="onSave(formRef)" dark>确定</el-button>
  48. </div>
  49. </template>
  50. </el-dialog>
  51. </template>
  52. <script setup lang="ts">
  53. import { ref, reactive} from 'vue'
  54. import { getRefundDetail, refundDelivery, editRefundDelivery } from '@/addon/mall/api/refund'
  55. const showDialog = ref(false) // 物流弹框
  56. let detail = ref({})
  57. let loading = ref(false)
  58. // 物流信息
  59. const formData = ref({
  60. express_number: '',
  61. express_company: '',
  62. remark: ''
  63. })
  64. const isEditDelivery = ref(false)
  65. const setFormData = async (row,status) => {
  66. loading.value = true
  67. if(status) isEditDelivery.value = true
  68. if (row) {
  69. const data = await (await getRefundDetail(row)).data
  70. detail.value = data
  71. // 赋值物流信息
  72. if(isEditDelivery.value && detail.value.delivery){
  73. formData.value.express_number = detail.value.delivery.express_number
  74. formData.value.express_company = detail.value.delivery.express_company
  75. formData.value.remark = detail.value.delivery.remark
  76. }
  77. }
  78. loading.value = false
  79. }
  80. setFormData()
  81. const formRef = ref(null)
  82. const formRules = computed(() => {
  83. return {
  84. express_number: [
  85. { required: true, message: t('expressNumberPlaceholder'), trigger: 'blur' }
  86. ],
  87. express_company: [
  88. { required: true, message: t('expressCompanyPlaceholder'), trigger: 'blur' }
  89. ]
  90. }
  91. })
  92. const emit = defineEmits(['complete'])
  93. // 提交申请
  94. const onSave = async (formEl) => {
  95. if (loading.value || !formEl) return
  96. await formEl.validate(async (valid) => {
  97. if (valid) {
  98. loading.value = true
  99. const data = {delivery: formData.value,order_refund_no: detail.value.order_refund_no}
  100. const save = isEditDelivery.value ? editRefundDelivery : refundDelivery
  101. save(data).then(res => {
  102. loading.value = false
  103. showDialog.value = false
  104. emit('complete')
  105. }).catch(() => {
  106. loading.value = false
  107. showDialog.value = false
  108. })
  109. }
  110. })
  111. }
  112. defineExpose({
  113. showDialog,
  114. setFormData
  115. })
  116. </script>
  117. <style lang="scss" scoped>
  118. .input-width{
  119. width: 340px;
  120. }
  121. </style>