Files
cdtestplant_v1/apps/createDocument/extensions/documentTime.py
2025-04-29 18:09:00 +08:00

208 lines
11 KiB
Python
Raw 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.
# 本模块主要以项目开始时间、结束时间、轮次开始时间、结束时间计算文档中的各个时间
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