list.blade.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  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. .edit-i{display:none;}
  7. .el-table_1_column_2:hover .edit-i{font-weight:900;padding:0;margin:0;display:inline-block;}
  8. .el-tabs__item,.is-top{font-size:16px}
  9. .el-tabs__active-bar { height: 3px;}
  10. .list-title{display:flex;width:100%;background:#f9f9f9;padding:15px 10px;font-weight:900;border:1px solid #e9e9e9;}
  11. .list-title .list-title-1{display:flex;align-items:center;justify-content: center;}
  12. .list-info{display:flex ;padding: 10px;justify-content: left;background:#f9f9f9;}
  13. .list-con{display:flex;width:100%;font-size:12px;font-weight:500;align-items: stretch;border-bottom: 1px solid rgb(233, 233, 233);}
  14. .list-con-goods{display:flex;align-items:center;justify-content: center;box-sizing:border-box;padding-left:10px;border-top:1px solid #e9e9e9;min-height:90px}
  15. .list-con-goods-text{min-height:70px;overflow:hidden;flex:1;display: flex;flex-direction: column;justify-content: space-between;}
  16. .list-con-goods-price{border-right:1px solid #e9e9e9;border-left:1px solid #e9e9e9;min-width:150px;min-height:90px;text-align: left;padding:20px;display: flex;flex-direction: column;}
  17. .list-con-goods-title{font-size:14px;line-height:20px;text-overflow: -o-ellipsis-lastline;overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 2;line-clamp: 2;-webkit-box-orient: vertical;}
  18. .list-con-goods-option{font-size:12px;color:#999}
  19. .list-con-member-info{display:flex;padding:0 2px;flex-direction: column;flex:1;min-width: 120px;line-height:28px;justify-content: center;text-align:left;font-size:14px;border-top:1px solid #e9e9e9;border-right:1px solid #e9e9e9;}
  20. .list-member{padding: 10px;font-size: 12px;font-weight: 500;display:flex}
  21. .list-num{flex:3;display:flex;align-items:center;border-right:1px solid #e9e9e9;justify-content: center;}
  22. .list-gen{display:flex;align-items:center;justify-content: center;line-height:28px;}
  23. .list-gen-txt{flex:1;border-right:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9;align-items:center;justify-content: center;display:flex;}
  24. .list-opt{flex:1;display:flex;align-items:center;border-left:1px solid #e9e9e9;justify-content: center;}
  25. /* 导航 */
  26. .el-radio-button .el-radio-button__inner,.el-radio-button:first-child .el-radio-button__inner {border-radius: 4px 4px 4px 4px;border-left: 0px;}
  27. .el-radio-button__inner{border:0;}
  28. .el-radio-button:last-child .el-radio-button__inner {border-radius: 4px 4px 4px 4px;}
  29. .a-btn {
  30. border-radius: 2px;
  31. padding: 8px 12px;
  32. box-sizing: border-box;
  33. color: #666;
  34. font-weight: 500;
  35. text-align: center;
  36. margin-left: 1%;
  37. background-color: #fff;
  38. }
  39. .a-btn:hover{
  40. background-color: #29BA9C;
  41. color: #FFF;
  42. }
  43. .a-colour1 {
  44. background-color: #fff;
  45. color: #666;
  46. }
  47. .a-colour2 {
  48. background-color: #29BA9C;
  49. color: #FFF;
  50. }
  51. .el-popover{
  52. width: 90px;
  53. min-width: 90px;
  54. }
  55. .el-form-item {
  56. margin-bottom: 5px;
  57. }
  58. </style>
  59. <div class="all" id="card">
  60. <div id="app" v-cloak>
  61. {{--订单类型选项卡--}}
  62. {{--@include('order.typeTabs')--}}
  63. <div class="vue-head">
  64. <div class="vue-main-title" style="margin-bottom:20px">
  65. <div class="vue-main-title-left"></div>
  66. <div class="vue-main-title-content">售后筛选</div>
  67. <div class="vue-main-title-button">
  68. </div>
  69. </div>
  70. <div class="vue-search">
  71. <el-form :inline="true" :model="search_form" class="demo-form-inline">
  72. <el-form-item label="">
  73. <el-input v-model="search_form.order_sn" placeholder="订单编号"></el-input>
  74. </el-form-item>
  75. <el-form-item label="">
  76. <el-input v-model="search_form.refund_sn" placeholder="售后编号"></el-input>
  77. </el-form-item>
  78. <el-form-item label="">
  79. <el-input v-model="search_form.member_id" placeholder="购买会员ID"></el-input>
  80. </el-form-item>
  81. <el-form-item label="">
  82. <el-input style="width: 270px" placeholder="昵称/姓名/手机号" v-model="search_form.member_info">
  83. <el-select placeholder="选择按" style="width:90px;" v-model="search_form.member_type" clearable slot="prepend">
  84. <el-option label="昵称" value="1"></el-option>
  85. <el-option label="姓名" value="2"></el-option>
  86. <el-option label="手机号" value="3"></el-option>
  87. </el-select>
  88. </el-input>
  89. </el-form-item>
  90. <el-form-item label="">
  91. <el-input v-model="search_form.goods_id" placeholder="商品ID"></el-input>
  92. </el-form-item>
  93. <el-form-item label="">
  94. <el-input v-model="search_form.goods_title" placeholder="商品名称"></el-input>
  95. </el-form-item>
  96. <el-form-item label="">
  97. <el-select v-model="search_form.refund_type" clearable placeholder="售后类型" style="width:150px">
  98. <el-option label="退款" value="0"></el-option>
  99. <el-option label="退款退货" value="1"></el-option>
  100. <el-option label="换货" value="2"></el-option>
  101. </el-select>
  102. </el-form-item>
  103. <el-form-item label="">
  104. <el-select v-model="search_form.status" clearable placeholder="售后状态" style="width:150px">
  105. <el-option label="待审核" value="0"></el-option>
  106. <el-option label="待退货" value="1"></el-option>
  107. <el-option label="商户待收货" value="2"></el-option>
  108. <el-option label="待买家收货" value="4"></el-option>
  109. <el-option label="已完成" value="99"></el-option>
  110. <el-option label="已驳回" value="-1"></el-option>
  111. <el-option label="取消申请" value="-2"></el-option>
  112. </el-select>
  113. </el-form-item>
  114. <el-form-item label="">
  115. <el-select v-model="search_form.time_field" clearable placeholder="操作时间" style="width:150px">
  116. <el-option label="申请时间" value="create_time"></el-option>
  117. <el-option label="退款完成时间" value="refund_time"></el-option>
  118. </el-select>
  119. </el-form-item>
  120. <el-form-item label="">
  121. <el-date-picker
  122. v-model="times"
  123. type="datetimerange"
  124. value-format="yyyy-MM-dd HH:mm:ss"
  125. range-separator="至"
  126. start-placeholder="开始日期"
  127. end-placeholder="结束日期"
  128. style="margin-left:5px;"
  129. align="right">
  130. </el-date-picker>
  131. </el-form-item>
  132. <el-form-item label="">
  133. <el-button type="primary" @click="search(1)">搜索</el-button>
  134. <el-button @click="export1()">导出</el-button>
  135. </el-form-item>
  136. </el-form>
  137. </div>
  138. </div>
  139. <div class="vue-main">
  140. <div class="vue-main-form">
  141. <div class="vue-main-title" style="margin-bottom:20px">
  142. <div class="vue-main-title-left"></div>
  143. <div class="" style="text-align:left;font-size:14px;color:#999">
  144. <span>售后总数:[[count.total]]</span>&nbsp;&nbsp;&nbsp;
  145. <span>退款金额:[[count.total_price]]</span>&nbsp;&nbsp;&nbsp;
  146. </div>
  147. <div class="vue-main-title-button">
  148. </div>
  149. </div>
  150. <div v-for="(item,index) in list"
  151. style="border:1px solid #e9e9e9;border-radius:10px;margin-bottom:10px">
  152. <div class="list-info">
  153. <div style="display:flex;flex-wrap:wrap">
  154. <div class="vue-ellipsis" style="color:#999;max-width:240px">
  155. <strong>编号:</strong>[[item.id]]&nbsp;&nbsp;&nbsp;
  156. </div>
  157. <div v-if="item.refund_sn" class="vue-ellipsis" style="color:#999;max-width:240px">
  158. <strong>售后编号:</strong>[[item.refund_sn]]&nbsp;&nbsp;&nbsp;
  159. </div>
  160. <div v-if="item.order" class="vue-ellipsis" style="color:#999;max-width:240px">
  161. <strong>订单编号:</strong>[[item.order.order_sn]]&nbsp;&nbsp;&nbsp;
  162. </div>
  163. <div class="vue-ellipsis" style="color:#999;max-width:230px">
  164. <strong>申请时间:</strong>[[item.create_time]]&nbsp;&nbsp;&nbsp;
  165. </div>
  166. <div class="vue-ellipsis" style="color:#29BA9C;max-width:230px">
  167. <strong>[[item.order_type_name]]</strong>&nbsp;&nbsp;&nbsp;
  168. </div>
  169. <div v-if="item.part_refund == 4" class="vue-ellipsis" style="color:red;max-width:200px">
  170. <strong>退款并关闭</strong>&nbsp;&nbsp;&nbsp;
  171. </div>
  172. </div>
  173. <div style="flex:1;text-align:right;min-width:150px;">
  174. {{--<a @click="closeOrder(item.id,item)" style="color:#29BA9C;font-size:13px;font-weight:600" v-if="item.fixed_button.close.is_show">关闭订单</a>--}}
  175. </div>
  176. </div>
  177. <div class="list-con">
  178. <div style="flex:3;min-width:400px">
  179. <div v-for="(item1,index1) in item.refund_order_goods" class="list-con-goods">
  180. <div class="list-con-goods-img" style="width:80px">
  181. <el-image :src="item1.goods_thumb" style="width:70px;height:70px"></el-image>
  182. </div>
  183. <div class="list-con-goods-text"
  184. :style="{justifyContent:(item1.goods_option_title?'':'center')}">
  185. <div class="list-con-goods-title" style="color:#29BA9C;cursor: pointer;"
  186. @click="gotoGoods(item1.goods_id,item.order)">[[item1.goods_title]]
  187. </div>
  188. <div class="list-con-goods-option" v-if="item1.goods_option_title">
  189. 规格:[[item1.goods_option_title]]
  190. </div>
  191. </div>
  192. <div class="list-con-goods-price">
  193. {{--<div>申请金额:[[item1.refund_price]]</div>--}}
  194. <div>数量:[[item1.refund_total]]</div>
  195. </div>
  196. </div>
  197. </div>
  198. <div class="list-con-member-info vue-ellipsis">
  199. <div v-if="item.has_one_member" style="min-width:70%;margin:0 auto">
  200. <div @click="gotoMember(item.has_one_member.uid)"
  201. style="line-height:32px;color:#29BA9C;cursor: pointer;" class="vue-ellipsis">
  202. <strong>[[item.has_one_member.nickname]] </strong>
  203. </div>
  204. <div>[[item.has_one_member.realname]]</div>
  205. <div>[[item.has_one_member.mobile]]</div>
  206. </div>
  207. <div v-else style="min-width:70%;margin:0 auto">
  208. <div>会员([[item.uid]])已被删除</div>
  209. </div>
  210. </div>
  211. <div class="list-con-member-info vue-ellipsis" style="text-align:center;min-width: 90px;">
  212. <div><strong v-if="item.order">订单金额:¥[[item.order.price]]</strong></div>
  213. <div><strong v-if="item.order">订单状态:[[item.order.status_name]]</strong></div>
  214. </div>
  215. <div class="list-con-member-info vue-ellipsis" style="min-width: 120px;">
  216. <div style="min-width:70%;margin:0 auto">
  217. <div>退款金额:¥[[item.price]]</div>
  218. </div>
  219. </div>
  220. <div class="list-con-member-info vue-ellipsis" style="text-align:center">
  221. <div style="min-width:70%;margin:0 auto">
  222. <div style="color:#29BA9C">[[item.refund_type_name]] : [[item.status_name]]</div>
  223. </div>
  224. </div>
  225. <div class="list-con-member-info vue-ellipsis"
  226. style="text-align:center;min-width: 80px;border-right:0">
  227. {{--操作按钮--}}
  228. {{--<div v-for="(item1,index1) in item.backend_button_models" :key="index1">--}}
  229. {{--<el-button @click="orderConfirm(item1.value,item)" size="mini" :type="item1.type" style="width:80%;margin:0 auto;margin-bottom:5px;">--}}
  230. {{--[[item1.name]]--}}
  231. {{--</el-button>--}}
  232. {{--</div>--}}
  233. </div>
  234. </div>
  235. <div class="list-member">
  236. <div style="display:flex;flex-wrap:wrap;justify-content: flex-start">
  237. <template v-if="item.order.address && item.order.address !== null ">
  238. [[item.order.address.realname]]&nbsp;&nbsp;&nbsp;[[item.order.address.mobile]]&nbsp;&nbsp;&nbsp;[[item.order.address.address]]
  239. </template>
  240. </div>
  241. <div style="justify-content: flex-end;flex:1;display:flex">
  242. <el-tooltip class="item" effect="dark" content="打印小票" placement="bottom">
  243. <a style="color:#29BA9C;margin-right: 10px;" @click="orderPrinter(item)">
  244. <img src="{!! \app\common\helpers\Url::shopUrl('static/images/printer.png') !!}" style="width: 20px;">
  245. </a>
  246. </el-tooltip>
  247. <div>
  248. <a @click="gotoDetail(item)" style="color:#29BA9C">查看详情</a>
  249. </div>
  250. </div>
  251. </div>
  252. </div>
  253. </div>
  254. </div>
  255. <!-- 分页 -->
  256. <div class="vue-page" v-if="total>0">
  257. <el-row>
  258. <el-col align="right">
  259. <el-pagination layout="prev, pager, next,jumper" @current-change="search" :total="total"
  260. :page-size="per_page" :current-page="current_page" background
  261. ></el-pagination>
  262. </el-col>
  263. </el-row>
  264. </div>
  265. </div>
  266. </div>
  267. <script>
  268. var app = new Vue({
  269. el: "#app",
  270. delimiters: ['[[', ']]'],
  271. name: 'test',
  272. data() {
  273. return {
  274. order_id:"",
  275. listUrl: '{!! yzWebFullUrl('refund.after-sales.get-list') !!}',//获取订单数据链接
  276. exportUrl: '{!! yzWebFullUrl('refund.after-sales.export') !!}',//订单数据导出链接
  277. detailUrl: '{!! yzWebFullUrl('refund.after-sales.detail') !!}',
  278. goodsEditUrl: '', //列表所以商品跳转指定链接
  279. list:[],
  280. count:{},
  281. times:[],
  282. //页面返回全部参数
  283. responseResults:{},
  284. //搜索条件参数
  285. search_form:{
  286. member_id:"",
  287. },
  288. //分页
  289. current_page:1,
  290. total:1,
  291. per_page:1,
  292. }
  293. },
  294. created() {
  295. let result = this.viewReturn();
  296. this.__initial(result);
  297. //this.search_form.member_id = this.getParam('member_id')
  298. },
  299. mounted() {
  300. this.getData(1);
  301. },
  302. methods: {
  303. //视图返回数据
  304. viewReturn() {
  305. return {!! $data?:'{}' !!};
  306. },
  307. //初始化页面数据,请求链接
  308. __initial(data) {
  309. if (data.listUrl) {
  310. this.listUrl = data.listUrl;
  311. }
  312. if (data.exportUrl) {
  313. this.exportUrl = data.exportUrl;
  314. }
  315. if (data.detailUrl) {
  316. this.detailUrl = data.detailUrl;
  317. }
  318. if (data.goodsEditUrl) {
  319. this.goodsEditUrl = data.goodsEditUrl;
  320. }
  321. this.responseResults = data;
  322. console.log(data);
  323. },
  324. getData(page) {
  325. //console.log(this.times);
  326. let requestData = {
  327. page:page,
  328. code: this.code,
  329. search: JSON.parse(JSON.stringify(this.search_form)),
  330. };
  331. if(this.times && this.times.length>0) {
  332. requestData.search.start_time = this.times[0];
  333. requestData.search.end_time = this.times[1];
  334. }
  335. console.log(requestData);
  336. let loading = this.$loading({target:document.querySelector(".content"),background: 'rgba(0, 0, 0, 0)'});
  337. this.$http.post(this.listUrl,requestData).then(function(response) {
  338. if (response.data.result) {
  339. // this.list = response.data.data.list;
  340. //this.expressCompanies = response.data.data.expressCompanies;
  341. this.count = response.data.data.count;
  342. this.list = response.data.data.list.data;
  343. this.current_page = response.data.data.list.current_page;
  344. this.total = response.data.data.list.total;
  345. this.per_page = response.data.data.list.per_page;
  346. this.synchro = response.data.data.synchro;
  347. loading.close();
  348. } else {
  349. this.$message({
  350. message: response.data.msg,
  351. type: 'error'
  352. });
  353. }
  354. loading.close();
  355. }, function(response) {
  356. this.$message({
  357. message: response.data.msg,
  358. type: 'error'
  359. });
  360. loading.close();
  361. });
  362. },
  363. search(val) {
  364. this.getData(val);
  365. },
  366. export1(){
  367. let that = this;
  368. console.log(that.search_form);
  369. let json = that.search_form;
  370. if(this.times && this.times.length>0) {
  371. json.start_time = this.times[0];
  372. json.end_time = this.times[1];
  373. }
  374. let url = this.exportUrl;
  375. for(let i in json){
  376. if (json[i]) {
  377. url+="&search["+i+"]="+ json[i]
  378. }
  379. }
  380. console.log(url);
  381. window.location.href = url;
  382. },
  383. gotoDetail(item) {
  384. let link = this.detailUrl +'&id='+item.id;
  385. //let link = item.fixed_button.detail.api +'&id='+item.id+'&order_id='+item.id;
  386. // window.location.href = link;
  387. window.open(link);
  388. },
  389. gotoGoods(id,order) {
  390. if (this.goodsEditUrl) {
  391. let link = this.goodsEditUrl;
  392. window.location.href = link+`&id=`+id;
  393. return;
  394. }
  395. if(!order.fixed_button.goods_detail.is_show) {
  396. return
  397. }
  398. let link = order.fixed_button.goods_detail.api;
  399. window.location.href = link+`&id=`+id;
  400. },
  401. gotoMember(id) {
  402. window.location.href = `{!! yzWebFullUrl('member.member.detail') !!}`+`&id=`+id;
  403. },
  404. // 字符转义
  405. escapeHTML(a) {
  406. a = "" + a;
  407. return a.replace(/&amp;/g, "&").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&quot;/g, "\"").replace(/&apos;/g, "'");;
  408. },
  409. getParam(name) {
  410. var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
  411. var r = window.location.search.substr(1).match(reg);
  412. if (r != null) return unescape(r[2]);
  413. return null;
  414. },
  415. reloadList() {
  416. this.search(this.current_page)
  417. },
  418. orderPrinter(row) {
  419. let loading = this.$loading({target:document.querySelector(".content"),background: 'rgba(0, 0, 0, 0)'});
  420. this.$http.post('{!! yzWebFullUrl('order.order-list.orderPrinter') !!}',{order_id: row.order.id}).then( (response) => {
  421. if (response.data.result) {
  422. this.$message({type: 'success',message: response.data.msg});
  423. }
  424. else{
  425. this.$message({type: 'error',message: response.data.msg});
  426. }
  427. loading.close();
  428. }, (response) => {
  429. this.$message({type: 'error',message: response.data.msg});
  430. loading.close();
  431. }
  432. );
  433. }
  434. },
  435. })
  436. </script>
  437. @endsection