evmtools-node
Version:
このライブラリは、プライムブレインズ社で利用している「進捗管理ツール(Excel)」ファイルを読み込み、 プロジェクトの進捗状況や要員別の作業量を可視化するためのライブラリです。
135 lines • 4.85 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.TaskRowCreatorImpl = void 0;
exports.convertToTaskRow = convertToTaskRow;
exports.checkTaskName = checkTaskName;
const excel_csv_read_write_1 = require("excel-csv-read-write");
const TaskRowFactory_1 = require("./TaskRowFactory");
const common_1 = require("../common");
class TaskRowCreatorImpl {
constructor(_mappings) {
this._mappings = _mappings;
}
// eslint-disable-next-line @typescript-eslint/require-await
async createRowData() {
const header = this._mappings.find((mapping) => mapping[0] === '#');
const taskRowsWithoutParentid = this._mappings
.filter((mapping) => mapping[0] !== '#' && mapping[0] !== undefined)
// .filter((mapping) => mapping[0] === 2) ////////
.filter((mapping) => checkTaskName(mapping))
.map((mapping) => convertToTaskRow(mapping, header));
// console.table(aaa)
const dtos = markLeafRows(addParentIds(taskRowsWithoutParentid));
return TaskRowFactory_1.TaskRowFactory.fromDtos(dtos);
}
}
exports.TaskRowCreatorImpl = TaskRowCreatorImpl;
function toDate(data, index) {
const result =
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
typeof data[index.toString()] === 'number' ? (0, excel_csv_read_write_1.dateFromSn)(data[index.toString()]) : undefined;
return result;
}
// 任意文字列を含むデータ行を TaskRow に変換する関数
function convertToTaskRow(data, header) {
const { level, name } = getTaskName(data);
return {
sharp: Number(data['0']),
id: Number(data['1']),
level,
name,
assignee: toStr(data, 13)?.trim(),
workload: toNumber(data, 14),
startDate: toDate(data, 15),
endDate: toDate(data, 16),
actualStartDate: toDate(data, 17),
actualEndDate: toDate(data, 18),
progressRate: toNumber(data, 19),
scheduledWorkDays: toNumber(data, 20),
pv: toNumber(data, 21),
ev: toNumber(data, 22),
spi: toNumber(data, 23),
expectedProgressDate: toDate(data, 24),
delayDays: toNumber(data, 25),
remarks: toStr(data, 26),
plotMap: extractTaskPlotMapBySerial(data, header),
};
}
function checkTaskName(data) {
const { name } = getTaskName(data);
// console.log(`${level},${name}`, name.trim() !== '')
return name.trim() !== '';
}
function getTaskName(data) {
// タスク名とレベル抽出(LV1~LV9:インデックス4~12)
let level = 0;
let name = '';
for (let i = 4; i <= 12; i++) {
const val = data[i.toString()];
if (typeof val === 'string' && val.trim() !== '') {
level = i - 3;
name = val.trim();
break;
}
}
return {
level,
name,
};
}
function toNumber(data, index) {
const result = typeof data[index.toString()] === 'number' ? (0, common_1.round)(data[index.toString()]) : undefined;
return result;
}
function toStr(data, index) {
const result = typeof data[index.toString()] === 'string' ? data[index.toString()] : undefined;
return result;
}
function addParentIds(rows) {
const stack = [];
const result = [];
for (const row of rows) {
// スタックから、自分のノードレベルと 同レベ以下をPopして除去
while (stack.length > 0 && stack[stack.length - 1].level >= row.level) {
stack.pop();
}
// 同レベ以下を除去したので親levelになってる
const parent = stack[stack.length - 1];
row.parentId = parent ? parent.id : undefined;
// 親になるかもなので、スタックに追加
stack.push(row);
// return する配列
result.push(row);
}
return result;
}
function markLeafRows(rows) {
// 各rowの親IDを集める
const parentIdSet = new Set(rows.map((row) => row.parentId).filter((id) => id !== undefined));
// 親IDセットに出現しないrowは、末端Row
return rows.map((row) => ({
...row,
isLeaf: !parentIdSet.has(row.id),
}));
}
function extractTaskPlotMapBySerial(row, header) {
const map = new Map();
const headerKeys = Object.keys(header);
for (let i = 27; i < headerKeys.length && i < headerKeys.length; i++) {
const col = header[i];
const val = row[i];
if (typeof col === 'number') {
// const result = val ? true : false
if (val) {
map.set(col, true);
}
else {
// map.set(col, false)
}
}
}
return map;
}
// export * from './TaskNode'
// export * from './TaskRow'
//# sourceMappingURL=TaskRowCreatorImpl.js.map