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