27.01.26
This commit is contained in:
163
app.py
163
app.py
@@ -27,6 +27,18 @@ file_handler.setFormatter(logging.Formatter(
|
|||||||
"%(asctime)s - %(levelname)s - %(name)s - %(message)s"
|
"%(asctime)s - %(levelname)s - %(name)s - %(message)s"
|
||||||
))
|
))
|
||||||
|
|
||||||
|
import pyodbc
|
||||||
|
|
||||||
|
def get_db_connection():
|
||||||
|
return pyodbc.connect(
|
||||||
|
"DRIVER={ODBC Driver 18 for SQL Server};"
|
||||||
|
"SERVER=VPS88.DATACENTER.CSTI;"
|
||||||
|
"DATABASE=Faircot-Test;"
|
||||||
|
"UID=SINGA_META;"
|
||||||
|
"PWD=Start.123;"
|
||||||
|
"TrustServerCertificate=yes;"
|
||||||
|
)
|
||||||
|
|
||||||
class AHKParser:
|
class AHKParser:
|
||||||
lab = "AHK"
|
lab = "AHK"
|
||||||
|
|
||||||
@@ -484,48 +496,126 @@ predictor = ocr_predictor(pretrained=True)
|
|||||||
|
|
||||||
logger.info("Models loaded successfully.")
|
logger.info("Models loaded successfully.")
|
||||||
|
|
||||||
# =============================
|
@app.post("/weight-report")
|
||||||
# 🧠 Smart OCR
|
def create_weight_report(payload: dict = Body(...)):
|
||||||
# =============================
|
logger.info("Create weight report called")
|
||||||
# @app.post("/ocr")
|
|
||||||
# async def ocr(file: UploadFile):
|
|
||||||
# logger.info(f"Received OCR request: {file.filename}")
|
|
||||||
# try:
|
|
||||||
# file_data = await file.read()
|
|
||||||
# ext = file.filename.lower()
|
|
||||||
|
|
||||||
# # --------- PDF with native text ---------
|
# -------- Validation minimale --------
|
||||||
# if ext.endswith(".pdf"):
|
required_fields = [
|
||||||
# logger.info("PDF detected → Extracting native text first")
|
"chunk_key",
|
||||||
# reader = PdfReader(io.BytesIO(file_data))
|
"gross_weight",
|
||||||
# direct_text = "".join(
|
"net_weight",
|
||||||
# page.extract_text() or "" for page in reader.pages
|
"tare_total",
|
||||||
# )
|
"bags",
|
||||||
|
"surveyor_code",
|
||||||
|
"place_key",
|
||||||
|
"report_date"
|
||||||
|
]
|
||||||
|
|
||||||
# if direct_text.strip():
|
missing = [f for f in required_fields if f not in payload]
|
||||||
# logger.info("Native PDF text found → No OCR needed")
|
if missing:
|
||||||
# return {"ocr_text": direct_text}
|
raise HTTPException(
|
||||||
|
status_code=400,
|
||||||
|
detail=f"Missing fields: {', '.join(missing)}"
|
||||||
|
)
|
||||||
|
|
||||||
# # -------- Fallback: scanned PDF OCR --------
|
try:
|
||||||
# logger.info("No native text → PDF treated as scanned → OCR")
|
chunk_key = int(payload["chunk_key"])
|
||||||
# from pdf2image import convert_from_bytes
|
gross_weight = float(payload["gross_weight"])
|
||||||
# images = convert_from_bytes(file_data)
|
net_weight = float(payload["net_weight"])
|
||||||
# text = ""
|
tare_total = float(payload["tare_total"])
|
||||||
# for i, img in enumerate(images):
|
bags = int(payload["bags"])
|
||||||
# logger.info(f"OCR page {i+1}/{len(images)}")
|
surveyor_code = int(payload["surveyor_code"])
|
||||||
# text += pytesseract.image_to_string(img) + "\n"
|
place_key = int(payload["place_key"])
|
||||||
|
report_date = int(payload["report_date"])
|
||||||
|
except Exception as e:
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=400,
|
||||||
|
detail=f"Invalid payload types: {e}"
|
||||||
|
)
|
||||||
|
|
||||||
# return {"ocr_text": text}
|
try:
|
||||||
|
conn = get_db_connection()
|
||||||
|
cursor = conn.cursor()
|
||||||
|
|
||||||
# # --------- Image file OCR ---------
|
cursor.execute("""
|
||||||
# logger.info("Image detected → Running OCR")
|
EXEC dbo.sp_Singa_Automation_InsertWeightReport
|
||||||
# img = Image.open(io.BytesIO(file_data))
|
@CHUNK_KEY = ?,
|
||||||
# text = pytesseract.image_to_string(img)
|
@BAGS_SOUND_AND_FULL = ?,
|
||||||
# return {"ocr_text": text}
|
@BAGS_SOUND_AND_SLACK = 0,
|
||||||
|
@BAGS_DAMAGED_AND_FULL = 0,
|
||||||
|
@BAGS_DAMAGED_AND_SLACK = 0,
|
||||||
|
@BAGS_SHORT_LANDED = 0,
|
||||||
|
@GROSS_SOUND_AND_FULL = ?,
|
||||||
|
@GROSS_SOUND_AND_SLACK = 0,
|
||||||
|
@GROSS_DAMAGED_AND_FULL = 0,
|
||||||
|
@GROSS_DAMAGED_AND_SLACK = 0,
|
||||||
|
@GROSS_SAMPLES = 0,
|
||||||
|
@WEIGHING_DATE = ?,
|
||||||
|
@REPORT_DATE = ?,
|
||||||
|
@DATE_RECEIVED = ?,
|
||||||
|
@NET_WEIGHT = ?,
|
||||||
|
@TARE_TOTAL = ?,
|
||||||
|
@TARE_FOR_TEN_BAGS = 0,
|
||||||
|
@SURVEYOR_CODE = ?,
|
||||||
|
@PLACE_KEY = ?,
|
||||||
|
@SAMPLE_AFTER_WEIGHING = 'N',
|
||||||
|
@MODIFIED_BY = 'FAIRCOTBOT',
|
||||||
|
@MODIFY_DATE = ?,
|
||||||
|
@VERSION_NB = 1,
|
||||||
|
@FORWARDER_REF = 'API-TRYTON',
|
||||||
|
@INSURED_VALUE = '0',
|
||||||
|
@CREATED_BY = 1424,
|
||||||
|
@UPDATED_BY = 1424,
|
||||||
|
@BUY_INVOICE_AMOUNT = 0,
|
||||||
|
@BUY_CURR_KEY = 0,
|
||||||
|
@SEL_INVOICE_AMOUNT = 0,
|
||||||
|
@SEL_CURR_KEY = 0,
|
||||||
|
@CONSISTENCY = 'N',
|
||||||
|
@FINALIZED = 'N',
|
||||||
|
@MOISTURE_VALUE = NULL,
|
||||||
|
@REPORT_TYPE = 0,
|
||||||
|
@WET_WEIGHT = NULL,
|
||||||
|
@WSMD_LOCATION = 0
|
||||||
|
""",
|
||||||
|
chunk_key,
|
||||||
|
bags,
|
||||||
|
gross_weight,
|
||||||
|
report_date,
|
||||||
|
report_date,
|
||||||
|
report_date,
|
||||||
|
net_weight,
|
||||||
|
tare_total,
|
||||||
|
surveyor_code,
|
||||||
|
place_key,
|
||||||
|
report_date
|
||||||
|
)
|
||||||
|
|
||||||
|
# 🟢 On récupère le SELECT final de la SP
|
||||||
|
row = cursor.fetchone()
|
||||||
|
conn.commit()
|
||||||
|
|
||||||
|
if not row:
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=500,
|
||||||
|
detail="Stored procedure returned no data"
|
||||||
|
)
|
||||||
|
|
||||||
|
return {
|
||||||
|
"success": True,
|
||||||
|
"weight_report_key": row.WEIGHT_REPORT_KEY
|
||||||
|
}
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.exception("Weight report creation failed")
|
||||||
|
raise HTTPException(status_code=500, detail=str(e))
|
||||||
|
|
||||||
|
finally:
|
||||||
|
try:
|
||||||
|
conn.close()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
# except Exception as e:
|
|
||||||
# logger.error(f"OCR failed: {e}", exc_info=True)
|
|
||||||
# raise HTTPException(status_code=500, detail=str(e))
|
|
||||||
@app.post("/ocr")
|
@app.post("/ocr")
|
||||||
async def ocr(file: UploadFile):
|
async def ocr(file: UploadFile):
|
||||||
"""
|
"""
|
||||||
@@ -849,7 +939,6 @@ def call_extractor(text: str, lab: str = "AHK"):
|
|||||||
|
|
||||||
return response.json()
|
return response.json()
|
||||||
|
|
||||||
|
|
||||||
@app.post("/parse")
|
@app.post("/parse")
|
||||||
async def parse_endpoint(text: str = Body(..., embed=True)):
|
async def parse_endpoint(text: str = Body(..., embed=True)):
|
||||||
lab = parse_report(text)
|
lab = parse_report(text)
|
||||||
|
|||||||
Reference in New Issue
Block a user