YY 2 éve
szülő
commit
86610cbde8

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 105 - 17100
package-lock.json


+ 0 - 6
src/router/module/system.js

@@ -47,12 +47,6 @@ export default [
     meta: { title: '自营店铺-订单管理-详细信息' },
     component: () => import(/* webpackChunkName: "system_order_detail_orderDetail" */ '@/views/system/order/detail_orderDetail.vue'),
   },
-  {
-    path: '/system/order/deliver',
-    name: 'system_order_deliver',
-    meta: { title: '自营店铺-订单管理-发货清单' },
-    component: () => import(/* webpackChunkName: "system_order_deliver" */ '@/views/system/order/deliver.vue'),
-  },
   {
     path: '/system/coupon',
     name: 'system_coupon',

+ 1 - 1
src/views/selfShop/order/index.vue

@@ -42,7 +42,7 @@ export default {
   data: function () {
     const that = this;
     return {
-      activeName: '1',
+      activeName: '2',
       // 类型列表
       statusList: [],
       // 自营店铺信息

+ 11 - 58
src/views/selfShop/order/parts/card-2.vue

@@ -2,21 +2,8 @@
   <div id="card-1">
     <el-row>
       <el-col :span="24" class="main">
-        <el-col :span="24" class="one">
-          <search-1 :form="searchForm" @onSubmit="search" @toReset="toClose"></search-1>
-        </el-col>
-        <data-table
-          :select="true"
-          :selected="selected"
-          @handleSelect="handleSelect"
-          :fields="fields"
-          :opera="opera"
-          @query="search"
-          :data="list"
-          :total="total"
-          @detail="toDetail"
-        >
-        </data-table>
+        <detail-1 v-if="num == '1'" @toDeliver="toDeliver" :statusList="statusList" :shop="shop"></detail-1>
+        <detail-2 v-else-if="num == '2'" :deliverList="list" @toBack="toBack"></detail-2>
       </el-col>
     </el-row>
   </div>
@@ -24,60 +11,26 @@
 
 <script>
 const _ = require('lodash');
-
 import { mapState, createNamespacedHelpers } from 'vuex';
-const { mapActions } = createNamespacedHelpers('orderDetail');
-
 export default {
   name: 'card-1',
   props: { statusList: { type: Array }, shop: { type: Object } },
-  components: { search1: () => import('./search-1.vue') },
+  components: { detail1: () => import('./parts/detail-1.vue'), detail2: () => import('./parts/detail-2.vue') },
   data: function () {
     return {
-      searchForm: {},
+      num: '1',
       list: [],
-      total: 0,
-      opera: [{ label: '详情', method: 'detail' }],
-      fields: [
-        { label: '订单号', model: 'no' },
-        { label: '下单时间', model: 'buy_time' },
-        { label: '顾客', model: 'customer.name' },
-        { label: '支付金额', model: 'real_pay' },
-      ],
-      // 多选值
-      selected: [],
     };
   },
-  async created() {
-    await this.search();
-  },
+  async created() {},
   methods: {
-    ...mapActions(['query', 'fetch', 'create', 'update', 'delete']),
-    // 查询
-    async search({ skip = 0, limit = 10, ...info } = {}) {
-      let condition = _.cloneDeep(this.searchForm);
-      if (condition.buy_time) {
-        condition[`buy_time@start`] = _.head(condition.buy_time);
-        condition[`buy_time@end`] = _.last(condition.buy_time);
-        delete condition.buy_time;
-      }
-      info.status = '1';
-      let res = await this.query({ skip, limit, ...condition, ...info, shop: _.get(this.shop, '_id') });
-      if (this.$checkRes(res)) {
-        this.$set(this, 'list', res.data);
-        this.$set(this, 'total', res.total);
-      }
-    },
-    toDetail({ data }) {
-      this.$router.push({ path: '/selfShop/order/detail_orderDetail', query: { id: data.id } });
-    },
-    toClose() {
-      this.searchForm = {};
-      this.search();
+    // 生成发货清单
+    toDeliver({ data }) {
+      this.$set(this, 'list', data);
+      this.$set(this, 'num', '2');
     },
-    // 多选
-    handleSelect(data) {
-      this.$emit('handleSelect');
+    toBack() {
+      this.$set(this, 'num', '1');
     },
   },
   computed: {

+ 125 - 0
src/views/selfShop/order/parts/parts/detail-1.vue

@@ -0,0 +1,125 @@
+<template>
+  <div id="card-1">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" v-if="num == '1'">
+          <el-col :span="24" class="one">
+            <search-1 :form="searchForm" @onSubmit="search" @querySearch="querySearch" @toReset="toClose" :shopList="shopList"> </search-1>
+          </el-col>
+          <el-col :span="24" class="one"> <el-button type="primary" size="mini" @click="toDeliver()">生成发货清单</el-button> </el-col>
+          <data-table
+            :select="true"
+            :selected="selected"
+            @handleSelect="handleSelect"
+            :fields="fields"
+            :opera="opera"
+            @query="search"
+            :data="list"
+            :total="total"
+            @detail="toDetail"
+          >
+          </data-table>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions } = createNamespacedHelpers('orderDetail');
+const { mapActions: shop } = createNamespacedHelpers('shop');
+export default {
+  name: 'card-1',
+  props: { statusList: { type: Array }, shop: { type: Object } },
+  components: { search1: () => import('../search-1.vue') },
+  data: function () {
+    return {
+      num: '1',
+      searchForm: {},
+      list: [],
+      total: 0,
+      opera: [{ label: '详情', method: 'detail' }],
+      fields: [
+        { label: '订单号', model: 'no' },
+        { label: '下单时间', model: 'buy_time' },
+        { label: '顾客', model: 'customer.name' },
+        { label: '店铺名称', model: 'shop.name' },
+        { label: '支付金额', model: 'real_pay' },
+      ],
+      // 多选值
+      selected: [],
+      shopList: [],
+      // 发货清单
+      deliverList: [],
+      deliver: '0',
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...shop({ shopQuery: 'query' }),
+    ...mapActions(['query', 'fetch', 'create', 'update', 'delete']),
+    // 查询
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      let condition = _.cloneDeep(this.searchForm);
+      if (condition.buy_time) {
+        condition[`buy_time@start`] = _.head(condition.buy_time);
+        condition[`buy_time@end`] = _.last(condition.buy_time);
+        delete condition.buy_time;
+      }
+      info.status = '1';
+      let res = await this.query({ skip, limit, ...condition, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, 'list', res.data);
+        this.$set(this, 'total', res.total);
+      }
+    },
+    // 详情
+    toDetail({ data }) {
+      this.$router.push({ path: '/system/order/detail_orderDetail', query: { id: data.id } });
+    },
+    toClose() {
+      this.searchForm = {};
+      this.search();
+    },
+    // 多选
+    handleSelect(data) {
+      this.$set(this, 'deliverList', data);
+    },
+    // 生成发货清单
+    toDeliver() {
+      this.$emit('toDeliver', { data: this.deliverList });
+    },
+    // 店铺名称远程查询
+    async querySearch(value) {
+      let res = await this.shopQuery({ name: value });
+      if (this.$checkRes(res)) {
+        this.$set(this, 'shopList', res.data);
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.one {
+  margin: 0 0 10px 0;
+}
+</style>

+ 97 - 40
src/views/system/order/deliver.vue

@@ -34,17 +34,17 @@
 
 <script>
 const _ = require('lodash');
+import FileSaver from 'file-saver';
+const ExcelJS = require('exceljs');
 import { mapState, mapGetters, createNamespacedHelpers } from 'vuex';
-const { mapActions } = createNamespacedHelpers('order');
 export default {
   name: 'form-1',
-  props: {},
+  props: { deliverList: { type: Array } },
   components: {},
   data: function () {
     return {
       list: [],
       fields: [
-        // { label: '订单id', model: 'order_id' },
         { label: '订单编号', model: 'order_no' },
         { label: '商品名称', model: 'goods.name' },
         { label: '商品规格', model: 'name' },
@@ -58,44 +58,44 @@ export default {
     await this.search();
   },
   methods: {
-    ...mapActions(['query', 'fetch', 'create', 'update']),
     // 查询
     async search() {
-      let data = this.data;
-      let test = _(data).groupBy('address._id').values().value();
-      let list = [];
-      for (const p1 of test) {
-        let goodsList = [];
-        for (const p2 of p1) {
-          for (const p3 of p2.goods) {
-            // p3 = (({ goods, name, buy_num }) => ({ goods, name, buy_num }))(p3);
-            delete p3.flow_money;
-            delete p3.freight;
-            delete p3.id;
-            delete p3.status;
-            delete p3._id;
-            delete p3.meta;
-            delete p3.num;
-            delete p3.sell_money;
-            delete p3.__v;
-            delete p3.tags;
-            delete p3.cart_id;
-            let good = (({ name }) => ({ name }))(p3.goods);
-            p3.goods = good;
-            p3.order_no = p2.no;
-          }
-          goodsList.push(...p2.goods);
-          let i = 0;
-          for (const p4 of goodsList) {
-            p4.index = i;
-            i++;
+      let data = this.deliverList;
+      if (data) {
+        let test = _(data).groupBy('address._id').values().value();
+        let list = [];
+        for (const p1 of test) {
+          let goodsList = [];
+          for (const p2 of p1) {
+            for (const p3 of p2.goods) {
+              // p3 = (({ goods, name, buy_num }) => ({ goods, name, buy_num }))(p3);
+              delete p3.flow_money;
+              delete p3.freight;
+              delete p3.id;
+              delete p3.status;
+              delete p3._id;
+              delete p3.meta;
+              delete p3.num;
+              delete p3.sell_money;
+              delete p3.__v;
+              delete p3.tags;
+              delete p3.cart_id;
+              let good = (({ name }) => ({ name }))(p3.goods);
+              p3.goods = good;
+              p3.order_no = p2.no;
+            }
+            goodsList.push(...p2.goods);
+            let i = 0;
+            for (const p4 of goodsList) {
+              p4.index = i;
+              i++;
+            }
           }
+          let address = (({ name, phone, province, city, area, address, _id }) => ({ name, phone, province, city, area, address, _id }))(p1[0].address);
+          list.push({ goodsList, address });
         }
-        let address = (({ name, phone, province, city, area, address }) => ({ name, phone, province, city, area, address }))(p1[0].address);
-        list.push({ goodsList, address });
+        this.$set(this, 'list', list);
       }
-      console.log(list);
-      this.$set(this, 'list', list);
     },
     handleSelect(goodsList, address) {
       let fileList = [];
@@ -114,19 +114,76 @@ export default {
               val.goodsList = goodsList;
             }
           } else {
+            // 判断this.fileList里是否有和选中的地址id相同的,不同就push到fileList里
             this.fileList.push({ goodsList, address });
           }
         }
       }
-      console.log(this.fileList);
     },
     toFile() {
-      console.log(this.fileList);
-      this.$message({ message: '导出成功', type: 'success' });
+      const workbook = new ExcelJS.Workbook();
+      let list = this.fileList;
+      for (let [index, p1] of list.entries()) {
+        let name = p1.address.name + index;
+        const worksheet = workbook.addWorksheet(name);
+        // 设置标题-start
+        // 获取单元格位置
+        let titleCell = worksheet.getCell('A1');
+        // 合并单元格
+        worksheet.mergeCells('A1:D1');
+        // 单元格内容
+        titleCell.value = '发货清单';
+        worksheet.columns.forEach(function (column, i) {
+          column.font = {
+            size: 14,
+          };
+          column.width = 38;
+          column.alignment = {
+            wrapText: true,
+            vertical: 'middle',
+            horizontal: 'left',
+          };
+        });
+        // 单元格内容样式
+        titleCell.style = {
+          alignment: {
+            vertical: 'middle',
+            horizontal: 'center',
+          },
+          font: {
+            size: 20,
+            bold: true,
+          },
+        };
+        // 设置标题-end
+        let data = [
+          ['收获人', p1.address.name],
+          ['联系电话', p1.address.phone],
+          ['收货地址', p1.address.province + p1.address.city + p1.address.area + p1.address.address],
+          ['订单号', '产品名称', '产品规格', '购买数量'],
+        ];
+        for (const p2 of p1.goodsList) {
+          let p4 = [[p2.order_no, p2.goods.name, p2.name, p2.buy_num]];
+          data.push(...p4);
+        }
+        const row = worksheet.getRow(1);
+        row.height = 40;
+        for (const val of data) {
+          worksheet.addRow(val);
+        }
+      }
+      workbook.xlsx.writeBuffer().then((buffer) => {
+        FileSaver.saveAs(
+          new Blob([buffer], {
+            type: 'application/octet-stream',
+          }),
+          `发货清单.xlsx`
+        );
+      });
     },
     // 返回
     toBack() {
-      window.history.go('-1');
+      this.$emit('toBack');
     },
   },
   computed: {

+ 1 - 15
src/views/system/order/parts/card-2.vue

@@ -5,7 +5,6 @@
         <el-col :span="24" class="one">
           <search-1 :form="searchForm" @onSubmit="search" @querySearch="querySearch" @toReset="toClose" :shopList="shopList"> </search-1>
         </el-col>
-        <el-col :span="24" class="one"> <el-button type="primary" size="mini" @click="toDeliver()">生成发货清单</el-button> </el-col>
         <data-table
           :select="true"
           :selected="selected"
@@ -49,9 +48,6 @@ export default {
       // 多选值
       selected: [],
       shopList: [],
-      // 发货清单
-      deliverList: [],
-      deliver: '0',
     };
   },
   async created() {
@@ -84,17 +80,7 @@ export default {
       this.search();
     },
     // 多选
-    handleSelect(data) {
-      this.$set(this, 'deliverList', data);
-    },
-    // 生成发货清单
-    toDeliver() {
-      // if (this.deliver == '1') {
-      this.$router.push({ path: '/system/order/deliver', query: { data: this.deliverList } });
-      // } else {
-      //   this.$message('请选择订单');
-      // }
-    },
+    handleSelect(data) {},
     // 店铺名称远程查询
     async querySearch(value) {
       let res = await this.shopQuery({ name: value });