零推广批量导出

master
wyj2080 6 years ago
parent d535be186c
commit 609218ab1f

@ -17,7 +17,10 @@
"vue-router": "^3.0.1",
"view-design": "^4.1.2",
"echarts": "^4.7.0",
"v-charts": "^1.19.0"
"v-charts": "^1.19.0",
"file-saver": "^2.0.2",
"script-loader": "^0.7.2",
"xlsx": "^0.14.3"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~4.3.0",

@ -0,0 +1,179 @@
/* eslint-disable */
/* Blob.js
* A Blob implementation.
* 2014-05-27
*
* By Eli Grey, http://eligrey.com
* By Devin Samarin, https://github.com/eboyjr
* License: X11/MIT
* See LICENSE.md
*/
/*global self, unescape */
/*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true,
plusplus: true */
/*! @source http://purl.eligrey.com/github/Blob.js/blob/master/Blob.js */
(function (view) {
"use strict";
view.URL = view.URL || view.webkitURL;
if (view.Blob && view.URL) {
try {
new Blob;
return;
} catch (e) {}
}
// Internally we use a BlobBuilder implementation to base Blob off of
// in order to support older browsers that only have BlobBuilder
var BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || (function(view) {
var
get_class = function(object) {
return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
}
, FakeBlobBuilder = function BlobBuilder() {
this.data = [];
}
, FakeBlob = function Blob(data, type, encoding) {
this.data = data;
this.size = data.length;
this.type = type;
this.encoding = encoding;
}
, FBB_proto = FakeBlobBuilder.prototype
, FB_proto = FakeBlob.prototype
, FileReaderSync = view.FileReaderSync
, FileException = function(type) {
this.code = this[this.name = type];
}
, file_ex_codes = (
"NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR "
+ "NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR"
).split(" ")
, file_ex_code = file_ex_codes.length
, real_URL = view.URL || view.webkitURL || view
, real_create_object_URL = real_URL.createObjectURL
, real_revoke_object_URL = real_URL.revokeObjectURL
, URL = real_URL
, btoa = view.btoa
, atob = view.atob
, ArrayBuffer = view.ArrayBuffer
, Uint8Array = view.Uint8Array
;
FakeBlob.fake = FB_proto.fake = true;
while (file_ex_code--) {
FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1;
}
if (!real_URL.createObjectURL) {
URL = view.URL = {};
}
URL.createObjectURL = function(blob) {
var
type = blob.type
, data_URI_header
;
if (type === null) {
type = "application/octet-stream";
}
if (blob instanceof FakeBlob) {
data_URI_header = "data:" + type;
if (blob.encoding === "base64") {
return data_URI_header + ";base64," + blob.data;
} else if (blob.encoding === "URI") {
return data_URI_header + "," + decodeURIComponent(blob.data);
} if (btoa) {
return data_URI_header + ";base64," + btoa(blob.data);
} else {
return data_URI_header + "," + encodeURIComponent(blob.data);
}
} else if (real_create_object_URL) {
return real_create_object_URL.call(real_URL, blob);
}
};
URL.revokeObjectURL = function(object_URL) {
if (object_URL.substring(0, 5) !== "data:" && real_revoke_object_URL) {
real_revoke_object_URL.call(real_URL, object_URL);
}
};
FBB_proto.append = function(data/*, endings*/) {
var bb = this.data;
// decode data to a binary string
if (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) {
var
str = ""
, buf = new Uint8Array(data)
, i = 0
, buf_len = buf.length
;
for (; i < buf_len; i++) {
str += String.fromCharCode(buf[i]);
}
bb.push(str);
} else if (get_class(data) === "Blob" || get_class(data) === "File") {
if (FileReaderSync) {
var fr = new FileReaderSync;
bb.push(fr.readAsBinaryString(data));
} else {
// async FileReader won't work as BlobBuilder is sync
throw new FileException("NOT_READABLE_ERR");
}
} else if (data instanceof FakeBlob) {
if (data.encoding === "base64" && atob) {
bb.push(atob(data.data));
} else if (data.encoding === "URI") {
bb.push(decodeURIComponent(data.data));
} else if (data.encoding === "raw") {
bb.push(data.data);
}
} else {
if (typeof data !== "string") {
data += ""; // convert unsupported types to strings
}
// decode UTF-16 to binary string
bb.push(unescape(encodeURIComponent(data)));
}
};
FBB_proto.getBlob = function(type) {
if (!arguments.length) {
type = null;
}
return new FakeBlob(this.data.join(""), type, "raw");
};
FBB_proto.toString = function() {
return "[object BlobBuilder]";
};
FB_proto.slice = function(start, end, type) {
var args = arguments.length;
if (args < 3) {
type = null;
}
return new FakeBlob(
this.data.slice(start, args > 1 ? end : this.data.length)
, type
, this.encoding
);
};
FB_proto.toString = function() {
return "[object Blob]";
};
FB_proto.close = function() {
this.size = this.data.length = 0;
};
return FakeBlobBuilder;
}(view));
view.Blob = function Blob(blobParts, options) {
var type = options ? (options.type || "") : "";
var builder = new BlobBuilder();
if (blobParts) {
for (var i = 0, len = blobParts.length; i < len; i++) {
builder.append(blobParts[i]);
}
}
return builder.getBlob(type);
};
}(typeof self !== "undefined" && self || typeof window !== "undefined" && window || this.content || this));

@ -0,0 +1,151 @@
/* eslint-disable */
require('script-loader!file-saver');
require('./Blob');
require('script-loader!xlsx/dist/xlsx.core.min');
/**
* 1安装三个依赖包
  npm install -S file-saver
  npm install -S xlsx
  npm install -D script-loader
* @param table
* @returns {Array[]}
*/
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);
}
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);
}
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;
}
}
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 = {};
}
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;
}
export function export_table_to_excel(id) {
var theTable = document.getElementById(id);
console.log('a')
var oo = generateArray(theTable);
var ranges = oo[1];
/* original data */
var data = oo[0];
var ws_name = "SheetJS";
console.log(data);
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")
}
function formatJson(jsonData) {
console.log(jsonData)
}
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);
/* 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 || '列表'
saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), title + ".xlsx")
}

@ -367,6 +367,8 @@
path: '/zero/extend/detail',
query: {
userId: that.userId,
startDate: that.selectStartTime,
endDate : that.selectEndTime,
}
});
}

@ -125,7 +125,7 @@
},
//
checkBlank: function (data) {
if (!data) {
if (!data && data != 0) {
return "--";
} else {
return data;

@ -4,18 +4,25 @@
<i-col span="32">
<row>
<!--搜索状态行-->
<row class="top-10">
<row style="height: 73px;line-height: 73px;background: #F7F8FA">
<row>
<span class="left-15">选择日期</span>
<DatePicker v-model="dateRange" class="left-10" type="daterange" placement="bottom-start" split-panels placeholder="请选择日期区间" style="width: 200px" size="small"></DatePicker>
<span style="margin: 0 10px">渠道</span>
<Select filterable placeholder="请选择渠道" v-model="channelId" @on-change="channelSelect" style="width:110px" size="small">
<Option v-for="item in channelList" :value="item.id" :key="item.id">{{ item.name }}</Option>
<DatePicker v-model="dateRange" separator="至" class="left-10" type="daterange" placement="bottom-start" split-panels placeholder="请选择日期区间" style="width: 200px" size="small"></DatePicker>
<span style="margin: 0 10px">大区</span>
<Select filterable placeholder="请选择大区" v-model="regionId" @on-change="regionSelect" style="width:190px" size="small">
<Option v-for="item in regionList" :value="item.id" :key="item.id">{{ item.name }}</Option>
</Select>
<span style="margin: 0 10px">零售公司</span>
<Select filterable placeholder="请选择零售公司" v-model="orgId" @on-change="orgSelect" style="width:190px" size="small">
<Option v-for="item in orgList" :value="item.id" :key="item.id">{{ item.name }}</Option>
</Select>
<span style="margin: 0 10px">类型</span>
<Select filterable placeholder="请选择类型" v-model="orderTypeId" @on-change="orderStatusSelect" style="width:110px" size="small">
<Option v-for="item in orderTypeList" :value="item.id" :key="item.id">{{ item.name }}</Option>
<span style="margin: 0 10px">客户</span>
<Select filterable placeholder="请选择客户" v-model="customerId" style="width:190px" size="small">
<Option v-for="item in customerList" :value="item.id" :key="item.id">{{ item.name }}</Option>
</Select>
<Button type="primary" style="width: 70px;margin-left: 20px" @click="searchBtnClick" size="small">查询</Button>
<Button type="primary" style="width: 80px;margin-left: 20px;" @click="exportZeroExtend" size="small">导出数据</Button>
</row>
</row>
<!--表格数据-->
<row style="margin-top: 30px">
@ -31,7 +38,9 @@
</template>
<script>
import zeroExtend from "../services/customer/zeroExtend";
export default {
inject:['checkParamBlank'],
data() {
return {
columns1: [
@ -44,118 +53,63 @@
{
title: '店铺名称',
key: 'shopName',
align: 'center',
align: 'left',
width:'300px',
},
{
title: '店铺编码',
key: 'shopCode',
align: 'center',
align: 'left',
width:'150px',
},
{
title: '大区',
key: 'region',
align: 'center',
align: 'left',
width:'200px',
},
{
title: '零售公司',
key: 'company',
width:'120px',
align: 'center',
width:'150px',
align: 'left',
},
{
title: '客户',
key: 'customer',
align: 'center',
align: 'left',
width:'150px',
},
{
title: '推广数',
key: 'orderTimeStr',
width:'140px',
align: 'center',
},
{
title: '派单门店',
key: 'sendShopName',
align:"center",
},{
title: '派单时间',
key: 'dispatchTimeStr',
width:'140px',
align:"center",
},{
title: '接单时间',
key: 'receiveTimeStr',
width:'140px',
align:"center",
},{
title: '当前状态',
key: 'statusStr',
width:'100px',
align:"center",
},{
title: '状态更新时间',
key: 'updateTimeStr',
width:'140px',
align:"center",
},
{
title: '操作',
key: 'see',
width:'80px',
render: (h, params) => {
return h('a', {
attrs: {
id: params.row.id
},
on: {
'click': () => {
//
this.goToDetail(params.row.id);
}
}
},[
h('span', {
domProps: {
innerHTML: '查看'
}
})
]
);
}
key: 'numb',
align: 'left',
},
],
userId: JSON.parse(sessionStorage.getItem("loginInfo")).userId,
//
spinShow: false,
//data
//mainData
data1: [],
searchContent: null,
//
channelList: [],
channelId: 0,
orginAllData: [],
//
// orderStatusList: [
// {"id":0, "name":""},
// {"id":1, "name":""},
// {"id":2, "name":"退"},
// {"id":3, "name":""},
// ],
orderTypeList: [],
// orderStatusId: -1,
orderTypeId: 0,
//
startDate: null,
endDate: null,
dateRange: [],
dateRange: [this.$route.query.startDate, this.$route.query.endDate],
//list
organizationalList: [],
//list
regionList: [],
regionId: 0,
//list
orgList: [],
orgId: 0,
//list
customerList: [],
customerId: 0,
totalSize: 0,
pageNum: sessionStorage.getItem("hisOrderPageNum") == null ? 1 : Number(sessionStorage.getItem("hisOrderPageNum")),
pageNum: 1,
pageSize: 10,
}
@ -165,26 +119,6 @@
this.getMainList();
},
methods: {
ok () {
this.$Message.info('操作成功');
},
cancel () {
this.$Message.info('取消操作');
},
//
checkParamBlank: function(obj){
for(let param in obj){
obj[param] = this.checkBlank(obj[param]);
}
},
//
checkBlank: function(data){
if(!data){
return "--";
}else{
return data;
}
},
//
formartDate: function(date, format, endFlag){
if(!date){
@ -196,88 +130,148 @@
return this.$moment(date).format(format) + " 23:59:59";
}
},
//url
getChannelImgUrl: function(channelCode){
return "/static/img/channel/" + channelCode + ".jpg";
},
//
searchEnter: function(){
//
regionSelect: function(){
let regionId = this.regionId;
if(regionId === 0){
this.orgList = this.organizationalList.filter(item => item.level === 2);
}else{
this.orgList = this.organizationalList.filter(item => item.parentId === regionId && item.level === 2);
}
this.insertAllOption();
this.orgId = 0;
this.customerId = 0;
},
//
channelSelect: function(){
//
orgSelect: function(){
let orgId = this.orgId;
if(orgId === 0){
this.customerList = this.organizationalList.filter(item => item.level === 1);
}else{
this.customerList = this.organizationalList.filter(item => item.parentId === orgId && item.level === 1);
}
this.insertAllOption();
this.customerId = 0;
},
//
orderStatusSelect: function(){
//
insertAllOption: function(){
if(this.regionList.length === 0 || this.regionList[0].id !== 0){
this.regionList.splice(0,0, {"id":0, "name":"全部"});
}
if(this.orgList.length === 0 || this.orgList[0].id !== 0){
this.orgList.splice(0, 0, {"id":0, "name":"全部"});
}
if(this.customerList.length === 0 || this.customerList[0].id !== 0){
this.customerList.splice(0, 0, {"id":0, "name":"全部"});
}
},
//
searchBtnClick: function(){
this.pageNum = 1;
this.getMainList();
},
//广
exportZeroExtend: function(){
let start = this.$moment(this.dateRange[0]).format("YYYY-MM-DD");
let end = this.$moment(this.dateRange[1]).format("YYYY-MM-DD");
this.originAllData = [];
let that = this;
let request = {
userId: that.userId,
pageNum : that.pageNum,
pageSize : that.totalSize,
regionId : that.regionId === 0 ? null : that.regionId,
companyId : that.orgId === 0 ? null : that.orgId,
customerId : that.customerId === 0 ? null : that.customerId,
startTime : this.formartDate(that.startDate, "YYYY-MM-DD"),
endTime : this.formartDate(that.endDate, "YYYY-MM-DD", true),
};
zeroExtend.getMainRequest(request,function (data) {
if(data.data.code !== "0000"){
that.$Message.error("系统异常");
}
data = data.data.results;
if(data && data.length > 0){
that.totalSize = data[0].totalSize;
for(let i=0;i<data.length;i++){
let entity = data[i];
that.originAllData.push(entity);
}
require.ensure([], () => {
const { export_json_to_excel } = require('../excel/Export2Excel');
const tHeader = ['序号', '店铺名称', '店铺编码', '大区', '零售公司', '客户', '推广数'];
//
const filterVal = ['number', 'shopName', 'shopCode', 'region', 'company', 'customer', 'numb'];
//
const list = that.originAllData; //datatableDatalist
const data = that.formatJson(filterVal, list);
export_json_to_excel(tHeader, data, "0推广店铺" + start + "至" + end + "");
});
}
});
},
formatJson(filterVal, jsonData) {
return jsonData.map(v => filterVal.map(j => v[j]))
},
/**mainList数据*/
getMainList: function () {
// this.data1 = [];
// let that = this;
// let request = {
// pageNum : that.pageNum,
// pageSize : that.pageSize,
// searchContent : that.searchContent,
// channelId : that.channelId === 0 ? null : that.channelId,
// status : null,
// startDate : this.formartDate(that.startDate, "YYYY-MM-DD"),
// endDate : this.formartDate(that.endDate, "YYYY-MM-DD", true),
// type: that.orderTypeId
// };
// //
// this.spinShow = true;
// historyOrder.getMainRequest(request,function (data) {
// that.spinShow = false;
// if(data.data.code !== "0000"){
// that.$Message.error("");
// }
// data = data.data.results;
// if(data){
// for(let i=0;i<data.length;i++){
// let entity = data[i];
// that.totalSize = data[i].totalSize;
// that.data1.push(entity);
// // data[i].channelImgUrl = orderCommon.getChannelImgUlr(data[i].channelCode);
// data[i].channelImgUrl = that.getChannelImgUrl(data[i].channelCode);
// //null--
// that.checkParamBlank(entity);
// }
// }
// if(data == null || data.length == 0){
// that.totalSize = 0;
// }
// });
this.data1 = [];
let that = this;
let request = {
userId: that.userId,
pageNum : that.pageNum,
pageSize : that.pageSize,
regionId : that.regionId === 0 ? null : that.regionId,
companyId : that.orgId === 0 ? null : that.orgId,
customerId : that.customerId === 0 ? null : that.customerId,
startTime : this.formartDate(that.startDate, "YYYY-MM-DD"),
endTime : this.formartDate(that.endDate, "YYYY-MM-DD", true),
};
//
this.spinShow = true;
zeroExtend.getMainRequest(request,function (data) {
that.spinShow = false;
if(data.data.code !== "0000"){
that.$Message.error("系统异常");
}
data = data.data.results;
if(data && data.length > 0){
that.totalSize = data[0].totalSize;
for(let i=0;i<data.length;i++){
let entity = data[i];
that.data1.push(entity);
//null--
that.checkParamBlank(entity);
}
}
if(data == null || data.length === 0){
that.totalSize = 0;
}
});
},
/**基础数据渠道list策略明细list*/
/**基础数据:区域list、零售公司list、客户list*/
getSelectList:function(){
// let that = this;
// let request = {};
// sendGoodsStrategy.getSelectListRequest(request,function (data) {
// that.channelList = [];
// if(data.data.code != "0000"){
// this.$Message.error("");
// }
// data = data.data.results;
// if(data){
// that.channelList = data.channelList;
// }
// });
},
/**跳转详情页*/
goToDetail: function (id) {
this.$router.push({
path: '/history/order/detail',
query: {
orderId: id,
let that = this;
let request = {
userId: this.userId,
};
zeroExtend.getSelectListRequest(request,function (data) {
if(data.data.code !== "0000"){
that.$Message.error("系统异常");
}
data = data.data.results;
if(data){
that.organizationalList = data;
that.regionList = that.organizationalList.filter(item => item.level === 3);
that.orgList = that.organizationalList.filter(item => item.level === 2);
that.customerList = that.organizationalList.filter(item => item.level === 1);
}
//
that.insertAllOption();
});
},
//
handlePage: function (value) {
this.pageNum = value;

@ -0,0 +1,25 @@
/**
* 零推广店铺
* @author wangyinjia
* @date 2020/4/21
*/
import http from '../CommonHttp'
export function getMainRequest(params, call) {
return http.get('/customer/view/all/zero', params).then(call)
}
export function getSelectListRequest(params, call) {
return http.get('/retail/company', params).then(call)
}
export default {
//mainList
getMainRequest,
//下拉列表数据
getSelectListRequest,
}
Loading…
Cancel
Save