435 lines
22 KiB
Python
435 lines
22 KiB
Python
#!/usr/bin/env python
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
详细评估项目费用和周期
|
||
"""
|
||
from docx import Document
|
||
from docx.shared import Pt, Inches
|
||
from docx.enum.text import WD_ALIGN_PARAGRAPH
|
||
from datetime import datetime, timedelta
|
||
from docx.oxml.ns import qn
|
||
|
||
def set_chinese_font(run, font_name='宋体'):
|
||
"""设置中文字体"""
|
||
run.font.name = font_name
|
||
run._element.rPr.rFonts.set(qn('w:eastAsia'), font_name)
|
||
|
||
def add_table_with_header(doc, headers, data, style='Light Grid Accent 1'):
|
||
"""创建带表头的表格"""
|
||
table = doc.add_table(rows=1, cols=len(headers))
|
||
table.style = style
|
||
|
||
hdr_cells = table.rows[0].cells
|
||
for i, header in enumerate(headers):
|
||
hdr_cells[i].text = header
|
||
for paragraph in hdr_cells[i].paragraphs:
|
||
for run in paragraph.runs:
|
||
run.bold = True
|
||
set_chinese_font(run)
|
||
|
||
for row_data in data:
|
||
row_cells = table.add_row().cells
|
||
for i, cell_data in enumerate(row_data):
|
||
row_cells[i].text = str(cell_data)
|
||
for paragraph in row_cells[i].paragraphs:
|
||
for run in paragraph.runs:
|
||
set_chinese_font(run)
|
||
|
||
return table
|
||
|
||
def generate_evaluation():
|
||
"""生成项目评估文档"""
|
||
doc = Document()
|
||
|
||
style = doc.styles['Normal']
|
||
font = style.font
|
||
font.name = '宋体'
|
||
font.size = Pt(12)
|
||
|
||
# 标题
|
||
title = doc.add_heading('OA系统项目详细评估报告', 0)
|
||
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||
|
||
doc.add_paragraph(f'评估日期:{datetime.now().strftime("%Y年%m月%d日")}')
|
||
doc.add_paragraph('评估说明:本文档基于详细需求文档,对项目工作量、周期和费用进行详细评估。')
|
||
|
||
doc.add_page_break()
|
||
|
||
# ========== 一、项目工作量评估 ==========
|
||
doc.add_heading('一、项目工作量评估', 1)
|
||
|
||
doc.add_heading('1.1 功能模块工作量分解', 2)
|
||
|
||
# 详细的工作量评估
|
||
work_items = [
|
||
# 需求与设计
|
||
('需求分析与原型设计', '需求调研、业务流程梳理、原型设计、需求文档编写', 15, '产品经理+UI设计师'),
|
||
('数据库设计', '数据库表结构设计、索引优化、数据字典编写', 8, '后端架构师'),
|
||
('接口设计', 'RESTful API设计、接口文档编写(Swagger)', 8, '后端架构师'),
|
||
('UI设计', 'PC端页面设计、移动端UI设计、设计规范制定', 15, 'UI设计师'),
|
||
|
||
# 后端开发
|
||
('用户权限模块', '用户管理、角色管理、权限控制、登录认证', 15, '后端开发'),
|
||
('组织架构模块', '部门管理、人员管理、组织树结构', 8, '后端开发'),
|
||
('商机管理模块', '立项申请、审核流程、项目查询、状态管理', 20, '后端开发'),
|
||
('项目过程管理模块', '项目启动、成果管理、进度查询、审核流程', 25, '后端开发'),
|
||
('财务管理模块', '开票管理、回款管理、请款管理', 15, '后端开发'),
|
||
('报表管理模块', '8种报表开发、数据统计、Excel/PDF导出', 25, '后端开发'),
|
||
('消息通知模块', '站内消息、邮件、短信、推送通知', 15, '后端开发'),
|
||
('附件管理模块', '文件上传、下载、预览、存储管理', 10, '后端开发'),
|
||
('审核流程引擎', '可配置审核流程、审核节点管理', 18, '后端开发'),
|
||
('产值计算引擎', '产值计算公式、费用计算', 12, '后端开发'),
|
||
('系统设置模块', '参数配置、流程配置', 8, '后端开发'),
|
||
|
||
# PC前端开发
|
||
('基础框架搭建', 'Vue3项目搭建、路由、状态管理、公共组件', 12, '前端开发'),
|
||
('用户权限前端', '登录页面、权限控制、菜单管理', 10, '前端开发'),
|
||
('商机管理前端', '立项申请页面、审核页面、项目查询页面', 15, '前端开发'),
|
||
('项目过程管理前端', '启动申请、成果提交、进度查询等页面', 20, '前端开发'),
|
||
('财务管理前端', '开票申请、回款管理、请款管理页面', 12, '前端开发'),
|
||
('报表管理前端', '8种报表页面、图表展示、数据导出', 18, '前端开发'),
|
||
('系统设置前端', '组织架构、账号管理、权限配置页面', 12, '前端开发'),
|
||
('通用组件开发', '表格、表单、上传、审核流程组件等', 10, '前端开发'),
|
||
|
||
# 移动端开发
|
||
('移动端框架搭建', '移动端项目搭建、路由、API封装', 8, '移动端开发'),
|
||
('移动端基础功能', '登录、首页、消息通知、个人信息', 10, '移动端开发'),
|
||
('移动端待办功能', '待办列表、审核操作、消息推送', 12, '移动端开发'),
|
||
('移动端查询功能', '项目查询、进度查询、简单报表', 10, '移动端开发'),
|
||
('移动端成果提交', '成果提交、附件上传(小文件)', 8, '移动端开发'),
|
||
|
||
# 测试
|
||
('单元测试', '后端单元测试、前端单元测试', 15, '测试工程师'),
|
||
('功能测试', '各模块功能测试、业务流程测试', 20, '测试工程师'),
|
||
('性能测试', '性能压力测试、并发测试', 8, '测试工程师'),
|
||
('安全测试', '安全漏洞扫描、SQL注入测试等', 8, '测试工程师'),
|
||
('兼容性测试', '浏览器兼容、移动端兼容测试', 8, '测试工程师'),
|
||
('用户验收测试', 'UAT测试、bug修复', 10, '测试+开发'),
|
||
|
||
# 部署与文档
|
||
('系统部署', '环境搭建、系统部署、数据库初始化', 5, '运维工程师'),
|
||
('数据迁移', '历史数据迁移(如有)', 5, '后端开发'),
|
||
('用户手册编写', '用户操作手册、管理员手册', 8, '产品/文档'),
|
||
('技术文档编写', '接口文档、数据库文档、部署文档', 6, '开发人员'),
|
||
('用户培训', '培训材料准备、培训实施(2次)', 5, '产品经理'),
|
||
]
|
||
|
||
table = add_table_with_header(doc, ['工作项', '工作内容', '工作量(人天)', '责任人'], work_items)
|
||
|
||
# 计算总工作量
|
||
total_days = sum(item[2] for item in work_items)
|
||
doc.add_paragraph()
|
||
p = doc.add_paragraph()
|
||
run = p.add_run(f'总工作量:{total_days}人天')
|
||
run.bold = True
|
||
set_chinese_font(run)
|
||
|
||
doc.add_heading('1.2 团队配置建议', 2)
|
||
|
||
team_config = [
|
||
('项目经理', 1, '全程', '项目协调、进度管理、风险管理'),
|
||
('产品经理', 1, '前期+中期', '需求分析、原型设计、测试验收'),
|
||
('UI设计师', 1, '前期', 'UI设计、交互设计'),
|
||
('后端架构师', 1, '前期+中期', '技术架构、数据库设计、核心模块开发'),
|
||
('后端开发', 3, '中期', '后端功能开发'),
|
||
('前端开发', 2, '中期', 'PC端前端开发'),
|
||
('移动端开发', 2, '中期', '移动端应用开发'),
|
||
('测试工程师', 2, '后期', '系统测试、性能测试、安全测试'),
|
||
('运维工程师', 1, '后期', '系统部署、环境配置')
|
||
]
|
||
|
||
table = add_table_with_header(doc, ['角色', '人数', '参与阶段', '主要职责'], team_config)
|
||
|
||
doc.add_page_break()
|
||
|
||
# ========== 二、详细项目周期 ==========
|
||
doc.add_heading('二、详细项目周期计划', 1)
|
||
|
||
doc.add_paragraph('项目总周期:18周(约4.5个月)')
|
||
doc.add_paragraph('说明:考虑到需求变更、节假日等因素,预留2周缓冲时间。')
|
||
|
||
doc.add_heading('2.1 第1-2周:需求分析与设计阶段', 2)
|
||
|
||
week1_2 = [
|
||
('第1周', '需求调研', '深入调研业务需求,梳理业务流程,确认需求细节'),
|
||
('第1周', '原型设计', '制作系统原型,包括主要功能页面的交互设计'),
|
||
('第1周', '需求评审', '组织需求评审会议,确认需求范围'),
|
||
('第2周', 'UI设计', '完成PC端和移动端的UI设计稿,确定设计规范'),
|
||
('第2周', '数据库设计', '完成数据库表结构设计,编写数据字典'),
|
||
('第2周', '接口设计', '完成API接口设计,编写接口文档'),
|
||
('第2周', '设计评审', '组织设计评审会议,确认技术方案')
|
||
]
|
||
|
||
table = add_table_with_header(doc, ['时间', '工作内容', '详细说明'], week1_2)
|
||
|
||
doc.add_heading('2.2 第3-10周:开发阶段', 2)
|
||
|
||
doc.add_heading('第3-4周:基础架构与核心模块', 3)
|
||
week3_4 = [
|
||
('第3周', '开发环境搭建', '开发环境、测试环境搭建,代码仓库初始化'),
|
||
('第3周', '基础框架开发', '后端框架搭建、前端框架搭建、移动端框架搭建'),
|
||
('第3周', '用户权限模块', '用户管理、角色权限、登录认证功能开发'),
|
||
('第3周', '组织架构模块', '部门管理、人员管理功能开发'),
|
||
('第4周', '审核流程引擎', '可配置审核流程引擎开发'),
|
||
('第4周', '消息通知模块', '站内消息、邮件、短信通知功能开发'),
|
||
('第4周', '附件管理模块', '文件上传、下载、预览功能开发'),
|
||
('第4周', '产值计算引擎', '产值和费用计算公式引擎开发')
|
||
]
|
||
|
||
table = add_table_with_header(doc, ['时间', '工作内容', '说明'], week3_4)
|
||
|
||
doc.add_heading('第5-6周:商机管理模块', 3)
|
||
week5_6 = [
|
||
('第5周', '后端开发', '立项申请、审核流程、项目查询后端接口开发'),
|
||
('第5周', '项目编号生成', '项目编号自动生成逻辑开发'),
|
||
('第6周', '前端页面开发', '立项申请页面、审核页面、项目查询页面开发'),
|
||
('第6周', '状态管理', '项目状态流转逻辑开发'),
|
||
('第6周', '模块联调测试', '商机管理模块前后端联调,功能测试')
|
||
]
|
||
|
||
table = add_table_with_header(doc, ['时间', '工作内容', '说明'], week5_6)
|
||
|
||
doc.add_heading('第7-8周:项目过程管理模块', 3)
|
||
week7_8 = [
|
||
('第7周', '后端开发', '项目启动、成果管理、进度查询后端接口开发'),
|
||
('第7周', '启动编号生成', '启动编号自动生成逻辑开发'),
|
||
('第7周', '数据关联', '立项与启动数据关联逻辑开发'),
|
||
('第8周', '前端页面开发', '启动申请、成果提交、进度查询页面开发'),
|
||
('第8周', '成果审核流程', '成果审核流程开发(初稿、对账、最终成果)'),
|
||
('第8周', '差异提醒功能', '初稿与对账金额差异提醒功能开发'),
|
||
('第8周', '模块联调测试', '项目过程管理模块前后端联调,功能测试')
|
||
]
|
||
|
||
table = add_table_with_header(doc, ['时间', '工作内容', '说明'], week7_8)
|
||
|
||
doc.add_heading('第9周:财务管理模块', 3)
|
||
week9 = [
|
||
('第9周', '后端开发', '开票管理、回款管理、请款管理后端接口开发'),
|
||
('第9周', '前端页面开发', '开票申请、回款管理、请款管理页面开发'),
|
||
('第9周', '财务审核流程', '开票和请款审核流程开发'),
|
||
('第9周', '模块联调测试', '财务管理模块前后端联调,功能测试')
|
||
]
|
||
|
||
table = add_table_with_header(doc, ['时间', '工作内容', '说明'], week9)
|
||
|
||
doc.add_heading('第10周:报表管理模块', 3)
|
||
week10 = [
|
||
('第10周', '报表后端开发', '8种报表的后端数据统计接口开发'),
|
||
('第10周', '报表前端开发', '报表页面、图表展示、数据导出功能开发'),
|
||
('第10周', 'Excel/PDF导出', '报表导出功能开发(Excel、PDF格式)'),
|
||
('第10周', '模块联调测试', '报表管理模块前后端联调,功能测试')
|
||
]
|
||
|
||
table = add_table_with_header(doc, ['时间', '工作内容', '说明'], week10)
|
||
|
||
doc.add_heading('第3-10周(并行):移动端开发', 3)
|
||
doc.add_paragraph('移动端开发与PC端开发并行进行:')
|
||
mobile_dev = [
|
||
('第3-4周', '移动端框架', '移动端项目搭建、基础功能开发'),
|
||
('第5-6周', '移动端待办', '待办列表、审核功能、消息推送开发'),
|
||
('第7-8周', '移动端查询', '项目查询、进度查询、简单报表开发'),
|
||
('第9-10周', '移动端成果', '成果提交、附件上传功能开发,整体联调')
|
||
]
|
||
|
||
table = add_table_with_header(doc, ['时间', '工作内容', '说明'], mobile_dev)
|
||
|
||
doc.add_heading('2.3 第11-14周:测试阶段', 2)
|
||
|
||
week11_14 = [
|
||
('第11周', '单元测试', '后端和前端单元测试,代码覆盖率要求≥70%'),
|
||
('第11周', '集成测试', '各模块集成测试,前后端联调测试'),
|
||
('第12周', '功能测试', '各模块功能测试,业务流程端到端测试'),
|
||
('第12周', 'bug修复', '修复测试中发现的问题'),
|
||
('第13周', '性能测试', '性能压力测试、并发测试、优化性能瓶颈'),
|
||
('第13周', '安全测试', '安全漏洞扫描、SQL注入测试、XSS测试等'),
|
||
('第14周', '兼容性测试', '主流浏览器兼容测试、移动端兼容测试'),
|
||
('第14周', '用户验收测试', 'UAT测试,收集用户反馈,修复问题')
|
||
]
|
||
|
||
table = add_table_with_header(doc, ['时间', '工作内容', '详细说明'], week11_14)
|
||
|
||
doc.add_heading('2.4 第15-16周:部署上线阶段', 2)
|
||
|
||
week15_16 = [
|
||
('第15周', '生产环境搭建', '生产服务器环境搭建、数据库配置'),
|
||
('第15周', '系统部署', '系统代码部署、数据库初始化、配置参数'),
|
||
('第15周', '数据迁移', '历史数据迁移(如有)、数据验证'),
|
||
('第16周', '上线试运行', '系统上线试运行,监控系统运行状态'),
|
||
('第16周', '问题修复', '修复试运行中发现的问题'),
|
||
('第16周', '性能优化', '根据实际运行情况优化系统性能')
|
||
]
|
||
|
||
table = add_table_with_header(doc, ['时间', '工作内容', '详细说明'], week15_16)
|
||
|
||
doc.add_heading('2.5 第17-18周:培训交付阶段', 2)
|
||
|
||
week17_18 = [
|
||
('第17周', '文档编写', '用户手册、管理员手册、技术文档编写'),
|
||
('第17周', '培训材料准备', '培训PPT、操作视频、FAQ文档准备'),
|
||
('第17周', '系统管理员培训', '系统管理员培训(配置、维护、故障处理)'),
|
||
('第18周', '业务用户培训', '业务用户培训(功能使用、操作演示)'),
|
||
('第18周', '文档交付', '交付所有项目文档和源代码'),
|
||
('第18周', '项目验收', '项目正式验收,签署验收报告')
|
||
]
|
||
|
||
table = add_table_with_header(doc, ['时间', '工作内容', '详细说明'], week17_18)
|
||
|
||
doc.add_page_break()
|
||
|
||
# ========== 三、项目费用评估 ==========
|
||
doc.add_heading('三、项目费用详细评估', 1)
|
||
|
||
doc.add_heading('3.1 人员成本评估', 2)
|
||
|
||
doc.add_paragraph('基于工作量和人员配置,按照市场平均工资水平评估:')
|
||
|
||
# 人员日薪参考(根据市场行情,一线城市)
|
||
daily_rates = [
|
||
('项目经理', 1200, '项目协调、进度管理'),
|
||
('产品经理', 1000, '需求分析、原型设计'),
|
||
('UI设计师', 800, 'UI设计、交互设计'),
|
||
('后端架构师', 1500, '技术架构、核心开发'),
|
||
('后端开发工程师', 1200, '后端功能开发'),
|
||
('前端开发工程师', 1200, '前端页面开发'),
|
||
('移动端开发工程师', 1300, '移动应用开发'),
|
||
('测试工程师', 900, '系统测试'),
|
||
('运维工程师', 1000, '系统部署')
|
||
]
|
||
|
||
table = add_table_with_header(doc, ['角色', '日薪(元)', '说明'], daily_rates)
|
||
|
||
# 计算各角色工作量
|
||
role_workload = [
|
||
('项目经理', 18*5, '全程参与,每周5天'),
|
||
('产品经理', (2+2+4)*5, '需求2周+设计2周+测试验收4周'),
|
||
('UI设计师', 3*5, '设计阶段3周'),
|
||
('后端架构师', (2+8)*5, '设计2周+核心开发8周'),
|
||
('后端开发工程师', 8*5*3, '开发8周,3人并行'),
|
||
('前端开发工程师', 8*5*2, '开发8周,2人并行'),
|
||
('移动端开发工程师', 8*5*2, '开发8周,2人并行'),
|
||
('测试工程师', 4*5*2, '测试4周,2人并行'),
|
||
('运维工程师', 2*5, '部署2周')
|
||
]
|
||
|
||
doc.add_heading('3.2 人力成本详细计算', 2)
|
||
|
||
cost_details = []
|
||
total_human_cost = 0
|
||
|
||
for role, days, rate_info in [
|
||
('项目经理', 90, 1200),
|
||
('产品经理', 40, 1000),
|
||
('UI设计师', 15, 800),
|
||
('后端架构师', 50, 1500),
|
||
('后端开发工程师', 360, 1200), # 8周*5天*3人 = 120天*3
|
||
('前端开发工程师', 240, 1200), # 8周*5天*2人 = 80天*2
|
||
('移动端开发工程师', 240, 1300), # 8周*5天*2人
|
||
('测试工程师', 160, 900), # 4周*5天*2人 = 40天*2
|
||
('运维工程师', 10, 1000),
|
||
]:
|
||
cost = days * rate_info
|
||
total_human_cost += cost
|
||
cost_details.append((role, f'{days}人天', f'¥{rate_info}/天', f'¥{cost:,}'))
|
||
|
||
table = add_table_with_header(doc, ['角色', '工作量', '日薪', '小计'], cost_details)
|
||
|
||
doc.add_paragraph()
|
||
p = doc.add_paragraph()
|
||
run = p.add_run(f'人力成本小计:¥{total_human_cost:,}')
|
||
run.bold = True
|
||
run.font.size = Pt(14)
|
||
set_chinese_font(run)
|
||
|
||
doc.add_heading('3.3 其他成本', 2)
|
||
|
||
other_costs = [
|
||
('服务器及云服务', '¥20,000', '开发测试环境、生产环境云服务器(1年)'),
|
||
('第三方服务', '¥15,000', '短信服务、邮件服务、云存储等'),
|
||
('软件授权', '¥10,000', '开发工具、测试工具授权费用'),
|
||
('差旅费', '¥15,000', '需求调研、培训、现场支持差旅费用'),
|
||
('办公及杂费', '¥10,000', '办公用品、会议费用等'),
|
||
('风险准备金', f'¥{int(total_human_cost*0.1):,}', '需求变更、延期等风险准备金(10%)')
|
||
]
|
||
|
||
table = add_table_with_header(doc, ['费用项目', '金额', '说明'], other_costs)
|
||
|
||
total_other = 20000 + 15000 + 10000 + 15000 + 10000 + int(total_human_cost*0.1)
|
||
|
||
doc.add_paragraph()
|
||
p = doc.add_paragraph()
|
||
run = p.add_run(f'其他成本小计:¥{total_other:,}')
|
||
run.bold = True
|
||
set_chinese_font(run)
|
||
|
||
doc.add_heading('3.4 项目费用汇总', 2)
|
||
|
||
total_project_cost = total_human_cost + total_other
|
||
profit_rate = 0.25 # 利润率25%
|
||
final_price = int(total_project_cost * (1 + profit_rate))
|
||
|
||
summary = [
|
||
('人力成本', f'¥{total_human_cost:,}', '开发、测试、管理等人力成本'),
|
||
('其他成本', f'¥{total_other:,}', '服务器、第三方服务、差旅等'),
|
||
('成本合计', f'¥{total_project_cost:,}', ''),
|
||
('利润(25%)', f'¥{int(total_project_cost*profit_rate):,}', ''),
|
||
('项目总价(含税)', f'¥{final_price:,}', '含6%增值税')
|
||
]
|
||
|
||
table = add_table_with_header(doc, ['费用项目', '金额', '说明'], summary)
|
||
|
||
doc.add_paragraph()
|
||
doc.add_paragraph('说明:')
|
||
doc.add_paragraph('1. 以上费用基于一线城市市场行情评估')
|
||
doc.add_paragraph('2. 人力成本按实际工作量计算,已考虑人员并行工作')
|
||
doc.add_paragraph('3. 项目总价包含12个月质保期维护费用(质保期bug修复免费)')
|
||
doc.add_paragraph('4. 如需求发生重大变更,费用和周期需重新评估')
|
||
doc.add_paragraph('5. 以上价格可参考,实际报价需根据具体情况进行调整')
|
||
|
||
doc.add_page_break()
|
||
|
||
# ========== 四、风险与建议 ==========
|
||
doc.add_heading('四、风险评估与建议', 1)
|
||
|
||
doc.add_heading('4.1 项目风险', 2)
|
||
|
||
risks = [
|
||
('需求变更风险', '高', '需求变更可能导致工期延长和费用增加', '建立需求变更流程,变更需双方确认'),
|
||
('技术难点风险', '中', '审核流程引擎、产值计算引擎等技术难点', '提前技术预研,预留技术攻关时间'),
|
||
('人员风险', '中', '关键人员离职或请假影响进度', '建立知识文档,确保知识传承'),
|
||
('第三方服务风险', '低', '第三方服务(短信、邮件)不稳定', '选择稳定可靠的第三方服务商')
|
||
]
|
||
|
||
table = add_table_with_header(doc, ['风险', '风险等级', '风险描述', '应对措施'], risks)
|
||
|
||
doc.add_heading('4.2 优化建议', 2)
|
||
|
||
suggestions = [
|
||
('分阶段交付', '可以分阶段交付,先交付核心功能,再逐步完善其他功能', '降低风险,加快核心功能上线'),
|
||
('MVP版本', '先做最小可行产品(MVP),包含核心业务流程', '快速验证需求,降低开发成本'),
|
||
('敏捷开发', '采用敏捷开发方式,快速迭代,及时调整', '提高开发效率,降低变更成本'),
|
||
('技术选型', '使用成熟的技术框架,降低技术风险', '提高开发效率,保证系统稳定性')
|
||
]
|
||
|
||
table = add_table_with_header(doc, ['建议', '方案', '优势'], suggestions)
|
||
|
||
return doc, final_price, total_days
|
||
|
||
def main():
|
||
print("正在生成详细的项目评估报告...")
|
||
doc, final_price, total_days = generate_evaluation()
|
||
|
||
output_file = "项目评估报告.docx"
|
||
doc.save(output_file)
|
||
|
||
print(f"\n✓ 项目评估报告生成成功!")
|
||
print(f" 文件路径: {output_file}")
|
||
print(f"\n评估结果摘要:")
|
||
print(f" - 总工作量: {total_days}人天")
|
||
print(f" - 项目周期: 18周(约4.5个月)")
|
||
print(f" - 项目总价: ¥{final_price:,}(含税)")
|
||
print(f"\n详细内容请查看文档。")
|
||
|
||
if __name__ == "__main__":
|
||
main()
|
||
|