Pārlūkot izejas kodu

数据管理,模版模块

zhangnaiwen 2 gadi atpakaļ
vecāks
revīzija
a8d0ac9d42
4 mainītis faili ar 234 papildinājumiem un 51 dzēšanām
  1. 209 47
      src/app/api/data.py
  2. 2 2
      src/app/api/organization.py
  3. 2 2
      src/app/configs/config.py
  4. 21 0
      src/app/modle/template.py

+ 209 - 47
src/app/api/data.py

@@ -1,79 +1,241 @@
-from flask import request, jsonify
-from flask_restx import Resource, Namespace, reqparse
+import json
+import os
 
-from app.defines import StatesCode
+from flask import request, jsonify, g
+from flask_restx import Resource, Namespace, reqparse
+from sqlalchemy import select, insert, update, delete
+from sqlalchemy.orm import Session
+from werkzeug.datastructures import FileStorage
+
+from app.configs.config import TEMPLATE_FILE_PATH, TEMPLATE_FILE_URL
+from app.database import engine
+from app.defines import StatesCode, Module, OperationType
+from app.modle.template import Template
+from app.utils.jwt_util import login_required
+from app.utils.save_log import save_log
+from app.utils.util import to_dict, cn_now
 
 ns = Namespace('data', description='数据管理接口')
 
+template_list = reqparse.RequestParser(bundle_errors=True)
+template_list.add_argument(name='page_size', type=int, location='args', required=False, help='每页记录数量,默认:20')
+template_list.add_argument(name='page', type=int, location='args', required=False, help='第几页')
+template_list.add_argument(name='template_name', type=str, location='args', required=False, help='模版名称')
+template_list.add_argument(name='template_format', type=str, location='args', required=False, help='模版格式')
+template_list.add_argument(name='template_type', type=str, location='args', required=False,
+                           help='模版类型 0:报表,1:报告')
+template_list.add_argument(name='report_type', type=str, location='args', required=False, help='报告类型')
+
 
-@ns.route('/statement_list')
-class StatementConfigListApi(Resource):
+@ns.route('/template_list')
+class TemplateConfigListApi(Resource):
+    method_decorators = [login_required]
+
+    @ns.doc(id='template_list', description='模版列表')
+    @ns.expect(template_list)
     def get(self):
-        """获取报表模版列表"""
-        return jsonify(code=StatesCode.SUCCESS, message='获取成功', data='')
+        """获取模版列表"""
+        page_size = int(request.args.get('page_size', 20))
+        page = int(request.args.get('page', 1))
+        template_name = request.args.get('template_name')
+        template_format = request.args.get('template_format')
+        report_type = request.args.get('report_type')
+        template_type = request.args.get('template_type')
 
+        with Session(engine) as session:
+            stmt = select(Template).where(Template.template_type == template_type)
 
-@ns.route('/statement')
-class StatementConfigApi(Resource):
+            if template_name:
+                stmt.where(Template.name == template_name)
 
-    def get(self):
-        """获取报表模版"""
-        return jsonify(code=StatesCode.SUCCESS, message='获取成功', data='')
+            if template_format:
+                stmt.where(Template.format == template_format)
 
-    def post(self):
-        """添加报表模版"""
-        return jsonify(code=StatesCode.SUCCESS, message='添加成功', data='')
+            if report_type:
+                stmt.where(Template.report_type == report_type)
 
-    def put(self):
-        """删除报表模版"""
-        return jsonify(code=StatesCode.SUCCESS, message='修改成功', data='')
+            stmt.offset(page_size * (page - 1)).limit(page_size)
 
-    def delete(self):
-        """删除报表模版"""
+            results = session.execute(stmt).scalars().all()
 
-        return jsonify(code=StatesCode.SUCCESS, message='删除成功', data='')
+        save_log(request, Module.DATA, OperationType.INQUIRE, StatesCode.SUCCESS)
 
+        return jsonify(code=StatesCode.SUCCESS, message='成功', data=to_dict(results))
 
-@ns.route('/batch_modify_statement')
-class BatchStatementConfig(Resource):
-    def delete(self):
-        """批量删除报表模版"""
-        return jsonify(code=StatesCode.SUCCESS, message='获取成功', data='')
 
+template = reqparse.RequestParser(bundle_errors=True)
+template.add_argument(name='template_id', type=int, location='args', required=False, help='模版id')
 
-@ns.route('/report_list')
-class StatementConfigListApi(Resource):
-    def get(self):
-        """获取报告模版列表"""
-        return jsonify(code=StatesCode.SUCCESS, message='获取成功', data='')
+template_details = reqparse.RequestParser(bundle_errors=True)
+template_details.add_argument(name='template_id', type=int, location='form', required=False, help='模版id')
+template_details.add_argument(name='template_name', type=str, location='form', required=False, help='模版名称')
+template_details.add_argument(name='template_format', type=str, location='form', required=False, help='模版格式')
+template_details.add_argument(name='report_type', type=str, location='form', required=False, help='报告类型')
+template_details.add_argument(name='introduction', type=str, location='form', required=False, help='模版简介')
+template_details.add_argument(name='template_file', type=FileStorage, location='files', required=False, help='模版文件')
+template_details.add_argument(name='template_type', type=int, location='files', required=False,
+                              help='模版类型 0:报表,1:报告')
 
 
-@ns.route('/report')
-class ReportConfigApi(Resource):
+@ns.route('/template')
+class TemplateConfigApi(Resource):
+    # method_decorators = [login_required]
 
+    @ns.doc(id='get_template', description='获取模版详情')
+    @ns.expect(template)
     def get(self):
-        """获取模版"""
-        return jsonify(code=StatesCode.SUCCESS, message='获取成功', data='')
+        """获取模版详情"""
+        template_id = request.args.get('template_id')
 
-    def post(self):
-        """添加报告模版"""
-        return jsonify(code=StatesCode.SUCCESS, message='添加成功', data='')
+        if template_id is None:
+            return jsonify(code=StatesCode.UNKNOWN_ERROR, message='模版id不能为空')
 
-    def put(self):
-        """修改报告模版"""
-        return jsonify(code=StatesCode.SUCCESS, message='修改成功', data='')
+        with Session(engine) as session:
+            stmt = select(Template).where(Template.id == template_id)
+            results = session.execute(stmt).scalars().all()
+
+        save_log(request, Module.DATA, OperationType.INQUIRE, StatesCode.SUCCESS)
 
+        return jsonify(code=StatesCode.SUCCESS, message='获取成功', data=to_dict(results))
+
+    @ns.doc(id='add_template', description='添加报表模版')
+    @ns.expect(template_details)
+    def post(self):
+        """添加模版"""
+        template_name = request.form.get('template_name')
+        template_format = request.form.get('template_format')
+        introduction = request.form.get('introduction')
+        template_file = request.files.get('template_file')
+        report_type = request.form.get('report_type')
+        template_type = request.form.get('template_type')
+
+        if template_name is None and template_type is None:
+            return jsonify(code=StatesCode.UNKNOWN_ERROR, message='报表模版名和模版类型不能为空')
+
+        # 模版存储(url),
+        if template_file:
+            template_file.save(os.path.join(TEMPLATE_FILE_PATH, template_file.filename))
+            template_url = TEMPLATE_FILE_URL + template_file.filename
+        else:
+            template_url = None
+
+        with Session(engine) as session:
+            # 判断是否存在
+            stmt = select(Template).where(Template.name == template_name)
+            result = session.execute(stmt).scalars().first()
+            if result:
+                return jsonify(code=StatesCode.UNKNOWN_ERROR, message="模版已存在")
+
+            # 添加
+            stmt = insert(Template).values(
+                name=template_name,
+                format=template_format,
+                Introduction=introduction,
+                report_type=report_type,
+                creator=g.user_name,
+                create_time=cn_now(),
+                update_time=cn_now(),
+                template_url=template_url,
+                template_type=template_type
+            )
+            session.execute(stmt)
+
+            session.commit()
+
+        save_log(request, Module.DATA, OperationType.ADD, StatesCode.SUCCESS)
+
+        return jsonify(code=StatesCode.SUCCESS, message='添加成功')
+
+    @ns.doc(id='update_templatet', description='修改模版信息')
+    @ns.expect(template_details)
+    def put(self):
+        """修改模版"""
+        template_id = request.form.get('template_id')
+        template_name = request.form.get('template_name')
+        template_format = request.form.get('template_format')
+        introduction = request.form.get('introduction')
+        template_file = request.files.get('template_file')
+        report_type = request.form.get('report_type')
+        template_type = request.form.get('template_type')
+
+        if template_id is None or template_name is None:
+            return jsonify(code=StatesCode.UNKNOWN_ERROR, message="模版id和模版名不能为空")
+
+        # 报表模版存储(url),
+        if template_file:
+            template_file.save(os.path.join(TEMPLATE_FILE_PATH, template_file.filename))
+            template_url = TEMPLATE_FILE_URL + template_file.filename
+        else:
+            template_url = None
+
+        with Session(engine) as session:
+            stmt = update(Template).where(Template.id == template_id).values(
+                name=template_name,
+                format=template_format,
+                Introduction=introduction,
+                report_type=report_type,
+                creator=g.user_name,
+                create_time=cn_now(),
+                update_time=cn_now(),
+                template_url=template_url,
+                template_type=template_type
+            )
+            session.execute(stmt)
+            session.commit()
+
+        save_log(request, Module.DATA, OperationType.UPDATE, StatesCode.SUCCESS)
+
+        return jsonify(code=StatesCode.SUCCESS, message='修改成功')
+
+    @ns.doc(id='delete_template', description='删除模版')
+    @ns.expect(template_details)
     def delete(self):
-        """删除报告模版"""
+        """删除模版"""
+        template_id = request.form.get('template_id')
 
-        return jsonify(code=StatesCode.SUCCESS, message='删除成功', data='')
+        if template_id is None:
+            return jsonify(code=StatesCode.UNKNOWN_ERROR, message="模版id不能为空")
+
+        with Session(engine) as session:
+            stmt = delete(Template).where(Template.id == template_id)
+            session.execute(stmt)
+            session.commit()
+
+        save_log(request, Module.DATA, OperationType.DELETE, StatesCode.SUCCESS)
+
+        return jsonify(code=StatesCode.SUCCESS, message='删除成功')
 
 
-@ns.route('/batch_modify_report')
-class BatchStatementConfig(Resource):
+batch_delete_template = reqparse.RequestParser(bundle_errors=True)
+batch_delete_template.add_argument(name='template_ids', type=str, required=True, location='form', help='模版id列表')
+
+
+@ns.route('/batch_delete_template')
+class BatchTemplateConfigApi(Resource):
+    # method_decorators = [login_required]
+
+    @ns.doc(id='batch_delete_template', description='批量删除模版')
+    @ns.expect(batch_delete_template)
     def delete(self):
-        """批量删除报告模版"""
-        return jsonify(code=StatesCode.SUCCESS, message='删除成功', data='')
+        """批量删除模版"""
+        template_ids = request.form.get('template_ids')
+
+        if template_ids is not None:
+            template_ids = json.loads(template_ids)
+        else:
+            return jsonify(code=StatesCode.UNKNOWN_ERROR, message='模版id不能为空')
+
+        with Session(engine) as session:
+            stmt = select(Template).where(Template.id.in_(template_ids))
+            results = session.execute(stmt).scalars().all()
+
+            for result in results:
+                session.delete(result)
+            session.commit()
+
+        save_log(request, Module.DATA, OperationType.BATCH_DELETE, StatesCode.SUCCESS)
+
+        return jsonify(code=StatesCode.SUCCESS, message='批量删除成功')
 
 
 @ns.route('/company')

+ 2 - 2
src/app/api/organization.py

@@ -121,7 +121,7 @@ class CompanyApi(Resource):
             # 添加公司
             stmt = insert(Company).values(
                 company_name=company_name,
-                logo=logo_url if logo_url else None,
+                logo=logo_url,
                 abbreviation=abbreviation,
                 code=code,
                 registered_address=registered_address,
@@ -168,7 +168,7 @@ class CompanyApi(Resource):
         with Session(engine) as session:
             stmt = update(Company).where(Company.id == company_id).values(
                 company_name=company_name,
-                logo=logo_url if logo_url else None,
+                logo=logo_url,
                 abbreviation=abbreviation,
                 code=code,
                 registered_address=registered_address,

+ 2 - 2
src/app/configs/config.py

@@ -6,8 +6,8 @@ COMPANY_LOGO_PATH = "/Users/mac/data/company_logo"
 COMPANY_LOGO_URL = 'http://127.0.0.1/company_logo/'
 
 # 报表存储地址
-STATEMENT_FILE_PATH = '/Users/mac/data/statement'
-STATEMENT_FILE_URL = 'http://127.0.0.1/statement/'
+TEMPLATE_FILE_PATH = '/Users/mac/data/template'
+TEMPLATE_FILE_URL = 'http://127.0.0.1/template/'
 # 报告存储地址
 
 

+ 21 - 0
src/app/modle/template.py

@@ -0,0 +1,21 @@
+from sqlalchemy import String, Column, Integer
+
+from app.modle import Base
+from app.utils.util import cn_now
+
+
+class Template(Base):
+    """模版表"""
+
+    __tablename__ = 'template'
+
+    id = Column(Integer, primary_key=True, autoincrement=True, nullable=False, unique=True, doc='id')
+    name = Column(String, nullable=False, unique=False, index=False, doc='模版名称')
+    format = Column(String, nullable=True, unique=False, index=False, doc='模版格式')
+    report_type = Column(String, nullable=True, unique=False, index=False, doc='报告类型')
+    Introduction = Column(String, nullable=True, unique=False, index=False, doc='模版简介')
+    creator = Column(String, nullable=True, unique=False, index=False, doc='创建者')
+    create_time = Column(String, nullable=True, unique=False, index=False, doc='创建时间')
+    update_time = Column(String, nullable=True, unique=False, index=False, doc='修改时间')
+    template_url = Column(String, nullable=True, unique=False, index=False, doc='模版存储地址')
+    template_type = Column(String, nullable=True, unique=False, index=False, doc='模版类型')