Ver código fonte

增加导出功能

wenningning 1 ano atrás
pai
commit
dfe78b0fd5

+ 1 - 1
manager-admin/src/lang/zh.js

@@ -3,7 +3,7 @@ export default {
     dashboard: '首页',
 
     goods: '商品管理',
-    allGoodsList: '所有商品',
+    allGoodsList: '商品维护',
     goodsList: '商品列表',
     goodsEdit: '商品编辑',
 

+ 4 - 0
manager-admin/src/utils/mixin.js

@@ -95,6 +95,10 @@ export default {
     MixinUnixToDate(row, column, cellValue, index) {
       return Foundation.unixToDate(cellValue)
     },
+    /** 格式化时间戳 */
+    MixinUnixToDate2(cellValue) {
+      return Foundation.unixToDate(cellValue)
+    },
     MixinUnixToDay(row, column, cellValue, index) {
       return Foundation.unixToDate(cellValue, 'yyyy-MM-dd')
     },

+ 175 - 115
manager-admin/src/vendor/Export2Excel.js

@@ -1,142 +1,196 @@
 /* eslint-disable */
-require('script-loader!file-saver');
-require('script-loader!@/vendor/Blob');
+import { saveAs } from 'file-saver'
 import XLSX from 'xlsx'
 
 function generateArray(table) {
-    var out = [];
-    var rows = table.querySelectorAll('tr');
-    var ranges = [];
-    for (var R = 0; R < rows.length; ++R) {
-        var outRow = [];
-        var row = rows[R];
-        var columns = row.querySelectorAll('td');
-        for (var C = 0; C < columns.length; ++C) {
-            var cell = columns[C];
-            var colspan = cell.getAttribute('colspan');
-            var rowspan = cell.getAttribute('rowspan');
-            var cellValue = cell.innerText;
-            if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue;
-
-            //Skip ranges
-            ranges.forEach(function (range) {
-                if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {
-                    for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);
-                }
-            });
-
-            //Handle Row Span
-            if (rowspan || colspan) {
-                rowspan = rowspan || 1;
-                colspan = colspan || 1;
-                ranges.push({s: {r: R, c: outRow.length}, e: {r: R + rowspan - 1, c: outRow.length + colspan - 1}});
-            }
-            ;
-
-            //Handle Value
-            outRow.push(cellValue !== "" ? cellValue : null);
-
-            //Handle Colspan
-            if (colspan) for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
+  var out = [];
+  var rows = table.querySelectorAll('tr');
+  var ranges = [];
+  for (var R = 0; R < rows.length; ++R) {
+    var outRow = [];
+    var row = rows[R];
+    var columns = row.querySelectorAll('td');
+    for (var C = 0; C < columns.length; ++C) {
+      var cell = columns[C];
+      var colspan = cell.getAttribute('colspan');
+      var rowspan = cell.getAttribute('rowspan');
+      var cellValue = cell.innerText;
+      if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue;
+
+      //Skip ranges
+      ranges.forEach(function (range) {
+        if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {
+          for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);
         }
-        out.push(outRow);
+      });
+
+      //Handle Row Span
+      if (rowspan || colspan) {
+        rowspan = rowspan || 1;
+        colspan = colspan || 1;
+        ranges.push({
+          s: {
+            r: R,
+            c: outRow.length
+          },
+          e: {
+            r: R + rowspan - 1,
+            c: outRow.length + colspan - 1
+          }
+        });
+      };
+
+      //Handle Value
+      outRow.push(cellValue !== "" ? cellValue : null);
+
+      //Handle Colspan
+      if (colspan)
+        for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
     }
-    return [out, ranges];
+    out.push(outRow);
+  }
+  return [out, ranges];
 };
 
 function datenum(v, date1904) {
-    if (date1904) v += 1462;
-    var epoch = Date.parse(v);
-    return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
+  if (date1904) v += 1462;
+  var epoch = Date.parse(v);
+  return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
 }
 
 function sheet_from_array_of_arrays(data, opts) {
-    var ws = {};
-    var range = {s: {c: 10000000, r: 10000000}, e: {c: 0, r: 0}};
-    for (var R = 0; R != data.length; ++R) {
-        for (var C = 0; C != data[R].length; ++C) {
-            if (range.s.r > R) range.s.r = R;
-            if (range.s.c > C) range.s.c = C;
-            if (range.e.r < R) range.e.r = R;
-            if (range.e.c < C) range.e.c = C;
-            var cell = {v: data[R][C]};
-            if (cell.v == null) continue;
-            var cell_ref = XLSX.utils.encode_cell({c: C, r: R});
-
-            if (typeof cell.v === 'number') cell.t = 'n';
-            else if (typeof cell.v === 'boolean') cell.t = 'b';
-            else if (cell.v instanceof Date) {
-                cell.t = 'n';
-                cell.z = XLSX.SSF._table[14];
-                cell.v = datenum(cell.v);
-            }
-            else cell.t = 's';
-
-            ws[cell_ref] = cell;
-        }
+  var ws = {};
+  var range = {
+    s: {
+      c: 10000000,
+      r: 10000000
+    },
+    e: {
+      c: 0,
+      r: 0
+    }
+  };
+  for (var R = 0; R != data.length; ++R) {
+    for (var C = 0; C != data[R].length; ++C) {
+      if (range.s.r > R) range.s.r = R;
+      if (range.s.c > C) range.s.c = C;
+      if (range.e.r < R) range.e.r = R;
+      if (range.e.c < C) range.e.c = C;
+      var cell = {
+        v: data[R][C]
+      };
+      if (cell.v == null) continue;
+      var cell_ref = XLSX.utils.encode_cell({
+        c: C,
+        r: R
+      });
+
+      if (typeof cell.v === 'number') cell.t = 'n';
+      else if (typeof cell.v === 'boolean') cell.t = 'b';
+      else if (cell.v instanceof Date) {
+        cell.t = 'n';
+        cell.z = XLSX.SSF._table[14];
+        cell.v = datenum(cell.v);
+      } else cell.t = 's';
+
+      ws[cell_ref] = cell;
     }
-    if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
-    return ws;
+  }
+  if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
+  return ws;
 }
 
 function Workbook() {
-    if (!(this instanceof Workbook)) return new Workbook();
-    this.SheetNames = [];
-    this.Sheets = {};
+  if (!(this instanceof Workbook)) return new Workbook();
+  this.SheetNames = [];
+  this.Sheets = {};
 }
 
 function s2ab(s) {
-    var buf = new ArrayBuffer(s.length);
-    var view = new Uint8Array(buf);
-    for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
-    return buf;
+  var buf = new ArrayBuffer(s.length);
+  var view = new Uint8Array(buf);
+  for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
+  return buf;
 }
 
 export function export_table_to_excel(id) {
-    var theTable = document.getElementById(id);
-    var oo = generateArray(theTable);
-    var ranges = oo[1];
-
-    /* original data */
-    var data = oo[0];
-    var ws_name = "SheetJS";
-
-    var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);
-
-    /* add ranges to worksheet */
-    // ws['!cols'] = ['apple', 'banan'];
-    ws['!merges'] = ranges;
-
-    /* add worksheet to workbook */
-    wb.SheetNames.push(ws_name);
-    wb.Sheets[ws_name] = ws;
-
-    var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'});
-
-    saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), "test.xlsx")
+  var theTable = document.getElementById(id);
+  var oo = generateArray(theTable);
+  var ranges = oo[1];
+
+  /* original data */
+  var data = oo[0];
+  var ws_name = "SheetJS";
+
+  var wb = new Workbook(),
+    ws = sheet_from_array_of_arrays(data);
+
+  /* add ranges to worksheet */
+  // ws['!cols'] = ['apple', 'banan'];
+  ws['!merges'] = ranges;
+
+  /* add worksheet to workbook */
+  wb.SheetNames.push(ws_name);
+  wb.Sheets[ws_name] = ws;
+
+  var wbout = XLSX.write(wb, {
+    bookType: 'xlsx',
+    bookSST: false,
+    type: 'binary'
+  });
+
+  saveAs(new Blob([s2ab(wbout)], {
+    type: "application/octet-stream"
+  }), "Tooltip.xlsx")
 }
 
-export function export_json_to_excel(th, jsonData, defaultTitle) {
-
-    /* original data */
-
-    var data = jsonData;
-    data.unshift(th);
-    var ws_name = "SheetJS";
-
-    var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);
-
+export function export_json_to_excel({
+  multiHeader = [],
+  header,
+  data,
+  filename,
+  merges = [],
+  autoWidth = true,
+  bookType = 'xlsx'
+} = {}) {
+  /* original data */
+  filename = filename || 'excel-list'
+  data = [...data]
+  data.unshift(header);
+
+  for (let i = multiHeader.length - 1; i > -1; i--) {
+    data.unshift(multiHeader[i])
+  }
+
+  var ws_name = "SheetJS";
+  var wb = new Workbook(),
+    ws = sheet_from_array_of_arrays(data);
+
+  if (merges.length > 0) {
+    if (!ws['!merges']) ws['!merges'] = [];
+    merges.forEach(item => {
+      ws['!merges'].push(XLSX.utils.decode_range(item))
+    })
+  }
+
+  if (autoWidth) {
     /*设置worksheet每列的最大宽度*/
     const colWidth = data.map(row => row.map(val => {
       /*先判断是否为null/undefined*/
       if (val == null) {
-        return {'wch': 10};
+        return {
+          'wch': 10
+        };
       }
       /*再判断是否为中文*/
       else if (val.toString().charCodeAt(0) > 255) {
-        return {'wch': val.toString().length * 2};
+        return {
+          'wch': val.toString().length * 2
+        };
       } else {
-        return {'wch': val.toString().length};
+        return {
+          'wch': val.toString().length
+        };
       }
     }))
     /*以第一行为初始值*/
@@ -149,12 +203,18 @@ export function export_json_to_excel(th, jsonData, defaultTitle) {
       }
     }
     ws['!cols'] = result;
-
-    /* add worksheet to workbook */
-    wb.SheetNames.push(ws_name);
-    wb.Sheets[ws_name] = ws;
-
-    var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'});
-    var title = defaultTitle || 'excel-list'
-    saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), title + ".xlsx")
+  }
+
+  /* add worksheet to workbook */
+  wb.SheetNames.push(ws_name);
+  wb.Sheets[ws_name] = ws;
+
+  var wbout = XLSX.write(wb, {
+    bookType: bookType,
+    bookSST: false,
+    type: 'binary'
+  });
+  saveAs(new Blob([s2ab(wbout)], {
+    type: "application/octet-stream"
+  }), `${filename}.${bookType}`);
 }

+ 76 - 5
manager-admin/src/views/pjPromotion/list.vue

@@ -43,6 +43,7 @@
         </div>
         <div class="toolbar-btns">
           <el-button size="mini" type="primary" icon="el-icon-circle-plus-outline" @click="handleAdd">添加</el-button>
+          <el-button size="mini" type="" icon="el-icon-download" @click="exportExcel" :disabled="exportDis">导出</el-button>
         </div>
 
       </div>
@@ -70,8 +71,8 @@
         <el-table-column label="备注" prop="remark" min-width="140"></el-table-column>
         <el-table-column label="操作" width="150" fixed="right">
           <template slot-scope="scope">
-            <el-button size="mini" type="primary" @click="handlerEdit(scope.row)">编辑</el-button>
-            <el-button size="mini" type="danger" @click="handlerDelete(scope.row.id)">删除</el-button>
+            <el-button size="mini" type="primary" :disabled="!boolFounder && adminUser.uid !== scope.row.sales_id" @click="handlerEdit(scope.row)">编辑</el-button>
+            <el-button size="mini" type="danger" :disabled="!boolFounder && adminUser.uid !== scope.row.sales_id" @click="handlerDelete(scope.row.id, scope.row.sales_id)">删除</el-button>
           </template>
         </el-table-column>
       </template>
@@ -133,6 +134,7 @@
 <script>
 import * as API_PjPromotion from '@/api/pjPromotion'
 import Storage from '@/utils/storage'
+import { Foundation } from '~/ui-utils'
 
 export default {
   name: 'pjGoodsList',
@@ -168,13 +170,20 @@ export default {
       wayOptions: ['微信', '电话', '在线咨询'],
       sourceOptions: ['百度', '400', '360', '巨量(抖音、头条)', '微信', '必应', '其它'],
       fromDialog: false,
-      boolFounder: JSON.parse(Storage.getItem('admin_user')).founder === 1
+      boolFounder: false,
+      adminUser: null,
+      exportDis: false
     }
   },
   mounted() {
+    this.adminUser = JSON.parse(Storage.getItem('admin_user'))
+    this.boolFounder = this.adminUser.founder === 1
     if (!this.boolFounder) {
-      this.params.salesId = Storage.getItem('admin_uid')
+      if (this.adminUser.role_id !== 34) {
+        this.params.salesId = Storage.getItem('admin_uid')
+      }
     }
+    console.log('admin_user=====', JSON.parse(Storage.getItem('admin_user')))
     this.GET_List()
   },
   activated() {
@@ -241,6 +250,10 @@ export default {
       this.fromDialog = true
     },
     handlerEdit(row) {
+      if (!this.boolFounder && this.adminUser.uid !== row.sales_id) {
+        this.$message.warning('您没有权限操作!')
+        return
+      }
       this.myTitle = '修改推广'
       this.myForm = this.MixinClone(row)
       this.myForm.access_time = new Date(row.access_time * 1000)
@@ -273,7 +286,11 @@ export default {
       })
     },
     /** 单条数据删除处理 */
-    handlerDelete(ids) {
+    handlerDelete(ids, sales_id) {
+      if (!this.boolFounder && this.adminUser.uid !== sales_id) {
+        this.$message.warning('您没有权限操作!')
+        return
+      }
       this.$confirm('删除操作后数据不可复原,您确定要删除此数据?', '警告', {
         confirmButtonText: '确定',
         cancelButtonText: '取消',
@@ -296,6 +313,60 @@ export default {
       }).catch(() => {
         console.log('取消删除')
       })
+    },
+    exportExcel() {
+      const _this = this
+      if (!this.params.start_time) {
+        this.$message.warning('请选择时间区间!')
+        return
+      }
+      this.$confirm('将导出Excel文件,是否继续?', '提示', {
+        type: 'warning'
+      }).then(() => {
+        _this.exportDis = true
+        _this.loading = false
+        const params = _this.MixinClone(_this.params)
+        params.page_size = _this.tableData.data_total
+        params.page_no = 1
+        console.log('params====', params)
+        API_PjPromotion.getList(params).then(res => {
+          _this.loading = false
+          import('@/vendor/Export2Excel').then(excel => {
+            let tHeader = ['销售', '访问时间', '地域', '电话', '方式', '来源', '搜索词', '是否有效', '备注'] // 表头
+            let filterVal = ['sales', 'access_time', 'region', 'phone', 'way', 'source', 'search_term', 'bool_enabled', 'remark']
+            const tit = _this.formartDate(params.start_time) + '至' + _this.formartDate(params.end_time) + '推广记录'
+            const data = _this.formatJson(filterVal,  res.data)
+            excel.export_json_to_excel({
+              header: tHeader,
+              data,
+              filename: tit,
+              autoWidth: true
+            })
+            _this.exportDis = false
+          }).catch(e => {
+            console.log('e===', e)
+            _this.exportDis = false
+          })
+        }).catch(() => (this.loading = false))
+      })
+    },
+    formatJson(filterVal, jsonData) {
+      return jsonData.map(v => filterVal.map(j => {
+        if (j === 'access_time') {
+          return this.MixinUnixToDate2(v[j])
+        } else if (j === 'bool_enabled') {
+          if (v[j]) {
+            return '有效'
+          } else {
+            return '无效'
+          }
+        } else {
+          return v[j]
+        }
+      }))
+    },
+    formartDate(value) {
+      return Foundation.unixToDate(value, 'yyyy-MM-dd')
     }
   }
 }