OcrController.php 5.97 KB
<?php

namespace App\Http\Controllers;

use App\Models\DtTemplate;
use App\Models\MstTemplate;
use Illuminate\Http\Request;

class OcrController extends Controller
{
    public function index()
    {
        return view('ocr.index');
    }


    public function store(Request $request)
    {

        $request->validate([
            'customer_name_text' => 'required|string',
            'customer_name_xy' => 'required|string',
        ]);
        $dataDetail = $request->fields ?? [];
        try {
            $masterTemplate = MstTemplate::updateOrCreate(
                ['tpl_name' => $request->template_name],
                [
                    'tpl_text' => $request->customer_name_text,
                    'tpl_xy'   => $request->customer_name_xy,
                ]
            );

            foreach ($dataDetail as $field => $value) {
                if (empty($value['coords'])) {
                    continue;
                }

                DtTemplate::updateOrInsert(
                    [
                        'tpl_id'     => $masterTemplate->id,
                        'field_name' => $field,
                    ],
                    [
                        'field_xy' => is_array($value['coords'])
                            ? implode(',', $value['coords'])
                            : $value['coords'],
                    ]
                );

            }
            return response()->json([
                'success' => true,
                'message' => 'Lưu template thành công',
                'template_id' => $masterTemplate->id
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'Lỗi khi lưu template: ' . $e->getMessage()
            ], 500);
        }
    }


    public function getData(Request $request)
    {
        try {
            // Lấy template name từ request hoặc mặc định
            $templateName = $request->get('template_name', 'nemo12');

            // 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");

            if (!file_exists($jsonPath)) {
                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);
            }

            $dataMapping = [];
            $is_template = false;

            if ($templateName) {
                $mst = MstTemplate::where('tpl_name', $templateName)->first();

                if ($mst) {
                    // Lấy detail của template
                    $details = DtTemplate::where('tpl_id', $mst->id)->get();

                    foreach ($details as $detail) {
                        $coords = array_map('intval', explode(',', $detail->field_xy));
                        // coords = [x1, y1, x2, y2]

                        $dataMapping[$detail->field_name] = [
                            'text' => '',
                            'coords' => $coords
                        ];
                    }
                    $dataMapping['template_name'] = [
                        'text' => $mst->tpl_name,
                        'coords' => ''
                    ];

                    $is_template = true;

                }
            }

            return response()->json([
                'success' => true,
                'ocrData'      => $ocrData,
                'pdfImageUrl'  => $imgPath,
                'dataMapping'  => $dataMapping,
                'is_template'  => $is_template,
                'fieldOptions' => [
                    [ 'value' => 'template_name',  'label' => 'Tên Mẫu PDF' ],
                    [ 'value' => 'customer_name',  'label' => 'Tên khách hàng' ],
                    [ 'value' => 'export_date',    'label' => 'Ngày xuất' ],
                    [ 'value' => 'order_code',     'label' => 'Mã đơn hàng' ],
                    [ '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);
        }
    }

    /**
     * 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);
        }
    }
}