diff --git a/src/App.tsx b/src/App.tsx index b21f474..fc43dfb 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -917,6 +917,20 @@ export default function App() { .toLowerCase(); }; + const getMeaningfulAdjustedTimelineValue = (value: any): number | null => { + const n = Number(value); + if (!Number.isFinite(n)) return null; + // 约定:adjustedTimelineValue=0 为占位值,不作为有效调整时效使用 + return n === 0 ? null : n; + }; + + const getNodeBaseTimelineValue = (node: any): number => { + const base = Number(node?.timelineValue); + if (Number.isFinite(base)) return base; + const adjusted = getMeaningfulAdjustedTimelineValue(node?.adjustedTimelineValue); + return adjusted ?? 0; + }; + const remapTimelineAdjustmentsToNewResults = ( prevResults: any[], nextResults: any[] @@ -936,7 +950,18 @@ export default function App() { } const base = Number(r?.timelineValue); const adjusted = Number(r?.adjustedTimelineValue); - if (Number.isFinite(base) && Number.isFinite(adjusted)) { + const hasAdjustmentEvidence = + extractText(r?.adjustmentDescription).trim().length > 0 || + r?.dateAdjustmentRule !== null || + r?.startDateRule !== null; + // 源快照里 adjustedTimelineValue=0 常作为占位值,不代表真实人工调整,需严格过滤 + if ( + Number.isFinite(base) && + Number.isFinite(adjusted) && + adjusted !== 0 && + adjusted !== base && + hasAdjustmentEvidence + ) { const d = adjusted - base; if (Number.isFinite(d) && d !== 0) { const existed = prevAdjustmentByName.get(name); @@ -1746,8 +1771,8 @@ export default function App() { // 扁平化结构中,每个快照都包含完整的节点数据 if (nodeSnapshot.isCompleteSnapshot) { // 确保adjustedTimelineValue有正确的默认值 - const adjustedTimelineValue = nodeSnapshot.adjustedTimelineValue !== undefined ? - nodeSnapshot.adjustedTimelineValue : nodeSnapshot.timelineValue; + const meaningfulAdjusted = getMeaningfulAdjustedTimelineValue(nodeSnapshot.adjustedTimelineValue); + const adjustedTimelineValue = meaningfulAdjusted ?? nodeSnapshot.timelineValue; // 处理日期格式,优先使用时间戳格式 let estimatedStart = nodeSnapshot.estimatedStart; @@ -3919,11 +3944,7 @@ export default function App() { const newAdjustment = currentAdjustment + adjustment; // 允许调整后的时效值为负数,用于向前回退结束时间 - const baseValue = (typeof timelineResults[nodeIndex]?.timelineValue === 'number') - ? timelineResults[nodeIndex]!.timelineValue - : (typeof timelineResults[nodeIndex]?.adjustedTimelineValue === 'number') - ? timelineResults[nodeIndex]!.adjustedTimelineValue - : 0; + const baseValue = getNodeBaseTimelineValue(timelineResults[nodeIndex]); // 检查当前调整的节点是否为周转周期节点 const currentNodeName = timelineResults[nodeIndex]?.nodeName; @@ -3961,11 +3982,7 @@ export default function App() { for (let i = 0; i < updatedResults.length; i++) { const result = updatedResults[i]; - const baseTimelineValue = (typeof result.timelineValue === 'number') - ? result.timelineValue - : (typeof result.adjustedTimelineValue === 'number') - ? result.adjustedTimelineValue - : 0; + const baseTimelineValue = getNodeBaseTimelineValue(result); const nodeKey = buildTimelineAdjustmentKey(result, i); const adjustment = adjustments[nodeKey] || 0; const adjustedTimelineValue = baseTimelineValue + adjustment; @@ -4089,11 +4106,7 @@ export default function App() { for (let i = updatedResults.length - 1; i >= 0; i--) { const result = updatedResults[i]; - const baseTimelineValue = (typeof result.timelineValue === 'number') - ? result.timelineValue - : (typeof result.adjustedTimelineValue === 'number') - ? result.adjustedTimelineValue - : 0; + const baseTimelineValue = getNodeBaseTimelineValue(result); const nodeKey = buildTimelineAdjustmentKey(result, i); const adjustment = adjustments[nodeKey] || 0; const adjustedTimelineValue = baseTimelineValue + adjustment; @@ -4151,12 +4164,7 @@ export default function App() { if (!Array.isArray(nodes) || nodes.length === 0 || roundedExtra === 0) return {}; const isTurnover = (node: any) => node?.nodeName === '周转周期'; - const toBase = (node: any) => { - const v = typeof node?.timelineValue === 'number' - ? node.timelineValue - : (typeof node?.adjustedTimelineValue === 'number' ? node.adjustedTimelineValue : 0); - return Number.isFinite(v) ? v : 0; - }; + const toBase = (node: any) => getNodeBaseTimelineValue(node); const eligible = nodes .map((n, i) => ({ i, base: toBase(n), turnover: isTurnover(n), excluded: !!excluded?.[i] })) @@ -4435,11 +4443,7 @@ export default function App() { // 只重新计算从第一个调整节点开始的后续节点 for (let i = firstAdjustedIndex; i < updatedResults.length; i++) { const result = updatedResults[i]; - const baseTimelineValue = (typeof result.timelineValue === 'number') - ? result.timelineValue - : (typeof result.adjustedTimelineValue === 'number') - ? result.adjustedTimelineValue - : 0; + const baseTimelineValue = getNodeBaseTimelineValue(result); const nodeKey = buildTimelineAdjustmentKey(result, i); const adjustment = adjustments[nodeKey] || 0; const adjustedTimelineValue = baseTimelineValue + adjustment; @@ -6980,9 +6984,7 @@ const omsVersionColumns = [ } ]} dataSource={nodes.map((n, index) => { - const base = typeof n?.timelineValue === 'number' - ? n.timelineValue - : (typeof n?.adjustedTimelineValue === 'number' ? n.adjustedTimelineValue : 0); + const base = getNodeBaseTimelineValue(n); return { key: index, index, @@ -7360,11 +7362,7 @@ const omsVersionColumns = [ {timelineResults.map((result, index) => { const nodeKey = buildTimelineAdjustmentKey(result, index); const adjustment = timelineAdjustments[nodeKey] || 0; - const baseValue = (typeof result.timelineValue === 'number') - ? result.timelineValue - : (typeof result.adjustedTimelineValue === 'number') - ? result.adjustedTimelineValue - : 0; + const baseValue = getNodeBaseTimelineValue(result); const adjustedValue = baseValue + adjustment; // 检查是否为周转周期节点 @@ -7375,11 +7373,7 @@ const omsVersionColumns = [ if (r.nodeName === '周转周期') { const k = buildTimelineAdjustmentKey(r, i); const adj = timelineAdjustments[k] || 0; - const baseVal = (typeof r.timelineValue === 'number') - ? r.timelineValue - : (typeof r.adjustedTimelineValue === 'number') - ? r.adjustedTimelineValue - : 0; + const baseVal = getNodeBaseTimelineValue(r); return (baseVal + adj) === 0; } return false; @@ -7540,11 +7534,7 @@ const omsVersionColumns = [ const desiredBusinessDays = Math.round(hi * 2) / 2; // 与UI保持0.5粒度一致 // 目标调整量 = 目标工作日数 - 基准时效值 - const baseValue = (typeof currentResult.timelineValue === 'number') - ? currentResult.timelineValue - : (typeof currentResult.adjustedTimelineValue === 'number') - ? currentResult.adjustedTimelineValue - : 0; + const baseValue = getNodeBaseTimelineValue(currentResult); const desiredAdjustmentAbs = desiredBusinessDays - baseValue; const currentAdj = timelineAdjustments[nodeKey] || 0; @@ -7579,9 +7569,7 @@ const omsVersionColumns = [ disabled={isTurnoverNode} onClick={() => { try { - const baseTimelineValue = (typeof result.timelineValue === 'number') - ? result.timelineValue - : (typeof result.adjustedTimelineValue === 'number' ? result.adjustedTimelineValue : 0); + const baseTimelineValue = getNodeBaseTimelineValue(result); const currentAdj = timelineAdjustments[nodeKey] || 0; const targetAdj = -baseTimelineValue; const deltaToApply = targetAdj - currentAdj;