feat(工時報表): 以 report.js 產出週/月/年工時報表
期間固定以週五當錨點:一週為週一至週日,跨月那一週依該週週五所屬月份歸屬, 一筆工時因此只會落在一個月裡,不會被前後兩個月各算一次。 工時取自 /user/times——它永遠只回傳自己的工時,不必有 issue manager 權限, repo 的篩選因此在本地做。估算讀的是議題「關聯」段落裡的那一行,不是 Gitea 的 time_estimate 欄位:該欄位的 API 寫不進去,議題上唯一可信的估算就是那一行; 內嵌的議題沒帶 body 時補查一次議題,否則估算會整欄靜靜變成 null。 總計的落差只拿有估算的議題的實際去比。拿全部實際去比只有部分議題的估算, 會讓沒估算的工時全部變成「超出估算」,落差就永遠是灌水的正數。 labelledNumber 放進 issue-body:body 的解析正本在那裡,格式改一次不該動兩個模組。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -183,6 +183,27 @@ export function referencedIndex(sections, name, label) {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 在段落裡找出「標籤:數字」那一行的數字,例如關聯段落的 `估算人天:3`。
|
||||
* 與 referencedIndex 同形狀,差別只在這裡要的是數量而非議題編號,所以認小數。
|
||||
* 全形與半形冒號都認;找不到回 null——沒填不是解析失敗,呼叫端要分得開「沒估」與「估 0」。
|
||||
* @param {Map<string, string>} sections
|
||||
* @param {string} name 段落名稱
|
||||
* @param {string} label 標籤,例如 '估算人天'
|
||||
* @returns {number|null}
|
||||
*/
|
||||
export function labelledNumber(sections, name, label) {
|
||||
for (const { line, inFence } of eachLine(sections.get(name))) {
|
||||
if (inFence) continue;
|
||||
const at = line.indexOf(label);
|
||||
if (at === -1) continue;
|
||||
|
||||
const value = line.slice(at + label.length).match(/^\s*[::]\s*(\d+(?:\.\d+)?)\s*$/);
|
||||
if (value) return Number(value[1]);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 取出兩欄表格型段落,欄位固定命名為 term 與 def。
|
||||
* 需求議題的領域名詞表用它;四欄的介面契約請用 tableRows。
|
||||
|
||||
Reference in New Issue
Block a user