优化自动建案逻辑
This commit is contained in:
@@ -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 = " → 财务部(按顺序审批)"
|
||||
|
||||
@@ -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 == "申请用印":
|
||||
|
||||
18
business/migrations/0016_casechangerequest_need_approval.py
Normal file
18
business/migrations/0016_casechangerequest_need_approval.py
Normal 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='需要审批'),
|
||||
),
|
||||
]
|
||||
@@ -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):
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user