Files
cdtestplant_v1/apps/createDocument/extensions/documentTime.py

208 lines
11 KiB
Python
Raw Normal View History

2025-04-29 18:09:00 +08:00
# 本模块主要以项目开始时间、结束时间、轮次开始时间、结束时间计算文档中的各个时间
from datetime import timedelta, date
from apps.project.models import Project
from django.shortcuts import get_object_or_404
from ninja.errors import HttpError # 从代码抛出该异常被ninja截取变为response
def format_remove_heng(dateT: date) -> str:
"""该函数将date对象的横杠-去掉输出str"""
return str(dateT).replace('-', '')
def times_by_cover_time(cover_time: date) -> dict:
"""该函数为每个产品文档根据封面时间,渲染签署页时间、文档变更记录时间"""
return {
'preparation_time_no_format': cover_time - timedelta(days=2),
'preparation_time': format_remove_heng(cover_time - timedelta(days=2)), # 拟制时间:为编制结束时间-2天
'inspect_time': format_remove_heng(cover_time - timedelta(days=1)), # 校对时间:为编制时间+1天
'auditing_time': format_remove_heng(cover_time),
'ratify_time': format_remove_heng(cover_time),
'create_doc_time': format_remove_heng(cover_time - timedelta(days=2)),
'doc_v1_time': format_remove_heng(cover_time)
}
class DocTime:
def __init__(self, project_id: int):
self.project = get_object_or_404(Project, id=project_id)
# 用户录入时间-项目
self.p_start = self.project.beginTime # 被测件接收时间/
self.p_end = self.project.endTime # 大纲测评时间周期结束时间/
# 遍历轮次时间-多个
self.round_count = self.project.pField.count()
self.round_time = [] # 轮次按顺序排序
for round in self.project.pField.all():
self.round_time.append({
'start': round.beginTime,
'end': round.endTime,
'location': round.location
})
# ~~~~由上面时间二次计算得出时间~~~~ -> TODO:可由用户设置间隔时间!!!!
self.dg_bz_start = self.p_start + timedelta(days=1) # 大纲编制开始时间,项目开始时间+1天
self.dg_bz_end = self.dg_bz_start + timedelta(days=6) # 大纲编制结束时间,大纲编制开始+6天
self.test_sj_start = self.dg_bz_end + timedelta(days=1) # 测评设计与实现时间,在大纲编制结束+1天
self.test_sj_end = self.test_sj_start + timedelta(days=5) # 测评设计与实现结束,在开始+5天
# ~~~~储存每个文档的cover_time~~~~
self.dg_cover_time = self.dg_bz_end
self.sm_cover_time = self.test_sj_end
self.jl_cover_time = self.round_time[0]['end']
self.wtd_cover_time = self.round_time[-1]['end']
# 该函数生成大纲文档片段-测评时间和地点的时间和地点信息
def dg_address_time(self):
"""直接返回context去渲染"""
# 需要判断round_time是否有值
if len(self.round_time) <= 0:
raise HttpError(status_code=400, message='您还未创建轮次时间,请填写后生成')
return {
'start_year': self.p_start.year,
'start_month': self.p_start.month,
'end_year': self.p_end.year,
'end_month': self.p_end.month,
'beginTime_strf': format_remove_heng(self.p_start),
'dgCompileStart': format_remove_heng(self.dg_bz_start),
'dgCompileEnd': format_remove_heng(self.dg_bz_end),
'designStart': format_remove_heng(self.test_sj_start),
'designEnd': format_remove_heng(self.test_sj_end),
'location': self.round_time[0]['location']
}
# 该函数生成报告文档片段-测评时间和地点【注意使用了dg_address_time -> 所以后续有修改注意前导】
def bg_address_time(self):
if len(self.round_time) <= 0:
raise HttpError(status_code=400, message='您还未创建轮次时间,请填写后生成')
# 先使用大纲的时间行数作为前三行
cname = ['首轮测试', '第二轮测试', '第三轮测试', '第四轮测试', '第五轮测试', '第六轮测试', '第七轮测试',
'第八轮测试', '第九轮测试', '第十轮测试']
dg_address_time = self.dg_address_time()
round_time_list = []
index = 0
for round_dict in self.round_time:
one_dict = {
'name': cname[index],
'start': format_remove_heng(round_dict['start']),
'end': format_remove_heng(round_dict['end']),
'location': round_dict['location']
}
index += 1
round_time_list.append(one_dict)
return {
'begin_year': dg_address_time['start_year'],
'begin_month': dg_address_time['start_month'],
'end_year': dg_address_time['end_year'],
'end_month': dg_address_time['end_month'],
'begin_time': dg_address_time['beginTime_strf'],
'dg_weave_start_date': dg_address_time['dgCompileStart'],
'dg_weave_end_date': dg_address_time['dgCompileEnd'],
'sj_weave_start_date': dg_address_time['designStart'],
'sj_weave_end_date': dg_address_time['designEnd'],
'round_time_list': round_time_list,
# 测评总结 -> 依据项目结束时间-7 ~ 项目结束时间
'summary_start_date': format_remove_heng(self.p_end - timedelta(days=7)),
'summary_end_date': format_remove_heng(self.p_end),
}
# 生成报告中测评完成情况 -> 必须依据其他内容生成时间【注意使用了bg_address_time -> 所以后续有修改注意前导】
def bg_completion_situation(self):
bg_timer_dict = self.bg_address_time()
xq_fx_time_end = self.dg_bz_start + timedelta(days=2)
ch_time_start = xq_fx_time_end + timedelta(days=1)
ch_time_end = self.dg_bz_end
if len(self.round_time) < 1:
raise HttpError(status_code=400, message='您还未创建第一轮测试的时间,请填写后再生成')
return {
'start_time_year': bg_timer_dict['begin_year'],
'start_time_month': bg_timer_dict['begin_month'],
'xq_fx_time_start_year': self.dg_bz_start.year,
'xq_fx_time_start_month': self.dg_bz_start.month,
'xq_fx_time_start_day': self.dg_bz_start.day,
'xq_fx_time_end_year': xq_fx_time_end.year, # 需求分析结束时间是大纲编制开始+2
'xq_fx_time_end_month': xq_fx_time_end.month,
'xq_fx_time_end_day': xq_fx_time_end.day,
'ch_start_year': ch_time_start.year,
'ch_start_month': ch_time_start.month,
'ch_start_day': ch_time_start.day,
'ch_end_year': ch_time_end.year,
'ch_end_month': ch_time_end.month,
'ch_end_day': ch_time_end.day,
'sj_start_year': self.test_sj_start.year,
'sj_start_month': self.test_sj_start.month,
'sj_start_day': self.test_sj_start.day,
'sj_end_year': self.test_sj_end.year,
'sj_end_month': self.test_sj_end.month,
'sj_end_day': self.test_sj_end.day,
'end_time_year': self.p_end.year,
'end_time_month': self.p_end.month,
'exec_start_time_year': self.round_time[0]['start'].year,
'exec_start_time_month': self.round_time[0]['start'].month,
'exec_start_time_day': self.round_time[0]['start'].day,
'exec_end_time_year': self.round_time[0]['end'].year,
'exec_end_time_month': self.round_time[0]['end'].month,
'exec_end_time_day': self.round_time[0]['end'].day,
}
# 该函数生成最终大纲的时间
def dg_final_time(self):
cover_time = self.dg_bz_end
context = times_by_cover_time(cover_time)
context.update(cover_time=cover_time.strftime("%Y年%m月%d"))
# 新增给大纲模版10.2章节context
context.update(basic_line1=cover_time.strftime("%Y年%m月"), basic_line2=self.p_end.strftime("%Y年%m月"))
# 新增给大纲模版10.3.2章节的context
sm_context = self.sm_final_time()
context.update(sm_end_time=sm_context['preparation_time_no_format'].strftime("%Y年%m月"))
return context
# 该函数生成说明文档的时间 -> 依据项目时间而非用户第一轮填写时间!
def sm_final_time(self):
cover_time = self.test_sj_end # 封面时间:为大纲时间中“测评设计与实现”结束时间
context = times_by_cover_time(cover_time)
context.update(cover_time=cover_time.strftime("%Y年%m月%d"))
return context
# 该函数生成记录文档的时间 -> 依据第一轮测试用户填写的事件
def jl_final_time(self):
if len(self.round_time) < 1:
raise HttpError(status_code=400, message='您还未创建第一轮测试的时间,请填写后再生成')
cover_time = self.round_time[0]['end'] # 封面时间为用户填写第一轮结束时间
context = times_by_cover_time(cover_time)
context.update(cover_time=cover_time.strftime("%Y年%m月%d"))
return context
# 问题单的时间 -> 依据最后一轮次的结束时间+1天
def wtd_final_time(self):
if len(self.round_time) < 1:
raise HttpError(status_code=400, message='您还未创建第一轮测试的时间,请填写后再生成')
cover_time = self.round_time[-1]['end']
context = times_by_cover_time(cover_time)
context.update(cover_time=cover_time.strftime("%Y年%m月%d"))
return context
# 回归测试说明时间 -> 根据第二轮、第三轮...的开始时间
def hsm_final_time(self, round_key: str):
if len(self.round_time) < int(round_key) + 1:
raise HttpError(status_code=400, message='您填写的回归轮次时间不正确,请填写后再生成')
cover_time = self.round_time[int(round_key)]['start']
context = times_by_cover_time(cover_time)
context.update(cover_time=cover_time.strftime("%Y年%m月%d"))
return context
# 回归测试记录时间 -> 根据第二轮、第三轮...的结束时间
def hjl_final_time(self, round_key: str) -> dict:
if len(self.round_time) < int(round_key) + 1:
raise HttpError(status_code=400, message='您填写的回归轮次时间不正确,请填写后再生成')
cover_time = self.round_time[int(round_key)]['end']
context = times_by_cover_time(cover_time)
context.update(cover_time=cover_time.strftime("%Y年%m月%d"))
return context
# 生成报告非过程时间 -> 根据项目结束时间来定
def bg_final_time(self) -> dict:
if len(self.round_time) <= 0:
raise HttpError(status_code=400, message='您还未创建轮次时间,请填写后生成')
cover_time = self.p_end
# 这里做判断,如果项目结束时间/最后一轮结束时间
if cover_time < self.round_time[-1]['end']:
raise HttpError(500, message='项目结束时间早于最后一轮次结束时间或等于开始时间,请修改项目结束时间')
context = times_by_cover_time(cover_time)
context.update(cover_time=cover_time.strftime("%Y年%m月%d"))
return context