Commit 3bccabc8 by lixinming

no message

parent 3cbc36aa
import { mock柱状图数据模板, mock键值数据模板, mock地图数据模板} from "../util/mockData";
export async function getData(req, res) {
let ret:any = {};
ret["孵化载体"] = get孵化载体();
ret["孵化载体占比数据"] = get孵化载体占比数据();
ret["孵化载体数量趋势"] = get孵化载体数量趋势();
ret["孵化载体投资主体"] = get孵化载体投资主体();
ret["孵化载体行业分类"] = get孵化载体行业分类();
ret["孵化载体运营"] = get孵化载体运营();
ret["平均营收趋势"] = get平均营收趋势();
ret["重要评价指标"] = get重要评价指标();
ret["服务资源"] = get服务资源();
ret["政策服务"] = get政策服务();
ret["地图数据"] = get地图数据();
res.send(ret);
}
function get孵化载体() {
return mock键值数据模板(4, 4, 'c', 2, false);
}
function get孵化载体占比数据() {
return mock键值数据模板(2, 5, 'c', 1, true);
}
function get孵化载体数量趋势() {
return mock柱状图数据模板(11);
}
function get孵化载体投资主体() {
return mock键值数据模板(3, 2, 'c', 2, false);
}
function get孵化载体行业分类() {
return mock键值数据模板(5, 4, 'c', 2, false);
}
function get孵化载体运营() {
return mock键值数据模板(5, 2, 'c', 3, false);
}
function get平均营收趋势() {
return mock柱状图数据模板(7);
}
function get重要评价指标() {
return mock键值数据模板(4, 5, 'c', 3, false);
}
function get服务资源() {
return mock键值数据模板(8, 10, 'c', 3, false);
}
function get政策服务() {
return mock键值数据模板(2, 3, 'c', 4, false);
}
function get地图数据() {
return mock地图数据模板(100);
}
import { mock柱状图数据模板, mock键值数据模板, mock地图数据模板} from "../util/mockData";
export async function getData(req, res) {
let ret:any = {};
ret["上市企业板块分布"] = get上市企业板块分布();
ret["科创版企业"] = get科创版企业();
ret["挂牌企业"] = get挂牌企业();
ret["2020年企业融资情况"] = get2020年企业融资情况();
ret["2020年企业上市情况"] = get2020年企业上市情况();
ret["融资金额趋势"] = get融资金额趋势();
ret["上市企业行业分布"] = get上市企业行业分布();
ret["创投机构"] = get创投机构();
ret["融资企业行业分布"] = get融资企业行业分布();
ret["企业融资阶段分布"] = get企业融资阶段分布();
ret["金融产品担保方式占比"] = get金融产品担保方式占比();
ret["中央球展示数据"] = get中央球展示数据();
res.send(ret);
}
function get上市企业板块分布() {
return mock键值数据模板(8, 4, 'c', 3, true);
}
function get科创版企业() {
return mock键值数据模板(10, 6, 'c', 2, true);
}
function get挂牌企业() {
return mock键值数据模板(4, 4, 'c', 2, false);
}
function get2020年企业融资情况() {
return mock键值数据模板(3, 4, 'c', 2, false);
}
function get2020年企业上市情况() {
return mock键值数据模板(3, 5, 'c', 2, false);
}
function get融资金额趋势() {
return mock柱状图数据模板(17);
}
function get上市企业行业分布() {
return mock键值数据模板(5, 4, 'c', 2, false);
}
function get创投机构() {
return mock键值数据模板(4, 4, 'c', 2, true);
}
function get融资企业行业分布() {
return mock键值数据模板(8, 7, 'c', 2, true);
}
function get企业融资阶段分布() {
return mock键值数据模板(12, 6, 'c', 3, true);
}
function get金融产品担保方式占比() {
return mock键值数据模板(7, 6, 'c', 2, true);
}
function get中央球展示数据() {
return mock键值数据模板(5, 5, 'c', 3, true);
}
import { mock柱状图数据模板, mock键值数据模板, mock地图数据模板} from "../util/mockData";
export async function getData(req, res) {
let ret:any = {};
ret["企业特征"] = get企业特征();
ret["代表企业"] = get代表企业();
ret["海外项目"] = get海外项目();
ret["人才引进"] = get人才引进();
ret["营业收入TOP5"] = get营业收入TOP5();
ret["净利润TOP5"] = get净利润TOP5();
ret["研发投入TOP5"] = get研发投入TOP5();
ret["入孵企业数量趋势"] = get入孵企业数量趋势();
ret["孵化器2020入驻企业数量排名"] = get孵化器2020入驻企业数量排名();
ret["运营指标趋势"] = get运营指标趋势();
ret["企业运营情况"] = get企业运营情况();
ret["企业运营概况"] = get企业运营概况();
ret["科技创新"] = get科技创新();
ret["发明专利申请与授权数比例"] = get发明专利申请与授权数比例();
ret["高新技术企业数据概况"] = get高新技术企业数据概况();
ret["高新技术企业培育"] = get高新技术企业培育();
ret["企业融资"] = get企业融资();
ret["2020四季度重大融资事件"] = get2020四季度重大融资事件();
res.send(ret);
}
function get企业特征() {
return mock键值数据模板(5, 4, 'c', 3, false);
}
function get代表企业() {
return ;
}
function get海外项目() {
return mock键值数据模板(7, 4, 'c', 2, true);
}
function get人才引进() {
return mock键值数据模板(7, 6, 'c', 4, true);
}
function get营业收入TOP5() {
return mock键值数据模板(5, 12, 'c', 1, true);
}
function get净利润TOP5() {
return mock键值数据模板(5, 12, 'c', 1, true);
}
function get研发投入TOP5() {
return mock键值数据模板(5, 12, 'c', 1, true);
}
function get入孵企业数量趋势() {
return mock柱状图数据模板(11);
}
function get孵化器2020入驻企业数量排名() {
return mock键值数据模板(5, 10, 'c', 3, false);
}
function get运营指标趋势() {
return mock柱状图数据模板(17);
}
function get企业运营情况() {
return mock键值数据模板(5, 5, 'c', 3, true);
}
function get企业运营概况() {
return mock键值数据模板(5, 4, 'c', 5, true);
}
function get科技创新() {
return mock键值数据模板(5, 4, 'c', 5, false);
}
function get发明专利申请与授权数比例() {
return mock柱状图数据模板(6);
}
function get高新技术企业数据概况() {
return mock键值数据模板(3, 4, 'c', 3, true);
}
function get高新技术企业培育() {
return mock柱状图数据模板(5);
}
function get企业融资() {
return mock键值数据模板(4, 4, 'c', 3, false);
}
function get2020四季度重大融资事件() {
return mock键值数据模板(5, 8, 'c', 3, true);
}
import { mock柱状图数据模板, mock键值数据模板, mock地图数据模板} from "../util/mockData";
export async function getData(req, res) {
let ret:any = {};
ret["大中小企业融通发展联盟"] = get大中小企业融通发展联盟();
ret["主要成效"] = get主要成效();
ret["创业加速营"] = get创业加速营();
ret["大企业开放式创新平台"] = get大企业开放式创新平台();
ret["大企业服务和成果"] = get大企业服务和成果();
ret["地图数据"] = get地图数据();
res.send(ret);
}
function get大中小企业融通发展联盟() {
return mock键值数据模板(2, 4, 'c', 3, false);
}
function get主要成效() {
return mock键值数据模板(5, 10, 'c', 3, false);
}
function get创业加速营() {
return mock键值数据模板(1, 7, 'c', 1, false);
}
function get大企业开放式创新平台() {
return mock键值数据模板(3, 3, 'c', 1, false);
}
function get大企业服务和成果() {
return mock键值数据模板(4, 4, 'c', 2, false);
}
function get地图数据() {
return mock地图数据模板(22);
}
import { mock柱状图数据模板, mock键值数据模板, mock地图数据模板} from "../util/mockData";
export async function getData(req, res) {
let ret:any = {};
ret["双创集群"] = get双创集群();
ret["孵化器增长趋势"] = get孵化器增长趋势();
ret["企业培育"] = get企业培育();
ret["行业分布"] = get行业分布();
ret["张江大中小企业融通发展联盟"] = get张江大中小企业融通发展联盟();
ret["大企业开放式创新平台"] = get大企业开放式创新平台();
ret["科技金融"] = get科技金融();
ret["股权融资趋势"] = get股权融资趋势();
ret["地图数据"] = get地图数据();
res.send(ret);
}
function get双创集群() {
return mock键值数据模板(7, 8, 'c', 3, true);
}
function get孵化器增长趋势() {
return mock柱状图数据模板(6);
}
function get企业培育() {
return mock键值数据模板(3, 6, 'c', 3, true);
}
function get行业分布() {
return mock键值数据模板(5, 4, 'c', 3, true);
}
function get张江大中小企业融通发展联盟() {
return mock键值数据模板(2, 4, 'c', 2, false);
}
function get大企业开放式创新平台() {
return mock键值数据模板(3, 6, 'c', 1, true);
}
function get科技金融() {
return mock键值数据模板(3, 6, 'c', 3, true);
}
function get股权融资趋势() {
return mock柱状图数据模板(6);
}
function get地图数据() {
return mock地图数据模板(8);
}
//标准化输入
/**
* analysisExcelDataOfObject 将excel解出来的数据块按需求解析成可用数据
* @param dataList excel解出来的数据
* @param isJumpTitle 是否跳过解析表头
* @param keyInX key是否横向排列
* @returns 返回 {"数据标题":数据对象 }
*/
export function analysisExcelDataOfObject(dataList, isJumpTitle?, keyInX?) {
let result = {};
if (keyInX) {
let keyList = dataList[0];
let valueList = dataList[1];
let i = isJumpTitle ? 1:0;
for (; i < keyList.length; i++) {
let key = keyList[i];
let value = valueList[i] || null;
result[key] = value;
}
} else {
let y = isJumpTitle ? 1: 0;
for (; y < dataList.length; y++) {
let childList = dataList[y];
let key = childList[0];
let value = childList[1] || null;
result[key] = value;
}
}
return result;
}
export function analysisExcelDataTime(dataList, isJumpTitle?, keyInX?) {
const HOURS = new Date().getHours() + 1;//获取当前时间
let result = {};
if (keyInX) {
let keyList = dataList[0];
let valueList = dataList[1];
let i = isJumpTitle ? 1:0;
for (; i < keyList.length; i++) {
let key = keyList[i];
let value = valueList[i] || null;
result[key] = value;
}
} else {
let y = isJumpTitle ? 1: 0;
for (; y <= HOURS; y++) {
let childList = dataList[y];
let key = childList[0];
let value = childList[1] || null;
result[key] = value;
}
}
return result;
}
/**
* analysisExcelDataOfMoreObject 将excel解出来的数据块按需求解析成可用数据
* @param dataList excel解出来的数据
* @param isJumpTitle 是否跳过解析表头
* @param headerInx 第一个表头数据是否横向排列
* @returns 返回 {"第一个表头数据":{"表头数据":值...} }
*/
export function analysisExcelDataOfMoreObject(dataList, headerInx?) {
let result = {};
let titleList = dataList[0];
if (!headerInx) {
for (let y =1; y < dataList.length; y++) {
let dataTitle = dataList[y][0];
let thisData = {};
for (let x = 1; x < dataList[y].length; x++) {
let key = titleList[x];
thisData[key] = dataList[y][x];
}
result[dataTitle] = thisData;
}
} else {
let indexKeyMap = {};
titleList.forEach((thisTitle, index) => {
if (!index) return;
indexKeyMap[index] = thisTitle;
result[thisTitle] = {};
});
for (let y =1; y < dataList.length; y++) {
let thisKey = dataList[y][0];
for (let x = 1; x < dataList[y].length; x++) {
let thisTitle = indexKeyMap[x];
result[thisTitle][thisKey] = dataList[y][x];
}
}
}
return result;
}
/**
* analysisExcelDataOfList 将excel解出来的数据块按需求解析成可用数据
* @param dataList excel解出来的数据
* @param keyObject 对应关系 {dataList表头名称: 英文}
* @param headerInx 第一个表头数据是否横向排列
* @returns 返回 {"第一个表头数据":{"表头数据":值...} }
*/
export function analysisExcelDataOfList(dataList, keyObject, headerInx?) {
let result = [];
if (!headerInx) {//在y轴上排列
let titleList = dataList[0];
let indexKeyNameMap = {};
titleList.forEach( (info, index) => {
indexKeyNameMap[index + 1] = info;
});
for (let i = 1; i < dataList.length; i++) {
let onceInfo = {};
let subList = dataList[i];
subList.forEach( (info, index) => {
let key = indexKeyNameMap[index + 1];
let checkKey = keyObject[key];
onceInfo[checkKey] = info;
});
result.push(onceInfo);
}
} else {//在x轴上排列
let indexKeyNameMap = {};
dataList.forEach( (info, index) => {
indexKeyNameMap[index + 1] = info[0];
});
let dataMap = {};
for(let y = 0; y < dataList.length; y++) {
let xList = dataList[y];
for (let x = 1; x < xList.length; x++) {
if (!dataMap[x]) dataMap[x] = {};
let key = indexKeyNameMap[y + 1];
let checkKey = keyObject[key];
dataMap[x][checkKey] = xList[x];
}
}
result = Object.values(dataMap);
}
return result;
}
export function analysisExcelDataOfStringList(dataList) {
let result = [];
for (let i = 0; i < dataList.length; i++) {
if (!i) continue;
let subList = dataList[i];
result.push(subList[1]);
}
return result;
}
//内部使用
\ No newline at end of file
//标准化输出
\ No newline at end of file
//仅限cal中使用的工具
\ No newline at end of file
let fs = require('fs');
let apiInfoList = [
{name:"FuHuaZaiTi", dataList:[
{name:"孵化载体", len:4, type:"键值", strType:"c",strLen:4, valLen:2, haveUnit:false},
{name:"孵化载体占比数据", len:2, type:"键值", strType:"c", strLen:5, valLen:1, haveUnit:true},
{name:"孵化载体数量趋势", len:11, type:"柱状"},
{name:"孵化载体投资主体", len:3, type:"键值", strType:"c",strLen:2, valLen:2, haveUnit:false},
{name:"孵化载体行业分类", len:5, type:"键值", strType:"c",strLen:4, valLen:2, haveUnit:false},
{name:"孵化载体运营", len:5, type:"键值", strType:"c",strLen:2, valLen:3, haveUnit:false},
{name:"平均营收趋势", len:7, type:"柱状"},
{name:"重要评价指标", len:4, type:"键值", strType:"c",strLen:5, valLen:3, haveUnit:false},
{name:"服务资源", len:8, type:"键值", strType:"c",strLen:10, valLen:3, haveUnit:false},
{name:"政策服务", len:2, type:"键值", strType:"c",strLen:3, valLen:4, haveUnit:false},
{name:"地图数据", len:100, type:"地图"}
]},
{name:"KeJiJinRong", dataList:[
{name:"上市企业板块分布", len:8, type:"键值", strType:"c",strLen:4, valLen:3, haveUnit:true},
{name:"科创版企业", len:10, type:"键值", strType:"c",strLen:6, valLen:2, haveUnit:true},
{name:"挂牌企业", len:4, type:"键值", strType:"c",strLen:4, valLen:2, haveUnit:false},
{name:"2020年企业融资情况", len:3, type:"键值", strType:"c",strLen:4, valLen:2, haveUnit:false},
{name:"2020年企业上市情况", len:3, type:"键值", strType:"c",strLen:5, valLen:2, haveUnit:false},
{name:"融资金额趋势", len:17, type:"柱状"},
{name:"上市企业行业分布", len:5, type:"键值", strType:"c",strLen:4, valLen:2, haveUnit:false},
{name:"创投机构", len:4, type:"键值", strType:"c",strLen:4, valLen:2, haveUnit:true},
{name:"融资企业行业分布", len:8, type:"键值", strType:"c",strLen:7, valLen:2, haveUnit:true},
{name:"企业融资阶段分布", len:12, type:"键值", strType:"c",strLen:6, valLen:3, haveUnit:true},
{name:"金融产品担保方式占比", len:7, type:"键值", strType:"c",strLen:6, valLen:2, haveUnit:true},
{name:"中央球展示数据", len:5, type:"键值", strType:"c",strLen:5, valLen:3, haveUnit:true}
]},
{name:"QiYePeiYu", dataList:[
{name:"企业特征", len:5, type:"键值", strType:"c",strLen:4, valLen:3, haveUnit:false},
{name:"代表企业", len:0, type:""},
{name:"海外项目", len:7, type:"键值", strType:"c",strLen:4, valLen:2, haveUnit:true},
{name:"人才引进", len:7, type:"键值", strType:"c",strLen:6, valLen:4, haveUnit:true},
{name:"营业收入TOP5", len:5, type:"键值", strType:"c",strLen:12, valLen:1, haveUnit:true},
{name:"净利润TOP5", len:5, type:"键值", strType:"c",strLen:12, valLen:1, haveUnit:true},
{name:"研发投入TOP5", len:5, type:"键值", strType:"c",strLen:12, valLen:1, haveUnit:true},
{name:"入孵企业数量趋势", len:11, type:"柱状"},
{name:"孵化器2020入驻企业数量排名", len:5, type:"键值", strType:"c",strLen:10, valLen:3, haveUnit:false},
{name:"运营指标趋势", len:17, type:"柱状"},
{name:"企业运营情况", len:5, type:"键值", strType:"c",strLen:5, valLen:3, haveUnit:true},
{name:"企业运营概况", len:5, type:"键值", strType:"c",strLen:4, valLen:5, haveUnit:true},
{name:"科技创新", len:5, type:"键值", strType:"c",strLen:4, valLen:5, haveUnit:false},
{name:"发明专利申请与授权数比例", len:6, type:"柱状"},
{name:"高新技术企业数据概况", len:3, type:"键值", strType:"c",strLen:4, valLen:3, haveUnit:true},
{name:"高新技术企业培育", len:5, type:"柱状"},
{name:"企业融资", len:4, type:"键值", strType:"c",strLen:4, valLen:3, haveUnit:false},
{name:"2020四季度重大融资事件", len:5, type:"键值", strType:"c",strLen:8, valLen:3, haveUnit:true}
]},
{name:"RongTongHua", dataList:[
{name: "大中小企业融通发展联盟", len:2, type:"键值", strType:"c",strLen:4, valLen:3, haveUnit:false},
{name: "主要成效", len:5, type:"键值", strType:"c",strLen:10, valLen:3, haveUnit:false},
{name: "创业加速营", len:1, type:"键值", strType:"c",strLen:7, valLen:1, haveUnit:false},
{name: "大企业开放式创新平台", len:3, type:"键值", strType:"c",strLen:3, valLen:1, haveUnit:false},
{name: "大企业服务和成果", len:4, type:"键值", strType:"c",strLen:4, valLen:2, haveUnit:false},
{name: "地图数据", len:22, type:"地图"}
]},
{name:"ShuangChuangShengTai", dataList:[
{name:"双创集群", len:7, type:"键值", strType:"c",strLen:8, valLen:3, haveUnit:true},
{name:"孵化器增长趋势", len:6, type:"柱状"},
{name:"企业培育", len:3, type:"键值", strType:"c",strLen:6, valLen:3, haveUnit:true},
{name:"行业分布", len:5, type:"键值", strType:"c",strLen:4, valLen:3, haveUnit:true},
{name:"张江大中小企业融通发展联盟", len:2, type:"键值", strType:"c",strLen:4, valLen:2, haveUnit:false},
{name:"大企业开放式创新平台", len:3, type:"键值", strType:"c",strLen:6, valLen:1, haveUnit:true},
{name:"科技金融", len:3, type:"键值", strType:"c",strLen:6, valLen:3, haveUnit:true},
{name:"股权融资趋势", len:6, type:"柱状"},
{name:"地图数据", len:8, type:"地图"}
]}
];
function createBiz() {
apiInfoList.forEach(apiInfo=>{
let path = `./biz/${apiInfo.name}.ts`;
fs.access(path, (err) => {
if (!err) {
console.error(path, "文件已存在");
return;
}
fs.writeFileSync(path, getBizFileData(apiInfo.dataList));
console.log(path, "创建文件成功")
});
})
}
function createRouter() {
let path = `./routers/router.ts`;
fs.access(path, (err) => {
if (!err) {
console.error(path, "文件已存在");
return;
}
fs.writeFileSync(path, getRouterFileData(apiInfoList));
console.log(path, "创建文件成功")
});
}
function getBizFileData(dataList) {
let funStr = "";
let runFunStr = "";
let mockFunStr = "";
dataList.forEach(dataInfo=>{
let subFunStr = ``;
switch(dataInfo.type) {
case "键值" : subFunStr = `mock键值数据模板(${dataInfo.len}, ${dataInfo.strLen}, '${dataInfo.strType}', ${dataInfo.valLen}, ${dataInfo.haveUnit})`; break;
case "柱状" : subFunStr = `mock柱状图数据模板(${dataInfo.len})`; break;
case "地图" : subFunStr = `mock地图数据模板(${dataInfo.len})`; break;
};
funStr +=
`function get${dataInfo.name}() {
return ${subFunStr};
}
`;
runFunStr +=
` ret["${dataInfo.name}"] = get${dataInfo.name}();
`
});
let allData =
`import { mock柱状图数据模板, mock键值数据模板, mock地图数据模板} from "../util/mockData";
export async function getData(req, res) {
let ret:any = {};
${runFunStr}
res.send(ret);
}
${funStr}
`
return allData;
}
function getRouterFileData(apiInfoList) {
let importStr = "";
let listenStr = "";
apiInfoList.forEach(apiInfo=>{
importStr +=
`import * as ${apiInfo.name}Biz from '../biz/${apiInfo.name}';
`
listenStr +=
` httpServer.get('/${apiInfo.name}', asyncHandler(${apiInfo.name}Biz.getData));
`
})
let allDataStr =
`import * as asyncHandler from 'express-async-handler'
${importStr}
export function setRouter(httpServer) {
${listenStr}
}`
return allDataStr;
}
createBiz();
createRouter();
\ No newline at end of file
......@@ -2,6 +2,7 @@
const fs = require('fs');
const xlsx = require('node-xlsx');
const path = require('path');
const moment = require('moment');
/**
* getExcelDataBySheetName 将excel文件解析成数据块数据
......@@ -11,7 +12,7 @@ const path = require('path');
*/
export function getExcelDataBySheetName(fileName, sheetName) {
let {sheetMap, sheetList} = getExcel(`${__dirname.substring(0,__dirname.indexOf("out"))}res\\${fileName}`);
let {sheetMap, sheetList} = getExcel( path.join(__dirname.substring(0,__dirname.indexOf("out")), "res", fileName ));
let thisBlockData = getBlockData(sheetMap[sheetName]);
return thisBlockData;
}
......@@ -27,49 +28,6 @@ export function getBlockDataByData(dataList) {
}
/**
* analysisExcelDataOfObject 将excel解出来的数据块按需求解析成可用数据
* @param dataList excel解出来的数据
* @param isJumpTitle 是否跳过解析表头
* @param keyInX 表头是否是很向排列
* @returns 返回 {"数据标题":数据对象 }
*/
export function analysisExcelDataOfObject(dataList, isJumpTitle?, keyInX?) {
let result = {};
if (keyInX) {
let keyList = dataList[0];
let valueList = dataList[1];
let i = isJumpTitle ? 1:0;
for (; i < keyList; i++) {
let key = keyList[i];
let value = valueList[i] || null;
result[key] = value;
}
} else {
let y = isJumpTitle ? 1: 0;
for (; y < dataList.length; y++) {
let childList = dataList[y];
let key = childList[0];
let value = childList[1] || null;
result[key] = value;
}
}
return result;
}
export function testmain() {
let {sheetMap, sheetList} = getExcel(`${__dirname.substring(0,__dirname.indexOf("out"))}res\\数据模板.xlsx`);
//根据配置表解析成对应数据
let resultMap = {};
for (let sheetName in sheetMap) {
let thisSheetBlockList = getBlockData(sheetMap[sheetName]);
resultMap[sheetName] = thisSheetBlockList;
}
console.log(resultMap);
return resultMap;
}
/**
* getBlockData 数据分块
* @param dataList 解析出来的excel二维数组
* @returns 返回数据块集合 格式:blockList = [ {blockData:数据块(二维数组), blockTitle:"数据标题"}]
......@@ -91,11 +49,13 @@ function getListFristNotNullItemIndex(list) { //获取起始坐标
if (list[i]) return i;
}
}
function getListFirstNullItemIndex(list) { //获取第一个为空的坐标
function getListFirstNullItemIndex(startX, list) { //获取第一个为空的坐标
if (!list.length) return null;
let checkItem = false;
let firstItemIndex = 0;
for (let i = 0; i <= list.length; i++) {
for (let i = startX; i <= list.length; i++) {
let item = list[i];
if (!checkItem && item) checkItem = true;
......@@ -149,11 +109,11 @@ function checkBlock(dataList) {
let thisRoowStartX = getListFristNotNullItemIndex(childList);
let thisRoowLastItem = childList[thisRoowStartX + 1];
let LastList = dataList[i+1] || [];
let lastRoowStartX = getListFristNotNullItemIndex(LastList);
if ( thisRoowLastItem || (LastList.length && lastRoowStartX == thisRoowStartX) ) {
// let lastRoowStartX = getListFristNotNullItemIndex(LastList);
let lastRoowHaveItem = LastList[thisRoowStartX];
if ( thisRoowLastItem || (LastList.length && lastRoowHaveItem) ) {
if (lastRoowStartX == thisRoowStartX && thisRoowLastItem ) {
if (lastRoowHaveItem && thisRoowLastItem ) {
isNotBlockTitle = true; //不存在标题块
blockTitle = `${thisRoowStartX}_${i}`;
startY = i;
......@@ -180,7 +140,7 @@ function checkBlock(dataList) {
} else {
//测量最大连续长度
let firstNullX = getListFirstNullItemIndex(childList);
let firstNullX = getListFirstNullItemIndex(startX, childList);
if (firstNullX) endX = Math.max(endX, firstNullX-1);
break;
}
......@@ -217,8 +177,6 @@ function checkBlock(dataList) {
return {blockData, blockTitle, delDataList:dataList,notItem};
}
//获取单个excel文件的数据
function getExcel(filePath) {
const workSheetsFromFile = xlsx.parse(filePath);
......
export class BizError extends Error {
}
\ No newline at end of file
const fs = require('fs');
const xlsx = require('node-xlsx');
const path = require('path');
//获取单个目录下的单个excel文件数据 只能有一个文件
export function getExcelDataByPath (dir) {
console.log(path.join(__dirname,dir))
let files = fs.readdirSync( path.join(__dirname,dir));
for (let i = 0; i < files.length; i++) {
if (files[i].indexOf('~') == 0 || files[i].indexOf('.') == 0) continue;
const workSheetsFromFile = xlsx.parse(dir+'/'+files[i]);
let sheetMap = {};
let sheetList = [];
for (let i = 0; i < workSheetsFromFile.length; i++) {
let sheetInfo = workSheetsFromFile[i];
sheetMap[sheetInfo.name] = sheetInfo.data;
sheetList.push(sheetInfo.data)
}
return {sheetMap, sheetList}
}
}
export function updateExcel(data, fileName) {
try{
fs.writeFileSync('output.xlsx', xlsx.build(data), "binary");
console.log(`写入 ${fileName} 成功`);
}catch(err) {
console.log(err);
}
}
//获取单个excel文件的数据
export function getExcelDataByFile(filePath) {
const workSheetsFromFile = xlsx.parse(filePath);
let sheetMap = {};
let sheetList = [];
for (let i = 0; i < workSheetsFromFile.length; i++) {
let sheetInfo = workSheetsFromFile[i];
sheetMap[sheetInfo.name] = sheetInfo.data;
sheetList.push(sheetInfo);
}
return {sheetMap, sheetList}
}
export function arrayToObject(dataArr, keyNameArr) {
let obj = {};
for (let i = 0; i < dataArr.length; i++) {
obj[keyNameArr[i]] = dataArr[i];
}
return obj;
}
\ No newline at end of file
/**
*
* @param keyList 要生成的键名称集合 例如: ["键1", "键2"]
* @param valLen 要生成的值的长度 例如 十位数就传1 百位数就传2 例如: 1 则会生成 键1或键2 的数据是1-10的随机数
* @param haveUnit 单位信息: 如果传 % 号则会把生成的随机数再求百分比 传false 则不生成单位 传 数组 例如:["家","个"] 则 键1的单位是 家, 键2的单位是个
* @param title 数据标题
* @param subTitle 数据副标题
* @param total 是否要求和
* @returns
*/
export function mock键值数据模板(keyList, valLen, haveUnit, title, subTitle, total) {
let data = {
"title": "",
"subTitle": "",
"total": 0,
"list": []
};
if (title) data.title = title;
if (subTitle) data.subTitle = subTitle || title;
if ( haveUnit && haveUnit == "%" ) {
let random = Math.ceil( Math.random() * 20 );
let avg = Math.ceil((100 - random) / keyList.length);
keyList.forEach((key, index) => {
let valut = index == 0 ? avg + random : avg;
let onceInfo:any = {
"key":key,
"value": valut,
unit:"%"
};
data.list.push(onceInfo);
});
} else {
let unitIndex = 0;
for (let i = 0; i < keyList.length; i++) {
let key = keyList[i];
let onceInfo:any = {
"key":key,
"value": getValueByLength(valLen)
};
if (haveUnit) {
if (typeof haveUnit == "string") onceInfo.unit = haveUnit;
else onceInfo.unit = haveUnit[unitIndex];
}
data.list.push(onceInfo);
unitIndex += 1;
}
if (total) {
data.list.forEach(keyValue=>{
data.total += keyValue.value;
})
}
}
return data;
}
//键值数据 值为字符串
export function mock键值数据字符串模板(title, subTitle, obj) {
let data = { title: "", subTitle: "", total: 0, list: [] };
if (title) data.title = title;
if (subTitle) data.subTitle = subTitle || title;
for (let key in obj) {
data.list.push({
key,
value:obj[key]
});
}
return data;
}
//列表数据 obj:{ "表格1":{title1:1, title2:2, title3:3... } }
export function mock列表模板( obj, number ) {
let tableNumber = Object.keys(obj).length;
if (tableNumber > 1) {
let data = [];
for (let key in obj) {
let onceTable:any = {title:key, total:number, subTitle:key, titleList:[], valueList:[] };
onceTable.titleList = Object.keys(obj[key]);
for (let i = 0; i < number; i++) {
onceTable.valueList.push(Object.values(obj[key]) );
}
data.push(onceTable);
}
return data;
} else {
let onceTable:any = {};
for (let key in obj) {
onceTable = {title:key, total:number, subTitle:key, titleList:[], valueList:[] };
onceTable.titleList = Object.keys(obj[key]);
for (let i = 0; i < number; i++) {
onceTable.valueList.push(Object.values(obj[key]) );
}
}
return onceTable;
}
}
export function mock图形数据模板(keyList, title, number?, subTitleList?) {
if (!number) number = 1;
if (number == 1) {
let data = {
"title": title ? title : "测试标题",
"yMaxValue": 100,
"yMinValue": 0,
"yStepValue": 10,
"unit": "个",
"data": {
"title": "测试数据标题",
"subTitle": "测试数据副标题",
"total": 1,
"list": []
}
}
for (let i = 0; i < keyList.length; i++) {
let key = keyList[i];
let onceInfo:any = {
key,
"value": Math.floor(Math.random()*99+1),
"unit": "个"
};
data.data.list.push(onceInfo)
}
data.data.list.forEach(keyValue=>{
data.data.total += keyValue.value;
});
return data;
} else {
let data = {
"title": title ? title : "测试标题",
"yMaxValue": 100,
"yMinValue": 0,
"yStepValue": 10,
"unit": "个",
"data": []
};
for (let y = 0; y < number; y++) {
let onceData = {
"title": subTitleList[y],
"subTitle": subTitleList[y],
"total": 1,
"list": []
}
for (let i = 0; i < keyList.length; i++) {
let key = keyList[i];
let onceInfo:any = {
key,
"value": Math.floor(Math.random()*99+1),
"unit": "个"
};
onceData.list.push(onceInfo)
}
onceData.list.forEach(keyValue=>{
onceData.total += keyValue.value;
});
data.data.push(onceData);
}
return data;
}
}
// 柱状图数据模板 模拟数据
export function mock柱状图数据模板(len, title?) {
let data = {
"title": title ? title : "测试标题",
"yMaxValue": 100,
"yMinValue": 0,
"yStepValue": 10,
"unit": "个",
"data": {
"title": "测试数据标题",
"subTitle": "测试数据副标题",
"total": 1,
"list": [
]
}
}
for (let i = 0; i < len; i++) {
let onceInfo:any = {
"key": 2010 + i,
"value": Math.floor(Math.random()*99+1),
"unit": "个"
};
data.data.list.push(onceInfo)
}
data.data.list.forEach(keyValue=>{
data.data.total += keyValue.value;
})
return data;
}
export function mock多柱柱状数据模板(len, 数组长度, title?) {
let data = {
"title": title ? title : "测试标题",
"yMaxValue": 100,
"yMinValue": 0,
"yStepValue": 10,
"unit": "个",
"data": []
}
for (let arrLen = 0; arrLen < 数组长度; arrLen++) {
let obj = {
"title": "测试数据标题",
"subTitle": "测试数据副标题",
"total": 0,
"list": [
]
}
for (let i = 0; i < len; i++) {
let onceInfo:any = {
"key": 2010 + i,
"value": Math.floor(Math.random()*99+1),
"unit": "个"
};
obj.list.push(onceInfo)
}
obj.list.forEach(keyValue=>{
obj.total += keyValue.value;
});
data.data.push(obj);
}
return data;
}
//获取特定长度的测试文字
export function getTestStrByLength(strLen, strType) {
let testStr = ``;
if (strType == 'c') {//中文
if (strLen < 5) {
testStr += `测试文本`.substring(0, strLen);
} else {
testStr += `测试`;
getPlaByLength((strLen - 4), () => {
testStr += '-';
});
testStr += `文本`
}
} else {//英文
testStr += `te`;
getPlaByLength((strLen - 4), () => {
testStr += '-';
});
testStr += `st`
}
return testStr;
}
function getValueByLength(length) {
let i = 1;
getPlaByLength(length, () => {
i= i * 10;
});
return Math.floor(Math.random() * i);
}
//获取特定长度的 占位符号
function getPlaByLength(num, callback) {
for (let i =0; i < num; i++) {
callback();
}
}
// 地图数据模板 模拟数据
export function mock地图数据模板(len) {
let data = {
"typeNameList": [
"type1","type2","type3"
],
"list": [
]
}
for (let i = 0; i < len; i++) {
data.list.push({
"x": Math.floor(Math.random()*500),
"y": Math.floor(Math.random()*500),
"typeName": "type"+(i%3+1),
"title": "测试标题",
"address": "测试地址",
"data": "测试数据<b>加粗</b></br>等等"
})
}
return data;
}
export function mock表数据模板(表头长度, 数据长度) {
let data = {
title:"",
titleList:[],
valueList:[]
}
for (let i = 0; i < 表头长度; i++) {
data.titleList.push("表头"+i);
}
for(let j = 0; j < 数据长度; j++) {
for (let i = 0; i < 表头长度; i++) {
data.titleList.push("数据"+i);
}
}
}
export function randomNumber(max, min=0) {
return Math.floor(Math.random()*(max-min))+min;
}
\ No newline at end of file
import * as request from 'request';
import { BizError } from './bizError';
export function get(url:string, query?, headers?) {
if (!url || (url.search(/http:/) && url.search(/https:/)) ) throw new BizError(!url ? "请求地址为空" : "请求地址错误");
return new Promise((resolve, reject)=>{
let paramater:any = { url, json:true };
if (query) paramater.qs = query;
if (headers) paramater.headers = headers;
request.get(paramater, function (err, r, body) {
if (err) return reject(err);
if (r && r.statusCode != 200) return reject(new Error('httpError:'+r.statusCode))
resolve(body);
});
})
}
export function post(url, body, headers) {
if (!url || (url.search(/http:/) && url.search(/https:/)) ) throw new BizError(!url ? "请求地址为空" : "请求地址错误");
let header = {"content-type": "application/json"};
return new Promise((resolve, reject)=>{
request({
url: url,
method: "POST",
json: true,
headers: Object.assign(header, headers),
body: body
}, function(error, response, body) {
if (!error && response.statusCode == 200) {
resolve(body);
}
else {
reject(error)
}
});
})
}
export function postForm(url, body, headers) {
if (!url || (url.search(/http:/) && url.search(/https:/)) ) throw new BizError(!url ? "请求地址为空" : "请求地址错误");
return new Promise((resolve, reject)=>{
request({
url: url,
method: "POST",
json: true,
form:body
}, function(error, response, res) {
if (!error) {
resolve(res);
}
else {
reject(error)
}
});
})
}
export function limitEnteNameString(name, number?) {
number = number ? number : 13;
if (name.length > number) return `${name.substring(0,number - 2)}...`;
return name;
}
const moneyStrConfig = {
"万亿": 13,
"萬億": 13,
"千亿": 12,
"千億": 12,
"百亿": 11,
"佰億": 11,
"十亿": 10,
"拾億": 10,
"亿": 9,
"億": 9,
"千万": 8,
"千萬": 8,
"百万": 7,
"佰萬": 7,
"十万": 6,
"拾萬": 6,
"万": 5,
"萬": 5,
"千":4,
"百":3,
"十":2,
"美元":1,
"人名币":1,
"元":1,
};
// 汇率
let dollarRate = 6.4731;
//解析金额
export function analysisMoneyStr(mnyStr:string) {
let zeroNum = 1;
let moneyNumber = 0;
for (let key in moneyStrConfig) {
let checkNum = mnyStr.indexOf(key);
if (checkNum > -1) {
zeroNum = moneyStrConfig[key];
moneyNumber = parseFloat(mnyStr.slice(0, checkNum));
break;
}
}
if (mnyStr.replace(/[^0-9]/ig,"") == "") return 0;
if (zeroNum > 1) {
let count = 1;
for (let i = 1; i < zeroNum; i++) {
count = count * 10;
}
zeroNum = count;
}
let money = parseInt(`${zeroNum * moneyNumber}`);
if (mnyStr.indexOf('美元')) money = parseInt(`${money * dollarRate}`);
return money;
}
//缩略金额
export function simplifyMoney(mny:number, str:string) {
let num = moneyStrConfig[str];
let count = 1;
for (let i = 1; i < num; i++) {
count = count * 10;
}
return mny / count;
}
//分离 带单位的数据
function separateDataAndUint(str) {
if (!str) return {data:0, unit:""};
let data = str.replace(/[\u4E00-\u9FA5a-zA-Z]+/,"");
let unit = str.replace(/^(-)?\d+(\.\d+)?/, "");
return {data, unit};
}
//object key替换 带单位
export function objKeyReplace(object, keyInfo) {
let unitMap = {};
let dataMap = {};
for(let key in object) {
let newKey = keyInfo[key] || key;
let {data, unit} = separateDataAndUint(`${object[key]}` || "");
unitMap[newKey] = unit;
dataMap[newKey] = parseFloat(data);
}
return {dataMap, unitMap};
}
//返回特定key和value的obj
export function objKeyAndValue(dataMap, ...keyList) {
let result = {};
for (let key in dataMap) {
if ( keyList.indexOf(key) > -1 ) result[key] = dataMap[key];
}
return result;
}
//获取键值数据 percent =>为数字的时候 保留几位小数
export function getKeyValue(title, dataMap, unit, total, percent ) {
let data = {
title,
subTitle : title,
total : 0,
list : []
};
let count = 0;
for (let key in dataMap) {
let value = parseFloat(dataMap[key]);
count += value;
if (total) data.total += value;
}
for (let key in dataMap) {
let thisUnit = "";
if (unit) {
if (typeof unit == "string") thisUnit = unit;
else thisUnit = unit[key];
}
let value = parseFloat(dataMap[key]);
if (percent) {
thisUnit = '%';
value = getDecimalForN( value/count, percent);
}
let onceInfo:any = { key, value, unit:thisUnit };
data.list.push(onceInfo);
}
return data;
}
export function getChartData(dataMap, unit, percent, title?, subTitle? ) {
unit = unit || "";
let data = {
title, yMaxValue:0, yMinValue:new Date().valueOf(), yStepValue:0, unit : percent ? "%" : unit ,
data: { title: subTitle, subTitle : subTitle, total : 0, list : [ ] }
}
let count = 0;
for (let key in dataMap) {
let value = parseFloat(dataMap[key]);
data.yMaxValue = Math.max(data.yMaxValue, value);
data.yMinValue = Math.min(data.yMinValue, value);
count += value;
data.data.total += value;
}
data.yStepValue = Math.ceil(data.yMaxValue - data.yMinValue / count);
for (let key in dataMap) {
let value = parseFloat(dataMap[key]);
let thisUnit = unit;
if (percent) {
thisUnit = '%';
value = getDecimalForN( value/count, percent);
}
let onceInfo = { key, unit:thisUnit, value };
data.data.list.push(onceInfo)
}
return data;
}
//按需取保留小数长度 tenNumber保留小数位 1位就填1
export function getDecimalForN(number, n) {
let ten = 1;
for (let i = 0; i < n; i ++) {
ten = ten * 10;
}
return Math.ceil(number * ten) / ten
}
//生日获取时间段
export function getAgeByBirthday(birthday:string) {
let b = new Date(birthday).valueOf();
let d = new Date().valueOf();
let onceYear = 365 * 24 * 3600 * 1000;
let age = Math.floor( (d - b) / onceYear );
if (age >= 21 && age <= 30 ) return "21-30";
else if (age >= 31 && age <= 40 ) return "35-45";
else if (age >= 41 && age <= 50 ) return "46-55";
else if (age > 50) return "50岁以上";
else return '其他';
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment