1
1
This commit is contained in:
88
src/App.tsx
88
src/App.tsx
@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user