Merge branch 'v0.21' into 'master'
数据库配置 升级到v0.21 See merge request root/etl_tfse!11
This commit is contained in:
commit
ee418a5bc9
|
@ -6,7 +6,7 @@ client_admin = pymongo.MongoClient('mongodb://{}:{}@{}:{}'.format('root', 'RYIHr
|
|||
client_tfse_021 = pymongo.MongoClient('mongodb://{}:{}@{}:{}'.format('root', 'UTlC9cCoglD1cI1*', '116.63.130.34', 27021))
|
||||
|
||||
|
||||
def find_data_in_tyc(param1, param2, param3):
|
||||
def FIND_DATA_IN_TYC(param1, param2, param3):
|
||||
"""
|
||||
根据企业ID查询企业信息
|
||||
Parameters:
|
||||
|
@ -22,68 +22,57 @@ def find_data_in_tyc(param1, param2, param3):
|
|||
return record
|
||||
|
||||
|
||||
def find_data_in_tfse(param1, param2, param3):
|
||||
def FIND_SINGLE_COLUMN_BY_REQ(param1, param2, param3, param4):
|
||||
"""
|
||||
根据企业ID查询企业信息
|
||||
查询符合条件的第一条数据的某个制定字段值
|
||||
Parameters:
|
||||
param1: string 数据库 db
|
||||
param2: string 数据集 collection
|
||||
param3: dict 查询条件 例如 {"企业名称": "xxx有限公司"}
|
||||
param1: str 数据库
|
||||
param2: str 数据表
|
||||
param3: dict 查询条件
|
||||
param4: str 一个指定查询字段
|
||||
Returns:
|
||||
record: 查询结果
|
||||
record: 查询结果为空,返回None; 查询结果正常,返回查询结果的第一条数据;
|
||||
"""
|
||||
collection = client_tfse[param1][param2]
|
||||
data = collection.find(param3, {'_id': False})
|
||||
record = list(data)
|
||||
collection = client_tfse_021[param1][param2]
|
||||
column = {**{'_id': False}, **{param4: 1}}
|
||||
record = list(collection.find(param3, column))
|
||||
return None if record == [] else record[0][param4]
|
||||
|
||||
|
||||
def FIND_SINGLE_DATA_BY_REQ(param1, param2, param3, param4):
|
||||
"""
|
||||
查询符合条件的第一条数据
|
||||
Parameters:
|
||||
param1: str 数据库
|
||||
param2: str 数据表
|
||||
param3: dict 查询条件
|
||||
param4: list 查询字段
|
||||
Returns:
|
||||
record: 查询结果为空,返回False; 查询结果正常,返回查询结果的第一条数据;
|
||||
"""
|
||||
collection = client_tfse_021[param1][param2]
|
||||
columns = {**{'_id': False}, **dict(zip(param4, [1] * len(param4)))}
|
||||
record = list(collection.find(param3, columns))
|
||||
return False if record == [] else record[0]
|
||||
|
||||
|
||||
def FIND_ALL_DATA_BY_REQ(param1, param2, param3, param4):
|
||||
"""
|
||||
查询符合条件的所有数据
|
||||
Parameters:
|
||||
param1: str 数据库
|
||||
param2: str 数据表
|
||||
param3: dict 查询条件
|
||||
param4: list 查询字段
|
||||
Returns:
|
||||
record: list 查询结果
|
||||
"""
|
||||
collection = client_tfse_021[param1][param2]
|
||||
columns = {**{'_id': False}, **dict(zip(param4, [1] * len(param4)))}
|
||||
record = list(collection.find(param3, columns))
|
||||
return record
|
||||
|
||||
|
||||
def insert_data_to_tfse(param1, param2, param3):
|
||||
"""
|
||||
插入数据
|
||||
Parameters:
|
||||
param1: string 数据库
|
||||
param2: string 数据集
|
||||
param3: dict 数据
|
||||
Returns:
|
||||
-
|
||||
"""
|
||||
collection = client_tfse[param1][param2]
|
||||
collection.insert_one(param3)
|
||||
|
||||
|
||||
def conserve_data_to_tfse(param1, param2, param3, param4):
|
||||
"""
|
||||
保存数据
|
||||
Parameters:
|
||||
param1: string 数据库
|
||||
param2: string 数据集
|
||||
param3: string cid
|
||||
param4: object 需要保存的数据
|
||||
Returns:
|
||||
-
|
||||
"""
|
||||
collection = client_tfse[param1][param2]
|
||||
collection.update_one(param3, {"$set": param4}, upsert=True)
|
||||
|
||||
|
||||
def update_data(param1, param2, param3, param4):
|
||||
"""
|
||||
更新数据
|
||||
Parameters:
|
||||
param1: string 数据库
|
||||
param2: string 数据集
|
||||
param3: string 查询条件
|
||||
param4: dict 需要更新的数据
|
||||
Returns:
|
||||
-
|
||||
"""
|
||||
collection = client_tfse[param1][param2]
|
||||
res = collection.update_one(param3, {"$set": param4})
|
||||
info = res.raw_result['updatedExisting']
|
||||
return info
|
||||
|
||||
|
||||
def UPSERT_SINGLE_DATA(param1, param2, param3, param4):
|
||||
"""
|
||||
插入单条数据
|
|
@ -5,10 +5,9 @@ import requests
|
|||
|
||||
import pandas as pd
|
||||
|
||||
from common.scripts import read_json_file, sub_dict, df_iterrows
|
||||
from company.db import find_data_in_tyc, insert_data_to_tfse, find_data_in_tfse, conserve_data_to_tfse, update_data, \
|
||||
UPSERT_SINGLE_DATA, UPDATE_SINGLE_DATA
|
||||
from rating.scripts.risk_detail import associate_risk_detail, change_log_detail
|
||||
from common.utils import read_json_file, sub_dict, df_iterrows
|
||||
from CompanyData.db import FIND_DATA_IN_TYC, UPSERT_SINGLE_DATA, UPDATE_SINGLE_DATA, FIND_SINGLE_DATA_BY_REQ, FIND_ALL_DATA_BY_REQ
|
||||
from RatingData.scripts.risk_detail import associate_risk_detail, change_log_detail
|
||||
|
||||
|
||||
def drag_company_data_request(company_name):
|
||||
|
@ -40,9 +39,9 @@ def basic_info_etl(cid, company_name):
|
|||
-
|
||||
"""
|
||||
# Params
|
||||
basic_info = find_data_in_tyc('公司背景', '基本信息', {"企业名称": company_name})
|
||||
holder_info = find_data_in_tyc('公司背景', '企业股东', {"企业名称": company_name})
|
||||
member_info = find_data_in_tyc('公司背景', '主要人员', {"企业名称": company_name})
|
||||
basic_info = FIND_DATA_IN_TYC('公司背景', '基本信息', {"企业名称": company_name})
|
||||
holder_info = FIND_DATA_IN_TYC('公司背景', '企业股东', {"企业名称": company_name})
|
||||
member_info = FIND_DATA_IN_TYC('公司背景', '主要人员', {"企业名称": company_name})
|
||||
|
||||
# Returns
|
||||
data = read_json_file('/company/static/template/基本信息.json')
|
||||
|
@ -118,7 +117,7 @@ def basic_info_etl(cid, company_name):
|
|||
save_result()
|
||||
|
||||
|
||||
def general_rating_etl(rid):
|
||||
def cc_rating_etl(rid):
|
||||
"""
|
||||
执行综合信用评价信息数据清洗程序
|
||||
Parameters:
|
||||
|
@ -128,29 +127,24 @@ def general_rating_etl(rid):
|
|||
"""
|
||||
|
||||
# Parameters
|
||||
rating_record = find_data_in_tfse('评价', '评价记录', {"评价ID": rid})[0]
|
||||
rating_result = find_data_in_tfse('评价', '评价结果', {"评价ID": rid})[0]
|
||||
rating_results = find_data_in_tfse('评价', '评价结果', {"企业ID": rating_result['企业ID']})
|
||||
text_model = find_data_in_tfse('评价', '报告数据', {"企业ID": rating_result['企业ID'], "评价ID": rid})[0]
|
||||
rating_record = FIND_SINGLE_DATA_BY_REQ('企业数据', '评价记录', {"评价ID": rid}, ['报告fid'])
|
||||
rating_result = FIND_SINGLE_DATA_BY_REQ('综信评价数据', '评价结果', {"评价ID": rid},
|
||||
["企业ID", "企业名称", "经营评分", "财务评分", "风险评分", "评价年度"])
|
||||
rating_results = FIND_ALL_DATA_BY_REQ('综信评价数据', '评价结果', {"企业ID": rating_result['企业ID']},
|
||||
['信用等级', "信用评分", '评价时间', "评价方式"])
|
||||
text_model = FIND_SINGLE_DATA_BY_REQ('综信评价数据', '报告数据', {"评价ID": rid}, ["行业选择", "报告内容"])
|
||||
df_records = pd.DataFrame(rating_results).sort_values('评价时间', ascending=False)
|
||||
rating_index = find_data_in_tfse('企业', '指标明细', {"企业ID": rating_result['企业ID']})
|
||||
df_index = pd.DataFrame(rating_index).sort_values('年报期', ascending=False)
|
||||
|
||||
# Returns
|
||||
result = dict()
|
||||
|
||||
def result_head():
|
||||
# 根据rid 查询评价日期、信用等级、信用分数
|
||||
result['评价ID'] = rid
|
||||
result['企业ID'] = rating_result['企业ID']
|
||||
result['企业名称'] = rating_result['企业名称']
|
||||
result['更新时间'] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
|
||||
|
||||
# 综合信用等级数据
|
||||
result_general = result['综合信用等级'] = dict()
|
||||
result_general['评价时间'] = rating_result['评价时间']
|
||||
result_general['信用等级'] = rating_result['信用等级']
|
||||
result_general['信用评分'] = rating_result['信用评分']
|
||||
|
||||
def make_radar_chart():
|
||||
"""
|
||||
综合信用指标表现雷达图数据
|
||||
|
@ -229,45 +223,45 @@ def general_rating_etl(rid):
|
|||
result['信用分析']['评价意见'] = evaluation_comments_content()
|
||||
result['信用分析']['查看报告'] = '/file/get_company_report?file_id={}'.format(rating_record['报告fid'])
|
||||
|
||||
def make_total_score():
|
||||
"""
|
||||
生成总得分数据
|
||||
"""
|
||||
ref_score = read_json_file('/company/static/refers/general.json')['total']
|
||||
result['总得分'] = dict()
|
||||
# def make_total_score():
|
||||
# """
|
||||
# 生成总得分数据
|
||||
# """
|
||||
# ref_score = read_json_file('/company/static/refers/general.json')['total']
|
||||
# result['总得分'] = dict()
|
||||
#
|
||||
# result['总得分']['ESG'] = '{}%'.format(round(100*rating_result['经营评分']['合计']/ref_score['ESG'], 2))
|
||||
# result['总得分']['财务指标'] = '{}%'.format(round(100*rating_result['财务评分']['合计']/ref_score['财务指标'], 2))
|
||||
# result['总得分']['风险指标'] = '{}%'.format(round(100*(1-rating_result['风险评分']['合计']/ref_score['风险指标']), 2))
|
||||
|
||||
result['总得分']['ESG'] = '{}%'.format(round(100*rating_result['经营评分']['合计']/ref_score['ESG'], 2))
|
||||
result['总得分']['财务指标'] = '{}%'.format(round(100*rating_result['财务评分']['合计']/ref_score['财务指标'], 2))
|
||||
result['总得分']['风险指标'] = '{}%'.format(round(100*(1-rating_result['风险评分']['合计']/ref_score['风险指标']), 2))
|
||||
# def profitability():
|
||||
# """
|
||||
# 盈利能力数据
|
||||
# """
|
||||
# date = '{}-12-31'.format(int(rating_result['评价年度'].split('年')[0])-1)
|
||||
# df_profit = df_index[df_index['年报期'] == date]
|
||||
# result['盈利能力'] = dict()
|
||||
# result['盈利能力']['总资产报酬率'] = df_profit['总资产报酬率'].values[0]
|
||||
# result['盈利能力']['净资产收益率'] = df_profit['净资产收益率'].values[0]
|
||||
|
||||
def profitability():
|
||||
"""
|
||||
盈利能力数据
|
||||
"""
|
||||
date = '{}-12-31'.format(int(rating_result['评价年度'].split('年')[0])-1)
|
||||
df_profit = df_index[df_index['年报期'] == date]
|
||||
result['盈利能力'] = dict()
|
||||
result['盈利能力']['总资产报酬率'] = df_profit['总资产报酬率'].values[0]
|
||||
result['盈利能力']['净资产收益率'] = df_profit['净资产收益率'].values[0]
|
||||
# def growth_ability():
|
||||
# """
|
||||
# 成长能力数据
|
||||
# """
|
||||
# df_grow = df_index[:3].sort_values('年报期', ascending=True).set_index('年报期')
|
||||
# result['成长能力'] = json.loads(df_grow[['营业增长率', '总资产增长率']].T.to_json())
|
||||
|
||||
def growth_ability():
|
||||
"""
|
||||
成长能力数据
|
||||
"""
|
||||
df_grow = df_index[:3].sort_values('年报期', ascending=True).set_index('年报期')
|
||||
result['成长能力'] = json.loads(df_grow[['营业增长率', '总资产增长率']].T.to_json())
|
||||
|
||||
def assets_quality():
|
||||
"""
|
||||
计算资产质量数据
|
||||
"""
|
||||
date = '{}-12-31'.format(int(rating_result['评价年度'].split('年')[0]) - 1)
|
||||
df_assets = df_index[df_index['年报期'] == date]
|
||||
result['资产质量'] = dict()
|
||||
result['资产质量']['应收账款周转率'] = df_assets['应收账款周转率'].values[0]
|
||||
result['资产质量']['存货周转率'] = df_assets['存货周转率'].values[0]
|
||||
result['资产质量']['总资产周转率'] = df_assets['总资产周转率'].values[0]
|
||||
result['资产质量']['资产负债率'] = df_assets['资产负债率'].values[0]
|
||||
# def assets_quality():
|
||||
# """
|
||||
# 计算资产质量数据
|
||||
# """
|
||||
# date = '{}-12-31'.format(int(rating_result['评价年度'].split('年')[0]) - 1)
|
||||
# df_assets = df_index[df_index['年报期'] == date]
|
||||
# result['资产质量'] = dict()
|
||||
# result['资产质量']['应收账款周转率'] = df_assets['应收账款周转率'].values[0]
|
||||
# result['资产质量']['存货周转率'] = df_assets['存货周转率'].values[0]
|
||||
# result['资产质量']['总资产周转率'] = df_assets['总资产周转率'].values[0]
|
||||
# result['资产质量']['资产负债率'] = df_assets['资产负债率'].values[0]
|
||||
|
||||
def rating_history():
|
||||
"""
|
||||
|
@ -314,14 +308,14 @@ def general_rating_etl(rid):
|
|||
result_head()
|
||||
make_radar_chart()
|
||||
credit_analysis_content()
|
||||
make_total_score()
|
||||
profitability()
|
||||
growth_ability()
|
||||
assets_quality()
|
||||
# make_total_score()
|
||||
# profitability()
|
||||
# growth_ability()
|
||||
# assets_quality()
|
||||
rating_history()
|
||||
rating_index_analysis()
|
||||
|
||||
conserve_data_to_tfse('企业', '综合评价分析', {"企业ID": result['企业ID']}, result)
|
||||
UPSERT_SINGLE_DATA('企业数据', '综合信用分析', {"评价ID": rid}, result)
|
||||
|
||||
|
||||
def financial_analysis(rid):
|
||||
|
@ -334,11 +328,14 @@ def financial_analysis(rid):
|
|||
"""
|
||||
|
||||
# Parameters
|
||||
rating_result = find_data_in_tfse('评价', '评价结果', {"评价ID": rid})[0]
|
||||
rating_input = find_data_in_tfse('评价', '综合评价填报', {"评价ID": rid})[0]
|
||||
rating_result = FIND_SINGLE_DATA_BY_REQ('综信评价数据', '评价结果', {"评价ID": rid}, ["企业ID", "财务评分"])
|
||||
rating_input = FIND_SINGLE_DATA_BY_REQ('综信评价数据', '填报数据', {"评价ID": rid}, ["行业选择", "财务填报"])
|
||||
industry = rating_input['行业选择']
|
||||
periods = list(pd.DataFrame(rating_input['财务填报']['资产负债表']).sort_values('报告期', ascending=False)['报告期'][0:2].values)
|
||||
df_recent_2year = pd.DataFrame(find_data_in_tfse('企业', '指标明细', {'企业ID': rating_result['企业ID']})).sort_values('年报期', ascending=False)[0:2]
|
||||
df_recent_2year = pd.DataFrame(FIND_ALL_DATA_BY_REQ('综信评价数据', '财指结果', {'企业ID': rating_result['企业ID']},
|
||||
["年报期", '净资产收益率', '总资产报酬率', '总资产周转率',
|
||||
'应收账款周转率', '存货周转率', '资产负债率', '已获利息倍数',
|
||||
'速动比率', '营业增长率', '总资产增长率', '技术投入比率'])).sort_values('年报期', ascending=False)[0:2]
|
||||
df_this = df_recent_2year[0:1]
|
||||
df_last = df_recent_2year[1:2]
|
||||
|
||||
|
@ -414,7 +411,7 @@ def financial_analysis(rid):
|
|||
df_index = pd.DataFrame({'值': index_value, "级别": index_level})
|
||||
result['指标详情'] = df_iterrows(df_index)
|
||||
|
||||
insert_data_to_tfse('企业', '财务要素分析', result)
|
||||
UPSERT_SINGLE_DATA("企业数据", "财务要素分析", {"评价ID": rid}, result)
|
||||
|
||||
|
||||
def risk_analysis_etl(rid):
|
||||
|
@ -426,8 +423,8 @@ def risk_analysis_etl(rid):
|
|||
-
|
||||
"""
|
||||
# Params
|
||||
rating_result = find_data_in_tfse('评价', '评价结果', {"评价ID": rid})[0]
|
||||
risk_data = find_data_in_tfse('评价', '风险数据', {"评价ID": rid})[0]
|
||||
rating_result = FIND_SINGLE_DATA_BY_REQ('综信评价数据', '评价结果', {"评价ID": rid}, ["企业ID", "企业名称", "风险评分"])
|
||||
risk_data = FIND_SINGLE_DATA_BY_REQ('综信评价数据', '风险数据', {"评价ID": rid}, ["合规风险", "经营风险"])
|
||||
|
||||
# Returns
|
||||
result = dict()
|
||||
|
@ -552,7 +549,7 @@ def risk_analysis_etl(rid):
|
|||
result['周边风险'] = associate_risk()
|
||||
result['变更记录'] = change_log()
|
||||
|
||||
insert_data_to_tfse('企业', '风险要素分析', result)
|
||||
UPSERT_SINGLE_DATA('企业数据', '经营风险分析', {"评价ID": rid}, result)
|
||||
|
||||
|
||||
def esg_rating_etl(rid):
|
||||
|
@ -564,8 +561,9 @@ def esg_rating_etl(rid):
|
|||
res: desc
|
||||
"""
|
||||
# Parameters
|
||||
rating_record = find_data_in_tfse('评价', 'ESG评价结果', {"评价ID": rid})[0]
|
||||
rating_input = find_data_in_tfse('评价', 'ESG评价填报', {"评价ID": rid})[0]
|
||||
rating_record = FIND_SINGLE_DATA_BY_REQ('ESG评价数据', '评价结果', {"评价ID": rid},
|
||||
["评价等级", "ESG得分", "环境得分", "社会得分", "公司治理得分"])
|
||||
rating_input = FIND_SINGLE_DATA_BY_REQ('ESG评价数据', '填报数据', {"评价ID": rid}, ["所属行业"])
|
||||
|
||||
# Returns
|
||||
result = dict()
|
||||
|
@ -790,15 +788,15 @@ def esg_rating_etl(rid):
|
|||
res.append(g())
|
||||
return res
|
||||
|
||||
result['企业ID'] = rating_record['企业ID']
|
||||
result['评价ID'] = rating_record['评价ID']
|
||||
result['企业ID'] = rating_record['企业ID']
|
||||
result['更新日期'] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
|
||||
result['ESG评级'] = rating_result()
|
||||
result['维度得分情况'] = dimension_rating()
|
||||
result['实质性议题得分情况'] = substantive_score()
|
||||
result['实质性议题'] = substantive_topics()
|
||||
|
||||
insert_data_to_tfse('企业', 'ESG要素分析', result)
|
||||
UPSERT_SINGLE_DATA("企业数据", "ESG评价分析", {"评价ID": rid}, result)
|
||||
|
||||
|
||||
def calculate_weight(param):
|
|
@ -1,7 +1,7 @@
|
|||
from flask import Blueprint, request
|
||||
|
||||
from common.scripts import verify_token
|
||||
from company.scripts import *
|
||||
from common.utils import verify_token
|
||||
from CompanyData.job_scripts import *
|
||||
|
||||
company_route = Blueprint('company', __name__)
|
||||
|
||||
|
@ -48,7 +48,7 @@ def general_rating():
|
|||
"""
|
||||
rid = request.json['rid']
|
||||
|
||||
general_rating_etl(rid)
|
||||
cc_rating_etl(rid)
|
||||
financial_analysis(rid)
|
||||
risk_analysis_etl(rid)
|
||||
|
|
@ -1,12 +1,9 @@
|
|||
import json
|
||||
import os
|
||||
|
||||
import pymongo
|
||||
|
||||
O_HOST = "116.63.130.34"
|
||||
O_PASS = "RYIHrqml#LSW6#!*"
|
||||
O_PASS = "sromitdTW569kC#M"
|
||||
O_USER = "root"
|
||||
O_PORT = "27020"
|
||||
O_PORT = "27018"
|
||||
|
||||
T_HOST = "116.63.130.34"
|
||||
T_PASS = "UTlC9cCoglD1cI1*"
|
||||
|
@ -33,7 +30,8 @@ def data_migrator(origin, target):
|
|||
target_list = []
|
||||
for data in origin_data:
|
||||
###
|
||||
|
||||
rid = list(origin_client['评价']['评价记录'].find({"企业ID": data['企业ID'], "评价项目": "综合信用评价"}, {'_id': False}))[0]['评价ID']
|
||||
data['评价ID'] = rid
|
||||
###
|
||||
target_list.append(data)
|
||||
|
||||
|
@ -49,7 +47,7 @@ def data_migrator(origin, target):
|
|||
|
||||
if __name__ == '__main__':
|
||||
|
||||
o = {"DB": "用户", "Collection": "token记录"}
|
||||
t = {"DB": "管理端", "Collection": "token记录"}
|
||||
o = {"DB": "企业", "Collection": "风险要素分析"}
|
||||
t = {"DB": "企业数据", "Collection": "经营风险分析"}
|
||||
|
||||
data_migrator(o, t)
|
||||
|
|
|
@ -1,18 +0,0 @@
|
|||
import pymongo
|
||||
|
||||
HOST = "116.63.130.34"
|
||||
PASS = "UTlC9cCoglD1cI1*"
|
||||
USER = "root"
|
||||
PORT = "27021"
|
||||
|
||||
mongo_client = pymongo.MongoClient('mongodb://{}:{}@{}:{}'.format(USER, PASS, HOST, PORT))
|
||||
|
||||
|
||||
def all_data():
|
||||
collection = mongo_client['应用端']['企业用户']
|
||||
data = list(collection.find({}, {'_id': False}))
|
||||
|
||||
###
|
||||
|
||||
|
||||
###
|
|
@ -0,0 +1,27 @@
|
|||
import pymongo
|
||||
|
||||
HOST = "116.63.130.34"
|
||||
PASS = "UTlC9cCoglD1cI1*"
|
||||
USER = "root"
|
||||
PORT = "27021"
|
||||
|
||||
mongo_client = pymongo.MongoClient('mongodb://{}:{}@{}:{}'.format(USER, PASS, HOST, PORT))
|
||||
|
||||
|
||||
def all_data():
|
||||
collection = mongo_client['模型端']['天眼查公司行业分类']
|
||||
data = list(collection.find({}, {'_id': False}))
|
||||
|
||||
###
|
||||
pass
|
||||
for d in data:
|
||||
if d['一级行业'] == '制造业':
|
||||
d['远东_一级行业'] = '制造业'
|
||||
if d['一级行业'] == '信息传输、软件和信息技术服务业':
|
||||
d['远东_一级行业'] = '信息技术业'
|
||||
collection.update_one({"三级行业": d['三级行业']}, {"$set": d})
|
||||
###
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
all_data()
|
|
@ -1,8 +1,8 @@
|
|||
from common.scripts import read_json_file
|
||||
from rating.scripts.common import industry_processing
|
||||
from rating.scripts.esg.environment import *
|
||||
from rating.scripts.esg.governance import *
|
||||
from rating.scripts.esg.social import *
|
||||
from common.utils import read_json_file
|
||||
from RatingData.scripts.common import industry_processing
|
||||
from RatingData.scripts.esg.environment import *
|
||||
from RatingData.scripts.esg.governance import *
|
||||
from RatingData.scripts.esg.social import *
|
||||
|
||||
|
||||
class EsgCleanModel:
|
|
@ -1,10 +1,10 @@
|
|||
from rating.scripts.report.abstract import *
|
||||
from rating.scripts.report.appendix import *
|
||||
from rating.scripts.report.company_profile import *
|
||||
from rating.scripts.report.enterprise_risk import *
|
||||
from rating.scripts.report.esg_evaluation import *
|
||||
from rating.scripts.report.financial_analysis import *
|
||||
from rating.scripts.report.rating_conclusion import *
|
||||
from RatingData.scripts.report.abstract import *
|
||||
from RatingData.scripts.report.appendix import *
|
||||
from RatingData.scripts.report.company_profile import *
|
||||
from RatingData.scripts.report.enterprise_risk import *
|
||||
from RatingData.scripts.report.esg_evaluation import *
|
||||
from RatingData.scripts.report.financial_analysis import *
|
||||
from RatingData.scripts.report.rating_conclusion import *
|
||||
|
||||
|
||||
class CleanModel:
|
|
@ -9,7 +9,7 @@ client_tyc = pymongo.MongoClient('mongodb://{}:{}@{}:{}'.format(USER, PASSWORD_T
|
|||
client_tfse_021 = pymongo.MongoClient('mongodb://{}:{}@{}:{}'.format(USER, PASSWORD_TFSE_021, '116.63.130.34', 27021))
|
||||
|
||||
|
||||
def find_tyc_db(**kwargs):
|
||||
def FIND_DATA_N_TYC(**kwargs):
|
||||
"""
|
||||
查询天眼查数据库记录
|
||||
Parameters:
|
||||
|
@ -23,31 +23,38 @@ def find_tyc_db(**kwargs):
|
|||
return data
|
||||
|
||||
|
||||
def find_tfse_db(**kwargs):
|
||||
def FIND_SINGLE_DATA_BY_REQ(param1, param2, param3, param4):
|
||||
"""
|
||||
查询天府股交数据库记录
|
||||
查询符合条件的第一条数据
|
||||
Parameters:
|
||||
kwargs: 查询条件
|
||||
param1: str 数据库
|
||||
param2: str 数据表
|
||||
param3: dict 查询条件
|
||||
param4: list 查询字段
|
||||
Returns:
|
||||
data: tfse数据
|
||||
record: 查询结果为空,返回False; 查询结果正常,返回查询结果的第一条数据;
|
||||
"""
|
||||
collection = client_tfse[kwargs['db']][kwargs['col']]
|
||||
result = collection.find(kwargs['query'], {'_id': False})
|
||||
data = list(result)
|
||||
return data
|
||||
collection = client_tfse_021[param1][param2]
|
||||
columns = {**{'_id': False}, **dict(zip(param4, [1] * len(param4)))}
|
||||
record = list(collection.find(param3, columns))
|
||||
return False if record == [] else record[0]
|
||||
|
||||
|
||||
def conserve_data(**kwargs):
|
||||
def FIND_ALL_DATA_BY_REQ(param1, param2, param3, param4):
|
||||
"""
|
||||
根据评价ID保存数据
|
||||
查询符合条件的所有数据
|
||||
Parameters:
|
||||
kwargs: 查询条件
|
||||
param1: str 数据库
|
||||
param2: str 数据表
|
||||
param3: dict 查询条件
|
||||
param4: list 查询字段
|
||||
Returns:
|
||||
保存结果
|
||||
record: list 查询结果
|
||||
"""
|
||||
collection = client_tfse[kwargs['db']][kwargs['col']]
|
||||
collection.update_one({"企业ID": kwargs['cid']}, {"$set": kwargs['insert_data']}, upsert=True)
|
||||
return '保存成功'
|
||||
collection = client_tfse_021[param1][param2]
|
||||
columns = {**{'_id': False}, **dict(zip(param4, [1] * len(param4)))}
|
||||
record = list(collection.find(param3, columns))
|
||||
return record
|
||||
|
||||
|
||||
def UPSERT_SINGLE_DATA(param1, param2, param3, param4):
|
|
@ -1,9 +1,9 @@
|
|||
from flask import Blueprint, request
|
||||
from common.scripts import verify_token
|
||||
from rating.EsgReportEtl import EsgCleanModel
|
||||
from rating.ReportEtl import CleanModel
|
||||
from rating.scripts.common import get_tfse_data, get_esg_data
|
||||
from rating.scripts.risk_count import *
|
||||
from common.utils import verify_token
|
||||
from RatingData.EsgReportEtl import EsgCleanModel
|
||||
from RatingData.ReportEtl import CleanModel
|
||||
from RatingData.scripts.common import get_tfse_data, get_esg_data
|
||||
from RatingData.scripts.risk_count import *
|
||||
|
||||
rating_route = Blueprint('rating', __name__)
|
||||
|
||||
|
@ -43,7 +43,7 @@ def esg_risk_data():
|
|||
company_id = request.json['company_id']
|
||||
evaluation_id = request.json['evaluation_id']
|
||||
esg_risk_data_etl(company_name, company_id, evaluation_id)
|
||||
return {"info": "执行成功"}, 200
|
||||
return {"info": "执行完成"}, 200
|
||||
|
||||
|
||||
@rating_route.route('/report_data', methods=['POST'])
|
|
@ -1,8 +1,8 @@
|
|||
import copy
|
||||
import time
|
||||
|
||||
from rating.db import find_tyc_db, find_tfse_db
|
||||
from rating.static.province_map import p_map
|
||||
from RatingData.db import FIND_DATA_N_TYC, FIND_SINGLE_DATA_BY_REQ, FIND_ALL_DATA_BY_REQ
|
||||
from RatingData.static.province_map import p_map
|
||||
import pandas as pd
|
||||
|
||||
|
||||
|
@ -151,34 +151,35 @@ def get_tfse_data(param):
|
|||
|
||||
report_data = dict()
|
||||
# 评价结果
|
||||
es = find_tfse_db(db='评价', col='评价结果', query={'评价ID': rid})[0]
|
||||
es = FIND_SINGLE_DATA_BY_REQ('综信评价数据', '评价结果', {'评价ID': rid}, ["评价年度", "财务评分"])
|
||||
# 综合评价填报
|
||||
cef = find_tfse_db(db='评价', col='综合评价填报', query={'评价ID': rid})[0]
|
||||
cef = FIND_SINGLE_DATA_BY_REQ('综信评价数据', '填报数据', {'评价ID': rid}, ["财务填报", "行业选择"])
|
||||
# 指标明细
|
||||
fid = find_tfse_db(db='企业', col='指标明细', query={'企业名称': company})
|
||||
fid = FIND_ALL_DATA_BY_REQ('综信评价数据', '财指结果', {'企业ID': rid},
|
||||
['报告期', '净资产收益率', '存货周转率', '已获利息倍数', '应收账款周转率', '总资产周转率', '总资产增长率', '总资产报酬率', '技术投入比率', '营业增长率', '资产负债率', '速动比率'])
|
||||
# 基本信息
|
||||
cbd = find_tyc_db(db='公司背景', col='基本信息', query={'企业名称': company})[0]
|
||||
cbd = FIND_DATA_N_TYC(db='公司背景', col='基本信息', query={'企业名称': company})[0]
|
||||
if '上市' in cbd['基本信息']['companyOrgType']:
|
||||
# 企业股东
|
||||
cs = find_tyc_db(db='公司背景', col='十大股东', query={'企业名称': company})[0]
|
||||
cs = FIND_DATA_N_TYC(db='公司背景', col='十大股东', query={'企业名称': company})[0]
|
||||
else:
|
||||
cs = find_tyc_db(db='公司背景', col='企业股东', query={'企业名称': company})[0]
|
||||
cs = FIND_DATA_N_TYC(db='公司背景', col='企业股东', query={'企业名称': company})[0]
|
||||
# 对外投资
|
||||
oi = find_tyc_db(db='公司背景', col='对外投资', query={'企业名称': company})[0]
|
||||
oi = FIND_DATA_N_TYC(db='公司背景', col='对外投资', query={'企业名称': company})[0]
|
||||
# 进出口信用
|
||||
ip = find_tyc_db(db='经营状况', col='进出口信用', query={'企业名称': company})[0]
|
||||
ip = FIND_DATA_N_TYC(db='经营状况', col='进出口信用', query={'企业名称': company})[0]
|
||||
# 专利
|
||||
ip_02 = find_tyc_db(db='知识产权', col='专利', query={'企业名称': company})[0]
|
||||
ip_02 = FIND_DATA_N_TYC(db='知识产权', col='专利', query={'企业名称': company})[0]
|
||||
# 软件著作权
|
||||
sc = find_tyc_db(db='知识产权', col='软件著作权', query={'企业名称': company})[0]
|
||||
sc = FIND_DATA_N_TYC(db='知识产权', col='软件著作权', query={'企业名称': company})[0]
|
||||
# 资质证书
|
||||
qh = find_tyc_db(db='经营状况', col='资质证书', query={'企业名称': company})[0]
|
||||
qh = FIND_DATA_N_TYC(db='经营状况', col='资质证书', query={'企业名称': company})[0]
|
||||
# 融资历史
|
||||
fh = find_tyc_db(db='公司发展', col='融资历史', query={'企业名称': company})[0]
|
||||
fh = FIND_DATA_N_TYC(db='公司发展', col='融资历史', query={'企业名称': company})[0]
|
||||
# 风险数据
|
||||
rd = find_tfse_db(db='评价', col='风险数据', query={'企业ID': cid})[0]
|
||||
rd = FIND_SINGLE_DATA_BY_REQ('综信评价数据', '风险数据', {'评价ID': rid}, ["合规风险", "经营风险"])
|
||||
# 周边风险
|
||||
pr = find_tyc_db(db='天眼风险', col='周边风险', query={'企业名称': company})[0]
|
||||
pr = FIND_DATA_N_TYC(db='天眼风险', col='周边风险', query={'企业名称': company})[0]
|
||||
report_data['评价结果'] = es
|
||||
report_data['综合评价填报'] = cef
|
||||
report_data['指标明细'] = fid
|
||||
|
@ -228,9 +229,9 @@ def shareholder_strength_data(param):
|
|||
"""
|
||||
data = dict()
|
||||
# 基本信息
|
||||
cbd = find_tyc_db(db='公司背景', col='基本信息', query={'企业名称': param})[0]
|
||||
cbd = FIND_DATA_N_TYC(db='公司背景', col='基本信息', query={'企业名称': param})[0]
|
||||
# 企业股东
|
||||
cs = find_tyc_db(db='公司背景', col='企业股东', query={'企业名称': param})[0]
|
||||
cs = FIND_DATA_N_TYC(db='公司背景', col='企业股东', query={'企业名称': param})[0]
|
||||
data['基本信息'] = cbd
|
||||
data['企业股东'] = cs
|
||||
|
||||
|
@ -248,13 +249,13 @@ def ten_shareholder_data(param):
|
|||
"""
|
||||
data = dict()
|
||||
# 基本信息
|
||||
cbd = find_tyc_db(db='公司背景', col='基本信息', query={'企业名称': param})[0]
|
||||
cbd = FIND_DATA_N_TYC(db='公司背景', col='基本信息', query={'企业名称': param})[0]
|
||||
data['基本信息'] = cbd
|
||||
if '上市' in cbd['基本信息']['companyOrgType']:
|
||||
cs = find_tyc_db(db='公司背景', col='十大股东', query={'企业名称': param})[0]
|
||||
cs = FIND_DATA_N_TYC(db='公司背景', col='十大股东', query={'企业名称': param})[0]
|
||||
data['十大股东'] = cs
|
||||
else:
|
||||
cs = find_tyc_db(db='公司背景', col='企业股东', query={'企业名称': param})[0]
|
||||
cs = FIND_DATA_N_TYC(db='公司背景', col='企业股东', query={'企业名称': param})[0]
|
||||
data['企业股东'] = cs
|
||||
return data
|
||||
|
||||
|
@ -270,7 +271,7 @@ def person_subsidiaries(param):
|
|||
"""
|
||||
data = dict()
|
||||
# 控股数据
|
||||
ps = find_tyc_db(db='公司背景', col='人员控股企业', query={'人员ID': param})[0]
|
||||
ps = FIND_DATA_N_TYC(db='公司背景', col='人员控股企业', query={'人员ID': param})[0]
|
||||
data['人员控股企业'] = ps
|
||||
return data
|
||||
|
||||
|
@ -288,16 +289,15 @@ def get_esg_data(param):
|
|||
cid = param['cid']
|
||||
|
||||
# ESG评价结果
|
||||
es = find_tfse_db(db='评价', col='ESG评价结果', query={'评价ID': rid})[0]
|
||||
es = FIND_SINGLE_DATA_BY_REQ('ESG评价数据', '评价结果', {'评价ID': rid}, ['评价等级'])
|
||||
# ESG风险数据
|
||||
rd = find_tfse_db(db='评价', col='ESG风险数据', query={'企业ID': cid})[0]
|
||||
rd = FIND_SINGLE_DATA_BY_REQ('ESG评价数据', '风险数据', {'企业ID': cid},
|
||||
["严重违法", "失信人", "法律诉讼", "税收违法", "经营异常", "行政处罚", "被执行人"])
|
||||
# ESG评价填报
|
||||
ef = find_tfse_db(db='评价', col='ESG评价填报', query={'评价ID': rid})[0]
|
||||
rd.pop('企业ID')
|
||||
rd.pop('评价ID')
|
||||
rd.pop('更新日期')
|
||||
report_data = copy.deepcopy(ef)
|
||||
ef = FIND_SINGLE_DATA_BY_REQ('ESG评价数据', '填报数据', {'评价ID': rid},
|
||||
["评价ID", "企业ID", "企业名称", "所属行业", "评价年度", "公司当年收入(万元)", "环境问卷", "社会问卷", "治理问卷"])
|
||||
|
||||
report_data = copy.deepcopy(ef)
|
||||
report_data['评价等级'] = es['评价等级']
|
||||
report_data['风险数据'] = rd
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
from common.scripts import read_json_file
|
||||
from rating.scripts.common import *
|
||||
from common.utils import read_json_file
|
||||
from RatingData.scripts.common import *
|
||||
|
||||
|
||||
def evaluation_results(param):
|
|
@ -1,4 +1,4 @@
|
|||
from rating.scripts.common import *
|
||||
from RatingData.scripts.common import *
|
||||
|
||||
|
||||
def appendix_one(param):
|
|
@ -1,6 +1,6 @@
|
|||
import datetime
|
||||
|
||||
from rating.scripts.common import *
|
||||
from RatingData.scripts.common import *
|
||||
|
||||
|
||||
def company_background(param1, param2):
|
|
@ -1,7 +1,7 @@
|
|||
import time
|
||||
import datetime
|
||||
|
||||
from rating.db import conserve_data, find_tyc_db, UPSERT_SINGLE_DATA
|
||||
from RatingData.db import FIND_DATA_N_TYC, UPSERT_SINGLE_DATA
|
||||
|
||||
|
||||
def risk_data_etl(param1, param2, param3):
|
||||
|
@ -77,8 +77,7 @@ def esg_risk_data_etl(param1, param2, param3):
|
|||
insert_data['严重违法'] = serious_illegal(param1)
|
||||
insert_data['经营异常'] = abnormal_operation(param1)
|
||||
|
||||
info = conserve_data(db='评价', col='ESG风险数据', cid=param2, insert_data=insert_data)
|
||||
return info
|
||||
UPSERT_SINGLE_DATA("ESG评价数据", "风险数据", {"评价ID": param3}, insert_data)
|
||||
|
||||
|
||||
def dishonest_person(param):
|
||||
|
@ -91,7 +90,7 @@ def dishonest_person(param):
|
|||
res: 满足条件总数
|
||||
"""
|
||||
total = 0
|
||||
res = find_tyc_db(db='司法风险', col='失信人', query={'企业名称': param})
|
||||
res = FIND_DATA_N_TYC(db='司法风险', col='失信人', query={'企业名称': param})
|
||||
if len(res):
|
||||
data = res[0]
|
||||
try:
|
||||
|
@ -122,7 +121,7 @@ def serious_illegal(param):
|
|||
res: 满足条件总数
|
||||
"""
|
||||
total = 0
|
||||
res = find_tyc_db(db='经营风险', col='严重违法', query={'企业名称': param})
|
||||
res = FIND_DATA_N_TYC(db='经营风险', col='严重违法', query={'企业名称': param})
|
||||
if len(res):
|
||||
data = res[0]
|
||||
try:
|
||||
|
@ -155,7 +154,7 @@ def abnormal_operation(param):
|
|||
res: 满足条件总数
|
||||
"""
|
||||
total = 0
|
||||
res = find_tyc_db(db='经营风险', col='经营异常', query={'企业名称': param})
|
||||
res = FIND_DATA_N_TYC(db='经营风险', col='经营异常', query={'企业名称': param})
|
||||
if len(res):
|
||||
data = res[0]
|
||||
try:
|
||||
|
@ -186,7 +185,7 @@ def owing_taxes(param):
|
|||
res: 满足条件总数
|
||||
"""
|
||||
total = 0
|
||||
res = find_tyc_db(db='经营风险', col='欠税公告', query={'企业名称': param})
|
||||
res = FIND_DATA_N_TYC(db='经营风险', col='欠税公告', query={'企业名称': param})
|
||||
if len(res):
|
||||
data = res[0]
|
||||
try:
|
||||
|
@ -217,7 +216,7 @@ def tax_violation(param):
|
|||
res: 满足条件总数
|
||||
"""
|
||||
total = 0
|
||||
res = find_tyc_db(db='经营风险', col='税收违法', query={'企业名称': param})
|
||||
res = FIND_DATA_N_TYC(db='经营风险', col='税收违法', query={'企业名称': param})
|
||||
if len(res):
|
||||
data = res[0]
|
||||
try:
|
||||
|
@ -248,7 +247,7 @@ def filing_info(param):
|
|||
res: 满足条件总数
|
||||
"""
|
||||
total = 0
|
||||
res = find_tyc_db(db='司法风险', col='立案信息', query={'企业名称': param})
|
||||
res = FIND_DATA_N_TYC(db='司法风险', col='立案信息', query={'企业名称': param})
|
||||
if len(res):
|
||||
data = res[0]
|
||||
try:
|
||||
|
@ -279,7 +278,7 @@ def administrative_punish(param):
|
|||
res: 满足条件总数
|
||||
"""
|
||||
total = 0
|
||||
res = find_tyc_db(db='经营风险', col='行政处罚', query={'企业名称': param})
|
||||
res = FIND_DATA_N_TYC(db='经营风险', col='行政处罚', query={'企业名称': param})
|
||||
if len(res):
|
||||
data = res[0]
|
||||
try:
|
||||
|
@ -310,7 +309,7 @@ def environmental_punish(param):
|
|||
res: 满足条件总数
|
||||
"""
|
||||
total = 0
|
||||
res = find_tyc_db(db='经营风险', col='环保处罚', query={'企业名称': param})
|
||||
res = FIND_DATA_N_TYC(db='经营风险', col='环保处罚', query={'企业名称': param})
|
||||
if len(res):
|
||||
data = res[0]
|
||||
try:
|
||||
|
@ -341,7 +340,7 @@ def opening_announcement(param):
|
|||
res: 满足条件总数
|
||||
"""
|
||||
total = 0
|
||||
res = find_tyc_db(db='司法风险', col='开庭公告', query={'企业名称': param})
|
||||
res = FIND_DATA_N_TYC(db='司法风险', col='开庭公告', query={'企业名称': param})
|
||||
if len(res):
|
||||
data = res[0]
|
||||
try:
|
||||
|
@ -376,7 +375,7 @@ def executed_person(param):
|
|||
res: 满足条件总数
|
||||
"""
|
||||
total = 0
|
||||
res = find_tyc_db(db='司法风险', col='被执行人', query={'企业名称': param})
|
||||
res = FIND_DATA_N_TYC(db='司法风险', col='被执行人', query={'企业名称': param})
|
||||
if len(res):
|
||||
data = res[0]
|
||||
try:
|
||||
|
@ -407,7 +406,7 @@ def court_announcement(param):
|
|||
res: 满足条件总数
|
||||
"""
|
||||
total = 0
|
||||
res = find_tyc_db(db='司法风险', col='法院公告', query={'企业名称': param})
|
||||
res = FIND_DATA_N_TYC(db='司法风险', col='法院公告', query={'企业名称': param})
|
||||
if len(res):
|
||||
data = res[0]
|
||||
try:
|
||||
|
@ -439,7 +438,7 @@ def lawsuit(param):
|
|||
res: 满足条件总数
|
||||
"""
|
||||
total = 0
|
||||
res = find_tyc_db(db='司法风险', col='诉讼', query={'企业名称': param})
|
||||
res = FIND_DATA_N_TYC(db='司法风险', col='诉讼', query={'企业名称': param})
|
||||
if len(res):
|
||||
data = res[0]
|
||||
try:
|
||||
|
@ -471,7 +470,7 @@ def service_notice(param):
|
|||
res: 满足条件总数
|
||||
"""
|
||||
total = 0
|
||||
res = find_tyc_db(db='司法风险', col='送达公告', query={'企业名称': param})
|
||||
res = FIND_DATA_N_TYC(db='司法风险', col='送达公告', query={'企业名称': param})
|
||||
if len(res):
|
||||
data = res[0]
|
||||
try:
|
||||
|
@ -502,7 +501,7 @@ def equity_pledge(param):
|
|||
res: 满足条件总数
|
||||
"""
|
||||
total = 0
|
||||
res = find_tyc_db(db='经营风险', col='股权出质', query={'企业名称': param})
|
||||
res = FIND_DATA_N_TYC(db='经营风险', col='股权出质', query={'企业名称': param})
|
||||
if len(res):
|
||||
data = res[0]
|
||||
try:
|
||||
|
@ -536,7 +535,7 @@ def periphery_risk(param1, param2):
|
|||
res: 满足条件总数
|
||||
"""
|
||||
total = 0
|
||||
res = find_tyc_db(db='天眼风险', col='周边风险', query={'企业名称': param1})
|
||||
res = FIND_DATA_N_TYC(db='天眼风险', col='周边风险', query={'企业名称': param1})
|
||||
if len(res):
|
||||
data = res[0]
|
||||
try:
|
||||
|
@ -566,7 +565,7 @@ def change_record(param1, param2):
|
|||
res: 满足条件总数
|
||||
"""
|
||||
total = 0
|
||||
res = find_tyc_db(db='公司背景', col='变更记录', query={'企业名称': param1})
|
||||
res = FIND_DATA_N_TYC(db='公司背景', col='变更记录', query={'企业名称': param1})
|
||||
if len(res):
|
||||
data = res[0]
|
||||
try:
|
|
@ -1,7 +1,7 @@
|
|||
import json
|
||||
import pandas as pd
|
||||
|
||||
from rating.db import find_tyc_db
|
||||
from RatingData.db import FIND_DATA_N_TYC
|
||||
|
||||
|
||||
def associate_risk_detail(param):
|
||||
|
@ -13,7 +13,7 @@ def associate_risk_detail(param):
|
|||
Returns:
|
||||
result: 企业关联风险类型和数量
|
||||
"""
|
||||
res = find_tyc_db(db='天眼风险', col='周边风险', query={'企业名称': param})
|
||||
res = FIND_DATA_N_TYC(db='天眼风险', col='周边风险', query={'企业名称': param})
|
||||
result = []
|
||||
|
||||
if res:
|
||||
|
@ -45,7 +45,7 @@ def change_log_detail(param):
|
|||
Returns:
|
||||
res: desc
|
||||
"""
|
||||
res = find_tyc_db(db='天眼风险', col='预警提醒', query={'企业名称': param})
|
||||
res = FIND_DATA_N_TYC(db='天眼风险', col='预警提醒', query={'企业名称': param})
|
||||
result = []
|
||||
if res:
|
||||
df = pd.DataFrame(res[0]['预警提醒']['list'])[['total', 'title', 'list']]
|
4
app.py
4
app.py
|
@ -1,8 +1,8 @@
|
|||
from flask import Flask
|
||||
from flask_cors import *
|
||||
|
||||
from company.routes import company_route
|
||||
from rating.routes import rating_route
|
||||
from CompanyData.routes import company_route
|
||||
from RatingData.routes import rating_route
|
||||
|
||||
app = Flask(__name__)
|
||||
CORS(app, supports_credentials=True)
|
||||
|
|
Loading…
Reference in New Issue