From 1baac150b41af679bb0c2bfee223ddeb819f9a66 Mon Sep 17 00:00:00 2001 From: 27942 Date: Thu, 15 Jan 2026 13:34:07 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=A1=88=E4=BB=B6=E6=A8=A1?= =?UTF-8?q?=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/urls.py | 3 +- business/views.py | 123 ++++++++++++++++++++++++++-------------- 案件管理模块接口文档.md | 53 +++++++++++++++-- 3 files changed, 129 insertions(+), 50 deletions(-) diff --git a/business/urls.py b/business/urls.py index 49a55e8..250c1d7 100644 --- a/business/urls.py +++ b/business/urls.py @@ -1,7 +1,7 @@ from django.urls import path from .models import Schedule -from .views import registration,registrationDetail,Project,Projectquerytype,ProjectDetail,EditProject,BidRegistration,BidDetail,registrationList,caseManagement,caseManagementDetail,CaseAttachmentUpload,Uploadinvoice,InvoiceDetail,Log,LogDetail,accumulate,preFilingLinkedCases,Application,ApplicationDetail,WarehousingRegistration,WarehousingDetail,PlatformRegistration,PlatformDetail,EditPlatformDetail,DeletePlatformDetail,bulletin,BulletinDetail,EditBulletin,deleteBulletin,Lawyersdocuments,LawyersdocumentsDetail,LwaDetail,CreateSchedule,DeleteSchedule,ScheduleDetail,handleSchedule,AddRermission,DisplayRermission,DeleteRermission,EditRermission,addRole,DeleteRole,EditRole,displayRole,modifypermissions,getRolePermissions,DeleteRegistration,EditRegistration,DeleteProject,EditBid,DeleteBid,EditCase,DeleteCase,EditApplication,DeleteApplication,EditWarehousing,DeleteWarehousing,EditLawyerFlie,EditSchedule,TransferCase +from .views import registration,registrationDetail,Project,Projectquerytype,ProjectDetail,EditProject,BidRegistration,BidDetail,registrationList,caseManagement,caseManagementDetail,CaseAttachmentUpload,CaseAttachmentUpdate,Uploadinvoice,InvoiceDetail,Log,LogDetail,accumulate,preFilingLinkedCases,Application,ApplicationDetail,WarehousingRegistration,WarehousingDetail,PlatformRegistration,PlatformDetail,EditPlatformDetail,DeletePlatformDetail,bulletin,BulletinDetail,EditBulletin,deleteBulletin,Lawyersdocuments,LawyersdocumentsDetail,LwaDetail,CreateSchedule,DeleteSchedule,ScheduleDetail,handleSchedule,AddRermission,DisplayRermission,DeleteRermission,EditRermission,addRole,DeleteRole,EditRole,displayRole,modifypermissions,getRolePermissions,DeleteRegistration,EditRegistration,DeleteProject,EditBid,DeleteBid,EditCase,DeleteCase,EditApplication,DeleteApplication,EditWarehousing,DeleteWarehousing,EditLawyerFlie,EditSchedule,TransferCase urlpatterns = [ path('register',registration.as_view(),name='register'), @@ -20,6 +20,7 @@ urlpatterns = [ path('registrationlist',registrationList.as_view(),name='registrationlist'), path('casemanagement',caseManagement.as_view(),name='casemanagement'), path('case-attachment-upload',CaseAttachmentUpload.as_view(),name='case-attachment-upload'), + path('case-attachment-update',CaseAttachmentUpdate.as_view(),name='case-attachment-update'), path('casemanagementdetail',caseManagementDetail.as_view(),name='casemanagementdetail'), path('editCase',EditCase.as_view(),name='editCase'), path('deleteCase',DeleteCase.as_view(),name='deleteCase'), diff --git a/business/views.py b/business/views.py index 9384a24..d95fff2 100644 --- a/business/views.py +++ b/business/views.py @@ -72,21 +72,6 @@ def build_case_approval_content(project_registration, times, change_request=Fals return ",".join(content_parts) -def _parse_attachment_urls(raw_value): - if not raw_value: - return [] - if isinstance(raw_value, list): - return [str(item).strip() for item in raw_value if str(item).strip()] - if isinstance(raw_value, str): - try: - parsed = json.loads(raw_value) - if isinstance(parsed, list): - return [str(item).strip() for item in parsed if str(item).strip()] - except (json.JSONDecodeError, TypeError): - pass - return [item.strip() for item in raw_value.split(',') if item.strip()] - return [] - class registration(APIView): def post(self, request, *args, **kwargs): """ @@ -998,9 +983,9 @@ class caseManagement(APIView): """ project_id = request.data.get('project_id') # 立项登记ID times = request.data.get('times') - AgencyContract_urls = request.data.get('AgencyContractUrls') or request.data.get('agency_contract_urls') - Contractreturn_urls = request.data.get('ContractreturnUrls') or request.data.get('contractreturn_urls') - Closingapplication_urls = request.data.get('ClosingapplicationUrls') or request.data.get('closingapplication_urls') + AgencyContract = request.FILES.getlist('AgencyContract') + Contractreturn = request.FILES.getlist('Contractreturn') + Closingapplication = request.FILES.getlist('Closingapplication') ChangeRequest = request.data.get('ChangeRequest') invoice_status = request.data.get('invoice_status') # 已开票 paymentcollection = request.data.get('paymentcollection') @@ -1022,10 +1007,10 @@ class caseManagement(APIView): # 再次检查是否已经存在案件(在锁内检查,防止并发重复创建) case = Case.objects.filter(project_id=project_id, is_deleted=False).first() if not case: - # 处理材料:直接使用传入URL列表(可选) - agency_contract_list = _parse_attachment_urls(AgencyContract_urls) - contract_return_list = _parse_attachment_urls(Contractreturn_urls) - closing_application_list = _parse_attachment_urls(Closingapplication_urls) + # 处理材料:上传后存储URL列表 + agency_contract_list = flies(AgencyContract) + contract_return_list = flies(Contractreturn) + closing_application_list = flies(Closingapplication) project_contract_no = project_registration.ContractNo if project_registration else None project_type = project_registration.type if project_registration else None @@ -1094,19 +1079,16 @@ class caseManagement(APIView): case.times = times update_fields_list.append('times') - agency_contract_list = _parse_attachment_urls(AgencyContract_urls) - if agency_contract_list: - case.AgencyContract = json.dumps(agency_contract_list, ensure_ascii=False) + if AgencyContract: + case.AgencyContract = json.dumps(flies(AgencyContract), ensure_ascii=False) update_fields_list.append('AgencyContract') - contract_return_list = _parse_attachment_urls(Contractreturn_urls) - if contract_return_list: - case.Contractreturn = json.dumps(contract_return_list, ensure_ascii=False) + if Contractreturn: + case.Contractreturn = json.dumps(flies(Contractreturn), ensure_ascii=False) update_fields_list.append('Contractreturn') - closing_application_list = _parse_attachment_urls(Closingapplication_urls) - if closing_application_list: - case.Closingapplication = json.dumps(closing_application_list, ensure_ascii=False) + if Closingapplication: + case.Closingapplication = json.dumps(flies(Closingapplication), ensure_ascii=False) update_fields_list.append('Closingapplication') if ChangeRequest: @@ -1177,6 +1159,64 @@ class CaseAttachmentUpload(APIView): }, status=status.HTTP_200_OK) +class CaseAttachmentUpdate(APIView): + def post(self, request, *args, **kwargs): + """ + 案件材料更新(代理合同/合同返还/结案申请) + 通过 type 指定更新哪一种材料 + """ + case_id = request.data.get('case_id') + upload_type = request.data.get('type') + files = request.FILES.getlist('file') or request.FILES.getlist('files') + + if not case_id: + return Response({'status': 'error', 'message': '缺少参数case_id', 'code': 1}, + status=status.HTTP_400_BAD_REQUEST) + + allowed_types = ["AgencyContract", "Contractreturn", "Closingapplication"] + if upload_type not in allowed_types: + return Response({ + 'status': 'error', + 'message': f'type参数错误,支持类型:{", ".join(allowed_types)}', + 'code': 1 + }, status=status.HTTP_400_BAD_REQUEST) + + if not files: + return Response({'status': 'error', 'message': '请上传文件', 'code': 1}, + status=status.HTTP_400_BAD_REQUEST) + + try: + case = Case.objects.get(id=case_id, is_deleted=False) + except Case.DoesNotExist: + return Response({'status': 'error', 'message': '案件不存在', 'code': 1}, + status=status.HTTP_404_NOT_FOUND) + + file_urls = flies(files) + update_fields = [] + + if upload_type == "AgencyContract": + case.AgencyContract = json.dumps(file_urls, ensure_ascii=False) + update_fields = ['AgencyContract'] + elif upload_type == "Contractreturn": + case.Contractreturn = json.dumps(file_urls, ensure_ascii=False) + update_fields = ['Contractreturn'] + elif upload_type == "Closingapplication": + case.Closingapplication = json.dumps(file_urls, ensure_ascii=False) + update_fields = ['Closingapplication'] + + case.save(update_fields=update_fields) + + return Response({ + 'message': '更新成功', + 'code': 0, + 'data': { + 'case_id': case.id, + 'type': upload_type, + 'files': file_urls + } + }, status=status.HTTP_200_OK) + + class caseManagementDetail(APIView): def post(self, request, *args, **kwargs): """ @@ -1270,9 +1310,9 @@ class EditCase(APIView): """ id = request.data.get('id') times = request.data.get('times') - AgencyContract_urls = request.data.get('AgencyContractUrls') or request.data.get('agency_contract_urls') - Contractreturn_urls = request.data.get('ContractreturnUrls') or request.data.get('contractreturn_urls') - Closingapplication_urls = request.data.get('ClosingapplicationUrls') or request.data.get('closingapplication_urls') + AgencyContract = request.FILES.getlist('AgencyContract') + Contractreturn = request.FILES.getlist('Contractreturn') + Closingapplication = request.FILES.getlist('Closingapplication') ChangeRequest = request.data.get('ChangeRequest') invoice_status = request.data.get('invoice_status') # 已开票 paymentcollection = request.data.get('paymentcollection') @@ -1307,19 +1347,16 @@ class EditCase(APIView): case.times = times update_fields_list.append('times') - agency_contract_list = _parse_attachment_urls(AgencyContract_urls) - if agency_contract_list: - case.AgencyContract = json.dumps(agency_contract_list, ensure_ascii=False) + if AgencyContract: + case.AgencyContract = json.dumps(flies(AgencyContract), ensure_ascii=False) update_fields_list.append('AgencyContract') - contract_return_list = _parse_attachment_urls(Contractreturn_urls) - if contract_return_list: - case.Contractreturn = json.dumps(contract_return_list, ensure_ascii=False) + if Contractreturn: + case.Contractreturn = json.dumps(flies(Contractreturn), ensure_ascii=False) update_fields_list.append('Contractreturn') - closing_application_list = _parse_attachment_urls(Closingapplication_urls) - if closing_application_list: - case.Closingapplication = json.dumps(closing_application_list, ensure_ascii=False) + if Closingapplication: + case.Closingapplication = json.dumps(flies(Closingapplication), ensure_ascii=False) update_fields_list.append('Closingapplication') if ChangeRequest: diff --git a/案件管理模块接口文档.md b/案件管理模块接口文档.md index e6eb9e4..23b5577 100644 --- a/案件管理模块接口文档.md +++ b/案件管理模块接口文档.md @@ -21,7 +21,7 @@ **请求头:** ``` -Content-Type: application/json +Content-Type: multipart/form-data token: {用户token} ``` @@ -786,9 +786,9 @@ token: {用户token} |--------|------|------|------| | project_id | Integer | 是 | 立项登记ID | | times | String | 否 | 立案时间(格式:YYYY-MM-DD) | -| AgencyContractUrls / agency_contract_urls | String/Array | 否 | 代理合同URL列表(JSON数组字符串/逗号分隔/数组) | -| ContractreturnUrls / contractreturn_urls | String/Array | 否 | 合同返还URL列表(JSON数组字符串/逗号分隔/数组) | -| ClosingapplicationUrls / closingapplication_urls | String/Array | 否 | 结案申请URL列表(JSON数组字符串/逗号分隔/数组) | +| AgencyContract | File[] | 否 | 代理合同文件 | +| Contractreturn | File[] | 否 | 合同返还文件 | +| Closingapplication | File[] | 否 | 结案申请文件 | | ChangeRequest | String | 否 | 变更申请(如果传入会触发审核流程) | | invoice_status | String | 否 | 已开票状态(默认:未开票) | | paymentcollection | String | 否 | 已收款金额 | @@ -800,8 +800,6 @@ token: {用户token} { "project_id": 1, "times": "2024-01-15", - "AgencyContractUrls": ["http://example.com/agency.pdf"], - "ContractreturnUrls": "http://example.com/return.pdf", "ChangeRequest": "需要变更代理方案", "invoice_status": "已开票", "paymentcollection": "50000" @@ -886,6 +884,49 @@ token: {用户token} --- +### 2.1.2 案件材料更新 + +**接口地址:** `POST /business/case-attachment-update` + +**接口描述:** 更新案件材料(代理合同/合同返还/结案申请),通过 `type` 指定更新哪个类型;只更新指定类型字段。 + +**请求头:** +``` +Content-Type: multipart/form-data +token: {用户token} +``` + +**请求参数:** + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| case_id | Integer | 是 | 案件ID | +| type | String | 是 | 材料类型:AgencyContract / Contractreturn / Closingapplication | +| file / files | File[] | 是 | 上传文件(支持多文件) | + +**请求示例:** +```json +{ + "case_id": 1, + "type": "Contractreturn" +} +``` + +**响应示例:** +```json +{ + "message": "更新成功", + "code": 0, + "data": { + "case_id": 1, + "type": "Contractreturn", + "files": ["http://example.com/return.pdf"] + } +} +``` + +--- + ### 2.2 案件列表查询 **接口地址:** `POST /business/casemanagementdetail`