someone-oa/generate_detailed_prd.py
2025-12-11 15:21:16 +08:00

1004 lines
43 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
生成完整详细的产品需求文档PRD
"""
from docx import Document
from docx.shared import Pt, Inches, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from datetime import datetime
def add_section_title(doc, text, level=1):
"""添加章节标题"""
heading = doc.add_heading(text, level=level)
return heading
def add_formatted_paragraph(doc, text, bold=False, indent=False):
"""添加格式化的段落"""
p = doc.add_paragraph()
if indent:
p.paragraph_format.left_indent = Inches(0.5)
run = p.add_run(text)
if bold:
run.bold = True
return p
def add_bullet_list(doc, items, indent=0):
"""添加项目符号列表"""
for item in items:
p = doc.add_paragraph(item, style='List Bullet')
if indent > 0:
p.paragraph_format.left_indent = Inches(indent * 0.5)
def add_numbered_list(doc, items, indent=0):
"""添加编号列表"""
for i, item in enumerate(items, 1):
p = doc.add_paragraph(f"{i}. {item}", style='List Number')
if indent > 0:
p.paragraph_format.left_indent = Inches(indent * 0.5)
def generate_detailed_prd():
"""生成详细的产品需求文档"""
doc = Document()
# 设置文档样式
style = doc.styles['Normal']
font = style.font
font.name = '宋体'
font.size = Pt(12)
# ========== 文档头部 ==========
title = doc.add_heading('OA系统产品需求文档PRD', 0)
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.add_paragraph(f'版本号v1.0')
doc.add_paragraph(f'编制日期:{datetime.now().strftime("%Y年%m月%d")}')
doc.add_paragraph('编制人:产品经理')
doc.add_paragraph('文档说明本文档基于《OA系统功能定制方案》整理详细描述了OA系统的功能需求、业务流程、数据规则等内容。')
doc.add_page_break()
# ========== 1. 文档概述 ==========
add_section_title(doc, '1. 文档概述', 1)
add_section_title(doc, '1.1 项目背景', 2)
doc.add_paragraph('随着公司业务发展项目管理流程日趋复杂需要一套完整的OA系统来支撑从商机立项到项目完成、财务结算的全流程管理。系统需支持项目过程跟踪、状态管理、产值统计与回款管理等核心业务。')
add_section_title(doc, '1.2 项目目标', 2)
add_bullet_list(doc, [
'实现项目全生命周期在线管理,从立项到回款全流程数字化',
'建立项目状态可视化跟踪机制,实时掌握项目进展',
'支持产值与财务数据统计,为管理决策提供数据支撑',
'建立规范的审核流程,确保关键环节可追溯',
'支持PC端与移动端提升使用便捷性'
])
add_section_title(doc, '1.3 适用范围', 2)
doc.add_paragraph('本需求文档适用于OA系统的开发、测试、验收等各阶段供产品、开发、测试、设计等相关人员参考。')
add_section_title(doc, '1.4 术语定义', 2)
terms = [
('项目编号', '项目的唯一标识符,格式:年份+序号如25-1表示2025年第1个项目'),
('启动编号', '项目启动单的唯一标识,格式:立项编号+项目类型+启动序号如25-3-2-4'),
('结算类项目', '指结算审计、概算编制及审核、清单控制价编制及审核类型项目,需提交初稿、对账、最终成果'),
('执业者', '参与项目执行的执业工程师'),
('产值', '根据项目进度和任务完成情况计算的产值金额')
]
for term, definition in terms:
p = doc.add_paragraph()
p.add_run(term + '').bold = True
p.add_run(definition)
doc.add_page_break()
# ========== 2. 总体需求 ==========
add_section_title(doc, '2. 总体需求', 1)
add_section_title(doc, '2.1 管理要求', 2)
doc.add_paragraph('系统需围绕项目全生命周期管理,满足以下管理要求:')
add_bullet_list(doc, [
'可视化流程管理:所有业务流程需清晰展示,支持流程节点可视化',
'状态跟踪:项目各阶段状态需实时更新,支持状态查询与统计',
'审核留痕:所有审核环节需记录审核人、审核时间、审核意见等信息',
'数据统计:支持项目、产值、财务等多维度数据统计与分析',
'权限控制:不同角色人员只能访问和操作权限范围内的功能'
])
add_section_title(doc, '2.2 业务流程', 2)
doc.add_paragraph('系统需支持完整的业务流程:')
doc.add_paragraph('理想流程:立项 → 投标 → 签合同 → 启动 → 成果提交 → 回款')
doc.add_paragraph('实际业务中,可能存在不投标或直接启动的情况,系统需支持以下场景:')
add_bullet_list(doc, [
'立项后直接启动(不投标、不签合同)',
'立项后仅投标,不签合同即启动',
'立项后直接签合同启动(不投标)'
])
doc.add_paragraph('注:所有项目状态需在系统中明确标识,支持按状态进行查询和统计。')
doc.add_page_break()
# ========== 3. 功能需求 ==========
add_section_title(doc, '3. 功能需求', 1)
doc.add_paragraph('系统功能分为五大板块,详细需求如下:')
# 3.1 商机(立项)管理
add_section_title(doc, '3.1 商机(立项)管理', 2)
add_section_title(doc, '3.1.1 功能概述', 3)
doc.add_paragraph('商机(立项)管理模块用于管理项目的前期立项工作,包括项目立项申请、投标管理、合同管理及项目查询功能。')
doc.add_paragraph('主流程:立项 → 经营管理部审核 → 总经理审核')
add_section_title(doc, '3.1.2 立项功能', 3)
doc.add_paragraph('功能描述:商务人员在线提交项目立项申请表单,经经营管理部和总经理依次审核通过后,项目正式立项。')
add_formatted_paragraph(doc, '表单字段(需参考原型图):', bold=True)
add_bullet_list(doc, [
'项目编号(系统自动生成,不可编辑)',
'项目名称(必填)',
'客户名称(必填)',
'服务内容(下拉选择,必填)',
'项目类型(必填)',
'预计金额(必填)',
'立项日期(必填)',
'申请人(自动带出当前登录用户)',
'备注(可选)',
'附件(可选,支持多个文件上传)'
])
add_formatted_paragraph(doc, '业务规则:', bold=True)
p = doc.add_paragraph()
p.add_run('1. 项目编号生成规则:').bold = True
p.add_run('年份2位+ 序号自动累计格式YY-N。')
doc.add_paragraph(' • 示例2025年第1个项目编号为25-1')
doc.add_paragraph(' • 当年新增项目,年份不变,序号依次累加')
doc.add_paragraph(' • 系统需确保编号唯一性,不允许重复')
p = doc.add_paragraph()
p.add_run('2. 服务内容选择:').bold = True
p.add_run('下拉选择,支持以下选项:')
add_numbered_list(doc, [
'结算审计、概算编制及审核、清单控制价编制及审核',
'工程咨询',
'跟踪审计',
'项目管理',
'工程监理'
], indent=1)
p = doc.add_paragraph()
p.add_run('3. 结算类项目说明:').bold = True
p.add_run('结算审计、概算编制及审核、清单控制价编制及审核类型项目统称为结算类项目。')
doc.add_paragraph(' • 结算类项目包含子项:计量、计价、对账、出报告')
doc.add_paragraph(' • 结算类项目在成果管理中需提交:初稿、对账、最终成果')
doc.add_paragraph(' • 其他类型项目可直接提交最终成果')
add_formatted_paragraph(doc, '审核流程:', bold=True)
doc.add_paragraph('1. 申请人提交立项申请后,状态变为"待审核"')
doc.add_paragraph('2. 经营管理部审核(通过/驳回),审核通过后流转至总经理')
doc.add_paragraph('3. 总经理审核(通过/驳回),审核通过后项目状态变为"已立项"')
doc.add_paragraph('4. 审核驳回时需填写驳回原因,申请人可修改后重新提交')
add_section_title(doc, '3.1.3 投标功能', 3)
doc.add_paragraph('功能描述:申请人可修改已立项项目的状态为"投标中",并可上传投标相关附件。')
add_bullet_list(doc, [
'仅已立项状态的项目可进行投标操作',
'支持上传投标文件、投标书等相关附件',
'状态更新为"投标中"后,可继续流转至"已中标"状态',
'投标为可选环节,不是所有项目都需要'
])
add_section_title(doc, '3.1.4 合同管理', 3)
doc.add_paragraph('功能描述:申请人可修改项目状态为"已签合同",并上传合同附件。')
add_bullet_list(doc, [
'支持上传合同扫描件、电子合同等附件',
'合同金额需与立项金额对比,差异过大时给出提醒',
'状态更新为"已签合同"后,方可进行项目启动操作',
'合同为可选环节,但通常需要合同才能启动项目'
])
add_section_title(doc, '3.1.5 项目查询', 3)
doc.add_paragraph('功能描述:提供项目查询功能,支持多条件组合查询。')
add_formatted_paragraph(doc, '查询条件:', bold=True)
add_bullet_list(doc, [
'项目编号(精确/模糊查询)',
'项目名称(模糊查询)',
'服务内容(下拉选择)',
'项目状态(多选:已立项、投标中、已中标、已签合同、已启动等)',
'立项日期范围',
'客户名称(模糊查询)'
])
add_formatted_paragraph(doc, '查询结果展示:', bold=True)
add_bullet_list(doc, [
'项目编号',
'项目名称',
'客户名称',
'服务内容',
'项目状态',
'预计金额',
'立项日期',
'申请人'
])
doc.add_paragraph('查询结果支持分页展示支持导出Excel功能。')
doc.add_page_break()
# 3.2 项目过程管理
add_section_title(doc, '3.2 项目过程管理', 2)
add_section_title(doc, '3.2.1 功能概述', 3)
doc.add_paragraph('项目过程管理模块用于管理项目启动后的执行过程,包括项目启动、成果管理、进度查询等功能。')
add_section_title(doc, '3.2.2 项目启动', 3)
doc.add_paragraph('功能描述:商务人员查询已立项项目,选择项目进行启动操作,或直接新建启动单(可关联已立项项目)。')
add_formatted_paragraph(doc, '启动方式:', bold=True)
add_bullet_list(doc, [
'方式一:从已立项项目中选择,点击"启动"按钮,系统自动关联立项信息',
'方式二:直接新建启动单,可手动关联已立项项目'
])
add_formatted_paragraph(doc, '表单字段(需参考原型图):', bold=True)
add_bullet_list(doc, [
'启动编号(系统自动生成)',
'关联立项项目(下拉选择,必填)',
'启动日期(必填)',
'项目类型(从关联项目自动带出,可修改)',
'负责人(必填)',
'执业工程师分配(可多选,必填)',
'工作内容分配(多选,必填)',
'预计完成日期(必填)',
'备注(可选)'
])
add_formatted_paragraph(doc, '业务规则:', bold=True)
p = doc.add_paragraph()
p.add_run('1. 数据关联:').bold = True
add_bullet_list(doc, [
'启动单与立项单据自动关联',
'立项项目的基本信息(项目编号、名称、客户、服务内容等)自动导入到启动单',
'支持查看关联的立项单据详情'
], indent=1)
p = doc.add_paragraph()
p.add_run('2. 人员分配:').bold = True
p.add_run('启动工作可指派给多人,每个执业工程师可分配不同的工作内容。')
p = doc.add_paragraph()
p.add_run('3. 多次启动:').bold = True
p.add_run('同一个项目可以多次启动,每次启动产生独立的启动单。')
doc.add_paragraph(' • 示例:一个项目可能分阶段启动,每个阶段一个启动单')
p = doc.add_paragraph()
p.add_run('4. 工作内容分配:').bold = True
p.add_run('分配给执业工程师的工作内容,属于主表"服务内容"下的子项,可多选。')
doc.add_paragraph(' 对应关系如下:')
work_items = [
('结算审计、概算编制及审核、清单控制价编制及审核', ['计量', '计价', '对账', '出报告']),
('工程咨询', ['文本', '估算', '出报告']),
('跟踪审计', ['现场跟踪', '进度款审核']),
('项目管理', ['项目协助甲方报批报建', '项目实施过程中管控']),
('工程监理', ['现场跟踪', '进度审核'])
]
for main_item, sub_items in work_items:
p = doc.add_paragraph(f'{main_item}', style='List Bullet')
p.paragraph_format.left_indent = Inches(0.5)
p.add_run(''.join(sub_items))
p = doc.add_paragraph()
p.add_run('5. 启动编号生成规则:').bold = True
p.add_run('立项编号 + 项目类型数字 + 启动序号')
doc.add_paragraph(' • 格式:立项编号-类型-序号')
doc.add_paragraph(' • 示例25-3-2-4')
doc.add_paragraph(' - 25-3表示25年第3个项目')
doc.add_paragraph(' - 2表示项目类型为工程咨询类型编号待定')
doc.add_paragraph(' - 4表示该项目的第4次启动')
p = doc.add_paragraph()
p.add_run('6. 费用计算公式:').bold = True
doc.add_paragraph(' 各项目类型按以下标准文件计算费用:')
formulas = [
('工程咨询', '依据鄂价房字[2001]107号文计算 × 折扣率'),
('工程造价', '依据鄂价工服规[2012]149号文计算 × 折扣率'),
('工程监理', '依据发改价格[2007]670号文计算 × 专业调整系数 × 工程复杂程度调整系数 × 高程调整系数 × 折扣率'),
('工程设计', '依据计价格[2002]10号文计算 × 折扣率'),
('工程代建', '依据财建[2016]504号文计算 × 折扣率'),
('招标代理', '依据鄂建文202335号文计算 × 折扣率')
]
for item_type, formula in formulas:
p = doc.add_paragraph(f'{item_type}{formula}')
add_formatted_paragraph(doc, '审核流程:', bold=True)
doc.add_paragraph('1. 申请人提交启动申请后,状态变为"待审核"')
doc.add_paragraph('2. 经营管理部审核(通过/驳回)')
doc.add_paragraph('3. 总经理审核(通过/驳回),审核通过后状态变为"已启动"')
doc.add_paragraph('4. 审核通过后,系统自动通知被分配的执业工程师')
add_section_title(doc, '3.2.3 成果管理', 3)
doc.add_paragraph('功能描述:执业工程师查询分配给自己的已启动项目,提交项目成果,经审核后完成成果确认。')
add_formatted_paragraph(doc, '成果类型:', bold=True)
add_bullet_list(doc, [
'结算类项目需提交:初稿、对账、最终成果',
'其他类型项目:根据项目进度直接提交最终成果'
])
add_formatted_paragraph(doc, '提交流程:', bold=True)
doc.add_paragraph('1. 执业工程师查询已启动且分配给自己的项目')
doc.add_paragraph('2. 选择项目,修改项目信息状态(如:初稿已完成、对账中、最终成果已完成等)')
doc.add_paragraph('3. 上传成果附件(可选,但建议上传)')
doc.add_paragraph('4. 填写完成信息(完成时间、完成情况等)')
doc.add_paragraph('5. 提交审核')
add_formatted_paragraph(doc, '审核流程:', bold=True)
doc.add_paragraph('1. 初稿/对账审核:多人同时提交成果后,由组长审核,再由领导(王总)审核')
doc.add_paragraph('2. 最终成果审核:多人同时提交正式成果后,由组长审核,再由领导(王总、戚总)审核')
doc.add_paragraph('3. 审核通过后,项目状态更新,系统记录审核信息')
add_formatted_paragraph(doc, '业务规则:', bold=True)
p = doc.add_paragraph()
p.add_run('1. 对账金额提醒:').bold = True
p.add_run('对账后会有正式报告金额。如初稿金额与对账金额差距过大如超过20%或设定阈值),系统需给出提醒。')
p = doc.add_paragraph()
p.add_run('2. 多人协作:').bold = True
p.add_run('同一项目多人同时提交成果时,需等待所有人员提交完成后,才进入组长审核环节。')
p = doc.add_paragraph()
p.add_run('3. 附件管理:').bold = True
p.add_run('支持上传多种格式文件PDF、Word、Excel、图片等文件大小限制需在系统配置中设定。')
add_section_title(doc, '3.2.4 项目进度查询', 3)
doc.add_paragraph('功能描述:提供项目进度查询功能,实时查看正在执行中的项目信息。')
add_formatted_paragraph(doc, '查询条件:', bold=True)
add_bullet_list(doc, [
'项目名称(模糊查询)',
'客户名称(模糊查询)',
'执业者(下拉选择)',
'项目状态(多选)',
'服务内容(下拉选择)',
'启动日期范围'
])
add_formatted_paragraph(doc, '查询结果展示:', bold=True)
add_bullet_list(doc, [
'项目编号',
'项目名称',
'客户名称',
'服务内容',
'负责人',
'执业者',
'启动日期',
'预计完成日期',
'当前状态',
'完成进度(百分比)'
])
doc.add_paragraph('支持按状态、完成进度等维度进行排序。')
doc.add_page_break()
# 3.3 财务管理
add_section_title(doc, '3.3 财务管理', 2)
add_section_title(doc, '3.3.1 功能概述', 3)
doc.add_paragraph('财务管理模块用于管理项目的财务流程,包括开票请款、回款管理、请款流程等功能。')
doc.add_paragraph('主流程:开票请款 → 回款')
add_section_title(doc, '3.3.2 回款流程', 3)
doc.add_paragraph('功能描述:商务人员查询符合条件的项目,申请开票,财务开票后记录回款信息。')
add_formatted_paragraph(doc, '申请条件:', bold=True)
add_bullet_list(doc, [
'项目状态为"已签合同",或',
'项目状态为"已提交正式成果"'
])
add_formatted_paragraph(doc, '申请流程:', bold=True)
doc.add_paragraph('1. 商务人员查询符合条件的项目')
doc.add_paragraph('2. 选择项目,提交开票申请表单(表单字段待定)')
doc.add_paragraph('3. 财务人员审核开票申请')
doc.add_paragraph('4. 财务开票后,上传开票附件(可选),填写开票金额')
doc.add_paragraph('5. 系统自动更新单据状态为"已开票"')
doc.add_paragraph('6. 收到款项后,商务或财务人员录入回款金额或改变订单状态')
doc.add_paragraph('7. 订单状态变为"已回款"')
add_formatted_paragraph(doc, '表单字段(待定):', bold=True)
add_bullet_list(doc, [
'项目信息(自动带出)',
'申请开票金额',
'申请日期',
'开票类型',
'开票金额(财务填写)',
'开票日期(财务填写)',
'回款金额',
'回款日期',
'备注'
])
add_section_title(doc, '3.3.3 请款流程', 3)
doc.add_paragraph('功能描述:商务人员提交请款申请,经审核后由出纳放款。')
add_formatted_paragraph(doc, '申请流程:', bold=True)
doc.add_paragraph('1. 商务人员在线提交请款申请表单(表单字段待定)')
doc.add_paragraph('2. 总经理审核(通过/驳回)')
doc.add_paragraph('3. 审核通过后,出纳根据申请放款')
doc.add_paragraph('4. 出纳点击订单状态,状态变为"已付款"')
add_formatted_paragraph(doc, '表单字段(待定):', bold=True)
add_bullet_list(doc, [
'请款项目信息',
'请款金额',
'请款事由',
'请款日期',
'收款单位',
'收款账号',
'备注'
])
doc.add_page_break()
# 3.4 报表管理
add_section_title(doc, '3.4 报表管理', 2)
add_section_title(doc, '3.4.1 功能概述', 3)
doc.add_paragraph('报表管理模块提供各类数据统计报表,支持项目、产值、财务等多维度数据查询与导出。')
add_section_title(doc, '3.4.2 项目报表', 3)
add_section_title(doc, '3.4.2.1 项目明细表', 4)
doc.add_paragraph('功能描述:展示项目从立项到回款的所有明细信息。')
add_formatted_paragraph(doc, '报表字段:', bold=True)
add_bullet_list(doc, [
'项目编号',
'项目名称',
'客户名称',
'服务内容',
'项目类型',
'负责人',
'执业者(多个)',
'立项日期',
'启动日期',
'完成日期',
'项目状态',
'立项金额',
'合同金额',
'开票金额',
'回款金额',
'备注'
])
add_formatted_paragraph(doc, '功能特性:', bold=True)
add_bullet_list(doc, [
'支持按项目状态、负责人、时间范围等条件筛选',
'支持导出Excel格式',
'支持按字段排序',
'支持分页展示'
])
add_section_title(doc, '3.4.2.2 项目汇总表', 4)
doc.add_paragraph('功能描述:按项目状态、负责人等维度汇总项目数量。')
add_formatted_paragraph(doc, '汇总维度:', bold=True)
add_bullet_list(doc, [
'按项目状态汇总(立项、投标中、已中标、已签合同、已启动、已完成等)',
'按负责人汇总项目数量',
'按服务内容汇总项目数量',
'按时间维度汇总(按月、按季度、按年)'
])
add_formatted_paragraph(doc, '展示内容:', bold=True)
add_bullet_list(doc, [
'汇总维度(状态/负责人/服务内容/时间)',
'项目数量',
'总金额',
'占比(可选)'
])
add_section_title(doc, '3.4.3 产值报表', 3)
add_section_title(doc, '3.4.3.1 产值明细表', 4)
doc.add_paragraph('功能描述:根据项目过程信息,计算每个项目对应到执业者的完成产值明细。')
add_formatted_paragraph(doc, '报表字段:', bold=True)
add_bullet_list(doc, [
'项目编号',
'项目名称',
'执业者',
'工作内容',
'工作内容完成状态',
'产值比例',
'项目总金额',
'计算产值',
'完成时间'
])
add_formatted_paragraph(doc, '产值计算公式:', bold=True)
doc.add_paragraph('产值 = 项目金额 × 该工作内容的产值比例')
p = doc.add_paragraph()
p.add_run('各服务类型的产值比例分配如下:').bold = True
output_ratios = [
('结算审计、概算编制及审核、清单控制价编制及审核', [('计量', '30%'), ('计价', '30%'), ('对账', '10%'), ('出报告', '30%')]),
('工程咨询', [('文本', '30%'), ('估算', '20%'), ('出报告', '50%')]),
('跟踪审计', [('现场跟踪', '60%'), ('进度款审核', '40%')]),
('项目管理', [('项目协助甲方报批报建', '40%'), ('项目实施过程中管控', '60%')]),
('工程监理', [('现场跟踪', '60%'), ('进度审核', '40%')])
]
for main_type, ratios in output_ratios:
p = doc.add_paragraph(f'{main_type}')
for work_item, ratio in ratios:
doc.add_paragraph(f' - {work_item}{ratio}')
add_formatted_paragraph(doc, '计算规则:', bold=True)
add_bullet_list(doc, [
'产值计算基于工作内容完成状态',
'工作内容完成后,按比例计算产值',
'支持按完成时间统计产值',
'产值明细支持导出Excel'
])
add_section_title(doc, '3.4.3.2 产值汇总表', 4)
doc.add_paragraph('功能描述:按执业者统计指定时间段的产值完成情况。')
add_formatted_paragraph(doc, '汇总维度:', bold=True)
add_bullet_list(doc, [
'按执业者汇总',
'按时间段汇总(支持选择起始日期和结束日期)',
'按项目类型汇总(可选)'
])
add_formatted_paragraph(doc, '展示内容:', bold=True)
add_bullet_list(doc, [
'执业者姓名',
'时间段',
'完成项目数量',
'总产值',
'平均项目产值',
'产值排名(可选)'
])
add_section_title(doc, '3.4.4 财务报表', 3)
add_section_title(doc, '3.4.4.1 应收账款汇总表', 4)
doc.add_paragraph('功能描述:按客户单位汇总应收账款。')
add_formatted_paragraph(doc, '报表字段:', bold=True)
add_bullet_list(doc, [
'客户单位',
'项目数量',
'应收账款总额',
'已开票金额',
'已回款金额',
'未回款金额',
'账龄(可选)'
])
add_section_title(doc, '3.4.4.2 应收账款明细表', 4)
doc.add_paragraph('功能描述:按客户单位汇总显示多个项目的应收账款明细。')
add_formatted_paragraph(doc, '报表字段:', bold=True)
add_bullet_list(doc, [
'客户单位',
'项目编号',
'项目名称',
'合同金额',
'开票金额',
'回款金额',
'未回款金额',
'开票日期',
'最后回款日期',
'账龄'
])
add_section_title(doc, '3.4.4.3 应付账款明细表', 4)
doc.add_paragraph('功能描述:对应请款申请,展示应付账款明细。')
add_formatted_paragraph(doc, '报表字段:', bold=True)
add_bullet_list(doc, [
'请款编号',
'请款日期',
'请款项目',
'请款金额',
'请款事由',
'收款单位',
'审核状态',
'付款状态',
'付款日期',
'备注'
])
add_section_title(doc, '3.4.4.4 应付账款汇总表', 4)
doc.add_paragraph('功能描述:汇总所有请款金额。')
add_formatted_paragraph(doc, '汇总维度:', bold=True)
add_bullet_list(doc, [
'按时间维度汇总(按月、按季度、按年)',
'按审核状态汇总',
'按付款状态汇总'
])
add_formatted_paragraph(doc, '展示内容:', bold=True)
add_bullet_list(doc, [
'时间段',
'请款总金额',
'已审核金额',
'已付款金额',
'待付款金额',
'请款单数量'
])
doc.add_page_break()
# 3.5 系统设置
add_section_title(doc, '3.5 系统设置', 2)
add_section_title(doc, '3.5.1 企业组织架构管理', 3)
doc.add_paragraph('功能描述:支持自定义企业组织架构,建立部门层级关系。')
add_formatted_paragraph(doc, '功能特性:', bold=True)
add_bullet_list(doc, [
'支持多级部门结构',
'支持部门名称、编码、负责人设置',
'支持部门排序、启用/禁用',
'支持部门删除(需检查是否有人员关联)'
])
add_formatted_paragraph(doc, '示例组织架构:', bold=True)
doc.add_paragraph('公司名')
doc.add_paragraph(' ├── 商务部')
doc.add_paragraph(' │ ├── 业务一部')
doc.add_paragraph(' │ ├── 业务二部')
doc.add_paragraph(' │ └── 业务三部')
doc.add_paragraph(' ├── 行政部')
doc.add_paragraph(' └── 财务部')
add_section_title(doc, '3.5.2 账号管理', 3)
doc.add_paragraph('功能描述:管理系统用户账号,包括账号创建、角色分配、权限设置等。')
add_formatted_paragraph(doc, '账号属性:', bold=True)
add_bullet_list(doc, [
'账号(用户名,唯一标识)',
'密码(加密存储)',
'姓名',
'部门(关联组织架构)',
'职位',
'手机号',
'邮箱',
'角色(部门负责人/员工)',
'状态(启用/禁用)'
])
add_formatted_paragraph(doc, '角色权限:', bold=True)
add_bullet_list(doc, [
'部门负责人:可审核本部门员工提交的工作资料',
'员工:可提交工作资料,由直属部门领导审核',
'执业人员:只能查看和操作成果管理相关功能,专注提交业务成果及查询',
'财务人员:可查看发票及请款相关功能',
'总经理:拥有所有审核权限',
'系统管理员:拥有所有功能权限'
])
add_formatted_paragraph(doc, '权限管理:', bold=True)
doc.add_paragraph('系统需支持基于角色的权限控制RBAC可设定账号可查看和操作的功能模块。')
doc.add_paragraph('权限配置包括:')
add_numbered_list(doc, [
'功能模块权限(立项管理、过程管理、财务管理、报表管理等)',
'操作权限(查看、新增、编辑、删除、审核等)',
'数据权限(可查看的数据范围,如仅本部门数据)'
])
add_section_title(doc, '3.5.3 系统版本', 3)
doc.add_paragraph('系统需同时支持PC版和手机版提供不同的使用体验。')
add_formatted_paragraph(doc, 'PC版功能', bold=True)
add_bullet_list(doc, [
'完整的功能操作(资料提交、附件上传、报表查询等)',
'大屏展示,适合详细数据查看和复杂操作',
'支持批量操作、数据导出等高级功能',
'支持文件上传、下载等文件管理功能'
])
add_formatted_paragraph(doc, '手机版功能:', bold=True)
add_bullet_list(doc, [
'流程节点审核(快速审核,支持通过/驳回)',
'简单报表查询(关键数据展示)',
'提醒通知功能(审核待办提醒、工作通知)',
'消息推送(支持推送审核待办、流程进展等消息)',
'移动端优化界面,适配手机屏幕'
])
doc.add_page_break()
# ========== 4. 非功能需求 ==========
add_section_title(doc, '4. 非功能需求', 1)
add_section_title(doc, '4.1 性能要求', 2)
add_bullet_list(doc, [
'系统响应时间常规操作响应时间不超过2秒复杂查询不超过5秒',
'并发用户数支持至少50个用户同时在线使用',
'数据容量支持至少10万条项目记录',
'报表查询:大数据量报表查询支持分页,避免页面卡顿'
])
add_section_title(doc, '4.2 安全性要求', 2)
add_bullet_list(doc, [
'用户密码需加密存储,支持密码复杂度要求',
'数据传输采用HTTPS协议加密',
'操作日志记录:关键操作(新增、修改、删除、审核)需记录操作日志',
'权限控制:严格按角色和权限控制数据访问范围',
'防止SQL注入、XSS等安全漏洞'
])
add_section_title(doc, '4.3 可用性要求', 2)
add_bullet_list(doc, [
'系统可用性99%以上(排除计划内维护时间)',
'数据备份:每日自动备份,支持数据恢复',
'异常处理:友好的错误提示信息',
'浏览器兼容支持Chrome、Edge、Firefox等主流浏览器'
])
add_section_title(doc, '4.4 可维护性要求', 2)
add_bullet_list(doc, [
'代码规范:遵循开发规范,代码注释完整',
'日志记录:关键操作和异常需记录日志,便于问题排查',
'配置管理:系统参数、计算公式等可配置化',
'文档完善:提供技术文档、用户手册等'
])
add_section_title(doc, '4.5 用户体验要求', 2)
add_bullet_list(doc, [
'界面友好:界面简洁清晰,操作流程顺畅',
'响应式设计PC端和移动端界面适配良好',
'操作提示:关键操作有确认提示,避免误操作',
'数据校验:输入数据实时校验,及时提示错误',
'帮助文档:提供操作帮助和说明'
])
doc.add_page_break()
# ========== 5. 数据字典 ==========
add_section_title(doc, '5. 数据字典', 1)
add_section_title(doc, '5.1 核心数据表', 2)
doc.add_paragraph('主要数据表及其字段说明:')
add_section_title(doc, '5.1.1 项目立项表project_initiation', 3)
fields = [
('项目编号', 'project_no', 'VARCHAR(50)', '主键系统生成格式YY-N'),
('项目名称', 'project_name', 'VARCHAR(200)', '必填'),
('客户名称', 'customer_name', 'VARCHAR(200)', '必填'),
('服务内容', 'service_content', 'VARCHAR(100)', '下拉选择'),
('项目类型', 'project_type', 'VARCHAR(50)', '必填'),
('预计金额', 'estimated_amount', 'DECIMAL(18,2)', '必填'),
('立项日期', 'initiation_date', 'DATE', '必填'),
('申请人', 'applicant', 'VARCHAR(50)', '关联用户表'),
('项目状态', 'project_status', 'VARCHAR(50)', '已立项/投标中/已中标/已签合同/已启动等'),
('备注', 'remark', 'TEXT', '可选'),
('创建时间', 'create_time', 'DATETIME', '系统生成'),
('更新时间', 'update_time', 'DATETIME', '系统生成')
]
table = doc.add_table(rows=1, cols=4)
table.style = 'Light Grid Accent 1'
hdr_cells = table.rows[0].cells
hdr_cells[0].text = '字段说明'
hdr_cells[1].text = '字段名'
hdr_cells[2].text = '数据类型'
hdr_cells[3].text = '说明'
for desc, name, dtype, remark in fields:
row_cells = table.add_row().cells
row_cells[0].text = desc
row_cells[1].text = name
row_cells[2].text = dtype
row_cells[3].text = remark
add_section_title(doc, '5.1.2 项目启动表project_startup', 3)
fields2 = [
('启动编号', 'startup_no', 'VARCHAR(50)', '主键,系统生成'),
('关联项目编号', 'project_no', 'VARCHAR(50)', '外键,关联项目立项表'),
('启动日期', 'startup_date', 'DATE', '必填'),
('负责人', 'manager', 'VARCHAR(50)', '关联用户表'),
('预计完成日期', 'expected_complete_date', 'DATE', '必填'),
('启动状态', 'startup_status', 'VARCHAR(50)', '待审核/已启动/已完成等'),
('备注', 'remark', 'TEXT', '可选'),
('创建时间', 'create_time', 'DATETIME', '系统生成'),
('更新时间', 'update_time', 'DATETIME', '系统生成')
]
table2 = doc.add_table(rows=1, cols=4)
table2.style = 'Light Grid Accent 1'
hdr_cells2 = table2.rows[0].cells
hdr_cells2[0].text = '字段说明'
hdr_cells2[1].text = '字段名'
hdr_cells2[2].text = '数据类型'
hdr_cells2[3].text = '说明'
for desc, name, dtype, remark in fields2:
row_cells = table2.add_row().cells
row_cells[0].text = desc
row_cells[1].text = name
row_cells[2].text = dtype
row_cells[3].text = remark
doc.add_paragraph('注:详细的数据表结构需在数据库设计阶段进一步完善。')
doc.add_page_break()
# ========== 6. 接口规范 ==========
add_section_title(doc, '6. 接口规范(概要)', 1)
doc.add_paragraph('系统需提供RESTful API接口支持前后端分离架构。主要接口包括')
add_section_title(doc, '6.1 项目相关接口', 2)
add_bullet_list(doc, [
'POST /api/project/initiation - 提交立项申请',
'GET /api/project/list - 查询项目列表',
'GET /api/project/{id} - 查询项目详情',
'PUT /api/project/{id}/status - 更新项目状态',
'POST /api/project/startup - 提交启动申请'
])
add_section_title(doc, '6.2 审核相关接口', 2)
add_bullet_list(doc, [
'POST /api/approval/submit - 提交审核',
'GET /api/approval/pending - 查询待审核列表',
'POST /api/approval/{id}/approve - 审核通过',
'POST /api/approval/{id}/reject - 审核驳回'
])
add_section_title(doc, '6.3 报表相关接口', 2)
add_bullet_list(doc, [
'GET /api/report/project/detail - 项目明细表',
'GET /api/report/project/summary - 项目汇总表',
'GET /api/report/output/detail - 产值明细表',
'GET /api/report/output/summary - 产值汇总表',
'GET /api/report/finance/receivable - 应收账款报表',
'GET /api/report/finance/payable - 应付账款报表'
])
doc.add_paragraph('注:详细的接口规范需在接口设计文档中详细说明,包括请求参数、响应格式、错误码等。')
doc.add_page_break()
# ========== 7. 验收标准 ==========
add_section_title(doc, '7. 验收标准', 1)
add_section_title(doc, '7.1 功能验收', 2)
doc.add_paragraph('所有功能模块需满足以下验收标准:')
add_numbered_list(doc, [
'功能完整:所有需求文档中描述的功能均需实现',
'业务流程正确:各业务流程流转正确,状态更新准确',
'数据准确性:编号生成、数据计算、数据关联等准确无误',
'权限控制有效:各角色权限控制正确,数据隔离有效',
'异常处理完善:异常情况有合理的提示和处理'
])
add_section_title(doc, '7.2 性能验收', 2)
add_numbered_list(doc, [
'常规操作响应时间不超过2秒',
'复杂查询响应时间不超过5秒',
'支持50个用户同时在线使用',
'报表导出功能正常,大数据量下不超时'
])
add_section_title(doc, '7.3 兼容性验收', 2)
add_numbered_list(doc, [
'PC端支持Chrome、Edge、Firefox等主流浏览器',
'移动端支持iOS和Android系统',
'界面在不同分辨率下显示正常',
'响应式设计在不同设备上适配良好'
])
add_section_title(doc, '7.4 安全验收', 2)
add_numbered_list(doc, [
'用户密码加密存储',
'数据传输采用HTTPS',
'操作日志记录完整',
'SQL注入、XSS等安全漏洞测试通过'
])
doc.add_page_break()
# ========== 8. 项目计划 ==========
add_section_title(doc, '8. 项目计划(示例)', 1)
add_section_title(doc, '8.1 里程碑', 2)
milestones = [
('M1', '需求评审完成', '需求文档评审通过,确认需求范围', '待定'),
('M2', '原型与交互确认', '完成原型设计,确认交互流程', '待定'),
('M3', '数据库设计完成', '完成数据库设计,确认表结构', '待定'),
('M4', '接口设计完成', '完成接口设计文档,确认接口规范', '待定'),
('M5', '开发完成', '所有功能开发完成,包括前端和后端', '待定'),
('M6', '测试完成', '功能测试、性能测试、安全测试完成', '待定'),
('M7', '试运行', '系统上线试运行,收集反馈', '待定'),
('M8', '正式验收', '项目正式验收,交付使用', '待定')
]
table3 = doc.add_table(rows=1, cols=4)
table3.style = 'Light Grid Accent 1'
hdr_cells3 = table3.rows[0].cells
hdr_cells3[0].text = '里程碑'
hdr_cells3[1].text = '里程碑名称'
hdr_cells3[2].text = '说明'
hdr_cells3[3].text = '预计时间'
for mile, name, desc, time in milestones:
row_cells = table3.add_row().cells
row_cells[0].text = mile
row_cells[1].text = name
row_cells[2].text = desc
row_cells[3].text = time or '待定'
add_section_title(doc, '8.2 开发要点', 2)
doc.add_paragraph('开发过程中需重点关注以下要点:')
add_numbered_list(doc, [
'编号生成规则:项目编号、启动编号的生成规则需与业务规则完全一致,确保唯一性',
'审核流程配置:审核流程需支持可配置,便于后续调整',
'计算公式:产值、费用等计算公式需与财务口径对齐,支持配置化',
'数据关联:立项与启动、启动与成果等数据关联需准确,支持数据追溯',
'报表性能:报表查询需优化,大数据量下支持分页和导出',
'移动端适配:移动端界面需优化,确保操作便捷',
'消息通知:审核待办、流程进展等消息通知需及时准确'
])
# ========== 9. 附录 ==========
add_section_title(doc, '9. 附录', 1)
add_section_title(doc, '9.1 参考资料', 2)
add_bullet_list(doc, [
'OA系统功能定制方案原始需求文档',
'相关法律法规文件(如鄂价房字[2001]107号文等',
'系统原型图(见需求.md中的图片'
])
add_section_title(doc, '9.2 变更记录', 2)
doc.add_paragraph('本文档的变更记录:')
table4 = doc.add_table(rows=1, cols=4)
table4.style = 'Light Grid Accent 1'
hdr_cells4 = table4.rows[0].cells
hdr_cells4[0].text = '版本'
hdr_cells4[1].text = '日期'
hdr_cells4[2].text = '变更内容'
hdr_cells4[3].text = '变更人'
row_cells4 = table4.add_row().cells
row_cells4[0].text = 'v1.0'
row_cells4[1].text = datetime.now().strftime("%Y-%m-%d")
row_cells4[2].text = '初始版本'
row_cells4[3].text = '产品经理'
return doc
def main():
print("正在生成详细的产品需求文档...")
doc = generate_detailed_prd()
import os
from datetime import datetime
output_file = "需求文档_详细版.docx"
# 如果文件存在,添加时间戳
if os.path.exists(output_file):
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
output_file = f"需求文档_详细版_{timestamp}.docx"
doc.save(output_file)
print(f"✓ 文档生成成功!")
print(f" 文件路径: {output_file}")
print(f" 文档包含完整的功能需求、业务流程、数据字典、验收标准等内容")
if __name__ == "__main__":
main()