Browse Source

12月12日现金管理多语言配置,成功导出多语言版本Excel表(修复)

huangqizheng/feature-20260106155423-红包修改
wangguorui 4 weeks ago
parent
commit
0b9a595767
  1. 447
      src/main/java/com/example/demo/Util/ExcelHeaderTranslator.java
  2. 13
      src/main/java/com/example/demo/domain/vo/bean/BeanConsumeArticle.java
  3. 11
      src/main/java/com/example/demo/domain/vo/bean/BeanConsumeFan.java
  4. 17
      src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java
  5. 12
      src/main/java/com/example/demo/domain/vo/bean/BeanOnlineRechargeInfo.java
  6. 9
      src/main/java/com/example/demo/domain/vo/bean/BeanSystemRechargeInfo.java
  7. 34
      src/main/java/com/example/demo/domain/vo/cash/CashCollection.java
  8. 15
      src/main/java/com/example/demo/domain/vo/cash/CashRecordDTO.java
  9. 17
      src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java
  10. 25
      src/main/java/com/example/demo/domain/vo/coin/RechargeUser.java
  11. 18
      src/main/java/com/example/demo/domain/vo/coin/RefundUser.java
  12. 218
      src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java

447
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<String, String> getRechargeHeaders(String lang) {
Map<String, String> 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<String> getRechargeColumnOrder() {
return Arrays.asList(
"name", "orderCode", "jwcode", "market", "activity",
"rateName", "money", "permanentGold", "freeGold",
"payModel", "payPlatform", "isRefund", "remark",
"adminName", "auditTime"
);
}
/**
* 获取消费明细的Excel表头映射
* 返回 Map<字段名, 中文表头>
*/
public Map<String, String> getConsumeHeaders(String lang) {
Map<String, String> 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<String> getConsumeColumnOrder() {
return Arrays.asList(
"name", "orderCode", "jwcode", "market", "goodsName",
"payPlatform", "sumGold", "permanentGold", "freeGold",
"taskGold", "remark", "adminName", "isRefund", "createTime", "price"
);
}
/**
* 获取退款明细的Excel表头映射
* 返回 Map<字段名, 中文表头>
*/
public Map<String, String> getRefundHeaders(String lang) {
Map<String, String> 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<String> getRefundColumnOrder() {
return Arrays.asList(
"orderCode", "name", "jwcode", "market", "goodsName",
"refundType", "refundModelDesc", "sumGold", "permanentGold",
"freeGold", "taskGold", "remark", "adminName", "auditTime"
);
}
/**
* 获取直播消费明细的Excel表头映射
* 返回 Map<字段名, 中文表头>
*/
public Map<String, String> getBeanConsumeLiveHeaders(String lang) {
Map<String, String> 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<String> getBeanConsumeLiveColumnOrder() {
return Arrays.asList(
"id", "name", "jwcode", "dept", "gift", "isBackpack",
"beanNum", "liveChannel", "freeBean", "buyBean", "liveName", "consumeTime"
);
}
/**
* 获取在线充值明细的Excel表头映射
* 返回 Map<字段名, 中文表头>
*/
public Map<String, String> getBeanOnlineRechargeHeaders(String lang) {
Map<String, String> 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<String> getBeanOnlineRechargeColumnOrder() {
return Arrays.asList(
"jwcode", "name", "market", "money", "num", "orderNo", "platform", "rechargeTime"
);
}
/**
* 获取现金收款明细的Excel表头映射
* 返回 Map<字段名, 中文表头>
*/
public Map<String, String> getCashCollectionHeaders(String lang) {
Map<String, String> 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<String> 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<String, String> getCashRecordHeaders(String lang) {
Map<String, String> 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<String> getCashRecordColumnOrder() {
return Arrays.asList(
"goodsName", "goodsNum", "numUnit", "Submitter", "id", "jwcode", "name", "market",
"status", "remark", "refundReason", "refundModel"
);
}
/**
* 获取文章消费明细的Excel表头映射
* 返回 Map<字段名, 中文表头>
*/
public Map<String, String> getBeanConsumeArticleHeaders(String lang) {
Map<String, String> 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<String> getBeanConsumeArticleColumnOrder() {
return Arrays.asList(
"id", "name", "jwcode", "dept", "type", "beanNum", "buyBean",
"freeBean", "articleId", "articleName", "author", "consumeTime"
);
}
/**
* 获取系统充值明细的Excel表头映射
* 返回 Map<字段名, 中文表头>
*/
public Map<String, String> getBeanSystemRechargeHeaders(String lang) {
Map<String, String> 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<String> getBeanSystemRechargeColumnOrder() {
return Arrays.asList(
"id","jwcode", "name", "market", "freeBean", "permanentBean", "remark", "rechargeTime"
);
}
/**
* 获取铁粉消费明细的Excel表头映射
* 返回 Map<字段名, 中文表头>
*/
public Map<String, String> getBeanConsumeFanHeaders(String lang) {
Map<String, String> 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<String> getBeanConsumeFanColumnOrder() {
return Arrays.asList(
"id", "name", "jwcode", "dept", "beanNum", "freeBean", "buyBean",
"channel", "type", "consumeTime"
);
}
/**
* 翻译表头
*/
private Map<String, String> translateHeaders(Map<String, String> headers, String lang) {
log.info("开始翻译表头,目标语言: {}", lang);
Map<String, String> translatedHeaders = new LinkedHashMap<>();
for (Map.Entry<String, String> 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");
}
}

13
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 910打赏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

11
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")

17
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; //排序字段

12
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

9
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

34
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;
}
}

15
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;
/**

17
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<String> markets; // 地区列表
@ExcelIgnore
private Integer flag; //是否为员工号
@ExcelProperty("折扣金币")
private BigDecimal price; // 折扣金币
}

25
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

18
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")

218
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<String, String> headers = excelHeaderTranslator.getRechargeHeaders(lang);
List<String> columnOrder = excelHeaderTranslator.getRechargeColumnOrder();
// 构建自定义表头
List<List<String>> head = new ArrayList<>();
for (String fieldName : columnOrder) {
String headerText = headers.get(fieldName);
if (headerText != null) {
List<String> headItems = new ArrayList<>();
headItems.add(headerText);
head.add(headItems);
}
}
writeSheet = EasyExcel.writerSheet("Sheet1")
.head(head)
.build();
}
// 如果是消费用户添加动态表头处理器
else if ("consumeUser".equals(exportType)) {
Map<String, String> headers = excelHeaderTranslator.getConsumeHeaders(lang);
List<String> columnOrder = excelHeaderTranslator.getConsumeColumnOrder();
// 构建自定义表头
List<List<String>> head = new ArrayList<>();
for (String fieldName : columnOrder) {
String headerText = headers.get(fieldName);
if (headerText != null) {
List<String> headItems = new ArrayList<>();
headItems.add(headerText);
head.add(headItems);
}
}
writeSheet = EasyExcel.writerSheet("Sheet1")
.head(head)
.build();
}
// 如果是退款用户添加动态表头处理器
else if ("refundUser".equals(exportType)) {
Map<String, String> headers = excelHeaderTranslator.getRefundHeaders(lang);
List<String> columnOrder = excelHeaderTranslator.getRefundColumnOrder();
// 构建自定义表头
List<List<String>> head = new ArrayList<>();
for (String fieldName : columnOrder) {
String headerText = headers.get(fieldName);
if (headerText != null) {
List<String> headItems = new ArrayList<>();
headItems.add(headerText);
head.add(headItems);
}
}
writeSheet = EasyExcel.writerSheet("Sheet1")
.head(head)
.build();
}
// 如果是直播消费用户添加动态表头处理器
else if ("liveUser".equals(exportType)) {
Map<String, String> headers = excelHeaderTranslator.getBeanConsumeLiveHeaders(lang);
List<String> columnOrder = excelHeaderTranslator.getBeanConsumeLiveColumnOrder();
// 构建自定义表头
List<List<String>> head = new ArrayList<>();
for (String fieldName : columnOrder) {
String headerText = headers.get(fieldName);
if (headerText != null) {
List<String> headItems = new ArrayList<>();
headItems.add(headerText);
head.add(headItems);
}
}
writeSheet = EasyExcel.writerSheet("Sheet1")
.head(head)
.build();
}
// 如果是铁粉消费用户添加动态表头处理器
else if ("fanUser".equals(exportType)) {
Map<String, String> headers = excelHeaderTranslator.getBeanConsumeFanHeaders(lang);
List<String> columnOrder = excelHeaderTranslator.getBeanConsumeFanColumnOrder();
// 构建自定义表头
List<List<String>> head = new ArrayList<>();
for (String fieldName : columnOrder) {
String headerText = headers.get(fieldName);
if (headerText != null) {
List<String> headItems = new ArrayList<>();
headItems.add(headerText);
head.add(headItems);
}
}
writeSheet = EasyExcel.writerSheet("Sheet1")
.head(head)
.build();
}
// 如果是文章消费用户添加动态表头处理器
else if ("articleUser".equals(exportType)) {
Map<String, String> headers = excelHeaderTranslator.getBeanConsumeArticleHeaders(lang);
List<String> columnOrder = excelHeaderTranslator.getBeanConsumeArticleColumnOrder();
// 构建自定义表头
List<List<String>> head = new ArrayList<>();
for (String fieldName : columnOrder) {
String headerText = headers.get(fieldName);
if (headerText != null) {
List<String> headItems = new ArrayList<>();
headItems.add(headerText);
head.add(headItems);
}
}
writeSheet = EasyExcel.writerSheet("Sheet1")
.head(head)
.build();
}
// 如果是金豆系统充值用户添加动态表头处理器
else if ("beanUser".equals(exportType)) {
Map<String, String> headers = excelHeaderTranslator.getBeanSystemRechargeHeaders(lang);
List<String> columnOrder = excelHeaderTranslator.getBeanSystemRechargeColumnOrder();
// 构建自定义表头
List<List<String>> head = new ArrayList<>();
for (String fieldName : columnOrder) {
String headerText = headers.get(fieldName);
if (headerText != null) {
List<String> headItems = new ArrayList<>();
headItems.add(headerText);
head.add(headItems);
}
}
writeSheet = EasyExcel.writerSheet("Sheet1")
.head(head)
.build();
}
// 如果是金豆在线充值用户添加动态表头处理器
else if ("onlineUser".equals(exportType)) {
Map<String, String> headers = excelHeaderTranslator.getBeanOnlineRechargeHeaders(lang);
List<String> columnOrder = excelHeaderTranslator.getBeanOnlineRechargeColumnOrder();
// 构建自定义表头
List<List<String>> head = new ArrayList<>();
for (String fieldName : columnOrder) {
String headerText = headers.get(fieldName);
if (headerText != null) {
List<String> headItems = new ArrayList<>();
headItems.add(headerText);
head.add(headItems);
}
}
writeSheet = EasyExcel.writerSheet("Sheet1")
.head(head)
.build();
}
// 如果是财务退款记录添加动态表头处理器
else if ("financeUser".equals(exportType)) {
Map<String, String> headers = excelHeaderTranslator.getCashRecordHeaders(lang);
List<String> columnOrder = excelHeaderTranslator.getCashRecordColumnOrder();
// 构建自定义表头
List<List<String>> head = new ArrayList<>();
for (String fieldName : columnOrder) {
String headerText = headers.get(fieldName);
if (headerText != null) {
List<String> headItems = new ArrayList<>();
headItems.add(headerText);
head.add(headItems);
}
}
writeSheet = EasyExcel.writerSheet("Sheet1")
.head(head)
.build();
}
// 如果是现金收款记录添加动态表头处理器
else if ("cashUser".equals(exportType)) {
Map<String, String> headers = excelHeaderTranslator.getCashCollectionHeaders(lang);
List<String> columnOrder = excelHeaderTranslator.getCashCollectionColumnOrder();
// 构建自定义表头
List<List<String>> head = new ArrayList<>();
for (String fieldName : columnOrder) {
String headerText = headers.get(fieldName);
if (headerText != null) {
List<String> 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();

Loading…
Cancel
Save