4.7 KiB
4.7 KiB
رفع مشکل کدهای تکراری حسابداری
مشکل
سیستم حسابداری گاهی اوقات کدهای تکراری به اسناد میداد که باعث خطا در سیستم میشد. این مشکل به دلایل زیر رخ میداد:
- عدم بررسی تکراری بودن کد: متد
getAccountingCodeکد جدیدی تولید میکرد بدون بررسی تکراری بودن - Race Condition: در صورت ارسال چندین درخواست همزمان، کدهای یکسانی تولید میشد
- عدم استفاده از تراکنش: عملیات بدون تراکنش انجام میشد
راهحلهای پیادهسازی شده
1. بهبود متد getAccountingCode در Provider.php
تغییرات:
- استفاده از تراکنش دیتابیس: برای جلوگیری از Race Condition
- بررسی تکراری بودن کد: قبل از ذخیره، بررسی میشود که کد قبلاً وجود نداشته باشد
- Retry Logic: در صورت تکراری بودن، تا 10 بار تلاش میکند
- Timestamp Fallback: در صورت عدم موفقیت، از timestamp استفاده میکند
کد جدید:
public function getAccountingCode($bid, $part)
{
$maxRetries = 10;
$retryCount = 0;
do {
$retryCount++;
$this->entityManager->beginTransaction();
try {
// تولید کد جدید
$newCode = intval($count) + 1;
// بررسی تکراری بودن
$isDuplicate = $this->checkCodeDuplicate($bid, $part, $newCode);
if (!$isDuplicate) {
// کد منحصر به فرد است
$business->{$setter}($newCode);
$this->entityManager->persist($business);
$this->entityManager->flush();
$this->entityManager->commit();
return $newCode;
} else {
// کد تکراری است، دوباره تلاش کن
if ($retryCount >= $maxRetries) {
$timestampCode = $this->generateTimestampCode($bid, $part);
return $timestampCode;
}
}
} catch (\Exception $e) {
$this->entityManager->rollback();
throw $e;
}
} while (true);
}
2. بهبود متد app_accounting_insert در HesabdariController.php
تغییرات:
- استفاده از تراکنش: کل عملیات در یک تراکنش انجام میشود
- مدیریت خطا: در صورت بروز خطا، تراکنش rollback میشود
- بررسی خطای تولید کد: خطاهای احتمالی در تولید کد مدیریت میشود
3. متدهای کمکی جدید
checkCodeDuplicate():
بررسی تکراری بودن کد در جدول مربوطه
generateTimestampCode():
تولید کد منحصر به فرد با استفاده از timestamp
fixDuplicateCodes():
ترمیم کدهای تکراری موجود در دیتابیس
4. API جدید برای ترمیم کدهای تکراری
Endpoint: /api/accounting/fix-duplicate-codes
- Method: POST
- Access: فقط ادمین
- Function: ترمیم کدهای تکراری موجود
نحوه استفاده
برای ترمیم کدهای تکراری موجود:
POST /api/accounting/fix-duplicate-codes
Content-Type: application/json
{
"part": "accounting"
}
پاسخ:
{
"result": 1,
"message": "5 کد تکراری ترمیم شد",
"fixed_count": 5
}
مزایای راهحل
- جلوگیری از کدهای تکراری: سیستم اکنون کدهای منحصر به فرد تولید میکند
- مدیریت Race Condition: استفاده از تراکنش از تداخل عملیات جلوگیری میکند
- ترمیم خودکار: در صورت بروز مشکل، سیستم خودکار کد جدید تولید میکند
- ابزار ترمیم: امکان ترمیم کدهای تکراری موجود
- Backward Compatibility: تغییرات بدون تأثیر بر عملکرد موجود
نکات مهم
- فقط ادمین: فقط کاربران ادمین میتوانند کدهای تکراری را ترمیم کنند
- Backup: قبل از اجرای ترمیم، از دیتابیس backup بگیرید
- تست: تغییرات را در محیط تست بررسی کنید
- Monitoring: عملکرد سیستم را پس از اعمال تغییرات نظارت کنید