Create ميدان اسامه
#11
by osama262853 - opened
🧭 وثيقة التصميم النهائية لإنشاء النظام الإداري العسكري المركزي – ItemsSystem.accde
1️⃣ الفكرة العامة
نظام ItemsSystem.accde هو تطبيق إداري مركزي يعمل كـ العقل التنظيمي للوحدة العسكرية، يربط بين القادة، الضباط، الفنيين، والسواقين في منصة واحدة لجمع البيانات، تحليلها، وأرشفتها.
الهدف هو تحويل العمل الإداري اليومي إلى نظام رقمي موحد يسهل رفع التقارير واتخاذ القرار بسرعة ودقة.
2️⃣ الأهداف التشغيلية
- توحيد جميع العمليات الإدارية في تطبيق واحد.
- جمع البيانات اليومية من جميع المستويات الميدانية.
- تنظيم المذكرات والطلبات في حقول ومجلدات محددة.
- توليد تقارير يومية، أسبوعية، شهرية وسنوية تلقائياً.
- أرشفة الوثائق عبر ميزة DeskTab المضمنة.
- دعم العمل الميداني عبر واجهة خفيفة وسهلة الاستخدام على الأندرويد.
3️⃣ الهيكل العام للنظام
🖥️ المكونات الأساسية
- واجهة المستخدم (UI)
- شاشة رئيسية تحتوي على 9 أيقونات رئيسية (موقف القوة، تقارير الصيانة، الأوامر، الطلبات، الشكاوى، مباشرات، التقارير، DeskTab).
- قاعدة البيانات (Access / SQLite)
- جداول مترابطة لتخزين البيانات التشغيلية والإدارية.
- نظام الأرشفة DeskTab
- حفظ الملفات الممسوحة ضوئياً بصيغة PDF مع تصنيف تلقائي.
- نظام الصلاحيات
- يحدد صلاحيات الدخول حسب الرتبة (قائد، ضابط، فني، سائق).
- نظام التقارير
- توليد تقارير تلقائية من البيانات اليومية مع رسوم بيانية.
4️⃣ مخطط قاعدة البيانات (ERD)
الجداول الأساسية
- Users → بيانات المستخدمين والصلاحيات.
- ForceStatus → موقف القوة اليومي.
- MaintenanceReports → تقارير الحركة والصيانة.
- OrdersMemos → الأوامر والمذكرات اليومية.
- Requests → الطلبات (تسليح، صيانة، محروقات، مهمات).
- ComplaintsPermissions → الشكاوى والإذونات.
- Personnel → بيانات الأفراد.
- Vehicles → بيانات الآليات.
- Reports → التقارير الأسبوعية والشهرية والسنوية.
- ArchiveDeskTab → الأرشفة والمسح الضوئي.
كل جدول مرتبط بـ Users عبر UserID بعلاقة One‑to‑Many.
5️⃣ خطة التنفيذ البرمجية (Coding Roadmap)
| المرحلة | الهدف | الأدوات | المخرجات |
|---|---|---|---|
| 1. التحليل والتخطيط | تحديد الوظائف والهيكل العام | Word / Draw.io | وثيقة تحليل النظام + مخطط ERD |
| 2. تصميم قاعدة البيانات | إنشاء الجداول والعلاقات | Microsoft Access / SQLite | ملف accde جاهز |
| 3. تصميم واجهة المستخدم (UI) | بناء واجهة بسيطة وسهلة الاستخدام | Android Studio + XML | شاشة رئيسية + شاشات داخلية |
| 4. ربط قاعدة البيانات بالتطبيق | ربط الحقول بالبيانات الفعلية | Java / Kotlin | نموذج إدخال وتخزين مباشر |
| 5. تطوير ميزة DeskTab | أرشفة الملفات والمذكرات | PDF Viewer + Scanner API | أيقونة أرشفة مستقلة |
| 6. إعداد التقارير الآلية | توليد تقارير يومية وشهرية وسنوية | Chart Library + Excel Export | ملفات تقارير قابلة للطباعة |
| 7. نظام الصلاحيات | تحديد صلاحيات المستخدمين | Firebase Auth / SQLite Roles | دخول آمن ومحدد |
| 8. اختبار الأداء | ضمان خفة وسرعة التطبيق | Android Emulator + أجهزة فعلية | نسخة مستقرة وخفيفة |
| 9. التثبيت والتدريب | نشر التطبيق على الأجهزة الميدانية | ملف APK + دليل استخدام | تطبيق جاهز للتشغيل الميداني |
6️⃣ المميزات التقنية
- دعم Offline Sync لتحديث البيانات عند الاتصال بالشبكة.
- تصدير التقارير إلى Excel / PDF بضغطة واحدة.
- واجهة متجاوبة تناسب بيئة العمل العسكري.
- إمكانية المسح الضوئي المباشر من التطبيق.
- نظام إشعارات عاجلة للبلاغات والإذونات.
7️⃣ أمثلة كود أساسية (Skeleton Code)
🗂️ إنشاء قاعدة بيانات SQLite
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "ItemsSystem.db";
private static final int DATABASE_VERSION = 1;
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE Users (UserID INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT, Rank TEXT, Role TEXT, Username TEXT, Password TEXT)");
db.execSQL("CREATE TABLE ForceStatus (ReportID INTEGER PRIMARY KEY AUTOINCREMENT, Date TEXT, PresentCount INTEGER, VehiclesCount INTEGER, Tasks TEXT, Notes TEXT, UserID INTEGER)");
db.execSQL("CREATE TABLE Requests (RequestID INTEGER PRIMARY KEY AUTOINCREMENT, Type TEXT, Description TEXT, Quantity INTEGER, Status TEXT, Date TEXT, UserID INTEGER)");
db.execSQL("CREATE TABLE Reports (ReportID INTEGER PRIMARY KEY AUTOINCREMENT, Type TEXT, StartDate TEXT, EndDate TEXT, Summary TEXT)");
db.execSQL("CREATE TABLE ArchiveDeskTab (ArchiveID INTEGER PRIMARY KEY AUTOINCREMENT, FileName TEXT, FileType TEXT, ScanDate TEXT, Category TEXT, Path TEXT)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS Users");
db.execSQL("DROP TABLE IF EXISTS ForceStatus");
db.execSQL("DROP TABLE IF EXISTS Requests");
db.execSQL("DROP TABLE IF EXISTS Reports");
db.execSQL("DROP TABLE IF EXISTS ArchiveDeskTab");
onCreate(db);
}
}public class ForceStatusActivity extends AppCompatActivity {
EditText presentCount, vehiclesCount, tasks, notes;
Button saveButton;
DatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_force_status);
presentCount = findViewById(R.id.presentCount);
vehiclesCount = findViewById(R.id.vehiclesCount);
tasks = findViewById(R.id.tasks);
notes = findViewById(R.id.notes);
saveButton = findViewById(R.id.saveButton);
dbHelper = new DatabaseHelper(this);
saveButton.setOnClickListener(v -> {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("Date", new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
values.put("PresentCount", Integer.parseInt(presentCount.getText().toString()));
values.put("VehiclesCount", Integer.parseInt(vehiclesCount.getText().toString()));
values.put("Tasks", tasks.getText().toString());
values.put("Notes", notes.getText().toString());
values.put("UserID", 1);
db.insert("ForceStatus", null, values);
Toast.makeText(this, "تم حفظ التقرير اليومي", Toast.LENGTH_SHORT).show();
});
}
}public class ArchiveActivity extends AppCompatActivity {
Button scanButton, savePdfButton;
ImageView previewImage;
DatabaseHelper dbHelper;
Uri scannedUri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_archive);
scanButton = findViewById(R.id.scanButton);
savePdfButton = findViewById(R.id.savePdfButton);
previewImage = findViewById(R.id.previewImage);
dbHelper = new DatabaseHelper(this);
scanButton.setOnClickListener(v -> {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 100);
});
savePdfButton.setOnClickListener(v -> {
if (scannedUri != null) {
saveDocumentToArchive(scannedUri);
} else {
Toast.makeText(this, "لم يتم مسح أي وثيقة", Toast.LENGTH_SHORT).show();
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 100 && resultCode == RESULT_OK