table.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. <template>
  2. <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id">
  3. <el-table-column type="selection" width="50" fixed="left"></el-table-column>
  4. <el-table-column label="订单编号" width="260" fixed="left" prop="goods_id">
  5. <template #default="scope">
  6. <div class="order-name">
  7. <span>{{ scope.row.order_sn }}</span>
  8. <span class="dec">系统单号:{{ scope.row.out_order_no }}</span>
  9. </div>
  10. </template>
  11. </el-table-column>
  12. <el-table-column label="商品类型" prop="types" width="100">
  13. <template #default="scope">
  14. {{ scope.row.product?scope.row.product.types:'-' }}
  15. </template>
  16. </el-table-column>
  17. <el-table-column label="商品信息" width="340" prop="name">
  18. <template #default="scope">
  19. <div class="goods-img">
  20. <div class="img">
  21. <el-image
  22. style="width: 54px; height: 54px"
  23. :src="scope.row.img"
  24. :zoom-rate="1.2"
  25. :max-scale="7"
  26. :min-scale="0.2"
  27. :preview-src-list="[scope.row.img]"
  28. preview-teleported
  29. z-index="999"
  30. fit="cover"></el-image>
  31. </div>
  32. <div class="name">
  33. <span>{{ scope.row.product.product_name }}</span>
  34. <span class="dec">商品编码:{{ scope.row.product.product_id }}</span>
  35. </div>
  36. </div>
  37. </template>
  38. </el-table-column>
  39. <el-table-column label="下单用户" width="340" prop="name">
  40. <template #default="scope">
  41. <div class="goods-img">
  42. <div class="img">
  43. <el-image
  44. style="width: 54px; height: 54px"
  45. :src="scope.row.user.avatar"
  46. :zoom-rate="1.2"
  47. :max-scale="7"
  48. :min-scale="0.2"
  49. :preview-src-list="[scope.row.user.avatar]"
  50. preview-teleported
  51. z-index="999"
  52. fit="cover"></el-image>
  53. </div>
  54. <div class="name">
  55. <span>{{ scope.row.user.nickname }}</span>
  56. <span class="dec">{{ scope.row.user.openid }}</span>
  57. </div>
  58. </div>
  59. </template>
  60. </el-table-column>
  61. <el-table-column label="商品售价" prop="types" width="120" align="right">
  62. <template #default="scope">
  63. <div class="order-name">
  64. <span>{{ scope.row.price?$TOOL.money(scope.row.price):'-' }}</span>
  65. <span class="dec">{{ scope.row.number }}份</span>
  66. </div>
  67. </template>
  68. </el-table-column>
  69. <el-table-column label="顾客支付" prop="types" width="120" align="right">
  70. <template #default="scope">
  71. {{ scope.row.pay_money?$TOOL.money(scope.row.pay_money):'-' }}
  72. </template>
  73. </el-table-column>
  74. <el-table-column label="留资号码" prop="types" width="120">
  75. <template #default="scope">
  76. {{ scope.row.mobile?scope.row.mobile:'-' }}
  77. </template>
  78. </el-table-column>
  79. <el-table-column label="订单状态" prop="types" width="160" align="left">
  80. <template #default="scope">
  81. <div class="order-name" v-if="scope.row.status == 0">
  82. <span>待支付</span>
  83. <span class="dec" v-if="scope.row.end_time.min == 0 && scope.row.end_time.sec == 0">已超时,取消支付</span>
  84. <span class="dec" v-else>剩余{{ scope.row.end_time.min }}:{{ scope.row.end_time.sec }}</span>
  85. </div>
  86. <div class="order-name" v-if="scope.row.status == 1">
  87. <span>待使用</span>
  88. </div>
  89. <div class="order-name" v-if="scope.row.status == 2">
  90. <span>已完成</span>
  91. </div>
  92. <div class="order-name" v-if="scope.row.status == 3">
  93. <span>已退款</span>
  94. <span class="dec">款项已原路退回</span>
  95. </div>
  96. <div class="order-name" v-if="scope.row.status == 4">
  97. <span>退款中</span>
  98. <span class="dec">款项已原路退回</span>
  99. </div>
  100. <div class="order-name" v-if="scope.row.status == 5">
  101. <span>已关闭</span>
  102. <span class="dec">用户已取消</span>
  103. </div>
  104. </template>
  105. </el-table-column>
  106. <el-table-column label="发货状态" prop="types" width="160" align="left">
  107. <template #default="scope">
  108. <div v-if="scope.row.status == 2">
  109. <div class="order-name" v-if="scope.row.express_status == 1">
  110. <span>待发货</span>
  111. </div>
  112. <div class="order-name" v-if="scope.row.express_status == 2">
  113. <span>已发货</span>
  114. </div>
  115. <div class="order-name" v-if="scope.row.express_status == 3">
  116. <span>已签收</span>
  117. </div>
  118. </div>
  119. <div v-else>待订单完成</div>
  120. </template>
  121. </el-table-column>
  122. <el-table-column label="下单时间" prop="create_at" width="160"></el-table-column>
  123. <el-table-column label="支付时间" prop="pay_at" width="160">
  124. <template #default="scope">
  125. {{ scope.row.pay_at?scope.row.pay_at:'未支付' }}
  126. </template>
  127. </el-table-column>
  128. <el-table-column label="操作" width="140" align="left" fixed="right">
  129. <template #default="scope">
  130. <el-button-group>
  131. <el-button type="warning" size="small" text @click="table_refund(scope.row)">同意退款</el-button>
  132. <el-button type="danger" size="small" text @click="table_done(scope.row)">核销</el-button>
  133. <el-button size="small" text @click="table_view(scope.row)">详情</el-button>
  134. </el-button-group>
  135. </template>
  136. </el-table-column>
  137. </scTable>
  138. <orderDetail ref="orderDetail" @success="orderSuccess"></orderDetail>
  139. </template>
  140. <script>
  141. import orderDetail from "@/components/imFloat/order";
  142. export default {
  143. components:{
  144. orderDetail
  145. },
  146. props: {
  147. trade: { type: String, default: "0" },
  148. },
  149. data(){
  150. return {
  151. list: {
  152. apiObj: this.$API.merOrder.list
  153. },
  154. dataSelect:[],
  155. dataSelectFull:[],
  156. searchKey:{error:1}
  157. }
  158. },
  159. methods: {
  160. orderSuccess(){
  161. this.$refs.table.refresh()
  162. },
  163. table_view(data){
  164. this.$nextTick(() => {
  165. data.order = data.out_order_no
  166. this.$refs.orderDetail.open("edit").setData(data)
  167. })
  168. },
  169. table_refund(data){
  170. this.$confirm(`同意退款后,消费者需在小程序中手动确认,也可以重新发起核销`, '提示', {
  171. type: 'warning'
  172. }).then(async ()=>{
  173. var resp = await this.$API.merOrder.refund.post({"order":data.order_sn});
  174. if (resp.code == 0) {
  175. return this.$message.error(resp.msg);
  176. }
  177. this.$message.success(resp.msg);
  178. this.$refs.table.refresh()
  179. }).catch(()=>{})
  180. },
  181. table_done(data){
  182. this.$confirm(`订单核销后,无法撤销以及退款`, '提示', {
  183. type: 'warning'
  184. }).then(async ()=>{
  185. var resp = await this.$API.merOrder.done.post({"order":data.order_sn});
  186. if (resp.code == 0) {
  187. return this.$message.error(resp.msg);
  188. }
  189. this.$message.success(resp.msg);
  190. this.$refs.table.refresh()
  191. }).catch(()=>{})
  192. },
  193. refresh(){
  194. this.$refs.table.refresh()
  195. },
  196. upData(data){
  197. this.$refs.table.upData(data)
  198. },
  199. handleSuccess(){
  200. this.$refs.table.refresh()
  201. },
  202. sortChange(event){
  203. if (event.order) {
  204. var data = {
  205. "field":event.prop,
  206. "order":event.order
  207. }
  208. this.$refs.table.upData(data)
  209. } else {
  210. this.$refs.table.reload(this.searchKey)
  211. }
  212. return ;
  213. },
  214. selectionChange(event){
  215. this.dataSelect = [];
  216. var arr = [];
  217. var arrCompany = [];
  218. event.forEach(function(val,index){
  219. arr[index] = val.id;
  220. arrCompany[index] = val;
  221. });
  222. this.dataSelectFull = arrCompany;
  223. this.dataSelect = arr;
  224. this.$emit("success",this.dataSelect);
  225. this.$emit("successFull",this.dataSelectFull);
  226. },
  227. }
  228. }
  229. </script>
  230. <style>
  231. .order-name span{display: block;}
  232. .order-name span.dec{color: #999;font-size: 12px;}
  233. .goods-img{display: flex;gap: 5px;}
  234. .goods-img .name span{display: block;}
  235. .goods-img .name span.dec{color: #999;font-size: 12px;}
  236. .goods-price,.price{display: flex;align-items: center;gap: 5px;font-size: 14px;}
  237. .goods-price .del{text-decoration: line-through;}
  238. .goods-price span{background-color: #fff !important;
  239. border: 1px solid #d3d9e0 !important;
  240. border-radius: 4px;
  241. box-sizing: border-box;
  242. color: #6c737a !important;
  243. display: inline-flex;
  244. flex: none;
  245. font-size: 12px;
  246. line-height: 18px !important;
  247. padding: 1px 6px !important;text-decoration: none;}
  248. </style>