ReportVersionServiceImpl.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. package jnpf.service.impl;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import cn.hutool.http.Method;
  4. import cn.hutool.json.JSONUtil;
  5. import com.alibaba.fastjson.JSON;
  6. import com.baomidou.dynamic.datasource.annotation.DSTransactional;
  7. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  8. import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
  9. import com.google.common.collect.ImmutableList;
  10. import jnpf.base.ActionResult;
  11. import jnpf.base.service.SuperServiceImpl;
  12. import jnpf.constant.FileTypeConstant;
  13. import jnpf.constant.MsgCode;
  14. import jnpf.consts.ApiConst;
  15. import jnpf.emnus.DataSetTypeEnum;
  16. import jnpf.entity.FileParameter;
  17. import jnpf.entity.ReportEntity;
  18. import jnpf.entity.ReportVersionEntity;
  19. import jnpf.exception.DataException;
  20. import jnpf.mapper.ReportVersionMapper;
  21. import jnpf.model.DataQuery;
  22. import jnpf.model.data.*;
  23. import jnpf.model.report.ReportCrForm;
  24. import jnpf.model.report.ReportPagination;
  25. import jnpf.model.report.UploaderVO;
  26. import jnpf.service.ReportService;
  27. import jnpf.service.ReportVersionService;
  28. import jnpf.univer.chart.UniverChartModel;
  29. import jnpf.univer.data.custom.UniverCustom;
  30. import jnpf.univer.model.UniverPreview;
  31. import jnpf.univer.model.UniverWorkBook;
  32. import jnpf.util.*;
  33. import lombok.Cleanup;
  34. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  35. import org.dromara.x.file.storage.core.FileInfo;
  36. import org.springframework.beans.factory.annotation.Autowired;
  37. import org.springframework.stereotype.Service;
  38. import org.springframework.web.multipart.MultipartFile;
  39. import java.io.ByteArrayOutputStream;
  40. import java.io.IOException;
  41. import java.util.*;
  42. import java.util.stream.Collectors;
  43. /**
  44. * @author :JNPF开发平台组
  45. * @version: V3.1.0
  46. * @copyright 引迈信息技术有限公司
  47. * @date :2024/5/11 下午4:35
  48. */
  49. @Service
  50. public class ReportVersionServiceImpl extends SuperServiceImpl<ReportVersionMapper, ReportVersionEntity> implements ReportVersionService {
  51. @Autowired
  52. private RedisUtil redisUtil;
  53. @Autowired
  54. private ReportService reportService;
  55. @Override
  56. @DSTransactional
  57. public void create(ReportCrForm form) {
  58. String versionId = RandomUtil.uuId();
  59. ReportVersionEntity entity = JsonUtil.getJsonToBean(form, ReportVersionEntity.class);
  60. entity.setId(versionId);
  61. entity.setTemplateId(form.getId());
  62. entity.setCreatorUserId(UserProvider.getLoginUserId());
  63. entity.setCreatorTime(new Date());
  64. List<ReportVersionEntity> verList = getList(entity.getId(), ReportVersionEntity::getVersion);
  65. int version = verList.stream().map(ReportVersionEntity::getVersion).max(Comparator.naturalOrder()).orElse(0) + 1;
  66. entity.setVersion(version);
  67. entity.setState(0);
  68. entity.setSortCode(0l);
  69. this.setIgnoreLogicDelete().removeById(entity.getId());
  70. this.setIgnoreLogicDelete().saveOrUpdate(entity);
  71. this.clearIgnoreLogicDelete();
  72. List<DataSetInfo> dataSetList = form.getDataSetList() != null ? form.getDataSetList() : new ArrayList<>();
  73. if (dataSetList.size() > 0) {
  74. //数据集创建
  75. DataForm dataForm = new DataForm();
  76. dataForm.setObjectId(versionId);
  77. dataForm.setObjectType(DataSetTypeEnum.REPORT_VER.getCode());
  78. dataForm.setList(dataSetList);
  79. ReportUtil.http(ApiConst.DATASET_SAVE, Method.POST, JsonUtil.entityToMap(dataForm));
  80. }
  81. }
  82. @Override
  83. public List<ReportVersionEntity> getList(String templateId, SFunction<ReportVersionEntity, ?>... columns) {
  84. QueryWrapper<ReportVersionEntity> queryWrapper = new QueryWrapper<>();
  85. if (columns != null && columns.length > 0) {
  86. queryWrapper.lambda().select(columns);
  87. }
  88. queryWrapper.lambda().eq(ReportVersionEntity::getTemplateId, templateId);
  89. queryWrapper.lambda().orderByDesc(ReportVersionEntity::getSortCode).orderByAsc(ReportVersionEntity::getState);
  90. return this.list(queryWrapper);
  91. }
  92. @Override
  93. public String copyVersion(String versionId) {
  94. ReportVersionEntity entity = this.getById(versionId);
  95. ReportVersionEntity versionEntity = JsonUtil.getJsonToBean(entity, ReportVersionEntity.class);
  96. String newVersionId = RandomUtil.uuId();
  97. versionEntity.setId(newVersionId);
  98. List<ReportVersionEntity> verList = getList(entity.getTemplateId(), ReportVersionEntity::getVersion);
  99. int version = verList.stream().map(ReportVersionEntity::getVersion).max(Comparator.naturalOrder()).orElse(0) + 1;
  100. versionEntity.setVersion(version);
  101. versionEntity.setState(0);
  102. versionEntity.setSortCode(0l);
  103. versionEntity.setCreatorTime(new Date());
  104. versionEntity.setCreatorUserId(UserProvider.getLoginUserId());
  105. versionEntity.setLastModifyTime(null);
  106. versionEntity.setLastModifyUserId(null);
  107. DataSetPagination pagination = new DataSetPagination();
  108. pagination.setObjectId(versionId);
  109. pagination.setObjectType(DataSetTypeEnum.REPORT_VER.getCode());
  110. String json = ReportUtil.http(ApiConst.DATASET_LIST, Method.GET, JsonUtil.entityToMap(pagination));
  111. ActionResult result = JsonUtil.getJsonToBean(json, ActionResult.class);
  112. List<DataSetInfo> dataSetList = new ArrayList<>();
  113. if (ObjectUtil.isNotEmpty(result.getData())) {
  114. dataSetList.addAll(JsonUtil.getJsonToList(result.getData(), DataSetInfo.class));
  115. }
  116. if (dataSetList.size() > 0) {
  117. for (DataSetInfo item : dataSetList) {
  118. item.setId(null);
  119. item.setObjectType(DataSetTypeEnum.REPORT_VER.getCode());
  120. item.setObjectId(newVersionId);
  121. }
  122. DataForm dataForm = new DataForm();
  123. dataForm.setObjectId(newVersionId);
  124. dataForm.setObjectType(DataSetTypeEnum.REPORT_VER.getCode());
  125. dataForm.setList(dataSetList);
  126. ReportUtil.http(ApiConst.DATASET_SAVE, Method.POST, JsonUtil.entityToMap(dataForm));
  127. }
  128. this.save(versionEntity);
  129. return newVersionId;
  130. }
  131. @Override
  132. public void removeByTemplateId(String templateId) {
  133. QueryWrapper<ReportVersionEntity> queryWrapper = new QueryWrapper<>();
  134. queryWrapper.lambda().eq(ReportVersionEntity::getTemplateId, templateId);
  135. this.remove(queryWrapper);
  136. }
  137. @Override
  138. public UniverPreview preview(String id, ReportPagination pagination, Map<String, Object> params) {
  139. ReportVersionEntity entity = getById(id);
  140. if (ObjectUtil.isEmpty(entity)) {
  141. throw new DataException(MsgCode.FA015.get());
  142. }
  143. if (ObjectUtil.isEmpty(entity.getSnapshot())) {
  144. throw new DataException(MsgCode.FA105.get());
  145. }
  146. //获取当前
  147. UniverWorkBook univerWorkBook = JsonUtil.getJsonToBean(entity.getSnapshot(), UniverWorkBook.class);
  148. List<String> sheetOrder = univerWorkBook.getSheetOrder();
  149. ReportEntity report = reportService.getById(entity.getTemplateId());
  150. Map<String, Map<String, List<Map<String, Object>>>> sheetData = new HashMap<>();
  151. Map<String, Map<String, Map<String, Object>>> parameterData = new HashMap<>();
  152. //当前数据
  153. String sheet = StringUtil.isNotEmpty(pagination.getSheetId()) ? pagination.getSheetId() : !sheetOrder.isEmpty() ? sheetOrder.get(0) : null;
  154. for (String sheetId : sheetOrder) {
  155. DataSetQuery query = new DataSetQuery();
  156. query.setModuleId(entity.getTemplateId());
  157. query.setId(id);
  158. Map<String, Object> dataMap = new HashMap<>(params);
  159. query.setMap(dataMap);
  160. query.setType(DataSetTypeEnum.REPORT_VER.getCode());
  161. query.setSnowFlakeId(RandomUtil.uuId());
  162. query.setConvertConfig(entity.getConvertConfig());
  163. List<DataQuery> dataQueryList = StringUtil.isNotEmpty(entity.getQueryList()) ? JsonUtil.getJsonToList(entity.getQueryList(), DataQuery.class) : new ArrayList<>();
  164. Map<String, List<DataQuery>> queryMap = dataQueryList.stream().collect(Collectors.groupingBy(DataQuery::getSheet));
  165. List<DataQuery> queryListAll = queryMap.get(sheetId) != null ? queryMap.get(sheetId) : new ArrayList<>();
  166. List<Object> queryList = new ArrayList<>();
  167. if (Objects.equals(sheetId, sheet)) {
  168. for (DataQuery dataQuery : queryListAll) {
  169. queryList.addAll(dataQuery.getQueryList());
  170. }
  171. }
  172. query.setQueryList(JSONUtil.toJsonStr(queryList));
  173. String sheetJson = ReportUtil.http(ApiConst.DATASET_DATA, Method.POST, JsonUtil.entityToMap(query));
  174. if (StringUtil.isNotEmpty(sheetJson)) {
  175. Map<String, List<Map<String, Object>>> dataList = new HashMap<>();
  176. try {
  177. ActionResult result = JsonUtil.getJsonToBean(sheetJson, ActionResult.class);
  178. if (ObjectUtil.isNotEmpty(result) && result.getData() instanceof Map) {
  179. Map<String, List<Map<String, Object>>> data = JsonUtil.getJsonToBean(result.getData(), Map.class);
  180. dataList.putAll(data);
  181. }
  182. } catch (Exception e) {}
  183. sheetData.put(sheetId, dataList);
  184. }
  185. //参数数据
  186. String parameterJson = ReportUtil.http(ApiConst.PARAMETER_DATA, Method.POST, JsonUtil.entityToMap(query));
  187. if (StringUtil.isNotEmpty(parameterJson)) {
  188. Map<String, Map<String, Object>> dataList = new HashMap<>();
  189. try {
  190. ActionResult result = JsonUtil.getJsonToBean(parameterJson, ActionResult.class);
  191. if (ObjectUtil.isNotEmpty(result) && result.getData() instanceof Map) {
  192. Map data = JsonUtil.getJsonToBean(result.getData(), Map.class);
  193. dataList.putAll(data);
  194. }
  195. } catch (Exception e) {
  196. log.error(e.getMessage());
  197. }
  198. parameterData.put(sheetId, dataList);
  199. }
  200. }
  201. UniverConvert convert = new UniverConvert();
  202. UniverPreview vo = convert.transform(entity.getSnapshot(), entity.getCells(), entity.getSortList(), entity.getFenceList(),sheetData, parameterData);
  203. vo.setVersionId(id);
  204. vo.setQueryList(entity.getQueryList());
  205. vo.setAllowWatermark(report.getAllowWatermark());
  206. vo.setWatermarkConfig(report.getWatermarkConfig());
  207. vo.setFullName(report.getFullName());
  208. vo.setAllowExport(report.getAllowExport());
  209. vo.setAllowPrint(report.getAllowPrint());
  210. return vo;
  211. }
  212. @Override
  213. public UniverPreview previewTemplate(String id, ReportPagination pagination, Map<String, Object> params) {
  214. ReportVersionEntity entity = getList(id, ReportVersionEntity::getId, ReportVersionEntity::getState).stream().filter(t -> Objects.equals(t.getState(), 1)).findFirst().orElse(null);
  215. if (ObjectUtil.isEmpty(entity)) {
  216. throw new DataException(MsgCode.FA015.get());
  217. }
  218. return preview(entity.getId(), pagination, params);
  219. }
  220. @Override
  221. public UniverPreview importExcel(MultipartFile multipartFile) throws IOException {
  222. UniverCustom cellData = new UniverCustom();
  223. UniverWorkBook univerWorkBook = UniverExcel.formFile(multipartFile);
  224. UniverPreview vo = new UniverPreview();
  225. vo.setSnapshot(JSONUtil.toJsonStr(univerWorkBook));
  226. vo.setCells(JSONUtil.toJsonStr(cellData));
  227. return vo;
  228. }
  229. @Override
  230. public UploaderVO downExcel(ReportPagination pagination, Map<String, Object> params) {
  231. String id = pagination.getId();
  232. UploaderVO vo = new UploaderVO();
  233. ReportVersionEntity versionEntity = getById(id);
  234. if (ObjectUtil.isEmpty(versionEntity)) {
  235. return vo;
  236. }
  237. ReportEntity entity = reportService.getById(versionEntity.getTemplateId());
  238. UniverPreview preview = preview(id, pagination, params);
  239. pagination.setSnapshot(preview.getSnapshot());
  240. pagination.setFullName(entity.getFullName());
  241. vo = downExcel(pagination);
  242. return vo;
  243. }
  244. @Override
  245. public UploaderVO downExcel(ReportPagination pagination) {
  246. UploaderVO vo = new UploaderVO();
  247. if (StringUtil.isNotEmpty(pagination.getSnapshot())) {
  248. try {
  249. List<UniverChartModel> chartList = new ArrayList<>();
  250. @Cleanup XSSFWorkbook workbook = new XSSFWorkbook();
  251. List<String> sheetList = Arrays.asList(pagination.getSheetId().split(","));
  252. UniverExcel.downExcel(pagination.getSnapshot(), chartList, workbook, sheetList);
  253. String fileName = pagination.getFullName() + ".xlsx";
  254. @Cleanup ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
  255. workbook.write(outputStream);
  256. String url = "/api/Report/data/Download?name=" + fileName + "&encryption=";
  257. FileInfo fileInfo = FileUploadUtils.uploadFile(new FileParameter(FileTypeConstant.TEMPORARY, fileName), outputStream.toByteArray());
  258. vo.setName(fileInfo.getFilename());
  259. vo.setUrl(UploaderUtil.uploaderFile(url, fileInfo.getFilename() + "#" + FileTypeConstant.TEMPORARY));
  260. } catch (Exception e) {
  261. log.error("报表导出excel异常:" + e.getMessage());
  262. throw new DataException(MsgCode.FA107.get());
  263. }
  264. }
  265. return vo;
  266. }
  267. }