From 27f01f478f7f2eec551fcc19e08a20a76ed6484e Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Fri, 10 Apr 2026 08:04:07 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E9=AA=8C=E8=AF=81):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E9=92=A2=E5=8D=B7=E5=8F=B7=E5=92=8C=E6=89=B9=E6=AC=A1=E9=A1=BA?= =?UTF-8?q?=E5=BA=8F=E7=9A=84=E9=AA=8C=E8=AF=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在PDI创建和更新操作中添加以下验证: 1. 钢卷号必须为12位 2. 批次编号不能小于已有最大批次 3. 同一批次内顺序号不能重复且必须递增 --- backend/main.py | 71 +++++++++++++++++++++++++++++++++++++++++++++++ backend/models.py | 4 +-- 2 files changed, 73 insertions(+), 2 deletions(-) diff --git a/backend/main.py b/backend/main.py index 31cb49e..cf61faf 100644 --- a/backend/main.py +++ b/backend/main.py @@ -165,6 +165,37 @@ def create_pdi(data: PDIPLTMCreate): conn = get_connection() cursor = conn.cursor() try: + # 1. 验证钢卷号长度 + if len(data.coilid) != 12: + raise HTTPException(status_code=400, detail="钢卷号必须为12位") + + # 2. 验证批次编号 + if data.rollprogramnb: + # 获取数据库中最大的批次编号 + cursor.execute("SELECT MAX(ROLLPROGRAMNB) FROM PLTM.PDI_PLTM") + max_batch = cursor.fetchone()[0] + if max_batch and data.rollprogramnb < max_batch: + raise HTTPException(status_code=400, detail="批次编号不能小于已有的最大批次编号") + + # 3. 验证顺序号 + if data.rollprogramnb and data.sequencenb: + # 检查本批次内是否已存在相同的顺序号 + cursor.execute(""" + SELECT COUNT(*) FROM PLTM.PDI_PLTM + WHERE ROLLPROGRAMNB = :batch AND SEQUENCENB = :seq + """, {"batch": data.rollprogramnb, "seq": data.sequencenb}) + if cursor.fetchone()[0] > 0: + raise HTTPException(status_code=400, detail="本批次内顺序号不能重复") + + # 检查本批次内的最大顺序号 + cursor.execute(""" + SELECT MAX(SEQUENCENB) FROM PLTM.PDI_PLTM + WHERE ROLLPROGRAMNB = :batch + """, {"batch": data.rollprogramnb}) + max_seq = cursor.fetchone()[0] + if max_seq and data.sequencenb <= max_seq: + raise HTTPException(status_code=400, detail="本批次内顺序号必须递增") + fields = {k: v for k, v in data.model_dump(exclude_none=True).items()} cols = ", ".join(f.upper() for f in fields.keys()) vals = ", ".join([f":{k}" for k in fields.keys()]) @@ -195,6 +226,46 @@ def update_pdi(coilid: str, data: PDIPLTMUpdate): fields = {k: v for k, v in data.model_dump(exclude_none=True).items()} if not fields: raise HTTPException(status_code=400, detail="无更新字段") + + # 验证批次编号 + if "rollprogramnb" in fields: + # 获取数据库中最大的批次编号 + cursor.execute("SELECT MAX(ROLLPROGRAMNB) FROM PLTM.PDI_PLTM") + max_batch = cursor.fetchone()[0] + if max_batch and fields["rollprogramnb"] < max_batch: + raise HTTPException(status_code=400, detail="批次编号不能小于已有的最大批次编号") + + # 验证顺序号 + if "rollprogramnb" in fields or "sequencenb" in fields: + # 获取当前记录的批次编号和顺序号 + cursor.execute(""" + SELECT ROLLPROGRAMNB, SEQUENCENB FROM PLTM.PDI_PLTM + WHERE COILID = :coilid + """, {"coilid": coilid}) + current = cursor.fetchone() + if not current: + raise HTTPException(status_code=404, detail="记录不存在") + + new_batch = fields.get("rollprogramnb", current[0]) + new_seq = fields.get("sequencenb", current[1]) + + # 检查本批次内是否已存在相同的顺序号(排除当前记录) + cursor.execute(""" + SELECT COUNT(*) FROM PLTM.PDI_PLTM + WHERE ROLLPROGRAMNB = :batch AND SEQUENCENB = :seq AND COILID != :coilid + """, {"batch": new_batch, "seq": new_seq, "coilid": coilid}) + if cursor.fetchone()[0] > 0: + raise HTTPException(status_code=400, detail="本批次内顺序号不能重复") + + # 检查本批次内的最大顺序号 + cursor.execute(""" + SELECT MAX(SEQUENCENB) FROM PLTM.PDI_PLTM + WHERE ROLLPROGRAMNB = :batch AND COILID != :coilid + """, {"batch": new_batch, "coilid": coilid}) + max_seq = cursor.fetchone()[0] + if max_seq and new_seq <= max_seq: + raise HTTPException(status_code=400, detail="本批次内顺序号必须递增") + set_clause = ", ".join([f"{k.upper()} = :{k}" for k in fields.keys()]) fields["coilid_"] = coilid sql = f"UPDATE PLTM.PDI_PLTM SET {set_clause} WHERE COILID = :coilid_" diff --git a/backend/models.py b/backend/models.py index 3697cc3..816ead9 100644 --- a/backend/models.py +++ b/backend/models.py @@ -1,9 +1,9 @@ from typing import Optional, List, Dict -from pydantic import BaseModel +from pydantic import BaseModel, Field class PDIPLTMCreate(BaseModel): - coilid: str + coilid: str = Field(..., min_length=12, max_length=12, description="钢卷号,必须为12位") rollprogramnb: Optional[int] = None sequencenb: Optional[int] = None schedule_code: Optional[str] = None