施肥計画編集: ページ開時に自動計算・≈を入力値にも適用
- 編集画面を開いた際、保存済みcalc_settingsで自動計算しcalcMatrixを生成 → 計算ボタンを押さなくてもラベルが表示されるようになる - roundColumn(≈)がcalcMatrixにない場合はadjusted値を丸めるよう修正 → 計算ボタンを押さなくても≈で整数丸めが効くようになる Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -103,13 +103,41 @@ export default function FertilizerEditPage({ planId }: { planId?: number }) {
|
|||||||
const fields = fieldsRes.data.filter((f: Field) => fieldIds.includes(f.id));
|
const fields = fieldsRes.data.filter((f: Field) => fieldIds.includes(f.id));
|
||||||
setSelectedFields(fields);
|
setSelectedFields(fields);
|
||||||
|
|
||||||
// 保存済みの値は adjusted に復元(calc値はなし)
|
// 保存済みの値は adjusted に復元
|
||||||
const newAdjusted: Matrix = {};
|
const newAdjusted: Matrix = {};
|
||||||
plan.entries.forEach((e) => {
|
plan.entries.forEach((e) => {
|
||||||
if (!newAdjusted[e.field]) newAdjusted[e.field] = {};
|
if (!newAdjusted[e.field]) newAdjusted[e.field] = {};
|
||||||
newAdjusted[e.field][e.fertilizer] = String(e.bags);
|
newAdjusted[e.field][e.fertilizer] = String(e.bags);
|
||||||
});
|
});
|
||||||
setAdjusted(newAdjusted);
|
setAdjusted(newAdjusted);
|
||||||
|
|
||||||
|
// 保存済み calc_settings でページ開時に自動計算してラベル用 calcMatrix を生成
|
||||||
|
const validSettings = plan.calc_settings?.filter((s) => s.param) ?? [];
|
||||||
|
if (validSettings.length > 0 && fieldIds.length > 0) {
|
||||||
|
try {
|
||||||
|
const calcResults = await Promise.all(
|
||||||
|
validSettings.map((s) =>
|
||||||
|
api.post('/fertilizer/calculate/', {
|
||||||
|
method: s.method,
|
||||||
|
param: parseFloat(s.param),
|
||||||
|
fertilizer_id: s.fertilizer_id,
|
||||||
|
field_ids: fieldIds,
|
||||||
|
})
|
||||||
|
)
|
||||||
|
);
|
||||||
|
const newCalcMatrix: Matrix = {};
|
||||||
|
validSettings.forEach((s, i) => {
|
||||||
|
const results: { field_id: number; bags: number }[] = calcResults[i].data;
|
||||||
|
results.forEach(({ field_id, bags }) => {
|
||||||
|
if (!newCalcMatrix[field_id]) newCalcMatrix[field_id] = {};
|
||||||
|
newCalcMatrix[field_id][s.fertilizer_id] = String(bags);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
setCalcMatrix(newCalcMatrix);
|
||||||
|
} catch {
|
||||||
|
// 自動計算失敗はサイレントに無視(ラベルなしで表示継続)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch (e: unknown) {
|
} catch (e: unknown) {
|
||||||
const err = e as { response?: { status?: number; data?: unknown } };
|
const err = e as { response?: { status?: number; data?: unknown } };
|
||||||
@@ -255,13 +283,13 @@ export default function FertilizerEditPage({ planId }: { planId?: number }) {
|
|||||||
});
|
});
|
||||||
setRoundedColumns((prev) => { const next = new Set(prev); next.delete(fertId); return next; });
|
setRoundedColumns((prev) => { const next = new Set(prev); next.delete(fertId); return next; });
|
||||||
} else {
|
} else {
|
||||||
// 四捨五入: calc値を整数に丸めて adjusted に書き込む
|
// 四捨五入: calc値(なければ現在の入力値)を整数に丸めて adjusted に書き込む
|
||||||
setAdjusted((prev) => {
|
setAdjusted((prev) => {
|
||||||
const next = { ...prev };
|
const next = { ...prev };
|
||||||
selectedFields.forEach((field) => {
|
selectedFields.forEach((field) => {
|
||||||
const calc = calcMatrix[field.id]?.[fertId];
|
const raw = calcMatrix[field.id]?.[fertId] ?? prev[field.id]?.[fertId];
|
||||||
if (calc !== undefined && calc !== '') {
|
if (raw !== undefined && raw !== '') {
|
||||||
const v = parseFloat(calc);
|
const v = parseFloat(raw);
|
||||||
if (!isNaN(v)) {
|
if (!isNaN(v)) {
|
||||||
if (!next[field.id]) next[field.id] = {};
|
if (!next[field.id]) next[field.id] = {};
|
||||||
next[field.id][fertId] = String(Math.round(v));
|
next[field.id][fertId] = String(Math.round(v));
|
||||||
@@ -596,8 +624,8 @@ export default function FertilizerEditPage({ planId }: { planId?: number }) {
|
|||||||
{planFertilizers.map((fert) => {
|
{planFertilizers.map((fert) => {
|
||||||
const calcVal = calcMatrix[field.id]?.[fert.id];
|
const calcVal = calcMatrix[field.id]?.[fert.id];
|
||||||
const adjVal = adjusted[field.id]?.[fert.id];
|
const adjVal = adjusted[field.id]?.[fert.id];
|
||||||
// adjusted が設定されているときだけ灰色参照を表示(丸め後)
|
// 計算結果があればラベルを表示(adjusted が上書きされた場合は参照値として)
|
||||||
const showRef = adjVal !== undefined && calcVal !== undefined;
|
const showRef = calcVal !== undefined;
|
||||||
// 入力欄: adjusted → calc値 → 空
|
// 入力欄: adjusted → calc値 → 空
|
||||||
const inputValue = adjVal !== undefined ? adjVal : (calcVal ?? '');
|
const inputValue = adjVal !== undefined ? adjVal : (calcVal ?? '');
|
||||||
return (
|
return (
|
||||||
|
|||||||
Reference in New Issue
Block a user