# -*- coding: utf-8 -*- # @Author : YY from typing import List from typing_extensions import Annotated from pydantic import BeforeValidator import json from datetime import datetime from flask import Response from ruoyi_common.constant import UserConstants from ruoyi_common.base.model import AjaxResponse, TableResponse from ruoyi_common.base.transformer import ids_to_list # from ruoyi_common.domain.entity import SysPriceConf from ruoyi_common.domain.entity import SysPriceConf from ruoyi_common.domain.enum import BusinessType from ruoyi_common.descriptor.serializer import JsonSerializer, BaseSerializer from ruoyi_common.descriptor.validator import BodyValidator, QueryValidator, PathValidator, FileDownloadValidator from ruoyi_common.utils import security_util as SecurityUtil from ruoyi_system.service.module_conf.price_info_conf import SysModulePriceinfoConfService from ruoyi_framework.descriptor.log import Log from ruoyi_framework.descriptor.permission import HasPerm, PreAuthorize from ... import reg @reg.api.route("/system/moduleConf/priceConf/list", methods=["GET"]) @QueryValidator(is_page=True) # @PreAuthorize(HasPerm("moduleConf:priceConf:list")) @JsonSerializer() def system_priceinfo_conf_list(dto:SysPriceConf): ''' 获取价目配置列表 ''' rows = SysModulePriceinfoConfService.select_priceinfo_conf_list(dto) table_response = TableResponse(rows=rows) return table_response @reg.api.route("/system/moduleConf/priceConf/", methods=["GET"]) @PathValidator() @PreAuthorize(HasPerm("moduleConf:priceConf:query")) @JsonSerializer() def module_priceinfo_conf(id:int): ''' 获取价目配置详情 ''' # 注意:如果需要数据权限控制,需要实现 check_priceinfo_conf_data_scope 方法 # SysModulePriceinfoConfService.check_priceinfo_conf_data_scope(id) priceinfoConf = SysModulePriceinfoConfService.select_priceinfo_conf_by_id(id) ajax_response = AjaxResponse.from_success(data=priceinfoConf) return ajax_response @reg.api.route("/system/moduleConf/priceConf", methods=["POST"]) @BodyValidator() @PreAuthorize(HasPerm("moduleConf:priceConf:add")) @Log(title="价目配置管理",business_type=BusinessType.INSERT) @JsonSerializer() def system_priceinfo_conf_create(dto:SysPriceConf): ''' 新增价目配置 ''' # if UserConstants.NOT_UNIQUE == SysModulePriceinfoConfService.check_priceinfo_conf_name_unique(dto): # ajax_response = AjaxResponse.from_error("价目配置名称已存在") # return ajax_response # 注意:SysPriceConf 不继承 AuditEntity,没有 create_by 等字段,所以不需要调用 create_by_user SysModulePriceinfoConfService.insert_conf(dto) ajax_response = AjaxResponse.from_success() return ajax_response @reg.api.route("/system/moduleConf/priceConf", methods=["PUT"]) @BodyValidator() @PreAuthorize(HasPerm("moduleConf:priceConf:edit")) @Log(title="价目配置管理",business_type=BusinessType.UPDATE) @JsonSerializer() def system_priceinfo_conf_update(dto:SysPriceConf): ''' 修改价目配置 ''' # SysModulePriceinfoConfService.check_priceinfo_conf_data_scope(dto.priceinfoConf_id) # if UserConstants.UNIQUE != SysModulePriceinfoConfService.check_priceinfo_conf_name_unique(dto): # return AjaxResponse.from_error("价目配置名称已存在") # 注意:SysPriceConf 不继承 AuditEntity,没有 update_by 等字段,所以不需要调用 update_by_user flag = SysModulePriceinfoConfService.update_conf(dto) return AjaxResponse.from_success() if flag else AjaxResponse.from_error() @reg.api.route("/system/moduleConf/priceConf/", methods=["DELETE"]) @PathValidator() @PreAuthorize(HasPerm("moduleConf:priceConf:remove")) @Log(title="价目配置管理",business_type=BusinessType.DELETE) @JsonSerializer() def system_priceinfo_conf_delete( ids: Annotated[List[int], BeforeValidator(ids_to_list)] ): ''' 删除价目配置 ''' # if SysModulePriceinfoConfService.has_child_by_priceinfo_conf_id(id): # return AjaxResponse.from_error("该价目配置存在下级价目配置,不允许删除") # if SysModulePriceinfoConfService.check_priceinfo_conf_exist_user(id): # return AjaxResponse.from_error("该价目配置存在用户,不允许删除") # SysModulePriceinfoConfService.check_priceinfo_conf_data_scope(id) flag = SysModulePriceinfoConfService.delete_priceinfo_conf_by_id(ids) return AjaxResponse.from_success() if flag > 0 else AjaxResponse.from_error() @reg.api.route("/system/moduleConf/priceConf/export", methods=["POST"]) @FileDownloadValidator() @PreAuthorize(HasPerm("moduleConf:priceConf:export")) @Log(title="价目配置管理", business_type=BusinessType.EXPORT) @BaseSerializer() def system_priceinfo_conf_export(dto: SysPriceConf): ''' 导出价目配置列表为JSON ''' try: rows = SysModulePriceinfoConfService.select_priceinfo_conf_list(dto) # 将Pydantic模型转换为字典 data = [] for row in rows: try: if hasattr(row, 'model_dump'): data.append(row.model_dump()) elif hasattr(row, 'dict'): data.append(row.dict()) else: # 如果是字典类型,直接使用 data.append(dict(row) if hasattr(row, '__iter__') and not isinstance(row, str) else row) except Exception as e: # 如果序列化失败,尝试使用默认方法 data.append(str(row)) # 转换为JSON字符串 json_str = json.dumps(data, ensure_ascii=False, indent=2, default=str) # 创建响应 - 使用application/octet-stream确保前端识别为文件下载 response = Response( json_str.encode('utf-8'), mimetype='application/octet-stream', headers={ 'Content-Disposition': f'attachment; filename=priceConf_{datetime.now().strftime("%Y%m%d_%H%M%S")}.json', 'Content-Type': 'application/json; charset=utf-8' } ) return response except Exception as e: import traceback error_msg = f"导出失败: {str(e)}" error_json = json.dumps({"code": 500, "msg": error_msg}, ensure_ascii=False) error_response = Response( error_json, mimetype='application/json', status=500 ) return error_response