/*
 * 文 件 名:  ReportQueryResult
 * 版    权:  华设设计集团股份有限公司
 * 描    述:  <描述>
 * 修 改 人:  lvwenbin
 * 修改时间:  2026/1/30
 * 跟踪单号:  <跟踪单号>
 * 修改单号:  <修改单号>
 * 修改内容:  <修改内容>
 */
package com.ruoyi.ems.model;

import com.ruoyi.ems.domain.ReportField;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.List;
import java.util.Map;

/**
 * 报表查询结果对象
 *
 * @author ruoyi
 * @date 2026-01-30
 */
@Data
@ApiModel("报表查询结果")
public class ReportQueryResult {
    private static final long serialVersionUID = 1L;

    /** 返回码 */
    @ApiModelProperty("返回码")
    private Integer code;

    /** 提示消息 */
    @ApiModelProperty("提示消息")
    private String msg;

    /** 总记录数 */
    @ApiModelProperty("总记录数")
    private Long total;

    /** 数据列表 */
    @ApiModelProperty("数据列表")
    private List<Map<String, Object>> rows;

    /** 列定义(用于前端表格渲染) */
    @ApiModelProperty("列定义")
    private List<ColumnDefine> columns;

    /** 汇总数据(聚合查询时返回) */
    @ApiModelProperty("汇总数据")
    private Map<String, Object> summary;

    /** 执行的SQL(仅开发调试时返回) */
    @ApiModelProperty("执行的SQL")
    private String sql;

    /**
     * 列定义
     */
    @Data
    @ApiModel("列定义")
    public static class ColumnDefine {
        /** 字段编码 */
        @ApiModelProperty("字段编码")
        private String prop;

        /** 显示名称 */
        @ApiModelProperty("显示名称")
        private String label;

        /** 字段类型 */
        @ApiModelProperty("字段类型")
        private String type;

        /** 宽度 */
        @ApiModelProperty("宽度")
        private Integer width;

        /** 最小宽度 */
        @ApiModelProperty("最小宽度")
        private Integer minWidth;

        /** 小数位数 */
        @ApiModelProperty("小数位数")
        private Integer decimals;

        /** 单位 */
        @ApiModelProperty("单位")
        private String unit;

        /** 显示格式 */
        @ApiModelProperty("显示格式")
        private String format;

        /** 是否可排序 */
        @ApiModelProperty("是否可排序")
        private Boolean sortable;

        /** 是否显示千分位 */
        @ApiModelProperty("是否显示千分位")
        private Boolean showThousands;

        public ColumnDefine() {}

        public ColumnDefine(ReportField field) {
            this.prop = field.getFieldAlias() != null ? field.getFieldAlias() : field.getFieldCode();
            this.label = field.getFieldName();
            this.type = field.getFieldType();
            this.width = field.getWidth();
            this.minWidth = field.getMinWidth();
            this.decimals = field.getDecimals();
            this.unit = field.getUnit();
            this.format = field.getFieldFormat();
            this.sortable = field.getIsSortable() != null && field.getIsSortable() == 1;
            this.showThousands = "number".equals(field.getFieldType());
        }
    }

    /**
     * 成功
     */
    public static ReportQueryResult success(List<Map<String, Object>> rows, Long total, List<ColumnDefine> columns) {
        ReportQueryResult result = new ReportQueryResult();
        result.setCode(200);
        result.setMsg("查询成功");
        result.setRows(rows);
        result.setTotal(total);
        result.setColumns(columns);
        return result;
    }

    /**
     * 失败
     */
    public static ReportQueryResult error(String msg) {
        ReportQueryResult result = new ReportQueryResult();
        result.setCode(500);
        result.setMsg(msg);
        return result;
    }
}