UNPKG

evmtools-node

Version:

このライブラリは、プライムブレインズ社で利用している「進捗管理ツール(Excel)」ファイルを読み込み、 プロジェクトの進捗状況や要員別の作業量を可視化するためのライブラリです。

135 lines 4.85 kB
"use strict"; 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