sys_product_conf.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. # -*- coding: utf-8 -*-
  2. # @Author : YY
  3. from typing import List
  4. from typing_extensions import Annotated
  5. from pydantic import BeforeValidator
  6. import json
  7. from datetime import datetime
  8. from flask import Response
  9. from ruoyi_common.constant import UserConstants
  10. from ruoyi_common.base.model import AjaxResponse, TableResponse
  11. from ruoyi_common.base.transformer import ids_to_str_list
  12. # from ruoyi_common.domain.entity import SysProductConf
  13. from ruoyi_common.domain.entity import SysProductConf
  14. from ruoyi_common.domain.enum import BusinessType
  15. from ruoyi_common.descriptor.serializer import JsonSerializer, BaseSerializer
  16. from ruoyi_common.descriptor.validator import BodyValidator, QueryValidator, PathValidator, FileDownloadValidator
  17. from ruoyi_common.utils import security_util as SecurityUtil
  18. from ruoyi_system.service.module_conf.product_info_conf import SysModuleProductinfoConfService
  19. from ruoyi_framework.descriptor.log import Log
  20. from ruoyi_framework.descriptor.permission import HasPerm, PreAuthorize
  21. from ... import reg
  22. @reg.api.route("/system/moduleConf/productConf/list", methods=["GET"])
  23. @QueryValidator(is_page=True)
  24. # @PreAuthorize(HasPerm("moduleConf:productConf:list"))
  25. @JsonSerializer()
  26. def system_productinfo_conf_list(dto:SysProductConf):
  27. '''
  28. 获取单品配置列表
  29. '''
  30. rows = SysModuleProductinfoConfService.select_productinfo_conf_list(dto)
  31. table_response = TableResponse(rows=rows)
  32. return table_response
  33. @reg.api.route("/system/moduleConf/productConf/<string:id>", methods=["GET"])
  34. @PathValidator()
  35. @PreAuthorize(HasPerm("moduleConf:productConf:query"))
  36. @JsonSerializer()
  37. def module_productinfo_conf(id:str):
  38. '''
  39. 获取单品配置详情
  40. '''
  41. # 注意:如果需要数据权限控制,需要实现 check_productinfo_conf_data_scope 方法
  42. # SysModuleProductinfoConfService.check_productinfo_conf_data_scope(id)
  43. productinfoConf = SysModuleProductinfoConfService.select_productinfo_conf_by_id(id)
  44. ajax_response = AjaxResponse.from_success(data=productinfoConf)
  45. return ajax_response
  46. @reg.api.route("/system/moduleConf/productConf", methods=["POST"])
  47. @BodyValidator()
  48. @PreAuthorize(HasPerm("moduleConf:productConf:add"))
  49. @Log(title="单品配置管理",business_type=BusinessType.INSERT)
  50. @JsonSerializer()
  51. def system_productinfo_conf_create(dto:SysProductConf):
  52. '''
  53. 新增单品配置
  54. '''
  55. # if UserConstants.NOT_UNIQUE == SysModuleProductinfoConfService.check_productinfo_conf_name_unique(dto):
  56. # ajax_response = AjaxResponse.from_error("单品配置名称已存在")
  57. # return ajax_response
  58. # 注意:SysProductConf 不继承 AuditEntity,没有 create_by 等字段,所以不需要调用 create_by_user
  59. SysModuleProductinfoConfService.insert_conf(dto)
  60. ajax_response = AjaxResponse.from_success()
  61. return ajax_response
  62. @reg.api.route("/system/moduleConf/productConf", methods=["PUT"])
  63. @BodyValidator()
  64. @PreAuthorize(HasPerm("moduleConf:productConf:edit"))
  65. @Log(title="单品配置管理",business_type=BusinessType.UPDATE)
  66. @JsonSerializer()
  67. def system_productinfo_conf_update(dto:SysProductConf):
  68. '''
  69. 修改单品配置
  70. '''
  71. # SysModuleProductinfoConfService.check_productinfo_conf_data_scope(dto.productinfoConf_id)
  72. # if UserConstants.UNIQUE != SysModuleProductinfoConfService.check_productinfo_conf_name_unique(dto):
  73. # return AjaxResponse.from_error("单品配置名称已存在")
  74. # 注意:SysProductConf 不继承 AuditEntity,没有 update_by 等字段,所以不需要调用 update_by_user
  75. flag = SysModuleProductinfoConfService.update_conf(dto)
  76. return AjaxResponse.from_success() if flag else AjaxResponse.from_error()
  77. @reg.api.route("/system/moduleConf/productConf/<ids>", methods=["DELETE"])
  78. @PathValidator()
  79. @PreAuthorize(HasPerm("moduleConf:productConf:remove"))
  80. @Log(title="单品配置管理",business_type=BusinessType.DELETE)
  81. @JsonSerializer()
  82. def system_productinfo_conf_delete(
  83. ids: Annotated[List[str], BeforeValidator(ids_to_str_list)]
  84. ):
  85. '''
  86. 删除单品配置
  87. '''
  88. # if SysModuleProductinfoConfService.has_child_by_productinfo_conf_id(id):
  89. # return AjaxResponse.from_error("该单品配置存在下级单品配置,不允许删除")
  90. # if SysModuleProductinfoConfService.check_productinfo_conf_exist_user(id):
  91. # return AjaxResponse.from_error("该单品配置存在用户,不允许删除")
  92. # SysModuleProductinfoConfService.check_productinfo_conf_data_scope(id)
  93. flag = SysModuleProductinfoConfService.delete_productinfo_conf_by_id(ids)
  94. return AjaxResponse.from_success() if flag > 0 else AjaxResponse.from_error()
  95. @reg.api.route("/system/moduleConf/productConf/export", methods=["POST"])
  96. @FileDownloadValidator()
  97. @PreAuthorize(HasPerm("moduleConf:productConf:export"))
  98. @Log(title="单品配置管理", business_type=BusinessType.EXPORT)
  99. @BaseSerializer()
  100. def system_productinfo_conf_export(dto: SysProductConf):
  101. '''
  102. 导出单品配置列表为JSON
  103. '''
  104. try:
  105. rows = SysModuleProductinfoConfService.select_productinfo_conf_list(dto)
  106. # 将Pydantic模型转换为字典
  107. data = []
  108. for row in rows:
  109. try:
  110. if hasattr(row, 'model_dump'):
  111. data.append(row.model_dump())
  112. elif hasattr(row, 'dict'):
  113. data.append(row.dict())
  114. else:
  115. # 如果是字典类型,直接使用
  116. data.append(dict(row) if hasattr(row, '__iter__') and not isinstance(row, str) else row)
  117. except Exception as e:
  118. # 如果序列化失败,尝试使用默认方法
  119. data.append(str(row))
  120. # 转换为JSON字符串
  121. json_str = json.dumps(data, ensure_ascii=False, indent=2, default=str)
  122. # 创建响应 - 使用application/octet-stream确保前端识别为文件下载
  123. response = Response(
  124. json_str.encode('utf-8'),
  125. mimetype='application/octet-stream',
  126. headers={
  127. 'Content-Disposition': f'attachment; filename=productConf_{datetime.now().strftime("%Y%m%d_%H%M%S")}.json',
  128. 'Content-Type': 'application/json; charset=utf-8'
  129. }
  130. )
  131. return response
  132. except Exception as e:
  133. import traceback
  134. error_msg = f"导出失败: {str(e)}"
  135. error_json = json.dumps({"code": 500, "msg": error_msg}, ensure_ascii=False)
  136. error_response = Response(
  137. error_json,
  138. mimetype='application/json',
  139. status=500
  140. )
  141. return error_response