From ce2e460a9314d28d953baccdcddbc061c70239a0 Mon Sep 17 00:00:00 2001 From: 27942 <1313123@342> Date: Sat, 31 Jan 2026 11:01:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=87=AA=E5=8A=A8=E5=BB=BA?= =?UTF-8?q?=E6=A1=88=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- User/utils.py | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/User/utils.py b/User/utils.py index e2a2015..8ef21e2 100644 --- a/User/utils.py +++ b/User/utils.py @@ -611,16 +611,23 @@ def get_approvers_from_record(business_record, approval=None): def ensure_case_for_approved_project(project, approval=None): """ - 立项审批通过后,若该立项尚未在案件管理中有对应案件,则自动创建一条案件记录。 - 立案时间使用审批通过时间(approval.completeTiem),案件会出现在案件管理列表中。 - + 立项审批进入「待查看」或「已通过」时,若该立项尚未在案件管理中有对应案件,则自动创建一条案件记录。 + 立案时间 = 最后审批人审批通过的时间(进入待查看时写入 approval.completeTiem),不再是申请人查看时间。 + - 待查看:最后一个审核人通过后即建案,立案时间 = 当日(completeTiem 在进入待查看时已写入)。 + - 已通过:申请人查看后若尚未建案则补建,立案时间仍用 approval.completeTiem(最后审批人通过日)。 + Args: - project: ProjectRegistration 实例,且 state 已为「已通过」 - approval: 可选,立项登记的 Approval 记录,用于取 completeTiem;不传则按 user_id 查询 + project: ProjectRegistration 实例 + approval: 可选,立项登记的 Approval 记录;不传则按 user_id 查询(仅查已通过) """ from business.models import Case, ProjectRegistration from .models import Approval as ApprovalModel - if not project or getattr(project, 'state', None) != "已通过": + if not project: + return + # 允许建案:立项已通过,或审批已进入待查看(审核人全部通过) + project_approved = getattr(project, 'state', None) == "已通过" + approval_pending_view = approval and getattr(approval, 'state', None) == "待查看" + if not project_approved and not approval_pending_view: return if Case.objects.filter(project_id=project.id, is_deleted=False).exists(): return @@ -702,15 +709,16 @@ def process_approval_flow(approval, business_record, current_approver, state, # 已通过、已查看、未传 state 均视为申请人已查看完成 if state == "已通过" or state == "已查看" or (state is None or state == ""): approval.state = "已通过" + # 立项登记在进入待查看时已写入 completeTiem(最后审批人通过时间),此处不改写;其他类型或未写时补写 if not approval.completeTiem: - approval.completeTiem = date.today() # 审批通过时间,用于案件立案时间等 + approval.completeTiem = date.today() if "已通过" not in approval.content: approval.content = (approval.content or "") + ",申请人已查看" approval.save(update_fields=['state', 'content', 'completeTiem']) if business_record and hasattr(business_record, 'state'): business_record.state = final_state_map.get("已通过", "已通过") business_record.save(update_fields=['state']) - # 立项审批通过后,自动在案件管理中创建案件(立案时间=审批通过时间) + # 立项:若待查看时已建案此处不会重复创建;若未建案则补建。立案时间不再按申请人查看日更新 if approval_type == "立项登记" and business_record: ensure_case_for_approved_project(business_record, approval=approval) return True, None @@ -811,9 +819,15 @@ def process_approval_flow(approval, business_record, current_approver, state, logger.info(f"process_approval_flow: 最后一个审核人已审核,流转到申请人待查看: {applicant}") approval.personincharge = applicant approval.state = "待查看" + # 立项登记:立案时间 = 最后审批人通过时间,在此刻写入 completeTiem + if approval_type == "立项登记": + approval.completeTiem = date.today() if "待申请人查看" not in (approval.content or ""): approval.content = (approval.content or "") + ",待申请人查看" - approval.save(update_fields=['state', 'personincharge', 'content']) + approval.save(update_fields=['state', 'personincharge', 'content', 'completeTiem'] if approval_type == "立项登记" else ['state', 'personincharge', 'content']) + # 立项登记:进入待查看时即自动建案,立案时间使用刚写入的 completeTiem(最后审批人通过日) + if approval_type == "立项登记" and business_record: + ensure_case_for_approved_project(business_record, approval=approval) # 不更新业务记录状态,等申请人查看后再设为已通过 return False, None # 其他类型:抄送财务 @@ -951,6 +965,9 @@ def create_approval_with_team_logic(team_name, approvers, title, content, approv user_id=str(user_id), applicant=applicant ) + # 立项登记:进入待查看时即自动建案(个人团队无审核人,直接待查看) + if approval_type == "立项登记" and business_record: + ensure_case_for_approved_project(business_record, approval=approval) # 不更新业务记录状态,等申请人查看后再设为已通过 return approval, None, False # 其他类型:个人团队或无团队,直接到财务团队审核