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

435 lines
22 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 -*-
"""
详细评估项目费用和周期
"""
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()