Issue #2 に最新の理解を記録し、その内容で仕様書と実装を修正しました。

document/16_マスタードキュメント_田植え計画編.md は、「行ごとに保持するのは圃場の苗箱数」「列側に反当苗箱枚数を持つ」「種もみg/箱 は全体共通値」という前提に更新しています。コード側は backend/apps/plans/models.py と backend/apps/plans/serializers.py で計画ヘッダに seedling_boxes_per_tan を追加し、backend/apps/plans/migrations/0007_ricetransplantplan_seedling_boxes_per_tan.py も作成しました。画面は frontend/src/app/rice-transplant/_components/RiceTransplantEditPage.tsx を施肥計画寄りに組み直し、列単位のデフォルト反映と四捨五入、行ごとの苗箱数入力に寄せています。frontend/src/types/index.ts も合わせて更新済みです。

確認できたのはバックエンドの構文チェックまでで、python3 -m py_compile backend/apps/plans/models.py backend/apps/plans/serializers.py backend/apps/plans/views.py は通過しています。フロントのビルド確認まではこの環境では回していません。Issue #2 にも今回の反映内容をコメント済みです。
This commit is contained in:
akira
2026-04-05 10:53:24 +09:00
parent 95c90dd699
commit 11b36b28a5
6 changed files with 275 additions and 219 deletions

View File

@@ -0,0 +1,16 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('plans', '0006_rename_seedling_boxes_per_tan_to_installed_seedling_boxes'),
]
operations = [
migrations.AddField(
model_name='ricetransplantplan',
name='seedling_boxes_per_tan',
field=models.DecimalField(decimal_places=2, default=0, max_digits=6, verbose_name='反当苗箱枚数'),
),
]

View File

@@ -71,6 +71,12 @@ class RiceTransplantPlan(models.Model):
default=0,
verbose_name='苗箱1枚あたり種もみ(g)デフォルト',
)
seedling_boxes_per_tan = models.DecimalField(
max_digits=6,
decimal_places=2,
default=0,
verbose_name='反当苗箱枚数',
)
notes = models.TextField(blank=True, default='', verbose_name='備考')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

View File

@@ -49,8 +49,8 @@ class RiceTransplantEntrySerializer(serializers.ModelSerializer):
read_only=True,
)
planned_boxes = serializers.SerializerMethodField()
planned_seed_kg = serializers.SerializerMethodField()
default_seedling_boxes = serializers.SerializerMethodField()
planned_seed_kg = serializers.SerializerMethodField()
class Meta:
model = RiceTransplantEntry
@@ -60,7 +60,6 @@ class RiceTransplantEntrySerializer(serializers.ModelSerializer):
'field_name',
'field_area_tan',
'installed_seedling_boxes',
'seed_grams_per_box',
'default_seedling_boxes',
'planned_boxes',
'planned_seed_kg',
@@ -68,7 +67,7 @@ class RiceTransplantEntrySerializer(serializers.ModelSerializer):
def get_default_seedling_boxes(self, obj):
area = Decimal(str(obj.field.area_tan))
default_boxes_per_tan = obj.plan.variety.default_seedling_boxes_per_tan
default_boxes_per_tan = obj.plan.seedling_boxes_per_tan
return str((area * default_boxes_per_tan).quantize(Decimal('0.01')))
def get_planned_boxes(self, obj):
@@ -76,7 +75,7 @@ class RiceTransplantEntrySerializer(serializers.ModelSerializer):
def get_planned_seed_kg(self, obj):
seed_kg = (
obj.installed_seedling_boxes * obj.seed_grams_per_box / Decimal('1000')
obj.installed_seedling_boxes * obj.plan.default_seed_grams_per_box / Decimal('1000')
).quantize(Decimal('0.001'))
return str(seed_kg)
@@ -101,6 +100,7 @@ class RiceTransplantPlanSerializer(serializers.ModelSerializer):
'variety_name',
'crop_name',
'default_seed_grams_per_box',
'seedling_boxes_per_tan',
'notes',
'entries',
'field_count',
@@ -126,7 +126,7 @@ class RiceTransplantPlanSerializer(serializers.ModelSerializer):
total = sum(
(
entry.installed_seedling_boxes
* entry.seed_grams_per_box
* obj.default_seed_grams_per_box
/ Decimal('1000')
)
for entry in obj.entries.all()
@@ -152,6 +152,7 @@ class RiceTransplantPlanWriteSerializer(serializers.ModelSerializer):
'year',
'variety',
'default_seed_grams_per_box',
'seedling_boxes_per_tan',
'notes',
'entries',
]
@@ -192,5 +193,5 @@ class RiceTransplantPlanWriteSerializer(serializers.ModelSerializer):
plan=plan,
field_id=entry['field_id'],
installed_seedling_boxes=entry['installed_seedling_boxes'],
seed_grams_per_box=entry['seed_grams_per_box'],
seed_grams_per_box=plan.default_seed_grams_per_box,
)