demo interface
Showing
8 changed files
with
128 additions
and
10 deletions
src/apps/doc/internal_urls.py
0 → 100644
src/apps/doc/mixins.py
0 → 100644
| 1 | import os | ||
| 2 | from settings import conf | ||
| 3 | |||
| 4 | |||
| 5 | class DocHandler: | ||
| 6 | |||
| 7 | @staticmethod | ||
| 8 | def get_link(doc_id, file='pdf'): | ||
| 9 | data_path = os.path.join(conf.DATA_DIR, doc_id) | ||
| 10 | if file == 'pdf': | ||
| 11 | return os.path.join(data_path, '{0}.pdf'.format(doc_id)) | ||
| 12 | elif file == 'img': | ||
| 13 | return os.path.join(data_path, '{0}_img.zip'.format(doc_id)) | ||
| 14 | else: | ||
| 15 | return os.path.join(data_path, '{0}.xlsx'.format(doc_id)) | ||
| 16 | |||
| 17 | def get_doc_list(self, doc_queryset): | ||
| 18 | for doc_dict in doc_queryset: | ||
| 19 | doc_id = doc_dict.get('id') | ||
| 20 | doc_dict['pdf_link'] = self.get_link(doc_id) | ||
| 21 | doc_dict['img_link'] = self.get_link(doc_id, 'img') | ||
| 22 | doc_dict['excel_link'] = self.get_link(doc_id, 'excel') | ||
| 23 | return list(doc_queryset) | ||
| 24 |
| 1 | from django.db import models | 1 | from django.db import models |
| 2 | from .named_enum import DocStatus | ||
| 2 | 3 | ||
| 3 | # Create your models here. | 4 | # Create your models here. |
| 4 | 5 | ||
| 5 | 6 | ||
| 6 | # 上传文件记录表/任务表 | 7 | # 上传文件记录表/任务表 |
| 7 | class UploadDocRecords(models.Model): # TODO add status | 8 | class UploadDocRecords(models.Model): # TODO records一张表、文件(任务)根据business_type分库存储 |
| 8 | id = models.AutoField(primary_key=True, verbose_name="id") | 9 | id = models.AutoField(primary_key=True, verbose_name="id") |
| 9 | metadata_version_id = models.CharField(max_length=64, verbose_name="元数据版本id") | 10 | metadata_version_id = models.CharField(max_length=64, verbose_name="元数据版本id") |
| 10 | application_id = models.CharField(max_length=64, verbose_name="申请id") | 11 | application_id = models.CharField(max_length=64, verbose_name="申请id") |
| ... | @@ -12,6 +13,7 @@ class UploadDocRecords(models.Model): # TODO add status | ... | @@ -12,6 +13,7 @@ class UploadDocRecords(models.Model): # TODO add status |
| 12 | co_applicant = models.CharField(max_length=16, verbose_name="共同申请人") | 13 | co_applicant = models.CharField(max_length=16, verbose_name="共同申请人") |
| 13 | guarantor_1 = models.CharField(max_length=16, verbose_name="担保人1") | 14 | guarantor_1 = models.CharField(max_length=16, verbose_name="担保人1") |
| 14 | guarantor_2 = models.CharField(max_length=16, verbose_name="担保人2") | 15 | guarantor_2 = models.CharField(max_length=16, verbose_name="担保人2") |
| 16 | status = models.SmallIntegerField(default=DocStatus.INIT.value, verbose_name="文件状态") | ||
| 15 | document_name = models.CharField(max_length=255, verbose_name="文件名") | 17 | document_name = models.CharField(max_length=255, verbose_name="文件名") |
| 16 | document_scheme = models.CharField(max_length=64, verbose_name="文件方案") | 18 | document_scheme = models.CharField(max_length=64, verbose_name="文件方案") |
| 17 | business_type = models.CharField(max_length=64, verbose_name="业务类型") | 19 | business_type = models.CharField(max_length=64, verbose_name="业务类型") | ... | ... |
src/apps/doc/named_enum.py
0 → 100644
| 1 | from django.shortcuts import render | 1 | import os |
| 2 | import time | ||
| 3 | import random | ||
| 4 | from django.utils import timezone | ||
| 2 | from django.db.utils import IntegrityError | 5 | from django.db.utils import IntegrityError |
| 6 | from django.db.models import Q | ||
| 3 | from webargs import fields, validate | 7 | from webargs import fields, validate |
| 4 | from webargs.djangoparser import use_args, parser | 8 | from webargs.djangoparser import use_args, parser |
| 5 | from common.mixins import GenericView | 9 | from settings import conf |
| 6 | from common import response | 10 | from common import response |
| 7 | from .models import UploadDocRecords | 11 | from common.mixins import GenericView |
| 12 | from common.tools.file_tools import file_write | ||
| 8 | from common.redis_cache import redis_handler as rh | 13 | from common.redis_cache import redis_handler as rh |
| 14 | from .models import UploadDocRecords, DocStatus | ||
| 15 | from .mixins import DocHandler | ||
| 9 | 16 | ||
| 10 | # Create your views here. | 17 | # Create your views here. |
| 11 | 18 | ||
| ... | @@ -41,18 +48,32 @@ doc_upload_args = { | ... | @@ -41,18 +48,32 @@ doc_upload_args = { |
| 41 | 'document': fields.Nested(document_args, required=True), | 48 | 'document': fields.Nested(document_args, required=True), |
| 42 | } | 49 | } |
| 43 | 50 | ||
| 51 | doc_list_args = { | ||
| 52 | 'status': fields.Int(required=False, | ||
| 53 | validate=validate.OneOf(DocStatus.get_value_lst())), | ||
| 54 | 'application_id': fields.Str(required=False, validate=validate.Length(max=64)), | ||
| 55 | 'data_source': fields.Str(required=False, validate=validate.Length(max=64)), | ||
| 56 | 'business_type': fields.Str(required=False, validate=validate.Length(max=64)), | ||
| 57 | 'upload_finish_time': fields.Date(required=False), | ||
| 58 | 'create_time': fields.Date(required=False), | ||
| 59 | } | ||
| 60 | |||
| 61 | upload_pdf_args = { | ||
| 62 | 'pdf_file': fields.Raw(required=True), | ||
| 63 | } | ||
| 64 | |||
| 44 | 65 | ||
| 45 | class DocView(GenericView): | 66 | class UploadDocView(GenericView): |
| 46 | permission_classes = [] | 67 | permission_classes = [] |
| 47 | 68 | ||
| 48 | # 创建模型 | 69 | # 上传(接收)文件接口 |
| 49 | @use_args(doc_upload_args, location='data') | 70 | @use_args(doc_upload_args, location='data') |
| 50 | def post(self, request, args): | 71 | def post(self, request, args): |
| 51 | application_data = args.get('applicationData') | 72 | application_data = args.get('applicationData') |
| 52 | applicant_data = args.get('applicantData') | 73 | applicant_data = args.get('applicantData') |
| 53 | document = args.get('document') | 74 | document = args.get('document') |
| 54 | try: | 75 | try: |
| 55 | task = UploadDocRecords.objects.create( | 76 | doc = UploadDocRecords.objects.create( |
| 56 | metadata_version_id=document.get('metadataVersionId'), | 77 | metadata_version_id=document.get('metadataVersionId'), |
| 57 | application_id=application_data.get('applicationId'), | 78 | application_id=application_data.get('applicationId'), |
| 58 | main_applicant=applicant_data.get('mainApplicantName'), | 79 | main_applicant=applicant_data.get('mainApplicantName'), |
| ... | @@ -70,7 +91,7 @@ class DocView(GenericView): | ... | @@ -70,7 +91,7 @@ class DocView(GenericView): |
| 70 | self.invalid_params(msg='metadataVersionId repeat') | 91 | self.invalid_params(msg='metadataVersionId repeat') |
| 71 | else: | 92 | else: |
| 72 | # TODO 查询加入优先队列 or 普通队列 | 93 | # TODO 查询加入优先队列 or 普通队列 |
| 73 | rh.enqueue(task.id) | 94 | rh.enqueue(doc.id) |
| 74 | self.running_log.info('[doc upload success] [args={0}]'.format(args)) | 95 | self.running_log.info('[doc upload success] [args={0}]'.format(args)) |
| 75 | return response.ok() | 96 | return response.ok() |
| 76 | 97 | ||
| ... | @@ -92,3 +113,53 @@ class DocView(GenericView): | ... | @@ -92,3 +113,53 @@ class DocView(GenericView): |
| 92 | schema: | 113 | schema: |
| 93 | $ref: '#/definitions/ApiResponse' | 114 | $ref: '#/definitions/ApiResponse' |
| 94 | ''' | 115 | ''' |
| 116 | |||
| 117 | |||
| 118 | class DocView(GenericView, DocHandler): | ||
| 119 | |||
| 120 | # 文件列表页 | ||
| 121 | @use_args(doc_list_args, location='querystring') | ||
| 122 | def get(self, request, args): | ||
| 123 | status = args.get('status') | ||
| 124 | application_id = args.get('application_id') | ||
| 125 | data_source = args.get('data_source') | ||
| 126 | business_type = args.get('business_type') | ||
| 127 | upload_finish_time = args.get('upload_finish_time') | ||
| 128 | create_time = args.get('create_time') | ||
| 129 | status_query = Q(status=status) if status else Q() | ||
| 130 | application_id_query = Q(application_id=application_id) if application_id else Q() | ||
| 131 | data_source_query = Q(data_source=data_source) if data_source else Q() | ||
| 132 | business_type_query = Q(business_type=business_type) if business_type else Q() | ||
| 133 | upload_finish_time_query = Q(upload_finish_time=upload_finish_time) if upload_finish_time else Q() | ||
| 134 | create_time_query = Q(create_time=create_time) if create_time else Q() | ||
| 135 | query = status_query & application_id_query & data_source_query & business_type_query\ | ||
| 136 | & upload_finish_time_query & create_time_query | ||
| 137 | doc_queryset = UploadDocRecords.objects.filter(query).values( | ||
| 138 | 'id', 'application_id', 'upload_finish_time', 'create_time', 'business_type', 'data_source') | ||
| 139 | doc_list = self.get_doc_list(doc_queryset) | ||
| 140 | return response.ok(data=doc_list) | ||
| 141 | |||
| 142 | # 上传pdf,模拟下单 | ||
| 143 | @use_args(upload_pdf_args, location='files') | ||
| 144 | def post(self, request, args): | ||
| 145 | const_str = '手工单' | ||
| 146 | doc = UploadDocRecords.objects.create( | ||
| 147 | metadata_version_id=str(int(time.time())), | ||
| 148 | application_id=const_str, | ||
| 149 | main_applicant=const_str, | ||
| 150 | co_applicant=const_str, | ||
| 151 | guarantor_1=const_str, | ||
| 152 | guarantor_2=const_str, | ||
| 153 | document_name=const_str, | ||
| 154 | document_scheme=random.choice(['Acceptance', 'Settlement', 'Contract Management']), | ||
| 155 | business_type=random.choice(['AFC', 'HIL']), | ||
| 156 | data_source=random.choice(['POS', 'EAPP', 'Econtract']), | ||
| 157 | upload_finish_time=timezone.now(), | ||
| 158 | ) | ||
| 159 | rh.enqueue(doc.id) | ||
| 160 | |||
| 161 | pdf_file = args.get('pdf_file') | ||
| 162 | file_save_path = os.path.join(conf.DATA_DIR, doc.id, '{0}.pdf'.format(doc.id)) | ||
| 163 | file_write(pdf_file, file_save_path) | ||
| 164 | self.running_log.info('[doc upload success] [args={0}]'.format(args)) | ||
| 165 | return response.ok() | ... | ... |
| ... | @@ -18,6 +18,7 @@ from django.urls import path, include | ... | @@ -18,6 +18,7 @@ from django.urls import path, include |
| 18 | 18 | ||
| 19 | urlpatterns = [ | 19 | urlpatterns = [ |
| 20 | path('admin/', admin.site.urls), | 20 | path('admin/', admin.site.urls), |
| 21 | path(r'api/users/', include('apps.account.urls')), | 21 | path(r'api/user', include('apps.account.urls')), |
| 22 | path(r'api/create/v1', include('apps.doc.urls')), | 22 | path(r'api/create/v1', include('apps.doc.urls')), |
| 23 | path(r'api/doc', include('apps.doc.internal_urls')), | ||
| 23 | ] | 24 | ] | ... | ... |
src/common/tools/file_tools.py
0 → 100644
-
Please register or sign in to post a comment