From 0b9a595767491a922fc04090ffaad73ede69c869 Mon Sep 17 00:00:00 2001 From: wangguorui <2069821375@qq.com> Date: Sat, 13 Dec 2025 18:43:55 +0800 Subject: [PATCH] =?UTF-8?q?12=E6=9C=8812=E6=97=A5=E7=8E=B0=E9=87=91?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=A4=9A=E8=AF=AD=E8=A8=80=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=EF=BC=8C=E6=88=90=E5=8A=9F=E5=AF=BC=E5=87=BA=E5=A4=9A=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E7=89=88=E6=9C=ACExcel=E8=A1=A8=EF=BC=88=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/demo/Util/ExcelHeaderTranslator.java | 447 +++++++++++++++++++++ .../demo/domain/vo/bean/BeanConsumeArticle.java | 13 - .../demo/domain/vo/bean/BeanConsumeFan.java | 11 +- .../demo/domain/vo/bean/BeanConsumeLive.java | 17 +- .../domain/vo/bean/BeanOnlineRechargeInfo.java | 12 +- .../domain/vo/bean/BeanSystemRechargeInfo.java | 9 - .../demo/domain/vo/cash/CashCollection.java | 34 +- .../example/demo/domain/vo/cash/CashRecordDTO.java | 15 +- .../example/demo/domain/vo/coin/ConsumeUser.java | 17 +- .../example/demo/domain/vo/coin/RechargeUser.java | 25 +- .../example/demo/domain/vo/coin/RefundUser.java | 18 +- .../serviceImpl/coin/ExportExcelServiceImpl.java | 218 +++++++++- 12 files changed, 675 insertions(+), 161 deletions(-) create mode 100644 src/main/java/com/example/demo/Util/ExcelHeaderTranslator.java diff --git a/src/main/java/com/example/demo/Util/ExcelHeaderTranslator.java b/src/main/java/com/example/demo/Util/ExcelHeaderTranslator.java new file mode 100644 index 0000000..4dbda49 --- /dev/null +++ b/src/main/java/com/example/demo/Util/ExcelHeaderTranslator.java @@ -0,0 +1,447 @@ +package com.example.demo.Util; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.*; + +/** + * Excel表头翻译工具类 + */ +@Component +@Slf4j +public class ExcelHeaderTranslator { + + @Autowired + private LanguageTranslationUtil languageTranslationUtil; + + /** + * 获取充值明细的Excel表头映射 + * 返回 Map<字段名, 中文表头> + */ + public Map getRechargeHeaders(String lang) { + Map headers = new LinkedHashMap<>(); + + // 定义所有表头的原始中文名称(对应 RechargeUser 类的字段) + headers.put("name", "姓名"); + headers.put("orderCode", "订单号"); + headers.put("jwcode", "精网号"); + headers.put("market", "所属地区"); + headers.put("activity", "活动名称"); + headers.put("rateName", "货币名称"); + headers.put("money", "充值金额"); + headers.put("permanentGold", "永久金币"); + headers.put("freeGold", "免费金币"); + headers.put("payModel", "支付方式"); + headers.put("payPlatform", "充值平台"); + headers.put("isRefund", "是否已退款 0-未退款,1-已退款"); + headers.put("remark", "备注"); + headers.put("adminName", "提交人"); + headers.put("auditTime", "充值时间"); + + // 如果需要翻译,则翻译表头 + if (!isChineseLanguage(lang)) { + return translateHeaders(headers, lang); + } + + return headers; + } + + /** + * 获取表头顺序(与 RechargeUser 类中的 @ExcelProperty 注解顺序保持一致) + */ + public List getRechargeColumnOrder() { + return Arrays.asList( + "name", "orderCode", "jwcode", "market", "activity", + "rateName", "money", "permanentGold", "freeGold", + "payModel", "payPlatform", "isRefund", "remark", + "adminName", "auditTime" + ); + } + + /** + * 获取消费明细的Excel表头映射 + * 返回 Map<字段名, 中文表头> + */ + public Map getConsumeHeaders(String lang) { + Map headers = new LinkedHashMap<>(); + + // 定义所有表头的原始中文名称(对应 ConsumeUser 类的字段) + headers.put("name", "姓名"); + headers.put("orderCode", "订单号"); + headers.put("jwcode", "精网号"); + headers.put("market", "所属地区"); + headers.put("goodsName", "商品名称"); + headers.put("payPlatform", "消耗平台"); + headers.put("sumGold", "消耗金币总数"); + headers.put("permanentGold", "永久金币"); + headers.put("freeGold", "免费金币"); + headers.put("taskGold", "任务金币"); + headers.put("remark", "备注"); + headers.put("adminName", "提交人"); + headers.put("isRefund", "是否退款"); + headers.put("createTime", "消耗时间"); + headers.put("price", "折扣金币"); + + // 如果需要翻译,则翻译表头 + if (!isChineseLanguage(lang)) { + return translateHeaders(headers, lang); + } + + return headers; + } + + /** + * 获取消费明细表头顺序 + */ + public List getConsumeColumnOrder() { + return Arrays.asList( + "name", "orderCode", "jwcode", "market", "goodsName", + "payPlatform", "sumGold", "permanentGold", "freeGold", + "taskGold", "remark", "adminName", "isRefund", "createTime", "price" + ); + } + + /** + * 获取退款明细的Excel表头映射 + * 返回 Map<字段名, 中文表头> + */ + public Map getRefundHeaders(String lang) { + Map headers = new LinkedHashMap<>(); + + // 定义所有表头的原始中文名称(对应 RefundUser 类的字段) + headers.put("orderCode", "订单号"); + headers.put("name", "姓名"); + headers.put("jwcode", "精网号"); + headers.put("market", "所属地区"); + headers.put("goodsName", "商品名称"); + headers.put("refundType", "退款类型"); + headers.put("refundModelDesc", "退款方式"); + headers.put("sumGold", "退款金币总数"); + headers.put("permanentGold", "永久金币"); + headers.put("freeGold", "免费金币"); + headers.put("taskGold", "任务金币"); + headers.put("remark", "退款原因"); + headers.put("adminName", "提交人"); + headers.put("auditTime", "退款时间"); + + // 如果需要翻译,则翻译表头 + if (!isChineseLanguage(lang)) { + return translateHeaders(headers, lang); + } + + return headers; + } + + /** + * 获取退款明细表头顺序 + */ + public List getRefundColumnOrder() { + return Arrays.asList( + "orderCode", "name", "jwcode", "market", "goodsName", + "refundType", "refundModelDesc", "sumGold", "permanentGold", + "freeGold", "taskGold", "remark", "adminName", "auditTime" + ); + } + + /** + * 获取直播消费明细的Excel表头映射 + * 返回 Map<字段名, 中文表头> + */ + public Map getBeanConsumeLiveHeaders(String lang) { + Map headers = new LinkedHashMap<>(); + + // 定义所有表头的原始中文名称(对应 BeanConsumeLive 类的字段) + headers.put("id", "ID"); + headers.put("name", "姓名"); + headers.put("jwcode", "精网号"); + headers.put("dept", "地区"); + headers.put("gift", "礼物"); + headers.put("isBackpack", "是否为背包礼物"); + headers.put("beanNum", "金豆数量"); + headers.put("liveChannel", "频道"); + headers.put("freeBean", "免费金豆"); + headers.put("buyBean", "付费金豆"); + headers.put("liveName", "直播间名称"); + headers.put("consumeTime", "消费时间"); + + // 如果需要翻译,则翻译表头 + if (!isChineseLanguage(lang)) { + return translateHeaders(headers, lang); + } + + return headers; + } + + /** + * 获取直播消费明细表头顺序 + */ + public List getBeanConsumeLiveColumnOrder() { + return Arrays.asList( + "id", "name", "jwcode", "dept", "gift", "isBackpack", + "beanNum", "liveChannel", "freeBean", "buyBean", "liveName", "consumeTime" + ); + } + + /** + * 获取在线充值明细的Excel表头映射 + * 返回 Map<字段名, 中文表头> + */ + public Map getBeanOnlineRechargeHeaders(String lang) { + Map headers = new LinkedHashMap<>(); + + // 定义所有表头的原始中文名称(对应 BeanOnlineRechargeInfo 类的字段) + headers.put("jwcode", "精网号"); + headers.put("name", "姓名"); + headers.put("market", "所属地区"); + headers.put("money", "金额"); + headers.put("num", "数量"); + headers.put("orderNo", "订单号"); + headers.put("platform", "充值平台 PC:1 手机:2"); + headers.put("rechargeTime", "充值时间"); + + // 如果需要翻译,则翻译表头 + if (!isChineseLanguage(lang)) { + return translateHeaders(headers, lang); + } + + return headers; + } + + /** + * 获取在线充值明细表头顺序 + */ + public List getBeanOnlineRechargeColumnOrder() { + return Arrays.asList( + "jwcode", "name", "market", "money", "num", "orderNo", "platform", "rechargeTime" + ); + } + + /** + * 获取现金收款明细的Excel表头映射 + * 返回 Map<字段名, 中文表头> + */ + public Map getCashCollectionHeaders(String lang) { + Map headers = new LinkedHashMap<>(); + + // 定义所有表头的原始中文名称(对应 CashCollection 类的字段) + headers.put("id", "序号"); + headers.put("jwcode", "精网号"); + headers.put("name", "姓名"); + headers.put("marketName", "所属地区"); + headers.put("activity", "活动名称"); + headers.put("orderCode", "金币订单号"); + headers.put("bankCode", "银行流水订单号"); + headers.put("goodsName", "商品名称"); + headers.put("goodNum", "商品数量"); + headers.put("numUnit", "数量单位"); + headers.put("permanentGold", "永久金币数量"); + headers.put("freeGold", "免费金币数量"); + headers.put("paymentCurrency", "付款币种"); + headers.put("paymentAmount", "付款金额"); + headers.put("receivedCurrency", "到账币种"); + headers.put("receivedAmount", "到账金额"); + headers.put("handlingCharge", "手续费"); + headers.put("receivedMarket", "到账地区"); + headers.put("payType", "支付方式"); + headers.put("payTime", "付款时间"); + headers.put("receivedTime", "到账时间"); + headers.put("submitterName", "提交人姓名"); + headers.put("voucher", "转账凭证"); + headers.put("remark", "备注"); + headers.put("auditName", "审核人"); + + // 如果需要翻译,则翻译表头 + if (!isChineseLanguage(lang)) { + return translateHeaders(headers, lang); + } + + return headers; + } + + /** + * 获取现金收款明细表头顺序 + */ + public List getCashCollectionColumnOrder() { + return Arrays.asList( + "id", "jwcode", "name", "marketName", "activity", "orderCode", "bankCode", + "goodsName", "goodNum", "numUnit", "permanentGold", "freeGold", "paymentCurrency", + "paymentAmount", "receivedCurrency", "receivedAmount", "handlingCharge", + "receivedMarket", "payType", "payTime", "receivedTime", "submitterName", + "voucher", "remark", "auditName" + ); + } + + /** + * 获取现金退款记录的Excel表头映射 + * 返回 Map<字段名, 中文表头> + */ + public Map getCashRecordHeaders(String lang) { + Map headers = new LinkedHashMap<>(); + + // 定义所有表头的原始中文名称(对应 CashRecordDTO 类的字段) + headers.put("goodsName", "产品名称"); + headers.put("goodsNum", "产品数量"); + headers.put("numUnit", "产品单位"); + headers.put("Submitter", "提交人"); + headers.put("id", "序号"); + headers.put("jwcode", "精网号"); + headers.put("name", "姓名"); + headers.put("market", "所属地区"); + headers.put("status", "订单状态"); + headers.put("remark", "备注"); + headers.put("refundReason", "退款理由"); + headers.put("refundModel", "退款方式"); + + // 如果需要翻译,则翻译表头 + if (!isChineseLanguage(lang)) { + return translateHeaders(headers, lang); + } + + return headers; + } + + /** + * 获取现金退款记录表头顺序 + */ + public List getCashRecordColumnOrder() { + return Arrays.asList( + "goodsName", "goodsNum", "numUnit", "Submitter", "id", "jwcode", "name", "market", + "status", "remark", "refundReason", "refundModel" + ); + } + + /** + * 获取文章消费明细的Excel表头映射 + * 返回 Map<字段名, 中文表头> + */ + public Map getBeanConsumeArticleHeaders(String lang) { + Map headers = new LinkedHashMap<>(); + + // 定义所有表头的原始中文名称(对应 BeanConsumeArticle 类的字段) + headers.put("id", "ID"); + headers.put("name", "姓名"); + headers.put("jwcode", "精网号"); + headers.put("dept", "地区"); + headers.put("type", "类型 9-打赏 10-打赏 11-付费"); + headers.put("beanNum", "金豆总数"); + headers.put("buyBean", "付费金豆数"); + headers.put("freeBean", "免费金豆数"); + headers.put("articleId", "文章/视频ID"); + headers.put("articleName", "文章/视频标题"); + headers.put("author", "作者"); + headers.put("consumeTime", "付费时间"); + + // 如果需要翻译,则翻译表头 + if (!isChineseLanguage(lang)) { + return translateHeaders(headers, lang); + } + + return headers; + } + + /** + * 获取文章消费明细表头顺序 + */ + public List getBeanConsumeArticleColumnOrder() { + return Arrays.asList( + "id", "name", "jwcode", "dept", "type", "beanNum", "buyBean", + "freeBean", "articleId", "articleName", "author", "consumeTime" + ); + } + + /** + * 获取系统充值明细的Excel表头映射 + * 返回 Map<字段名, 中文表头> + */ + public Map getBeanSystemRechargeHeaders(String lang) { + Map headers = new LinkedHashMap<>(); + + // 定义所有表头的原始中文名称(对应 BeanSystemRechargeInfo 类的字段) + headers.put("id", "ID"); + headers.put("jwcode", "精网号"); + headers.put("name", "姓名"); + headers.put("market", "所属地区"); + headers.put("freeBean", "免费金豆"); + headers.put("permanentBean", "付费金豆"); + headers.put("remark", "备注"); + headers.put("rechargeTime", "充值时间"); + + // 如果需要翻译,则翻译表头 + if (!isChineseLanguage(lang)) { + return translateHeaders(headers, lang); + } + + return headers; + } + + /** + * 获取系统充值明细表头顺序 + */ + public List getBeanSystemRechargeColumnOrder() { + return Arrays.asList( + "id","jwcode", "name", "market", "freeBean", "permanentBean", "remark", "rechargeTime" + ); + } + + /** + * 获取铁粉消费明细的Excel表头映射 + * 返回 Map<字段名, 中文表头> + */ + public Map getBeanConsumeFanHeaders(String lang) { + Map headers = new LinkedHashMap<>(); + + // 定义所有表头的原始中文名称(对应 BeanConsumeFan 类的字段) + headers.put("id", "ID"); + headers.put("name", "姓名"); + headers.put("jwcode", "精网号"); + headers.put("dept", "地区"); + headers.put("beanNum", "金豆数量"); + headers.put("freeBean", "免费金豆数"); + headers.put("buyBean", "付费金豆数"); + headers.put("channel", "频道"); + headers.put("type", "会员类型"); + headers.put("consumeTime", "加入时间"); + + // 如果需要翻译,则翻译表头 + if (!isChineseLanguage(lang)) { + return translateHeaders(headers, lang); + } + + return headers; + } + + /** + * 获取铁粉消费明细表头顺序 + */ + public List getBeanConsumeFanColumnOrder() { + return Arrays.asList( + "id", "name", "jwcode", "dept", "beanNum", "freeBean", "buyBean", + "channel", "type", "consumeTime" + ); + } + + /** + * 翻译表头 + */ + private Map translateHeaders(Map headers, String lang) { + log.info("开始翻译表头,目标语言: {}", lang); + Map translatedHeaders = new LinkedHashMap<>(); + for (Map.Entry entry : headers.entrySet()) { + String translatedHeader = languageTranslationUtil.translate(entry.getValue(), lang); + log.debug("表头翻译: {} -> {}", entry.getValue(), translatedHeader); + translatedHeaders.put(entry.getKey(), translatedHeader); + } + return translatedHeaders; + } + + /** + * 检查是否为中文语言 + */ + private boolean isChineseLanguage(String lang) { + if (lang == null) return true; + String langLower = lang.toLowerCase(); + return langLower.startsWith("zh") || langLower.equals("zh_cn") || langLower.equals("zh-tw"); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeArticle.java b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeArticle.java index 6936047..d2c180b 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeArticle.java +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeArticle.java @@ -22,40 +22,27 @@ import java.util.Date; @JsonIgnoreProperties(ignoreUnknown = true) public class BeanConsumeArticle { private static final long serialVersionUID = 1L; - @ExcelProperty("ID") private Integer id; - @ExcelProperty("姓名") private String name; //姓名 - @ExcelProperty("精网号") private Integer jwcode; //精网号 - @ExcelProperty("地区") private String dept; //地区/分部 - @ExcelProperty("类型 9-打赏 10-打赏 11-付费") private String type; //类型source_type 9、10打赏,11付费 @ExcelIgnore private Integer payMode; // 0 打赏 1 付费 2 其他 @ExcelIgnore private Integer flag; - @ExcelProperty("金豆总数") private String beanNum; //金豆数量 - @ExcelProperty("付费金豆数") private Integer buyBean; //付费金豆 - @ExcelProperty("免费金豆数") private Integer freeBean; //免费金豆 - @ExcelProperty("文章/视频ID") private Integer articleId; //文章/视频ID - @ExcelProperty("文章/视频标题") private String articleName; //文章/视频标题(source_name) - @ExcelProperty("作者") private String author; //作者 - //@ExcelProperty("支付类型") @ExcelIgnore private String payType; //支付类型 1-5:直播 7铁粉 8文章 @ExcelIgnore private String sortField; //排序字段 @ExcelIgnore private String sortOrder; //排序顺序 - @ExcelProperty("付费时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date consumeTime; // 付费时间 (时间戳转化) @ExcelIgnore diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeFan.java b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeFan.java index a7be8ee..91c46a6 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeFan.java +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeFan.java @@ -23,25 +23,17 @@ import java.util.Date; @JsonIgnoreProperties(ignoreUnknown = true) public class BeanConsumeFan { private static final long serialVersionUID = 1L; - @ExcelProperty("ID") private Integer id; - @ExcelProperty("姓名") private String name; //姓名 @ExcelIgnore private Integer roleId; //角色Id - @ExcelProperty("精网号") private Integer jwcode; //精网号 - @ExcelProperty("地区") private String dept; //地区/分部 - @ExcelProperty("金豆数量") private String beanNum; //金豆数量 - @ExcelProperty("免费金豆数") private String freeBean; //免费金豆 - @ExcelProperty("付费金豆数") private String buyBean; //付费金豆 - @ExcelProperty("频道") private String channel; //频道名称(source_name) - @ExcelProperty(value = "会员类型", converter = MemberTypeStringConverter.class) + @ExcelProperty(value = "", converter = MemberTypeStringConverter.class) private String type; //类型source_type 7单月,8连续包月 //@ExcelProperty("支付方式") @ExcelIgnore @@ -52,7 +44,6 @@ public class BeanConsumeFan { private String sortField; //排序字段 @ExcelIgnore private String sortOrder; //排序顺序 - @ExcelProperty("加入时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date consumeTime; // 消费时间 (时间戳转化) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java index 7794581..241386d 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.Data; import lombok.NoArgsConstructor; +import java.io.Serializable; import java.util.Date; import java.util.List; @@ -24,17 +25,13 @@ import java.util.List; @Data @NoArgsConstructor @JsonIgnoreProperties(ignoreUnknown = true) -public class BeanConsumeLive { +public class BeanConsumeLive implements Serializable { private static final long serialVersionUID = 1L; - @ExcelProperty("ID") private Integer id; @ExcelIgnore private Integer roleId; //角色Id - @ExcelProperty("姓名") private String name; //姓名 - @ExcelProperty("精网号") private Integer jwcode; //精网号 - @ExcelProperty("地区") private String dept; //地区/分部 //类型 直播: 1. 发礼物2. 发红包3. 发福袋4. 付费直播5. 加入粉丝团6. 发弹幕 //文章: 1. 打赏2. 付费 @@ -43,25 +40,17 @@ public class BeanConsumeLive { private Integer flag; @ExcelIgnore private String type; //类型 - @ExcelProperty("礼物") private String gift; //礼物名称 - @ExcelProperty(value = "是否为背包礼物", converter = YesNoConverter.class) + @ExcelProperty(value = "", converter = YesNoConverter.class) private String isBackpack; - @ExcelProperty("金豆数量") private String beanNum; //金豆数量 - @ExcelProperty("频道") private String liveChannel; //频道名称 - @ExcelProperty("免费金豆") private String freeBean; //免费金豆 - @ExcelProperty("付费金豆") private String buyBean; //付费金豆 - @ExcelProperty("直播间名称") private String liveName; //直播间名称 - @ExcelProperty("消费时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date consumeTime; // 消费时间 (时间戳转化) @ExcelIgnore - //@ExcelProperty("支付方式") private Integer payType; //支付方式(直播:12345,铁粉:7,文章:8) @ExcelIgnore private String sortField; //排序字段 diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanOnlineRechargeInfo.java b/src/main/java/com/example/demo/domain/vo/bean/BeanOnlineRechargeInfo.java index 1920721..0200f9d 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanOnlineRechargeInfo.java +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanOnlineRechargeInfo.java @@ -23,24 +23,14 @@ import java.util.List; @NoArgsConstructor @AllArgsConstructor public class BeanOnlineRechargeInfo { - - private Long id;//id - @ExcelProperty("精网号") private Integer jwcode; // 精网号 - @ExcelProperty("姓名") private String name; // 姓名 - @ExcelProperty("所属地区") private String market; // 所属地区 - @ExcelProperty("金额") private Double money; // 金额 - @ExcelProperty("数量") - private Integer num; // 数量 - @ExcelProperty("订单号") + private Integer num; // 数量 private String orderNo; // 订单号 - @ExcelProperty("充值平台 PC:1 手机:2") private String platform; // 充值平台 - @ExcelProperty("充值时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date rechargeTime; // 充值时间 @ExcelIgnore diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanSystemRechargeInfo.java b/src/main/java/com/example/demo/domain/vo/bean/BeanSystemRechargeInfo.java index 00bbf67..762c6b7 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanSystemRechargeInfo.java +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanSystemRechargeInfo.java @@ -23,24 +23,15 @@ import java.util.List; @NoArgsConstructor @AllArgsConstructor public class BeanSystemRechargeInfo { - - private Long id;//id - @ExcelProperty("精网号") private Integer jwcode; // 精网号 - @ExcelProperty("姓名") private String name; // 姓名 - @ExcelProperty("所属地区") private String market; // 所属地区 - @ExcelProperty("免费金豆") private Integer freeBean; // 免费豆 - @ExcelProperty("付费金豆") private Integer permanentBean; // 永久豆 @ExcelIgnore private Double money; // 金额 - @ExcelProperty("备注") private String remark; //备注 - @ExcelProperty("充值时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date rechargeTime; // 充值时间 @ExcelIgnore diff --git a/src/main/java/com/example/demo/domain/vo/cash/CashCollection.java b/src/main/java/com/example/demo/domain/vo/cash/CashCollection.java index 7d06b5e..3d7b75e 100644 --- a/src/main/java/com/example/demo/domain/vo/cash/CashCollection.java +++ b/src/main/java/com/example/demo/domain/vo/cash/CashCollection.java @@ -27,71 +27,43 @@ import java.util.List; @AllArgsConstructor public class CashCollection implements Serializable { private static final long serialVersionUID = 1L; - @ExcelProperty("序号") private Integer id; - //订单信息 @ExcelIgnore private Integer orderType; // 订单类型:1-收款,2-退款 - @ExcelProperty("精网号") private Integer jwcode; // 精网号 - @ExcelProperty("姓名") private String name; // 姓名 @ExcelIgnore private String market; // 所属地区 - @ExcelProperty("所属地区") private String marketName; // 所属地区名称 - @ExcelProperty("活动名称") private String activity; // 活动 @ExcelIgnore private String activityId; // 活动 - @ExcelProperty("金币订单号") private String orderCode; // 金币订单号 - @ExcelProperty("银行流水订单号") private String bankCode; // 银行流水订单号 - @ExcelProperty("商品名称") private String goodsName; // 商品名称 - @ExcelProperty("商品数量") private Integer goodNum; // 商品数量 - @ExcelProperty("数量单位") private String numUnit; //数量单位 个/月/年 - @ExcelProperty("永久金币数量") private Integer permanentGold; // 永久金币数量 - @ExcelProperty("免费金币数量") private Integer freeGold; // 免费金币数量 - //金额信息 - @ExcelProperty("付款币种") private String paymentCurrency; // 付款币种 - @ExcelProperty("付款金额") private BigDecimal paymentAmount; // 付款金额 - @ExcelProperty("到账币种") private String receivedCurrency; // 到账币种 - @ExcelProperty("到账金额") private BigDecimal receivedAmount; // 到账金额 - @ExcelProperty("手续费") private BigDecimal handlingCharge; // 手续费 - @ExcelProperty("到账地区") private String receivedMarket; //到账地区 - // 支付信息 - @ExcelProperty("支付方式") private String payType; // 支付方式 - @ExcelProperty("付款时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private LocalDateTime payTime; // 付款日期(秒级) - @ExcelProperty("到账时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private LocalDateTime receivedTime; // 到账日期(秒级) - //状态 操作人 @ExcelIgnore private Integer status; // 订单状态 @ExcelIgnore private Integer submitterId; // 提交人 id @ExcelIgnore private String submitterMarket; //提交人地区 - @ExcelProperty("提交人姓名") private String submitterName; // 提交人 姓名 - @ExcelProperty("转账凭证") private String voucher; // 转账凭证 - @ExcelProperty("备注") private String remark; // 备注 @ExcelIgnore private String receivedRemark; //到账备注 @@ -99,7 +71,6 @@ public class CashCollection implements Serializable { private String rejectReason; // 驳回理由 @ExcelIgnore private String auditId; //审核人id - @ExcelProperty("审核人" ) private String auditName; //审核人姓名 @ExcelIgnore private Integer cashRoleId; //角色id(0客服,1地区财务/负责人,2总部) @@ -112,8 +83,6 @@ public class CashCollection implements Serializable { @ExcelIgnore @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private LocalDateTime auditTime; - - //搜索筛条件 @ExcelIgnore @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date startTime; // 付款时间起 @@ -132,5 +101,4 @@ public class CashCollection implements Serializable { private String orderNoStatus; @ExcelIgnore private String payload; - - } +} diff --git a/src/main/java/com/example/demo/domain/vo/cash/CashRecordDTO.java b/src/main/java/com/example/demo/domain/vo/cash/CashRecordDTO.java index 3b553e4..c210608 100644 --- a/src/main/java/com/example/demo/domain/vo/cash/CashRecordDTO.java +++ b/src/main/java/com/example/demo/domain/vo/cash/CashRecordDTO.java @@ -29,11 +29,8 @@ import java.util.List; public class CashRecordDTO{ @ExcelIgnore private String activity;// 活动 - @ExcelProperty("产品名称") private String goodsName;// 商品名称 - @ExcelProperty("产品数量") private Integer goodsNum;// 商品数量 - @ExcelProperty("产品单位") private String numUnit;// 商品单位 @ExcelIgnore private BigDecimal gold;//永久金币 @@ -66,7 +63,6 @@ public class CashRecordDTO{ @ExcelIgnore private String paySubmitter; //提交人 - @ExcelProperty("提交人") private String Submitter; //审核人 @ExcelIgnore @@ -84,13 +80,11 @@ public class CashRecordDTO{ /** * 序号 */ - @ExcelProperty("序号") private Integer id; /** * 精网号 */ - @ExcelProperty("精网号") private Integer jwcode; /** @@ -98,13 +92,12 @@ public class CashRecordDTO{ */ @ExcelIgnore private String userName; - @ExcelProperty("姓名") private String name; /** * 所属地区 */ - @ExcelProperty(value = "所属地区",converter = MarketConverter.class) + @ExcelProperty(value = "",converter = MarketConverter.class) private Integer market; /** @@ -149,7 +142,7 @@ public class CashRecordDTO{ 30:总部财务待审核;32:总部财务驳回; 40:执行人待处理;41:执行人已处理,退款结束 */ - @ExcelProperty(value="订单状态",converter = OrderStatusConverter.class) + @ExcelProperty(value="",converter = OrderStatusConverter.class) private Integer status; /** @@ -173,7 +166,6 @@ public class CashRecordDTO{ /** * 备注 */ - @ExcelProperty("备注") private String remark; /** @@ -185,13 +177,12 @@ public class CashRecordDTO{ /** * 退款备注(理由),客服填写 */ - @ExcelProperty("退款理由") private String refundReason; /** * 退款方式(0全额/1部分) */ - @ExcelProperty(value = "退款方式",converter = RefundModelConverter.class) + @ExcelProperty(value = "",converter = RefundModelConverter.class) private Integer refundModel; /** diff --git a/src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java b/src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java index 990312c..bbe717d 100644 --- a/src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java +++ b/src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java @@ -30,36 +30,22 @@ public class ConsumeUser implements Serializable { private static final long serialVersionUID = 1L; - @ExcelProperty("姓名") private String name; // 客户姓名 - @ExcelProperty("订单号") private String orderCode; // 订单号 - @ExcelProperty("精网号") private Integer jwcode; // 精网号 - @ExcelProperty("所属地区") private String market; // 所属地区 - @ExcelProperty("商品名称") private String goodsName; // 商品名称 - @ExcelProperty("消耗平台") private String payPlatform; // 消费平台 - @ExcelProperty("消耗金币总数") private BigDecimal sumGold; // 金币总数 - @ExcelProperty("永久金币") private BigDecimal permanentGold; // 永久金币 - @ExcelProperty("免费金币") private BigDecimal freeGold; // 免费金币 - @ExcelProperty("任务金币") private BigDecimal taskGold; // 任务金币 - @ExcelProperty("备注") private String remark; // 备注 @ExcelIgnore -// @ExcelProperty("提交人ID") private Integer adminId; //提交人Id - @ExcelProperty("提交人") private String adminName; //提交人姓名 - @ExcelProperty(value = "是否退款", converter = RefundConverter.class) + @ExcelProperty(value = "", converter = RefundConverter.class) private Integer isRefund; //是否退款 - @ExcelProperty("消耗时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date createTime; // 消费时间 @ExcelIgnore @@ -80,6 +66,5 @@ public class ConsumeUser implements Serializable { private List markets; // 地区列表 @ExcelIgnore private Integer flag; //是否为员工号 - @ExcelProperty("折扣金币") private BigDecimal price; // 折扣金币 } diff --git a/src/main/java/com/example/demo/domain/vo/coin/RechargeUser.java b/src/main/java/com/example/demo/domain/vo/coin/RechargeUser.java index a3bd010..d7b9514 100644 --- a/src/main/java/com/example/demo/domain/vo/coin/RechargeUser.java +++ b/src/main/java/com/example/demo/domain/vo/coin/RechargeUser.java @@ -7,6 +7,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; import java.util.List; @@ -22,62 +23,40 @@ import java.util.List; @Data @NoArgsConstructor -public class RechargeUser { +public class RechargeUser implements Serializable { private static final long serialVersionUID = 1L; - @ExcelProperty("姓名") private String name; // 客户姓名 - @ExcelProperty("订单号") private String orderCode; // 订单号 - @ExcelProperty("精网号") private Integer jwcode; // 精网号 - - @ExcelProperty("所属地区") private String market; // 所属地区 - - @ExcelProperty("活动名称") private String activity; // 活动名称 @ExcelIgnore private Integer rateId; // 汇率ID - @ExcelProperty("货币名称") private String rateName; // 汇率名称 - - @ExcelProperty("充值金额") private BigDecimal money; // 金额[分] - - @ExcelProperty("永久金币") private BigDecimal permanentGold; // 永久金币 - - @ExcelProperty("免费金币") private BigDecimal freeGold; // 免费金币 - - @ExcelProperty("支付方式") private String payModel; // 支付方式 - - @ExcelProperty("充值平台") private String payPlatform; // 充值方式 - @ExcelProperty("是否已退款 0-未退款,1-已退款") private Integer isRefund; //是否已退款 @ExcelIgnore private String voucher; // 支付凭证 - @ExcelProperty("备注") private String remark; // 备注 @ExcelIgnore private Integer adminId; // 提交人Id - @ExcelProperty("提交人") private String adminName; // 提交人姓名 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") @ExcelIgnore private Date payTime; // 创建时间 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") - @ExcelProperty("充值时间") private Date auditTime; // 审核时间 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") @ExcelIgnore diff --git a/src/main/java/com/example/demo/domain/vo/coin/RefundUser.java b/src/main/java/com/example/demo/domain/vo/coin/RefundUser.java index 0fa7442..bcdeba4 100644 --- a/src/main/java/com/example/demo/domain/vo/coin/RefundUser.java +++ b/src/main/java/com/example/demo/domain/vo/coin/RefundUser.java @@ -7,6 +7,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; import java.util.List; @@ -23,46 +24,31 @@ import java.util.List; @Data @NoArgsConstructor @AllArgsConstructor -public class RefundUser { +public class RefundUser implements Serializable { private static final long serialVersionUID = 1L; - @ExcelProperty("订单号") private String orderCode; // 订单号 - @ExcelProperty("姓名") private String name; // 客户姓名 - @ExcelProperty("精网号") private Integer jwcode; // 精网号 - @ExcelProperty("所属地区") private String market; // 所属地区 - @ExcelProperty("商品名称") private String goodsName; // 商品名称 - @ExcelProperty("退款类型") private String refundType; // 退款类型 @ExcelIgnore private Byte refundModel; // 退款方式(0全部/1部分退款) - @ExcelProperty("退款方式") private String refundModelDesc; // 退款方式描述(用于多语言翻译) - @ExcelProperty("退款金币总数") private BigDecimal sumGold; // 金币总数 - @ExcelProperty("永久金币") private BigDecimal permanentGold; // 永久金币 - @ExcelProperty("免费金币") private BigDecimal freeGold; // 免费金币 - @ExcelProperty("任务金币") private BigDecimal taskGold; // 任务金币 - @ExcelProperty("退款原因") private String remark; // 退款原因 -// @ExcelProperty("提交人ID") @ExcelIgnore private Integer adminId; //提交人Id - @ExcelProperty("提交人") private String adminName; //提交人姓名 @ExcelIgnore @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date createTime; // 创建时间 - @ExcelProperty("退款时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date auditTime; // 审核时间 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") diff --git a/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java index 824a146..048e2f6 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java @@ -3,7 +3,11 @@ package com.example.demo.serviceImpl.coin; import cn.hutool.log.AbstractLog; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.handler.SheetWriteHandler; import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; +import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; +import com.example.demo.Util.ExcelHeaderTranslator; import com.example.demo.Util.ExcelUploadUtil; import com.example.demo.Util.JWTUtil; import com.example.demo.Util.LanguageTranslationUtil; @@ -51,9 +55,7 @@ import org.springframework.transaction.annotation.Transactional; import java.io.*; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.Arrays; -import java.util.Date; -import java.util.List; +import java.util.*; import java.util.function.Function; @Service @@ -89,6 +91,9 @@ public class ExportExcelServiceImpl implements ExportExcelService { // 注入LanguageTranslationUtil @Autowired private LanguageTranslationUtil languageTranslationUtil; + // 注入ExcelHeaderTranslator + @Autowired + private ExcelHeaderTranslator excelHeaderTranslator; // 每页查询的数据量 private static final int PAGE_SIZE = 5000; @Autowired @@ -453,8 +458,213 @@ public class ExportExcelServiceImpl implements ExportExcelService { try { // 5. 初始化Excel写入器 Class clazz = getExportClass(exportType); // 动态获取导出类 + + // 创建Excel写入器 excelWriter = EasyExcel.write(outputStream, clazz).build(); - WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build(); + WriteSheet writeSheet; + + // 如果是充值用户,添加动态表头处理器 + if ("rechargeUser".equals(exportType)) { + Map headers = excelHeaderTranslator.getRechargeHeaders(lang); + List columnOrder = excelHeaderTranslator.getRechargeColumnOrder(); + + // 构建自定义表头 + List> head = new ArrayList<>(); + for (String fieldName : columnOrder) { + String headerText = headers.get(fieldName); + if (headerText != null) { + List headItems = new ArrayList<>(); + headItems.add(headerText); + head.add(headItems); + } + } + + writeSheet = EasyExcel.writerSheet("Sheet1") + .head(head) + .build(); + } + // 如果是消费用户,添加动态表头处理器 + else if ("consumeUser".equals(exportType)) { + Map headers = excelHeaderTranslator.getConsumeHeaders(lang); + List columnOrder = excelHeaderTranslator.getConsumeColumnOrder(); + + // 构建自定义表头 + List> head = new ArrayList<>(); + for (String fieldName : columnOrder) { + String headerText = headers.get(fieldName); + if (headerText != null) { + List headItems = new ArrayList<>(); + headItems.add(headerText); + head.add(headItems); + } + } + + writeSheet = EasyExcel.writerSheet("Sheet1") + .head(head) + .build(); + } + // 如果是退款用户,添加动态表头处理器 + else if ("refundUser".equals(exportType)) { + Map headers = excelHeaderTranslator.getRefundHeaders(lang); + List columnOrder = excelHeaderTranslator.getRefundColumnOrder(); + + // 构建自定义表头 + List> head = new ArrayList<>(); + for (String fieldName : columnOrder) { + String headerText = headers.get(fieldName); + if (headerText != null) { + List headItems = new ArrayList<>(); + headItems.add(headerText); + head.add(headItems); + } + } + + writeSheet = EasyExcel.writerSheet("Sheet1") + .head(head) + .build(); + } + // 如果是直播消费用户,添加动态表头处理器 + else if ("liveUser".equals(exportType)) { + Map headers = excelHeaderTranslator.getBeanConsumeLiveHeaders(lang); + List columnOrder = excelHeaderTranslator.getBeanConsumeLiveColumnOrder(); + + // 构建自定义表头 + List> head = new ArrayList<>(); + for (String fieldName : columnOrder) { + String headerText = headers.get(fieldName); + if (headerText != null) { + List headItems = new ArrayList<>(); + headItems.add(headerText); + head.add(headItems); + } + } + + writeSheet = EasyExcel.writerSheet("Sheet1") + .head(head) + .build(); + } + // 如果是铁粉消费用户,添加动态表头处理器 + else if ("fanUser".equals(exportType)) { + Map headers = excelHeaderTranslator.getBeanConsumeFanHeaders(lang); + List columnOrder = excelHeaderTranslator.getBeanConsumeFanColumnOrder(); + + // 构建自定义表头 + List> head = new ArrayList<>(); + for (String fieldName : columnOrder) { + String headerText = headers.get(fieldName); + if (headerText != null) { + List headItems = new ArrayList<>(); + headItems.add(headerText); + head.add(headItems); + } + } + + writeSheet = EasyExcel.writerSheet("Sheet1") + .head(head) + .build(); + } + // 如果是文章消费用户,添加动态表头处理器 + else if ("articleUser".equals(exportType)) { + Map headers = excelHeaderTranslator.getBeanConsumeArticleHeaders(lang); + List columnOrder = excelHeaderTranslator.getBeanConsumeArticleColumnOrder(); + + // 构建自定义表头 + List> head = new ArrayList<>(); + for (String fieldName : columnOrder) { + String headerText = headers.get(fieldName); + if (headerText != null) { + List headItems = new ArrayList<>(); + headItems.add(headerText); + head.add(headItems); + } + } + + writeSheet = EasyExcel.writerSheet("Sheet1") + .head(head) + .build(); + } + // 如果是金豆系统充值用户,添加动态表头处理器 + else if ("beanUser".equals(exportType)) { + Map headers = excelHeaderTranslator.getBeanSystemRechargeHeaders(lang); + List columnOrder = excelHeaderTranslator.getBeanSystemRechargeColumnOrder(); + + // 构建自定义表头 + List> head = new ArrayList<>(); + for (String fieldName : columnOrder) { + String headerText = headers.get(fieldName); + if (headerText != null) { + List headItems = new ArrayList<>(); + headItems.add(headerText); + head.add(headItems); + } + } + + writeSheet = EasyExcel.writerSheet("Sheet1") + .head(head) + .build(); + } + // 如果是金豆在线充值用户,添加动态表头处理器 + else if ("onlineUser".equals(exportType)) { + Map headers = excelHeaderTranslator.getBeanOnlineRechargeHeaders(lang); + List columnOrder = excelHeaderTranslator.getBeanOnlineRechargeColumnOrder(); + + // 构建自定义表头 + List> head = new ArrayList<>(); + for (String fieldName : columnOrder) { + String headerText = headers.get(fieldName); + if (headerText != null) { + List headItems = new ArrayList<>(); + headItems.add(headerText); + head.add(headItems); + } + } + + writeSheet = EasyExcel.writerSheet("Sheet1") + .head(head) + .build(); + } + // 如果是财务退款记录,添加动态表头处理器 + else if ("financeUser".equals(exportType)) { + Map headers = excelHeaderTranslator.getCashRecordHeaders(lang); + List columnOrder = excelHeaderTranslator.getCashRecordColumnOrder(); + + // 构建自定义表头 + List> head = new ArrayList<>(); + for (String fieldName : columnOrder) { + String headerText = headers.get(fieldName); + if (headerText != null) { + List headItems = new ArrayList<>(); + headItems.add(headerText); + head.add(headItems); + } + } + + writeSheet = EasyExcel.writerSheet("Sheet1") + .head(head) + .build(); + } + // 如果是现金收款记录,添加动态表头处理器 + else if ("cashUser".equals(exportType)) { + Map headers = excelHeaderTranslator.getCashCollectionHeaders(lang); + List columnOrder = excelHeaderTranslator.getCashCollectionColumnOrder(); + + // 构建自定义表头 + List> head = new ArrayList<>(); + for (String fieldName : columnOrder) { + String headerText = headers.get(fieldName); + if (headerText != null) { + List headItems = new ArrayList<>(); + headItems.add(headerText); + head.add(headItems); + } + } + + writeSheet = EasyExcel.writerSheet("Sheet1") + .head(head) + .build(); + } else { + writeSheet = EasyExcel.writerSheet("Sheet1").build(); + } // 6. 分页查询并写入数据 Page page = new Page();