优化案件模块
This commit is contained in:
@@ -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, # 标签列表
|
||||
|
||||
Reference in New Issue
Block a user