提交 5219fadc authored 作者: 吕本才's avatar 吕本才

feat(report): 新增QuickBI报表嵌入管理功能

上级 b9a00811
package com.link.report.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 扩展报表配置
*
* @author : lvbencai
* @date : 2025-12-05
* @describe :
*/
@ConfigurationProperties(prefix = "extra.quickbi")
@Data
@Component
public class ExtraQuickBiConfig {
private String aliyunUid;
// AccessKey ID和AccessKey Secret。
private String accessId;
// AccessKey ID和AccessKey Secret。
private String accessKey;
}
package com.link.report.controller.query;
import com.link.report.pojo.request.ExtraReportQuickbiEmbedBo;
import com.link.report.pojo.response.ExtraReportQuickbiEmbedVo;
import com.link.report.service.query.ExtraReportQuickbiEmbedService;
import com.sfa.common.core.domain.R;
import com.sfa.common.core.web.controller.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* QuickBI报表嵌入信息控制器
* @author lvbencai
* @date 2025年12月12日
*/
@RestController
@RequestMapping("/extra/quickbi/embed")
//@Api(tags = "QuickBI报表嵌入管理")
public class ExtraReportQuickbiEmbedController extends BaseController {
@Autowired
private ExtraReportQuickbiEmbedService extraReportQuickbiEmbedService;
@PostMapping
// @ApiOperation("新增QuickBI报表嵌入信息")
public R<ExtraReportQuickbiEmbedVo> insert(@RequestBody ExtraReportQuickbiEmbedBo bo) {
ExtraReportQuickbiEmbedVo vo = extraReportQuickbiEmbedService.insert(bo);
return R.ok(vo);
}
@PutMapping
// @ApiOperation("更新QuickBI报表嵌入信息")
public R<ExtraReportQuickbiEmbedVo> update(@RequestBody ExtraReportQuickbiEmbedBo bo) {
ExtraReportQuickbiEmbedVo vo = extraReportQuickbiEmbedService.update(bo);
return vo != null ? R.ok(vo) : R.fail("更新失败,记录不存在");
}
@GetMapping("/{id}")
// @ApiOperation("根据ID查询QuickBI报表嵌入信息")
public R<ExtraReportQuickbiEmbedVo> getById(@PathVariable Long id) {
ExtraReportQuickbiEmbedVo vo = extraReportQuickbiEmbedService.getById(id);
return vo != null ? R.ok(vo) : R.fail("记录不存在");
}
@GetMapping("/page/{pageId}")
// @ApiOperation("根据pageId查询QuickBI报表嵌入信息")
public R<ExtraReportQuickbiEmbedVo> getByPageId(@PathVariable String pageId) {
ExtraReportQuickbiEmbedVo vo = extraReportQuickbiEmbedService.getByPageId(pageId);
return vo != null ? R.ok(vo) : R.fail("记录不存在");
}
/**
* 查询所有QuickBI报表嵌入信息列表
* @return
*/
@GetMapping("/list")
// @ApiOperation("查询所有QuickBI报表嵌入信息列表")
public R<List<ExtraReportQuickbiEmbedVo>> listAll() {
List<ExtraReportQuickbiEmbedVo> list = extraReportQuickbiEmbedService.listAll();
return R.ok(list);
}
@DeleteMapping("/{id}")
// @ApiOperation("删除QuickBI报表嵌入信息")
public R<Boolean> deleteById(@PathVariable Long id) {
boolean result = extraReportQuickbiEmbedService.deleteById(id);
return result ? R.ok(true) : R.fail("删除失败,记录不存在");
}
/**
* 获取quickbi的accessTicket
* @return accessTicket
*/
@GetMapping("/accessTicket")
public R<ExtraReportQuickbiEmbedVo> queryAccessTicket(Long id) {
return R.ok(extraReportQuickbiEmbedService.queryAccessTicket(id));
}
}
package com.link.report.domain.dao;
import com.link.report.domain.entity.ExtraReportQuickbiEmbed;
import java.util.List;
public interface ExtraReportQuickbiEmbedDao {
int insert(ExtraReportQuickbiEmbed entity);
int updateById(ExtraReportQuickbiEmbed entity);
ExtraReportQuickbiEmbed selectById(Long id);
ExtraReportQuickbiEmbed selectByPageId(String pageId);
List<ExtraReportQuickbiEmbed> selectAll();
int deleteById(Long id);
void update(ExtraReportQuickbiEmbed entity);
}
package com.link.report.domain.dao.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.link.report.domain.dao.ExtraReportQuickbiEmbedDao;
import com.link.report.domain.entity.ExtraReportQuickbiEmbed;
import com.link.report.domain.mapper.ExtraReportQuickbiEmbedMapper;
import org.springframework.stereotype.Repository;
import javax.annotation.Resource;
import java.util.List;
/**
* QuickBI报表嵌入信息 DAO层
* 负责与数据库交互,通过mapper执行CRUD操作
*/
@Repository
public class ExtraReportQuickbiEmbedDaoImpl implements ExtraReportQuickbiEmbedDao {
@Resource
private ExtraReportQuickbiEmbedMapper extraReportQuickbiEmbedMapper;
/**
* 新增报表嵌入信息
*
* @param entity 报表嵌入信息实体
* @return 影响行数
*/
@Override
public int insert(ExtraReportQuickbiEmbed entity) {
return extraReportQuickbiEmbedMapper.insert(entity);
}
/**
* 更新报表嵌入信息
*
* @param entity 报表嵌入信息实体(含更新条件)
* @return 影响行数
*/
@Override
public int updateById(ExtraReportQuickbiEmbed entity) {
return extraReportQuickbiEmbedMapper.updateById(entity);
}
/**
* 根据ID查询报表嵌入信息
*
* @param id 主键ID
* @return 报表嵌入信息实体
*/
@Override
public ExtraReportQuickbiEmbed selectById(Long id) {
return extraReportQuickbiEmbedMapper.selectById(id);
}
/**
* 根据pageId查询报表嵌入信息
*
* @param pageId QuickBI报表唯一标识ID
* @return 报表嵌入信息实体
*/
@Override
public ExtraReportQuickbiEmbed selectByPageId(String pageId) {
QueryWrapper<ExtraReportQuickbiEmbed> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("page_id", pageId); // 匹配数据库字段page_id
return extraReportQuickbiEmbedMapper.selectOne(queryWrapper);
}
/**
* 查询所有报表嵌入信息
*
* @return 报表嵌入信息列表
*/
@Override
public List<ExtraReportQuickbiEmbed> selectAll() {
return extraReportQuickbiEmbedMapper.selectList(null);
}
/**
* 根据ID删除报表嵌入信息(逻辑删除)
*
* @param id 主键ID
* @return 影响行数
*/
@Override
public int deleteById(Long id) {
return extraReportQuickbiEmbedMapper.deleteById(id);
}
@Override
public void update(ExtraReportQuickbiEmbed entity) {
extraReportQuickbiEmbedMapper.updateById(entity);
}
}
package com.link.report.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.link.report.pojo.request.ExtraReportQuickbiEmbedBo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* QuickBI报表嵌入信息表实体类
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("extra_report_quickbi_embed")
public class ExtraReportQuickbiEmbed implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* QuickBI报表名称
*/
private String name;
/**
* 报表预览访问地址
*/
private String previewUrl;
/**
* QuickBI报表唯一标识ID
*/
private String pageId;
/**
* 报表访问凭证(临时票据)
*/
private String accessTicket;
/**
* 报表类型,如:普通报表、仪表盘、数据门户等
*/
private String reportType;
/**
* 创建人(用户账号/ID)
*/
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 更新人(用户账号/ID)
*/
private String updateBy;
/**
* 更新时间(自动更新)
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
/**
* 删除标识:0-未删除 1-已删除(软删除)
*/
@TableLogic
private Integer delFlag;
public void create() {
}
public void updateFromBo(ExtraReportQuickbiEmbedBo bo) {
}
public void markAsDeleted() {
}
}
package com.link.report.domain.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.link.report.domain.entity.ExtraReportQuickbiEmbed;
import org.apache.ibatis.annotations.Mapper;
/**
* QuickBI报表嵌入信息表 Mapper 接口
*/
@Mapper
public interface ExtraReportQuickbiEmbedMapper extends BaseMapper<ExtraReportQuickbiEmbed> {
}
package com.link.report.pojo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* QuickBI报表嵌入信息DTO
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class ExtraReportQuickbiEmbedDto implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
private Long id;
/**
* QuickBI报表名称
*/
private String name;
/**
* 报表预览访问地址
*/
private String previewUrl;
/**
* QuickBI报表唯一标识ID
*/
private String pageId;
/**
* 报表访问凭证(临时票据)
*/
private String accessTicket;
/**
* 报表类型,如:普通报表、仪表盘、数据门户等
*/
private String reportType;
/**
* 创建人(用户账号/ID)
*/
private String createBy;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新人(用户账号/ID)
*/
private String updateBy;
/**
* 更新时间(自动更新)
*/
private LocalDateTime updateTime;
}
package com.link.report.pojo.dto;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* QuickBI报表嵌入信息DTO
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class ExtraReportQuickbiEmbedDto implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
private Long id;
/**
* QuickBI报表名称
*/
private String name;
/**
* 报表预览访问地址
*/
private String previewUrl;
/**
* QuickBI报表唯一标识ID
*/
private String pageId;
/**
* 报表访问凭证(临时票据)
*/
private String accessTicket;
/**
* 报表类型,如:普通报表、仪表盘、数据门户等
*/
private String reportType;
/**
* 创建人(用户账号/ID)
*/
private String createBy;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新人(用户账号/ID)
*/
private String updateBy;
/**
* 更新时间(自动更新)
*/
private LocalDateTime updateTime;
}
package com.link.report.pojo.request;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* QuickBI报表嵌入信息BO
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class ExtraReportQuickbiEmbedBo implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
/**
* QuickBI报表名称
*/
private String name;
/**
* 报表预览访问地址
*/
private String previewUrl;
/**
* QuickBI报表唯一标识ID
*/
private String pageId;
/**
* 报表访问凭证(临时票据)
*/
private String accessTicket;
/**
* 报表类型,如:普通报表、仪表盘、数据门户等
*/
private String reportType;
}
package com.link.report.pojo.response;
import com.link.report.domain.entity.ExtraReportQuickbiEmbed;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* QuickBI报表嵌入信息VO
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class ExtraReportQuickbiEmbedVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
private Long id;
/**
* QuickBI报表名称
*/
private String name;
/**
* 报表预览访问地址
*/
private String previewUrl;
/**
* QuickBI报表唯一标识ID
*/
private String pageId;
/**
* 报表访问凭证(临时票据)
*/
private String accessTicket;
/**
* 报表类型,如:普通报表、仪表盘、数据门户等
*/
private String reportType;
/**
* 创建人(用户账号/ID)
*/
private String createBy;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新人(用户账号/ID)
*/
private String updateBy;
/**
* 更新时间(自动更新)
*/
private LocalDateTime updateTime;
public static ExtraReportQuickbiEmbedVo convertEntityToVo(ExtraReportQuickbiEmbed entity) {
ExtraReportQuickbiEmbedVo vo = new ExtraReportQuickbiEmbedVo();
// 设置属性值...
vo.setId(entity.getId());
vo.setName(entity.getName());
vo.setPreviewUrl(entity.getPreviewUrl());
vo.setPageId(entity.getPageId());
vo.setAccessTicket(entity.getAccessTicket());
vo.setReportType(entity.getReportType());
vo.setCreateBy(entity.getCreateBy());
vo.setCreateTime(entity.getCreateTime());
vo.setUpdateBy(entity.getUpdateBy());
vo.setUpdateTime(entity.getUpdateTime());
return vo;
}
}
package com.link.report.service.query;
import com.baomidou.mybatisplus.extension.service.IService;
import com.link.report.domain.entity.ExtraReportQuickbiEmbed;
import com.link.report.pojo.request.ExtraReportQuickbiEmbedBo;
import com.link.report.pojo.response.ExtraReportQuickbiEmbedVo;
import java.util.List;
/**
* QuickBI报表嵌入信息服务接口
*/
public interface ExtraReportQuickbiEmbedService extends IService<ExtraReportQuickbiEmbed> {
/**
* 新增QuickBI报表嵌入信息
*/
ExtraReportQuickbiEmbedVo insert(ExtraReportQuickbiEmbedBo bo);
/**
* 更新QuickBI报表嵌入信息
*/
ExtraReportQuickbiEmbedVo update(ExtraReportQuickbiEmbedBo bo);
/**
* 根据ID查询QuickBI报表嵌入信息
*/
ExtraReportQuickbiEmbedVo getById(Long id);
/**
* 根据pageId查询QuickBI报表嵌入信息
*/
ExtraReportQuickbiEmbedVo getByPageId(String pageId);
/**
* 查询所有QuickBI报表嵌入信息列表
*/
List<ExtraReportQuickbiEmbedVo> listAll();
/**
* 删除QuickBI报表嵌入信息(软删除)
*/
boolean deleteById(Long id);
ExtraReportQuickbiEmbedVo queryAccessTicket(Long id);
}
package com.link.report.service.query.impl;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.http.Method;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.link.report.config.ExtraQuickBiConfig;
import com.link.report.domain.dao.ExtraReportQuickbiEmbedDao;
import com.link.report.domain.entity.ExtraReportQuickbiEmbed;
import com.link.report.pojo.request.ExtraReportQuickbiEmbedBo;
import com.link.report.pojo.response.ExtraReportQuickbiEmbedVo;
import com.link.report.service.query.ExtraReportQuickbiEmbedService;
import com.sfa.common.core.exception.ServiceException;
import com.sfa.common.redis.service.RedisService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* QuickBI报表嵌入信息服务实现类
*/
@Slf4j
@Service
public class ExtraReportQuickbiEmbedServiceImpl implements ExtraReportQuickbiEmbedService {
@Resource
private final ExtraReportQuickbiEmbedDao extraReportQuickbiEmbedDao;
@Resource
private ExtraQuickBiConfig extraQuickBiConfig;
@Resource
private RedisService cacheService;
@Autowired
public ExtraReportQuickbiEmbedServiceImpl(ExtraReportQuickbiEmbedDao extraReportQuickbiEmbedDao) {
this.extraReportQuickbiEmbedDao = extraReportQuickbiEmbedDao;
}
/**
* 新增QuickBI报表嵌入信息
*/
@Override
public ExtraReportQuickbiEmbedVo insert(ExtraReportQuickbiEmbedBo bo) {
// 领域对象转换与业务逻辑处理
ExtraReportQuickbiEmbed entity = convertBoToEntity(bo);
entity.create(); // 调用领域对象行为
// 通过DAO进行数据持久化
extraReportQuickbiEmbedDao.insert(entity);
return ExtraReportQuickbiEmbedVo.convertEntityToVo(entity);
}
/**
* 更新QuickBI报表嵌入信息
*/
@Override
public ExtraReportQuickbiEmbedVo update(ExtraReportQuickbiEmbedBo bo) {
ExtraReportQuickbiEmbed entity = extraReportQuickbiEmbedDao.selectById(bo.getId());
if (entity == null) {
throw new RuntimeException("记录不存在");
}
// 领域对象更新与业务逻辑处理
entity.updateFromBo(bo); // 调用领域对象行为
extraReportQuickbiEmbedDao.update(entity);
return ExtraReportQuickbiEmbedVo.convertEntityToVo(entity);
}
/**
* 根据ID查询QuickBI报表嵌入信息
*/
@Override
public ExtraReportQuickbiEmbedVo getById(Long id) {
ExtraReportQuickbiEmbed entity = extraReportQuickbiEmbedDao.selectById(id);
return entity != null ? ExtraReportQuickbiEmbedVo.convertEntityToVo(entity) : null;
}
/**
* 根据pageId查询QuickBI报表嵌入信息
*/
@Override
public ExtraReportQuickbiEmbedVo getByPageId(String pageId) {
ExtraReportQuickbiEmbed entity = extraReportQuickbiEmbedDao.selectByPageId(pageId);
return entity != null ? ExtraReportQuickbiEmbedVo.convertEntityToVo(entity) : null;
}
/**
* 查询所有QuickBI报表嵌入信息列表
*/
@Override
public List<ExtraReportQuickbiEmbedVo> listAll() {
List<ExtraReportQuickbiEmbed> entities = extraReportQuickbiEmbedDao.selectAll();
return entities.stream()
.map(ExtraReportQuickbiEmbedVo::convertEntityToVo)
.collect(Collectors.toList());
}
/**
* 删除QuickBI报表嵌入信息(软删除)
*/
@Override
public boolean deleteById(Long id) {
ExtraReportQuickbiEmbed entity = extraReportQuickbiEmbedDao.selectById(id);
if (entity == null) {
return false;
}
entity.markAsDeleted(); // 调用领域对象行为
extraReportQuickbiEmbedDao.update(entity);
return true;
}
@Override
public ExtraReportQuickbiEmbedVo queryAccessTicket(Long id) {
// 查询workId
ExtraReportQuickbiEmbed entity = extraReportQuickbiEmbedDao.selectById(id);
if (entity == null) {
log.error("记录不存在,id:{}", id);
throw new ServiceException("记录不存在");
}
String workId = entity.getPageId();
// 保存accessTicket
String accessTicketNew = checkAccessTicketExist(workId);
entity.setAccessTicket(accessTicketNew);
extraReportQuickbiEmbedDao.update(entity);
ExtraReportQuickbiEmbedVo vo = ExtraReportQuickbiEmbedVo.convertEntityToVo(entity);
return vo;
}
/**
* 检查accessTicket
* 缓存中不存在则从QuickBI获取accessTicket
* @param workId
* @return
*/
private String checkAccessTicketExist(String workId) {
// 从配置中获取appId和appSecret
String accessId = extraQuickBiConfig.getAccessId();
String accessKey = extraQuickBiConfig.getAccessKey();
String aliyunUid = extraQuickBiConfig.getAliyunUid();
// 从缓存中获取
String accessTicketCache = cacheService.getCacheObject(getRedisKey(workId));
if (accessTicketCache != null) {
return accessTicketCache;
}
String url = String.format("https://bi.aliyun.com/openapi/ac3rd/ticket/create?worksId=%s&aliyunUid=%s&accessKey=%s&accessId=%s&validityTime=%s",
workId, aliyunUid, accessKey, accessId, "240");
String body = HttpUtil.createRequest(Method.GET, url)
.execute()
.body();
log.info("获取accessTicket结果:{}", body);
JSONObject jsonObject = JSONObject.parseObject(body);
String code = jsonObject.getString("code");
if (ObjectUtil.isEmpty(code) || !code.equals("0")){
throw new ServiceException("获取accessTicket失败");
}
String accessTicketNew = jsonObject.getJSONObject("data").getString("accessTicket");
// 缓存更新
cacheService.setCacheObject(getRedisKey(workId), accessTicketNew, 240L, TimeUnit.MINUTES);
return accessTicketNew;
}
private String getRedisKey(String workId) {
return "extra:report:quickbi:accessTicket:" + workId ;
}
// 对象转换方法
private ExtraReportQuickbiEmbed convertBoToEntity(ExtraReportQuickbiEmbedBo bo) {
ExtraReportQuickbiEmbed entity = new ExtraReportQuickbiEmbed();
// 设置属性值...
entity.setName(bo.getName());
entity.setPreviewUrl(bo.getPreviewUrl());
entity.setPageId(bo.getPageId());
entity.setAccessTicket(bo.getAccessTicket());
entity.setReportType(bo.getReportType());
return entity;
}
@Override
public boolean saveBatch(Collection<ExtraReportQuickbiEmbed> entityList, int batchSize) {
return false;
}
@Override
public boolean saveOrUpdateBatch(Collection<ExtraReportQuickbiEmbed> entityList, int batchSize) {
return false;
}
@Override
public boolean updateBatchById(Collection<ExtraReportQuickbiEmbed> entityList, int batchSize) {
return false;
}
@Override
public boolean saveOrUpdate(ExtraReportQuickbiEmbed entity) {
return false;
}
@Override
public ExtraReportQuickbiEmbed getOne(Wrapper<ExtraReportQuickbiEmbed> queryWrapper, boolean throwEx) {
return null;
}
@Override
public Map<String, Object> getMap(Wrapper<ExtraReportQuickbiEmbed> queryWrapper) {
return null;
}
@Override
public <V> V getObj(Wrapper<ExtraReportQuickbiEmbed> queryWrapper, Function<? super Object, V> mapper) {
return null;
}
@Override
public BaseMapper<ExtraReportQuickbiEmbed> getBaseMapper() {
return null;
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论