diff --git a/backend/apps/fields/views.py b/backend/apps/fields/views.py index 58824cb..44d7df6 100644 --- a/backend/apps/fields/views.py +++ b/backend/apps/fields/views.py @@ -79,15 +79,28 @@ def import_yoshida_fields(request): created_count = 0 updated_count = 0 + def clean_int_str(val): + if pd.isna(val): + return None + s = str(val).strip() + if not s: + return None + if s.endswith('.0'): + s = s[:-2] + return s + for _, row in df.iterrows(): name = str(row.get('名称', '')).strip() if pd.notna(row.get('名称')) else '' if not name: continue - raw_kyosai_k = str(int(row.get('細目_耕地番号', 0))) if pd.notna(row.get('細目_耕地番号')) else None - raw_kyosai_s = str(int(row.get('細目_分筆番号', 0))) if pd.notna(row.get('細目_分筆番号')) else None - raw_chusankan = str(int(row.get('中山間_ID', 0))) if pd.notna(row.get('中山間_ID')) else None + raw_kyosai_k = clean_int_str(row.get('細目_耕地番号')) + raw_kyosai_s = clean_int_str(row.get('細目_分筆番号')) + raw_chusankan_str = clean_int_str(row.get('中山間_ID')) + raw_chusankan_ids = [] + if raw_chusankan_str: + raw_chusankan_ids = [cid.strip() for cid in raw_chusankan_str.split(',') if cid.strip()] area_tan = float(row.get('面積(反)', 0)) if pd.notna(row.get('面積(反)')) else 0 area_m2 = int(area_tan * 1000) if area_tan else 0 @@ -99,7 +112,7 @@ def import_yoshida_fields(request): 'owner_name': str(row.get('地主', '')).strip() if pd.notna(row.get('地主')) else '', 'raw_kyosai_k_num': raw_kyosai_k, 'raw_kyosai_s_num': raw_kyosai_s, - 'raw_chusankan_id': raw_chusankan, + 'raw_chusankan_id': raw_chusankan_str, } field, created = Field.objects.update_or_create( @@ -121,9 +134,11 @@ def import_yoshida_fields(request): except OfficialKyosaiField.MultipleObjectsReturned: pass - if raw_chusankan: + for cid in raw_chusankan_ids: + if not cid: + continue try: - chusankan_record = OfficialChusankanField.objects.get(c_id=raw_chusankan) + chusankan_record = OfficialChusankanField.objects.get(c_id=cid) field.chusankan_fields.add(chusankan_record) except OfficialChusankanField.DoesNotExist: pass @@ -155,17 +170,29 @@ def import_chusankan_master(request): updated_count = 0 for _, row in df.iterrows(): - c_id = str(row.get('ID', '')).strip() if pd.notna(row.get('ID')) else '' + raw_id = row.get('ID') + c_id = str(raw_id).strip() if pd.notna(raw_id) else '' if not c_id: continue + if not any(char.isdigit() for char in c_id): + continue + + try: + payment_amount_val = row.get('交付金額') + if pd.notna(payment_amount_val): + payment_amount = int(payment_amount_val) + else: + payment_amount = None + except (ValueError, TypeError): + payment_amount = None defaults = { 'oaza': str(row.get('大字', '')).strip() if pd.notna(row.get('大字')) else '', 'aza': str(row.get('字', '')).strip() if pd.notna(row.get('字')) else '', 'chiban': str(row.get('地番', '')).strip() if pd.notna(row.get('地番')) else '', 'area': float(row.get('農地面積', 0)) if pd.notna(row.get('農地面積')) else 0, - 'payment_amount': int(row.get('交付金額', 0)) if pd.notna(row.get('交付金額')) else None, + 'payment_amount': payment_amount, } obj, created = OfficialChusankanField.objects.update_or_create( diff --git a/backend/chusankan.ods b/backend/chusankan.ods new file mode 100644 index 0000000..d364a84 Binary files /dev/null and b/backend/chusankan.ods differ diff --git a/backend/yoshida.ods b/backend/yoshida.ods new file mode 100644 index 0000000..18b4f77 Binary files /dev/null and b/backend/yoshida.ods differ