111 lines
6.6 KiB
Python
111 lines
6.6 KiB
Python
#!/usr/bin/env python
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
根据已有的需求 Markdown,生成结构化的产品需求文档(PRD)到需求文档.docx。
|
||
"""
|
||
from pathlib import Path
|
||
from docx import Document
|
||
|
||
|
||
def build_prd(doc: Document):
|
||
# 标题
|
||
doc.add_heading("OA 系统产品需求文档(PRD)", level=0)
|
||
doc.add_paragraph("版本:v1.0")
|
||
doc.add_paragraph("说明:依据《需求.md》内容整理的产品需求文档。")
|
||
|
||
# 一、总体需求
|
||
doc.add_heading("一、总体需求", level=1)
|
||
doc.add_heading("1.1 管理要求", level=2)
|
||
doc.add_paragraph("围绕项目全生命周期管理,要求可视化流程、状态跟踪、审核留痕。")
|
||
|
||
doc.add_heading("1.2 业务流程", level=2)
|
||
doc.add_paragraph("支持从商机立项→投标→合同→项目启动→成果→回款/请款→报表的端到端流程。")
|
||
doc.add_paragraph("注:实际可能存在直接启动(不投标/不签合同)的场景,系统需支持项目状态标识。")
|
||
|
||
# 二、功能建设(五大板块)
|
||
doc.add_heading("二、功能建设", level=1)
|
||
doc.add_paragraph("需求集中在项目过程、状态,以及产值与回款统计,功能分为五个板块。")
|
||
|
||
# 2.1 商机(立项)管理
|
||
doc.add_heading("2.1 商机(立项)管理", level=2)
|
||
doc.add_paragraph("主流程:立项 → 审核")
|
||
doc.add_paragraph("立项:商务提交表单,经营管理部及总经理依次审核。")
|
||
doc.add_paragraph("投标:修改项目状态为“投标”,可上传附件。")
|
||
doc.add_paragraph("合同:修改项目状态为“已签合同”,可上传合同附件。")
|
||
doc.add_paragraph("项目查询:按项目编号、名称、服务内容、状态等查询,展示状态与金额。")
|
||
doc.add_paragraph("规则:项目编号=年份+序号(当年递增);服务内容可选结算审计/概算/清单控制价/工程咨询/跟踪审计/项目管理/工程监理。")
|
||
doc.add_paragraph("结算类项目需提交初稿、对账、最终成果;其他类型可直接提交最终成果。")
|
||
|
||
# 2.2 项目过程管理
|
||
doc.add_heading("2.2 项目过程管理", level=2)
|
||
doc.add_paragraph("主流程:启动 → 成果 → 进度查询")
|
||
doc.add_paragraph("项目启动:可关联立项;可多次启动;可多人指派;启动单关联立项数据自动导入。")
|
||
doc.add_paragraph("启动编号规则:立项编号+项目类型数字+启动序号(例:25-3-2-4)。")
|
||
doc.add_paragraph("服务内容子项分配:结算审计/工程咨询/跟踪审计/项目管理/工程监理等子项多选。")
|
||
doc.add_paragraph("成果管理:结算类需初稿/对账/最终成果;多人提交需组长与领导审核;初稿与对账差异大需提醒。")
|
||
doc.add_paragraph("进度查询:按名称、客户、执业者等条件查询执行中项目。")
|
||
doc.add_paragraph("计算公式参考:")
|
||
doc.add_paragraph("工程咨询:鄂价房字[2001]107号 * 折扣率")
|
||
doc.add_paragraph("工程造价:鄂价工服规[2012]149号 * 折扣率")
|
||
doc.add_paragraph("工程监理:发改价格[2007]670号 * 专业/复杂度/高程调整 * 折扣率")
|
||
doc.add_paragraph("工程设计:计价格[2002]10号 * 折扣率")
|
||
doc.add_paragraph("工程代建:财建[2016]504号 * 折扣率")
|
||
doc.add_paragraph("招标代理:鄂建文〔2023〕35号 * 折扣率")
|
||
|
||
# 2.3 财务管理
|
||
doc.add_heading("2.3 财务管理", level=2)
|
||
doc.add_paragraph("主流程:开票请款 → 回款")
|
||
doc.add_paragraph("回款流程:商务选项目(有合同或正式成果),提交开票申请;财务开票并填金额;回款后录入回款金额,状态变为“已回款”。")
|
||
doc.add_paragraph("请款流程:商务提交请款,GM 审核,出纳放款,状态变为“已付款”。")
|
||
|
||
# 2.4 报表管理
|
||
doc.add_heading("2.4 报表管理", level=2)
|
||
doc.add_paragraph("项目报表:项目明细表(立项到回款全链路),项目汇总表(按状态、负责人汇总)。")
|
||
doc.add_paragraph("产值报表:产值明细表(按执业者完成进度分解),产值汇总表(执业者维度、时间段统计)。")
|
||
doc.add_paragraph("产值计算比例参考:结算审计30/30/10/30;工程咨询30/20/50;跟踪审计60/40;项目管理40/60;工程监理60/40。")
|
||
doc.add_paragraph("财务报表:应收账款汇总/明细(按客户)、应付账款明细/汇总(对应请款)。")
|
||
|
||
# 2.5 系统设置
|
||
doc.add_heading("2.5 系统设置", level=2)
|
||
doc.add_paragraph("组织架构:自定义部门层级。")
|
||
doc.add_paragraph("账号管理:账号角色、部门负责人/员工,权限可控;默认直属领导审核;执业人员仅看成果相关,财务看发票/请款。")
|
||
doc.add_paragraph("系统版本:PC 版(资料提交、附件上传、报表查询)、手机版(流程审核、简单报表、提醒通知)。")
|
||
|
||
# 非功能/质量要求(补充)
|
||
doc.add_heading("三、非功能与质量要求(补充)", level=1)
|
||
doc.add_paragraph("权限与审核:全流程节点审核留痕;按角色/部门授权;附件留存。")
|
||
doc.add_paragraph("编号与一致性:项目/启动编号自动生成且唯一;跨单据数据自动带出。")
|
||
doc.add_paragraph("提醒与通知:审核待办、对账差异提醒、回款/请款节点提醒。")
|
||
doc.add_paragraph("多端支持:PC + 移动端;移动端关注待办与通知。")
|
||
doc.add_paragraph("报表性能:支持按条件查询、导出;状态/人员维度汇总。")
|
||
|
||
# 里程碑(简版,可后续细化)
|
||
doc.add_heading("四、里程碑(示例)", level=1)
|
||
doc.add_paragraph("M1:需求评审完成")
|
||
doc.add_paragraph("M2:原型&交互确认")
|
||
doc.add_paragraph("M3:开发完成(含接口与前端)")
|
||
doc.add_paragraph("M4:联调与测试通过")
|
||
doc.add_paragraph("M5:试运行与验收")
|
||
|
||
# 开发与验收要点(简版)
|
||
doc.add_heading("五、开发与验收要点(示例)", level=1)
|
||
doc.add_paragraph("1) 编号生成、跨单据数据带出需联调确认。")
|
||
doc.add_paragraph("2) 审核链可配置(经营管理部→总经理→财务/组长等)。")
|
||
doc.add_paragraph("3) 产值/费用/回款计算公式需与财务口径对齐。")
|
||
doc.add_paragraph("4) 报表字段、过滤条件、导出格式需评审确认。")
|
||
doc.add_paragraph("5) 移动端待办/提醒体验需验证。")
|
||
|
||
|
||
def main():
|
||
output = Path("需求文档.docx")
|
||
doc = Document()
|
||
build_prd(doc)
|
||
doc.save(output)
|
||
print(f"已生成: {output.resolve()}")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|
||
|
||
|