מאגר חלקות קרקע · AfifAI
מקרה בוחן · PropTech ו־⁠GIS · 2025

מאגר חלקות קרקע שממלא את הכתובות בעצמו

מערכת בק־אופיס לחברת קרקעות ונדל״ן ישראלית, לניהול תיק החלקות שלה לפי גוש וחלקה. תהליך רקע מושך את הכתובת של כל חלקה משירות ה־⁠GIS הלאומי, ובקליק אחד החלקה נפתחת מסומנת על המפה הלאומית. קודם שני הדברים האלה נעשו ידנית.

⁦.NET 8⁩ Web APIEF Core · SQL ServerReact 18 · TypeScriptAnt Design · Redux Toolkitממשקי GIS לאומייםAWS S3JWT
לקוח
חברת קרקעות ונדל״ן ישראלית (חסוי)
התפקיד שלי
ראש צוות, ארכיטקט ומפתח בפועל
לוח זמנים
אפריל–אוגוסט 2025 · כ־⁠4 חודשים, 2 ריפוזיטוריז
סטטוס
נמסר
במבט אחד
25 שעות ← 10 דקותבערך, לאיתור כתובות ל־⁠1,000 חלקות: חיפושים ידניים ב־⁠GIS מול תהליך רקע אוטומטי (הערכה)
דקה ← קליקבערך, כדי לראות חלקה על המפה הלאומית, עם הגוש והחלקה מסומנים (הערכה)
12 + 8מסננים ועמודות למיון, וכולם נשמרים ב־⁠URL כך שאפשר לשתף תצוגה
0אפשרות לחלקות כפולות: מפתחות ייחודיים על גוש + חלקה ועל תת־חלקות
23נקודות קצה REST ב־⁠5 קונטרולרים
11טבלאות, כולל 55 קודי ייעוד קרקע ו־⁠5 סוגי בעלות שנטענו מראש
122שכבות של המפה הלאומית שהוגדרו במפה המוטמעת
3 שבועותמ־⁠API ריק ועד CRUD, מדיה והתחברות שעובדים
הבעיה

תיק חלקות שמנוהל ידנית

בישראל קרקע מזוהה לפי מספר גוש ומספר חלקה. החברה מנהלת תיק גדול של חלקות כאלה, ולכל אחת יש סוג בעלות, שיטת רישום, ייעוד, שטח, תת־חלקות ומסמכים נלווים. שתי משימות יומיומיות נעשו ידנית. כדי למצוא כתובת של חלקה היה צריך לחפש בפורטל ה־⁠GIS הלאומי, חלקה אחרי חלקה, ולהעתיק את התוצאה. כדי לראות איפה החלקה נמצאת היה צריך לפתוח שוב את הפורטל ולהקליד את המספרים. ולא הייתה דרך פשוטה לדעת אילו רשומות עדיין חסרות נתונים.

מה הובלתי

ארכיטקטורה, צד שרת ואפליקציית הניהול

  • תכננתי את פתרון ה־⁠⁦.NET 8⁩ בשכבות (API, שירותים, אחסון, DB) ואת סכמת ה־⁠SQL Server, כולל דגל השלמות המחושב והמפתחות הייחודיים.
  • בניתי את ה־⁠worker להעשרת כתובות, שפונה ל־⁠API החיפוש של ה־⁠GIS הלאומי בקבוצות קטנות, בקצב מבוקר ועם יכולת המשך.
  • בניתי את אפליקציית הניהול ב־⁠React: רשימת חלקות עם 12 מסננים ו־⁠8 עמודות למיון, מצב שמסונכרן ל־⁠URL, עמוד חלקה עם מדיה, והמפה הלאומית המוטמעת.
  • בניתי התחברות JWT עם refresh tokens, והעלאת קבצים ל־⁠S3.
  • הקמתי את זרימת הענפים Dev → QA → Stage → Production ואת בדיקת ה־⁠lint שרצה לפני כל commit.
ארכיטקטורה

API אחד, worker אחד, וה־⁠GIS הלאומי כמקור חיצוני

התרשים רחב מהמסך: החליקו הצידה לצפייה בכולו →

ה־⁠worker רץ בתוך שרת ה־⁠API, כך שאין עוד רכיב לפרוס. הוא שומר את התשובה הגולמית מה־⁠GIS לצד הכתובת המפוענחת לצורכי בקרה, ונקודת הקצה של הרשימה משמיטה את העמודה הזאת כדי שעמודי הרשימה יישארו קלים.

החלטות תכנון

שה־⁠DB וה־⁠worker יעשו את העבודה השחורה

שלמות הרשומה כעמודה מחושבת ושמורה

רשומה נחשבת ”הושלמה” כשיש לה כתובת, שטח וייעוד. ה־⁠SQL Server מחשב ושומר את הדגל, כך שהרשימה מציגה וממיינת לפי סטטוס בלי קוד אפליקטיבי שצריך לשמור מסונכרן. המחיר: שינוי בכלל דורש שינוי סכמה ולא רק שינוי הגדרה.

worker שממשיך מאיפה שעצר, לא ייבוא חד־פעמי

ה־⁠worker בוחר חלקות שעוד לא עודכנו, בקבוצות קטנות ומסודרות, ומרווח בין הקריאות 100 מילישניות. חלקות חדשות מועשרות אוטומטית, ואחרי הפעלה מחדש הוא ממשיך מאיפה שעצר. המחיר: הכתובות מתמלאות תוך דקות ולא מיד.

להטמיע את המפה הלאומית ולא לבנות מפה משלנו

אפליקציית הניהול טוענת את מפת ה־⁠JavaScript של ה־⁠GIS הלאומי ומסמנת קודם את הגוש ואז את החלקה. הלקוח מקבל את השכבות הקדסטריות הרשמיות בלי עלות. המחיר: סקריפט צד שלישי עם תלות ב־⁠jQuery ותזמון טעינה משלו, שדרש טיפול זהיר (פירוט בהמשך).

כל מצב הרשימה נשמר ב־⁠URL

מסננים, מיון ועימוד נכתבים ל־⁠query string ונקראים ממנו בטעינה. תצוגה מסוננת שורדת רענון ואפשר לשלוח אותה לעמית כקישור. המחיר: יותר קוד פענוח, כולל מסננים עם כמה ערכים.

יומן הנדסי

בעיות שנתקלנו בהן, ואיך פתרנו

23 באפריל

תת־חלקות לא התאימו לשורת החלקה

לחלקה יכול להיות כל מספר של תת־חלקות. כשהן נשמרו בתוך רשומת החלקה, הסינון והוולידציה הסתבכו.

העברתי את תת־החלקות לטבלה נפרדת עם מפתח ייחודי (חלקה, תת־חלקה). בעדכון מחליפים את כל הסט בבת אחת, כך שאין עריכות חלקיות.

23 באפריל

חלקות כפולות

אפשר היה להזין את אותו גוש וחלקה פעמיים, ואז המדיה וההיסטוריה מתפצלות בין שתי רשומות.

הוספתי אינדקס ייחודי על גוש + חלקה, כך שה־⁠DB דוחה כפילויות לא משנה מאיזה מסלול הנתונים מגיעים.

27 באפריל – 12 במאי

מסננים שנעלמים ברענון

משתמשים איבדו את המסננים ואת העמוד בכל רענון או מעבר מקישור. בנוסף, ערכי ברירת מחדל דרסו ערכים שהגיעו מה־⁠URL.

העברתי את מצב הטבלה ל־⁠query string עם פענוח מוקלד. ברירות המחדל חלות רק כשערך חסר. גודל העמוד קבוע על 100, ומיון ברירת המחדל הוא לפי גוש ואז חלקה.

29 באפריל – 11 באוגוסט

המפה לא הייתה מוכנה כשהנתונים הגיעו

סקריפט המפה הלאומית נטען באופן אסינכרוני. סימון חלקה לפני שהמפה אותחלה נכשל בשקט, בלי שום שגיאה.

טוענים את הסקריפט לפי דרישה, בודקים כל 100 מילישניות אם ממשק המפה זמין (עם timeout של 7 שניות), ומסמנים גוש וחלקה רק כשגם המפה וגם נתוני החלקה מוכנים.

תהליך רקע

חלקה בעייתית אחת לא אמורה לעצור את הריצה

חלק מצמדי הגוש/חלקה מחזירים מה־⁠GIS תוצאה ריקה או שגיאה.

כל חלקה מטופלת בנפרד ונרשמת ללוג עם הגוש והחלקה שלה. קבוצה שנכשלה ממתינה לפני המחזור הבא. תוצאה ריקה אף פעם לא דורסת כתובת קיימת.

28 באפריל

מדיה כקישורים וגם כקבצים

כל חלקה צריכה מסמכים: קישורים חיצוניים, קבצים שהועלו, או גם וגם.

בניתי טופס מדיה אחד ששולח multipart/form-data ל־⁠API, שמאחסן את הקבצים ב־⁠S3. בעריכה הקובץ הקיים נשמר, אלא אם הועלה קובץ חדש.

לפני / אחרי

כתובת ומיקום של חלקה אחת

זמני השלבים הם הערכות שמרניות להמחשה ולא מדידות. שלב הכתובת ב”אחרי” רץ בלי מעורבות של אף אחד.

תוצאה

איפה זה נחת

משימה
לפני
אחרי
כתובות ל־⁠1,000 חלקות
כ־⁠25 שעות של העתק־הדבק מפורטל ה־⁠GIS
כ־⁠10 דקות, תהליך רקע בלי מגע ידהערכה
לראות חלקה על המפה
כדקה: לפתוח את הפורטל ולהקליד גוש וחלקה
קליק אחד מהרשימה, כבר מסומנתהערכה
אילו רשומות חסרות?
בדיקה ידנית של כל שורה
עמודת סטטוס שמחושבת ב־⁠DBמהקוד
חלקות כפולות
אפשריות
נדחות על ידי מפתחות ייחודייםמהקוד
שיתוף תצוגה מסוננת
לתאר את המסננים בהודעה
לשלוח את ה־⁠URLמהקוד
מסמכי החלקה
מפוזרים בתיקיות
קישורים וקבצים שמשויכים לכל חלקהמהקוד
טכנולוגיות

טכנולוגיות

צד שרת
⁦.NET 8⁩ Web API, שירותים בשכבות, AutoMapper, NLog, Swagger
נתונים
SQL Server, EF Core 8, עמודות מחושבות, SSDT schema compare
עבודת רקע
Hosted BackgroundService, לקוח HTTP עם קצב מבוקר
צד לקוח
React 18, TypeScript, Vite, Ant Design, Redux Toolkit, react-hook-form, i18next (עברית, RTL)
מפות
ממשק ה־⁠JavaScript וממשק החיפוש של ה־⁠GIS הלאומי
אבטחה וקבצים
JWT עם refresh tokens, AWS S3

שיחת אבחון חינם · 30 דקות · ללא התחייבות

הביאו תהליך אחד. קבלו תוכנית ומספר לשפר.

כתבו בכמה שורות: איזה תהליך או מערכת, מה כואב היום (זמן, טעויות, עלויות או פיילוט AI שנתקע) ומי עובד עם זה. אחרי שיחה קצרה מקבלים תוך כ־3 ימים תוכנית כתובה והצעת מחיר סגורה.

לשיחת אבחון חינםafif.mansour@gmail.com

נפתח מייל מוכן מראש · מענה תוך יום עסקים

ה־AI קורא. הקוד סופר.

כל הפרויקטים