DataMigrationController.java 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package com.persagy.proxy.migration.controller;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import com.alibaba.excel.EasyExcel;
  5. import com.alibaba.excel.ExcelWriter;
  6. import com.alibaba.excel.write.metadata.WriteSheet;
  7. import com.persagy.dmp.common.constant.ResponseCode;
  8. import com.persagy.dmp.common.exception.BusinessException;
  9. import com.persagy.proxy.adm.request.AdmQueryCriteria;
  10. import com.persagy.proxy.adm.request.AdmResponse;
  11. import com.persagy.proxy.adm.utils.AdmContextUtil;
  12. import com.persagy.proxy.common.entity.InstanceUrlParam;
  13. import com.persagy.proxy.migration.handler.DataMigrationHandler;
  14. import com.persagy.proxy.migration.model.DataMigrationExcel;
  15. import com.persagy.proxy.migration.model.MigrationInfo;
  16. import com.persagy.proxy.object.model.AdmProject;
  17. import com.persagy.proxy.object.service.IAdmProjectService;
  18. import lombok.RequiredArgsConstructor;
  19. import lombok.extern.slf4j.Slf4j;
  20. import org.springframework.web.bind.annotation.GetMapping;
  21. import org.springframework.web.bind.annotation.RequestBody;
  22. import org.springframework.web.bind.annotation.RequestMapping;
  23. import org.springframework.web.bind.annotation.RestController;
  24. import javax.servlet.http.HttpServletResponse;
  25. import java.net.URLEncoder;
  26. import java.nio.charset.StandardCharsets;
  27. import java.util.List;
  28. import java.util.Map;
  29. /**
  30. * @author lvxianyun
  31. * @title: adm 交付的数据同步到现场,TODO 需要提供中台的连接,可以使用接口传,也可以配置在项目中
  32. * @projectName adm-middleware
  33. * @description: 该方式会覆盖被同步方数据(以adm交付为主)
  34. * @date 2021/12/1 16:07
  35. */
  36. @Slf4j
  37. @RestController
  38. @RequestMapping("/data/migration")
  39. @RequiredArgsConstructor
  40. public class DataMigrationController {
  41. private final DataMigrationHandler dataMigrationHandler;
  42. private final IAdmProjectService projectService;
  43. /**
  44. *
  45. * @param response
  46. * @migrationInfo :
  47. * targetUrl 现场中台调用的url, eg:http://develop.persagy.com/dmp-rwd
  48. * targetGroupCode 现场集团编码
  49. * targetProjectId 现场项目id
  50. */
  51. @GetMapping
  52. public void migrate(HttpServletResponse response, @RequestBody MigrationInfo migrationInfo) {
  53. //调用服务迁移数据,返回处理结果excel
  54. try {
  55. InstanceUrlParam context = AdmContextUtil.toDmpContext();
  56. context.setGroupCode(migrationInfo.getTargetGroupCode());
  57. response.setContentType("application/vnd.ms-excel");
  58. String encode = StandardCharsets.UTF_8.name();
  59. response.setCharacterEncoding(encode);
  60. if(migrationInfo == null || StrUtil.isBlank(migrationInfo.getTargetUrl())){
  61. throw new BusinessException(ResponseCode.A0402.getCode(), ResponseCode.A0402.getDesc());
  62. }
  63. if(StrUtil.isBlank(migrationInfo.getTargetGroupCode())){
  64. migrationInfo.setTargetGroupCode(context.getGroupCode());
  65. }
  66. if(StrUtil.isBlank(migrationInfo.getTargetProjectId())){
  67. migrationInfo.setTargetProjectId(context.getProjectId());
  68. }
  69. Map<String,List<DataMigrationExcel>> results = dataMigrationHandler.handle(context, migrationInfo);
  70. AdmQueryCriteria projectRequest = new AdmQueryCriteria();
  71. projectRequest.setName(AdmProject.OBJ_TYPE);
  72. projectRequest.setFilters("id = '" + context.getProjectId() + "';");
  73. AdmResponse responsePro = projectService.doQuery(AdmContextUtil.toDmpContext(), projectRequest, AdmProject.class);
  74. if (CollUtil.isEmpty(responsePro.getContent())) {
  75. throw new BusinessException(ResponseCode.A0402.getCode(), ResponseCode.A0402.getDesc());
  76. } else {
  77. AdmProject admProject = (AdmProject) responsePro.getContent().get(0);
  78. // 防止中文乱码
  79. String fileName = admProject.getLocalName() + "_数据迁移";
  80. fileName = URLEncoder.encode(fileName, encode);
  81. response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
  82. //每个迁移的表写成一个sheet
  83. if(CollUtil.isNotEmpty(results)){
  84. int sheetNo = 0;
  85. ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), DataMigrationExcel.class).build();
  86. try {
  87. for (String sheet : results.keySet()) {
  88. WriteSheet writeSheet = EasyExcel.writerSheet(sheetNo, sheet).build();
  89. excelWriter.write(results.get(sheet), writeSheet);
  90. sheetNo++;
  91. }
  92. } finally {
  93. if (excelWriter != null) {
  94. excelWriter.finish();
  95. }
  96. }
  97. }
  98. }
  99. } catch (Exception e) {
  100. log.error("数据迁移失败",e);
  101. }
  102. }
  103. }