提交 cfc0faf3 authored 作者: 钟是志's avatar 钟是志

4023 医保--参保通知批量下载功能优化

上级 3f5508dd
...@@ -5,41 +5,40 @@ import { getToken } from '@/webPublic/one_stop_public/utils/token'; ...@@ -5,41 +5,40 @@ import { getToken } from '@/webPublic/one_stop_public/utils/token';
import { deepCopy } from '@/webPublic/zyd_public/utils/utils'; import { deepCopy } from '@/webPublic/zyd_public/utils/utils';
import { getTransformApi } from '@/webPublic/one_stop_public/2022beidianke/localstorageTransform'; import { getTransformApi } from '@/webPublic/one_stop_public/2022beidianke/localstorageTransform';
import moment from 'moment'; import moment from 'moment';
import { import { getSassApiHeader } from '@/webPublic/one_stop_public/2023yunshangguizhou/utils';
getSassApiHeader, import { showDownloadProgressFromFileName } from "./utils";
} from '@/webPublic/one_stop_public/2023yunshangguizhou/utils';
const apiUrl = queryOauthActionPath(); const apiUrl = queryOauthActionPath();
export { apiUrl }; export { apiUrl };
const exportStyles = { const exportStyles = {
header: { header: {
font: { font: {
bold: false, bold: false,
fontHeightInPoints: 12, fontHeightInPoints: 12,
}, },
alignment: 'CENTER', alignment: 'CENTER',
borderLeft: 'THIN', borderLeft: 'THIN',
borderTop: 'THIN', borderTop: 'THIN',
borderBottom: 'THIN', borderBottom: 'THIN',
borderRight: 'THIN', borderRight: 'THIN',
verticalAlignment: 'CENTER', //TOP、CENTER、BOTTOM、JUSTIFY、DISTRIBUTED verticalAlignment: 'CENTER', //TOP、CENTER、BOTTOM、JUSTIFY、DISTRIBUTED
wrapText: true, wrapText: true,
rowHeights: 20, rowHeights: 20,
colWidths: 250, colWidths: 250,
}, },
head: { head: {
font: { font: {
bold: true, bold: true,
}, },
alignment: 'CENTER', alignment: 'CENTER',
}, },
}; };
const uj = { const uj = {
t: 1, t: 1,
v: '序号', v: '序号',
s: 'header', s: 'header',
w: 20 //默认值是20像素 w: 20, //默认值是20像素
}; };
/** /**
* 公共函数代码 * 公共函数代码
...@@ -57,140 +56,149 @@ const uj = { ...@@ -57,140 +56,149 @@ const uj = {
* rowSpanData 列合并数据,colSpanData行合并数据 * rowSpanData 列合并数据,colSpanData行合并数据
* */ * */
export function getSpanJson({ export function getSpanJson({
mergeKey = [], mergeKey = [],
data, data,
eliminateRow = [], eliminateRow = [],
eliminateCol = [], eliminateCol = [],
mergePrimaryRow, mergePrimaryRow,
mergeMappingRow = {} // 某一列的合并数据 复制 到任意其他列 mergeMappingRow = {}, // 某一列的合并数据 复制 到任意其他列
}) { }) {
const dataList = deepCopy(data);
const dataList = deepCopy(data); let rowSpanData,
let rowSpanData, colSpanData = null; colSpanData = null;
try { try {
rowSpanData = getRowSpanJson(mergeKey, dataList, eliminateRow, mergePrimaryRow); rowSpanData = getRowSpanJson(mergeKey, dataList, eliminateRow, mergePrimaryRow);
} catch (err) { } catch (err) {
console.table("rowSpanData", err); console.table('rowSpanData', err);
} }
try { try {
colSpanData = getColSpanJson(mergeKey, dataList, eliminateCol); colSpanData = getColSpanJson(mergeKey, dataList, eliminateCol);
} catch (err) { } catch (err) {
console.table("colSpanData", err); console.table('colSpanData', err);
} }
try { try {
const newMergeMappingRow = Object.keys(mergeMappingRow).filter(item1 => mergeKey.some(item2 => item2 === item1)); const newMergeMappingRow = Object.keys(mergeMappingRow).filter((item1) =>
newMergeMappingRow.map((item) => { mergeKey.some((item2) => item2 === item1),
const mappingList = mergeMappingRow[item].filter(item1 => !mergeKey.some(item2 => item2 === item1)); );
mappingList.map((mItem) => { newMergeMappingRow.map((item) => {
rowSpanData[mItem] = rowSpanData[item]; const mappingList = mergeMappingRow[item].filter(
}); (item1) => !mergeKey.some((item2) => item2 === item1),
}); );
} catch (e) { mappingList.map((mItem) => {
console.table("mergeMappingRow", e); rowSpanData[mItem] = rowSpanData[item];
} });
return { });
rowSpanData, } catch (e) {
colSpanData, console.table('mergeMappingRow', e);
}; }
return {
rowSpanData,
colSpanData,
};
} }
function getRowSpanJson(cloumnNames, data, eliminateStr = [], mergePrimaryRow) { function getRowSpanJson(cloumnNames, data, eliminateStr = [], mergePrimaryRow) {
data = deepCopy(data); data = deepCopy(data);
//纵向合并 //纵向合并
// 获取列的 dataIndex 集合 // 获取列的 dataIndex 集合
var rowSpanJson = {}; var rowSpanJson = {};
//保存上一个name //保存上一个name
var beforeNameMap = {}; var beforeNameMap = {};
//相同name出现的次数 //相同name出现的次数
var countMap = {}; var countMap = {};
//该name第一次出现的位置 //该name第一次出现的位置
var startIndexMap = {}; var startIndexMap = {};
// 是否主键模式 // 是否主键模式
var isPrimary = false; var isPrimary = false;
for (var idx = 0; idx < data.length; idx++) { // 循环数据 for (var idx = 0; idx < data.length; idx++) {
var dataItem = data[idx]; // 循环数据
var dataItemRowValue; var dataItem = data[idx];
var dataItemPreviousRowValue; var dataItemRowValue;
if (mergePrimaryRow) { var dataItemPreviousRowValue;
isPrimary = true;//开启主键模式 if (mergePrimaryRow) {
dataItemRowValue = dataItem[mergePrimaryRow]; isPrimary = true; //开启主键模式
dataItemPreviousRowValue = data[idx - 1 > 0 ? idx - 1 : 0][mergePrimaryRow]; dataItemRowValue = dataItem[mergePrimaryRow];
} dataItemPreviousRowValue = data[idx - 1 > 0 ? idx - 1 : 0][mergePrimaryRow];
for (var idj = 0; idj < cloumnNames.length; idj++) { // 循环表头 }
var keyItem = cloumnNames[idj]; for (var idj = 0; idj < cloumnNames.length; idj++) {
var dataItemValue = dataItem[keyItem]; // 循环表头
if (idx === 0) { var keyItem = cloumnNames[idj];
beforeNameMap[keyItem] = dataItemValue; var dataItemValue = dataItem[keyItem];
countMap[keyItem] = 1; if (idx === 0) {
startIndexMap[keyItem] = 0; beforeNameMap[keyItem] = dataItemValue;
rowSpanJson[keyItem] = new Array(data.length); countMap[keyItem] = 1;
rowSpanJson[keyItem][0] = 1; startIndexMap[keyItem] = 0;
continue; rowSpanJson[keyItem] = new Array(data.length);
} rowSpanJson[keyItem][0] = 1;
if ( continue;
(!isPrimary ? (dataItemValue === beforeNameMap[keyItem]) : (dataItemRowValue + dataItemValue === dataItemPreviousRowValue + beforeNameMap[keyItem])) // 与上一个值一致时 }
&& eliminateStr.indexOf(dataItemValue) === -1 // 排除特定的值合并 if (
) { (!isPrimary
countMap[keyItem] = countMap[keyItem] + 1; ? dataItemValue === beforeNameMap[keyItem]
rowSpanJson[keyItem][startIndexMap[keyItem]] = countMap[keyItem]; : dataItemRowValue + dataItemValue ===
rowSpanJson[keyItem][idx] = 0; dataItemPreviousRowValue + beforeNameMap[keyItem]) && // 与上一个值一致时
} else { eliminateStr.indexOf(dataItemValue) === -1 // 排除特定的值合并
countMap[keyItem] = 1; ) {
beforeNameMap[keyItem] = dataItemValue; countMap[keyItem] = countMap[keyItem] + 1;
startIndexMap[keyItem] = idx; rowSpanJson[keyItem][startIndexMap[keyItem]] = countMap[keyItem];
rowSpanJson[keyItem][idx] = 1; rowSpanJson[keyItem][idx] = 0;
} } else {
} countMap[keyItem] = 1;
} beforeNameMap[keyItem] = dataItemValue;
return rowSpanJson; startIndexMap[keyItem] = idx;
rowSpanJson[keyItem][idx] = 1;
}
}
}
return rowSpanJson;
} }
function getColSpanJson(cloumnNames, data, eliminateStr = []) { function getColSpanJson(cloumnNames, data, eliminateStr = []) {
data = deepCopy(data); data = deepCopy(data);
//横向合并 //横向合并
var colSpanJson = {}; var colSpanJson = {};
for (let idx = 0; idx < data.length; idx++) { for (let idx = 0; idx < data.length; idx++) {
let dataItem = data[idx]; let dataItem = data[idx];
let colSum = 1; //宽度 let colSum = 1; //宽度
let triggerColIndex = null; //记录触发时得位置 let triggerColIndex = null; //记录触发时得位置
let triggerColSum = 1; //记录触发时得位置 let triggerColSum = 1; //记录触发时得位置
let isCol = false; let isCol = false;
for (let idj = 0; idj < cloumnNames.length; idj++) { for (let idj = 0; idj < cloumnNames.length; idj++) {
let keyItem = cloumnNames[idj]; let keyItem = cloumnNames[idj];
let dataItemValue = dataItem[keyItem]; let dataItemValue = dataItem[keyItem];
let dataItemValueNext = idj < cloumnNames.length - 1 ? dataItem[cloumnNames[idj + 1]] : null; let dataItemValueNext = idj < cloumnNames.length - 1 ? dataItem[cloumnNames[idj + 1]] : null;
if (idx === 0) { if (idx === 0) {
colSpanJson[keyItem] = new Array(data.length); colSpanJson[keyItem] = new Array(data.length);
} }
if ( if (
!isCol && !isCol &&
dataItemValue === dataItemValueNext && dataItemValue === dataItemValueNext &&
eliminateStr.indexOf(dataItemValue) === -1 eliminateStr.indexOf(dataItemValue) === -1
) { ) {
//触发合并 //触发合并
triggerColIndex = keyItem; triggerColIndex = keyItem;
isCol = true; isCol = true;
} }
if (isCol && (dataItemValue !== dataItemValueNext || dataItemValueNext == null)) { if (isCol && (dataItemValue !== dataItemValueNext || dataItemValueNext == null)) {
//合并结束 //合并结束
isCol = false; isCol = false;
} }
if (isCol) { if (isCol) {
//计数 //计数
triggerColSum++; triggerColSum++;
} }
if (!isCol && triggerColIndex !== null) { if (!isCol && triggerColIndex !== null) {
colSpanJson[triggerColIndex][idx] = triggerColSum; colSpanJson[triggerColIndex][idx] = triggerColSum;
colSpanJson[keyItem][idx] = 0; colSpanJson[keyItem][idx] = 0;
triggerColIndex = null; triggerColIndex = null;
} else if (isCol && triggerColIndex !== null) { } else if (isCol && triggerColIndex !== null) {
colSpanJson[keyItem][idx] = 0; colSpanJson[keyItem][idx] = 0;
} else { } else {
colSpanJson[keyItem][idx] = colSum; colSpanJson[keyItem][idx] = colSum;
} }
} }
} }
return colSpanJson; return colSpanJson;
} }
/** /**
...@@ -204,107 +212,100 @@ function getColSpanJson(cloumnNames, data, eliminateStr = []) { ...@@ -204,107 +212,100 @@ function getColSpanJson(cloumnNames, data, eliminateStr = []) {
* columnsHeight 行数 * columnsHeight 行数
* */ * */
export function getColumns(columns) { export function getColumns(columns) {
columns = deepCopy(columns); columns = deepCopy(columns);
let columnsHeight = getColumnsMaxLevel(columns); //递归行数 let columnsHeight = getColumnsMaxLevel(columns); //递归行数
let columnsKey = []; let columnsKey = [];
const columnsList = new Array(columnsHeight).fill([]); const columnsList = new Array(columnsHeight).fill([]);
let col = 1; let col = 1;
for (var i in columnsList) { for (var i in columnsList) {
columnsList[i] = new Array(getColumnsWidth(columns)).fill({}); columnsList[i] = new Array(getColumnsWidth(columns)).fill({});
} }
function getColumnsDatas(data = [], res = [], level = 1) {
try {
for (let item of data) {
//item.key = i;
let isLast = !item.children;
item.level = level;
item.isLast = isLast;
item.width = !isLast ? getColumnsWidth(item.children) : 1;
item.col = col;
res.push(item);
columnsList[level - 1][col - 1] = {
...uj,
v: item.title,
};
if (!isLast) {
if (Array.isArray(item.children)) {
let x = level + 1;
getColumnsDatas(item.children, res, x);
}
} else {
col++;
columnsKey.push(item['dataIndex']);
}
}
return res;
} catch (e) {
console.table("getColumnsDatas", e);
return [];
}
}
//递归行数 function getColumnsDatas(data = [], res = [], level = 1) {
function getColumnsMaxLevel(arr = []) { try {
//递归计算树形数据最大的层级数 for (let item of data) {
let maxLevel = 0; //item.key = i;
(function multiArr(arr, level = 0) { let isLast = !item.children;
++level; item.level = level;
maxLevel = Math.max(level, maxLevel); item.isLast = isLast;
for (let i = 0; i < arr.length; i++) { item.width = !isLast ? getColumnsWidth(item.children) : 1;
let item = arr[i]; item.col = col;
item.level = level; res.push(item);
if (item.children && item.children.length > 0) { columnsList[level - 1][col - 1] = {
multiArr(item.children, level); ...uj,
} else { v: item.title,
delete item.children; };
} if (!isLast) {
} if (Array.isArray(item.children)) {
})(arr, 0); let x = level + 1;
return maxLevel; getColumnsDatas(item.children, res, x);
} }
} else {
col++;
columnsKey.push(item['dataIndex']);
}
}
return res;
} catch (e) {
console.table('getColumnsDatas', e);
return [];
}
}
//递归行数
function getColumnsMaxLevel(arr = []) {
//递归计算树形数据最大的层级数
let maxLevel = 0;
(function multiArr(arr, level = 0) {
++level;
maxLevel = Math.max(level, maxLevel);
for (let i = 0; i < arr.length; i++) {
let item = arr[i];
item.level = level;
if (item.children && item.children.length > 0) {
multiArr(item.children, level);
} else {
delete item.children;
}
}
})(arr, 0);
return maxLevel;
}
//递归当前数据宽度 //递归当前数据宽度
function getColumnsWidth(data = [], sum = 0) { function getColumnsWidth(data = [], sum = 0) {
for (let item of data) { for (let item of data) {
if (!item.children) { if (!item.children) {
sum++; sum++;
} else { } else {
sum = getColumnsWidth(item.children, sum); sum = getColumnsWidth(item.children, sum);
} }
} }
return sum; return sum;
} }
let columnsHandle = getColumnsDatas(columns) let columnsHandle = getColumnsDatas(columns).filter((v, i) => {
.filter((v, i) => { return (v.level < columnsHeight && v.isLast) || v.width > 1;
return (v.level < columnsHeight && v.isLast) || v.width > 1; });
}); let columnsMerges = [];
let columnsMerges = []; columnsHandle.forEach((v, i) => {
columnsHandle.forEach((v, i) => { let { isLast, width, col, level } = v;
let { let nowCol = col - 1;
isLast, let nowLevel = level - 1;
width, if (isLast && width === 1) {
col, //合并表格的 开始行、结束行、开始列、结束列
level columnsMerges.push([nowLevel, columnsHeight - 1, nowCol, nowCol]);
} = v; }
let nowCol = col - 1; if (!isLast && width > 1) {
let nowLevel = level - 1; columnsMerges.push([nowLevel, nowLevel, nowCol, nowCol + width - 1]);
if (isLast && width === 1) { }
//合并表格的 开始行、结束行、开始列、结束列 });
columnsMerges.push([nowLevel, columnsHeight - 1, nowCol, nowCol]); return {
} columnsList,
if (!isLast && width > 1) { columnsMerges,
columnsMerges.push([nowLevel, nowLevel, nowCol, nowCol + width - 1]); columnsKey,
} columnsHeight,
}); };
return {
columnsList,
columnsMerges,
columnsKey,
columnsHeight,
};
} }
/** /**
...@@ -319,61 +320,56 @@ export function getColumns(columns) { ...@@ -319,61 +320,56 @@ export function getColumns(columns) {
* url : 接口地址 * url : 接口地址
*/ */
export function getColumnsSqlKeyRealize({ export function getColumnsSqlKeyRealize({
sqlKey, sqlKey,
columns, columns,
styles, styles,
fileName = '导出文件', fileName = '导出文件',
ext = 'xlsx', ext = 'xlsx',
allValues = JSON.stringify({}) allValues = JSON.stringify({}),
}) { }) {
columns = deepCopy(columns); columns = deepCopy(columns);
let { let { columnsList, columnsMerges, columnsKey } = getColumns(columns);
columnsList,
columnsMerges,
columnsKey
} = getColumns(columns);
let content = { let content = {
sheets: [ sheets: [
{ {
name: fileName, name: fileName,
cells: columnsList, cells: columnsList,
merges: columnsMerges, merges: columnsMerges,
sqlKey: sqlKey, //sql编码 sqlKey: sqlKey, //sql编码
sqlKeyHeader: columnsKey, //sql对应key对应列 sqlKeyHeader: columnsKey, //sql对应key对应列
}, },
], ],
styles: exportStyles styles: exportStyles,
}; };
if (styles) { if (styles) {
content.styles = styles; content.styles = styles;
} }
try { try {
let getFileData = giveFilePostDataInfoForTrue( let getFileData = giveFilePostDataInfoForTrue(
{ {
content: JSON.stringify(content), content: JSON.stringify(content),
title: fileName, title: fileName,
allValues: allValues allValues: allValues,
}, },
`${apiUrl + '/DataObjApi/exportCustom'}`, `${apiUrl + '/DataObjApi/exportCustom'}`,
); );
let token = getToken(); let token = getToken();
downloadFile( downloadFile(
getFileData.url, getFileData.url,
{ {
...getFileData.datas, ...getFileData.datas,
token: token, token: token,
}, },
fileName, fileName,
ext, ext,
); );
} catch (err) { } catch (err) {
console.table("getColumnsSqlKeyRealize", err); console.table('getColumnsSqlKeyRealize', err);
} }
} }
/** /**
* *
* @param {sqlKey,columnsList,columnsMerges,columnsKey,styles,fileName,ext,allValues} param * @param {sqlKey,columnsList,columnsMerges,columnsKey,styles,fileName,ext,allValues} param
...@@ -388,52 +384,52 @@ export function getColumnsSqlKeyRealize({ ...@@ -388,52 +384,52 @@ export function getColumnsSqlKeyRealize({
* url : 接口地址 * url : 接口地址
*/ */
export function getCustomSqlKeyRealize({ export function getCustomSqlKeyRealize({
sqlKey, sqlKey,
columnsList, columnsList,
columnsMerges, columnsMerges,
columnsKey, columnsKey,
styles, styles,
fileName = '导出文件', fileName = '导出文件',
ext = 'xlsx', ext = 'xlsx',
allValues = JSON.stringify({}) allValues = JSON.stringify({}),
}) { }) {
let content = { let content = {
sheets: [ sheets: [
{ {
name: fileName, name: fileName,
cells: columnsList, cells: columnsList,
merges: columnsMerges, merges: columnsMerges,
sqlKey: sqlKey, //sql编码 sqlKey: sqlKey, //sql编码
sqlKeyHeader: columnsKey, //sql对应key对应列 sqlKeyHeader: columnsKey, //sql对应key对应列
}, },
], ],
styles: exportStyles styles: exportStyles,
}; };
if (styles) { if (styles) {
content.styles = styles; content.styles = styles;
} }
try { try {
let getFileData = giveFilePostDataInfoForTrue( let getFileData = giveFilePostDataInfoForTrue(
{ {
content: JSON.stringify(content), content: JSON.stringify(content),
title: fileName, title: fileName,
allValues: allValues allValues: allValues,
}, },
`${apiUrl + '/DataObjApi/exportCustom'}`, `${apiUrl + '/DataObjApi/exportCustom'}`,
); );
let token = getToken(); let token = getToken();
downloadFile( downloadFile(
getFileData.url, getFileData.url,
{ {
...getFileData.datas, ...getFileData.datas,
token: token, token: token,
}, },
fileName, fileName,
ext, ext,
); );
} catch (err) { } catch (err) {
console.table("getCustomSqlKeyRealize", err); console.table('getCustomSqlKeyRealize', err);
} }
} }
/** /**
...@@ -452,60 +448,58 @@ export function getCustomSqlKeyRealize({ ...@@ -452,60 +448,58 @@ export function getCustomSqlKeyRealize({
* *
*/ */
export function getColumnsDataRealize({ export function getColumnsDataRealize({
data = [], data = [],
mergeKey = [], mergeKey = [],
columns, columns,
styles, styles,
defect = null, defect = null,
fileName = '导出文件', fileName = '导出文件',
ext = 'xlsx', ext = 'xlsx',
eliminateRow = [], eliminateRow = [],
eliminateCol = [], eliminateCol = [],
mergeMappingRow = {},// *映射mergeKey 纵向合并结果,key必须在mergeKey数组里面 mergeMappingRow = {}, // *映射mergeKey 纵向合并结果,key必须在mergeKey数组里面
mergePrimaryRow,// 所有合并都会在当前mergePrimary 的范围下合并 mergePrimaryRow, // 所有合并都会在当前mergePrimary 的范围下合并
}) { }) {
let content = getColumnsData({ let content = getColumnsData({
data, data,
mergeKey, mergeKey,
columns, columns,
styles, styles,
defect, defect,
fileName, fileName,
ext, ext,
eliminateRow, eliminateRow,
eliminateCol, eliminateCol,
mergeMappingRow,// *映射mergeKey 纵向合并结果,key必须在mergeKey数组里面 mergeMappingRow, // *映射mergeKey 纵向合并结果,key必须在mergeKey数组里面
mergePrimaryRow,// 所有合并都会在当前mergePrimary 的范围下合并 mergePrimaryRow, // 所有合并都会在当前mergePrimary 的范围下合并
}); });
if (styles) { if (styles) {
content.styles = styles; content.styles = styles;
} }
try {
let getFileData = giveFilePostDataInfoForTrue(
{
content: JSON.stringify(content),
title: fileName,
},
`${apiUrl + '/DataObjApi/exportCustom'}`,
);
let token = getToken();
downloadFile(
getFileData.url,
{
...getFileData.datas,
token: token,
},
fileName,
ext,
);
} catch (err) {
console.table("getColumnsDataRealize", err);
}
try {
let getFileData = giveFilePostDataInfoForTrue(
{
content: JSON.stringify(content),
title: fileName,
},
`${apiUrl + '/DataObjApi/exportCustom'}`,
);
let token = getToken();
downloadFile(
getFileData.url,
{
...getFileData.datas,
token: token,
},
fileName,
ext,
);
} catch (err) {
console.table('getColumnsDataRealize', err);
}
} }
/** /**
* *
* @param {data,columns,styles,defect,fileName,ext,url,eliminateRow,eliminateCol} param * @param {data,columns,styles,defect,fileName,ext,url,eliminateRow,eliminateCol} param
...@@ -522,61 +516,60 @@ export function getColumnsDataRealize({ ...@@ -522,61 +516,60 @@ export function getColumnsDataRealize({
* *
*/ */
export function getCustomDataRealize({ export function getCustomDataRealize({
data = [], data = [],
mergeKey = [], mergeKey = [],
columnsList = [], columnsList = [],
columnsMerges = [], columnsMerges = [],
columnsKey = [], columnsKey = [],
bottomList = [], bottomList = [],
bottomMerges = [], bottomMerges = [],
styles, styles,
defect = null, defect = null,
fileName = '导出文件', fileName = '导出文件',
ext = 'xlsx', ext = 'xlsx',
eliminateRow = [], eliminateRow = [],
eliminateCol = [], eliminateCol = [],
}) { }) {
let content = getCustomData({ let content = getCustomData({
data, data,
mergeKey, mergeKey,
columnsList, columnsList,
columnsMerges, columnsMerges,
columnsKey, columnsKey,
bottomList, bottomList,
bottomMerges, bottomMerges,
styles, styles,
defect, defect,
fileName, fileName,
ext, ext,
eliminateRow, eliminateRow,
eliminateCol, eliminateCol,
}); });
if (styles) { if (styles) {
content.styles = styles; content.styles = styles;
} }
try {
let getFileData = giveFilePostDataInfoForTrue(
{
content: JSON.stringify(content),
title: fileName,
},
`${apiUrl + '/DataObjApi/exportCustom'}`,
);
let token = getToken();
downloadFile(
getFileData.url,
{
...getFileData.datas,
token: token,
},
fileName,
ext,
);
} catch (err) {
console.table("getCustomDataRealize", err);
}
try {
let getFileData = giveFilePostDataInfoForTrue(
{
content: JSON.stringify(content),
title: fileName,
},
`${apiUrl + '/DataObjApi/exportCustom'}`,
);
let token = getToken();
downloadFile(
getFileData.url,
{
...getFileData.datas,
token: token,
},
fileName,
ext,
);
} catch (err) {
console.table('getCustomDataRealize', err);
}
} }
/** /**
* *
...@@ -596,105 +589,100 @@ export function getCustomDataRealize({ ...@@ -596,105 +589,100 @@ export function getCustomDataRealize({
* *
*/ */
export function getColumnsData({ export function getColumnsData({
data = [], data = [],
mergeKey = [], mergeKey = [],
columns, columns,
styles, styles,
defect = null, defect = null,
fileName = '导出文件', fileName = '导出文件',
ext = 'xlsx', ext = 'xlsx',
eliminateRow = [], eliminateRow = [],
eliminateCol = [], eliminateCol = [],
docxSheet = {}, docxSheet = {},
mergeMappingRow = {},// *映射mergeKey 纵向合并结果,key必须在mergeKey数组里面 mergeMappingRow = {}, // *映射mergeKey 纵向合并结果,key必须在mergeKey数组里面
mergePrimaryRow,// 所有合并都会在当前mergePrimary 的范围下合并 mergePrimaryRow, // 所有合并都会在当前mergePrimary 的范围下合并
}) { }) {
columns = deepCopy(columns); columns = deepCopy(columns);
data = deepCopy(data); data = deepCopy(data);
let { let { columnsList, columnsMerges, columnsKey, columnsHeight } = getColumns(columns);
columnsList, let { colSpanData, rowSpanData } = getSpanJson({
columnsMerges, mergeKey,
columnsKey, data,
columnsHeight eliminateRow,
} = getColumns(columns); eliminateCol,
let { mergeMappingRow,
colSpanData, mergePrimaryRow,
rowSpanData });
} = getSpanJson({ // 处理数据
mergeKey, let bodyData = [];
data, let dataMerges = [];
eliminateRow, try {
eliminateCol, data.forEach((dv, di) => {
mergeMappingRow, let nowArroy = new Array(columnsKey.length).fill({});
mergePrimaryRow columnsKey.forEach((av, ai) => {
}); nowArroy[ai] = {
// 处理数据 ...uj,
let bodyData = []; v: av in dv && dv[av] != null ? dv[av].toString() : defect || '',
let dataMerges = []; };
try { });
data.forEach((dv, di) => { bodyData.push(nowArroy);
let nowArroy = new Array(columnsKey.length).fill({}); });
columnsKey.forEach((av, ai) => { // 处理合并数据
nowArroy[ai] = { let newMergeKey = mergeKey;
...uj, try {
v: av in dv && dv[av] != null ? dv[av].toString() : defect || '', const newMergeMappingRow = Object.keys(mergeMappingRow).filter((item1) =>
}; mergeKey.some((item2) => item2 === item1),
}); );
bodyData.push(nowArroy); newMergeMappingRow.map((item) => {
}); const mappingList = mergeMappingRow[item].filter(
// 处理合并数据 (item1) => !mergeKey.some((item2) => item2 === item1),
let newMergeKey = mergeKey; );
try { newMergeKey = [...newMergeKey, ...mappingList];
const newMergeMappingRow = Object.keys(mergeMappingRow).filter(item1 => mergeKey.some(item2 => item2 === item1)); });
newMergeMappingRow.map((item) => { } catch (e) {
const mappingList = mergeMappingRow[item].filter(item1 => !mergeKey.some(item2 => item2 === item1)); console.table('newMergeKey', e);
newMergeKey = [...newMergeKey, ...mappingList]; }
}); Object.keys(rowSpanData).forEach((mv) => {
} catch (e) { rowSpanData[mv].forEach((cv, ci) => {
console.table("newMergeKey", e); if (cv > 1) {
} //合并表格的 开始行、结束行、开始列、结束列
Object.keys(rowSpanData).forEach((mv) => { let rowIndex = columnsKey.indexOf(mv);
rowSpanData[mv].forEach((cv, ci) => { dataMerges.push([columnsHeight + ci, columnsHeight + ci + cv - 1, rowIndex, rowIndex]);
if (cv > 1) { }
//合并表格的 开始行、结束行、开始列、结束列 });
let rowIndex = columnsKey.indexOf(mv); });
dataMerges.push([columnsHeight + ci, columnsHeight + ci + cv - 1, rowIndex, rowIndex]); Object.keys(colSpanData).forEach((mv) => {
} colSpanData[mv].forEach((cv, ci) => {
}); if (cv > 1) {
}) //合并表格的 开始行、结束行、开始列、结束列
Object.keys(colSpanData).forEach((mv) => { let rowIndex = columnsKey.indexOf(mv);
colSpanData[mv].forEach((cv, ci) => { dataMerges.push([columnsHeight + ci, columnsHeight + ci, rowIndex, rowIndex + cv - 1]);
if (cv > 1) { }
//合并表格的 开始行、结束行、开始列、结束列 });
let rowIndex = columnsKey.indexOf(mv); });
dataMerges.push([columnsHeight + ci, columnsHeight + ci, rowIndex, rowIndex + cv - 1]); } catch (err) {
} console.table('getColumnsData', err);
}); }
}) let content = {
} catch (err) { sheets: [
console.table("getColumnsData", err); {
} name: fileName,
let content = { cells: [...columnsList, ...bodyData],
sheets: [ merges: [...columnsMerges, ...dataMerges],
{ },
name: fileName, ],
cells: [...columnsList, ...bodyData], styles: exportStyles,
merges: [...columnsMerges, ...dataMerges], };
}, if (ext === 'docx') {
], content.sheets[0] = {
styles: exportStyles ...content.sheets[0],
}; ...docxSheet,
if (ext === "docx") { };
content.sheets[0] = { }
...content.sheets[0], if (styles) {
...docxSheet content.styles = styles;
} }
} return content;
if (styles) {
content.styles = styles;
}
return content
} }
/** /**
...@@ -713,155 +701,159 @@ export function getColumnsData({ ...@@ -713,155 +701,159 @@ export function getColumnsData({
* *
*/ */
export function getCustomData({ export function getCustomData({
data = [], data = [],
mergeKey = [], mergeKey = [],
columnsList = [], columnsList = [],
columnsMerges = [], columnsMerges = [],
columnsKey = [], columnsKey = [],
bottomList = [], bottomList = [],
bottomMerges = [], bottomMerges = [],
styles, styles,
defect = null, defect = null,
fileName = '导出文件', fileName = '导出文件',
ext = 'xlsx', ext = 'xlsx',
eliminateRow = [], eliminateRow = [],
eliminateCol = [], eliminateCol = [],
docxSheet = {}, docxSheet = {},
}) { }) {
data = deepCopy(data); data = deepCopy(data);
let columnsHeight = columnsList.length; let columnsHeight = columnsList.length;
let { let { colSpanData, rowSpanData } = getSpanJson({
colSpanData, mergeKey,
rowSpanData data,
} = getSpanJson({ eliminateRow,
mergeKey, eliminateCol,
data, });
eliminateRow, // 处理数据
eliminateCol let bodyData = [];
}); let dataMerges = [];
// 处理数据 try {
let bodyData = []; data.forEach((dv, di) => {
let dataMerges = []; let nowArroy = new Array(columnsKey.length).fill({});
try { columnsKey.forEach((av, ai) => {
data.forEach((dv, di) => { nowArroy[ai] = {
let nowArroy = new Array(columnsKey.length).fill({}); ...uj,
columnsKey.forEach((av, ai) => { v: av in dv && dv[av] != null ? dv[av].toString() : defect || '',
nowArroy[ai] = { };
...uj, });
v: av in dv && dv[av] != null ? dv[av].toString() : defect || '', bodyData.push(nowArroy);
}; });
}); // 处理合并数据
bodyData.push(nowArroy); mergeKey.forEach((mv, mi) => {
}); rowSpanData[mv].forEach((cv, ci) => {
// 处理合并数据 if (cv > 1) {
mergeKey.forEach((mv, mi) => { //合并表格的 开始行、结束行、开始列、结束列
rowSpanData[mv].forEach((cv, ci) => { let rowIndex = columnsKey.indexOf(mv);
if (cv > 1) { dataMerges.push([columnsHeight + ci, columnsHeight + ci + cv - 1, rowIndex, rowIndex]);
//合并表格的 开始行、结束行、开始列、结束列 }
let rowIndex = columnsKey.indexOf(mv); });
dataMerges.push([columnsHeight + ci, columnsHeight + ci + cv - 1, rowIndex, rowIndex]); colSpanData[mv].forEach((cv, ci) => {
} if (cv > 1) {
}); //合并表格的 开始行、结束行、开始列、结束列
colSpanData[mv].forEach((cv, ci) => { let rowIndex = columnsKey.indexOf(mv);
if (cv > 1) { dataMerges.push([columnsHeight + ci, columnsHeight + ci, rowIndex, rowIndex + cv - 1]);
//合并表格的 开始行、结束行、开始列、结束列 }
let rowIndex = columnsKey.indexOf(mv); });
dataMerges.push([columnsHeight + ci, columnsHeight + ci, rowIndex, rowIndex + cv - 1]); });
} } catch (err) {
}); console.table('getCustomData', err);
}); }
} catch (err) {
console.table("getCustomData", err);
}
const columnsDataCells = [...columnsList, ...bodyData];
const columnsDataMerges = [...columnsMerges, ...dataMerges];
let newBottomMerges = [];
if (bottomList && bottomList.length > 0) { // 新增底部数据
if (columnsKey.length != bottomList[0].length) {
console.table("bottomList数据列数和表头列数不一致");
return
}
newBottomMerges = bottomMerges.map((v, i) => {
let newV = v;
//合并表格的 开始行、结束行、开始列、结束列
newV[0] += columnsDataCells.length;
newV[1] += columnsDataCells.length;
return v;
});
}
let content = { const columnsDataCells = [...columnsList, ...bodyData];
sheets: [ const columnsDataMerges = [...columnsMerges, ...dataMerges];
{ let newBottomMerges = [];
name: fileName, if (bottomList && bottomList.length > 0) {
cells: [...columnsDataCells, ...bottomList], // 新增底部数据
merges: [...columnsDataMerges, ...newBottomMerges], if (columnsKey.length != bottomList[0].length) {
}, console.table('bottomList数据列数和表头列数不一致');
], return;
styles: exportStyles }
}; newBottomMerges = bottomMerges.map((v, i) => {
if (ext === "docx") { let newV = v;
content.sheets[0] = { //合并表格的 开始行、结束行、开始列、结束列
...content.sheets[0], newV[0] += columnsDataCells.length;
...docxSheet newV[1] += columnsDataCells.length;
} return v;
} });
if (styles) { }
content.styles = styles;
}
return content
let content = {
sheets: [
{
name: fileName,
cells: [...columnsDataCells, ...bottomList],
merges: [...columnsDataMerges, ...newBottomMerges],
},
],
styles: exportStyles,
};
if (ext === 'docx') {
content.sheets[0] = {
...content.sheets[0],
...docxSheet,
};
}
if (styles) {
content.styles = styles;
}
return content;
} }
// ant列表组件合并表格 render属性,合并纵向、横向。 // ant列表组件合并表格 render属性,合并纵向、横向。
export function renderContentAll(value, row, index, key, spanData, cloumnNames = []) { export function renderContentAll(value, row, index, key, spanData, cloumnNames = []) {
let colSpan, let colSpan,
rowSpan = null; rowSpan = null;
try { try {
colSpan = spanData.colSpanData[key][index];// 横向合并 colSpan = spanData.colSpanData[key][index]; // 横向合并
rowSpan = spanData.rowSpanData[key][index];// 纵向合并 rowSpan = spanData.rowSpanData[key][index]; // 纵向合并
} catch (err) { } catch (err) {
console.table("renderContentAll", err); console.table('renderContentAll', err);
} }
const obj = { const obj = {
children: value, children: value,
props: { props: {
rowSpan: rowSpan, rowSpan: rowSpan,
colSpan: colSpan colSpan: colSpan,
} },
}; };
return obj; return obj;
} }
// ant列表组件合并表格 render属性,合并纵向。 meanwhileKey :key 是本身字段key,value 是同步的字段key // ant列表组件合并表格 render属性,合并纵向。 meanwhileKey :key 是本身字段key,value 是同步的字段key
export function renderContentRow(value, row, index, key, spanData, cloumnNames = [], meanwhileKey = {}) { export function renderContentRow(
let colSpan, value,
rowSpan = null; row,
try { index,
if (cloumnNames.indexOf(key) !== -1) { key,
rowSpan = spanData.rowSpanData[key][index];// 纵向合并 spanData,
} else { cloumnNames = [],
if (key in meanwhileKey && meanwhileKey[key]) { meanwhileKey = {},
let meanwhileKeyValue = meanwhileKey[key]; ) {
rowSpan = spanData.rowSpanData[meanwhileKeyValue][index];// 同步字段 的纵向合并 let colSpan,
} else { rowSpan = null;
rowSpan = 1; try {
} if (cloumnNames.indexOf(key) !== -1) {
} rowSpan = spanData.rowSpanData[key][index]; // 纵向合并
} catch (err) { } else {
console.table("renderContentRow", err); if (key in meanwhileKey && meanwhileKey[key]) {
} let meanwhileKeyValue = meanwhileKey[key];
const obj = { rowSpan = spanData.rowSpanData[meanwhileKeyValue][index]; // 同步字段 的纵向合并
children: value, } else {
props: { rowSpan = 1;
rowSpan: rowSpan, }
colSpan: 1 }
} } catch (err) {
}; console.table('renderContentRow', err);
return obj; }
const obj = {
children: value,
props: {
rowSpan: rowSpan,
colSpan: 1,
},
};
return obj;
} }
/** /**
* 表头和数据导出(合并表格) * 表头和数据导出(合并表格)
* templatePath : word文档模板地址 * templatePath : word文档模板地址
...@@ -873,44 +865,42 @@ export function renderContentRow(value, row, index, key, spanData, cloumnNames = ...@@ -873,44 +865,42 @@ export function renderContentRow(value, row, index, key, spanData, cloumnNames =
* 返回值 * 返回值
* */ * */
export function getWord({ export function getWord({
templatePath, templatePath,
params, params,
title, title,
allValues = {}, allValues = {},
listConfig = {}, listConfig = {},
ext = 'docx', ext = 'docx',
}) { }) {
try { try {
let getFileData = giveFilePostDataInfoForTrue( let getFileData = giveFilePostDataInfoForTrue(
{ {
templatePath: templatePath, templatePath: templatePath,
params: JSON.stringify({ params: JSON.stringify({
...listConfig, ...listConfig,
...setObjectKey(params), ...setObjectKey(params),
}), }),
title: `${title}.${ext}`, title: `${title}.${ext}`,
allValues: JSON.stringify({ ...allValues }), allValues: JSON.stringify({ ...allValues }),
}, },
apiUrl + `/DataColumnApi/exportWord`, apiUrl + `/DataColumnApi/exportWord`,
); );
let token = getToken(); let token = getToken();
downloadFile(
getFileData.url,
{
...getFileData.datas,
token: token,
},
title,
ext,
);
} catch (err) {
console.table(err);
}
downloadFile(
getFileData.url,
{
...getFileData.datas,
token: token,
},
title,
ext,
);
} catch (err) {
console.table(err);
}
} }
/** /**
* 表头和数据导出(合并表格) * 表头和数据导出(合并表格)
* templatePath : word文档模板地址 * templatePath : word文档模板地址
...@@ -922,43 +912,41 @@ export function getWord({ ...@@ -922,43 +912,41 @@ export function getWord({
* 返回值 * 返回值
* */ * */
export function getFileAndShow({ export function getFileAndShow({
templatePath, templatePath,
params, params,
title, title,
allValues = {}, allValues = {},
listConfig = {}, listConfig = {},
ext = 'docx', ext = 'docx',
}) { }) {
try { try {
let getFileData = giveFilePostDataInfoForTrue( let getFileData = giveFilePostDataInfoForTrue(
{ {
templatePath: templatePath, templatePath: templatePath,
params: JSON.stringify({ params: JSON.stringify({
...listConfig, ...listConfig,
...setObjectKey(params), ...setObjectKey(params),
}), }),
title: `${title}.${ext}`, title: `${title}.${ext}`,
allValues: JSON.stringify({ ...allValues }), allValues: JSON.stringify({ ...allValues }),
}, },
apiUrl + `/DataColumnApi/exportWord`, apiUrl + `/DataColumnApi/exportWord`,
); );
let token = getToken(); let token = getToken();
downloadFileAndShowModal( downloadFileAndShowModal(
getFileData.url, getFileData.url,
{ {
...getFileData.datas, ...getFileData.datas,
token: token, token: token,
}, },
title, title,
ext, ext,
); );
} catch (err) { } catch (err) {
console.table(err); console.table(err);
} }
} }
/** /**
* 表头和数据导出(合并表格) * 表头和数据导出(合并表格)
* templatePath : word文档模板地址 * templatePath : word文档模板地址
...@@ -971,90 +959,81 @@ export function getFileAndShow({ ...@@ -971,90 +959,81 @@ export function getFileAndShow({
* */ * */
export function getListWord({ export function getListWord({
templatePath, templatePath,
paramsList = [], paramsList = [],
title, title,
sonTitleKey, sonTitleKey,
allValuesKey = [], allValuesKey = [],
listConfig = {}, listConfig = {},
ext = 'zip', ext = 'zip',
sonExt = 'pdf', sonExt = 'pdf',
filesKey = [] filesKey = [],
}) { }) {
try { try {
let content = []; let content = [];
paramsList.forEach((v, i) => { paramsList.forEach((v, i) => {
let files = []; let files = [];
let paramsObj = deepCopy(v); let paramsObj = deepCopy(v);
for (var ki in filesKey) { for (var ki in filesKey) {
let files_ = v[filesKey[ki]]; let files_ = v[filesKey[ki]];
try { try {
files = [...files, ...JSON.parse(files_).files] files = [...files, ...JSON.parse(files_).files];
} catch (e) { } catch (e) {}
delete paramsObj[filesKey[ki]];
}
content.push({
params: {
...setObjectKey(paramsObj),
...listConfig,
},
allValues: {
...getObjectsKey(allValuesKey, paramsObj),
},
title: (paramsObj[sonTitleKey] || '未设置名称') + `.${sonExt}`,
files: JSON.stringify(files),
});
});
let getFileData = giveFilePostDataInfoForTrue(
{
templatePath: templatePath,
content: JSON.stringify(content),
zipTitle: `${title}.${ext}`,
},
apiUrl + `/DataColumnApi/batchExportWord`,
);
} let token = getToken();
delete paramsObj[filesKey[ki]]; downloadFile(
} getFileData.url,
content.push({ {
params: { ...getFileData.datas,
...setObjectKey(paramsObj), token: token,
...listConfig, },
}, title,
allValues: { ext,
...getObjectsKey(allValuesKey, paramsObj) );
}, } catch (err) {
title: (paramsObj[sonTitleKey] || "未设置名称") + `.${sonExt}`, console.table(err);
files: JSON.stringify(files) }
}); function getObjectsKey(listKey = [], params = {}) {
}); return listKey.filter((key) => Object.keys(params).indexOf(key)).reduce(
let getFileData = giveFilePostDataInfoForTrue( (acc, key) => ({
{ ...acc,
templatePath: templatePath, [key]: params[key] === null ? '' : params[key],
content: JSON.stringify(content), }),
zipTitle: `${title}.${ext}`, {},
}, );
apiUrl + `/DataColumnApi/batchExportWord`, }
);
let token = getToken();
downloadFile(
getFileData.url,
{
...getFileData.datas,
token: token,
},
title,
ext,
);
} catch (err) {
console.table(err);
}
function getObjectsKey(listKey = [], params = {}) {
return (
listKey
.filter((key) => Object.keys(params).indexOf(key))
.reduce(
(acc, key) => ({
...acc,
[key]: params[key] === null ? '' : params[key],
}),
{},
)
)
}
} }
export function setObjectKey(data) { export function setObjectKey(data) {
return ( return Object.keys(data).reduce(
Object.keys(data) (acc, key) => ({
.reduce( ...acc,
(acc, key) => ({ ['${' + key + '}']: data[key] === null ? '' : data[key],
...acc, }),
['${' + key + '}']: data[key] === null ? '' : data[key], {},
}), );
{},
)
);
} }
/** /**
...@@ -1064,246 +1043,262 @@ export function setObjectKey(data) { ...@@ -1064,246 +1043,262 @@ export function setObjectKey(data) {
* @param {*} setKey {"被修改的key":"修改后的key"} * @param {*} setKey {"被修改的key":"修改后的key"}
* @returns * @returns
*/ */
export function upObjKey(obj, setKey = {}, defaultValue = "") { export function upObjKey(obj, setKey = {}, defaultValue = '') {
try { try {
obj = deepCopy(obj); obj = deepCopy(obj);
setKey = deepCopy(setKey); setKey = deepCopy(setKey);
let objType = Object.prototype.toString.call(obj); let objType = Object.prototype.toString.call(obj);
if (obj && (objType.indexOf("Array") > -1 || objType.indexOf("Object") > -1) && Object.keys(setKey).length > 0) { if (
let nowObj = null; obj &&
if (objType === "[object Object]" && !Array.isArray(obj) && Object.keys(obj).length > 0) { (objType.indexOf('Array') > -1 || objType.indexOf('Object') > -1) &&
nowObj = deepCopy(obj); Object.keys(setKey).length > 0
for (var e in setKey) { ) {
let upKey = setKey[e]; let nowObj = null;
let { newKey = e, type, timeFormat } = getSetKeyValue(upKey); if (objType === '[object Object]' && !Array.isArray(obj) && Object.keys(obj).length > 0) {
nowObj = { nowObj = deepCopy(obj);
...nowObj, for (var e in setKey) {
...getSetKeyJson({ let upKey = setKey[e];
obj, e, newKey, type, timeFormat, defaultValue let { newKey = e, type, timeFormat } = getSetKeyValue(upKey);
}) nowObj = {
}; ...nowObj,
if (e != newKey) { ...getSetKeyJson({
delete nowObj[e]; obj,
} e,
} newKey,
} type,
if (objType === "[object Array]" && Array.isArray(obj) && obj.length > 0) { timeFormat,
nowObj = new Array(); defaultValue,
obj.forEach((v, i, arr) => { }),
let newJson = deepCopy(v); };
for (var e in setKey) { if (e != newKey) {
let upKey = setKey[e]; delete nowObj[e];
let { newKey = e, type, timeFormat } = getSetKeyValue(upKey); }
newJson = { }
...newJson, }
...getSetKeyJson({ if (objType === '[object Array]' && Array.isArray(obj) && obj.length > 0) {
obj: v, e, newKey, type, timeFormat, defaultValue nowObj = new Array();
}) obj.forEach((v, i, arr) => {
}; let newJson = deepCopy(v);
if (e != newKey) { for (var e in setKey) {
delete newJson[e]; let upKey = setKey[e];
} let { newKey = e, type, timeFormat } = getSetKeyValue(upKey);
} newJson = {
nowObj.push(newJson); ...newJson,
}) ...getSetKeyJson({
} obj: v,
return nowObj; e,
} else { newKey,
return null; type,
} timeFormat,
} catch (error) { defaultValue,
console.table("upObjKey", error); }),
return undefined; };
} if (e != newKey) {
delete newJson[e];
}
}
nowObj.push(newJson);
});
}
return nowObj;
} else {
return null;
}
} catch (error) {
console.table('upObjKey', error);
return undefined;
}
} }
function getSetKeyValue(value) { function getSetKeyValue(value) {
let valeuType = Object.prototype.toString.call(value); let valeuType = Object.prototype.toString.call(value);
let newName = null; let newName = null;
let extendJson = { let extendJson = {
"type": "string" type: 'string',
}; };
if (valeuType === "[object String]") { if (valeuType === '[object String]') {
newName = value; newName = value;
} }
if (valeuType === "[object Object]") { if (valeuType === '[object Object]') {
newName = value["new"]; newName = value['new'];
delete value["new"]; delete value['new'];
extendJson = { extendJson = {
...extendJson, ...extendJson,
...value ...value,
}; };
} }
return { return {
newKey: newName, newKey: newName,
...extendJson ...extendJson,
} };
} }
function getSetKeyJson({ function getSetKeyJson({ obj, e, newKey, type, timeFormat = 'YYYY-MM-DD HH:mm:ss', defaultValue }) {
obj, e, newKey, type, timeFormat = "YYYY-MM-DD HH:mm:ss", defaultValue obj = deepCopy(obj);
}) { let value = obj[e];
obj = deepCopy(obj); let newKeyObj = {};
let value = obj[e]; // delete obj[e];
let newKeyObj = {}; switch (type) {
// delete obj[e]; case 'time':
switch (type) { newKeyObj[newKey] =
case "time": (timeFormat && value ? moment(value).format(timeFormat) : value) || defaultValue;
newKeyObj[newKey] = (timeFormat && value ? moment(value).format(timeFormat) : value) || defaultValue; break;
break; case 'flow':
case "flow": newKeyObj[newKey] = {
newKeyObj[newKey] = { code: value || defaultValue,
"code": value || defaultValue, type: 'flow',
"type": "flow" };
}; break;
break; default:
default: newKeyObj[newKey] = value || defaultValue;
newKeyObj[newKey] = value || defaultValue; }
} return newKeyObj;
return newKeyObj;
} }
// 下载附件FormdataWrapper // 下载附件FormdataWrapper
function isObject(value) { function isObject(value) {
return value === Object(value); return value === Object(value);
} }
function isArray(value) { function isArray(value) {
return Array.isArray(value); return Array.isArray(value);
} }
function isFile(value) { function isFile(value) {
return value instanceof File; return value instanceof File;
} }
function makeArrayKey(key) { function makeArrayKey(key) {
return key; return key;
} }
export function FormdataWrapper(obj, fd, pre) { export function FormdataWrapper(obj, fd, pre) {
fd = fd || new FormData(); fd = fd || new FormData();
Object.keys(obj) Object.keys(obj).forEach(function(prop) {
.forEach(function (prop) { var key = pre ? pre + '[' + prop + ']' : prop;
var key = pre ? pre + '[' + prop + ']' : prop; if (isObject(obj[prop]) && !isArray(obj[prop]) && !isFile(obj[prop])) {
if (isObject(obj[prop]) && !isArray(obj[prop]) && !isFile(obj[prop])) { FormdataWrapper(obj[prop], fd, key);
FormdataWrapper(obj[prop], fd, key); } else if (isArray(obj[prop])) {
} else if (isArray(obj[prop])) { obj[prop].forEach(function(value) {
obj[prop].forEach(function (value) { var arrayKey = makeArrayKey(key);
var arrayKey = makeArrayKey(key); if (isObject(value) && !isFile(value)) {
if (isObject(value) && !isFile(value)) { FormdataWrapper(value, fd, arrayKey);
FormdataWrapper(value, fd, arrayKey); } else {
} else { fd.append(arrayKey, value);
fd.append(arrayKey, value); }
} });
}); } else {
} else { if (obj[prop] != null) fd.append(key, obj[prop]);
if (obj[prop] != null) fd.append(key, obj[prop]); }
} });
}); return fd;
return fd;
} }
// TODO http://scjoyedu.eicp.net:57400/zentao/task-view-4023.html 等生产环境更新后测试. // TODO http://scjoyedu.eicp.net:57400/zentao/task-view-4023.html 等生产环境更新后测试.
// http://xg.qnzy.net:51352/zyd/#/xg/student_affairs/MI/UrbanAndRuralMedicalInsurance/InsuredPersonnel // http://xg.qnzy.net:51352/zyd/#/xg/student_affairs/MI/UrbanAndRuralMedicalInsurance/InsuredPersonnel
export async function downloadFile(url, params, fileName = '导出文件', ext = 'xlsx') { export async function downloadFile(url, params, fileName = '导出文件', ext = 'xlsx') {
const { transformApi, headersApi } = await getTransformApi(url); const { transformApi, headersApi } = await getTransformApi(url);
let headers = getSassApiHeader(); let headers = getSassApiHeader();
// if(headersApi){ // if(headersApi){
// headers.apis = headersApi; // headers.apis = headersApi;
// } // }
fetch(transformApi, { fetch(transformApi, {
method: 'POST', method: 'POST',
body: FormdataWrapper(params), body: FormdataWrapper(params),
headers, headers,
}) })
.then((res) => { .then(async (res) => {
if (res.status + '' !== '200') { if (res.status + '' !== '200') {
return res.json(); return res.json();
} else { } else {
return res.blob(); if (params && params.showDownloadProgressFromFileName) { // 2024年11月4日 解决禅道
} showDownloadProgressFromFileName(res, { ext, fileName });
}) return true;
.then((data) => { }
if (data instanceof Blob) {
let a = document.createElement('a');
let url = window.URL.createObjectURL(data);
let filename = fileName + '.' + ext;
a.href = url;
a.download = filename;
a.target = '_blank';
a.click();
window.URL.revokeObjectURL(url);
a = null;
} else {
}
})
.catch((err) => {
console.table(err);
})
.finally(() => {
return true;
});
}
return res.blob();
}
})
.then((data) => {
if (data instanceof Blob) {
let a = document.createElement('a');
let url = window.URL.createObjectURL(data);
let filename = fileName + '.' + ext;
a.href = url;
a.download = filename;
a.target = '_blank';
a.click();
window.URL.revokeObjectURL(url);
a = null;
}
})
.catch((err) => {
console.table(err);
})
.finally(() => {
return true;
});
}
export async function downloadFileAndShowModal(url, params, fileName = '导出文件', ext = 'xlsx') { export async function downloadFileAndShowModal(url, params, fileName = '导出文件', ext = 'xlsx') {
const { transformApi, headersApi } = await getTransformApi(url); const { transformApi, headersApi } = await getTransformApi(url);
let headers = getSassApiHeader(); let headers = getSassApiHeader();
// if(headersApi){ // if(headersApi){
// headers.apis = headersApi; // headers.apis = headersApi;
// } // }
fetch(transformApi, { fetch(transformApi, {
method: 'POST', method: 'POST',
body: FormdataWrapper(params), body: FormdataWrapper(params),
headers, headers,
}) })
.then((res) => { .then((res) => {
if (res.status + '' !== '200') { if (res.status + '' !== '200') {
return res.json(); return res.json();
} else { } else {
return res.blob(); return res.blob();
} }
}) })
.then((data) => { .then((data) => {
if (data instanceof Blob) { if (data instanceof Blob) {
let url = window.URL.createObjectURL(data); let url = window.URL.createObjectURL(data);
let filename = fileName + '.' + ext; let filename = fileName + '.' + ext;
/** /**
* 微软word 文档在线预览 * 微软word 文档在线预览
https://view.officeapps.live.com/op/view.aspx?src= https://view.officeapps.live.com/op/view.aspx?src=
https%3A%2F%2Fwww.longchang.gov.cn%2Flcs%2Fgsgg%2F202207%2F3ae45ccac65d40d885f40ec385ae287a%2Ffiles%2F%25E9%259A%2586%25E6%2598%258C%25E5%25B8%2582%25E7%25AC%25AC%25E5%2585%25AB%25E4%25B8%25AD%25E5%25AD%25A6%25E5%258E%2595%25E6%2589%2580%25E6%2594%25B9%25E9%2580%25A0%25E9%25A1%25B9%25E7%259B%25AE%25E5%2585%25AC%25E5%2591%258A.doc&wdOrigin=BROWSELINK https%3A%2F%2Fwww.longchang.gov.cn%2Flcs%2Fgsgg%2F202207%2F3ae45ccac65d40d885f40ec385ae287a%2Ffiles%2F%25E9%259A%2586%25E6%2598%258C%25E5%25B8%2582%25E7%25AC%25AC%25E5%2585%25AB%25E4%25B8%25AD%25E5%25AD%25A6%25E5%258E%2595%25E6%2589%2580%25E6%2594%25B9%25E9%2580%25A0%25E9%25A1%25B9%25E7%259B%25AE%25E5%2585%25AC%25E5%2591%258A.doc&wdOrigin=BROWSELINK
* */ * */
Modal.info({ Modal.info({
title: filename, title: filename,
width: 1000, width: 1000,
content: <div> content: (
<embed width='100%' <div>
height='568px' <embed
name='plugin' width="100%"
id='pdfView' height="568px"
src={url} name="plugin"
type='application/pdf' id="pdfView"
src={url}
internalinstanceid='3' type="application/pdf"
title={filename} /> internalinstanceid="3"
</div>, title={filename}
okText: '确定', />
onCancel: () => { </div>
window.URL.revokeObjectURL(url); ),
}, okText: '确定',
onOk: () => { onCancel: () => {
window.URL.revokeObjectURL(url); window.URL.revokeObjectURL(url);
}, },
}); onOk: () => {
} else { window.URL.revokeObjectURL(url);
} },
}) });
.catch((err) => { } else {
console.table(err); }
}) })
.finally(() => { .catch((err) => {
return true; console.table(err);
}); })
.finally(() => {
return true;
});
} }
import React from 'react';
import { Modal, message, Progress } from 'antd';
export async function showDownloadProgressFromFileName(res, {ext, fileName}) {
const reader = res.body.getReader();
let contentLength = res.headers.get('Content-Disposition').split('filename=')[1]; // 文件大小从filename里面取
let nowTime = new Date().getTime();
if (contentLength && contentLength.includes('.')) {
contentLength = Number(contentLength.split('.')[0]); // 文件大小
if (contentLength > 0) {
message.info('正在获取文件,请耐心等待');
let receivedLength = 0;
let chunks = [];
while (true) {
const { done, value } = await reader.read();
if (done) {
break;
}
chunks.push(value);
receivedLength += value.length;
// 下载进度
const progress = (receivedLength / contentLength) * 100;
if(new Date().getTime() - 1200 > nowTime) {
message.info('正在获取文件,请耐心等待,下载进度为' + progress.toFixed(2) + '%', 1);
nowTime = new Date().getTime();
}
// 将获取的百分比callback返回出去
// console.log(progress);
// console.log(`Reveived ${receivedLength} of ${contentLength}`, progress, 'progress');
}
let a = document.createElement('a');
a.style.display = 'none';
document.body.append(a);
const urlFile = window.URL.createObjectURL(new Blob(chunks, { type: ext }));
a.href = urlFile;
let filename = fileName;
if (ext && filename.indexOf('.') === -1) {
filename = filename + '.' + ext;
}
a.download = filename;
a.click();
document.body.removeChild(a);
window.URL.revokeObjectURL(urlFile);
a = null;
}
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论