**简要描述:**
- 企业信息统计接口
**请求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": "记录不存在,删除失败。"
}
}
```
