Commit 7a364282 authored by 韩桐桐's avatar 韩桐桐

统计分析导出接口开发

parent 5a3ba5c7
package com.yeejoin.amos.boot.module.common.api.converter;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 通用的自定义字段转换器
* 用于处理Excel导入导出时的字段转换逻辑
*/
@Component
public class CommonCustomConverter {
/**
* 年月日格式转换器
*/
public static class Y_M_D_DateConverter implements Converter<Date> {
@Override
public Class supportJavaTypeKey() {
return null;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return null;
}
@Override
public Date convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
return null;
}
@Override
public CellData convertToExcelData(Date value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
if (value == null) {
return new CellData("");
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
return new CellData(sdf.format(value));
}
}
}
package com.yeejoin.amos.boot.module.common.api.converter;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.yeejoin.amos.boot.biz.common.entity.DataDictionary;
import com.yeejoin.amos.boot.biz.common.service.impl.DataDictionaryServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 人员信息自定义字段转换器
* 用于处理Excel导入导出时的字段转换逻辑
*/
@Component
public class PersonFieldCustomConverter {
private static DataDictionaryServiceImpl dataDictionaryService;
@Autowired
public void setDataDictionaryService(DataDictionaryServiceImpl dataDictionaryService) {
PersonFieldCustomConverter.dataDictionaryService = dataDictionaryService;
}
/**
* 【证件类型】转换器
*/
public static class CertificateTypeConverter implements Converter<String> {
private static final Map<String, String> CODE_TO_NAME_MAP = new ConcurrentHashMap<>();
private static final Map<String, String> NAME_TO_CODE_MAP = new ConcurrentHashMap<>();
// 使用静态初始化块加载数据字典
static {
refreshDictionaryCache();
}
/**
* 刷新数据字典缓存
*/
public static void refreshDictionaryCache() {
List<DataDictionary> dictionaries = dataDictionaryService.getByType("ZJLX");
CODE_TO_NAME_MAP.clear();
NAME_TO_CODE_MAP.clear();
dictionaries.forEach(dictionary -> {
CODE_TO_NAME_MAP.put(dictionary.getCode(), dictionary.getName());
NAME_TO_CODE_MAP.put(dictionary.getName(), dictionary.getCode());
});
}
@Override
public Class<?> supportJavaTypeKey() {
return String.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
@Override
public String convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
String cellValue = cellData.getStringValue();
return NAME_TO_CODE_MAP.getOrDefault(cellValue, cellValue);
}
@Override
public CellData convertToExcelData(String value, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
String displayValue = CODE_TO_NAME_MAP.getOrDefault(value, value);
return new CellData(displayValue);
}
}
/**
* 【性别】类型转换器
*/
public static class GenderConverter implements Converter<String> {
private static final Map<String, String> CODE_TO_NAME_MAP = new ConcurrentHashMap<>();
private static final Map<String, String> NAME_TO_CODE_MAP = new ConcurrentHashMap<>();
// 使用静态初始化块加载数据字典
static {
refreshDictionaryCache();
}
/**
* 刷新数据字典缓存
*/
public static void refreshDictionaryCache() {
CODE_TO_NAME_MAP.clear();
NAME_TO_CODE_MAP.clear();
CODE_TO_NAME_MAP.put("1", "男");
CODE_TO_NAME_MAP.put("0", "女");
NAME_TO_CODE_MAP.put("男", "1");
NAME_TO_CODE_MAP.put("女", "0");
}
@Override
public Class<?> supportJavaTypeKey() {
return String.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
@Override
public String convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
String cellValue = cellData.getStringValue();
return NAME_TO_CODE_MAP.getOrDefault(cellValue, "未知");
}
@Override
public CellData convertToExcelData(String value, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
String displayValue = CODE_TO_NAME_MAP.getOrDefault(value, "未知");
return new CellData(displayValue);
}
}
/**
* 【学历】类型转换器
*/
public static class EducationConverter implements Converter<String> {
private static final Map<String, String> CODE_TO_NAME_MAP = new ConcurrentHashMap<>();
private static final Map<String, String> NAME_TO_CODE_MAP = new ConcurrentHashMap<>();
// 使用静态初始化块加载数据字典
static {
refreshDictionaryCache();
}
/**
* 刷新数据字典缓存
*/
public static void refreshDictionaryCache() {
List<DataDictionary> dictionaries = dataDictionaryService.getByType("QYRYXL");
CODE_TO_NAME_MAP.clear();
NAME_TO_CODE_MAP.clear();
dictionaries.forEach(dictionary -> {
CODE_TO_NAME_MAP.put(dictionary.getCode(), dictionary.getName());
NAME_TO_CODE_MAP.put(dictionary.getName(), dictionary.getCode());
});
}
@Override
public Class<?> supportJavaTypeKey() {
return String.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
@Override
public String convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
String cellValue = cellData.getStringValue();
return NAME_TO_CODE_MAP.getOrDefault(cellValue, cellValue);
}
@Override
public CellData convertToExcelData(String value, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
String displayValue = CODE_TO_NAME_MAP.getOrDefault(value, value);
return new CellData(displayValue);
}
}
}
\ No newline at end of file
package com.yeejoin.amos.boot.module.common.api.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.yeejoin.amos.boot.biz.common.annotation.TechnicalParameter;
import com.yeejoin.amos.boot.module.common.api.dto.TechParamItem;
import lombok.Data;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.*;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.math.BigDecimal;
import java.math.RoundingMode;
......@@ -389,6 +391,9 @@ public class ESEquipmentInfo {
@Field(type = FieldType.Date, format = DateFormat.date)
private LocalDate dateValue;
public TechParam() {
}
public TechParam(TechParamItem paramItem, Object rawValue) {
this.paramKey = paramItem.getParamKey();
this.paramLabel = paramItem.getParamLabel();
......
......@@ -3,6 +3,9 @@ package com.yeejoin.amos.boot.module.statistics.api.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.HashMap;
import java.util.Map;
@AllArgsConstructor
@Getter
public enum StatisticalAnalysisEnum {
......@@ -22,4 +25,21 @@ public enum StatisticalAnalysisEnum {
private String code;
private String key;
private static final Map<String, StatisticalAnalysisEnum> CODE_MAP = new HashMap<>();
static {
for (StatisticalAnalysisEnum value : values()) {
CODE_MAP.put(value.code, value);
}
}
/**
* 根据code获取枚举实例(优化版)
* @param code 枚举编码
* @return 对应的枚举实例,未找到时返回null
*/
public static StatisticalAnalysisEnum getEnumByCode(String code) {
return CODE_MAP.get(code);
}
}
package com.yeejoin.amos.boot.module.statistics.api.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import com.yeejoin.amos.boot.module.common.api.converter.CommonCustomConverter;
import com.yeejoin.amos.boot.module.common.api.converter.CompanyFieldCustomConverter;
import lombok.*;
import java.util.Date;
/**
* 企业
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@HeadRowHeight(35)// 标题行高度
@ContentRowHeight(15)// 内容行高度
@ColumnWidth(30)// 默认列宽
public class CompanyInfoVo {
// -------------------------- 基本信息 -------------------------------
@ExcelProperty("企业名称")
private String useUnit;
@ExcelProperty("企业统一信用代码")
private String useCode;
@ExcelProperty("单位类型")
private String unitType;
@ExcelProperty("管辖机构名称")
private String superviseOrgName;
@ExcelProperty("监管系统唯一编码")
private String superviseCode;
@ExcelProperty("联系人")
private String contactUser;
@ExcelProperty("联系人电话")
private String contactPhone;
@ExcelProperty("企业详情地址")
private String address;
@ExcelProperty("监管标签")
private String regulatoryLabels;
@ExcelProperty(value = "行业主管部门", converter = CompanyFieldCustomConverter.HYZGBMTypeConverter.class)
private String industrySupervisor;
@ExcelProperty("经营状态")
private String operatingStatus;
@ExcelProperty(value = "涉及设备类型", converter = CompanyFieldCustomConverter.InvolvedEquipTypeConverter.class)
@ColumnWidth(50)
private String equipCategory;
@ExcelProperty("办公区域")
private String officeRegion;
// ------------------------------------- 资质 ------------------------------------
@ExcelProperty(value = {"资质信息", "证书编号"})
private String certNo;
@ExcelProperty(value = {"资质信息", "证书类型名称"})
private String certType;
@ExcelProperty(value = {"资质信息", "发证机关"}, converter = CompanyFieldCustomConverter.ApprovedOrganCodeConverter.class)
private String approvedOrganCode;
@ExcelProperty(value = {"资质信息", "许可到期日期"}, converter = CommonCustomConverter.Y_M_D_DateConverter.class)
private Date expiryDate;
@ExcelProperty(value = {"资质信息", "许可项目/检验类型/设备品种(核准项目名称)"}, converter = CompanyFieldCustomConverter.ItemCodeConverter.class)
@ColumnWidth(80)
private String itemCode;
@ExcelProperty(value = {"资质信息", "机构类别枚举"}, converter = CompanyFieldCustomConverter.AgencyTypeConverter.class)
private String agencyType;
@ExcelProperty(value = {"资质信息", "资质类型编码(检验检测、其他)"}, converter = CompanyFieldCustomConverter.LicenceTypeConverter.class)
private String licenceType;
@ExcelProperty(value = {"资质信息", "发证日期"}, converter = CommonCustomConverter.Y_M_D_DateConverter.class)
private Date issueDate;
}
\ No newline at end of file
package com.yeejoin.amos.boot.module.statistics.api.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import com.yeejoin.amos.boot.module.common.api.converter.CommonCustomConverter;
import com.yeejoin.amos.boot.module.common.api.converter.PersonFieldCustomConverter;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 人员
*/
@Data
@HeadRowHeight(35)// 标题行高度
@ContentRowHeight(15)// 内容行高度
@ColumnWidth(30)// 默认列宽
public class PersonVo implements Serializable {
// -------------------------- 基本信息 -------------------------------
@ExcelProperty("姓名")
private String name;
@ExcelProperty(value = "证件类型", converter = PersonFieldCustomConverter.CertificateTypeConverter.class)
private String certificateType;
@ExcelProperty("证件编号")
private String certificateNum;
@ExcelProperty(value = "性别", converter = PersonFieldCustomConverter.GenderConverter.class)
private String gender;
@ExcelProperty("单位名称")
private String unitName;
@ExcelProperty("企业编码")
private String unitCode;
@ExcelProperty("岗位名称")
private String postName;
@ExcelProperty("联系电话")
private String phone;
@ExcelProperty(value = "出生日期", converter = CommonCustomConverter.Y_M_D_DateConverter.class)
private Date birthday;
@ExcelProperty(value = "学历", converter = PersonFieldCustomConverter.EducationConverter.class)
private String education;
@ExcelProperty("专业")
private String speciality;
@ExcelProperty("邮箱")
private String email;
@ExcelProperty("住址")
private String address;
@ExcelProperty("人员所属企业单位类型")
@ColumnWidth(60)
private String unitType;
@ExcelProperty("设备类型")
private String equipType;
@ExcelProperty("职称")
private String jobTitle;
@ExcelProperty("岗位子类型")
private String subPostName;
@ExcelProperty("管辖机构名称")
private String superviseOrgName;
@ExcelProperty(value = "创建时间", converter = CommonCustomConverter.Y_M_D_DateConverter.class)
private Date createDate;
// ------------------------------------- 资质 ------------------------------------
@ExcelProperty(value = {"资质信息", "检验检测-级别"})
private String permissionLevel;
@ExcelProperty(value = {"资质信息", "检验检测-资质项目"})
private String permissionItem;
@ExcelProperty(value = {"资质信息", "证书编号"})
private String certNo;
@ExcelProperty(value = {"资质信息", "有效期至"}, converter = CommonCustomConverter.Y_M_D_DateConverter.class)
private Date expiryDate;
@ExcelProperty(value = {"资质信息", "发证机关"})
private String approvedOrgan;
@ExcelProperty(value = {"资质信息", "发证日期"}, converter = CommonCustomConverter.Y_M_D_DateConverter.class)
private Date issueDate;
@ExcelProperty(value = {"资质信息", "证书类型"})
private String certType;
@ExcelProperty(value = {"资质信息", "作业项目"})
private String jobItem;
@ExcelProperty(value = {"资质信息", "项目代号"})
private String itemCode;
@ExcelProperty(value = {"资质信息", "其他作业项目"})
private String otherItem;
}
\ No newline at end of file
......@@ -16,7 +16,6 @@ import org.typroject.tyboot.core.restful.utils.ResponseModel;
import java.util.List;
import java.util.Map;
import java.util.UUID;
/**
* 综合统计分析API
......@@ -170,12 +169,10 @@ public class ComprehensiveStatisticalAnalysisController extends BaseController {
@PostMapping(value = "/export")
@ApiOperation(httpMethod = "POST", value = "综合统计分析接口-导出", notes = "综合统计分析接口-导出")
public ResponseModel<String> export(@RequestBody Map<String, Object> map) {
String uuid = UUID.randomUUID().toString();
statisticalAnalysisService.startDownLoadMsg("综合统计分析设备列表", uuid);
RequestContextWrapper contextWrapper = RequestContextWrapper.capture();
new Thread(() -> {
contextWrapper.apply();
statisticalAnalysisService.export(uuid, new JSONObject(map));
statisticalAnalysisService.export(new JSONObject(map));
}).start();
return ResponseHelper.buildResponse("后台处理中,请注意下载!");
}
......
package com.yeejoin.amos.boot.module.statistcs.biz.utils;
import com.yeejoin.amos.boot.biz.common.annotation.TechnicalParameter;
import com.yeejoin.amos.boot.module.common.api.dto.ITechParamDefine;
import org.reflections.Reflections;
import java.lang.reflect.Field;
import java.util.AbstractMap;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
public class TechParamUtil {
private static final Set<Class<? extends ITechParamDefine>> subClasses;
private static final ConcurrentHashMap<String, String> allTechParamsMap = new ConcurrentHashMap<>();
static {
//▼ 指定扫描包路径(根据实际项目调整)
Reflections reflections = new Reflections("com.yeejoin.amos.boot.module.common.api.dto");
//▼ 获取所有继承ITechParamsMeta的类
subClasses = reflections.getSubTypesOf(ITechParamDefine.class);
for (Class<? extends ITechParamDefine> subClass : subClasses) {
Field[] fields = subClass.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
TechnicalParameter technicalParameter = field.getAnnotation(TechnicalParameter.class);
allTechParamsMap.put(technicalParameter.key(), technicalParameter.label());
}
}
}
/**
* 获取所有设备类型的技术参数
*
* @return result
*/
public static AbstractMap<String, String> getAllTechParams() {
return allTechParamsMap;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment