优化案件模块

This commit is contained in:
27942
2026-01-20 13:45:46 +08:00
parent f52f28bd19
commit 8e621572af

View File

@@ -1563,9 +1563,77 @@ class caseManagementDetail(APIView):
user_agents_page = paginator.page(1)
except EmptyPage:
user_agents_page = paginator.page(paginator.num_pages)
# 导入财务模型,用于统计开票金额和收入确认金额
from finance.models import Invoice as FinanceInvoice, Income
# 收集所有合同号,用于批量查询财务数据
case_list = list(user_agents_page.object_list)
contract_nos = []
case_contract_map = {} # 案件ID -> 合同号的映射
for info in case_list:
pro = None
if info.project_id:
try:
pro = ProjectRegistration.objects.get(id=info.project_id, is_deleted=False)
except ProjectRegistration.DoesNotExist:
pro = None
contract_no = info.contract_no or (pro.ContractNo if pro else None)
if contract_no:
contract_nos.append(contract_no)
case_contract_map[info.id] = contract_no
# 批量查询开票金额(按合同号统计)
invoice_amounts = {} # 合同号 -> 总开票金额
if contract_nos:
# 查询所有未删除的开票记录一次性查询避免N+1问题
invoices = FinanceInvoice.objects.filter(
ContractNo__in=contract_nos,
is_deleted=False
).values('ContractNo', 'amount')
# 计算每个合同号的总开票金额(需要解析金额字符串)
for invoice in invoices:
contract_no = invoice['ContractNo']
amount_str = normalize_amount_value(invoice['amount'])
try:
amount = float(amount_str)
except (ValueError, TypeError):
amount = 0.0
if contract_no in invoice_amounts:
invoice_amounts[contract_no] = str(float(invoice_amounts[contract_no]) + amount)
else:
invoice_amounts[contract_no] = str(amount)
# 批量查询收入确认金额(按合同号统计)
income_amounts = {} # 合同号 -> 总收入确认金额
if contract_nos:
# 查询所有未删除的收入确认记录一次性查询避免N+1问题
incomes = Income.objects.filter(
ContractNo__in=contract_nos,
is_deleted=False
).values('ContractNo', 'amount')
# 计算每个合同号的总收入确认金额
for income in incomes:
contract_no = income['ContractNo']
amount_str = normalize_amount_value(income['amount'])
try:
amount = float(amount_str)
except (ValueError, TypeError):
amount = 0.0
if contract_no in income_amounts:
income_amounts[contract_no] = str(float(income_amounts[contract_no]) + amount)
else:
income_amounts[contract_no] = str(amount)
data = []
import json
for info in user_agents_page.object_list:
for info in case_list:
pro = None
if info.project_id:
try:
@@ -1598,9 +1666,19 @@ class caseManagementDetail(APIView):
except (json.JSONDecodeError, TypeError):
closing_application_list = []
# 处理已开票/已收款字段:统一为数值字符串
invoice_status_value = normalize_amount_value(info.invoice_status)
paymentcollection_value = normalize_amount_value(info.paymentcollection)
# 从财务数据动态获取开票金额和收入确认金额
invoice_status_value = "0"
paymentcollection_value = "0"
if contract_no:
# 从财务数据获取开票金额
invoice_status_value = invoice_amounts.get(contract_no, "0")
# 从财务数据获取收入确认金额
paymentcollection_value = income_amounts.get(contract_no, "0")
else:
# 如果没有合同号使用Case表中的旧数据向后兼容
invoice_status_value = normalize_amount_value(info.invoice_status)
paymentcollection_value = normalize_amount_value(info.paymentcollection)
# 获取案件标签
tags = info.tags.filter(is_deleted=False)
@@ -1631,8 +1709,8 @@ class caseManagementDetail(APIView):
"ChangeItem": info.ChangeItem,
"ChangeReason": info.ChangeReason,
"ChangeAgreement": info.ChangeAgreement,
"invoice_status": invoice_status_value, # 已开票(数值
"paymentcollection": paymentcollection_value, # 已收款(数值
"invoice_status": invoice_status_value, # 已开票(从财务数据动态计算
"paymentcollection": paymentcollection_value, # 已收款(从财务数据动态计算
"state": info.state,
"project_id": info.project_id,
"tags": tag_list, # 标签列表