DataDictManageController.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. import json
  2. import time
  3. from django.db import transaction
  4. from django.db.models import Q
  5. from django.views import View
  6. from Model.models import DictCategory, DictCategoryI18n, DictItemI18n, DictItem
  7. from Object.ResponseObject import ResponseObject
  8. from Object.TokenObject import TokenObject
  9. class DataDictView(View):
  10. def get(self, request, *args, **kwargs):
  11. request.encoding = 'utf-8'
  12. operation = kwargs.get('operation')
  13. request_dict = request.GET
  14. return self.validation(request_dict, request, operation)
  15. def post(self, request, *args, **kwargs):
  16. request.encoding = 'utf-8'
  17. operation = kwargs.get('operation')
  18. request_dict = request.POST
  19. return self.validation(request_dict, request, operation)
  20. def validation(self, request_dict, request, operation):
  21. language = request_dict.get('language', 'en')
  22. response = ResponseObject(language, 'pc')
  23. tko = TokenObject(
  24. request.META.get('HTTP_AUTHORIZATION'),
  25. returntpye='pc')
  26. response.lang = tko.lang
  27. if operation == "getDictCategory":
  28. return self.get_dict_category(request_dict, response)
  29. elif operation == "getDictCategoryList":
  30. return self.dict_categories_list(request_dict, response)
  31. if tko.code != 0:
  32. return response.json(tko.code)
  33. else:
  34. response.lang = tko.lang
  35. userID = tko.userID
  36. if operation == 'addDictCategory':
  37. return self.add_dict_category(userID, request_dict, response)
  38. elif operation == 'editDictCategory':
  39. return self.edit_dict_category(userID, request_dict, response)
  40. elif operation == 'deleteDictCategory':
  41. return self.delete_dict_category(request_dict, response)
  42. else:
  43. return response.json(414)
  44. @staticmethod
  45. def dict_categories_list(request_dict, response):
  46. code = request_dict.get("typeCode", None)
  47. status = request_dict.get("status", None)
  48. scenes = request_dict.get("scenes", None)
  49. page = int(request_dict.get("page", 1))
  50. page_size = int(request_dict.get("pageSize", 10))
  51. try:
  52. query = Q()
  53. if code:
  54. query &= Q(code__icontains=code)
  55. if status:
  56. query &= Q(status=bool(int(status)))
  57. if scenes:
  58. query &= Q(scenes=int(scenes))
  59. category_qs = DictCategory.objects.filter(query).order_by("-id")
  60. total = category_qs.count()
  61. start = (page - 1) * page_size
  62. end = start + page_size
  63. categories = category_qs[start:end]
  64. result = []
  65. for category in categories:
  66. # 类别名称国际化
  67. i18n_name = (
  68. list(category.translations.values("lang_code", "name"))
  69. or []
  70. )
  71. # 子表字典项
  72. items = category.items.order_by("sort", "id")
  73. item_list = []
  74. for item in items:
  75. item_i18n_name = (
  76. list(item.translations.values("lang_code", "name"))
  77. or []
  78. )
  79. item_list.append({
  80. "id": item.id,
  81. "code": item.code,
  82. "sort": item.sort,
  83. "status": item.status,
  84. "remark": item.remark,
  85. "createdTime": item.created_time,
  86. "createdBy": item.created_by,
  87. "updatedTime": item.updated_time,
  88. "updatedBy": item.updated_by,
  89. "itemNames": item_i18n_name
  90. })
  91. result.append({
  92. "id": category.id,
  93. "code": category.code,
  94. "scenes": category.scenes,
  95. "status": category.status,
  96. "remark": category.remark,
  97. "extData": category.ext_data,
  98. "createdTime": category.created_time,
  99. "createdBy": category.created_by,
  100. "updatedTime": category.updated_time,
  101. "updatedBy": category.updated_by,
  102. "names": i18n_name,
  103. "items": item_list
  104. })
  105. return response.json(0, {
  106. "list": result,
  107. "total": total
  108. })
  109. except Exception as e:
  110. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  111. @staticmethod
  112. def get_dict_category(request_dict, response):
  113. type_codes = request_dict.get("typeCodes", None)
  114. lang_code = request_dict.get("langCode", "cn")
  115. scenes = request_dict.get("scenes", 1)
  116. try:
  117. if not type_codes:
  118. return response.json(444)
  119. type_code_list = type_codes.split(",")
  120. category_qs = DictCategory.objects.filter(code__in=type_code_list, status=True, scenes=scenes)
  121. if not category_qs.exists():
  122. return response.json(0)
  123. result_list = []
  124. for category in category_qs:
  125. # 获取类别名称(国际化)
  126. category_name = (
  127. category.translations.filter(lang_code=lang_code).values_list("name", flat=True).first()
  128. or ""
  129. )
  130. # 构建返回结构
  131. result = {
  132. "typeCode": category.code,
  133. "scenes": category.scenes,
  134. "status": category.status,
  135. "remark": category.remark,
  136. "name": category_name,
  137. "items": []
  138. }
  139. # 获取字典项及其多语言名称
  140. items = category.items.filter(status=True).order_by("sort", "id")
  141. for item in items:
  142. item_name = (
  143. item.translations.filter(lang_code=lang_code).values_list("name", flat=True).first()
  144. or ""
  145. )
  146. result["items"].append({
  147. "code": item.code,
  148. "name": item_name,
  149. "remark": item.remark,
  150. "sort": item.sort
  151. })
  152. result_list.append(result)
  153. return response.json(0, result_list)
  154. except Exception as e:
  155. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  156. @staticmethod
  157. def add_dict_category(user_id, request_dict, response):
  158. type_code = request_dict.get('typeCode', None)
  159. scenes = request_dict.get("scenes", 1)
  160. status = request_dict.get("status", 1)
  161. remark = request_dict.get("remark", "")
  162. names = request_dict.get("names", [])
  163. items = request_dict.get("items", [])
  164. now_time = int(time.time())
  165. try:
  166. if not type_code or not names:
  167. return response.json(444)
  168. names = json.loads(names)
  169. items = json.loads(items)
  170. if DictCategory.objects.filter(code=type_code).exists():
  171. return response.json(174)
  172. with transaction.atomic():
  173. # 创建类别 数据
  174. category = DictCategory.objects.create(
  175. code=type_code,
  176. scenes=scenes,
  177. status=status,
  178. remark=remark,
  179. created_time=now_time,
  180. updated_time=now_time,
  181. created_by=user_id,
  182. updated_by=user_id
  183. )
  184. # 添加多语言名称
  185. for name_entry in names:
  186. DictCategoryI18n.objects.create(
  187. category=category,
  188. lang_code=name_entry["lang"],
  189. name=name_entry["text"],
  190. created_time=now_time,
  191. updated_time=now_time,
  192. created_by=user_id,
  193. updated_by=user_id
  194. )
  195. # 创建选项表数据
  196. for item in items:
  197. item_obj = DictItem.objects.create(
  198. category=category,
  199. code=item["code"],
  200. sort=item.get("sort", 0),
  201. status=item.get("status", True),
  202. remark=item.get("remark", ""),
  203. created_time=now_time,
  204. updated_time=now_time,
  205. created_by=user_id,
  206. updated_by=user_id
  207. )
  208. for name_entry in item.get("names", []):
  209. DictItemI18n.objects.create(
  210. item=item_obj,
  211. lang_code=name_entry["lang"],
  212. name=name_entry["text"],
  213. created_time=now_time,
  214. updated_time=now_time,
  215. created_by=user_id,
  216. updated_by=user_id
  217. )
  218. return response.json(0)
  219. except Exception as e:
  220. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  221. @staticmethod
  222. def edit_dict_category(user_id, request_dict, response):
  223. category_id = request_dict.get("categoryId", None)
  224. scenes = request_dict.get("scenes", 1)
  225. status = request_dict.get("status", 1)
  226. remark = request_dict.get("remark", "")
  227. names = request_dict.get("names", [])
  228. items = request_dict.get("items", [])
  229. now_time = int(time.time())
  230. try:
  231. if not category_id or not names:
  232. return response.json(444)
  233. names = json.loads(names)
  234. items = json.loads(items)
  235. category = DictCategory.objects.filter(id=category_id).first()
  236. if not category:
  237. return response.json(404, msg="字典类别不存在")
  238. with transaction.atomic():
  239. # 更新主表字段(不允许改 typeCode)
  240. category.status = status
  241. category.scenes = scenes
  242. category.remark = remark
  243. category.updated_time = now_time
  244. category.updated_by = user_id
  245. category.save()
  246. # 删除原有多语言并重新插入
  247. DictCategoryI18n.objects.filter(category=category).delete()
  248. for name_entry in names:
  249. DictCategoryI18n.objects.create(
  250. category=category,
  251. lang_code=name_entry["lang"],
  252. name=name_entry["text"],
  253. created_time=now_time,
  254. updated_time=now_time,
  255. created_by=user_id,
  256. updated_by=user_id
  257. )
  258. if not items:
  259. return response.json(0)
  260. # 删除原有子项及多语言
  261. old_items = DictItem.objects.filter(category=category)
  262. DictItemI18n.objects.filter(item__in=old_items).delete()
  263. old_items.delete()
  264. # 插入新子项及其国际化
  265. for item in items:
  266. item_obj = DictItem.objects.create(
  267. category=category,
  268. code=item["code"],
  269. sort=item.get("sort", 0),
  270. status=item.get("status", True),
  271. remark=item.get("remark", ""),
  272. created_time=now_time,
  273. updated_time=now_time,
  274. created_by=user_id,
  275. updated_by=user_id
  276. )
  277. for name_entry in item.get("names", []):
  278. DictItemI18n.objects.create(
  279. item=item_obj,
  280. lang_code=name_entry["lang"],
  281. name=name_entry["text"],
  282. created_time=now_time,
  283. updated_time=now_time,
  284. created_by=user_id,
  285. updated_by=user_id
  286. )
  287. return response.json(0)
  288. except Exception as e:
  289. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  290. @staticmethod
  291. def delete_dict_category(request_dict, response):
  292. category_id = request_dict.get("categoryId", None)
  293. try:
  294. if not category_id:
  295. return response.json(444)
  296. category = DictCategory.objects.filter(id=category_id).first()
  297. if not category:
  298. return response.json(173)
  299. with transaction.atomic():
  300. # 删除子项和对应的国际化
  301. items = DictItem.objects.filter(category=category)
  302. DictItemI18n.objects.filter(item__in=items).delete()
  303. items.delete()
  304. # 删除类别国际化和主表记录
  305. DictCategoryI18n.objects.filter(category=category).delete()
  306. category.delete()
  307. return response.json(0)
  308. except Exception as e:
  309. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))