172 lines
8.0 KiB
Python
172 lines
8.0 KiB
Python
|
|
from ninja_extra import api_controller, ControllerBase, route
|
|||
|
|
from ninja import Query
|
|||
|
|
from apps.dict.models import Dict, DictItem
|
|||
|
|
from ninja_jwt.authentication import JWTAuth
|
|||
|
|
from ninja_extra.permissions import IsAuthenticated, IsAdminUser
|
|||
|
|
from ninja.pagination import paginate
|
|||
|
|
from ninja.errors import HttpError
|
|||
|
|
from utils.chen_pagination import MyPagination
|
|||
|
|
from django.db import transaction
|
|||
|
|
from typing import List
|
|||
|
|
from utils.chen_crud import multi_delete
|
|||
|
|
from utils.chen_response import ChenResponse
|
|||
|
|
from apps.dict.schema import DictOut, DictIndexInput, ChangeStautsSchemaInput, DictItemInput, DictItemOut, \
|
|||
|
|
DictItemChangeSrotInput, DictItemCreateInputSchema, DictItemUpdateInputSchema, DeleteSchema, \
|
|||
|
|
DictItemFastCreateInputSchema, DictStdItemCreateInputSchema
|
|||
|
|
|
|||
|
|
@api_controller("/system", tags=['字典相关'], auth=JWTAuth(), permissions=[IsAuthenticated])
|
|||
|
|
class DictController(ControllerBase):
|
|||
|
|
@route.get("/dataDict/list", response=List[DictItemOut], url_name="dict-list")
|
|||
|
|
def get_dict(self, code: str):
|
|||
|
|
"""传入code类型:例如testType,返回字典Item信息"""
|
|||
|
|
dict_qs = Dict.objects.get(code=code)
|
|||
|
|
items = dict_qs.dictItem.filter(status='1')
|
|||
|
|
return items
|
|||
|
|
|
|||
|
|
@route.get("/dataDict/index", response=List[DictOut], url_name="dict-index")
|
|||
|
|
@transaction.atomic
|
|||
|
|
@paginate(MyPagination)
|
|||
|
|
def get_dict_index(self, payload: DictIndexInput = Query(...)):
|
|||
|
|
for attr, value in payload.__dict__.items():
|
|||
|
|
if getattr(payload, attr) is None:
|
|||
|
|
setattr(payload, attr, '')
|
|||
|
|
# 处理时间
|
|||
|
|
if payload.update_datetime_start == '':
|
|||
|
|
payload.update_datetime_start = "2000-01-01"
|
|||
|
|
if payload.update_datetime_end == '':
|
|||
|
|
payload.update_datetime_end = '5000-01-01'
|
|||
|
|
date_list = [payload.update_datetime_start, payload.update_datetime_end]
|
|||
|
|
qs = Dict.objects.filter(name__icontains=payload.name, remark__icontains=payload.remark,
|
|||
|
|
code__icontains=payload.code, status__icontains=payload.status,
|
|||
|
|
update_datetime__range=date_list)
|
|||
|
|
return qs
|
|||
|
|
|
|||
|
|
@route.put("/dataDict/changeStatus", url_name="dict-changeStatus", permissions=[IsAdminUser])
|
|||
|
|
@transaction.atomic
|
|||
|
|
def change_dict_status(self, data: ChangeStautsSchemaInput):
|
|||
|
|
qs = Dict.objects.get(id=data.id)
|
|||
|
|
qs.status = data.status
|
|||
|
|
qs.save()
|
|||
|
|
return ChenResponse(code=200, status=200, message="修改状态成功")
|
|||
|
|
|
|||
|
|
@route.put("/dataDict/changeItemStatus", url_name="dict-changeItemStatus", permissions=[IsAdminUser])
|
|||
|
|
@transaction.atomic
|
|||
|
|
def change_dict_item_status(self, data: ChangeStautsSchemaInput):
|
|||
|
|
qs = DictItem.objects.get(id=data.id)
|
|||
|
|
qs.status = data.status
|
|||
|
|
qs.save()
|
|||
|
|
return ChenResponse(code=200, status=200, message="修改状态成功")
|
|||
|
|
|
|||
|
|
# 有dict的id查询其中的dictItem数据
|
|||
|
|
@route.get("/dataDict/dictItemAll", response=List[DictItemOut], url_name='dictitem-list')
|
|||
|
|
@transaction.atomic
|
|||
|
|
@paginate(MyPagination)
|
|||
|
|
def get_dictItem_list(self, payload: DictItemInput = Query(...)):
|
|||
|
|
for attr, value in payload.__dict__.items():
|
|||
|
|
if getattr(payload, attr) is None:
|
|||
|
|
setattr(payload, attr, '')
|
|||
|
|
# 处理时间
|
|||
|
|
if payload.update_datetime_start == '':
|
|||
|
|
payload.update_datetime_start = "2000-01-01"
|
|||
|
|
if payload.update_datetime_end == '':
|
|||
|
|
payload.update_datetime_end = '5000-01-01'
|
|||
|
|
date_list = [payload.update_datetime_start, payload.update_datetime_end]
|
|||
|
|
# 先对dict_id进行查询
|
|||
|
|
dict_qs = Dict.objects.get(id=payload.dict_id)
|
|||
|
|
# 反向连接
|
|||
|
|
qs = dict_qs.dictItem.filter(update_datetime__range=date_list, status__icontains=payload.status,
|
|||
|
|
key__icontains=payload.key, title__icontains=payload.title,
|
|||
|
|
show_title__icontains=payload.show_title).order_by('sort')
|
|||
|
|
return qs
|
|||
|
|
|
|||
|
|
# 更改dictItem的sort字段接口
|
|||
|
|
@route.put("/dataDict/numberOperation", url_name="dictitem-changesort")
|
|||
|
|
@transaction.atomic
|
|||
|
|
def change_item_sort(self, data: DictItemChangeSrotInput):
|
|||
|
|
qs = DictItem.objects.get(id=data.id)
|
|||
|
|
qs.sort = data.numberValue
|
|||
|
|
qs.save()
|
|||
|
|
return ChenResponse(code=200, status=200, message='排序序号更新成功')
|
|||
|
|
|
|||
|
|
# 新增dictItem
|
|||
|
|
@route.post("/dataDict/saveitem", response=DictItemOut, url_name="dictitem-save")
|
|||
|
|
@transaction.atomic
|
|||
|
|
def save_item(self, payload: DictItemCreateInputSchema):
|
|||
|
|
# 先根据dict_id查询出dict
|
|||
|
|
dict_qs = Dict.objects.get(id=payload.dict_id)
|
|||
|
|
qs1 = dict_qs.dictItem.filter(title=payload.title)
|
|||
|
|
if len(qs1) > 0:
|
|||
|
|
return ChenResponse(code=400, status=400, message='字典标签重复,请检查')
|
|||
|
|
# 计算key值应该为多少
|
|||
|
|
key_number = str(len(dict_qs.dictItem.all()) + 1)
|
|||
|
|
asert_dict = payload.dict(exclude_none=True)
|
|||
|
|
asert_dict.pop('dict_id')
|
|||
|
|
asert_dict.update({'dict': dict_qs, 'key': key_number})
|
|||
|
|
qs = DictItem.objects.create(**asert_dict)
|
|||
|
|
return qs
|
|||
|
|
|
|||
|
|
# 更新dictitem数据
|
|||
|
|
@route.put("/dataDict/update/{id}", response=DictItemOut, url_name='dictitem-update')
|
|||
|
|
@transaction.atomic
|
|||
|
|
def update(self, id: int, payload: DictItemUpdateInputSchema):
|
|||
|
|
dictitem_qs = DictItem.objects.get(id=id)
|
|||
|
|
for attr, value in payload.dict().items():
|
|||
|
|
setattr(dictitem_qs, attr, value)
|
|||
|
|
dictitem_qs.save()
|
|||
|
|
return dictitem_qs
|
|||
|
|
|
|||
|
|
# 删除dictItem数据
|
|||
|
|
@route.delete("/dictType/realDeleteItem", url_name="dictitem-delete", permissions=[IsAdminUser])
|
|||
|
|
@transaction.atomic
|
|||
|
|
def delete_dictitem(self, data: DeleteSchema):
|
|||
|
|
# 根据其中一个id查询出dict的id
|
|||
|
|
dictItem_single = DictItem.objects.filter(id=data.ids[0])[0]
|
|||
|
|
dict_id = dictItem_single.dict.id
|
|||
|
|
multi_delete(data.ids, DictItem)
|
|||
|
|
index = 1
|
|||
|
|
qs = Dict.objects.get(id=dict_id).dictItem.all()
|
|||
|
|
for qs_item in qs:
|
|||
|
|
qs_item.key = str(index)
|
|||
|
|
index = index + 1
|
|||
|
|
qs_item.save()
|
|||
|
|
return ChenResponse(message="字典条目删除成功!")
|
|||
|
|
|
|||
|
|
# 快速新增dictItem数据
|
|||
|
|
@route.post("/dataDict/fastSave", url_name="dictitem-save-fast", permissions=[IsAuthenticated])
|
|||
|
|
@transaction.atomic
|
|||
|
|
def save_fast_dictitem(self, data: DictItemFastCreateInputSchema):
|
|||
|
|
# 首先根据data.code查询出是哪个Dict
|
|||
|
|
dict_single = Dict.objects.filter(code=data.code).first()
|
|||
|
|
# 判断是否有该dict
|
|||
|
|
if dict_single:
|
|||
|
|
# 再判断是否dictItem重复
|
|||
|
|
qs = dict_single.dictItem.filter(title=data.title)
|
|||
|
|
if len(qs) > 0:
|
|||
|
|
return ChenResponse(code=400, status=400, message='字典标签重复,请检查')
|
|||
|
|
# 查看key值应该为多少了
|
|||
|
|
key_number = str(len(dict_single.dictItem.all()) + 1)
|
|||
|
|
DictItem.objects.create(title=data.title,
|
|||
|
|
key=key_number,
|
|||
|
|
show_title=data.title,
|
|||
|
|
dict=dict_single)
|
|||
|
|
else:
|
|||
|
|
raise HttpError(404, "未查询到字典,请创建字典数据后进行")
|
|||
|
|
return ChenResponse(message="新增成功")
|
|||
|
|
|
|||
|
|
# 快速新增依据标准dictItem数据 - 输入更变为code
|
|||
|
|
@route.post("/dataDict/saveStdItem", response=DictItemOut, url_name="dictitem-save")
|
|||
|
|
@transaction.atomic
|
|||
|
|
def save(self, payload: DictStdItemCreateInputSchema):
|
|||
|
|
# 先根据dict_id查询出dict
|
|||
|
|
dict_qs = Dict.objects.get(code=payload.code)
|
|||
|
|
qs1 = dict_qs.dictItem.filter(title=payload.title)
|
|||
|
|
if len(qs1) > 0:
|
|||
|
|
return ChenResponse(code=400, status=400, message='字典标签重复,请检查')
|
|||
|
|
# 计算key值应该为多少
|
|||
|
|
key_number = str(len(dict_qs.dictItem.all()) + 1)
|
|||
|
|
asert_dict = payload.dict(exclude_none=True)
|
|||
|
|
asert_dict.pop('code')
|
|||
|
|
asert_dict.update({'dict': dict_qs, 'key': key_number})
|
|||
|
|
qs=DictItem.objects.create(**asert_dict)
|
|||
|
|
return qs
|