details.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  1. <template>
  2. <zj-page-container>
  3. <zj-page-fill>
  4. <div style="box-sizing: border-box; padding: 10px">
  5. <div>
  6. <div class="order-main">
  7. <el-row style="padding: 15px 15px 10px">
  8. <el-col :span="24">
  9. <div class="order-main-title">
  10. <span>售后编号:{{ orderDetail.esOrderRefundId }}</span>
  11. <span>订单号:{{ orderDetail.esOrderId }}</span>
  12. <span>下单时间:{{ orderDetail.createTime }}</span>
  13. </div>
  14. </el-col>
  15. </el-row>
  16. <div style="width: 100%; padding: 10px 15px 15px 15px">
  17. <el-row>
  18. <el-col :span="10">
  19. <div v-if="~['WAIT'].indexOf(orderDetail.status)">
  20. <el-form ref="formTHref" :model="formTH" label-width="80px" size="mini">
  21. <el-form-item
  22. label="处理结果"
  23. prop="refundType"
  24. :rules="[{ required: true, message: '请选择', trigger: 'blur' }]"
  25. >
  26. <el-radio-group v-model="formTH.refundType">
  27. <el-radio label="GOODS">仅退货</el-radio>
  28. <el-radio label="REFUND">仅退款</el-radio>
  29. <el-radio label="GOODS_REFUND">退货退款</el-radio>
  30. <el-radio label="FAIL">驳回</el-radio>
  31. </el-radio-group>
  32. </el-form-item>
  33. <el-form-item
  34. v-if="~['GOODS', 'GOODS_REFUND'].indexOf(formTH.refundType)"
  35. label="退货数量"
  36. prop="refundNum"
  37. :rules="[{ required: true, message: '请填写', trigger: 'blur' }]"
  38. >
  39. {{
  40. (() => {
  41. if (formTH.refundType == 'GOODS') formTH.refundPrice = ''
  42. })()
  43. }}
  44. <el-input v-model="formTH.refundNum"></el-input>
  45. </el-form-item>
  46. <el-form-item
  47. v-if="~['REFUND', 'GOODS_REFUND'].indexOf(formTH.refundType)"
  48. label="退款金额"
  49. prop="refundPrice"
  50. :rules="[{ required: true, message: '请填写', trigger: 'blur' }]"
  51. >
  52. {{
  53. (() => {
  54. if (formTH.refundType == 'REFUND') formTH.refundNum = ''
  55. })()
  56. }}
  57. <el-input type="number" v-model="formTH.refundPrice"></el-input>
  58. </el-form-item>
  59. <el-form-item label="备注">
  60. <el-input type="textarea" v-model="formTH.refundRemark"></el-input>
  61. </el-form-item>
  62. </el-form>
  63. </div>
  64. <div v-else style="display: flex">
  65. <div>
  66. <div class="order-main-status">
  67. <span>{{ { WAIT: '平台处理', OVER: '完成' }[orderDetail.status] }}</span>
  68. </div>
  69. </div>
  70. </div>
  71. </el-col>
  72. <el-col :span="14" style="padding-top: 10px">
  73. <el-steps :active="zhuangtai" align-center>
  74. <el-step title="买家申请"></el-step>
  75. <el-step title="平台处理"></el-step>
  76. <el-step title="维权完成"></el-step>
  77. </el-steps>
  78. </el-col>
  79. </el-row>
  80. </div>
  81. </div>
  82. <div class="order-receive-info">
  83. <el-row :gutter="10">
  84. <el-col :xs="24" :sm="24" :md="8" :lg="8" :xl="8">
  85. <div class="info">
  86. <div class="info_title">卖家信息</div>
  87. <div class="info_bottom">
  88. <div v-if="orderDetail.sellUrl" class="info_bottom_lt">
  89. <el-image style="width: 40px; height: 40px" :src="$showImgUrl(orderDetail.sellUrl)"></el-image>
  90. </div>
  91. <div class="info_bottom_rt">
  92. <div>昵称:{{ orderDetail.sellName }}</div>
  93. <div>手机号:{{ orderDetail.sellMobile }}</div>
  94. <div>发布时间:{{ orderDetail.sellTime }}</div>
  95. </div>
  96. </div>
  97. </div>
  98. </el-col>
  99. <el-col :xs="24" :sm="24" :md="8" :lg="8" :xl="8">
  100. <div class="info">
  101. <div class="info_title">买家信息</div>
  102. <div class="info_bottom">
  103. <div v-if="orderDetail.wechatUserUrl" class="info_bottom_lt">
  104. <el-image style="width: 40px; height: 40px" :src="$showImgUrl(orderDetail.wechatUserUrl)">
  105. </el-image>
  106. </div>
  107. <div class="info_bottom_rt">
  108. <div v-if="orderDetail.wechatUserName">昵称:{{ orderDetail.wechatUserName }}</div>
  109. <div v-if="orderDetail.wechatUserMobile">手机号:{{ orderDetail.wechatUserMobile }}</div>
  110. <div>收货人信息:({{ orderDetail.userName }}){{ orderDetail.userMobile }}</div>
  111. <div>
  112. 收货人地址:{{
  113. orderDetail.province +
  114. orderDetail.city +
  115. orderDetail.area +
  116. orderDetail.street +
  117. orderDetail.receAddress
  118. }}
  119. </div>
  120. <div>
  121. 支付方式:{{
  122. { WECHAT: '微信支付', CASH: '到店支付', TRANSFER: '转账支付' }[orderDetail.payType]
  123. }}
  124. </div>
  125. </div>
  126. </div>
  127. </div>
  128. </el-col>
  129. <el-col :xs="24" :sm="24" :md="8" :lg="8" :xl="8">
  130. <div class="info">
  131. <div class="info_title">维权信息</div>
  132. <div class="info_bottom">
  133. <div class="info_bottom_rt">
  134. <div>
  135. 退款方式:{{
  136. { REFUND: '退款', GOODS_REFUND: '退货退款', FAIL: '驳回', GOODS: '退货' }[
  137. orderDetail.refundType
  138. ] || ''
  139. }}
  140. </div>
  141. <div>退款原因:{{ orderDetail.refundNote || '' }}</div>
  142. <div>
  143. 退款凭证:<el-image
  144. v-for="(item, index) in orderDetail.esOrderRefundFiles || []"
  145. :preview-src-list="
  146. (orderDetail.esOrderRefundFiles || []).map(item => $showImgUrl(item.fileUrl))
  147. "
  148. :key="index"
  149. style="width: 60px; height: 60px"
  150. :src="$showImgUrl(item.fileUrl)"
  151. ></el-image>
  152. </div>
  153. </div>
  154. </div>
  155. </div>
  156. </el-col>
  157. </el-row>
  158. </div>
  159. <h3>商品信息</h3>
  160. <div class="order-main" style="border: none">
  161. <!-- 订单表格 -->
  162. <el-table :data="[orderDetail]" style="width: 100%" border>
  163. <el-table-column label="商品信息" min-width="200">
  164. <template slot-scope="scope">
  165. <el-row>
  166. <el-col v-if="scope.row.goodsUrl" :span="6">
  167. <el-image style="width: 40px; height: 40px" :src="$showImgUrl(scope.row.goodsUrl)">
  168. <div slot="error" class="image-slot">
  169. <i class="el-icon-picture-outline"></i>
  170. </div>
  171. </el-image>
  172. </el-col>
  173. <el-col :span="18">
  174. <div>{{ scope.row.esGoodsName }}</div>
  175. </el-col>
  176. </el-row>
  177. </template>
  178. </el-table-column>
  179. <el-table-column prop="goodsPrice" label="单价" align="center"></el-table-column>
  180. <el-table-column prop="num" label="数量" align="center"></el-table-column>
  181. <el-table-column prop="totalAmount" label="商品总金额" align="center" min-width="100"></el-table-column>
  182. <el-table-column prop="refundPrice" label="退款金额" align="center"></el-table-column>
  183. </el-table>
  184. </div>
  185. <h3 v-if="orderDetail.status == 'OVER'">退款记录</h3>
  186. <div v-if="orderDetail.status == 'OVER'" class="order-main" style="border: none">
  187. <!-- 订单表格 -->
  188. <el-table :data="[orderDetail]" style="width: 100%" border>
  189. <el-table-column label="处理结果" min-width="200">
  190. <template slot-scope="scope">
  191. {{ { REFUND: '退款', GOODS_REFUND: '退货退款', FAIL: '驳回', GOODS: '退货' }[scope.row.refundType] }}
  192. </template>
  193. </el-table-column>
  194. <el-table-column prop="refundNum" label="退货数量" align="center"></el-table-column>
  195. <el-table-column prop="refundPrice" label="退款金额" align="center"></el-table-column>
  196. <el-table-column prop="refundRemark" label="备注" align="center" min-width="100"></el-table-column>
  197. <el-table-column prop="refundName" label="退款人" align="center"></el-table-column>
  198. <el-table-column prop="refundTime" label="退款时间" align="center"></el-table-column>
  199. </el-table>
  200. </div>
  201. </div>
  202. </div>
  203. </zj-page-fill>
  204. <div v-if="~['WAIT'].indexOf(orderDetail.status)" style="box-sizing: border-box; padding: 10px; text-align: right">
  205. <el-button type="primary" size="small" @click="faqituikuan">确定</el-button>
  206. </div>
  207. </zj-page-container>
  208. </template>
  209. <script>
  210. import { esOrderDetailRefund, esOrderRefundPrice } from '@/api/orderManagement'
  211. export default {
  212. props: {
  213. detailsId: {
  214. type: [String, Number],
  215. default: ''
  216. },
  217. detailsType: {
  218. type: [String, Number],
  219. default: ''
  220. }
  221. },
  222. data() {
  223. return {
  224. detailsTypeCp: this.detailsType,
  225. // 退货退款表单
  226. formTH: {
  227. refundType: '',
  228. refundNum: '',
  229. refundPrice: '',
  230. refundRemark: ''
  231. },
  232. // 订单详情
  233. orderDetail: {}
  234. }
  235. },
  236. computed: {
  237. zhuangtai() {
  238. return !!~['WAIT'].indexOf(this.orderDetail.status) ? 2 : !!~['OVER'].indexOf(this.orderDetail.status) ? 3 : -1
  239. }
  240. },
  241. watch: {
  242. detailsId: {
  243. handler(newVal, oldVal) {
  244. this.getEsOrderDetail()
  245. },
  246. deep: true,
  247. immediate: true
  248. }
  249. },
  250. methods: {
  251. getEsOrderDetail() {
  252. esOrderDetailRefund({
  253. esOrderRefundId: this.detailsId
  254. }).then(res => {
  255. this.orderDetail = {
  256. ...res.data
  257. }
  258. })
  259. },
  260. faqituikuan() {
  261. this.$refs.formTHref.validate(valid => {
  262. if (valid) {
  263. esOrderRefundPrice({
  264. ...this.formTH,
  265. esOrderRefundId: this.detailsId
  266. }).then(res => {
  267. this.$message({ type: 'success', message: `操作成功!` })
  268. this.$emit('removeTab')
  269. })
  270. }
  271. })
  272. }
  273. }
  274. }
  275. </script>
  276. <style scoped lang="scss">
  277. .info {
  278. .info_title {
  279. font-size: 16px;
  280. font-weight: 700;
  281. }
  282. .info_bottom {
  283. display: flex;
  284. margin: 10px 0;
  285. .info_bottom_lt {
  286. width: 40px;
  287. height: 40px;
  288. }
  289. .info_bottom_rt {
  290. padding: 0 0 0 10px;
  291. line-height: 30px;
  292. .photoPZ {
  293. display: inline-block;
  294. vertical-align: text-top;
  295. }
  296. }
  297. }
  298. }
  299. .order-main {
  300. margin-top: 15px;
  301. border: 1px solid #e5e5e5;
  302. .order-main-title {
  303. font-size: 14px;
  304. }
  305. .order-main-title span {
  306. margin-right: 15px;
  307. }
  308. .order-main-status {
  309. padding: 15px 0;
  310. font-size: 24px;
  311. color: #409eff;
  312. }
  313. .order-main-opt-btn {
  314. padding: 15px 0;
  315. }
  316. }
  317. .order-receive-info {
  318. margin: 15px 0 30px;
  319. padding: 15px;
  320. background: #f5f7fa;
  321. :first-child div span {
  322. padding-right: 15px;
  323. }
  324. }
  325. .order-detail {
  326. background: #f5f7fa;
  327. .order-amount-info {
  328. padding: 15px 0;
  329. font-size: 12px;
  330. font-weight: bold;
  331. }
  332. ::v-deep .el-table tr,
  333. ::v-deep .el-table th {
  334. background-color: #f5f7fa;
  335. }
  336. }
  337. .main-detail {
  338. .title {
  339. font-size: 16px;
  340. font-weight: 700;
  341. margin-bottom: 20px;
  342. }
  343. .item {
  344. display: flex;
  345. font-size: 14px;
  346. color: #666;
  347. padding-bottom: 12px;
  348. .label {
  349. white-space: nowrap;
  350. }
  351. }
  352. }
  353. .order-evaluate-info {
  354. margin: 15px 0;
  355. padding: 30px 15px;
  356. background: #f5f7fa;
  357. .title {
  358. display: flex;
  359. justify-content: space-between;
  360. align-items: center;
  361. .left {
  362. font-size: 16px;
  363. font-weight: 700;
  364. span {
  365. font-weight: normal;
  366. margin-left: 20px;
  367. font-size: 14px;
  368. color: #666;
  369. }
  370. }
  371. .right {
  372. display: flex;
  373. align-items: center;
  374. font-size: 14px;
  375. span {
  376. margin-right: 10px;
  377. }
  378. }
  379. }
  380. .main {
  381. margin-top: 20px;
  382. display: flex;
  383. .rate-list {
  384. font-size: 14px;
  385. flex-shrink: 0;
  386. }
  387. .tag-list {
  388. margin-left: 30px;
  389. ::v-deep .el-tag {
  390. margin-right: 10px;
  391. margin-bottom: 10px;
  392. }
  393. }
  394. }
  395. .content {
  396. width: 400px;
  397. line-height: 20px;
  398. font-size: 14px;
  399. color: #333;
  400. margin-top: 10px;
  401. }
  402. .img-list {
  403. display: flex;
  404. flex-wrap: wrap;
  405. margin-top: 10px;
  406. width: 400px;
  407. ::v-deep .el-image {
  408. width: 100px;
  409. height: 100px;
  410. margin-right: 10px;
  411. margin-bottom: 10px;
  412. border: 1px solid #eaeaea;
  413. }
  414. }
  415. }
  416. </style>