pay_error_refund.blade.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. @extends('layouts.base')
  2. @section('title', "支付失败退款")
  3. @section('content')
  4. <link rel="stylesheet" type="text/css" href="{{static_url('yunshop/goods/vue-goods1.css')}}"/>
  5. <style>
  6. </style>
  7. <div class="all">
  8. <div id="app" v-cloak>
  9. <div class="vue-head">
  10. <div class="vue-main-title" style="margin-bottom:20px">
  11. <div class="vue-main-title-left"></div>
  12. <div class="vue-main-title-content">回调异常退款</div>
  13. <div class="vue-main-title-button">
  14. </div>
  15. </div>
  16. <div class="vue-search">
  17. <div>
  18. <el-form :inline="true" :model="search_form" class="demo-form-inline">
  19. <el-form-item label="" style="width: 200px">
  20. <el-input v-model="search_form.pay_sn" placeholder="支付号"></el-input>
  21. </el-form-item>
  22. <el-form-item label="" style="width: 200px">
  23. <el-input v-model="search_form.order_sn" placeholder="订单号"></el-input>
  24. </el-form-item>
  25. <el-form-item label="">
  26. <el-select v-model="search_form.status" clearable placeholder="状态" style="width:120px">
  27. <el-option label="未处理" value="0"></el-option>
  28. <el-option label="已处理" value="1"></el-option>
  29. <el-option label="退款失败" value="-1"></el-option>
  30. </el-select>
  31. </el-form-item>
  32. <el-form-item label="">
  33. <el-date-picker
  34. v-model="times"
  35. type="datetimerange"
  36. value-format="yyyy-MM-dd HH:mm:ss"
  37. range-separator="至"
  38. start-placeholder="开始日期"
  39. end-placeholder="结束日期"
  40. style="margin-left:5px;"
  41. align="right">
  42. </el-date-picker>
  43. </el-form-item>
  44. <el-form-item label="">
  45. <el-button type="primary" icon="el-icon-search" @click="search(1)">搜索
  46. </el-button>
  47. </el-form-item>
  48. </el-form>
  49. </div>
  50. </div>
  51. </div>
  52. <div class="vue-main">
  53. <div class="vue-main-title" style="">
  54. <div class="vue-main-title-left"></div>
  55. <div class="vue-main-title-content">
  56. 记录列表
  57. <span style="text-align:left;font-size:14px;color:#999">
  58. <span>总数:[[total]]</span>&nbsp;&nbsp;&nbsp;
  59. </span>
  60. </div>
  61. <div class="vue-main-title-button">
  62. <span style="text-align:left;font-size:14px;color:red">
  63. <span>注意:状态为退款失败的,需要手动操作原路退款</span>&nbsp;&nbsp;&nbsp;
  64. </span>
  65. </div>
  66. </div>
  67. <div class="vue-main-title" style="margin-bottom:20px">
  68. <el-table v-loading="loading" :data="list" style="width: 100%">
  69. <el-table-column width="170px" label="记录时间" align="center">
  70. <template slot-scope="scope">
  71. <span style="margin-left: 10px">[[scope.row.record_at]]</span>
  72. </template>
  73. </el-table-column>
  74. <el-table-column label="支付号" align="center">
  75. <template slot-scope="scope">
  76. <span style="margin-left: 10px">
  77. [[scope.row.pay_sn]]
  78. </span>
  79. </template>
  80. </el-table-column>
  81. <el-table-column label="支付类型" align="center">
  82. <template slot-scope="scope">
  83. <span style="margin-left: 10px">[[scope.row.pay_type_name]]</span>
  84. </template>
  85. </el-table-column>
  86. <el-table-column label="异常提示" align="center">
  87. <template slot-scope="scope">
  88. <span style="margin-left: 10px">[[scope.row.error_msg]]</span>
  89. </template>
  90. </el-table-column>
  91. <el-table-column label="状态" align="center">
  92. <template slot-scope="scope">
  93. <span style="margin-left: 10px">[[scope.row.status_name]]</span>
  94. </template>
  95. </el-table-column>
  96. <el-table-column label="操作" align="center" width="200px">
  97. <template slot-scope="scope">
  98. <el-button @click="showOrders(scope.row.orders)" size="mini">
  99. 查看订单
  100. </el-button>
  101. <el-button v-if="scope.row.status != 1 && scope.row.error_code == 1" @click="manualRefund(scope.row.id)" size="mini" type="warning">
  102. 原路退款
  103. </el-button>
  104. </template>
  105. </el-table-column>
  106. </el-table>
  107. </div>
  108. </div>
  109. <!-- 分页 -->
  110. <div class="vue-page" v-if="total>0">
  111. <el-row>
  112. <el-col align="right">
  113. <el-pagination layout="prev, pager, next,jumper" @current-change="search" :total="total"
  114. :page-size="per_size" :current-page="current_page" background
  115. ></el-pagination>
  116. </el-col>
  117. </el-row>
  118. </div>
  119. <!-- 支付记录 -->
  120. <el-dialog :visible.sync="orderListDialogVisible" width="800px" title="订单记录">
  121. <div style="overflow:auto">
  122. <el-table :data="orderList" style="width: 100%;min-height:300px;overflow:auto" id="order-list">
  123. <el-table-column label="ID" prop="id" align="center"></el-table-column>
  124. <el-table-column label="订单号">
  125. <template slot-scope="scope">
  126. <a :href="'{{ yzWebUrl('order.detail.vue-index', array('id' => '')) }}'+[[scope.row.id]]" target="_blank">
  127. [[scope.row.order_sn]]
  128. </a>
  129. </template>
  130. </el-table-column>
  131. <el-table-column prop="price" label="支付金额"></el-table-column>
  132. <el-table-column prop="status_name" label="状态"></el-table-column>
  133. <el-table-column prop="create_time" label="创建时间"></el-table-column>
  134. <el-table-column prop="cancel_time" label="关闭时间">
  135. <template slot-scope="scope">
  136. <span v-show="scope.row.cancel_time.cancel_time != '1970-01-01 08:00:00'">[[scope.row.cancel_time]]</span>
  137. </template>
  138. </el-table-column>
  139. </el-table>
  140. </div>
  141. <span slot="footer" class="dialog-footer">
  142. <el-button @click="orderListDialogVisible = false">取 消</el-button>
  143. </span>
  144. </el-dialog>
  145. </div>
  146. </div>
  147. <script>
  148. var app = new Vue({
  149. el: "#app",
  150. delimiters: ['[[', ']]'],
  151. name: 'test',
  152. data() {
  153. return {
  154. search_form:{},
  155. times:[],
  156. orderListDialogVisible:false,
  157. orderList:[],
  158. list: [],
  159. //页码数
  160. current_page: 0,
  161. //一页显示数据
  162. per_size: 0,
  163. //总数
  164. total: 0,
  165. //加载
  166. loading: false,
  167. }
  168. },
  169. created() {
  170. let result = this.viewReturn();
  171. this.__initial(result);
  172. this.search(1);
  173. },
  174. mounted() {
  175. },
  176. methods: {
  177. //视图返回数据
  178. viewReturn() {
  179. return {!! $data?:'{}' !!};
  180. },
  181. //初始化页面数据,请求链接
  182. __initial(data) {
  183. // this.times = [
  184. // this.formatTime(new Date(new Date(new Date().toLocaleDateString()).getTime())),
  185. // this.formatTime(new Date(new Date(new Date().toLocaleDateString()).getTime() + (24 * 60 * 60 * 1000 - 1)))
  186. // ];
  187. //this.setList(data.list);
  188. },
  189. setList(response) {
  190. this.list = response.data;
  191. this.total = response.total;
  192. this.current_page = response.current_page;
  193. this.per_size = response.per_page;
  194. },
  195. search(page) {
  196. let that = this;
  197. if(this.times && this.times.length>0) {
  198. this.$set(this.search_form,'start_time',this.times[0]);
  199. this.$set(this.search_form,'end_time',this.times[1]);
  200. } else {
  201. this.$set(this.search_form,'start_time','');
  202. this.$set(this.search_form,'end_time','');
  203. }
  204. that.loading = true;
  205. that.$http.post("{!!yzWebFullUrl('order.order-pay.exception-list')!!}", {
  206. page: page,
  207. search:this.search_form,
  208. }).then(response => {
  209. // console.log(response);
  210. if (response.data.result == 1) {
  211. that.setList(response.data.data);
  212. } else {
  213. that.$message.error(response.data.msg);
  214. }
  215. that.loading = false;
  216. }), function (res) {
  217. console.log(res);
  218. that.loading = false;
  219. };
  220. },
  221. showOrders(orders) {
  222. this.orderListDialogVisible = true;
  223. this.orderList = orders;
  224. },
  225. manualRefund(id) {
  226. this.$confirm('确定手动操作原路退款吗?', '提示', {confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning'}).then(() => {
  227. this.$http.post("{!!yzWebFullUrl('order.order-pay.pay-error-refund')!!}",{id:id}).then(function (response) {
  228. if (response.data.result) {
  229. this.$message({type: 'success',message: response.data.msg});
  230. } else{
  231. this.$message({type: 'error',message: response.data.msg});
  232. }
  233. this.$emit('search');
  234. },function (response) {
  235. this.$message({type: 'error',message: response.data.msg});
  236. }
  237. );
  238. }).catch(() => {
  239. this.$message({type: 'info',message: '已取消操作'});
  240. });
  241. },
  242. getParam(name) {
  243. var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
  244. var r = window.location.search.substr(1).match(reg);
  245. if (r != null) return unescape(r[2]);
  246. return null;
  247. },
  248. //时间转化
  249. formatTime(date) {
  250. let y = date.getFullYear()
  251. let m = date.getMonth() + 1
  252. m = m < 10 ? '0' + m : m
  253. let d = date.getDate()
  254. d = d < 10 ? '0' + d : d
  255. let h = date.getHours()
  256. h = h < 10 ? '0' + h : h
  257. let minute = date.getMinutes()
  258. minute = minute < 10 ? '0' + minute : minute
  259. let second = date.getSeconds()
  260. second = second < 10 ? '0' + second : second
  261. return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second
  262. },
  263. },
  264. })
  265. </script>
  266. @endsection