supplier_schema.py
"""
供应商文档JSON存储模板(Schema定义)
文档结构:
- doc_title: 文档标题
- doc_date: 文档日期
- sections: 固定章节内容(普通文本)
- original_req: 原始需求
- req_clarify: 需求澄清
- req_analysis: 需求分析
- solution_overview: 方案概述
- functions: 功能点列表(嵌套结构)
- name: 功能点名称
- scene_desc: 场景描述(普通文本)
- sub_functions: 子功能点列表
- name: 子功能点名称
- content_blocks: 内容块列表(支持富文本、表格、图片)
内容块类型:
- text: 富文本 {"t": "text", "text": "...", "fmt": [[s,e,{style}]]}
- table: 表格 {"t": "table", "cols": n, "h": [...], "d": [...], "m": {}}
- image: 图片 {"t": "img", "p": "path", "w": n, "h": n}
"""
from typing import List, Optional, Union, Literal
from pydantic import BaseModel, Field
import json
class TextStyle(BaseModel):
b: Optional[bool] = Field(None, description="粗体")
i: Optional[bool] = Field(None, description="斜体")
u: Optional[bool] = Field(None, description="下划线")
c: Optional[str] = Field(None, description="颜色(HEX)")
sz: Optional[int] = Field(None, description="字号(半磅)")
class TextBlock(BaseModel):
t: Literal["text"] = "text"
text: str = Field(..., description="文本内容")
fmt: List[List] = Field(default_factory=list, description="格式区间[[start,end,{style}]]")
class TableBlock(BaseModel):
t: Literal["table"] = "table"
cols: int = Field(..., description="列数")
h: List[str] = Field(default_factory=list, description="表头")
d: List[List[str]] = Field(default_factory=list, description="数据行")
m: dict = Field(default_factory=dict, description="合并信息{A1:A2:v}")
class ImageBlock(BaseModel):
t: Literal["img"] = "img"
p: str = Field(..., description="图片路径")
w: int = Field(..., description="宽度")
h: int = Field(..., description="高度")
ContentBlock = Union[TextBlock, TableBlock, ImageBlock]
class SubFunction(BaseModel):
name: str = Field(..., description="子功能点名称")
content_blocks: List[dict] = Field(default_factory=list, description="内容块列表")
class Function(BaseModel):
name: str = Field(..., description="功能点名称")
scene_desc: str = Field(default="", description="场景描述")
sub_functions: List[SubFunction] = Field(default_factory=list, description="子功能点列表")
class Sections(BaseModel):
original_req: str = Field(default="", description="原始需求")
req_clarify: str = Field(default="", description="需求澄清")
req_analysis: str = Field(default="", description="需求分析")
solution_overview: str = Field(default="", description="方案概述(3.2.3)")
new_tables: list = Field(default_factory=list, description="新增表(富文本内容块)")
modify_tables: list = Field(default_factory=list, description="修改表(富文本内容块)")
data_compatibility: list = Field(default_factory=list, description="数据兼容性要求(富文本内容块)")
class SupplierDocument(BaseModel):
doc_title: str = Field(..., description="文档标题")
doc_date: Optional[str] = Field(None, description="文档日期")
sections: Sections = Field(default_factory=Sections, description="固定章节")
functions: List[Function] = Field(default_factory=list, description="功能点列表")
images_dir: str = Field(default="images", description="图片存储目录")
def create_example_json() -> dict:
"""创建示例JSON"""
return {
"doc_title": "需求XXXXX_需求分析说明书",
"doc_date": "2024年6月30日",
"sections": {
"original_req": "这是需要提取的原始需求内容...",
"req_clarify": "这是需要提取的需求澄清内容...",
"req_analysis": "这是需要提取的需求分析内容...",
"solution_overview": "这是方案概述..."
},
"functions": [
{
"name": "功能点1:我是一个功能点名称",
"scene_desc": "这是功能点1的场景描述...",
"sub_functions": [
{
"name": "我是一个子功能点",
"content_blocks": [
{
"t": "text",
"text": "富文本信息,蓝色字体,红色字体\n小字体\n下面是一张表格:",
"fmt": [[6, 10, {"c": "0000FF"}], [12, 16, {"c": "FF0000"}]]
},
{
"t": "table",
"cols": 4,
"h": ["序号", "字段名称", "字段说明", "备注"],
"d": [["1", "地市", "", ""], ["2", "区县", "", ""]],
"m": {}
},
{
"t": "text",
"text": "下面是一张图片:",
"fmt": []
},
{
"t": "img",
"p": "images/img_001.png",
"w": 200,
"h": 150
}
]
}
]
}
],
"images_dir": "images"
}
if __name__ == "__main__":
example = create_example_json()
print(json.dumps(example, ensure_ascii=False, indent=2))
