diff --git a/business/views.py b/business/views.py index a60625f..79bb144 100644 --- a/business/views.py +++ b/business/views.py @@ -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, # 标签列表