order.vue 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. <template>
  2. <div>
  3. <use-table ref="tbl"></use-table>
  4. <div class="container member_order use-table">
  5. <div class="container_status dflex_vertical_c">
  6. <div class="item_interval" v-for="(item, i) in stateDatas" :key="i">
  7. <el-button class="badge_txt" :class="{ active: item.name == state }" size="small"
  8. @click="cutSta(item)">{{ item.name }}</el-button>
  9. <v-countup class="badge" start-value="0" :end-value="item.cnt"></v-countup>
  10. </div>
  11. </div>
  12. <el-table row-key="_id" ref="etbl" :expand-row-keys="expandKeys" show-summary :summary-method="getSummaries"
  13. :height="tblHeight" :data="tableDatas" highlight-current-row>
  14. <el-table-column type="expand" width="70">
  15. <template slot-scope="props">
  16. <el-form label-position="left" inline>
  17. <div class="order_detail margin_b_20" v-for="(item, i) in props.row.order_details" :key="i">
  18. <div class="dflex_vertical_c padding_10">
  19. <el-image style="width: 90px;" :src="item.goods_img" :preview-src-list="item.imgs"
  20. fit="contain"></el-image>
  21. <div class="order_detail_right margin_l_10 dflex_d_c dflex_sb">
  22. <div>{{ item.goods_name }}</div>
  23. <div class="dflex">
  24. <div class="bbb margin_r_30">×{{ item.goods_num }}</div>
  25. <div class="bbb margin_l_30">{{ item.goods_sku_name }}</div>
  26. </div>
  27. <div class="dflex_e">
  28. <div class="price margin_r_5">{{ item.goods_price / 100 }}</div>
  29. <div class="m_price">{{ item.goods_market_price / 100 }}</div>
  30. </div>
  31. </div>
  32. </div>
  33. </div>
  34. </el-form>
  35. </template>
  36. </el-table-column>
  37. <el-table-column label="买家" align="center" width="300">
  38. <template slot-scope="scope">
  39. <div class="dflex_vertical_c">
  40. <el-image class="headimg_small"
  41. :src="scope.row.order_member_headimg || '/static/img/default.jpg'"
  42. :preview-src-list="scope.row.imgs" fit="contain"></el-image>
  43. <div class="margin_l_10">
  44. <div class="left_just">{{ scope.row.order_member_name }}</div>
  45. <div>{{ scope.row.order_id }}</div>
  46. </div>
  47. </div>
  48. </template>
  49. </el-table-column>
  50. <el-table-column property="create_time" label="下单时间" align="center"></el-table-column>
  51. <el-table-column label="订单总额" prop="order_total_money" align="center">
  52. <template slot-scope="scope">
  53. <div class="price">{{ scope.row.order_total_money / 100 }}</div>
  54. </template>
  55. </el-table-column>
  56. <el-table-column property="order_total_cnt" label="商品数" align="center"></el-table-column>
  57. <el-table-column property="order_from" label="订单来源" align="center"></el-table-column>
  58. <el-table-column property="state" label="订单状态" align="center"></el-table-column>
  59. <el-table-column property="order_pay_way" label="支付方式" align="center"></el-table-column>
  60. </el-table>
  61. <el-pagination :current-page="req.page" :page-sizes="[10, 20, 30, 50, 100]" :page-size="req.rows"
  62. layout="total, sizes, prev, pager, next, jumper" :total="tableTotal" @size-change="sizeChange"
  63. @current-change="currentChange"></el-pagination>
  64. </div>
  65. </div>
  66. </template>
  67. <script>
  68. import vCountup from 'vue-countupjs';
  69. const __name = 'usemall-order, usemall-order-detail';
  70. export default {
  71. components: {
  72. vCountup
  73. },
  74. data() {
  75. return {
  76. dataId: '',
  77. state: '全部',
  78. stateObj: {
  79. 待付款: 0,
  80. 待发货: 0,
  81. 待评价: 0,
  82. 已完成: 0,
  83. 已取消: 0,
  84. 全部: 0
  85. },
  86. stateDatas: [],
  87. req: {
  88. page: 1,
  89. rows: 10,
  90. orderby: 'create_time desc',
  91. state: ''
  92. },
  93. tblHeight: 0,
  94. tableDatas: [],
  95. tableTotal: 0,
  96. expandKeys: []
  97. };
  98. },
  99. methods: {
  100. async loadData() {
  101. this.stateDatas = [];
  102. for (let key in this.stateObj) {
  103. this.stateDatas.push({
  104. name: key,
  105. cnt: this.stateObj[key]
  106. });
  107. }
  108. this.$db[__name]
  109. .where({
  110. is_delete: 0,
  111. create_uid: this.dataId
  112. })
  113. .whereif(this.req.state && this.req.state != '全部', {
  114. state: this.req.state
  115. })
  116. .withgroup({
  117. field: 'state',
  118. obj: this.stateObj
  119. })
  120. .totable(this.req)
  121. .then(res => {
  122. if (res.code == 200) {
  123. if (res.datas.group && res.datas.group.datas) {
  124. this.stateDatas = res.datas.group.datas;
  125. }
  126. res.datas.rows.forEach((row, idx) => {
  127. if (idx == 0) {
  128. this.expandKeys.push(row._id);
  129. }
  130. row.imgs = [row.order_member_headimg];
  131. row.create_time = new Date(row.create_time).format();
  132. row.order_details = row.order_id['usemall-order-detail'];
  133. row.order_details.every(x => (x.imgs = [x.goods_img]));
  134. row.order_id = row.order_details[0].order_id;
  135. });
  136. this.tableDatas = res.datas.rows;
  137. this.tableTotal = res.datas.total;
  138. }
  139. });
  140. },
  141. cutSta(item) {
  142. this.state = item.name;
  143. this.req.state = item.name;
  144. this.loadData();
  145. },
  146. sizeChange(size) {
  147. this.req.rows = size;
  148. this.loadData();
  149. },
  150. currentChange(current) {
  151. this.req.page = current;
  152. this.loadData();
  153. },
  154. getSummaries(param) {
  155. const {
  156. columns,
  157. data
  158. } = param;
  159. const sums = [];
  160. columns.forEach((column, index) => {
  161. if (index === 0) {
  162. sums[index] = '合计';
  163. return;
  164. }
  165. if (!column.property) return;
  166. if (index === 3) {
  167. const values = data.map(item => item[column.property] / 100);
  168. let totalMoney = eval(values.join('+'));
  169. if (typeof totalMoney === 'number') {
  170. sums[index] = `${totalMoney.toFixed(2)} 元`;
  171. let timer = setTimeout(() => {
  172. document.querySelector(
  173. '.el-table__footer .has-gutter td:nth-child(4) div').classList
  174. .add('price');
  175. this.$refs.etbl.doLayout();
  176. }, 0);
  177. }
  178. return;
  179. }
  180. if (index === 4) {
  181. const values = data.map(item => item[column.property]);
  182. sums[index] = `${eval(values.join('+'))} 单`;
  183. return;
  184. }
  185. sums[index] = 'N/A';
  186. });
  187. return sums;
  188. }
  189. },
  190. created() {
  191. this.dataId = this.$route.query.id || '';
  192. this.loadData();
  193. },
  194. updated() {
  195. if (!this.tblHeight) {
  196. this.tblHeight = this.$refs.tbl.tblHeight;
  197. }
  198. }
  199. };
  200. </script>
  201. <style>
  202. .member_order .badge_txt {
  203. background-color: #fff;
  204. }
  205. .member_order .badge_txt:hover {
  206. background-color: #fff !important;
  207. }
  208. .order_detail {
  209. background-color: #f6f6f6;
  210. }
  211. .order_detail:last-child {
  212. border: 0;
  213. padding: 0;
  214. margin: 0;
  215. }
  216. .order_detail_right {
  217. height: 6.25rem;
  218. }
  219. </style>