refund.vue 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. <template>
  2. <view>
  3. <block v-if="loading">
  4. <view class="skeleton">
  5. <view class="skeleton-line max animate" style="height: 200upx;"></view>
  6. <view class="skeleton-line animate"></view>
  7. <view class="skeleton-line min animate"></view>
  8. <view class="skeleton-line min animate"></view>
  9. <view class="skeleton-line max animate" style="height: 200upx;"></view>
  10. <view class="skeleton-line max animate" style="height: 200upx;"></view>
  11. </view>
  12. </block>
  13. <block v-else>
  14. <view class="order-body">
  15. <view class="order-goods">
  16. <view class="goods-img"><image :src="orderData.img" mode="widthFix"></image></view>
  17. <view class="goods-info">
  18. <view class="name">{{ goodsData.product_name }}</view>
  19. <view class="desc">
  20. <view class="num">x {{ orderData.number }}</view>
  21. <view class="total">{{ $dialog.formatMoney(orderData.price,true) }}</view>
  22. </view>
  23. </view>
  24. </view>
  25. <view class="goods-safe">
  26. <view class="safe-item"><image src="/static/image/check.png"></image>过期退</view>
  27. <view class="safe-item"><image src="/static/image/check.png"></image>随时退</view>
  28. </view>
  29. </view>
  30. <view class="refund-msg" @click="openRule(1)">
  31. <view class="name">退款原因<text>*</text></view>
  32. <view class="refund-check">
  33. <view class="check-name" v-if="!refundVal">请至少选择1项</view>
  34. <view class="check-name" v-else>{{refundVal}}</view>
  35. <view class="check-img"><image src="/static/image/right.png"></image></view>
  36. </view>
  37. </view>
  38. <view class="refund-msg">
  39. <view class="name">退款方式</view>
  40. <view class="right">原路退回</view>
  41. </view>
  42. <view class="refund-tips">
  43. 申请退款后不可取消,钱款预计1-3个自然日到账
  44. </view>
  45. <view class="order-pay-btn" v-if="orderData">
  46. <view class="pay-group">
  47. <view class="pay-money">
  48. <text>退款金额</text>
  49. {{orderData?$dialog.formatMoney(orderData.price,true):'0.00'}}
  50. </view>
  51. <view class="pay-btn">
  52. <button type="primary" @click="refundOrder()">提交申请</button>
  53. <!-- <pay-button-sdk
  54. :mode="2"
  55. :order-status="1"
  56. :goods-type="2"
  57. :goods-id="orderData.product_id"
  58. :order-id="orderData.order_sn"
  59. :refund-total-amount="orderData.price"
  60. :refund-id="orderData.order_sn"
  61. @getgoodsinfo="getGoodsInfo"
  62. @placeorder="userLogin"
  63. @error="onErrors"
  64. @pay="onPay"
  65. @applyrefund="onRefund"
  66. ></pay-button-sdk> -->
  67. </view>
  68. </view>
  69. <!-- <button type="primary" :disabled="disabled" @click="payNow">立即支付 </button> -->
  70. <view class="safe-height"></view>
  71. </view>
  72. </block>
  73. <uni-popup ref="rulepopup" type="bottom" border-radius="10px 10px 0 0" background-color="#ffffff">
  74. <view class="service-popup popup-height">
  75. <view class="title" @click="openRule(2)">退款原因(可多选) <view class="close"><image src="/static/image/close.png"></image></view></view>
  76. <view class="refund-list">
  77. <checkbox-group @change="checkboxChange">
  78. <view class="refund-item" v-for="(item,index) in refundList" :key="index">
  79. <view class="item-name">{{item.name}}</view>
  80. <view class="item-check">
  81. <checkbox :value="item.key" />
  82. </view>
  83. </view>
  84. </checkbox-group>
  85. </view>
  86. <view class="pup-btn">
  87. <button type="primary" @click="checkData">确定 </button>
  88. </view>
  89. </view>
  90. </uni-popup>
  91. </view>
  92. </template>
  93. <script>
  94. var app;
  95. import * as Api from "@/static/api/order.js";
  96. var loadingPayBtn = false;
  97. export default {
  98. data() {
  99. return {
  100. loading:true,
  101. order:"",
  102. poiData:null,
  103. goodsData:null,
  104. orderData:null,
  105. storeData:null,
  106. refundList:[
  107. {"name":"买多了/买错了","key":0},
  108. {"name":"计划有变,暂时不需要了","key":1},
  109. {"name":"不能外卖","key":2},
  110. {"name":"使用条件不清楚","key":3},
  111. {"name":"联系不上商家","key":4},
  112. {"name":"约不到合适的时间","key":5},
  113. {"name":"可用门店距离太远","key":6},
  114. {"name":"其他平台/方式购买更优惠","key":7},
  115. {"name":"评价不好","key":8},
  116. ],
  117. refundCheck:[],
  118. refundVal:""
  119. }
  120. },
  121. onLoad({order}) {
  122. app = this;
  123. app.order = order;
  124. app.getOrder()
  125. },
  126. methods: {
  127. refundOrder(){
  128. if (app.refundCheck.length == 0) {
  129. return app.$dialog.showSuccess("请至少选择1项")
  130. }
  131. Api.refund({order:app.order,refund:app.refundVal}).then((res)=>{
  132. if(res.code == 0) {
  133. return app.$dialog.showSuccess(res.msg)
  134. }
  135. app.$dialog.showSuccess(res.msg,"none",function(){
  136. uni.navigateTo({
  137. url:"/pages/order/detail?order="+app.order
  138. })
  139. })
  140. })
  141. },
  142. checkboxChange(e){
  143. app.refundCheck = e.detail.value;
  144. },
  145. checkData(){
  146. if (app.refundCheck.length == 0) {
  147. return app.$dialog.showSuccess("请至少选择1项")
  148. }
  149. app.$refs.rulepopup.close();
  150. // 1. 过滤出选中的项
  151. const selectedItems = app.refundList.filter(item =>
  152. app.refundCheck.includes(String(item.key))
  153. );
  154. console.log(selectedItems)
  155. // 2. 提取 name
  156. const names = selectedItems.map(item => item.name);
  157. // 3. 逗号拼接
  158. app.refundVal = names.join(',');
  159. },
  160. openRule(type){
  161. if (type == 1) {
  162. app.$refs.rulepopup.open()
  163. } else {
  164. app.$refs.rulepopup.close()
  165. }
  166. },
  167. getOrder(){
  168. Api.detail({"order":app.order}).then((res)=>{
  169. app.loading = false;
  170. if (res.code && res.code !== 1) {
  171. app.$dialog.showSuccess(res.msg,function(){
  172. uni.switchTab({
  173. url:"/pages/order/order"
  174. })
  175. });
  176. return ;
  177. }
  178. app.poiData = res.data.poi;
  179. app.goodsData = res.data.product;
  180. app.orderData = res.data;
  181. })
  182. },
  183. onErrors(e){
  184. if (loadingPayBtn) {
  185. app.refundOrder()
  186. return ;
  187. }
  188. loadingPayBtn = true;
  189. console.log("错误",e)
  190. },
  191. userLogin(event) {
  192. return new Promise((resolve, reject) => {
  193. tt.login({
  194. success: () => resolve(),
  195. fail: () => reject()
  196. });
  197. });
  198. },
  199. onPay(event){
  200. const { status, outOrderNo, result } = event.detail;
  201. console.log(status, outOrderNo, result)
  202. if (status === 'success') {
  203. const { code } = result;
  204. if (code === 0) {
  205. // 继续支付成功
  206. } else {
  207. // 继续支付失败(超时、取消、关闭)
  208. }
  209. } else {}
  210. },
  211. onRefund(event){
  212. const { orderId } = event.detail;
  213. const extra = { orderId };
  214. return new Promise(resolve => {
  215. resolve(extra);
  216. });
  217. },
  218. getGoodsInfo(){
  219. }
  220. }
  221. }
  222. </script>
  223. <style lang="scss" scoped>
  224. page{background-color: #f8f8f8;}
  225. .pup-btn{padding: 20upx;}
  226. .skeleton{width: 90%;margin: 20upx auto;}
  227. .refund-msg{padding: 20upx;display: flex;align-items: center;justify-content: space-between;background-color: #fff;width: calc(95% - 40upx);margin: 20upx auto;font-size: 28upx;color: #333;}
  228. .refund-msg .name text{color: #f00;}
  229. .refund-msg .refund-check{display: flex;align-items: center;gap: 10upx;font-size: 28upx;color: #666;flex: 1;overflow: hidden;justify-content: end;}
  230. .refund-msg .refund-check .check-img{display: flex;align-items: center;justify-content: center;}
  231. .refund-msg .refund-check image{width: 40upx;height: 40upx;}
  232. .refund-tips{font-size: 24upx;color: #666;padding: 20upx;}
  233. .service-popup.popup-height{height: 60vh;}
  234. .service-popup.popup-white{background-color: #fff;margin-top: 20upx;}
  235. .service-popup.popup-white .title{border-bottom: 2upx solid #f8f8f8;}
  236. .service-popup .title{line-height: 80upx;font-size: 32rpx;color: #333;font-weight: bold;padding: 0 20upx;display: flex;align-items: center;}
  237. .service-popup .title .close{margin-left: auto;margin-right: 0;display: flex;align-items: center;justify-content: center;}
  238. .service-popup .title .close image{width: 40upx;height: 40upx;}
  239. .service-popup .refund-list{padding: 20upx;}
  240. .service-popup .refund-list .refund-item{display: flex;align-items: center;justify-content: space-between;font-size: 28upx;color: #333;padding: 15upx 0;}
  241. .order-pay-btn{
  242. background-color: #fff;
  243. padding: 20upx;
  244. position: fixed;
  245. bottom: 0;
  246. left: 0;
  247. right: 0;
  248. .safe-height{
  249. height: env(safe-area-inset-bottom);
  250. width: 100%;
  251. background-color: #fff;
  252. }
  253. .pay-group{
  254. display: flex;
  255. align-items: center;
  256. justify-content: space-between;
  257. .pay-money{
  258. font-size: 32upx;
  259. color: #f00;
  260. font-weight: bold;
  261. text{
  262. font-size: 24upx;
  263. font-weight: normal;
  264. color: #666;
  265. }
  266. }
  267. }
  268. }
  269. .order-body{padding: 20upx;}
  270. .order-goods{display: flex;align-items: flex-start;background-color: #fff;padding: 20upx 20upx 0 20upx;}
  271. .order-goods .goods-img{width: 200upx;overflow: hidden;}
  272. .order-goods image{width: 200upx;border-radius: 10upx;}
  273. .goods-info{margin-left: 20upx;font-size: 28upx;flex: 1;padding: 20upx 0;}
  274. .goods-info .name{font-size: 30upx;color: #333;}
  275. .goods-info .desc{font-size: 24upx;color: #999;display: flex;align-items: center;justify-content: space-between;margin: 20upx 0;}
  276. .goods-info .total{font-size: 30upx;color: #333;text-align: right;font-weight: bold;}
  277. .goods-safe{display: flex;align-items: center;font-size: 24rpx;color: #999;gap: 40upx;background: #fff;border-top: 2upx solid #f8f8f8;padding: 20upx;}
  278. .goods-safe .safe-item{display: flex;align-items: center;}
  279. .goods-safe image{width: 30upx;height: 30upx;margin-right: 10upx;}
  280. </style>