TemplateCategoryService.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. from django.core.paginator import Paginator
  2. from django.db import transaction
  3. from oss2.exceptions import status
  4. from DCbackend.utils.common import success, fail, pageData
  5. from backend.Form.TemplateCategoryForm import TemplateCategoryForm
  6. from backend.Form.TemplateForm import TemplateForm
  7. from backend.models import TemplateCategory
  8. import json
  9. class TemplateCategoryService:
  10. @staticmethod
  11. @transaction.atomic
  12. def Create(request):
  13. try:
  14. form = TemplateCategoryForm(request.POST)
  15. if form.is_valid():
  16. parent_id = request.POST.get("parent_id")
  17. if int(parent_id) !=0:
  18. parent = TemplateCategory.objects.get(id=parent_id)
  19. level = 1
  20. while parent.parent_id and parent.parent_id != 0:
  21. try:
  22. parent = TemplateCategory.objects.get(id=parent.parent_id)
  23. level += 1
  24. if level >= 5:
  25. return fail("新增失败,最多五级分类")
  26. except TemplateCategory.DoesNotExist:
  27. break # 父级分类不存在,跳出循环
  28. form.save()
  29. return success("新增成功")
  30. else:
  31. return fail("表单无效")
  32. except Exception as e:
  33. return fail(str(e))
  34. @staticmethod
  35. @transaction.atomic
  36. def Creates(request):
  37. try:
  38. child_data = request.POST.get("child")
  39. parent_id = request.POST.get("id")
  40. if child_data:
  41. #保存子类
  42. data = json.loads(child_data)
  43. TemplateCategoryService.save_or_update_category(data,parent_id)
  44. else:
  45. # 保存父类
  46. form = TemplateCategoryForm(request.POST)
  47. print(form.data)
  48. if form.is_valid():
  49. form.save()
  50. return success("父级信息保存成功")
  51. else:
  52. return fail(f"父级信息保存失败: {form.errors}")
  53. return success("保存成功")
  54. except Exception as e:
  55. return fail(str(e))
  56. @staticmethod
  57. @transaction.atomic
  58. def save_or_update_category(data, parent_id):
  59. if isinstance(data, list):
  60. for item in data:
  61. TemplateCategoryService.save_or_update_category(item, parent_id)
  62. return
  63. category_id = data.get('id')
  64. if category_id and category_id != "":
  65. # 更新现有分类
  66. category = TemplateCategory.objects.filter(id=category_id).first()
  67. if not category:
  68. raise ValueError(f"未找到ID为{category_id}的分类")
  69. else:
  70. # 创建新分类
  71. category = TemplateCategory()
  72. # 更新分类数据
  73. category.name = data.get('name')
  74. category.status = data.get('status')
  75. # 设置 parent_id
  76. category.parent_id = str(parent_id)
  77. category.save()
  78. print(f"保存分类: {category}")
  79. # 处理子分类
  80. children = data.get('child', [])
  81. if children:
  82. for child in children:
  83. print(f"处理子分类: {child.get('name')}")
  84. # 使用当前分类的ID作为子分类的parent_id
  85. TemplateCategoryService.save_or_update_category(child, category.id)
  86. @staticmethod
  87. @transaction.atomic
  88. def Update(request):
  89. try:
  90. data = TemplateCategory.objects.filter(id=request.POST.get("id")).first();
  91. if data is not None:
  92. parent_id = int(request.POST.get("parent_id"))
  93. if int(data.parent_id) == 0 and parent_id != 0:
  94. return fail("无法将父类变更为子类")
  95. if int(data.parent_id) != 0 and parent_id == 0:
  96. return fail("无法将子类直接变更为父类,请删除后新建")
  97. count = TemplateCategory.objects.filter(parent_id = data.id).exclude(status = 4).count()
  98. if count != 0 and int(data.parent_id) != 0 and parent_id != 0:
  99. return fail("当前子类下有参数,无法变更")
  100. data.intro = request.POST.get("intro")
  101. data.name = request.POST.get("name")
  102. data.status = request.POST.get("status")
  103. data.parent_id = parent_id
  104. data.save()
  105. return success("编辑成功")
  106. else:
  107. return fail("数据错误无当前数据")
  108. except Exception as e:
  109. return fail(str(e))
  110. @staticmethod
  111. def Info(request):
  112. info = TemplateCategory.objects.filter(id=request.POST.get("id")).first()
  113. return success(TemplateCategoryService.getDetail(info))
  114. @staticmethod
  115. @transaction.atomic
  116. def Delete(request):
  117. count = TemplateCategory.objects.filter(parent_id=request.POST.get("id")).exclude(status=4).count()
  118. if count > 0:
  119. return fail("其下存在数据无法删除")
  120. TemplateCategory.objects.filter(id=request.POST.get("id")).update(status=4)
  121. return success("成功")
  122. @staticmethod
  123. def getDetail(item: TemplateCategory):
  124. return {
  125. "id": item.id,
  126. 'intro': item.intro,
  127. 'name': item.name,
  128. 'createTime': item.create_time,
  129. 'status': item.status,
  130. 'parent_id': item.parent_id
  131. }
  132. @staticmethod
  133. def Search(request):
  134. status = request.POST.get("status")
  135. prantId = request.POST.get("parent_id")
  136. dataList = []
  137. if prantId == "0":
  138. page = request.POST.get("page")
  139. pageSize = request.POST.get("pageSize")
  140. if page is None:
  141. page = 1
  142. if pageSize is None:
  143. pageSize = 10
  144. where = {}
  145. name = request.POST.get("name", '')
  146. if name:
  147. where["name__icontains"] = name
  148. if status:
  149. where['status'] = status
  150. paginator = Paginator(TemplateCategory.objects.filter(**where,parent_id=0).exclude(status=4).order_by("-id"),pageSize) # 每页显示10条数据
  151. page_obj = paginator.get_page(page)
  152. for item in page_obj:
  153. child_count = TemplateCategory.objects.filter(parent_id=item.id).exclude(status=4).count()
  154. info = TemplateCategoryService.getDetail(item)
  155. info['child_count'] = child_count
  156. dataList.append(info)
  157. return success(pageData(page, pageSize, paginator.num_pages, paginator.count, dataList))
  158. else:
  159. subcategories = TemplateCategory.objects.filter(parent_id=prantId).exclude(status=4).order_by("-id")
  160. dataList = []
  161. for item in subcategories:
  162. child_count = TemplateCategory.objects.filter(parent_id=item.id).exclude(status=4).count()
  163. info = TemplateCategoryService.getDetail(item)
  164. info['child_count'] = child_count
  165. dataList.append(info)
  166. return success(dataList)
  167. @staticmethod
  168. def allInfo(request):
  169. # 查询所有一级菜单项
  170. parent_menus = TemplateCategory.objects.filter(parent_id=0).exclude(status=4).order_by("-id")
  171. # 创建一个字典来存储一级菜单及其对应的二级菜单
  172. dataList = []
  173. for parent in parent_menus:
  174. # 查询每个一级菜单项的子菜单项
  175. child_menus = TemplateCategory.objects.filter(parent_id=parent.id).exclude(status=4).order_by("-id")
  176. # 将一级菜单及其子菜单存储在字典中
  177. dataList.append({
  178. "parent": {
  179. "id": parent.id,
  180. "name": parent.name,
  181. "parent_id": parent.parent_id,
  182. # 添加其他需要的字段
  183. },
  184. "children": list(child_menus.values("id", "name", "parent_id"))
  185. })
  186. return success(dataList)
  187. @staticmethod
  188. def allList(request):
  189. # 查询所有非状态4的类别
  190. all_categories = TemplateCategory.objects.exclude(status=4).order_by("-id")
  191. # 查询所有顶级类别(parent_id 为 0)
  192. top_level_categories = all_categories.filter(parent_id=0).exclude(status=4)
  193. # 获取所有子类别,同时确保其父类也不是状态4
  194. child_categories = all_categories.exclude(parent_id=0).exclude(status=4).filter(
  195. parent_id__in=all_categories.values('id')
  196. )
  197. # 获取所有有子类的顶级类别的ID
  198. categories_with_children = set(child_categories.values_list('parent_id', flat=True))
  199. # 组织结果
  200. result = list(child_categories) + [
  201. category for category in top_level_categories
  202. if category.id not in categories_with_children
  203. ]
  204. # 将查询集转换为列表,以便序列化
  205. result_list = [
  206. {
  207. 'id': item.id,
  208. 'name': item.name,
  209. 'intro': item.intro,
  210. 'create_time': item.create_time,
  211. 'status': item.status,
  212. 'parent_id': item.parent_id
  213. }
  214. for item in result
  215. ]
  216. return success(result_list)
  217. @staticmethod
  218. def treeCategory(request):
  219. return success(TemplateCategoryService.get_category_hierarchy())
  220. @staticmethod
  221. def get_category_hierarchy(parent_id=0, level=1, max_level=5):
  222. if level > max_level:
  223. return []
  224. categories = TemplateCategory.objects.exclude(status=4).filter(parent_id=parent_id).order_by("-id")
  225. result = []
  226. for category in categories:
  227. children = TemplateCategoryService.get_category_hierarchy(parent_id=category.id, level=level + 1,
  228. max_level=max_level)
  229. result.append({
  230. "id": category.id,
  231. "name": category.name,
  232. "children": children
  233. })
  234. return result