From 030fc332d1be5684feb6acff6d857eed6e78b093 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=80=9D=E5=B7=9D?= Date: Thu, 26 May 2022 17:15:30 +0800 Subject: [PATCH 1/3] changes --- Modules/ETL/__init__.py | 0 Modules/Model/__init__.py | 0 Modules/Rating/RatingImpl.py | 19 ++++++++++ Modules/Rating/RatingObjects.py | 30 +++++++++++++++ Modules/Rating/RatingRoutes.py | 67 +++++++++++++++++++++++++++++++++ Modules/Rating/RatingUtils.py | 0 Utils/RouteUtil.py | 17 +++++---- app.py | 2 + 8 files changed, 128 insertions(+), 7 deletions(-) create mode 100644 Modules/ETL/__init__.py create mode 100644 Modules/Model/__init__.py create mode 100644 Modules/Rating/RatingImpl.py create mode 100644 Modules/Rating/RatingObjects.py create mode 100644 Modules/Rating/RatingRoutes.py create mode 100644 Modules/Rating/RatingUtils.py diff --git a/Modules/ETL/__init__.py b/Modules/ETL/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Modules/Model/__init__.py b/Modules/Model/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Modules/Rating/RatingImpl.py b/Modules/Rating/RatingImpl.py new file mode 100644 index 0000000..736b685 --- /dev/null +++ b/Modules/Rating/RatingImpl.py @@ -0,0 +1,19 @@ +from Modules.Rating.RatingObjects import RatingRecord + + +class RatingRecordImpl(object): + + def create(self, **kwargs): + """""" + + rating_record = RatingRecord() + rating_record.rid = "" + rating_record.status = "进行" + rating_record.cid = kwargs['cid'] + rating_record.company_name = "" + rating_record.province_and_city = "" + + def rating_years(self): + """""" + + diff --git a/Modules/Rating/RatingObjects.py b/Modules/Rating/RatingObjects.py new file mode 100644 index 0000000..35ba21d --- /dev/null +++ b/Modules/Rating/RatingObjects.py @@ -0,0 +1,30 @@ +from Utils.ObjUtil import SpecObject +from Utils.ValidateUtil import ValidateAttr, Validate + + +class RatingRecord(SpecObject): + """评级记录""" + + rid = ValidateAttr(field="rid", type=str) + report_date = ValidateAttr(field="report_date", func=Validate.date_format) + status = ValidateAttr(field="status", in_list=["完成", "进行"]) + cid = ValidateAttr(field="cid", type=str) + company_name = ValidateAttr(field="company_name", type=str) + rating_date = ValidateAttr(field="rating_date", func=Validate.date_format) + credit_rating = ValidateAttr(field="credit_rating", type=str) + credit_score = ValidateAttr(field="credit_score", type=float) + rating_report = ValidateAttr(field="rating_report", type=str) + province_and_city = ValidateAttr(field="province_and_city", type=str) + + fields_map = { + "rid": "评级ID", + "report_date": "报告期", + "status": "评级状态", + "cid": "企业ID", + "company_name": "企业名称", + "rating_date": "评级日期", + "credit_rating": "信用级别", + "credit_score": "信用分数", + "rating_report": "评级报告", + "province_and_city": "所在省市" + } diff --git a/Modules/Rating/RatingRoutes.py b/Modules/Rating/RatingRoutes.py new file mode 100644 index 0000000..3824cae --- /dev/null +++ b/Modules/Rating/RatingRoutes.py @@ -0,0 +1,67 @@ +from flask import Blueprint, request + +from Modules.AdminUser.UserAuthUtils import verify_token +from Modules.Rating.RatingImpl import RatingRecordImpl +from Utils.ErrorUtil import AttrCheckError +from Utils.RouteUtil import RouteParamsCheck + +rating_route = Blueprint('rating', __name__) + + +@rating_route.route('/create', methods=['GET']) +@verify_token +def create_routes(**kwargs): + """新建评级""" + + RouteParamsCheck( + req=request.args, + params=['cid', 'report_date'] + ).required() + + cid = request.args['cid'] + report_date = request.args['report_date'] + + try: + impl = RatingRecordImpl() + impl.create(cid=cid, report_date=report_date) + return {"info": "success"} + except AssertionError as e: + return {"info": e.__str__()}, 202 + except AttrCheckError as e: + return {"info": e.__str__()}, 202 + + +@rating_route.route('/rating_years', methods=['GET']) +@verify_token +def rating_years_routes(**kwargs): + """获取可评级年度""" + + +@rating_route.route('/financial_analysis', methods=['GET']) +@verify_token +def financial_analysis_routes(**kwargs): + """财务分析""" + + +@rating_route.route('/risk_analysis', methods=['GET']) +@verify_token +def risk_analysis_route(**kwargs): + """风险分析""" + + +@rating_route.route('/score_and_rank', methods=['GET']) +@verify_token +def score_and_rank_route(**kwargs): + """得分级别""" + + +@rating_route.route('/rank_report', methods=['GET']) +@verify_token +def rank_report_route(**kwargs): + """评级报告""" + + +@rating_route.route('/submit', methods=['GET']) +@verify_token +def submit_route(**kwargs): + """确认提交""" diff --git a/Modules/Rating/RatingUtils.py b/Modules/Rating/RatingUtils.py new file mode 100644 index 0000000..e69de29 diff --git a/Utils/RouteUtil.py b/Utils/RouteUtil.py index 89ba712..35155cb 100644 --- a/Utils/RouteUtil.py +++ b/Utils/RouteUtil.py @@ -1,21 +1,24 @@ from Utils.ErrorUtil import APIReturnError -class RouteUtil(object): +class RouteParamsCheck(object): """路由工具""" - @staticmethod - def require_params_check(req_body, req_params): + def __init__(self, req, params): + self.req = req + self.params = params + + def required(self): """必需参数检查""" - if not isinstance(req_body, dict): + if not isinstance(self.req, dict): raise Exception - if not isinstance(req_params, list): + if not isinstance(self.params, list): raise Exception - params_in_req_body = list(req_body.keys()) - for param in req_params: + params_in_req_body = list(self.req.keys()) + for param in self.params: if param not in params_in_req_body: error_info = "缺失必需参数: {}".format(param) raise APIReturnError(error_info=error_info, status_code=200) diff --git a/app.py b/app.py index 0938a1d..2677d08 100644 --- a/app.py +++ b/app.py @@ -3,6 +3,7 @@ from flask_cors import * from Modules.AdminUser.UserRoutes import user_route from Modules.Company.CompanyRoutes import company_route +from Modules.Rating.RatingRoutes import rating_route app = Flask(__name__) CORS(app, supports_credentials=True) @@ -11,6 +12,7 @@ app.config['JSON_SORT_KEYS'] = False app.register_blueprint(user_route, url_prefix='/admin/user') app.register_blueprint(company_route, url_prefix='/admin/company') +app.register_blueprint(rating_route, url_prefix='/admin/rating') @app.route('/admin/version') From a12e96b5fb79d2ff13f5908f2376b7eb2f36b16d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=80=9D=E5=B7=9D?= Date: Fri, 27 May 2022 14:45:15 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=96=B0=E5=A2=9E=201.=E8=AF=84=E7=BA=A7?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modules/Common/CommonUtils.py | 11 ++++++ Modules/Company/CompanyImpl.py | 4 +- Modules/Company/CompanyUtils.py | 17 ++------ Modules/Rating/RatingImpl.py | 70 ++++++++++++++++++++++++++++----- Modules/Rating/RatingRoutes.py | 36 +++++++++++++---- Modules/Rating/RatingUtils.py | 61 ++++++++++++++++++++++++++++ 6 files changed, 166 insertions(+), 33 deletions(-) diff --git a/Modules/Common/CommonUtils.py b/Modules/Common/CommonUtils.py index 6ea1538..7182497 100644 --- a/Modules/Common/CommonUtils.py +++ b/Modules/Common/CommonUtils.py @@ -1,3 +1,4 @@ +import random import time @@ -5,4 +6,14 @@ class CommonUtils(object): @staticmethod def get_current_time(): + """获取当前时间""" return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + + @staticmethod + def random_code(length): + """生成随机编码""" + choices = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' + code = '' + for i in range(length): + code += random.choice(choices) + return code diff --git a/Modules/Company/CompanyImpl.py b/Modules/Company/CompanyImpl.py index 36a628b..c3fee43 100644 --- a/Modules/Company/CompanyImpl.py +++ b/Modules/Company/CompanyImpl.py @@ -3,7 +3,7 @@ import xlrd from DBHelper.MongoHelperInstance import DB_GUA from Modules.Company.CompanyObject import BasicBusinessInfo, FinancialData, CustomerInfo, RegionalDistribution, \ IndustryDistribution, GuaranteedBalanceDistribution -from Modules.Company.CompanyUtils import CommonUtils, ExcelSheetParser +from Modules.Company.CompanyUtils import CompanyUtils, ExcelSheetParser from Utils.ObjUtil import SpecObject @@ -13,7 +13,7 @@ class BasicBusinessInfoImpl(object): def parse_excel_and_create_company(file): """解析excel模板数据 创建公司信息""" - new_cid = CommonUtils.make_new_cid() + new_cid = CompanyUtils.make_new_cid() work_book = xlrd.open_workbook(file_contents=file.read()) basic_business_info = BasicBusinessInfo() diff --git a/Modules/Company/CompanyUtils.py b/Modules/Company/CompanyUtils.py index dd6eb85..472e35c 100644 --- a/Modules/Company/CompanyUtils.py +++ b/Modules/Company/CompanyUtils.py @@ -4,24 +4,15 @@ import random from datetime import datetime, timedelta from DBHelper.MongoHelperInstance import DB_GUA +from Modules.Common.CommonUtils import CommonUtils -class CommonUtils(object): +class CompanyUtils(object): # 生成新的企业ID,如果该ID存在,则重新生成 @staticmethod def make_new_cid(): - - def random_cid(num): - """随机企业ID""" - choices = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' - salt = '' - for i in range(num): - salt += random.choice(choices) - return salt - - new_cid = random_cid(8) - + new_cid = CommonUtils.random_code(8) case = DB_GUA.find_single_column( "管理端", "企业数据", @@ -29,7 +20,7 @@ class CommonUtils(object): "企业ID" ) is not None while case: - new_cid = random_cid(8) + new_cid = CommonUtils.random_code(8) return new_cid diff --git a/Modules/Rating/RatingImpl.py b/Modules/Rating/RatingImpl.py index 736b685..cd61ba0 100644 --- a/Modules/Rating/RatingImpl.py +++ b/Modules/Rating/RatingImpl.py @@ -1,19 +1,69 @@ +from DBHelper.MongoHelperInstance import DB_GUA from Modules.Rating.RatingObjects import RatingRecord +from Modules.Rating.RatingUtils import RatingUtils class RatingRecordImpl(object): - def create(self, **kwargs): - """""" + @staticmethod + def before_create(**kwargs): + """新建评级前检查""" + cid = kwargs["cid"] + RatingUtils.check_cid_legal(kwargs["cid"]) + rid = RatingUtils.in_progress_rating(cid) + + if rid: + item = DB_GUA.find_single_data( + "评级数据", + "评级记录", + {"评级ID": rid}, + ["企业名称", "报告期"] + ) + return_data = dict() + return_data["企业名称"] = item["企业名称"] + return_data["评级年度"] = RatingUtils.trans_report_date_to_rank_year(item["报告期"]) + else: + items = DB_GUA.find_all_data_with_single_sort( + "企业数据", + "财务数据", + {"企业ID": cid}, + ["企业名称", "报告期"], + {"报告期": -1} + ) + return_data = dict() + return_data["企业名称"] = items[0]["企业名称"] + return_data["评级年度"] = RatingUtils.trans_report_date_to_rank_year([item["报告期"] for item in items]) + + return return_data + + @staticmethod + def create(**kwargs): + """新建评级""" + + cid = kwargs["cid"] + report_date = kwargs["report_date"] + + rid = RatingUtils.in_progress_rating(cid) + + assert rid, "切换到正在进行的评级" + + business_info = DB_GUA.find_single_data( + "企业数据", + "工商信息", + {"企业ID": cid} + ["企业名称", "所在省份", "所在城市"] + ) rating_record = RatingRecord() - rating_record.rid = "" + rating_record.rid = RatingUtils.make_new_rid() + rating_record.report_date = report_date rating_record.status = "进行" - rating_record.cid = kwargs['cid'] - rating_record.company_name = "" - rating_record.province_and_city = "" - - def rating_years(self): - """""" - + rating_record.cid = cid + rating_record.company_name = business_info["企业名称"] + rating_record.province_and_city = business_info["所在省份"] + business_info["所在城市"] + DB_GUA.insert_single_data( + "评级数据", + "评级记录", + rating_record.fields_toggle() + ) diff --git a/Modules/Rating/RatingRoutes.py b/Modules/Rating/RatingRoutes.py index 3824cae..7726f9a 100644 --- a/Modules/Rating/RatingRoutes.py +++ b/Modules/Rating/RatingRoutes.py @@ -8,6 +8,26 @@ from Utils.RouteUtil import RouteParamsCheck rating_route = Blueprint('rating', __name__) +@rating_route.route('/before_create', methods=['GET']) +@verify_token +def before_create_routes(**kwargs): + """评级选择""" + + RouteParamsCheck( + req=request.args, + params=['cid'] + ).required() + + cid = request.args['cid'] + + try: + impl = RatingRecordImpl() + result = impl.before_create(cid=cid) + return {"info": "评级选择", "result": result} + except AssertionError as e: + return {"info": e.__str__()}, 200 + + @rating_route.route('/create', methods=['GET']) @verify_token def create_routes(**kwargs): @@ -24,19 +44,13 @@ def create_routes(**kwargs): try: impl = RatingRecordImpl() impl.create(cid=cid, report_date=report_date) - return {"info": "success"} + return {"info": "新建评级成功"} except AssertionError as e: - return {"info": e.__str__()}, 202 + return {"info": e.__str__()}, 200 except AttrCheckError as e: return {"info": e.__str__()}, 202 -@rating_route.route('/rating_years', methods=['GET']) -@verify_token -def rating_years_routes(**kwargs): - """获取可评级年度""" - - @rating_route.route('/financial_analysis', methods=['GET']) @verify_token def financial_analysis_routes(**kwargs): @@ -65,3 +79,9 @@ def rank_report_route(**kwargs): @verify_token def submit_route(**kwargs): """确认提交""" + + +@rating_route.route('/delete', methods=['GET']) +@verify_token +def delete_route(**kwargs): + """删除评级(进行中)""" diff --git a/Modules/Rating/RatingUtils.py b/Modules/Rating/RatingUtils.py index e69de29..82afe30 100644 --- a/Modules/Rating/RatingUtils.py +++ b/Modules/Rating/RatingUtils.py @@ -0,0 +1,61 @@ +from DBHelper.MongoHelperInstance import DB_GUA +from Modules.Common.CommonUtils import CommonUtils + + +class RatingUtils(object): + + @staticmethod + def make_new_rid(): + """新建评级ID""" + new_rid = CommonUtils.random_code(8) + case = DB_GUA.find_single_column( + "评级数据", + "评级记录", + {"评级ID": new_rid}, + "评级ID" + ) is not None + while case: + new_rid = CommonUtils.random_code(8) + return new_rid + + @staticmethod + def in_progress_rating(cid): + """查找进行中的评级""" + in_progress_rid = DB_GUA.find_single_column( + "评级数据", + "评级记录", + {"企业ID": cid, "评级状态": "进行"}, + "评级ID" + ) + return in_progress_rid + + @staticmethod + def trans_report_date_to_rank_year(report_date): + """报告期转换为评级年度""" + + def main(_date): + items = _date.split("-") + year = items[0] + month = items[1] + if month == "12": + rank_year = "{}年".format(int(year)+1) + else: + rank_year = "{}年".format(year) + return rank_year + + if type(report_date) == str: + return main(report_date) + elif type(report_date) == list: + rank_years = [main(item) for item in report_date] + rank_years = sorted(set(rank_years), key=rank_years.index) + return rank_years + + @staticmethod + def check_cid_legal(cid): + _cid = DB_GUA.find_single_column( + "企业数据", + "工商信息", + {"企业ID": cid}, + "企业ID" + ) + assert _cid, "错误的企业ID" From 5834e824b358ca05d5269b95e555df1221025fb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=80=9D=E5=B7=9D?= Date: Fri, 27 May 2022 15:02:27 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=96=B0=E5=A2=9E=201.=E6=96=B0=E5=BB=BA?= =?UTF-8?q?=E8=AF=84=E7=BA=A7=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modules/Rating/RatingImpl.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Modules/Rating/RatingImpl.py b/Modules/Rating/RatingImpl.py index cd61ba0..d363789 100644 --- a/Modules/Rating/RatingImpl.py +++ b/Modules/Rating/RatingImpl.py @@ -21,7 +21,7 @@ class RatingRecordImpl(object): ) return_data = dict() return_data["企业名称"] = item["企业名称"] - return_data["评级年度"] = RatingUtils.trans_report_date_to_rank_year(item["报告期"]) + return_data["报告期"] = item["报告期"] else: items = DB_GUA.find_all_data_with_single_sort( "企业数据", @@ -32,7 +32,7 @@ class RatingRecordImpl(object): ) return_data = dict() return_data["企业名称"] = items[0]["企业名称"] - return_data["评级年度"] = RatingUtils.trans_report_date_to_rank_year([item["报告期"] for item in items]) + return_data["报告期"] = [item["报告期"] for item in items] return return_data @@ -44,13 +44,12 @@ class RatingRecordImpl(object): report_date = kwargs["report_date"] rid = RatingUtils.in_progress_rating(cid) - - assert rid, "切换到正在进行的评级" + assert not rid, "已有正在进行的评级" business_info = DB_GUA.find_single_data( "企业数据", "工商信息", - {"企业ID": cid} + {"企业ID": cid}, ["企业名称", "所在省份", "所在城市"] )