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 afe7309..2aa2b45 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 d71a59f..7806cb6 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/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..d363789 --- /dev/null +++ b/Modules/Rating/RatingImpl.py @@ -0,0 +1,68 @@ +from DBHelper.MongoHelperInstance import DB_GUA +from Modules.Rating.RatingObjects import RatingRecord +from Modules.Rating.RatingUtils import RatingUtils + + +class RatingRecordImpl(object): + + @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["报告期"] = item["报告期"] + else: + items = DB_GUA.find_all_data_with_single_sort( + "企业数据", + "财务数据", + {"企业ID": cid}, + ["企业名称", "报告期"], + {"报告期": -1} + ) + return_data = dict() + return_data["企业名称"] = items[0]["企业名称"] + return_data["报告期"] = [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 not rid, "已有正在进行的评级" + + business_info = DB_GUA.find_single_data( + "企业数据", + "工商信息", + {"企业ID": cid}, + ["企业名称", "所在省份", "所在城市"] + ) + + rating_record = RatingRecord() + rating_record.rid = RatingUtils.make_new_rid() + rating_record.report_date = report_date + rating_record.status = "进行" + 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/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..7726f9a --- /dev/null +++ b/Modules/Rating/RatingRoutes.py @@ -0,0 +1,87 @@ +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('/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): + """新建评级""" + + 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": "新建评级成功"} + except AssertionError as e: + return {"info": e.__str__()}, 200 + except AttrCheckError as e: + return {"info": e.__str__()}, 202 + + +@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): + """确认提交""" + + +@rating_route.route('/delete', methods=['GET']) +@verify_token +def delete_route(**kwargs): + """删除评级(进行中)""" diff --git a/Modules/Rating/RatingUtils.py b/Modules/Rating/RatingUtils.py new file mode 100644 index 0000000..82afe30 --- /dev/null +++ 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" 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')