fix(bot-bridge): subjects 写入端点编码长度收敛到 DB 列宽20 — 21~32字符编码原穿过校验触发 MySQL 1406 整批500, 改为400拒绝 (dama-cma-subjects-write-endpoint-20260912 复核)
This commit is contained in:
@@ -987,7 +987,10 @@ _SUBJ_FIELDS = ("subject_code", "subject_name", "parent_code", "level", "categor
|
||||
_SUBJ_CATEGORIES = ("asset", "liability", "equity", "cost", "income", "expense", "detail", "other")
|
||||
_SUBJ_LEVELS = (1, 2, 3)
|
||||
_SUBJ_MAX_ROWS = 2000
|
||||
_SUBJ_CODE_MAXLEN = 32
|
||||
# subject_code / parent_code 长度上限:任务规格为 ≤32,但 DB 列 subjects.subject_code /
|
||||
# parent_code 实为 varchar(20) —— 取交集 20。若按 32 放行,21~32 字符的编码会穿过校验直达
|
||||
# MySQL,报 (1406, Data too long) → 整批 500(2026-09-12 生产实测),故此处收敛到 DB 列宽。
|
||||
_SUBJ_CODE_MAXLEN = 20
|
||||
_SUBJ_NAME_MAXLEN = 200
|
||||
|
||||
|
||||
@@ -1006,7 +1009,7 @@ def _validate_subject_rows(rows, db):
|
||||
"""行级全量校验(任一错误 → 400 且零落库),返回标准化行 [{字段}]
|
||||
|
||||
规则(任务 dama-cma-subjects-write-endpoint-20260912):
|
||||
subject_code 非空且 ≤32 字符 + 批次内去重;subject_name 非空(DB NOT NULL)且 ≤200;
|
||||
subject_code 非空且 ≤_SUBJ_CODE_MAXLEN(=20,DB varchar(20) 列宽)+ 批次内去重;subject_name 非空(DB NOT NULL)且 ≤200;
|
||||
level ∈ {1,2,3}(缺省 1);parent_code 为空或存在于本表(或本批次内,支持层级同批导入);
|
||||
category 限枚举;is_active ∈ {0,1}(缺省 1)。
|
||||
"""
|
||||
|
||||
@@ -493,6 +493,24 @@ class TestSubjectsWrite:
|
||||
assert resp.status_code == 400
|
||||
assert "subject_name" in str(resp.json())
|
||||
|
||||
def test_code_too_long_400(self, client: TestClient, db: Session):
|
||||
"""编码长度上限 = min(任务规格 32, DB varchar(20)) = 20
|
||||
|
||||
生产实测(2026-09-12):按 32 放行时 21 字符编码穿过校验 → MySQL 1406 Data too long
|
||||
→ 整批 500;收敛到 DB 列宽后应 400 拒绝且零落库。
|
||||
"""
|
||||
resp = client.post(self.URL, json={"subjects": [
|
||||
self._row("9" * 21, "验证科目")]}, headers=BOT_KEY)
|
||||
assert resp.status_code == 400, resp.json()
|
||||
assert "超长" in str(resp.json())
|
||||
assert db.query(Subject).filter(Subject.subject_code == "9" * 21).count() == 0
|
||||
|
||||
def test_parent_code_too_long_400(self, client: TestClient):
|
||||
resp = client.post(self.URL, json={"subjects": [
|
||||
self._row("9402", "验证子科目", parent_code="9" * 21, level=2)]}, headers=BOT_KEY)
|
||||
assert resp.status_code == 400, resp.json()
|
||||
assert "超长" in str(resp.json())
|
||||
|
||||
# ── 落库语义 ──
|
||||
def test_dry_run_zero_write(self, client: TestClient, db: Session):
|
||||
before = db.query(Subject).count()
|
||||
|
||||
Reference in New Issue
Block a user