**簡要描述:**
- 企業信息統計接口
**請求URL:**
- ` http://127.0.0.1/ztx_data/v1/ep_info `
**請求方式:**
- GET
**參數:**
|參數名|必選|類型|說明|
|:---- |:---|:----- |----- |
|username |是 |string |用戶名 |
|password |是 |string | 密碼 |
**返回示例**
``` json
// 成功響應
// 分頁數據
{
"code": 200,
"msg": "success",
"errors": {},
"data": {
"count": 28,
"next": "http://127.0.0.1:8000/process_drf/?page=2&size=5",
"previous": null,
"results": [
{
"id": 13,
"code": "process_13",
"name": "企業門戶",
"remark": "",
"sign": "0",
"rto": null,
"rpo": null,
"state": "9",
"sort": 4,
"url": "/falconstor",
"type": "falconstor",
"color": "#e7505a"
},
{
"id": 14,
"code": "2",
"name": "mkl",
"remark": "hehehehe",
"sign": "0",
"rto": 1,
"rpo": 2,
"state": "9",
"sort": 5,
"url": "/falconstor",
"type": "falconstor",
"color": "#32c5d2"
},
]
}
}
// 單條記錄
{
"code": 200,
"msg": "success",
"errors": {},
"data": {
"id": 15,
"code": "asd",
"name": "sadad",
"remark": "hahaha",
"sign": "0",
"rto": 2,
"rpo": 3,
"state": "1",
"sort": 6,
"url": "/falconstor",
"type": "falconstor",
"color": "#8e44ad"
}
}
// POST
{
"code": 201,
"msg": "success",
"errors": {},
"data": {
"id": 42,
"code": "s",
"name": "a",
"remark": null,
"sign": null,
"rto": null,
"rpo": null,
"state": null,
"sort": null,
"url": "",
"type": null,
"color": ""
}
}
// PUT
{
"code": 200,
"msg": "success",
"errors": {},
"data": {
"id": 15,
"code": "asd",
"name": "mkl",
"remark": "hahaha",
"sign": "0",
"rto": 2,
"rpo": 3,
"state": "1",
"sort": 6,
"url": "/falconstor",
"type": "falconstor",
"color": "#8e44ad"
}
}
// DELETE
{
"code": 200,
"msg": "success",
"errors": {},
"data": {}
}
```
**返回參數說明**
|參數名|類型|說明|
|:----- |:-----|----- |
|groupid |int |用戶組id,1:超級管理員;2:普通用戶 |
**備注**
- 返回企業信息
| 錯誤碼 | 錯誤解釋 |
| ------------ | ------------ |
| 401 | 用戶認證失敗 |
| 403 | 權限校驗失敗 |
| 422 | 入參錯誤 |
- 返回示例
> POST請求
```json
{
"code": 422,
"msg": "入參錯誤",
"errors": {
"code": "This field may not be blank.",
"name": "This field may not be blank."
},
"data": {}
}
```
> GET請求
```json
{
"code": 422,
"msg": "error",
"errors": {
"param": "Process matching query does not exist."
},
"data": {}
}
項目示例:
# @file :views.py # @description :企業信息應用視圖 # @date :2021/07/01 18:02:52 # @author :miaokela # @version :1.0 from rest_framework.generics import GenericAPIView from django.http import Http404 from company import extra_models from ZTXDMS.utils.response import APIResponse from ZTXDMS.utils.pagination import RestPagination from company.serializers import ( CompanyListSerializer, CompanyDetailSerializer, AgencyListSerializer, AgencyDetailSerializer, ) from company.conf import sqls class CompanyAPIView(GenericAPIView): queryset = extra_models.QccQccCrawler.objects.using('company').exclude(is_delete='1').order_by('-update_time') serializer_class = CompanyListSerializer pagination_class = RestPagination def get(self, request): queryset = self.get_queryset() if request.query_params: company_name = request.query_params.get('company_name', '').strip() queryset = queryset.filter(company_name__contains=company_name) # TODO 數據庫沒有的數據從企查查站點采集 page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) ser = self.get_serializer(page, many=True) return APIResponse(code=200, data=ser.data) class CompanyDetailAPIView(GenericAPIView): queryset = extra_models.QccQccCrawler.objects.using('company').exclude(is_delete='1').order_by('-update_time') lookup_field = 'id' def delete(self, request, id): try: qcc = self.get_object() qcc.is_delete = '1' qcc.save() except Exception as e: print('error:{0}'.format(e)) return APIResponse(code=404, msg='failed', errors={'id': ['記錄不存在,刪除失敗。']}) return APIResponse(code=200) def get(self, request, id): try: ser = CompanyDetailSerializer(self.get_object()) except Exception as e: print('error:{0}'.format(e)) return APIResponse(code=404, msg='failed', errors={'id': ['記錄不存在。']}) else: return APIResponse(code=200, data=ser.data) class AgencyAPIView(GenericAPIView): queryset = list(extra_models.Quanguo.objects.using('company').raw(sqls.AGENCY_JOIN_COMPANY)) serializer_class = AgencyListSerializer pagination_class = RestPagination def get(self, request): queryset = self.get_queryset() if request.query_params: agency = request.query_params.get('agency', '').strip() city = request.query_params.get('city', '').strip() params_filters = [] if agency: params_filters.append('qg.agency LIKE "%%{0}%%"'.format(agency)) if city: params_filters.append('qg.city LIKE "{0}%%"'.format(city)) filter_string = ' AND '.join(params_filters) if filter_string: c_sql = ' AND '.join([sqls.AGENCY_JOIN_COMPANY, filter_string]) queryset = list(extra_models.Quanguo.objects.using('company').raw(c_sql)) page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) ser = self.get_serializer(queryset, many=True) return APIResponse(code=200, data=ser.data) class AgencyDetailAPIView(GenericAPIView): queryset = list(extra_models.Quanguo.objects.using('company').raw(sqls.AGENCY_JOIN_COMPANY)) lookup_field = 'id' def delete(self, request, id): try: agency = self.get_object() agency.is_delete = '1' agency.save() except Exception as e: print('error:{0}'.format(e)) return APIResponse(code=404, msg='failed', errors={'id': ['記錄不存在,刪除失敗。']}) return APIResponse(code=200) def get(self, request, id): try: ser = AgencyDetailSerializer(self.get_object()) except Exception as e: print('error:{0}'.format(e)) return APIResponse(code=404, msg='failed', errors={'id': ['記錄不存在。']}) else: return APIResponse(code=200, data=ser.data) def get_object(self): """ 無法使用self.get_object() List不具備get()方法 """ try: # Perform the lookup filtering. lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field assert lookup_url_kwarg in self.kwargs, ( 'Expected view %s to be called with a URL keyword argument ' 'named "%s". Fix your URL conf, or set the `.lookup_field` ' 'attribute on the view correctly.' % (self.__class__.__name__, lookup_url_kwarg) ) filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]} sql = ' '.join([ sqls.AGENCY_JOIN_COMPANY, 'AND qg.id={id}'.format(**filter_kwargs) ]) agency = extra_models.Quanguo.objects.using('company').raw(sql)[0] except Exception as e: print(e) raise Http404() else: return agency
from django.conf.urls import url from company import views urlpatterns = [ url(r'companies/$', views.CompanyAPIView.as_view()), url(r'companies/(?P<id>\d+)$', views.CompanyDetailAPIView.as_view()), url(r'agencies/$', views.AgencyAPIView.as_view()), url(r'agencies/(?P<id>\d+)$', views.AgencyDetailAPIView.as_view()), ]
# @file :serializers.py # @description :自定義序列化器 # @date :2021/07/01 17:42:06 # @author :miaokela # @version :1.0 from rest_framework import serializers from rest_framework import serializers class CompanyListSerializer(serializers.Serializer): """ 列表頁字段序列化: - 企業名稱 - 企業法人 - 注冊資本 - 組織機構代碼 - 公司行業 - 公司類型 """ id = serializers.IntegerField() company_name = serializers.CharField() legal_representative = serializers.CharField() registered_capital = serializers.CharField() organization_code = serializers.CharField() industry = serializers.CharField() is_agency = serializers.CharField() class CompanyDetailSerializer(serializers.Serializer): """ 詳情頁字段序列化: - 企業名稱 - 統一機構信用代碼 - 法定代表人 - 工商注冊號 - 注冊資本 - 納稅人識別號 - 實繳資本 - 組織機構代碼 - 營業期限自 - 營業期限至 - 登記狀態 - 注冊機關 - 注冊地址 - 公司類別 """ id = serializers.IntegerField() company_name = serializers.CharField() unified_social_credit_code = serializers.CharField() legal_representative = serializers.CharField() business_registration_number = serializers.CharField() registered_capital = serializers.CharField() taxpayer_identification_number = serializers.CharField() paid_in_capital = serializers.CharField() organization_code = serializers.CharField() operating_period_std = serializers.CharField() operating_period_edt = serializers.CharField() operating_status = serializers.CharField() registration_authority = serializers.CharField() registered_address = serializers.CharField() is_agency = serializers.CharField() class AgencyListSerializer(serializers.Serializer): """ 代理公司列表序列化器: - 代理公司 - 組織機構代碼 - 企業法人 - 地區 - 業務聯系人 - 業務聯系電話 """ id = serializers.IntegerField() society_code = serializers.CharField() agency = serializers.CharField() liaison = serializers.CharField() contact_information = serializers.CharField() address = serializers.CharField() institutional = serializers.CharField() put_time = serializers.CharField() city = serializers.CharField() class AgencyDetailSerializer(serializers.Serializer): """ 代理公司列表序列化器: - 業務聯系人 - 業務聯系電話 - 企業名稱 - 統一機構信用代碼 - 法定代表人 - 工商注冊號 - 注冊資本 - 納稅人識別號 - 實繳資本 - 組織機構代碼 - 營業期限自 - 營業期限至 - 登記狀態 - 注冊機關 - 注冊地址 - 公司類別 """ id = serializers.IntegerField() company_name = serializers.CharField() unified_social_credit_code = serializers.CharField() legal_representative = serializers.CharField() business_registration_number = serializers.CharField() registered_capital = serializers.CharField() taxpayer_identification_number = serializers.CharField() paid_in_capital = serializers.CharField() organization_code = serializers.CharField() operating_period_std = serializers.CharField() operating_period_edt = serializers.CharField() operating_status = serializers.CharField() registration_authority = serializers.CharField() registered_address = serializers.CharField() liaison = serializers.CharField() contact_information = serializers.CharField() is_agency = serializers.CharField()
# @file :exception.py # @description :自定義錯誤相應 # @date :2021/07/01 17:26:14 # @author :miaokela # @version :1.0 from django.http import Http404 from rest_framework import exceptions, views from django.core.exceptions import PermissionDenied from rest_framework.response import Response def exception_handler(exc, context): """ 自定義 exception_handler 錯誤信息返回 Returns the response that should be used for any given exception. By default we handle the REST framework `APIException`, and also Django's built-in `Http404` and `PermissionDenied` exceptions. Any unhandled exceptions may return `None`, which will cause a 500 error to be raised. """ if isinstance(exc, Http404): exc = exceptions.NotFound() elif isinstance(exc, PermissionDenied): exc = exceptions.PermissionDenied() if isinstance(exc, exceptions.APIException): headers = {} if getattr(exc, 'auth_header', None): headers['WWW-Authenticate'] = exc.auth_header if getattr(exc, 'wait', None): headers['Retry-After'] = '%d' % exc.wait if isinstance(exc.detail, (list, dict)): if isinstance(exc.detail, list): errors = exc.detail else: errors = {k: v[0] for k, v in exc.detail.items()} else: errors = exc.detail views.set_rollback() return Response({ 'code': 400, 'msg': 'failed', 'errors': errors, 'data': {} }, status=exc.status_code, headers=headers) return None
# @file :pagination.py # @description :自定義分頁 # @date :2021/07/01 17:23:46 # @author :miaokela # @version :1.0 from rest_framework.pagination import LimitOffsetPagination from ZTXDMS.utils.response import APIResponse from collections import OrderedDict class RestPagination(LimitOffsetPagination): default_limit = 20 # 默認從第一條開始(offset=0),往后5條為一頁 limit_query_param = 'limit' offset_query_param = 'offset' max_limit = 40 def get_paginated_response(self, data): return APIResponse(code=200, data=OrderedDict([ ('count', self.count), ('next', self.get_next_link()), ('previous', self.get_previous_link()), ('results', data) ]))
# @file :response.py # @description :重寫DRF Response相應類 # @date :2021/07/01 17:12:51 # @author :miaokela # @version :1.0 from rest_framework.response import Response class APIResponse(Response): def __init__(self, code=200, msg='success', data=None, status=None, headers=None, errors=None, **kwargs): errors = {k: v[0] for k, v in errors.items()} if errors else {} dic = {'code': code, 'msg': msg, "errors": errors} if data: dic = { 'code': code, 'msg': msg, 'data': data, } dic.update(kwargs) super().__init__(data=dic, status=status, headers=headers)
### 簡要描述:
> 企業信息統計接口
### 獲取多企業信息
**請求URL:**
- `http://127.0.0.1:8000/v1/companies/`
**請求方式:**
- GET
**請求參數:**
| 參數名 | 必選 | 類型 | 默認值 | 說明 |
| :----------: | :--: | :----: | :----: | :------: |
| company_name | 否 | string | 無 | 企業名稱 |
**響應參數**
| 參數名 | 類型 | 說明 |
| :------------------: | :----: | ------------------------------------ |
| id | int | 企業ID |
| company_name | string | 企業名稱 |
| legal_representative | string | 法人代表 |
| registered_capital | string | 注冊資本 |
| organization_code | string | 組織機構代碼 |
| industry | string | 行業 |
| is_agency | string | 公司類別("1":代理機構,"0":其它) |
**響應結果示例**
```json
{
"code": 200,
"msg": "success",
"data": {
"count": 1404,
"next": "http://114.67.84.76/v1/companies/?limit=20&offset=20",
"previous": null,
"results": [
{
"id": 96,
"company_name": "鄭州澤正生物科技有限公司",
"legal_representative": "張洋洋",
"registered_capital": "500萬元人民幣",
"organization_code": "MA9GXRYX-8",
"industry": "醫葯制造業",
"is_agency": "0"
},
... // 默認20條記錄
]
}
}
```
### 獲取單企業信息
**請求URL:**
- `http://127.0.0.1:8000/v1/companies/{:id}`
**請求方式:**
- GET
**請求參數:**
| 參數名 | 必選 | 類型 | 默認值 | 說明 |
| :----: | :--: | :--: | :----: | :----: |
| id | 是 | int | 無 | 企業ID |
**響應參數**
| 參數名 | 類型 | 說明 |
| :----------------------------: | :----: | ------------------------------------ |
| id | int | 企業ID |
| company_name | string | 企業名稱 |
| unified_social_credit_code | string | 統一社會信用代碼 |
| legal_representative | string | 法人代表 |
| business_registration_number | string | 工商注冊號 |
| registered_capital | string | 注冊資本 |
| taxpayer_identification_number | string | 納稅人識別號 |
| paid_in_capital | string | 實繳資本 |
| organization_code | string | 組織機構代碼 |
| operating_period_std | string | 營業期限自 |
| operating_period_edt | string | 營業期限至 |
| operating_status | string | 登記狀態 |
| registration_authority | string | 注冊機關 |
| registered_address | string | 注冊地址 |
| is_agency | string | 公司類別("1":代理機構,"0":其它) |
**響應結果示例**
```json
{
"code": 200,
"msg": "success",
"data": {
"id": 10,
"company_name": "宜山縣婦聯巾幗經濟服務部",
"unified_social_credit_code": "-",
"legal_representative": "陸美鮮",
"business_registration_number": "4527021002240",
"registered_capital": "2萬元人民幣",
"taxpayer_identification_number": "-",
"paid_in_capital": "-",
"organization_code": "-",
"operating_period_std": "3199-06-22",
"operating_period_edt": "無固定期限",
"operating_status": "注銷",
"registration_authority": "河池市宜州區市場監督管理局",
"registered_address": "慶遠解放路5號查看地圖附近企業",
"is_agency": "0"
}
}
```
### 刪除企業信息
**請求URL:**
- `http://127.0.0.1:8000/v1/companies/{:id}`
**請求方式:**
- DELETE
**請求參數:**
| 參數名 | 必選 | 類型 | 默認值 | 說明 |
| :----: | :--: | :--: | :----: | :----: |
| id | 是 | int | 無 | 企業ID |
**響應參數**
| 參數名 | 類型 | 說明 |
| :----: | :--: | ---- |
| 無 | 無 | 無 |
**響應結果示例**
```json
{
"code": 200,
"msg": "success",
"errors": {}
}
```
### 簡要描述
> 全局響應與狀態碼
### 狀態碼
| 狀態碼 | 描述 |
| :----: | :----------: |
| 200 | 成功響應 |
| 404 | 記錄不存在 |
| 422 | 參數校驗失敗 |
### 成功響應
```json
{
"code": 200,
"msg": "success",
"data": {}
}
```
### 錯誤響應
* 新增/修改校驗失敗
```json
{
"code": 422,
"msg": "failed",
"errors": {
"code": "This field may not be blank.",
"name": "This field may not be blank."
},
"data": {}
}
```
* 刪除/查詢記錄不存在
```json
{
"code": 404,
"msg": "failed",
"errors": {
"id": "記錄不存在,刪除失敗。"
}
}
```
