#!/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号文计算 × 折扣率'), ('招标代理', '依据鄂建文〔2023〕35号文计算 × 折扣率') ] 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()