# -*- encoding: utf-8 -*- # ----------------------------------------------------------------------------- # @File Name : report_service.py # @Time : 2021/1/13 下午3:14 # @Author : X. Peng # @Email : acepengxiong@163.com # @Software : PyCharm # ----------------------------------------------------------------------------- import datetime import json import os import uuid from sqlalchemy import and_, or_ # from sqlalchemy import union_all from app.api.engine import TAMP_SQL, tamp_diagnose_app_engine, template_folder, temp_img_save_folder, pdf_save_folder from app.model.tamp_diagnose_app import HoldReport, HoldDiagnoseReport, PeriodicReport, Customer, ReportView, FundReportManange from app.utils.jinjia2html_v2 import DataIntegrate from app.celery import save_pdf from app.utils.format_transfer import npEncoder def get_report_list(args): """.""" type = args.get('type') ifa_id = args.get('ifa_id') name = args.get('name') pageNumber = args['pageNumber'] pageSize = args['pageSize'] start_time = args.get('start_time') end_time = args.get('end_time') offset = (pageNumber - 1) * pageSize res = [] totalSize = 0 conditions = () if type == 0: if start_time and end_time: conditions = [ ReportView.ifa_id == ifa_id, or_(ReportView.name.like('%' + name + '%'), ReportView.customer_name.like('%' + name + '%')), ReportView.create_time >= start_time, ReportView.create_time <= end_time ] else: conditions = [ ReportView.ifa_id == ifa_id, or_(ReportView.name.like('%' + name + '%'), ReportView.customer_name.like('%' + name + '%')) ] else: if start_time and end_time: conditions = [ ReportView.ifa_id == ifa_id, ReportView.type == type, or_(ReportView.name.like('%' + name + '%'), ReportView.customer_name.like('%' + name + '%')), ReportView.create_time >= start_time, ReportView.create_time <= end_time ] else: conditions = [ ReportView.ifa_id == ifa_id, ReportView.type == type, or_(ReportView.name.like('%' + name + '%'), ReportView.customer_name.like('%' + name + '%')) ] allow_field = ['id', 'customer_id', 'ifa_id', 'update_time', 'create_time', 'update_status', 'file', 'be_viewed', 'name', 'customer_name', 'author_name', 'type'] with TAMP_SQL(tamp_diagnose_app_engine) as tamp_diagnose_app: tamp_diagnose_session = tamp_diagnose_app.session report_res = tamp_diagnose_session.query(ReportView).filter(and_(*conditions)) totalSize = report_res.count() report_res = report_res.order_by(ReportView.create_time.desc()).offset(offset).limit(pageSize) res = [r.to_dict(allow_field=allow_field) for r in report_res] return { 'content': res, 'pageNum': pageNumber, 'pageSize': pageSize, 'totalSize': totalSize } def delete_report(args): """.""" type = args.get('type') id = args.get('id') ifa_id = args.get('ifa_id') with TAMP_SQL(tamp_diagnose_app_engine) as tamp_diagnose_app: tamp_diagnose_session = tamp_diagnose_app.session if type == 1: tamp_diagnose_session.query(HoldReport).filter(and_( HoldReport.ifa_id == ifa_id, HoldReport.id == id )).delete() elif type == 2: tamp_diagnose_session.query(HoldDiagnoseReport).filter(and_( HoldDiagnoseReport.ifa_id == ifa_id, HoldDiagnoseReport.id == id )).delete() elif type == 3: tamp_diagnose_session.query(PeriodicReport).filter(and_( PeriodicReport.ifa_id == ifa_id, PeriodicReport.id == id )).delete() def get_one_report(args): """.""" id = args.get('id') type = args.get('type') ifa_id = args.get('ifa_id') data = [] with TAMP_SQL(tamp_diagnose_app_engine) as tamp_diagnose_app: tamp_diagnose_session = tamp_diagnose_app.session res = tamp_diagnose_session.query(ReportView).filter(and_( ReportView.id == id, ReportView.type == type, ReportView.ifa_id == ifa_id, )) data = [r.to_dict() for r in res] if data: return data[0] return False def edit_report_name(args): """编辑报告""" id = args.get('id') type = args.get('type') ifa_id = args.get('ifa_id') name = args.get('name') res = [] with TAMP_SQL(tamp_diagnose_app_engine) as tamp_diagnose_app: tamp_diagnose_session = tamp_diagnose_app.session if type == 1: res = tamp_diagnose_session.query(HoldReport).filter(and_( HoldReport.id == id, HoldReport.ifa_id == ifa_id, )) elif type == 2: res = tamp_diagnose_session.query(HoldDiagnoseReport).filter(and_( HoldDiagnoseReport.id == id, HoldDiagnoseReport.ifa_id == ifa_id, )) elif type == 3: res = tamp_diagnose_session.query(PeriodicReport).filter(and_( PeriodicReport.id == id, PeriodicReport.ifa_id == ifa_id, )) else: return False r = res.update({ 'name': name, 'update_time': datetime.datetime.now() }) return True def edit_report(args): """编辑报告""" id = args.get('id') type = args.get('type') ifa_id = args.get('ifa_id') report_data = args.get('report_data') report_data_json = json.loads(args.get('report_data').replace(template_folder, temp_img_save_folder)) pdf_name = str(uuid.uuid4()) + '.pdf' res = [] with TAMP_SQL(tamp_diagnose_app_engine) as tamp_diagnose_app: tamp_diagnose_session = tamp_diagnose_app.session hold_report = tamp_diagnose_session.query(HoldReport).filter(and_( HoldReport.id == id, HoldReport.ifa_id == ifa_id, )) hold_diagnose_report = tamp_diagnose_session.query(HoldDiagnoseReport).filter(and_( HoldDiagnoseReport.id == id, HoldDiagnoseReport.ifa_id == ifa_id, )) periodic_report = tamp_diagnose_session.query(PeriodicReport).filter(and_( PeriodicReport.id == id, PeriodicReport.ifa_id == ifa_id, )) if type == 1: res = hold_report elif type == 2: res = hold_diagnose_report elif type == 3: res = periodic_report if not res: return False r = res.update({ 'report_data': report_data, 'update_status': 1, 'update_time': datetime.datetime.now() }) save_pdf.delay(id, ifa_id, res[0].customer_id, pdf_name, type, report_data_json) # try: # dt = DataIntegrate(ifa_id=ifa_id, customer_id=res[0].customer_id, pdf_name=pdf_name, type=type) # dt.render_data(data=json.loads(report_data.replace(template_folder, temp_img_save_folder))) # except: # pass # with TAMP_SQL(tamp_diagnose_app_engine) as tamp_diagnose_app: # tamp_diagnose_session = tamp_diagnose_app.session # hold_report = tamp_diagnose_session.query(HoldReport).filter(and_( # HoldReport.id == id, # HoldReport.ifa_id == ifa_id, # )) # hold_diagnose_report = tamp_diagnose_session.query(HoldDiagnoseReport).filter(and_( # HoldDiagnoseReport.id == id, # HoldDiagnoseReport.ifa_id == ifa_id, # )) # periodic_report = tamp_diagnose_session.query(PeriodicReport).filter(and_( # PeriodicReport.id == id, # PeriodicReport.ifa_id == ifa_id, # )) # if type == 1: # res = hold_report # elif type == 2: # res = hold_diagnose_report # elif type == 3: # res = periodic_report # if not res: # return False # res.update({ # 'file': pdf_name, # 'update_status': 2, # 'update_time': datetime.datetime.now() # }) return True def make_report(args): """制作报告.""" ifa_id = args.get('ifa_id') customer_id = args.get('customer_id') type = args.get('type') name = args.get('name') report_data = json.loads(args.get('report_data').replace(template_folder, temp_img_save_folder)) pdf_name = str(uuid.uuid4()) + '.pdf' args['create_time'] = datetime.datetime.now() args['update_status'] = 1 args.pop('type') record_id = 0 with TAMP_SQL(tamp_diagnose_app_engine) as tamp_diagnose_app: tamp_diagnose_session = tamp_diagnose_app.session report_record = None if type == 1: report_record = HoldReport(**args) elif type == 2: report_record = HoldDiagnoseReport(**args) elif type == 3: report_record = PeriodicReport(**args) if not report_record: return False tamp_diagnose_session.add(report_record) tamp_diagnose_session.flush() record_id = report_record.id save_pdf.delay(record_id, ifa_id, customer_id, pdf_name, type, report_data) return {'record_id': record_id} # pid = os.fork() # if pid == 0: # try: # dt = DataIntegrate(ifa_id=ifa_id, customer_id=customer_id, pdf_name=pdf_name, type=type) # dt.render_data(data=report_data) # except: # pass # with TAMP_SQL(tamp_diagnose_app_engine) as tamp_diagnose_app: # tamp_diagnose_session = tamp_diagnose_app.session # hold_report = tamp_diagnose_session.query(HoldReport).filter(and_( # HoldReport.id == record_id, # HoldReport.ifa_id == ifa_id, # )) # hold_diagnose_report = tamp_diagnose_session.query(HoldDiagnoseReport).filter(and_( # HoldDiagnoseReport.id == record_id, # HoldDiagnoseReport.ifa_id == ifa_id, # )) # periodic_report = tamp_diagnose_session.query(PeriodicReport).filter(and_( # PeriodicReport.id == record_id, # PeriodicReport.ifa_id == ifa_id, # )) # if type == 1: # res = hold_report # elif type == 2: # res = hold_diagnose_report # elif type == 3: # res = periodic_report # if not res: # return False # res.update({ # 'file': pdf_name, # 'update_status': 2, # 'update_time': datetime.datetime.now() # }) # else: # return {'record_id': record_id} def make_app_report(args): """制作报告.""" ifa_id = args.get('ifa_id') customer_id = args.get('customer_id') type = 1 pdf_name = str(uuid.uuid4()) + '.pdf' args['file'] = pdf_name args['create_time'] = datetime.datetime.now() args['update_status'] = 2 custom_time = args['custom_time'] data = {} record_id = 0 report_data = '' default_template = '' with TAMP_SQL(tamp_diagnose_app_engine) as tamp_diagnose_app: tamp_diagnose_session = tamp_diagnose_app.session # 查找当前时间是否有生成的pdf hr = tamp_diagnose_session.query(HoldReport).filter(HoldReport.custom_time == custom_time, HoldReport.ifa_id == ifa_id, HoldReport.customer_id == customer_id).first() if hr: return hr.id customer_name = '' type_name = '持仓报告' create_date = str(datetime.datetime.now().date()) sql = "select customer_name from customer_view where id = '{}'".format(customer_id) res = tamp_diagnose_session.execute(sql) res = res.fetchone() if res: customer_name = res[0] args['name'] = customer_name + type_name + create_date template = tamp_diagnose_session.query(FundReportManange).filter(and_( FundReportManange.ifa_id == ifa_id, FundReportManange.type == 1, FundReportManange.default == 1 )).first() default_template = "" if template and template.default_template: default_template = json.loads(template.default_template) elif template: default_template = json.loads(template.custom_template) # save_pdf.delay(record_id, ifa_id, customer_id, pdf_name, type) try: dt = DataIntegrate(ifa_id=ifa_id, customer_id=customer_id, pdf_name=pdf_name, type=type, end_date = custom_time) report_data = dt.get_template_data(default_template=default_template) report_data = json.dumps(report_data, cls=npEncoder, ensure_ascii=False) args['report_data'] = report_data dt.render_data(data=json.loads(report_data.replace(template_folder, temp_img_save_folder))) except OSError: pass except Exception as e: return False if os.path.exists(pdf_save_folder + pdf_name): with TAMP_SQL(tamp_diagnose_app_engine) as tamp_diagnose_app: tamp_diagnose_session = tamp_diagnose_app.session args['update_time'] = datetime.datetime.now() report_record = HoldReport(**args) tamp_diagnose_session.add(report_record) tamp_diagnose_session.flush() return report_record.id return False