Browse Source

Merge branch 'dev_jmreport'

# Conflicts:
#	epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/ServiceConstant.java
#	epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/HouseService.java
#	epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java
master
wangxianzhang 3 years ago
parent
commit
975d1f1c31
  1. 5
      epmet-admin/epmet-admin-server/src/main/resources/db/migration/V0.0.22__jmreport_category.sql
  2. 24
      epmet-commons/epmet-commons-feignclient/pom.xml
  3. 0
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/.gitkeep
  4. 0
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/.gitkeep
  5. 22
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/JiMuPage.java
  6. 20
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/JiMuResult.java
  7. 33
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/form/JiMuReportFormDTO.java
  8. 27
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/form/JimuReportExportRequestDTO.java
  9. 31
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/result/JiMuReportDetailResultDTO.java
  10. 26
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/result/JiMuReportResultDTO.java
  11. 18
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/result/JimuReportDbDataResultDTO.java
  12. 26
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/result/JimuReportFieldTreeResultDTO.java
  13. 0
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/feigns/.gitkeep
  14. 47
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/feigns/JiMuReportOpenFeignClient.java
  15. 51
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/feigns/fallback/JiMuReportOpenFeignClientFallback.java
  16. 24
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/feigns/fallback/JiMuReportOpenFeignClientFallbackFactory.java
  17. 13
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/annotation/ReportRequest.java
  18. 86
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aspect/ReportRequestAspect.java
  19. 5
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/ServiceConstant.java
  20. 4
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/form/DictListFormDTO.java
  21. 2
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/EpmetBaseRequestInterceptor.java
  22. 7
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/page/PageData.java
  23. 9
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/EpmetRequestHolder.java
  24. 28
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/HttpClientManager.java
  25. 13
      epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/ReportHouseTestFormDTO.java
  26. 14
      epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/ReportHouseTestResultDTO.java
  27. 2
      epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java
  28. 45
      epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/ReportController.java
  29. 2
      epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/HouseService.java
  30. 20
      epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java
  31. 65
      epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcCustomerReportDTO.java
  32. 64
      epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcReportFunDTO.java
  33. 29
      epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/PreviewReportFormDTO.java
  34. 22
      epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/ReportBatchExportFormDTO.java
  35. 45
      epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/ReportEditFormDTO.java
  36. 21
      epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/ReportListFormDTO.java
  37. 18
      epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/PreviewReportResDTO.java
  38. 94
      epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/ReportResultDTO.java
  39. 1
      epmet-module/oper-customize/oper-customize-server/deploy/docker-compose-dev.yml
  40. 5
      epmet-module/oper-customize/oper-customize-server/pom.xml
  41. 5
      epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/constant/CustomerFunctionConstant.java
  42. 108
      epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcCustomerReportController.java
  43. 70
      epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcReportFunController.java
  44. 40
      epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcCustomerReportDao.java
  45. 16
      epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcReportFunDao.java
  46. 31
      epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcCustomerReportEntity.java
  47. 34
      epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcReportFunEntity.java
  48. 55
      epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcCustomerReportService.java
  49. 78
      epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcReportFunService.java
  50. 542
      epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcCustomerReportServiceImpl.java
  51. 82
      epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcReportFunServiceImpl.java
  52. 12
      epmet-module/oper-customize/oper-customize-server/src/main/resources/db/migration/V0.0.36__ic_customer_report.sql
  53. 12
      epmet-module/oper-customize/oper-customize-server/src/main/resources/db/migration/V0.0.37__ic_report_fun.sql
  54. 61
      epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcCustomerReportDao.xml
  55. 6
      epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcReportFunDao.xml
  56. 4
      epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/ExportResiUserFormDTO.java
  57. 23
      epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/ReportDataFormDTO.java
  58. 60
      epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java
  59. 4
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserExportService.java
  60. 180
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserExportServiceImpl.java
  61. 3
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java
  62. 3
      pom.xml

5
epmet-admin/epmet-admin-server/src/main/resources/db/migration/V0.0.22__jmreport_category.sql

@ -0,0 +1,5 @@
INSERT INTO `epmet_admin`.`sys_dict_type` (`id`, `dict_type`, `dict_name`, `remark`, `sort`, `DEL_FLAG`, `REVISION`, `CREATED_BY`, `CREATED_TIME`, `UPDATED_BY`, `UPDATED_TIME`) VALUES ('1556509011061993473', 'jmreport_category', '报表应用类别', '居民信息、房屋信息', 32, 0, 0, '1', '2022-08-08 13:14:01', '1', '2022-08-08 13:14:01');
INSERT INTO `epmet_admin`.`sys_dict_data` (`id`, `dict_type_id`, `dict_label`, `dict_value`, `dict_p_value`, `remark`, `sort`, `DEL_FLAG`, `REVISION`, `CREATED_BY`, `CREATED_TIME`, `UPDATED_BY`, `UPDATED_TIME`) VALUES ('1556509175185108994', 1556509011061993473, '房屋信息', 'house_info', '0', '', 2, 0, 0, '1', '2022-08-08 13:14:41', '1', '2022-08-08 13:14:41');
INSERT INTO `epmet_admin`.`sys_dict_data` (`id`, `dict_type_id`, `dict_label`, `dict_value`, `dict_p_value`, `remark`, `sort`, `DEL_FLAG`, `REVISION`, `CREATED_BY`, `CREATED_TIME`, `UPDATED_BY`, `UPDATED_TIME`) VALUES ('1556509102015475714', 1556509011061993473, '居民信息', 'resi_info', '0', '', 1, 0, 0, '1', '2022-08-08 13:14:23', '1', '2022-08-08 13:14:23');

24
epmet-commons/epmet-commons-feignclient/pom.xml

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>epmet-commons</artifactId>
<groupId>com.epmet</groupId>
<version>2.0.0</version>
<!--<relativePath>../../pom.xml</relativePath>-->
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<artifactId>epmet-commons-feignclient</artifactId>
<dependencies>
<dependency>
<groupId>com.epmet</groupId>
<artifactId>epmet-commons-tools</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
</project>

0
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/.gitkeep

0
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/.gitkeep

22
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/JiMuPage.java

@ -0,0 +1,22 @@
package com.epmet.commons.feignclient.dtos;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 积木报表的返回值Page对象
* @param <T>
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class JiMuPage<T> {
private int pageNo;
private int pageSize;
private int total;
private int pages;
private List<?> records;
}

20
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/JiMuResult.java

@ -0,0 +1,20 @@
package com.epmet.commons.feignclient.dtos;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 积木报表的返回值Result对象
* @param <T>
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class JiMuResult<T> {
private boolean success = true;
private String message = "";
private Integer code = 0;
private T result;
private T data;
}

33
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/form/JiMuReportFormDTO.java

@ -0,0 +1,33 @@
package com.epmet.commons.feignclient.dtos.form;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* @Author zxc
* @DateTime 2022/8/8 15:08
* @DESC
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class JiMuReportFormDTO implements Serializable {
private static final long serialVersionUID = 3590609549416867701L;
/**
* 报表IDs
*/
private List<String> reportIds;
/**
* 类别
*/
private List<String> categoryKeys;
private String id;
}

27
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/form/JimuReportExportRequestDTO.java

@ -0,0 +1,27 @@
package com.epmet.commons.feignclient.dtos.form;
import lombok.Data;
/**
* 批量导出用的requst dto
*/
@Data
public class JimuReportExportRequestDTO {
private String excelConfigId;
private ExportRequestQueryParam queryParam = new ExportRequestQueryParam();
/**
* 批量导出用的请求参数
*/
@Data
public static class ExportRequestQueryParam {
private String id;
private String token;
private String paramKey;
private String pageNo;
private Integer pageSize;
private String currentPageNo;
private Integer currentPageSize;
}
}

31
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/result/JiMuReportDetailResultDTO.java

@ -0,0 +1,31 @@
package com.epmet.commons.feignclient.dtos.result;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.Map;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class JiMuReportDetailResultDTO {
private String id;
private String code;
private String name;
private String note;
private String status;
private String type;
private String jsonStr;
private String apiUrl;
private String apiMethod;
private String apiCode;
private String thumb;
private Integer template;
private String createBy;
private Date createTime;
private String updateBy;
private Date updateTime;
private Map<String, Object> dataList;
}

26
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/result/JiMuReportResultDTO.java

@ -0,0 +1,26 @@
package com.epmet.commons.feignclient.dtos.result;
import lombok.Data;
import java.io.Serializable;
/**
* @Author zxc
* @DateTime 2022/8/8 15:10
* @DESC
*/
@Data
public class JiMuReportResultDTO implements Serializable {
private static final long serialVersionUID = -4048477731892329569L;
private String code;
private String name;
private String id;
private String reportId;
private String reportName;
private Boolean isList = false;
}

18
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/result/JimuReportDbDataResultDTO.java

@ -0,0 +1,18 @@
package com.epmet.commons.feignclient.dtos.result;
import lombok.Data;
@Data
public class JimuReportDbDataResultDTO {
private ReportDB reportDb;
@Data
public static class ReportDB {
private String apiUrl;
private String apiMethod;
private String isList;
private String dbChName;
}
}

26
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/result/JimuReportFieldTreeResultDTO.java

@ -0,0 +1,26 @@
package com.epmet.commons.feignclient.dtos.result;
import lombok.Data;
import java.util.List;
/**
* 积木报表报表字段列表
*/
@Data
public class JimuReportFieldTreeResultDTO {
private Boolean expand;
private String code;
private List<Child> children;
private String dbId;
private String type;
private String isList;
@Data
public static class Child {
private Boolean expand;
private String title;
private String fieldText;
}
}

0
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/feigns/.gitkeep

47
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/feigns/JiMuReportOpenFeignClient.java

@ -0,0 +1,47 @@
package com.epmet.commons.feignclient.feigns;
import com.epmet.commons.feignclient.dtos.JiMuPage;
import com.epmet.commons.feignclient.dtos.JiMuResult;
import com.epmet.commons.feignclient.dtos.form.JimuReportExportRequestDTO;
import com.epmet.commons.feignclient.dtos.result.JiMuReportDetailResultDTO;
import com.epmet.commons.feignclient.dtos.result.JimuReportDbDataResultDTO;
import com.epmet.commons.feignclient.dtos.result.JimuReportFieldTreeResultDTO;
import com.epmet.commons.feignclient.feigns.fallback.JiMuReportOpenFeignClientFallbackFactory;
import com.epmet.commons.tools.constant.ServiceConstant;
import feign.Response;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* @Author zxc
* @DateTime 2022/8/8 13:52
* @DESC
*/
@FeignClient(name = ServiceConstant.EPMET_JM_REPORT, fallbackFactory = JiMuReportOpenFeignClientFallbackFactory.class)
//@FeignClient(name = ServiceConstant.EPMET_JM_REPORT, fallbackFactory = JiMuReportOpenFeignClientFallbackFactory.class, url = "localhost:8118")
public interface JiMuReportOpenFeignClient {
@GetMapping(value = "jmreport/excelQuery")
JiMuResult<JiMuPage<JiMuReportDetailResultDTO>> getList(@RequestParam("pageNo") Integer pageNo,
@RequestParam("pageSize") Integer pageSize,
@RequestParam("name") String name,
@RequestParam("reportType") String reportType,
@RequestParam("token") String token,
@RequestHeader MultiValueMap<String, String> headers);
@GetMapping("jmreport/show")
JiMuResult<Map<String,Object>> getReport(@RequestParam("id") String id,@RequestParam("apiUrl") String apiUrl,@RequestParam("params") String params,@RequestHeader MultiValueMap<String, String> headers);
@GetMapping("/jmreport/field/tree/{report-id}")
JiMuResult<List<List<JimuReportFieldTreeResultDTO>>> fieldTree(@PathVariable("report-id") String reportId);
@GetMapping("jmreport/loadDbData/{report-id}")
JiMuResult<JimuReportDbDataResultDTO> loadDbData(@PathVariable("report-id") String reportId);
@PostMapping("jmreport/exportAllExcelStream")
Response exportAllExcelStream(JimuReportExportRequestDTO param);
}

51
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/feigns/fallback/JiMuReportOpenFeignClientFallback.java

@ -0,0 +1,51 @@
package com.epmet.commons.feignclient.feigns.fallback;
import com.epmet.commons.feignclient.dtos.JiMuPage;
import com.epmet.commons.feignclient.dtos.JiMuResult;
import com.epmet.commons.feignclient.dtos.form.JimuReportExportRequestDTO;
import com.epmet.commons.feignclient.dtos.result.JiMuReportDetailResultDTO;
import com.epmet.commons.feignclient.dtos.result.JimuReportDbDataResultDTO;
import com.epmet.commons.feignclient.dtos.result.JimuReportFieldTreeResultDTO;
import com.epmet.commons.feignclient.feigns.JiMuReportOpenFeignClient;
import feign.Response;
import org.springframework.util.MultiValueMap;
import java.util.List;
import java.util.Map;
/**
* @Author zxc
* @DateTime 2022/8/8 13:53
* @DESC
*/
public class JiMuReportOpenFeignClientFallback implements JiMuReportOpenFeignClient {
@Override
public JiMuResult<JiMuPage<JiMuReportDetailResultDTO>> getList(Integer pageNo, Integer pageSize, String name, String reportType, String token, MultiValueMap<String, String> headers) {
JiMuResult<JiMuPage<JiMuReportDetailResultDTO>> rst = new JiMuResult<>(false, "请求失败", 200, null,null);
return rst;
}
@Override
public JiMuResult<Map<String,Object>> getReport(String id,String apiUrl,String params,MultiValueMap<String, String> headers) {
JiMuResult<Map<String,Object>> rst = new JiMuResult<>(false, "请求失败", 200, null,null);
return rst;
}
@Override
public JiMuResult<JimuReportDbDataResultDTO> loadDbData(String reportId) {
JiMuResult<JimuReportDbDataResultDTO> rst = new JiMuResult<>(false, "请求失败", 200, null,null);
return rst;
}
@Override
public Response exportAllExcelStream(JimuReportExportRequestDTO param) {
return null;
}
@Override
public JiMuResult<List<List<JimuReportFieldTreeResultDTO>>> fieldTree(String reportId) {
JiMuResult rst = new JiMuResult<>(false, "请求失败", 200, null,null);
return rst;
}
}

24
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/feigns/fallback/JiMuReportOpenFeignClientFallbackFactory.java

@ -0,0 +1,24 @@
package com.epmet.commons.feignclient.feigns.fallback;
import com.epmet.commons.tools.exception.ExceptionUtils;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @Author zxc
* @DateTime 2022/8/9 13:27
* @DESC
*/
@Slf4j
@Component
public class JiMuReportOpenFeignClientFallbackFactory implements FallbackFactory<JiMuReportOpenFeignClientFallback> {
private JiMuReportOpenFeignClientFallback fallback = new JiMuReportOpenFeignClientFallback();
@Override
public JiMuReportOpenFeignClientFallback create(Throwable cause) {
log.error(String.format("FeignClient调用发生异常,异常信息:%s", ExceptionUtils.getThrowableErrorStackTrace(cause)));
return fallback;
}
}

13
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/annotation/ReportRequest.java

@ -0,0 +1,13 @@
package com.epmet.commons.tools.annotation;
import java.lang.annotation.*;
/**
* 标记一个接口它会被报表服务所调用
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ReportRequest {
}

86
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aspect/ReportRequestAspect.java

@ -0,0 +1,86 @@
package com.epmet.commons.tools.aspect;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.epmet.commons.tools.exception.EpmetErrorCode;
import com.epmet.commons.tools.exception.EpmetException;
import com.epmet.commons.tools.redis.RedisUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.lang.reflect.Parameter;
import java.util.Map;
/**
* 需要被报表服务请求的api需要加上这个注解
* 1.该注解会取url中固定的key去redis获取参数给入参dto复制
*/
@Aspect
@Component
@Order(20)
@Slf4j
public class ReportRequestAspect {
/**
* 从redis中取参数用
*/
public static final String REPORT_REDIS_KEY = "paramKey";
@Autowired
private RedisUtils redisUtils;
@Before("@annotation(com.epmet.commons.tools.annotation.ReportRequest)")
public void before(JoinPoint point) {
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes sra = (ServletRequestAttributes) ra;
String paramKey = sra.getRequest().getParameter(REPORT_REDIS_KEY);
if (StringUtils.isBlank(paramKey)) {
// 没有携带key参数,直接跳过
return;
}
Map<String, Object> cachedParams = redisUtils.hGetAll(paramKey);
if (cachedParams == null || cachedParams.size() == 0) {
log.warn("【报表服务】根据paramKey:{}未获取到有效的参数缓存。", paramKey);
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "参数失效", "参数失效");
// redis中没有此参数
}
// 使用方法签名获取出参数class列表
Object[] args = point.getArgs();
MethodSignature signature = (MethodSignature) point.getSignature();
Parameter[] parameters = signature.getMethod().getParameters();
fillArgsToRequestBody(args, cachedParams, parameters);
}
/**
* 将redis中取出的参数赋值到指定的入参dto上
* @param args
* @param storedParams
*/
private void fillArgsToRequestBody(Object[] args, Map<String, Object> storedParams, Parameter[] parameters) {
for (int i = 0; i < args.length; i++) {
Object arg = args[i];
RequestBody requestBodyAnno = parameters[i].getAnnotation(RequestBody.class);
if (arg != null && requestBodyAnno != null) {
Object argBean = BeanUtil.mapToBean(storedParams, arg.getClass(), true);
// "pageSize", "pageNo", "isPage"三个属性不从redis拷贝,而是取传递雇来的
// redis里面的字段如果是null,则不会赋值给arg
BeanUtil.copyProperties(argBean, arg, new CopyOptions(null, true, "pageSize", "pageNo", "isPage"));
return;
}
}
}
}

5
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/ServiceConstant.java

@ -148,4 +148,9 @@ public interface ServiceConstant {
* 插件pli-power服务
*/
String PLI_POWER_SERVER = "pli-power-base-server";
/**
*
*/
String EPMET_JM_REPORT = "epmet-jmreport-server";
}

4
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/form/DictListFormDTO.java

@ -1,6 +1,8 @@
package com.epmet.commons.tools.dto.form;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
@ -9,6 +11,8 @@ import javax.validation.constraints.NotBlank;
* @Author sun
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DictListFormDTO {
/**

2
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/EpmetBaseRequestInterceptor.java

@ -25,8 +25,6 @@ public class EpmetBaseRequestInterceptor implements RequestInterceptor {
// Map<String, String> requestHeaders = getHeadersFromRequest();
log.debug("EpmetBaseRequestInterceptor#apply#inheritableAdditionalHeaders:" + requestHeaders);
if (requestHeaders != null && requestHeaders.size() > 0) {
for (Map.Entry<String, String> kv : requestHeaders.entrySet()) {
template.header(kv.getKey(), kv.getValue());

7
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/page/PageData.java

@ -29,6 +29,7 @@ public class PageData<T> implements Serializable {
private List<T> list;
private int pages;
/**
* 分页
* @param list 列表数据
@ -38,4 +39,10 @@ public class PageData<T> implements Serializable {
this.list = list;
this.total = (int)total;
}
public PageData(List<T> list, long total,int pageSize) {
this.list = list;
this.total = (int)total;
this.pages = (int) Math.ceil((double)total / pageSize);
}
}

9
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/EpmetRequestHolder.java

@ -2,6 +2,7 @@ package com.epmet.commons.tools.utils;
import com.alibaba.ttl.TransmittableThreadLocal;
import com.epmet.commons.tools.constant.AppClientConstant;
import com.epmet.commons.tools.constant.Constant;
import org.apache.commons.lang3.StringUtils;
import java.util.HashMap;
@ -86,6 +87,14 @@ public class EpmetRequestHolder {
return getHeader(AppClientConstant.CLIENT);
}
/**
* 获取登陆用户的token
* @return
*/
public static String getLoginUserAuthorizationToken() {
return getHeader(Constant.AUTHORIZATION_HEADER);
}
/**
* 获取所有
* @return

28
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/HttpClientManager.java

@ -443,6 +443,34 @@ public class HttpClientManager {
}
}
public Result<String> sendGet(String url, Map<String, Object> params, Map<String, Object> headerMap) {
try {
URIBuilder builder = new URIBuilder(url);
if (!CollectionUtils.isEmpty(params)) {
Set<String> set = params.keySet();
for (String key : set) {
builder.setParameter(key, params.get(key) == null ? "" : String.valueOf(params.get(key)));
}
}
System.out.println(builder.getPath());
HttpGet httpGet = new HttpGet(builder.build());
httpGet.setConfig(requestConfig);
if (null != headerMap){
headerMap.forEach((k,v) -> {
if (StringUtils.isNotBlank(k)) {
httpGet.addHeader(k, v == null ? null : v.toString());
}
});
}
return execute(httpGet,false);
} catch (Exception e) {
log.error("sendGet exception", e);
return new Result<String>().error(EpmetErrorCode.SERVER_ERROR.getCode(), EpmetErrorCode.SERVER_ERROR.getMsg());
}
}
private Result<String> execute(HttpRequestBase httpMethod, boolean isHttps) {
CloseableHttpResponse response = null;
try {

13
epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/ReportHouseTestFormDTO.java

@ -0,0 +1,13 @@
package com.epmet.dto.form;
import lombok.Data;
@Data
public class ReportHouseTestFormDTO {
private Integer pageNo = 1;
private Integer pageSize = 20;
private String id;
private String test;
}

14
epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/ReportHouseTestResultDTO.java

@ -0,0 +1,14 @@
package com.epmet.dto.result;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ReportHouseTestResultDTO {
private String houseId;
private String doorName;
private String fullName;
}

2
epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java

@ -27,6 +27,7 @@ import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy
import com.alibaba.fastjson.JSON;
import com.epmet.commons.tools.annotation.LoginUser;
import com.epmet.commons.tools.annotation.MaskResponse;
import com.epmet.commons.tools.annotation.ReportRequest;
import com.epmet.commons.tools.aop.NoRepeatSubmit;
import com.epmet.commons.tools.constant.NumConstant;
import com.epmet.commons.tools.constant.ServiceConstant;
@ -105,6 +106,7 @@ public class HouseController implements ResultDataResolver {
@Autowired
private IcHouseDao icHouseDao;
@ReportRequest
@PostMapping("houselist")
@MaskResponse(fieldNames = {"ownerIdCard", "ownerPhone"},
fieldsMaskType = {MaskResponse.MASK_TYPE_ID_CARD, MaskResponse.MASK_TYPE_MOBILE})

45
epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/ReportController.java

@ -0,0 +1,45 @@
package com.epmet.controller;
import com.epmet.commons.tools.annotation.ReportRequest;
import com.epmet.commons.tools.page.PageData;
import com.epmet.commons.tools.redis.RedisUtils;
import com.epmet.commons.tools.utils.Result;
import com.epmet.dto.form.ReportHouseTestFormDTO;
import com.epmet.dto.result.ReportHouseTestResultDTO;
import com.epmet.service.HouseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
@RestController
@RequestMapping("report")
public class ReportController {
@Autowired
private HouseService houseService;
@Autowired
private RedisUtils redisUtils;
/**
* todo 测试用的
* @return
*/
@PostMapping("houses/test")
@ReportRequest
public Result<PageData<ReportHouseTestResultDTO>> listHouses(@RequestBody ReportHouseTestFormDTO input) {
System.out.println("id:"+input.getId());
PageData<ReportHouseTestResultDTO> pageData = houseService.listHouses4ReportTest(input.getId(), input.getPageNo(), input.getPageSize());
return new Result<PageData<ReportHouseTestResultDTO>>().ok(pageData);
}
@PostMapping("put")
public void put() {
final HashMap<String, Object> m = new HashMap<>();
m.put("test", "aaa");
redisUtils.hMSet("ttt", m);
}
}

2
epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/HouseService.java

@ -193,4 +193,6 @@ public interface HouseService {
* @return
*/
Result<IcHouseInfoCollectResultDTO> getHouseInfoToCollect(GetHouseInfoToCollectFormDTO formDTO);
PageData<ReportHouseTestResultDTO> listHouses4ReportTest(String houseId, Integer pageNo, Integer pageSize);
}

20
epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java

@ -467,7 +467,9 @@ public class HouseServiceImpl implements HouseService, ResultDataResolver {
item.setPurpose(HousePurposeEnums.getTypeValue(item.getPurposeKey()));
});
if (formDTO.getIsPage()) {
return new PageData<>(records == null ? new ArrayList<>() : records, pageInfo.getTotal(), formDTO.getPageSize());
}
return new PageData<>(records == null ? new ArrayList<>() : records, pageInfo.getTotal());
}
@ -1310,4 +1312,20 @@ public class HouseServiceImpl implements HouseService, ResultDataResolver {
return new Result<IcHouseInfoCollectResultDTO>().ok(icHouseInfoCollectResultDTO);
}
@Override
public PageData<ReportHouseTestResultDTO> listHouses4ReportTest(String houseId, Integer pageNo, Integer pageSize) {
LambdaQueryWrapper<IcHouseEntity> query = new LambdaQueryWrapper<>();
query.eq(IcHouseEntity::getBuildingId, "1514143207495208961");
query.eq(StringUtils.isNotBlank(houseId), IcHouseEntity::getId, houseId);
PageHelper.startPage(pageNo, pageSize);
List<IcHouseEntity> icHouseEntities = icHouseDao.selectList(query);
PageInfo<IcHouseEntity> pi = new PageInfo<>(icHouseEntities);
List<ReportHouseTestResultDTO> houseDtos = icHouseEntities.stream().map(house -> new ReportHouseTestResultDTO(house.getId(), house.getDoorName(), house.getFullName())).collect(Collectors.toList());
return new PageData<>(houseDtos, pi.getTotal());
}
}

65
epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcCustomerReportDTO.java

@ -0,0 +1,65 @@
package com.epmet.dto;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 客户报表关系表
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2022-08-08
*/
@Data
public class IcCustomerReportDTO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
private String id;
/**
* 报表id
*/
private String reportId;
/**
* 客户id
*/
private String customerId;
/**
* 删除标识0.未删除 1.已删除
*/
private Integer delFlag;
/**
* 乐观锁
*/
private Integer revision;
/**
* 创建人
*/
private String createdBy;
/**
* 创建时间=绑定时间
*/
private Date createdTime;
/**
* 更新人
*/
private String updatedBy;
/**
* 更新时间
*/
private Date updatedTime;
}

64
epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcReportFunDTO.java

@ -0,0 +1,64 @@
package com.epmet.dto;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
/**
* 报表所属功能表
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2022-08-08
*/
@Data
public class IcReportFunDTO implements Serializable {
private static final long serialVersionUID = 1L;
/**
*
*/
private String id;
/**
* ic_customer_report.id
*/
private String customerReportId;
/**
* 功能类别来源于字典表key;eg:resi_info,house_info
*/
private String funCategoryKey;
/**
* 删除标识0.未删除 1.已删除
*/
private Integer delFlag;
/**
* 乐观锁
*/
private Integer revision;
/**
* 创建人
*/
private String createdBy;
/**
* 创建时间=绑定时间
*/
private Date createdTime;
/**
* 更新人
*/
private String updatedBy;
/**
* 更新时间
*/
private Date updatedTime;
}

29
epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/PreviewReportFormDTO.java

@ -0,0 +1,29 @@
package com.epmet.dto.form;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.util.Map;
/**
* @Description
* @Author yzm
* @Date 2022/8/8 13:31
*/
@Data
public class PreviewReportFormDTO {
public interface AddUserInternalGroup {
}
@NotBlank(message = "reportId不能为空", groups = AddUserInternalGroup.class)
private String reportId;
@NotBlank(message = "categoryKey不能为空", groups = AddUserInternalGroup.class)
private String categoryKey;
private Map<String, Object> paramMap;
@NotBlank(message = "customerId不能为空", groups = AddUserInternalGroup.class)
private String customerId;
@NotBlank(message = "staffId不能为空", groups = AddUserInternalGroup.class)
private String staffId;
}

22
epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/ReportBatchExportFormDTO.java

@ -0,0 +1,22 @@
package com.epmet.dto.form;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* 报表批量导出form dto
*/
@Data
public class ReportBatchExportFormDTO {
//private String token;
private String paramKey;
@NotBlank(message = "reportId必填")
private String reportId;
private String id;
}

45
epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/ReportEditFormDTO.java

@ -0,0 +1,45 @@
package com.epmet.dto.form;
import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
import java.util.List;
/**
* @Author zxc
* @DateTime 2022/8/8 14:04
* @DESC
*/
@Data
public class ReportEditFormDTO implements Serializable {
private static final long serialVersionUID = -2157859106926125470L;
public interface ReportEditForm{}
/**
* 操作类型批量操作add单个编辑edit
*/
@NotBlank(message = "type不能为空", groups = ReportEditForm.class)
private String type;
@NotBlank(message = "reportId不能为空", groups = ReportEditForm.class)
private String reportId;
@Valid
private List<CustomerReportEditForm> customerList;
@Data
public static class CustomerReportEditForm implements Serializable{
private static final long serialVersionUID = 8154093835160706134L;
private List<String> categoryKeys;
@NotBlank(message = "customerId不能为空", groups = ReportEditForm.class)
private String customerId;
}
}

21
epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/ReportListFormDTO.java

@ -0,0 +1,21 @@
package com.epmet.dto.form;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* @Author zxc
* @DateTime 2022/8/8 15:16
* @DESC
*/
@Data
public class ReportListFormDTO implements Serializable {
private static final long serialVersionUID = -4459838228433571457L;
private List<String> categoryKeys;
private String customerId;
}

18
epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/PreviewReportResDTO.java

@ -0,0 +1,18 @@
package com.epmet.dto.result;
import lombok.Data;
/**
* @Description
* @Author yzm
* @Date 2022/8/8 13:37
*/
@Data
public class PreviewReportResDTO {
private String reportId;
/**
* rediskey格式customerId:reportId:resiinfo:staffId
*/
private String paramKey;
}

94
epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/ReportResultDTO.java

@ -0,0 +1,94 @@
package com.epmet.dto.result;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* @Author zxc
* @DateTime 2022/8/8 10:29
* @DESC
*/
@Data
public class ReportResultDTO implements Serializable {
private static final long serialVersionUID = -5798816843431200300L;
/**
* 报表名字
*/
private String reportName;
/**
* 报表ID
*/
private String reportId;
private Boolean isList;
/**
* 客户ID
*/
@JsonIgnore
private String customerId;
/**
* 客户名字
*/
@JsonIgnore
private String customerName;
/**
* 分类名字
*/
@JsonIgnore
private String categoryName;
/**
* 分类key
*/
@JsonIgnore
private String categoryKey;
/**
* 客户信息集合
*/
private List<CustomerList> customerList;
@Data
public static class CustomerList implements Serializable{
private static final long serialVersionUID = 7146198312265513418L;
/**
* 客户ID
*/
private String customerId;
/**
* 客户名字
*/
private String customerName;
/**
* 分类名字
*/
private String categoryName;
/**
* 分类key
*/
private String categoryKey;
}
public ReportResultDTO() {
this.reportName = "";
this.reportId = "";
this.isList = false;
this.customerList = new ArrayList<>();
}
}

1
epmet-module/oper-customize/oper-customize-server/deploy/docker-compose-dev.yml

@ -8,6 +8,7 @@ services:
network_mode: host # 使用现有网络
volumes:
- "/opt/epmet-cloud-logs/dev:/logs"
- "/opt/epmet_files/:/opt/epmet_files"
environment:
RUN_INSTRUCT: "java -Xms32m -Xmx200m -jar ./oper-customize.jar"
restart: "unless-stopped"

5
epmet-module/oper-customize/oper-customize-server/pom.xml

@ -22,6 +22,11 @@
<artifactId>epmet-commons-tools</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.epmet</groupId>
<artifactId>epmet-commons-feignclient</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.epmet</groupId>
<artifactId>epmet-commons-mybatis</artifactId>

5
epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/constant/CustomerFunctionConstant.java

@ -23,5 +23,10 @@ public interface CustomerFunctionConstant {
*/
String PARAMETER_EXCEPTION = "请至少勾选一条默认功能或定制功能数据";
String REPORT_CATEGORY = "jmreport_category";
String REPORT_EDIT = "edit";
String REPORT_ADD = "add";
}

108
epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcCustomerReportController.java

@ -0,0 +1,108 @@
package com.epmet.controller;
import com.epmet.commons.feignclient.dtos.result.JiMuReportResultDTO;
import com.epmet.commons.tools.annotation.LoginUser;
import com.epmet.commons.tools.annotation.ReportRequest;
import com.epmet.commons.tools.security.dto.TokenDto;
import com.epmet.commons.tools.utils.Result;
import com.epmet.commons.tools.validator.ValidatorUtils;
import com.epmet.dto.form.*;
import com.epmet.dto.result.PreviewReportResDTO;
import com.epmet.dto.result.ReportResultDTO;
import com.epmet.service.IcCustomerReportService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.List;
/**
* 客户报表关系表
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2022-08-08
*/
@RestController
@RequestMapping("icCustomerReport")
public class IcCustomerReportController {
@Autowired
private IcCustomerReportService icCustomerReportService;
/**
* Desc: 报表集合
* @param
* @author zxc
* @date 2022/8/8 10:38
*/
@PostMapping("list")
public Result<List<ReportResultDTO>> reportList(){
return new Result<List<ReportResultDTO>>().ok(icCustomerReportService.reportList());
}
/**
* 在居民信息或者房屋信息等页面点击填表存储入参到redis,返给前端key
* @param tokenDto
* @param formDTO
* @return
*/
@PostMapping("preview")
public Result<PreviewReportResDTO> previewReport(@LoginUser TokenDto tokenDto, @RequestBody PreviewReportFormDTO formDTO) {
formDTO.setCustomerId(tokenDto.getCustomerId());
formDTO.setStaffId(tokenDto.getUserId());
ValidatorUtils.validateEntity(formDTO, PreviewReportFormDTO.AddUserInternalGroup.class);
return new Result<PreviewReportResDTO>().ok(icCustomerReportService.previewReport(formDTO));
}
/**
* Desc: 报表编辑
* @param formDTO
* @author zxc
* @date 2022/8/8 14:09
*/
@PostMapping("edit")
public Result reportEdit(@RequestBody ReportEditFormDTO formDTO){
ValidatorUtils.validateEntity(formDTO, ReportEditFormDTO.ReportEditForm.class);
icCustomerReportService.reportEdit(formDTO);
return new Result();
}
/**
* Desc: 居民信息/房屋信息-查询报表
* @param formDTO
* @author zxc
* @date 2022/8/8 15:20
*/
@PostMapping("report-list")
public Result<List<JiMuReportResultDTO>> reportIdAndName(@RequestBody ReportListFormDTO formDTO,@LoginUser TokenDto tokenDto){
formDTO.setCustomerId(tokenDto.getCustomerId());
return new Result<List<JiMuReportResultDTO>>().ok(icCustomerReportService.reportIdAndName(formDTO));
}
/**
* 批量导出
*/
@PostMapping("batch-export")
public void batchExport(@RequestBody ReportBatchExportFormDTO input, HttpServletResponse response) {
ValidatorUtils.validateEntity(input);
String reportId = input.getReportId();
String paramKey = input.getParamKey();
final String id = input.getId();
icCustomerReportService.batchExport(id, reportId, paramKey, response);
}
@ReportRequest
@PostMapping("test")
public void test(@RequestBody ExportResiUserFormDTO input) {
System.out.println(input);
}
}

70
epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcReportFunController.java

@ -0,0 +1,70 @@
package com.epmet.controller;
import com.epmet.commons.tools.aop.NoRepeatSubmit;
import com.epmet.commons.tools.page.PageData;
import com.epmet.commons.tools.utils.Result;
import com.epmet.commons.tools.validator.AssertUtils;
import com.epmet.commons.tools.validator.ValidatorUtils;
import com.epmet.commons.tools.validator.group.AddGroup;
import com.epmet.commons.tools.validator.group.DefaultGroup;
import com.epmet.commons.tools.validator.group.UpdateGroup;
import com.epmet.dto.IcReportFunDTO;
import com.epmet.service.IcReportFunService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
/**
* 报表所属功能表
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2022-08-08
*/
@RestController
@RequestMapping("icReportFun")
public class IcReportFunController {
@Autowired
private IcReportFunService icReportFunService;
@RequestMapping("page")
public Result<PageData<IcReportFunDTO>> page(@RequestParam Map<String, Object> params){
PageData<IcReportFunDTO> page = icReportFunService.page(params);
return new Result<PageData<IcReportFunDTO>>().ok(page);
}
@RequestMapping(value = "{id}",method = {RequestMethod.POST,RequestMethod.GET})
public Result<IcReportFunDTO> get(@PathVariable("id") String id){
IcReportFunDTO data = icReportFunService.get(id);
return new Result<IcReportFunDTO>().ok(data);
}
@NoRepeatSubmit
@PostMapping("save")
public Result save(@RequestBody IcReportFunDTO dto){
//效验数据
ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class);
icReportFunService.save(dto);
return new Result();
}
@NoRepeatSubmit
@PostMapping("update")
public Result update(@RequestBody IcReportFunDTO dto){
//效验数据
ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class);
icReportFunService.update(dto);
return new Result();
}
@PostMapping("delete")
public Result delete(@RequestBody String[] ids){
//效验数据
AssertUtils.isArrayEmpty(ids, "id");
icReportFunService.delete(ids);
return new Result();
}
}

40
epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcCustomerReportDao.java

@ -0,0 +1,40 @@
package com.epmet.dao;
import com.epmet.commons.mybatis.dao.BaseDao;
import com.epmet.dto.result.ReportResultDTO;
import com.epmet.entity.IcCustomerReportEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 客户报表关系表
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2022-08-08
*/
@Mapper
public interface IcCustomerReportDao extends BaseDao<IcCustomerReportEntity> {
/**
* Desc: 报表集合
* @param
* @author zxc
* @date 2022/8/8 10:38
*/
List<ReportResultDTO> reportList(@Param("categoryKeys")List<String> categoryKeys,@Param("customerId")String customerId);
/**
* Desc: 根据客户IDs获取ids
* @param customerIds
* @author zxc
* @date 2022/8/8 15:39
*/
List<String> getIdsByCustomer(@Param("customerIds") List<String> customerIds,@Param("reportId") String reportId);
void delCustomerReport(@Param("customerIds") List<String> customerIds,@Param("reportId")String reportId);
void delCustomerReportFun(@Param("reportIds") List<String> reportIds);
}

16
epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcReportFunDao.java

@ -0,0 +1,16 @@
package com.epmet.dao;
import com.epmet.commons.mybatis.dao.BaseDao;
import com.epmet.entity.IcReportFunEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* 报表所属功能表
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2022-08-08
*/
@Mapper
public interface IcReportFunDao extends BaseDao<IcReportFunEntity> {
}

31
epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcCustomerReportEntity.java

@ -0,0 +1,31 @@
package com.epmet.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.epmet.commons.mybatis.entity.BaseEpmetEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 客户报表关系表
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2022-08-08
*/
@Data
@EqualsAndHashCode(callSuper=false)
@TableName("ic_customer_report")
public class IcCustomerReportEntity extends BaseEpmetEntity {
private static final long serialVersionUID = 1L;
/**
* 报表id
*/
private String reportId;
/**
* 客户id
*/
private String customerId;
}

34
epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcReportFunEntity.java

@ -0,0 +1,34 @@
package com.epmet.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.epmet.commons.mybatis.entity.BaseEpmetEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* 报表所属功能表
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2022-08-08
*/
@Data
@EqualsAndHashCode(callSuper=false)
@TableName("ic_report_fun")
public class IcReportFunEntity extends BaseEpmetEntity {
private static final long serialVersionUID = 1L;
/**
* ic_customer_report.id
*/
private String customerReportId;
/**
* 功能类别来源于字典表key;eg:resi_info,house_info
*/
private String funCategoryKey;
}

55
epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcCustomerReportService.java

@ -0,0 +1,55 @@
package com.epmet.service;
import com.epmet.commons.feignclient.dtos.result.JiMuReportResultDTO;
import com.epmet.commons.mybatis.service.BaseService;
import com.epmet.dto.form.PreviewReportFormDTO;
import com.epmet.dto.form.ReportEditFormDTO;
import com.epmet.dto.form.ReportListFormDTO;
import com.epmet.dto.result.PreviewReportResDTO;
import com.epmet.dto.result.ReportResultDTO;
import com.epmet.entity.IcCustomerReportEntity;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* 客户报表关系表
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2022-08-08
*/
public interface IcCustomerReportService extends BaseService<IcCustomerReportEntity> {
/**
* Desc: 报表集合
* @param
* @author zxc
* @date 2022/8/8 10:38
*/
List<ReportResultDTO> reportList();
/**
* 在居民信息或者房屋信息等页面点击填表存储入参到redis,返给前端key
* @param formDTO
* @return
*/
PreviewReportResDTO previewReport(PreviewReportFormDTO formDTO);
/**
* Desc: 报表编辑
* @param formDTO
* @author zxc
* @date 2022/8/8 14:09
*/
void reportEdit(ReportEditFormDTO formDTO);
/**
* Desc: 居民信息/房屋信息-查询报表
* @param formDTO
* @author zxc
* @date 2022/8/8 15:20
*/
List<JiMuReportResultDTO> reportIdAndName(ReportListFormDTO formDTO);
void batchExport(String bizId, String reportId, String paramKey, HttpServletResponse response);
}

78
epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcReportFunService.java

@ -0,0 +1,78 @@
package com.epmet.service;
import com.epmet.commons.mybatis.service.BaseService;
import com.epmet.commons.tools.page.PageData;
import com.epmet.dto.IcReportFunDTO;
import com.epmet.entity.IcReportFunEntity;
import java.util.List;
import java.util.Map;
/**
* 报表所属功能表
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2022-08-08
*/
public interface IcReportFunService extends BaseService<IcReportFunEntity> {
/**
* 默认分页
*
* @param params
* @return PageData<IcReportFunDTO>
* @author generator
* @date 2022-08-08
*/
PageData<IcReportFunDTO> page(Map<String, Object> params);
/**
* 默认查询
*
* @param params
* @return java.util.List<IcReportFunDTO>
* @author generator
* @date 2022-08-08
*/
List<IcReportFunDTO> list(Map<String, Object> params);
/**
* 单条查询
*
* @param id
* @return IcReportFunDTO
* @author generator
* @date 2022-08-08
*/
IcReportFunDTO get(String id);
/**
* 默认保存
*
* @param dto
* @return void
* @author generator
* @date 2022-08-08
*/
void save(IcReportFunDTO dto);
/**
* 默认更新
*
* @param dto
* @return void
* @author generator
* @date 2022-08-08
*/
void update(IcReportFunDTO dto);
/**
* 批量删除
*
* @param ids
* @return void
* @author generator
* @date 2022-08-08
*/
void delete(String[] ids);
}

542
epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcCustomerReportServiceImpl.java

@ -0,0 +1,542 @@
package com.epmet.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.epmet.commons.feignclient.dtos.JiMuPage;
import com.epmet.commons.feignclient.dtos.JiMuResult;
import com.epmet.commons.feignclient.dtos.form.JiMuReportFormDTO;
import com.epmet.commons.feignclient.dtos.form.JimuReportExportRequestDTO;
import com.epmet.commons.feignclient.dtos.result.JiMuReportDetailResultDTO;
import com.epmet.commons.feignclient.dtos.result.JiMuReportResultDTO;
import com.epmet.commons.feignclient.dtos.result.JimuReportDbDataResultDTO;
import com.epmet.commons.feignclient.dtos.result.JimuReportFieldTreeResultDTO;
import com.epmet.commons.feignclient.feigns.JiMuReportOpenFeignClient;
import com.epmet.commons.mybatis.service.impl.BaseServiceImpl;
import com.epmet.commons.tools.constant.*;
import com.epmet.commons.tools.dto.form.DictListFormDTO;
import com.epmet.commons.tools.dto.result.DictListResultDTO;
import com.epmet.commons.tools.exception.EpmetErrorCode;
import com.epmet.commons.tools.exception.EpmetException;
import com.epmet.commons.tools.exception.ExceptionUtils;
import com.epmet.commons.tools.redis.RedisUtils;
import com.epmet.commons.tools.utils.*;
import com.epmet.constant.CustomerFunctionConstant;
import com.epmet.dao.IcCustomerReportDao;
import com.epmet.dto.CustomerDTO;
import com.epmet.dto.form.PreviewReportFormDTO;
import com.epmet.dto.form.ReportEditFormDTO;
import com.epmet.dto.form.ReportListFormDTO;
import com.epmet.dto.result.PreviewReportResDTO;
import com.epmet.dto.result.ReportResultDTO;
import com.epmet.entity.IcCustomerReportEntity;
import com.epmet.entity.IcReportFunEntity;
import com.epmet.feign.EpmetAdminOpenFeignClient;
import com.epmet.feign.OperCrmOpenFeignClient;
import com.epmet.service.IcCustomerReportService;
import com.epmet.service.IcReportFunService;
import feign.Response;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.ListUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.MultiValueMap;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* 客户报表关系表
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2022-08-08
*/
@Service
@Slf4j
public class IcCustomerReportServiceImpl extends BaseServiceImpl<IcCustomerReportDao, IcCustomerReportEntity> implements IcCustomerReportService {
@Autowired
private RedisUtils redisUtils;
@Autowired
private EpmetAdminOpenFeignClient adminOpenFeignClient;
@Autowired
private OperCrmOpenFeignClient operCrmOpenFeignClient;
@Autowired
private IcReportFunService reportFunService;
@Autowired
private JiMuReportOpenFeignClient jiMuReportOpenFeignClient;
@Autowired
private ExecutorService executorService;
private QueryWrapper<IcCustomerReportEntity> getWrapper(Map<String, Object> params) {
String id = (String) params.get(FieldConstant.ID_HUMP);
QueryWrapper<IcCustomerReportEntity> wrapper = new QueryWrapper<>();
wrapper.eq(StringUtils.isNotBlank(id), FieldConstant.ID, id);
return wrapper;
}
/**
* Desc: 报表集合
*
* @param
* @author zxc
* @date 2022/8/8 10:38
*/
@Override
public List<ReportResultDTO> reportList() {
String authorization = EpmetRequestHolder.getHeader("Authorization");
// 自定义header传递
MultiValueMap<String, String> headers = new HttpHeaders();
headers.add("token", authorization);
JiMuResult<JiMuPage<JiMuReportDetailResultDTO>> result = jiMuReportOpenFeignClient.getList(1, 10000, "", "datainfo", authorization, headers);
if (!result.isSuccess()) {
throw new EpmetException("获取所有jm报表失败");
}
List<Map<String, Object>> records = (List<Map<String, Object>>) result.getResult().getRecords();
List<JiMuReportResultDTO> allReports = new ArrayList<>();
for (Map<String, Object> record : records) {
allReports.add(ConvertUtils.mapToEntity(record, JiMuReportResultDTO.class));
}
if (CollectionUtils.isEmpty(allReports)) {
return new ArrayList<>();
}
List<ReportResultDTO> allReportList = new ArrayList<>();
allReports.forEach(r -> {
ReportResultDTO dto = new ReportResultDTO();
dto.setReportId(r.getId());
dto.setReportName(r.getName());
allReportList.add(dto);
});
List<ReportResultDTO> reportList = baseDao.reportList(null, null);
if (CollectionUtils.isEmpty(reportList)) {
return allReportList;
}
Result<List<DictListResultDTO>> dictList = adminOpenFeignClient.dictList(new DictListFormDTO(CustomerFunctionConstant.REPORT_CATEGORY));
if (!dictList.success()) {
throw new EpmetException("查询字典信息失败:" + CustomerFunctionConstant.REPORT_CATEGORY);
}
if (CollectionUtils.isNotEmpty(dictList.getData())) {
dictList.getData().forEach(d -> reportList.stream().filter(r -> d.getValue().equals(r.getCategoryKey())).forEach(r -> r.setCategoryName(d.getLabel())));
}
Result<List<CustomerDTO>> allCustomerList = operCrmOpenFeignClient.getAllCustomerList();
if (!allCustomerList.success()) {
throw new EpmetException("获取客户信息失败...");
}
if (CollectionUtils.isNotEmpty(allCustomerList.getData())) {
allCustomerList.getData().forEach(c -> reportList.stream().filter(r -> c.getId().equals(r.getCustomerId())).forEach(r -> r.setCustomerName(c.getCustomerName())));
}
Map<String, List<ReportResultDTO>> groupByReport = reportList.stream().collect(Collectors.groupingBy(ReportResultDTO::getReportId));
groupByReport.forEach((reportId, l) -> allReportList.stream().filter(a -> a.getReportId().equals(reportId)).forEach(a -> a.setCustomerList(ConvertUtils.sourceToTarget(l, ReportResultDTO.CustomerList.class))));
return allReportList;
}
/**
* 在居民信息或者房屋信息等页面点击填表存储入参到redis,返给前端key
*
* @param formDTO
* @return
*/
@Override
public PreviewReportResDTO previewReport(PreviewReportFormDTO formDTO) {
// rediskey格式:customerId:reportId:resiinfo:staffId
PreviewReportResDTO reportResDTO = new PreviewReportResDTO();
reportResDTO.setReportId(formDTO.getReportId());
String key = "epmet:jmreport:paramkey:".concat(formDTO.getCustomerId()).concat(StrConstant.COLON).concat(formDTO.getReportId()).concat(StrConstant.COLON).concat(formDTO.getCategoryKey()).concat(StrConstant.COLON).concat(formDTO.getStaffId());
redisUtils.hMSet(key, formDTO.getParamMap(), RedisUtils.DEFAULT_EXPIRE);
reportResDTO.setParamKey(key);
return reportResDTO;
}
/**
* Desc: 报表编辑
*
* @param formDTO
* @author zxc
* @date 2022/8/8 14:09
*/
@Transactional(rollbackFor = Exception.class)
@Override
public void reportEdit(ReportEditFormDTO formDTO) {
List<String> reportIds = new ArrayList<>();
if (CollectionUtils.isNotEmpty(formDTO.getCustomerList())) {
reportIds = baseDao.getIdsByCustomer(formDTO.getCustomerList().stream().map(m -> m.getCustomerId()).collect(Collectors.toList()), formDTO.getReportId());
}
if (formDTO.getType().equals(CustomerFunctionConstant.REPORT_EDIT)) {
// 单个编辑
baseDao.delCustomerReport(Arrays.asList(formDTO.getCustomerList().get(NumConstant.ZERO).getCustomerId()), formDTO.getReportId());
} else if (formDTO.getType().equals(CustomerFunctionConstant.REPORT_ADD)) {
baseDao.delCustomerReport(null, formDTO.getReportId());
}
if (CollectionUtils.isNotEmpty(reportIds)) {
baseDao.delCustomerReportFun(reportIds);
}
if (CollectionUtils.isNotEmpty(formDTO.getCustomerList())) {
List<IcCustomerReportEntity> entities = new ArrayList<>();
List<IcReportFunEntity> funEntities = new ArrayList<>();
formDTO.getCustomerList().forEach(c -> {
IcCustomerReportEntity reportEntity = new IcCustomerReportEntity();
reportEntity.setReportId(formDTO.getReportId());
reportEntity.setCustomerId(c.getCustomerId());
reportEntity.setId(IdWorker.getIdStr());
if (CollectionUtils.isNotEmpty(c.getCategoryKeys())) {
c.getCategoryKeys().forEach(key -> {
IcReportFunEntity funEntity = new IcReportFunEntity();
funEntity.setCustomerReportId(reportEntity.getId());
funEntity.setFunCategoryKey(key);
funEntities.add(funEntity);
});
}
entities.add(reportEntity);
});
insetCustomerReportAndFun(entities, funEntities);
}
}
/**
* Desc: 居民信息/房屋信息-查询报表
*
* @param formDTO
* @author zxc
* @date 2022/8/8 15:20
*/
@Override
public List<JiMuReportResultDTO> reportIdAndName(ReportListFormDTO formDTO) {
List<ReportResultDTO> reportList = baseDao.reportList(formDTO.getCategoryKeys(), formDTO.getCustomerId());
if (CollectionUtils.isEmpty(reportList)) {
return new ArrayList<>();
}
List<String> recordIds = reportList.stream().map(m -> m.getReportId()).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
List<JiMuReportResultDTO> result = new ArrayList<>();
recordIds.forEach(r -> {
JiMuReportFormDTO form = new JiMuReportFormDTO();
form.setId(r);
String authorization = EpmetRequestHolder.getHeader("Authorization");
// 自定义header传递
MultiValueMap<String, String> headers = new HttpHeaders();
headers.add("token", authorization);
headers.add("Authorization", authorization);
JiMuResult<Map<String, Object>> report = jiMuReportOpenFeignClient.getReport(r, "", "", headers);
if (!report.isSuccess()) {
throw new EpmetException("获取jm报表详情失败:" + r);
}
JiMuReportResultDTO data = ConvertUtils.mapToEntity(report.getResult(), JiMuReportResultDTO.class);
JiMuResult<JimuReportDbDataResultDTO> reportDbDataResultDTOJiMuResult = jiMuReportOpenFeignClient.loadDbData(r);
if (!reportDbDataResultDTOJiMuResult.isSuccess()){
throw new EpmetException("获取报表dbData失败:"+r);
}
log.info(JSON.toJSONString(reportDbDataResultDTOJiMuResult));
JimuReportDbDataResultDTO.ReportDB reportDb = reportDbDataResultDTOJiMuResult.getResult().getReportDb();
if (null != reportDb){
data.setIsList(reportDb.getIsList().equals(NumConstant.ONE_STR));
}
data.setReportId(data.getId());
data.setReportName(data.getName());
result.add(data);
});
return result;
}
@Transactional(rollbackFor = Exception.class)
public void insetCustomerReportAndFun(List<IcCustomerReportEntity> reportEntities, List<IcReportFunEntity> funEntities) {
if (CollectionUtils.isNotEmpty(reportEntities)) {
insertBatch(reportEntities);
}
if (CollectionUtils.isNotEmpty(funEntities)) {
reportFunService.insertBatch(funEntities);
}
}
@Override
public void batchExport(String bizId, String reportId, String paramKey, HttpServletResponse response) {
// 1. 首先去积木服务,查询出报表数据源的详细信息,包括报表url,isList;获取到哪一列是id(idFieldName)
// 根据报表id查询数据源列表,取出第一个
JiMuResult<List<List<JimuReportFieldTreeResultDTO>>> fResult = jiMuReportOpenFeignClient.fieldTree(reportId);
String datasourceId = fResult.getResult().get(0).get(0).getDbId();
// 根据数据源ID查询数据源信息
JiMuResult<JimuReportDbDataResultDTO> dbData = jiMuReportOpenFeignClient.loadDbData(datasourceId);
JimuReportDbDataResultDTO.ReportDB reportDb = dbData.getResult().getReportDb();
// api的url
String apiUrl = reportDb.getApiUrl();
// api方法
//String apiMethod = reportDb.getApiMethod();
// 是否是集合
//String isList = reportDb.getIsList();
// 返回的列表中,哪个字段是ID
String idFieldName = null;
boolean isHttps = false;
Matcher matcher = Pattern.compile("(http://|https://).+idFieldName=(\\w+).*").matcher(apiUrl);
if (matcher.matches()) {
String proto = matcher.group(1);
if ("https://".equals(proto)) {
isHttps = true;
}
idFieldName = matcher.group(2);
}
if (StringUtils.isBlank(idFieldName)) {
throw new EpmetException(EpmetErrorCode.SERVER_ERROR.getCode(), "配置的业务api url缺少idFieldName列");
}
// 2. 调用该url的接口,获取到一个列表,根据idFieldName取出ID列
List<String> ids = listIds(bizId, paramKey, apiUrl, isHttps, idFieldName);
// 3. 然后以这一列作为查询条件,循环,继续调用该接口,得到单条数据,每一条数据都下载一个excel,最后将其打包为一个压缩包下载
Path storePath = makeTemporaryDownloadDir(reportId);
// 4.生成压缩文件
Path zipFile = downloadAndComppress(storePath, reportId, reportDb.getDbChName(), paramKey, ids);
// 5.下载
try (FileInputStream fis = new FileInputStream(zipFile.toFile())) {
ServletOutputStream os = response.getOutputStream();
response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type", "application/zip");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(zipFile.getFileName().toString(), "UTF-8"));
IOUtils.copy(fis, os);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
Files.delete(zipFile);
} catch (IOException e) {
log.error("【报表批量导出】删除临时zip文件失败");
}
}
}
/**
* 批量下载
* @param storePath 本次导出文件的存储路径子目录包括zip文件时间戳命名的子目录用于存放临时excel(导出完成会删掉)
* @param ids
* @return 压缩文件路径
*/
private Path downloadAndComppress(Path storePath, String reportId, String reportName, String paramKey, List<String> ids) {
// 请求头
Map<String, Object> headers = new HashMap<>();
headers.put(Constant.AUTHORIZATION_HEADER, EpmetRequestHolder.getHeader(Constant.AUTHORIZATION_HEADER));
// 请求体
JimuReportExportRequestDTO param = new JimuReportExportRequestDTO();
param.setExcelConfigId(reportId);
param.getQueryParam().setCurrentPageNo("1");
param.getQueryParam().setCurrentPageSize(20);
param.getQueryParam().setPageNo("1");
param.getQueryParam().setPageSize(20);
param.getQueryParam().setParamKey(paramKey);
param.getQueryParam().setToken(EpmetRequestHolder.getLoginUserAuthorizationToken());
ArrayList<File> files = new ArrayList<>();
String currentTimeStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss"));
// 创建存放xlsx的临时目录
Path xlsxStorePath = storePath.resolve(currentTimeStr);
try {
Files.createDirectories(xlsxStorePath);
} catch (IOException e) {
throw new EpmetException("【报表批量导出】生成临时目录失败:" + xlsxStorePath.toString());
}
// 将所有id分片,交给多个线程并行处理
List<List<String>> idParts = ListUtils.partition(ids, 100);
// 1. 循环下载所有id对应的excel
CountDownLatch cdl = new CountDownLatch(idParts.size());
for (List<String> idPart : idParts) {
CompletableFuture.runAsync(() -> {
downloadXlsByBatchByBizId(reportId, idPart, param, xlsxStorePath, files, cdl);
}, executorService);
}
// 等待多线程执行完成,再执行打包
try {
cdl.await();
} catch (InterruptedException e) {
log.error(ExceptionUtils.getErrorStackTrace(e));
throw new EpmetException("【报表批量导出】CountDownLatch等待被中断");
}
// 2,打包
Path zipFile = storePath.resolve(reportName + "_" + currentTimeStr + ".zip");
try (final FileOutputStream fos = new FileOutputStream(zipFile.toFile());
final ZipOutputStream zos = new ZipOutputStream(fos)) {
// 循环每一个文件
for (File file : files) {
try (final FileInputStream fis = new FileInputStream(file.getAbsolutePath())) {
zos.putNextEntry(new ZipEntry(reportName + "_" + currentTimeStr + "/" + file.getName()));
final byte[] buffer = new byte[10240];
for (int len; (len = fis.read(buffer)) > 0; ) {
zos.write(buffer, 0, len);
}
} finally {
zos.closeEntry();
}
}
zos.flush();
} catch (Exception e) {
log.error("【报表批量导出】压缩文件失败,错误信息:{}", ExceptionUtils.getErrorStackTrace(e));
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "压缩失败", "压缩失败");
} finally {
// 删除临时文件
cleanTemporaryFiles(storePath.resolve(currentTimeStr));
}
return zipFile;
}
/**
* 批量下载xlsx
* @param reportId
* @param bizIds
* @param param
* @param xlsxStorePath
* @param files
*/
public void downloadXlsByBatchByBizId(String reportId, List<String> bizIds, JimuReportExportRequestDTO param, Path xlsxStorePath, ArrayList<File> files,
CountDownLatch cdl) {
for (String id : bizIds) {
try {
Thread.sleep(200l);
} catch (InterruptedException e) {
final String errorMsg = ExceptionUtils.getErrorStackTrace(e);
log.error("【报表批量导出】循环导出-请求jmreport,等待过程中睡眠发生意外:{}", errorMsg);
}
//if (!Arrays.asList("1501821697823608834","1501821694665297922","1501821695114088450","1501821695177003009","1501821695269277697","1501821695344775169","1501821695579656193","1501821695676125186","1501821695755816962","1501821695843897346","1501821695978115074","1501821696108138497","1501821696179441665","1501821696229773313","1501821696284299266","1501821696334630913","1501821696393351170","1501821696452071426","1501821696502403073","1501821696582094849","1501821696645009409","1501821696758255617","1501821696871501826","1501821696917639169","1501821696955387906","1501821696993136641","1501821697135742977","1501821697181880321","1501821697232211969","1501821697274155009").contains(id)) {
// continue;
//}
param.getQueryParam().setId(id);
final Response response = jiMuReportOpenFeignClient.exportAllExcelStream(param);
// 取出文件后缀
final LinkedList<String> header = (LinkedList) response.headers().get("content-disposition");
final Matcher matcher = Pattern.compile("attachment;filename=(.+)(.xls|.xlsx)").matcher(header.get(0));
if (!matcher.matches()) {
log.error("【报表批量导出】批量导出失败,后缀不匹配。文件名:{}, 报表ID:{}, 业务数据ID:{}", header.get(0), reportId, id);
continue;
}
final File excelFile = xlsxStorePath.resolve("file_" + id + matcher.group(2)).toFile();
files.add(excelFile);
try (FileOutputStream fos = new FileOutputStream(excelFile)) {
IOUtils.copy(response.body().asInputStream(), fos);
} catch (Exception e) {
log.error("【报表批量导出】生成临时表格文件失败,文件名:{},报表ID:{}, 业务数据ID:{},错误信息:{}", header.get(0), reportId, id, ExceptionUtils.getErrorStackTrace(e));
}
}
cdl.countDown();
}
/**
* 清理临时保存文件
*/
private void cleanTemporaryFiles(Path tempStorePath) {
// 删除内部文件
for (File file : tempStorePath.toFile().listFiles()) {
try {
Files.delete(file.toPath());
} catch (IOException e) {
log.error("【报表批量导出】删除临时文件失败:{}", ExceptionUtils.getErrorStackTrace(e));
throw new EpmetException(EpmetErrorCode.SERVER_ERROR.getCode(), null, null);
}
}
// 删除文件夹
try {
Files.delete(tempStorePath);
} catch (IOException e) {
log.error("【报表批量导出】删除临时目录失败:{}", ExceptionUtils.getErrorStackTrace(e));
throw new EpmetException(EpmetErrorCode.SERVER_ERROR.getCode(), null, null);
}
}
/**
* 创建临时目录
*
* @param reportId
* @return
*/
private Path makeTemporaryDownloadDir(String reportId) {
String userId = EpmetRequestHolder.getLoginUserId();
try {
return FileUtils.getAndCreateDirUnderEpmetFilesDir("report/batch_export/", reportId, userId);
} catch (IOException e) {
throw new EpmetException("报表】批量导出-创建临时目录失败,错误信息:" + ExceptionUtils.getErrorStackTrace(e));
}
}
/**
* 列出id列表批量下载用
*
* @param apiUrl
* @param isHttps
* @param idFieldName
* @return
*/
public List<String> listIds(String id, String paramKey, String apiUrl, boolean isHttps, String idFieldName) {
apiUrl = apiUrl.replace("'${id}'", id == null ? "" : id);
apiUrl = apiUrl.replace("'${paramKey}'", paramKey);
Map<String, Object> headers = new HashMap<>();
headers.put(Constant.AUTHORIZATION_HEADER, EpmetRequestHolder.getHeader(Constant.AUTHORIZATION_HEADER));
Result<String> stringResult = HttpClientManager.getInstance().sendPost(apiUrl, isHttps, "{\"id\":" + id + "}", headers);
JSONObject dataJsonObject = JSON.parseObject(stringResult.getData());
Object data = dataJsonObject.get("data");
JSONArray array = new JSONArray();
ArrayList<String> ids = new ArrayList<>();
if (data instanceof JSONObject) {
// 这种可能是pageData的
JSONObject jo = (JSONObject) data;
array = jo.getJSONArray("list");
} else {
// 可能是不分页的列表
array = (JSONArray) data;
}
for (ListIterator<Object> it = array.listIterator(); it.hasNext(); ) {
JSONObject e = (JSONObject) it.next();
ids.add(e.getString(idFieldName));
}
return ids;
}
}

82
epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcReportFunServiceImpl.java

@ -0,0 +1,82 @@
package com.epmet.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.epmet.commons.mybatis.service.impl.BaseServiceImpl;
import com.epmet.commons.tools.constant.FieldConstant;
import com.epmet.commons.tools.page.PageData;
import com.epmet.commons.tools.utils.ConvertUtils;
import com.epmet.dao.IcReportFunDao;
import com.epmet.dto.IcReportFunDTO;
import com.epmet.entity.IcReportFunEntity;
import com.epmet.service.IcReportFunService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* 报表所属功能表
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2022-08-08
*/
@Service
public class IcReportFunServiceImpl extends BaseServiceImpl<IcReportFunDao, IcReportFunEntity> implements IcReportFunService {
@Override
public PageData<IcReportFunDTO> page(Map<String, Object> params) {
IPage<IcReportFunEntity> page = baseDao.selectPage(
getPage(params, FieldConstant.CREATED_TIME, false),
getWrapper(params)
);
return getPageData(page, IcReportFunDTO.class);
}
@Override
public List<IcReportFunDTO> list(Map<String, Object> params) {
List<IcReportFunEntity> entityList = baseDao.selectList(getWrapper(params));
return ConvertUtils.sourceToTarget(entityList, IcReportFunDTO.class);
}
private QueryWrapper<IcReportFunEntity> getWrapper(Map<String, Object> params){
String id = (String)params.get(FieldConstant.ID_HUMP);
QueryWrapper<IcReportFunEntity> wrapper = new QueryWrapper<>();
wrapper.eq(StringUtils.isNotBlank(id), FieldConstant.ID, id);
return wrapper;
}
@Override
public IcReportFunDTO get(String id) {
IcReportFunEntity entity = baseDao.selectById(id);
return ConvertUtils.sourceToTarget(entity, IcReportFunDTO.class);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void save(IcReportFunDTO dto) {
IcReportFunEntity entity = ConvertUtils.sourceToTarget(dto, IcReportFunEntity.class);
insert(entity);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(IcReportFunDTO dto) {
IcReportFunEntity entity = ConvertUtils.sourceToTarget(dto, IcReportFunEntity.class);
updateById(entity);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(String[] ids) {
// 逻辑删除(@TableLogic 注解)
baseDao.deleteBatchIds(Arrays.asList(ids));
}
}

12
epmet-module/oper-customize/oper-customize-server/src/main/resources/db/migration/V0.0.36__ic_customer_report.sql

@ -0,0 +1,12 @@
CREATE TABLE `ic_customer_report` (
`ID` varchar(64) NOT NULL COMMENT '主键',
`REPORT_ID` varchar(64) NOT NULL COMMENT '报表id',
`CUSTOMER_ID` varchar(64) NOT NULL COMMENT '客户id',
`DEL_FLAG` int(11) NOT NULL COMMENT '删除标识:0.未删除 1.已删除;',
`REVISION` int(11) NOT NULL COMMENT '乐观锁',
`CREATED_BY` varchar(32) NOT NULL COMMENT '创建人',
`CREATED_TIME` datetime NOT NULL COMMENT '创建时间=绑定时间',
`UPDATED_BY` varchar(32) NOT NULL COMMENT '更新人',
`UPDATED_TIME` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户报表关系表';

12
epmet-module/oper-customize/oper-customize-server/src/main/resources/db/migration/V0.0.37__ic_report_fun.sql

@ -0,0 +1,12 @@
CREATE TABLE `ic_report_fun` (
`ID` varchar(64) NOT NULL,
`CUSTOMER_REPORT_ID` varchar(64) NOT NULL COMMENT 'ic_customer_report.id',
`FUN_CATEGORY_KEY` varchar(255) NOT NULL COMMENT '功能类别来源于字典表key;eg:resi_info,house_info',
`DEL_FLAG` int(11) NOT NULL COMMENT '删除标识:0.未删除 1.已删除;',
`REVISION` int(11) NOT NULL COMMENT '乐观锁',
`CREATED_BY` varchar(32) NOT NULL COMMENT '创建人',
`CREATED_TIME` datetime NOT NULL COMMENT '创建时间=绑定时间',
`UPDATED_BY` varchar(32) NOT NULL COMMENT '更新人',
`UPDATED_TIME` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='报表所属功能表';

61
epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcCustomerReportDao.xml

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.epmet.dao.IcCustomerReportDao">
<delete id="delCustomerReport">
DELETE FROM ic_customer_report
WHERE REPORT_ID = #{reportId}
<if test="null != customerIds and customerIds.size() > 0">
AND CUSTOMER_ID IN (
<foreach collection="customerIds" item="c" separator=",">
#{c}
</foreach>
)
</if>
</delete>
<delete id="delCustomerReportFun">
DELETE FROM ic_report_fun
<if test="null != reportIds and reportIds.size() > 0">
WHERE CUSTOMER_REPORT_ID IN (
<foreach collection="reportIds" item="r" separator=",">
#{r}
</foreach>
)
</if>
</delete>
<!-- 报表集合 -->
<select id="reportList" resultType="com.epmet.dto.result.ReportResultDTO">
SELECT
cr.REPORT_ID,
cr.CUSTOMER_ID,
rf.FUN_CATEGORY_KEY AS categoryKey
FROM ic_customer_report cr
INNER JOIN ic_report_fun rf ON rf.CUSTOMER_REPORT_ID = cr.ID AND rf.DEL_FLAG = 0
WHERE cr.DEL_FLAG = 0
<if test="null != categoryKeys and categoryKeys.size() > 0">
AND rf.FUN_CATEGORY_KEY in (
<foreach collection="categoryKeys" item="r" separator=",">
#{r}
</foreach>
)
</if>
<if test='customerId != null and customerId != ""'>
AND cr.CUSTOMER_ID = #{customerId}
</if>
ORDER BY cr.CREATED_TIME DESC
</select>
<!-- 根据客户IDs获取ids -->
<select id="getIdsByCustomer" resultType="java.lang.String">
SELECT ID FROM ic_customer_report
WHERE DEL_FLAG = 0
AND REPORT_ID = #{reportId}
AND CUSTOMER_ID IN (
<foreach collection="customerIds" item="c" separator=",">
#{c}
</foreach>
)
</select>
</mapper>

6
epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcReportFunDao.xml

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.epmet.dao.IcReportFunDao">
</mapper>

4
epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/ExportResiUserFormDTO.java

@ -11,8 +11,9 @@ import java.io.Serializable;
* @Date 2021/10/27 2:06 下午
*/
@Data
public class ExportResiUserFormDTO implements Serializable {
public class ExportResiUserFormDTO extends ReportDataFormDTO implements Serializable {
private static final long serialVersionUID = 8777535966834678256L;
/**
* 表单查询条件
*/
@ -27,5 +28,6 @@ public class ExportResiUserFormDTO implements Serializable {
*/
private IcExportTemplateSaveFormDTO exportConfig;
}

23
epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/ReportDataFormDTO.java

@ -0,0 +1,23 @@
package com.epmet.dto.form;
import lombok.Data;
/**
* @Description
* @Author yzm
* @Date 2022/8/17 11:13
*/
@Data
public class ReportDataFormDTO {
/**
* 客户Id
*/
private String customerId;
/**
* pageNo 报表用的
*/
private Integer pageNo = 1;
private Integer pageSize = 1000;
private String id;
}

60
epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java

@ -25,12 +25,14 @@ import com.alibaba.fastjson.JSON;
import com.epmet.commons.rocketmq.messages.IcResiUserAddMQMsg;
import com.epmet.commons.tools.annotation.LoginUser;
import com.epmet.commons.tools.annotation.MaskResponse;
import com.epmet.commons.tools.annotation.ReportRequest;
import com.epmet.commons.tools.aop.NoRepeatSubmit;
import com.epmet.commons.tools.constant.AppClientConstant;
import com.epmet.commons.tools.constant.Constant;
import com.epmet.commons.tools.constant.NumConstant;
import com.epmet.commons.tools.constant.StrConstant;
import com.epmet.commons.tools.distributedlock.DistributedLock;
import com.epmet.commons.tools.dto.form.IcExportTemplateSaveFormDTO;
import com.epmet.commons.tools.dto.form.mq.MqBaseFormDTO;
import com.epmet.commons.tools.dto.result.CustomerStaffInfoCacheResult;
import com.epmet.commons.tools.dto.result.OptionDataResultDTO;
@ -67,6 +69,7 @@ import com.epmet.send.SendMqMsgUtil;
import com.epmet.service.IcResiUserExportService;
import com.epmet.service.IcResiUserImportService;
import com.epmet.service.IcResiUserService;
import com.github.pagehelper.Page;
import feign.RequestInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
@ -368,6 +371,7 @@ public class IcResiUserController implements ResultDataResolver {
return new Result<>();
}
@ReportRequest
@PostMapping("listresi")
@MaskResponse(fieldNames = {"MOBILE", "ID_CARD"}, fieldsMaskType = {MaskResponse.MASK_TYPE_MOBILE, MaskResponse.MASK_TYPE_ID_CARD})
public Result<PageData<Map<String, Object>>> queryListResi1(@LoginUser TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO) {
@ -524,7 +528,7 @@ public class IcResiUserController implements ResultDataResolver {
log.info("通过原来的模板下载,tokenDto:{}", JSON.toJSONString(tokenDto));
this.exportExcelByEasyExcel(tokenDto, pageFormDTO.getSearchForm(), response);
} else {
icResiUserExportService.exportIcResiUser(tokenDto, pageFormDTO, response);
icResiUserExportService.exportIcResiUser(tokenDto, pageFormDTO, response,false);
}
} catch (EpmetException e) {
response.reset();
@ -537,6 +541,60 @@ public class IcResiUserController implements ResultDataResolver {
}
}
/**
* desc: 自定义导出居民信息 不下载只有数据
*
* @param tokenDto
* @param pageFormDTO
* @param response
* @return void
* @author LiuJanJun
* @date 2021/11/19 4:24 下午
* @remark 用于报表调用的接口 试试
*/
@ReportRequest
@NoRepeatSubmit
@RequestMapping(value = "/exportExcelCustomData")
public Map<String, Object> exportExcelCustomData(@LoginUser TokenDto tokenDto, @RequestParam("templateId") String templateId,
@RequestBody ExportResiUserFormDTO pageFormDTO) throws Exception {
log.warn("templateId=【"+templateId+"】");
log.warn("pageFormDTO入参【"+JSON.toJSONString(pageFormDTO)+"】");
pageFormDTO.setTemplateId(templateId);
if (null == pageFormDTO.getSearchForm()) {
IcResiUserPageFormDTO searchForm = new IcResiUserPageFormDTO();
searchForm.setFormCode("resi_base_info");
searchForm.setCustomerId(tokenDto.getCustomerId());
searchForm.setStaffId(tokenDto.getUserId());
// searchForm.setPageNo(pageFormDTO.getPageNo());
// searchForm.setPageSize(pageFormDTO.getPageSize());
List<ResiUserQueryValueDTO> conditions=new ArrayList<>();
// ResiUserQueryValueDTO temp=new ResiUserQueryValueDTO();
// temp.setColumnName("");
// temp.setColumnValue(Arrays.asList("IS_UNEMPLOYED"));
// temp.setQueryType("resi_category");
// temp.setTableName("ic_resi_user");
// conditions.add(temp);
searchForm.setConditions(conditions);
pageFormDTO.setSearchForm(searchForm);
}
pageFormDTO.getSearchForm().setPageNo(pageFormDTO.getPageNo());
pageFormDTO.getSearchForm().setPageSize(pageFormDTO.getPageSize());
if (null == pageFormDTO.getExportConfig()) {
IcExportTemplateSaveFormDTO exportTemplateSaveFormDTO = new IcExportTemplateSaveFormDTO();
exportTemplateSaveFormDTO.setFormCode("resi_base_info");
exportTemplateSaveFormDTO.setIsSaveTemp(false);
pageFormDTO.setExportConfig(exportTemplateSaveFormDTO);
}
//固定通用客户Id
pageFormDTO.setCustomerId("jmreport_resi_default");
Page<Map<String, Object>> maps = icResiUserExportService.exportIcResiUser(tokenDto, pageFormDTO, null, true);
Map<String,Object> result = new HashMap<>();
result.put("total",maps.getPages());
result.put("count",maps.getTotal());
result.put("data",maps.getResult());
return result;
}
/**
* desc:根据客户id 先从oss下载模版,如果有没有则使用系统默认模板 如果不存在则返回null
*

4
epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserExportService.java

@ -2,8 +2,10 @@ package com.epmet.service;
import com.epmet.commons.tools.security.dto.TokenDto;
import com.epmet.dto.form.ExportResiUserFormDTO;
import com.github.pagehelper.Page;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
*@Description 居民信息导出service
@ -23,5 +25,5 @@ public interface IcResiUserExportService {
* @author LiuJanJun
* @date 2022/4/22 1:35 下午
*/
void exportIcResiUser(TokenDto tokenDto, ExportResiUserFormDTO exportResiUserFormDTO, HttpServletResponse response);
Page<Map<String, Object>> exportIcResiUser(TokenDto tokenDto, ExportResiUserFormDTO exportResiUserFormDTO, HttpServletResponse response, boolean onlyGetData);
}

180
epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserExportServiceImpl.java

@ -31,6 +31,7 @@ import com.epmet.constant.IcResiUserConstant;
import com.epmet.dto.form.ExportResiUserFormDTO;
import com.epmet.dto.form.IcExportTemplateQueryFormDTO;
import com.epmet.dto.form.IcResiUserPageFormDTO;
import com.epmet.dto.form.ResiUserQueryValueDTO;
import com.epmet.dto.result.FormItemResult;
import com.epmet.dto.result.IcCustomExportResultDTO;
import com.epmet.dto.result.OptionDTO;
@ -45,6 +46,7 @@ import com.google.common.base.Joiner;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.VerticalAlignment;
@ -91,7 +93,9 @@ public class IcResiUserExportServiceImpl implements IcResiUserExportService {
* @date 2022/4/22 1:35 下午
*/
@Override
public void exportIcResiUser(TokenDto tokenDto, ExportResiUserFormDTO exportResiUserFormDTO, HttpServletResponse response) {
public Page<Map<String, Object>> exportIcResiUser(TokenDto tokenDto, ExportResiUserFormDTO exportResiUserFormDTO, HttpServletResponse response, boolean onlyGetData) {
Page<Map<String, Object>> mapListPage = null;
//校验参数
this.validateSearchForm(tokenDto, exportResiUserFormDTO);
IcResiUserPageFormDTO searchForm = exportResiUserFormDTO.getSearchForm();
@ -99,9 +103,11 @@ public class IcResiUserExportServiceImpl implements IcResiUserExportService {
String templateId = exportResiUserFormDTO.getTemplateId();
ExcelWriter excelWriter = null;
WriteSheet writeSheet = null;
try {
String dynamicCustomerId=StringUtils.isNotBlank(exportResiUserFormDTO.getCustomerId()) ? exportResiUserFormDTO.getCustomerId() : tokenDto.getCustomerId();
//获取用户配置的导出条件
Result<IcCustomExportResultDTO> exportConfigResult = this.getIcCustomExportConfig(searchForm.getCustomerId(), templateId, exportResiUserFormDTO.getExportConfig());
Result<IcCustomExportResultDTO> exportConfigResult = this.getIcCustomExportConfig(dynamicCustomerId, templateId, exportResiUserFormDTO.getExportConfig());
Map<String, ExportResiUserItemDTO> itemOriginMap = getItemMap(searchForm.getCustomerId());
IcCustomExportResultDTO exportConfigData = exportConfigResult.getData();
@ -114,36 +120,42 @@ public class IcResiUserExportServiceImpl implements IcResiUserExportService {
List<IcCustomExportResultDTO.SqlColumn> allShowColumns = new ArrayList<>(exportConfigData.getShowSqlColumns());
//需要合并的列
List<Integer> mergeColumnIndexList = new ArrayList<>();
for (int i = 0; i < allShowColumns.size(); i++) {
IcCustomExportResultDTO.SqlColumn sqlColumn = allShowColumns.get(i);
if (!sqlColumn.getManyToOne()) {
mergeColumnIndexList.add(i);
if (!onlyGetData){
searchForm.setIsPage(false);
searchForm.setPageSize(NumConstant.TEN_THOUSAND);
//需要合并的列
List<Integer> mergeColumnIndexList = new ArrayList<>();
for (int i = 0; i < allShowColumns.size(); i++) {
IcCustomExportResultDTO.SqlColumn sqlColumn = allShowColumns.get(i);
if (!sqlColumn.getManyToOne()) {
mergeColumnIndexList.add(i);
}
}
}
int[] mergeColumnIndex = mergeColumnIndexList.stream().filter(Objects::nonNull).mapToInt(i -> i).toArray();
// 从那一列开始合并
int mergeRowIndex = exportConfigData.getHeaderRow();
int[] mergeColumnIndex = mergeColumnIndexList.stream().filter(Objects::nonNull).mapToInt(i -> i).toArray();
// 从那一列开始合并
int mergeRowIndex = exportConfigData.getHeaderRow();
// 头的策略
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
// 背景设置为红色
headWriteCellStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
FreezeAndFilter writeHandler = new FreezeAndFilter();
//从第几行开始冻结
writeHandler.rowSplit = exportConfigData.getHeaderRow();
excelWriter = EasyExcel.write(ExcelUtils.getOutputStreamForExcel("居民基本信息.xlsx", response))
.registerWriteHandler(new ExcelFillCellMergeStrategy(mergeRowIndex, mergeColumnIndex))
.registerWriteHandler(horizontalCellStyleStrategy)
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
.registerWriteHandler(writeHandler).build();
WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").head(exportConfigData.getHeaders()).build();
// 头的策略
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
// 背景设置为红色
headWriteCellStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
FreezeAndFilter writeHandler = new FreezeAndFilter();
//从第几行开始冻结
writeHandler.rowSplit = exportConfigData.getHeaderRow();
excelWriter = EasyExcel.write(ExcelUtils.getOutputStreamForExcel("居民基本信息.xlsx", response))
.registerWriteHandler(new ExcelFillCellMergeStrategy(mergeRowIndex, mergeColumnIndex))
.registerWriteHandler(horizontalCellStyleStrategy)
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
.registerWriteHandler(writeHandler).build();
writeSheet = EasyExcel.writerSheet("Sheet1").head(exportConfigData.getHeaders()).build();
}
String staffOrgPath = null;
if (StringUtils.isNotBlank(staffInfoCacheResult.getAgencyPIds()) && !NumConstant.ZERO_STR.equals(staffInfoCacheResult.getAgencyPIds())) {
@ -151,15 +163,31 @@ public class IcResiUserExportServiceImpl implements IcResiUserExportService {
} else {
staffOrgPath = staffInfoCacheResult.getAgencyId();
}
Page<Map<String, Object>> mapListPage = null;
allShowColumns.addAll(exportConfigData.getHiddenSqlColumns());
do {
if(StringUtils.isNotBlank(exportResiUserFormDTO.getId())){
ResiUserQueryValueDTO idCondition=new ResiUserQueryValueDTO();
idCondition.setTableName("ic_resi_user");
idCondition.setQueryType("equal");
idCondition.setColumnName("ID");
idCondition.setColumnValue(Arrays.asList(exportResiUserFormDTO.getId()));
if(CollectionUtils.isNotEmpty(searchForm.getConditions())){
searchForm.getConditions().add(idCondition);
}else{
List<ResiUserQueryValueDTO> conditions=new ArrayList<>();
conditions.add(idCondition);
searchForm.setConditions(conditions);
}
}
String finalStaffOrgPath = staffOrgPath;
mapListPage = PageHelper.startPage(searchForm.getPageNo(), searchForm.getPageSize(), searchForm.getIsPage()).doSelectPage(() -> {
icResiUserService.dynamicQuery(searchForm.getCustomerId(), searchForm.getFormCode(), IcResiUserConstant.IC_RESI_USER, allShowColumns, searchForm.getConditions(), staffInfoCacheResult.getAgencyId(), finalStaffOrgPath);
});
searchForm.setPageNo(searchForm.getPageNo() + NumConstant.ONE);
if (!searchForm.getIsPage()){
searchForm.setPageNo(searchForm.getPageNo() + NumConstant.ONE);
}
List<Map<String, Object>> result = mapListPage.getResult();
@ -168,46 +196,12 @@ public class IcResiUserExportServiceImpl implements IcResiUserExportService {
List<IcCustomExportResultDTO.SqlColumn> showSqlColumns = exportConfigData.getShowSqlColumns();
Set<String> hiddenColumnSet = exportConfigData.getHiddenSqlColumns().stream().map(IcCustomExportResultDTO.SqlColumn::getColumnName).collect(Collectors.toSet());
result.forEach(o -> {
List<Object> singleRowData = new ArrayList<>();
Map<String, Object> originalConditionMap = new ConcurrentHashMap<>();
o.forEach((key, value) -> {
Map<String, IcCustomExportResultDTO.SqlColumn> itemMap = showSqlColumns.stream().collect(Collectors.toMap(IcCustomExportResultDTO.SqlColumn::getColumnName, item -> item));
IcCustomExportResultDTO.SqlColumn columnDTO = itemMap.get(key);
//忽略 不需要显示的列的值得设置 要不然数据会写入到excel中
if (singleRowData.size() >= showSqlColumns.size()) {
return;
}
IcCustomExportResultDTO.SqlColumn sqlColumn = itemMap.get(key);
String tableName = sqlColumn.getTableName();
String itemId = sqlColumn.getItemId();
String columnName = columnDTO.getColumnName();
if (hiddenColumnSet.contains(columnName)) {
return;
}
String vauleStr = value == null ? StrConstant.EPMETY_STR : value.toString();
//保留原始值 便于remote条件获取
originalConditionMap.putIfAbsent(columnName, vauleStr);
ExportResiUserItemDTO exportResiUserItemDTO = itemOriginMap.get(tableName);
FormItemResult formItemResult = exportResiUserItemDTO.getItemMap().get(columnName);
String newValue = vauleStr;
if (Constant.OPITON_SOURCE_REMOTE.equals(sqlColumn.getOptionSourceType()) && StringUtils.isNotBlank(vauleStr)) {
putRemoteValue(exportResiUserItemDTO.getRemoteItemConditionMap().get(itemId), staffInfoCacheResult.getAgencyId(), o, originalConditionMap, formItemResult, columnName, vauleStr);
newValue = String.valueOf(o.get(columnName));
} else if (Constant.OPITON_SOURCE_LOCAL.equals(sqlColumn.getOptionSourceType())) {
newValue = putOptionValue(formItemResult, vauleStr);
}
if (FieldConstant.ID.equals(key)) {
newValue = Md5Util.md5(vauleStr);
}
singleRowData.add(newValue);
});
resultData.add(singleRowData);
getDataForResi(itemOriginMap, staffInfoCacheResult, resultData, showSqlColumns, hiddenColumnSet, o);
});
excelWriter.write(resultData, writeSheet);
} while (mapListPage.getResult().size() == searchForm.getPageSize());
if (!onlyGetData){
excelWriter.write(resultData, writeSheet);
}
} while (!searchForm.getIsPage() && mapListPage.getResult().size() == searchForm.getPageSize());
} catch (IOException e) {
log.error("exportIcResiUser exception", e);
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), e.getMessage(), "导出失败");
@ -216,6 +210,48 @@ public class IcResiUserExportServiceImpl implements IcResiUserExportService {
excelWriter.finish();
}
}
return mapListPage;
}
private void getDataForResi(Map<String, ExportResiUserItemDTO> itemOriginMap, CustomerStaffInfoCacheResult staffInfoCacheResult, List<List<Object>> resultData, List<IcCustomExportResultDTO.SqlColumn> showSqlColumns, Set<String> hiddenColumnSet, Map<String, Object> o) {
List<Object> singleRowData = new ArrayList<>();
Map<String, Object> originalConditionMap = new ConcurrentHashMap<>();
o.forEach((key, value) -> {
Map<String, IcCustomExportResultDTO.SqlColumn> itemMap = showSqlColumns.stream().collect(Collectors.toMap(IcCustomExportResultDTO.SqlColumn::getColumnName, item -> item));
IcCustomExportResultDTO.SqlColumn columnDTO = itemMap.get(key);
//忽略 不需要显示的列的值得设置 要不然数据会写入到excel中
if (singleRowData.size() >= showSqlColumns.size()) {
return;
}
IcCustomExportResultDTO.SqlColumn sqlColumn = itemMap.get(key);
String tableName = sqlColumn.getTableName();
String itemId = sqlColumn.getItemId();
String columnName = columnDTO.getColumnName();
if (hiddenColumnSet.contains(columnName)) {
return;
}
String vauleStr = value == null ? StrConstant.EPMETY_STR : value.toString();
//保留原始值 便于remote条件获取
originalConditionMap.putIfAbsent(columnName, vauleStr);
ExportResiUserItemDTO exportResiUserItemDTO = itemOriginMap.get(tableName);
FormItemResult formItemResult = exportResiUserItemDTO.getItemMap().get(columnName);
String newValue = vauleStr;
if (Constant.OPITON_SOURCE_REMOTE.equals(sqlColumn.getOptionSourceType()) && StringUtils.isNotBlank(vauleStr)) {
putRemoteValue(exportResiUserItemDTO.getRemoteItemConditionMap().get(itemId), staffInfoCacheResult.getAgencyId(), o, originalConditionMap, formItemResult, columnName, vauleStr);
newValue = String.valueOf(o.get(columnName));
} else if (Constant.OPITON_SOURCE_LOCAL.equals(sqlColumn.getOptionSourceType())) {
newValue = putOptionValue(formItemResult, vauleStr);
}
o.put(key,newValue);
if (FieldConstant.ID.equals(key)) {
newValue = Md5Util.md5(vauleStr);
}
singleRowData.add(newValue);
});
resultData.add(singleRowData);
}
/**
@ -229,8 +265,6 @@ public class IcResiUserExportServiceImpl implements IcResiUserExportService {
searchForm.setCustomerId(tokenDto.getCustomerId());
searchForm.setStaffId(tokenDto.getUserId());
ValidatorUtils.validateEntity(searchForm, IcResiUserPageFormDTO.AddUserInternalGroup.class);
searchForm.setIsPage(false);
searchForm.setPageSize(NumConstant.TEN_THOUSAND);
}
@Nullable

3
epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java

@ -969,6 +969,9 @@ public class IcResiUserServiceImpl extends BaseServiceImpl<IcResiUserDao, IcResi
}
}
pageInfo.setList(list);
if (formDTO.getIsPage()) {
return new PageData<>(pageInfo.getList(), pageInfo.getTotal(), formDTO.getPageSize());
}
return new PageData<>(pageInfo.getList(), pageInfo.getTotal());
}

3
pom.xml

@ -30,7 +30,8 @@
<module>epmet-module</module>
<module>epmet-user</module>
<module>epmet-openapi</module>
</modules>
<module>epmet-commons/epmet-commons-feignclient</module>
</modules>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

Loading…
Cancel
Save