优化自动建案逻辑

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 == "申请用印":

View File

@@ -0,0 +1,18 @@
# Generated by Django - 案件变更申请增加「需要审批」字段
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('business', '0014_alter_prefiling_undertaker_and_more'),
]
operations = [
migrations.AddField(
model_name='casechangerequest',
name='need_approval',
field=models.BooleanField(default=True, verbose_name='需要审批'),
),
]

View File

@@ -110,8 +110,9 @@ class CaseChangeRequest(models.Model):
change_agreement = models.TextField() # 变更协议URL列表JSON格式
times = models.CharField(max_length=100) # 申请时间
applicant = models.CharField(max_length=100) # 申请人
state = models.CharField(max_length=100, default='审核中') # 状态:审核中、已通过、未通过
state = models.CharField(max_length=100, default='审核中') # 状态:审核中、待查看、已通过、未通过
approvers_order = models.TextField(null=True, blank=True) # 审核人顺序JSON格式存储["张三","李四","王五"]
need_approval = models.BooleanField(default=True, verbose_name='需要审批')
is_deleted = models.BooleanField(default=False) # 软删除标记
class SealApplication(models.Model):

View File

@@ -3730,15 +3730,22 @@ class CaseChangeRequestCreate(APIView):
'code': 1
}, status=status.HTTP_400_BAD_REQUEST)
# 获取审核人
approvers_list = get_change_approvers()
if not approvers_list:
return Response({
'status': 'error',
'message': '未找到管委会或行政部审批人,请先配置审批人',
'code': 1
}, status=status.HTTP_400_BAD_REQUEST)
# 是否需要审批(默认需要)
need_approval = request.data.get('need_approval', True)
if isinstance(need_approval, str):
need_approval = need_approval not in ('false', '0', '')
# 需要审批时获取审核人
approvers_list = []
if need_approval:
approvers_list = get_change_approvers()
if not approvers_list:
return Response({
'status': 'error',
'message': '未找到管委会或行政部审批人,请先配置审批人',
'code': 1
}, status=status.HTTP_400_BAD_REQUEST)
# 创建变更申请
today = datetime.now().strftime("%Y-%m-%d")
change_request = CaseChangeRequest.objects.create(
@@ -3750,35 +3757,58 @@ class CaseChangeRequestCreate(APIView):
times=today,
applicant=applicant_name,
state='审核中',
approvers_order=json.dumps(approvers_list, ensure_ascii=False)
approvers_order=json.dumps(approvers_list, ensure_ascii=False) if approvers_list else None,
need_approval=need_approval
)
# 如果提供了case_id更新案件的change_request字段
if case:
case.change_request = change_request
case.save(update_fields=['change_request'])
# 建审核记录
approvers_str = "".join(approvers_list)
# 建审批内容(不含审批流程,由 create_approval_with_team_logic 追加)
if case:
content = build_change_approval_content(
applicant_name, case, change_item, change_reason, agreement_urls
)
else:
content = f"{applicant_name}提交案件变更申请,合同编号:{contract_no},变更事项:{change_item},变更原因:{change_reason},变更协议:{', '.join(agreement_urls)}"
content = f"{content},审批流程:{approvers_str}(按顺序审批),当前审批人:{approvers_list[0]}"
Approval.objects.create(
title="案件变更申请",
content=content,
times=today,
personincharge=approvers_list[0],
state="审核中",
type="案件变更",
user_id=str(change_request.id)
)
from User.utils import create_approval_with_team_logic
if need_approval:
approval, approvers_order_json, needs_approval = create_approval_with_team_logic(
team_name=None,
approvers=approvers_list,
title="案件变更申请",
content=content,
approval_type="案件变更",
user_id=str(change_request.id),
business_record=change_request,
today=today,
applicant=applicant_name
)
if approval is None and needs_approval:
return Response({
'status': 'error',
'message': '未找到管委会或行政部审批人,请先配置审批人',
'code': 1
}, status=status.HTTP_400_BAD_REQUEST)
else:
approval, _, _ = create_approval_with_team_logic(
team_name=None,
approvers=[],
title="案件变更申请",
content=content,
approval_type="案件变更",
user_id=str(change_request.id),
business_record=change_request,
today=today,
applicant=applicant_name
)
change_request.state = "待查看"
change_request.save(update_fields=['state'])
return Response({
'message': '变更申请提交成功',
'code': 0,