1
This commit is contained in:
2026-04-14 13:46:56 +08:00
parent 55c27e77bf
commit e4f88965ac

View File

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