优化自动建案逻辑

This commit is contained in:
27942
2026-01-31 11:52:22 +08:00
parent e18eb60072
commit 812f4906b3
5 changed files with 114 additions and 78 deletions

View File

@@ -688,7 +688,13 @@ def process_approval_flow(approval, business_record, current_approver, state,
if final_state_map is None:
final_state_map = {"已通过": "已完成", "未通过": "未通过"}
def _sync_case_state_if_change_request(approval_type, business_record):
"""案件变更申请状态变更时,同步关联案件的状态"""
if approval_type == "案件变更" and business_record and getattr(business_record, 'case', None) and business_record.case_id:
business_record.case.state = business_record.state
business_record.case.save(update_fields=['state'])
# 如果审核不通过,直接结束
if state == "未通过":
approval.state = "未通过"
@@ -700,6 +706,7 @@ def process_approval_flow(approval, business_record, current_approver, state,
if business_record and hasattr(business_record, 'state'):
business_record.state = final_state_map.get("未通过", "未通过")
business_record.save(update_fields=['state'])
_sync_case_state_if_change_request(approval_type, business_record)
return True, None
@@ -718,6 +725,7 @@ def process_approval_flow(approval, business_record, current_approver, state,
if business_record and hasattr(business_record, 'state'):
business_record.state = final_state_map.get("已通过", "已通过")
business_record.save(update_fields=['state'])
_sync_case_state_if_change_request(approval_type, business_record)
# 立项:若待查看时已建案此处不会重复创建;若未建案则补建。立案时间不再按申请人查看日更新
if approval_type == "立项登记" and business_record:
ensure_case_for_approved_project(business_record, approval=approval)
@@ -730,6 +738,7 @@ def process_approval_flow(approval, business_record, current_approver, state,
if business_record and hasattr(business_record, 'state'):
business_record.state = final_state_map.get("未通过", "未通过")
business_record.save(update_fields=['state'])
_sync_case_state_if_change_request(approval_type, business_record)
return True, None
return False, None
@@ -746,6 +755,7 @@ def process_approval_flow(approval, business_record, current_approver, state,
if business_record and hasattr(business_record, 'state'):
business_record.state = final_state_map.get("已通过", "已通过")
business_record.save(update_fields=['state'])
_sync_case_state_if_change_request(approval_type, business_record)
elif state == "未通过":
approval.state = "未通过"
# 保存不通过原因
@@ -756,6 +766,7 @@ def process_approval_flow(approval, business_record, current_approver, state,
if business_record and hasattr(business_record, 'state'):
business_record.state = final_state_map.get("未通过", "未通过")
business_record.save(update_fields=['state'])
_sync_case_state_if_change_request(approval_type, business_record)
return True, None
@@ -781,6 +792,7 @@ def process_approval_flow(approval, business_record, current_approver, state,
# 使用 final_state_map 确保状态映射正确(如待办类型:已通过 -> 已完成)
business_record.state = final_state_map.get("已通过", "已通过")
business_record.save(update_fields=['state'])
_sync_case_state_if_change_request(approval_type, business_record)
return False, None
# 有审核人列表(多人团队),按顺序流转
@@ -813,9 +825,9 @@ def process_approval_flow(approval, business_record, current_approver, state,
logger.info(f"process_approval_flow: 已更新审批记录personincharge={next_approver}, state=审核中")
return False, None
else:
# 最后一个审核人已通过:投标/立项转申请人待查看,其他类型抄送财务
# 最后一个审核人已通过:投标/立项/案件变更转申请人待查看,其他类型抄送财务
applicant = getattr(approval, 'applicant', None)
if approval_type in ("投标登记", "立项登记") and applicant:
if approval_type in ("投标登记", "立项登记", "案件变更") and applicant:
logger.info(f"process_approval_flow: 最后一个审核人已审核,流转到申请人待查看: {applicant}")
approval.personincharge = applicant
approval.state = "待查看"
@@ -843,6 +855,7 @@ def process_approval_flow(approval, business_record, current_approver, state,
final_state = final_state_map.get("已通过", "已通过")
business_record.state = final_state
business_record.save(update_fields=['state'])
_sync_case_state_if_change_request(approval_type, business_record)
logger.info(f"process_approval_flow: 已抄送财务部personincharge=%s, state=已抄送财务,业务记录状态=%s", approval.personincharge, final_state_map.get("已通过", "已通过"))
return False, None
@@ -923,8 +936,8 @@ def create_approval_with_team_logic(team_name, approvers, title, content, approv
# 创建审批记录,第一个审核人
first_approver = approvers_list[0]
approvers_str = ''.join(approvers_list) # 使用箭头表示顺序
# 投标登记/立项登记:最后一步给申请人(待查看),不再给财务部
if approval_type in ("投标登记", "立项登记") and applicant:
# 投标登记/立项登记/案件变更:最后一步给申请人(待查看),不再给财务部
if approval_type in ("投标登记", "立项登记", "案件变更") and applicant:
flow_suffix = " → 申请人(待查看)"
else:
flow_suffix = " → 财务部(按顺序审批)"
@@ -952,8 +965,8 @@ def create_approval_with_team_logic(team_name, approvers, title, content, approv
# 如果没有传入审核人,则根据团队类型判断
# 判断团队类型
if not team_name or not team or (team and team.team_type == 'personal'):
# 投标登记/立项登记且传入了申请人:最后一步给申请人,生成待查看待办(不再给财务部)
if approval_type in ("投标登记", "立项登记") and applicant:
# 投标登记/立项登记/案件变更且传入了申请人:最后一步给申请人,生成待查看待办(不再给财务部)
if approval_type in ("投标登记", "立项登记", "案件变更") and applicant:
content_to_save = content + ",待申请人查看"
approval = Approval.objects.create(
title=title,
@@ -1034,7 +1047,7 @@ def create_approval_with_team_logic(team_name, approvers, title, content, approv
# 创建审批记录,第一个审核人
first_approver = approvers_list[0]
approvers_str = ''.join(approvers_list)
if approval_type in ("投标登记", "立项登记") and applicant:
if approval_type in ("投标登记", "立项登记", "案件变更") and applicant:
flow_suffix = " → 申请人(待查看)"
else:
flow_suffix = " → 财务部(按顺序审批)"

View File

@@ -2100,51 +2100,25 @@ class approvalProcessing(APIView):
except CaseChangeRequest.DoesNotExist:
return Response({'status': 'error', 'message': '变更申请记录不存在或已被删除', 'code': 1}, status=status.HTTP_404_NOT_FOUND)
# 审核中时必须传 state已通过/未通过);待查看时申请人查看可传 已通过/已查看 或不传
if approval.state == "审核中" and not state:
return Response({'status': 'error', 'message': '缺少参数state审核状态已通过/未通过)', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
from User.utils import process_approval_flow
current_approver = approval.personincharge
is_completed, error = process_approval_flow(
approval=approval,
business_record=change_request,
current_approver=current_approver,
state=state,
approval_type="案件变更",
final_state_map={"已通过": "已通过", "未通过": "未通过"},
rejection_reason=rejection_reason
)
if state == "未通过":
approval.state = "未通过"
change_request.state = "未通过"
# 保存不通过原因
if rejection_reason:
approval.rejection_reason = rejection_reason
approval.save(update_fields=['state', 'rejection_reason'])
change_request.save(update_fields=['state'])
return Response({'message': '处理成功', 'code': 0}, status=status.HTTP_200_OK)
if error:
return Response({'status': 'error', 'message': error, 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
approvers_list = get_approvers_from_record(change_request, approval=approval)
if not approvers_list:
approval.state = "已通过"
change_request.state = "已通过"
approval.save(update_fields=['state'])
change_request.save(update_fields=['state'])
return Response({'message': '处理成功', 'code': 0}, status=status.HTTP_200_OK)
try:
current_index = approvers_list.index(current_approver)
except ValueError:
approval.state = "已通过"
change_request.state = "已通过"
approval.save(update_fields=['state'])
change_request.save(update_fields=['state'])
return Response({'message': '处理成功', 'code': 0}, status=status.HTTP_200_OK)
if current_index < len(approvers_list) - 1:
next_approver = approvers_list[current_index + 1]
approval.personincharge = next_approver
approval.state = "审核中"
if "当前审批人:" in approval.content:
approval.content = approval.content.replace(
f"当前审批人:{current_approver}",
f"当前审批人:{next_approver}"
)
approval.save(update_fields=['state', 'personincharge', 'content'])
return Response({'message': '处理成功', 'code': 0}, status=status.HTTP_200_OK)
approval.state = "已通过"
change_request.state = "已通过"
approval.save(update_fields=['state'])
change_request.save(update_fields=['state'])
return Response({'message': '处理成功', 'code': 0}, status=status.HTTP_200_OK)
if type == "申请用印":