优化案件模块

This commit is contained in:
27942
2026-01-21 10:34:51 +08:00
parent 48c361edba
commit 7c3629e1b9
2 changed files with 125 additions and 8 deletions

View File

@@ -1659,7 +1659,10 @@ class approvalProcessing(APIView):
# 检查当前是否已经是财务审核
if is_finance_personincharge(approval.personincharge) and approval.state == "已抄送财务":
# 财务部审核逻辑:财务部只需要一个人审核完即可完成
# 财务部审核逻辑:如果只传了type和id不传state则默认为"已通过"
if not state:
state = "已通过"
if state == "已通过":
approval.state = "已通过"
seal_app.state = "已通过"
@@ -1670,7 +1673,11 @@ class approvalProcessing(APIView):
seal_app.save(update_fields=['state'])
return Response({'message': '处理成功', 'code': 0}, status=status.HTTP_200_OK)
# 使用统一的审核流程处理函数
# 使用统一的审核流程处理函数(与付款申请、报销申请逻辑一样)
# 非财务查看时state参数是必填的
if 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(
@@ -2190,6 +2197,7 @@ class ApprovalStatusCheck(APIView):
def post(self, request, *args, **kwargs):
"""
查询待办的审核状态,判断是否已经审核完全通过
财务部查看时,自动将状态从"已抄送财务"更新为"已通过",使其从待办列表中移除
:param request:
:param args:
:param kwargs:
@@ -2197,6 +2205,7 @@ class ApprovalStatusCheck(APIView):
"""
type = request.data.get('type')
id = request.data.get('id')
token = request.META.get('token')
if not all([type, id]):
return Response({'status': 'error', 'message': '缺少参数type或id', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
@@ -2206,6 +2215,24 @@ class ApprovalStatusCheck(APIView):
except Approval.DoesNotExist:
return Response({'status': 'error', 'message': '审批记录不存在或已被删除', 'code': 1}, status=status.HTTP_404_NOT_FOUND)
# 获取当前用户信息,判断是否是财务部人员
is_finance_view = False
if token:
try:
current_user = User.objects.prefetch_related('department').get(token=token, is_deleted=False)
user_departments = current_user.department.values_list('username', flat=True)
user_department_names = list(user_departments)
is_finance_user = '财务部' in user_department_names
# 如果是财务部人员,且当前审批状态是"已抄送财务",则自动标记为已查看(已通过)
if is_finance_user and is_finance_personincharge(approval.personincharge) and approval.state == "已抄送财务":
is_finance_view = True
# 自动将状态更新为"已通过"
approval.state = "已通过"
approval.save(update_fields=['state'])
except User.DoesNotExist:
pass
# 获取业务记录状态
business_state = None
is_approved = False
@@ -2217,6 +2244,7 @@ class ApprovalStatusCheck(APIView):
income = Income.objects.get(id=approval.user_id, is_deleted=False)
business_state = income.state
is_approved = (income.state == "已通过")
# 如果财务查看,且业务记录状态还是"已通过"(之前已经是已通过),保持状态不变
except Income.DoesNotExist:
pass
elif type == "开票":
@@ -2225,6 +2253,12 @@ class ApprovalStatusCheck(APIView):
invoice = Invoice.objects.get(id=approval.user_id, is_deleted=False)
business_state = invoice.state
is_approved = (invoice.state == "已通过")
# 如果财务查看,且业务记录状态还不是"已通过",更新业务记录状态
if is_finance_view and invoice.state != "已通过":
invoice.state = "已通过"
invoice.save(update_fields=['state'])
business_state = "已通过"
is_approved = True
except Invoice.DoesNotExist:
pass
elif type == "付款申请":
@@ -2233,6 +2267,12 @@ class ApprovalStatusCheck(APIView):
payment = Payment.objects.get(id=approval.user_id, is_deleted=False)
business_state = payment.state
is_approved = (payment.state == "已通过")
# 如果财务查看,且业务记录状态还不是"已通过",更新业务记录状态
if is_finance_view and payment.state != "已通过":
payment.state = "已通过"
payment.save(update_fields=['state'])
business_state = "已通过"
is_approved = True
except Payment.DoesNotExist:
pass
elif type == "报销申请":
@@ -2241,6 +2281,12 @@ class ApprovalStatusCheck(APIView):
reimbursement = Reimbursement.objects.get(id=approval.user_id, is_deleted=False)
business_state = reimbursement.state
is_approved = (reimbursement.state == "已完成")
# 如果财务查看,且业务记录状态还不是"已通过",更新业务记录状态
if is_finance_view and reimbursement.state != "已通过":
reimbursement.state = "已通过"
reimbursement.save(update_fields=['state'])
business_state = "已通过"
is_approved = True
except Reimbursement.DoesNotExist:
pass
elif type == "案件管理":
@@ -2249,8 +2295,28 @@ class ApprovalStatusCheck(APIView):
case = Case.objects.get(id=approval.user_id, is_deleted=False)
business_state = case.state
is_approved = (case.state == "已通过")
# 如果财务查看,且业务记录状态还不是"已通过",更新业务记录状态
if is_finance_view and case.state != "已通过":
case.state = "已通过"
case.save(update_fields=['state'])
business_state = "已通过"
is_approved = True
except Case.DoesNotExist:
pass
elif type == "申请用印":
from business.models import SealApplication
try:
seal_app = SealApplication.objects.get(id=approval.user_id, is_deleted=False)
business_state = seal_app.state
is_approved = (seal_app.state == "已通过")
# 如果财务查看,且业务记录状态还不是"已通过",更新业务记录状态
if is_finance_view and seal_app.state != "已通过":
seal_app.state = "已通过"
seal_app.save(update_fields=['state'])
business_state = "已通过"
is_approved = True
except SealApplication.DoesNotExist:
pass
# 可以根据需要添加其他类型
except Exception as e:
import logging
@@ -2265,7 +2331,8 @@ class ApprovalStatusCheck(APIView):
'approval_state': approval.state,
'business_state': business_state,
'is_approved': is_approved, # 是否已经审核完全通过
'type': type
'type': type,
'auto_marked_as_viewed': is_finance_view # 是否已自动标记为已查看
}
}, status=status.HTTP_200_OK)

View File

@@ -2198,7 +2198,11 @@ class Application(APIView):
"""
token = request.META.get('token')
Printingpurpose = request.data.get('Printingpurpose')
# 案件编号(前端可不传),后端自动同步为“合同号”
# 兼容:仍支持直接传 CaseNumber即合同号
CaseNumber = request.data.get('CaseNumber')
case_id = request.data.get('case_id')
project_id = request.data.get('project_id')
Reason = request.data.get('Reason')
seal_number = request.data.get('seal_number')
seal_type = request.data.get('seal_type')
@@ -2212,9 +2216,35 @@ class Application(APIView):
now = datetime.now()
date_str = now.strftime('%Y-%m-%d')
user = User.objects.get(token=token, is_deleted=False)
# 自动查询合同号写入 CaseNumber案件编号
# 优先级case_id > project_id > CaseNumber兼容旧传参
contract_no = None
if case_id:
try:
case = Case.objects.select_related('project').get(id=case_id, is_deleted=False)
contract_no = case.contract_no or (case.project.ContractNo if case.project else None)
except Case.DoesNotExist:
return Response({'status': 'error', 'message': '案件不存在或已被删除', 'code': 1}, status=status.HTTP_404_NOT_FOUND)
elif project_id:
try:
project = ProjectRegistration.objects.get(id=project_id, is_deleted=False)
contract_no = project.ContractNo
except ProjectRegistration.DoesNotExist:
return Response({'status': 'error', 'message': '立项登记不存在或已被删除', 'code': 1}, status=status.HTTP_404_NOT_FOUND)
else:
contract_no = CaseNumber
if not contract_no:
return Response({
'status': 'error',
'message': '缺少案件信息:请传 case_id 或 project_id 以自动获取合同号,或直接传 CaseNumber合同号',
'code': 1
}, status=status.HTTP_400_BAD_REQUEST)
sea = SealApplication.objects.create(
Printingpurpose=Printingpurpose,
CaseNumber=CaseNumber,
CaseNumber=contract_no,
Reason=Reason,
seal_number=seal_number,
seal_type=seal_type,
@@ -2230,7 +2260,7 @@ class Application(APIView):
team_name=team_name,
approvers=approvers,
title=user.username + "申请用印",
content=user.username + "" + date_str + "申请用印,用印事由:" + Reason + ",盖章份数:" + seal_number + "盖着类型:" + seal_type,
content=user.username + "" + date_str + "申请用印,合同编号:" + str(contract_no) + "用印事由:" + Reason + ",盖章份数:" + seal_number + "盖着类型:" + seal_type,
approval_type="申请用印",
user_id=sea.id,
business_record=sea,
@@ -2308,7 +2338,10 @@ class EditApplication(APIView):
"""
id = request.data.get('id')
Printingpurpose = request.data.get('Printingpurpose')
# 案件编号(合同号):支持前端直接传,也支持通过 case_id/project_id 自动同步
CaseNumber = request.data.get('CaseNumber')
case_id = request.data.get('case_id')
project_id = request.data.get('project_id')
Reason = request.data.get('Reason')
seal_number = request.data.get('seal_number')
seal_type = request.data.get('seal_type')
@@ -2329,8 +2362,25 @@ class EditApplication(APIView):
if Printingpurpose:
app.Printingpurpose = Printingpurpose
app.save(update_fields=['Printingpurpose'])
if CaseNumber:
app.CaseNumber = CaseNumber
# 优先通过 case_id / project_id 自动同步合同号
contract_no = None
if case_id:
try:
case = Case.objects.select_related('project').get(id=case_id, is_deleted=False)
contract_no = case.contract_no or (case.project.ContractNo if case.project else None)
except Case.DoesNotExist:
return Response({'status': 'error', 'message': '案件不存在或已被删除', 'code': 1}, status=status.HTTP_404_NOT_FOUND)
elif project_id:
try:
project = ProjectRegistration.objects.get(id=project_id, is_deleted=False)
contract_no = project.ContractNo
except ProjectRegistration.DoesNotExist:
return Response({'status': 'error', 'message': '立项登记不存在或已被删除', 'code': 1}, status=status.HTTP_404_NOT_FOUND)
elif CaseNumber:
contract_no = CaseNumber
if contract_no:
app.CaseNumber = contract_no
app.save(update_fields=['CaseNumber'])
if Reason:
app.Reason = Reason
@@ -2354,7 +2404,7 @@ class EditApplication(APIView):
team_name=team_name,
approvers=approvers,
title=app.username + "申请用印重新编辑",
content=app.username + "" + date_str + "申请用印,用印事由:" + (
content=app.username + "" + date_str + "申请用印,合同编号:" + str(contract_no or app.CaseNumber) + "用印事由:" + (
Reason or app.Reason) + ",盖章份数:" + (seal_number or app.seal_number) + "盖着类型:" + (
seal_type or app.seal_type),
approval_type="申请用印",