This commit is contained in:
dby 2025-10-11 21:35:24 +08:00
parent 713787d020
commit 50e02dc37d
3 changed files with 51 additions and 23 deletions

View File

@ -1,5 +1,6 @@
from random import random from random import random
from datetime import datetime
from fastapi import APIRouter, Depends, HTTPException, status from fastapi import APIRouter, Depends, HTTPException, status
from typing import Optional, List, Dict, Any from typing import Optional, List, Dict, Any
import json import json
@ -19,7 +20,7 @@ from app.utils.app_user_jwt import get_current_app_user_id, get_current_app_user
from app.utils.calculation_engine import FinalValueACalculator from app.utils.calculation_engine import FinalValueACalculator
from app.utils.calculation_engine.drp import DynamicPledgeRateCalculator from app.utils.calculation_engine.drp import DynamicPledgeRateCalculator
from app.utils.calculation_engine.economic_value_b1.sub_formulas.basic_value_b11 import calculate_popularity_score, \ from app.utils.calculation_engine.economic_value_b1.sub_formulas.basic_value_b11 import calculate_popularity_score, \
calculate_infringement_score, calculate_patent_usage_score calculate_infringement_score, calculate_patent_usage_score, calculate_patent_score
from app.utils.calculation_engine.economic_value_b1.sub_formulas.traffic_factor_b12 import calculate_search_index_s1 from app.utils.calculation_engine.economic_value_b1.sub_formulas.traffic_factor_b12 import calculate_search_index_s1
from app.log.log import logger from app.log.log import logger
from app.models.esg import ESG from app.models.esg import ESG
@ -100,6 +101,7 @@ async def calculate_valuation(
- 专利验证: 通过API验证专利有效性 - 专利验证: 通过API验证专利有效性
- 侵权记录: 通过API查询侵权诉讼历史 - 侵权记录: 通过API查询侵权诉讼历史
""" """
try: try:
start_ts = time.monotonic() start_ts = time.monotonic()
logger.info("valuation.calc_start user_id={} asset_name={} industry={}", user_id, logger.info("valuation.calc_start user_id={} asset_name={} industry={}", user_id,
@ -110,6 +112,7 @@ async def calculate_valuation(
industry_obj = None industry_obj = None
policy_obj = None policy_obj = None
try: try:
esg_obj = await asyncio.wait_for(ESG.filter(name=data.industry).first(), timeout=2.0) esg_obj = await asyncio.wait_for(ESG.filter(name=data.industry).first(), timeout=2.0)
except Exception as e: except Exception as e:
@ -141,9 +144,9 @@ async def calculate_valuation(
# 侵权分 默认 6 # 侵权分 默认 6
try: try:
judicial_data = universal_api.query_judicial_data(data.institution) judicial_data = universal_api.query_judicial_data(data.institution)
_data = judicial_data["data"]["count"]["ktggCount"] _data = judicial_data["data"].get("target",None) # 诉讼标的
if _data > 0: if _data:
infringement_score = 4.0 infringement_score = 0.0
else: else:
infringement_score = 10.0 infringement_score = 10.0
except: except:
@ -153,26 +156,27 @@ async def calculate_valuation(
try: try:
patent_data = universal_api.query_patent_info(data.industry) patent_data = universal_api.query_patent_info(data.industry)
patent_dict = patent_data if isinstance(patent_data, dict) else {}
inner_data = patent_dict.get("data", {}) if isinstance(patent_dict.get("data", {}), dict) else {}
data_list = inner_data.get("dataList", [])
data_list = data_list if isinstance(data_list, list) else []
# 验证 专利剩余年限
# TODO 无法验证 专利剩余保护期>10年(10分)5-10年(7分)<5年(3分)
# 发展潜力D相关参数 专利数量
# 查询匹配申请号的记录集合
matched = [item for item in data_list if
isinstance(item, dict) and item.get("SQH") == getattr(data, 'patent_application_no', None)]
if matched:
patent_count = calculate_patent_usage_score(len(matched))
input_data_by_b1["patent_count"] = float(patent_count)
else:
input_data_by_b1["patent_count"] = 0.0
input_data_by_b1["patent_score"] = 0
except Exception as e: except Exception as e:
logger.warning("valuation.patent_api_error err={}", repr(e)) logger.warning("valuation.patent_api_error err={}", repr(e))
input_data_by_b1["patent_count"] = 0.0 input_data_by_b1["patent_count"] = 0.0
input_data_by_b1["patent_score"] = 0.0
patent_dict = patent_data if isinstance(patent_data, dict) else {}
inner_data = patent_dict.get("data", {}) if isinstance(patent_dict.get("data", {}), dict) else {}
data_list = inner_data.get("dataList", [])
data_list = data_list if isinstance(data_list, list) else []
# 验证 专利剩余年限
# 发展潜力D相关参数 专利数量
# 查询匹配申请号的记录集合
matched = [item for item in data_list if isinstance(item, dict) and item.get("SQH") == getattr(data, 'patent_application_no', None)]
if matched:
patent_count = calculate_patent_usage_score(len(matched))
input_data_by_b1["patent_count"] = float(patent_count)
else:
input_data_by_b1["patent_count"] = 0.0
patent_score = calculate_patent_score(calculate_total_years(data_list))
input_data_by_b1["patent_score"] = patent_score
# 提取 文化价值B2 计算参数 # 提取 文化价值B2 计算参数
input_data_by_b2 = await _extract_calculation_params_b2(data) input_data_by_b2 = await _extract_calculation_params_b2(data)
@ -557,3 +561,26 @@ async def get_my_valuation_statistics(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"获取统计信息失败: {str(e)}" detail=f"获取统计信息失败: {str(e)}"
) )
def calculate_total_years(data_list):
current_date = datetime.now().date()
total_years = 0
date_count = 0
for item in data_list:
if "SQRQ" in item and item["SQRQ"]:
try:
# 解析日期字符串
sqrq_date = datetime.strptime(item["SQRQ"], "%Y-%m-%d").date()
# 计算与当前日期的差值(年,包含小数)
date_diff = current_date - sqrq_date
years_diff = date_diff.days / 365.25
total_years += years_diff
date_count += 1
except ValueError as e:
return 0
return total_years

View File

@ -76,8 +76,9 @@ class EconomicValueB1Calculator:
# esg_score: ESG分 (0-10分) (用户填写) # esg_score: ESG分 (0-10分) (用户填写)
# innovation_ratio: 创新投入比 (研发费用/营收) * 100 (用户填写) # innovation_ratio: 创新投入比 (研发费用/营收) * 100 (用户填写)
development_potential = self.basic_value_calculator.calculate_development_potential_d( development_potential = self.basic_value_calculator.calculate_development_potential_d(
input_data["esg_score"],
input_data["patent_count"], input_data["patent_count"],
input_data["esg_score"],
input_data["innovation_ratio"], input_data["innovation_ratio"],
) )
# 计算行业系数I target_industry_roe: 目标行业平均ROE (系统配置) # 计算行业系数I target_industry_roe: 目标行业平均ROE (系统配置)

View File

@ -284,7 +284,7 @@ if __name__ == "__main__":
view_count = 200 view_count = 200
# 计算各项指标 # 计算各项指标
search_index_s1 = calculator.calculate_search_index_s1(baidu_index, wechat_index, weibo_index) search_index_s1 = calculate_search_index_s1(baidu_index, wechat_index, weibo_index)
interaction_index, coverage_index = processor.calculate_multi_platform_interaction(platform_data) interaction_index, coverage_index = processor.calculate_multi_platform_interaction(platform_data)
conversion_efficiency = calculator.calculate_conversion_efficiency(click_count, view_count) conversion_efficiency = calculator.calculate_conversion_efficiency(click_count, view_count)
social_media_spread_s3 = calculator.calculate_social_media_spread_s3( social_media_spread_s3 = calculator.calculate_social_media_spread_s3(