tien_nemo

test load data

......@@ -20,9 +20,13 @@ class OcrController extends Controller
$request->validate([
'customer_name_text' => 'required|string',
'customer_name_xy' => 'required|string',
'template_name' => 'unique:mst_template,tpl_name',
'template_name' => 'required|string|unique:mst_template,tpl_name',
'fields' => 'required|array',
'fields.*.name' => 'required|string',
'fields.*.xy' => 'required|string',
]);
try {
// Lưu vào bảng mst_template
$mst = MstTemplate::create([
'tpl_name' => $request->template_name,
......@@ -39,26 +43,39 @@ class OcrController extends Controller
]);
}
return response()->json(['success' => true, 'message' => 'Lưu template thành công']);
return response()->json([
'success' => true,
'message' => 'Lưu template thành công',
'template_id' => $mst->id
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Lỗi khi lưu template: ' . $e->getMessage()
], 500);
}
}
public function getData()
public function getData(Request $request)
{
try {
// Lấy template name từ request hoặc mặc định
$templateName = $request->get('template_name', 'nemo');
// Giả sử file OCR JSON & ảnh nằm trong storage/app/public/image/
$jsonPath = public_path("image/data_picking_detail_1754967679.json");
$imgPath = ("image/data_picking_detail_1754967679.jpg");
$templateName = 'nemo';
/// Lấy từ request hoặc mặc định
if (!file_exists($jsonPath)) {
return response()->json(['error' => 'File not found'], 404);
return response()->json(['error' => 'File OCR JSON không tìm thấy'], 404);
}
$ocrData = json_decode(file_get_contents($jsonPath), true);
if (json_last_error() !== JSON_ERROR_NONE) {
return response()->json(['error' => 'File OCR JSON không hợp lệ'], 400);
}
$formData = [];
if ($templateName) {
......@@ -72,13 +89,13 @@ class OcrController extends Controller
$coords = array_map('intval', explode(',', $detail->field_xy));
// coords = [x1, y1, x2, y2]
// Tìm text OCR nằm trong bbox này
// Tìm text OCR nằm trong bbox này (cải thiện để gộp text)
$text = $this->findTextInBBox($ocrData, $coords);
// field_name => text
$formData[$detail->field_name] = $text;
}
} else{
} else {
$formData = [
'export_date' => "",
'order_code' => "",
......@@ -89,7 +106,9 @@ class OcrController extends Controller
];
}
}
return response()->json([
'success' => true,
'ocrData' => $ocrData,
'pdfImageUrl' => $imgPath,
'formData' => $formData,
......@@ -101,22 +120,103 @@ class OcrController extends Controller
[ 'value' => 'customer', 'label' => 'Khách hàng' ],
[ 'value' => 'address', 'label' => 'Địa chỉ' ],
[ 'value' => 'staff', 'label' => 'Nhân viên' ],
]
],
'template_name' => $templateName
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'error' => 'Lỗi khi load data: ' . $e->getMessage()
], 500);
}
}
private function findTextInBBox($ocrData, $coords)
{
[$x1, $y1, $x2, $y2] = $coords;
$foundItems = [];
foreach ($ocrData as $item) {
[$ix1, $iy1, $ix2, $iy2] = $item['bbox'];
// Kiểm tra nếu bbox OCR nằm trong vùng bbox template
// Kiểm tra xem box OCR có nằm trong vùng bbox template không
if ($ix1 >= $x1 && $iy1 >= $y1 && $ix2 <= $x2 && $iy2 <= $y2) {
return $item['text'];
$foundItems[] = [
'text' => $item['text'],
'bbox' => $item['bbox'],
'x' => $ix1,
'y' => $iy1
];
}
}
if (empty($foundItems)) {
return '';
}
// Sắp xếp các item theo vị trí (từ trái sang phải, từ trên xuống dưới)
usort($foundItems, function($a, $b) {
// Ưu tiên theo Y trước (hàng), sau đó theo X (cột)
if (abs($a['y'] - $b['y']) < 20) { // Cùng hàng (toler$foundItems = {array[2]} ance 20px)
return $a['x'] - $b['x']; // Sắp xếp theo X
}
return $a['y'] - $b['y']; // Sắp xếp theo Y
});
// Gộp text theo thứ tự đã sắp xếp
$combinedText = [];
foreach ($foundItems as $item) {
$combinedText[] = trim($item['text']);
}
return implode(' ', $combinedText);
}
/**
* Lấy danh sách template
*/
public function getTemplateList()
{
try {
$templates = MstTemplate::select('id', 'tpl_name', 'tpl_text', 'in_date')
->orderBy('created_at', 'desc')
->get();
return response()->json([
'success' => true,
'templates' => $templates
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'error' => 'Lỗi khi lấy danh sách template: ' . $e->getMessage()
], 500);
}
}
/**
* Xóa template
*/
public function deleteTemplate($id)
{
try {
$template = MstTemplate::findOrFail($id);
// Xóa các field detail trước
DtTemplate::where('tpl_id', $id)->delete();
// Xóa template chính
$template->delete();
return response()->json([
'success' => true,
'message' => 'Xóa template thành công'
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'error' => 'Lỗi khi xóa template: ' . $e->getMessage()
], 500);
}
}
}
......