0619bb0f by 周伟奇

demo interface

1 parent d891053c
1 from django.urls import path
2 from . import views
3
4
5 urlpatterns = [
6 path(r'', views.DocView.as_view()),
7 ]
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="业务类型")
......
1 from common.named_enum import NamedEnum
2
3
4 class DocStatus(NamedEnum):
5 INIT = (0, "排队中")
6 PROCESSING = (1, '识别中')
7 PROCESS_FAILED = (2, '识别失败')
8 UPLOAD_FAILED = (3, '同步失败')
9 COMPLETE = (4, '已完成')
...@@ -3,5 +3,5 @@ from . import views ...@@ -3,5 +3,5 @@ from . import views
3 3
4 4
5 urlpatterns = [ 5 urlpatterns = [
6 path(r'', views.DocView.as_view()), 6 path(r'', views.UploadDocView.as_view()),
7 ] 7 ]
......
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 ]
......
1 def file_write(file, file_path):
2 with open(file_path, 'wb+') as f:
3 for chunk in file.chunks():
4 f.write(chunk)
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!