refund.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. <?php
  2. use common\helpers\ComponentHelper;
  3. ?>
  4. <style>
  5. .demo-form-inline .el-select .el-input {
  6. width: 100px;
  7. }
  8. /* 订单表格 start */
  9. .width-pre10 {
  10. width: 10%;
  11. }
  12. .width-50 {
  13. width: 80px;
  14. }
  15. .width-400 {
  16. width: 350px;
  17. }
  18. .order-table {
  19. overflow-x: scroll;
  20. }
  21. .tab-title,
  22. .tab-cont {
  23. width: 100%;
  24. min-width: 1290px;
  25. font-size: 13px;
  26. }
  27. .tab-title {
  28. padding: 20px 0;
  29. }
  30. .tab-title>li {
  31. padding: 0 10px;
  32. }
  33. .tab-cont {
  34. border: 1px solid #F2F2F2;
  35. margin-bottom: 20px;
  36. }
  37. .tab-cont-row {
  38. padding: 10px 0;
  39. background-color: #F7F7F7;
  40. }
  41. .tab-cont-info {
  42. height: 100px;
  43. }
  44. .tab-cont-info>li {
  45. /* display: flex;
  46. flex-direction: column;
  47. justify-content: center; */
  48. height: 100%;
  49. padding: 16px 10px;
  50. }
  51. .tab-btns {
  52. width: 320px;
  53. margin-right: 20px;
  54. }
  55. .tab-goods-name {
  56. margin: 0 10px;
  57. }
  58. .border-right {
  59. border-right: 1px solid #f2f2f2;
  60. }
  61. .border-bottom {
  62. border-bottom: 1px solid #f2f2f2;
  63. }
  64. .no-border-bottom {
  65. border-bottom: none !important;
  66. }
  67. .cursor {
  68. cursor: pointer;
  69. }
  70. .edit-icon {
  71. color: #03c5ff;
  72. cursor: pointer;
  73. }
  74. .popover-btn {
  75. font-size: 12px;
  76. padding: 0 10px;
  77. border-right: 1px solid var(--primary, #03c5ff);
  78. cursor: pointer;
  79. display: inline-block;
  80. line-height: 1;
  81. color: #03c5ff;
  82. }
  83. .popover-btn:last-child {
  84. border-right: none;
  85. }
  86. .width-s {
  87. width: 250px;
  88. }
  89. .el-button--text {
  90. padding: 0 !important;
  91. }
  92. /* 订单表格 end */
  93. </style>
  94. <div id="app" v-cloak>
  95. <el-card shadow="never" body-style="background-color: #f3f3f3;padding: 10px 0 0;">
  96. <div slot="header">
  97. <span>订单列表</span>
  98. <div style="float: right; margin: -5px 0">
  99. <!-- <el-button type="primary" size="small" @click="handle('edit')">添加商品</el-button>
  100. <el-button type="primary" size="small">商品导出</el-button> -->
  101. </div>
  102. </div>
  103. <div class="table-body">
  104. <el-tabs v-model="activeName" @tab-click="handleClick">
  105. <el-tab-pane v-for="item in tabs" :key="item.value" :label="item.name" :name="item.value">
  106. <el-form :inline="true" :model="search_data" size="small" class="demo-form-inline">
  107. <el-form-item label="订单号">
  108. <el-input placeholder="请输入订单号" v-model="search_data.order_no"></el-input>
  109. </el-form-item>
  110. <el-form-item label="">
  111. <el-input placeholder="请输入内容" v-model="search_data.keyword" class="input-with-select">
  112. <el-select v-model="search_data.type" slot="prepend" placeholder="请选择">
  113. <el-option label="用户电话" value="mobile"></el-option>
  114. <el-option label="商品名称" value="goods_name"></el-option>
  115. </el-select>
  116. </el-input>
  117. </el-form-item>
  118. <el-form-item label="商品类型">
  119. <el-select v-model="search_data.goods_type" clearable placeholder="请选择商品类型">
  120. <el-option v-for="(name, value) in goods_type" :key="value" :label="name" :value="value"></el-option>
  121. </el-select>
  122. </el-form-item>
  123. <el-form-item>
  124. <el-button type="primary" @click="search">搜索</el-button>
  125. <el-button type="danger" @click="clearSearch" v-if="show_clear_search_btn">清除条件</el-button>
  126. </el-form-item>
  127. </el-form>
  128. <!-- 订单表格 start -->
  129. <div class="order-table">
  130. <ul class="tab-title" flex="dir:left cross:center">
  131. <li class="width-50" flex="main:center">
  132. ID
  133. <!-- <el-checkbox v-model="checkAll"></el-checkbox>-->
  134. </li>
  135. <li class="width-400">商品信息</li>
  136. <li class="width-pre10">价格/数量</li>
  137. <li class="width-pre10">售后状态</li>
  138. <li class="width-pre10">商品价格</li>
  139. <li class="width-pre10">售后方式</li>
  140. <li class="width-s">售后原因</li>
  141. <li class="width-s">门店信息</li>
  142. <li class="width-s">收货人信息</li>
  143. <li class="width-50">操作</li>
  144. </ul>
  145. <div class="tab-cont" v-for="(item, index) in list" :key="index">
  146. <div class="tab-cont-row" flex="main:justify cross:center">
  147. <div flex="dir:left cross:center">
  148. <div class="width-50" flex="main:center">
  149. <!-- <el-checkbox v-model="checkAll"></el-checkbox>-->
  150. </div>
  151. <div style="padding-right: 20px;">售后编号:{{ item.order_no || '-' }}</div>
  152. <div style="padding-right: 20px;" v-if="item.base_user">用户:({{item.base_user.id}}):{{ item.base_user.nickname || item.base_user.username }}</div>
  153. <div style="padding-right: 20px;">申请时间:{{ item.created_at|dateTimeFormat('Y-m-d H:i:s')}}</div>
  154. <div style="padding-right: 20px;">订单编号:{{ item.order['order_no'] || '-' }}</div>
  155. </div>
  156. </div>
  157. <ul class="tab-cont-info" flex="dir:left cross:center" v-if="true">
  158. <li class="width-50 border-right border-bottom" flex="cross:center">{{ item.id }}</li>
  159. <li class="tab-shop-info width-400 border-bottom" flex="dir:left">
  160. <div style="position: relative;">
  161. <el-image style="width: 50px; height: 50px; border-radius: 5px;" :src="item.orderDetail['pic_url']"></el-image>
  162. </div>
  163. <div class="tab-goods-name">
  164. <com-ellipsis :line="1" :text="item.orderDetail['goods_name'].toString()"></com-ellipsis>
  165. <template v-if="item.orderDetail['attr_list'] && item.orderDetail['attr_list.length'] > 0">
  166. <el-tag style="margin-right: 2px;margin-top: 5px;" v-for="(attrItem, attrIndex) in item.orderDetail['attr_list']" :key="attrIndex" size="small">
  167. {{ attrItem }}
  168. </el-tag>
  169. </template>
  170. <el-tag v-else size="small">
  171. 无规格
  172. </el-tag>
  173. </div>
  174. </li>
  175. <li class="width-pre10 border-bottom">
  176. <div class="cursor" flex="cross:center">
  177. <p style="padding-right: 10px;">
  178. {{getOrderPrice(item.orderDetail)}}
  179. <span v-if="item.orderDetail['adjust_money'] != 0">(调价:¥{{ item.orderDetail['adjust_money'] }})</span>
  180. </p>
  181. </div>
  182. <p>{{ item.orderDetail['num'] }}件</p>
  183. </li>
  184. <li class="width-pre10 border-right border-bottom" flex="cross:center">
  185. <div>
  186. <el-tag size="small" effect="plain" :type="item.refund_status == 1 ? 'success' : 'danger'">{{ refund_status_list[item.refund_status] }}</el-tag>
  187. </div>
  188. </li>
  189. <li class="width-pre10 border-right">
  190. <div>
  191. <p>{{getOrderPrice(item.orderDetail)}}</p>
  192. </div>
  193. </li>
  194. <li class="width-pre10 border-right">
  195. <div>
  196. <p>{{ refund_type_list[item.type] }}</p>
  197. <p v-if="item.type != 3">退款金额:{{getOrderPrice(item.orderDetail)}}</p>
  198. </div>
  199. </li>
  200. <li class="width-s border-right">
  201. <p>{{ item.reason }}</p>
  202. <com-ellipsis :line="1" :text="item.remark.toString()"></com-ellipsis>
  203. </li>
  204. <li class="width-s border-right">
  205. <p>{{ item.store_name }}</p>
  206. <p>{{ item.shop_mobile }}</p>
  207. </li>
  208. <li class="width-s border-right">
  209. <div v-if="item.order && item.order.province == 0 && item.order.community_addons_data">
  210. <p>{{ item.order.community_addons_data.name | emptyFilled }}</p>
  211. <p>{{ item.order.community_addons_data.contact_name | emptyFilled }}</p>
  212. <p>{{ item.order.community_addons_data.contact_phone | emptyFilled}} </p>
  213. <p style="display: flex;align-items: center;">
  214. <com-ellipsis :line="1" :text="item.order.community_addons_data.address"></com-ellipsis>
  215. </p>
  216. </div>
  217. <div v-else>
  218. <p>{{ item.order.receiver_name | emptyFilled }}</p>
  219. <p>{{ item.order.mobile |emptyFilled}} </p>
  220. <p style="display: flex;align-items: center;">
  221. <com-ellipsis v-if="(item.order.region_name ).trim() != 'null'" :line="1" :text="item.order.region_name + '' + item.order.address"></com-ellipsis>
  222. <span v-else>--</span>
  223. </p>
  224. </div>
  225. </li>
  226. <li>
  227. <el-button size="small" type="text" @click="handle('detail',item)">售后详情</el-button>
  228. </li>
  229. </ul>
  230. </div>
  231. </div>
  232. <div style="text-align: right;margin: 20px 0;">
  233. <el-pagination @current-change="pagination" background layout="prev, pager, next" :page-count="pageCount"></el-pagination>
  234. </div>
  235. <!-- 订单表格 end -->
  236. </el-tab-pane>
  237. </el-tabs>
  238. </div>
  239. </el-card>
  240. </div>
  241. <script>
  242. const app = new Vue({
  243. el: '#app',
  244. data() {
  245. return {
  246. price: 0,
  247. visibles: false,
  248. hidden: false,
  249. current: -1,
  250. detailIndex: -1,
  251. checkAll: false,
  252. checked: false,
  253. select: '',
  254. goods_name: '',
  255. goods_id: '',
  256. tabs: [
  257. {
  258. name: '全部',
  259. value: '999'
  260. },
  261. {
  262. name: '售后申请',
  263. value: '0'
  264. },
  265. {
  266. name: '售后中',
  267. value: '3,4,5'
  268. },
  269. {
  270. name: '售后完成',
  271. value: '1'
  272. }
  273. ],
  274. refund_type_list: {},
  275. refund_status_list: {},
  276. activeName: '999',
  277. list: [],
  278. listLoading: false,
  279. page: 1,
  280. pageCount: 0,
  281. mch_id: 0, // 这个地方不知道要怎么获取
  282. search_data: { // 筛选条件
  283. type: "mobile",
  284. keyword: null,
  285. order_no: null,
  286. goods_type: null,
  287. },
  288. goods_type: <?= $goods_type ?>
  289. };
  290. },
  291. mounted: function() {
  292. this.getList();
  293. },
  294. computed: {
  295. show_clear_search_btn: function() {
  296. return !isEmpty(this.search_data.order_no) || !isEmpty(this.search_data.keyword);
  297. }
  298. },
  299. updated: function() {
  300. // console.log('ssssss')
  301. },
  302. methods: {
  303. handleClick(res) { //标签页切换
  304. if (this.search_data.refund_status == this.activeName) return;
  305. if (this.activeName == '999') {
  306. this.search_data.refund_status = null;
  307. } else {
  308. this.search_data.refund_status = this.activeName;
  309. }
  310. this.getList(this.search_data);
  311. },
  312. search() {
  313. this.getList(this.search_data);
  314. },
  315. clearSearch() {
  316. this.search_data.order_no = null;
  317. this.search_data.type = 'mobile';
  318. this.search_data.keyword = null;
  319. this.getList();
  320. },
  321. handle(type, data = null) {
  322. let id = data ? parseInt(data.id) : '';
  323. let store_id = data ? parseInt(data.store_id) : 0;
  324. switch (type) {
  325. // 订单详情
  326. case 'detail':
  327. let params = {
  328. r: 'store/store-order/refund-detail'
  329. };
  330. if (id) params = Object.assign(params, {
  331. id: id
  332. });
  333. if (store_id) params = Object.assign(params, {
  334. store_id: store_id,
  335. });
  336. navigateTo(params);
  337. break;
  338. // 删除售后
  339. case 'destroy':
  340. param = {
  341. id: data.id,
  342. store_id: store_id,
  343. type
  344. };
  345. this.$confirm('删除该条数据后不可以恢复, 是否继续?', '警告', {
  346. type: 'warning'
  347. }).then(() => {
  348. this.send(param)
  349. }).catch((err) => {})
  350. break;
  351. }
  352. },
  353. send(url, params, callback) {
  354. let self = this;
  355. request({
  356. params: {
  357. r: url,
  358. },
  359. method: 'post',
  360. data: params
  361. }).then(e => {
  362. if (e.data.code == 0) {
  363. self.$message.success(e.data.msg);
  364. self.getList(this.search_data);
  365. } else {
  366. self.$message.error(e.data.msg);
  367. }
  368. if (callback) callback(e.data);
  369. }).catch(e => {
  370. console.log(e);
  371. });
  372. },
  373. pagination(currentPage) {
  374. let self = this;
  375. self.page = currentPage;
  376. self.getList();
  377. },
  378. // 获取商品列表
  379. getList(params = {}) {
  380. let self = this;
  381. let basic_params = {
  382. r: 'store/store-order/refund-list',
  383. page: self.page,
  384. };
  385. params = Object.assign(basic_params, params);
  386. console.log(params);
  387. if (self.listLoading == false) {
  388. self.listLoading = true;
  389. request({
  390. params: params,
  391. method: 'get',
  392. }).then(e => {
  393. self.listLoading = false;
  394. if (e.data.code == 0) {
  395. self.list = e.data.data.list;
  396. self.refund_type_list = e.data.data.refund_type_list;
  397. self.refund_status_list = e.data.data.refund_status_list;
  398. self.pageCount = e.data.data.page_count;
  399. } else {
  400. self.$message.error(e.data.msg);
  401. }
  402. }).catch(e => {
  403. self.$message.error(e.data.msg);
  404. self.listLoading = false;
  405. });
  406. }
  407. },
  408. getOrderPrice(data){
  409. let text = '';
  410. switch (data.marketing_type) {
  411. case 'ScoreMall' :
  412. text = data.extra_info;
  413. break;
  414. default :
  415. text = '¥'+data.goods_price;
  416. }
  417. return text;
  418. },
  419. }
  420. });
  421. </script>