You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

526 lines
19 KiB

  1. package com.example.demo.Util;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Component;
  5. import java.util.*;
  6. /**
  7. * Excel表头翻译工具类
  8. */
  9. @Component
  10. @Slf4j
  11. public class ExcelHeaderTranslator {
  12. @Autowired
  13. private LanguageTranslationUtil languageTranslationUtil;
  14. /**
  15. * 获取充值明细的Excel表头映射
  16. * 返回 Map<字段名, 中文表头>
  17. */
  18. public Map<String, String> getRechargeHeaders(String lang) {
  19. Map<String, String> headers = new LinkedHashMap<>();
  20. // 定义所有表头的原始中文名称(对应 RechargeUser 类的字段)
  21. headers.put("name", "姓名");
  22. headers.put("orderCode", "订单号");
  23. headers.put("jwcode", "精网号");
  24. headers.put("market", "所属地区");
  25. headers.put("activity", "活动名称");
  26. headers.put("rateName", "货币名称");
  27. headers.put("money", "充值金额");
  28. headers.put("permanentGold", "永久金币");
  29. headers.put("freeGold", "免费金币");
  30. headers.put("payModel", "支付方式");
  31. headers.put("payPlatform", "充值平台");
  32. headers.put("isRefund", "是否已退款 0-未退款,1-已退款");
  33. headers.put("remark", "备注");
  34. headers.put("adminName", "提交人");
  35. headers.put("auditTime", "充值时间");
  36. // 如果需要翻译,则翻译表头
  37. if (!isChineseLanguage(lang)) {
  38. return translateHeaders(headers, lang);
  39. }
  40. return headers;
  41. }
  42. /**
  43. * 获取表头顺序 RechargeUser 类中的 @ExcelProperty 注解顺序保持一致
  44. */
  45. public List<String> getRechargeColumnOrder() {
  46. return Arrays.asList(
  47. "name", "orderCode", "jwcode", "market", "activity",
  48. "rateName", "money", "permanentGold", "freeGold",
  49. "payModel", "payPlatform", "isRefund", "remark",
  50. "adminName", "auditTime"
  51. );
  52. }
  53. /**
  54. * 获取消费明细的Excel表头映射
  55. * 返回 Map<字段名, 中文表头>
  56. */
  57. public Map<String, String> getConsumeHeaders(String lang) {
  58. Map<String, String> headers = new LinkedHashMap<>();
  59. // 定义所有表头的原始中文名称(对应 ConsumeUser 类的字段)
  60. headers.put("name", "姓名");
  61. headers.put("orderCode", "订单号");
  62. headers.put("jwcode", "精网号");
  63. headers.put("market", "所属地区");
  64. headers.put("goodsName", "商品名称");
  65. headers.put("payPlatform", "消耗平台");
  66. headers.put("sumGold", "消耗金币总数");
  67. headers.put("permanentGold", "永久金币");
  68. headers.put("freeGold", "免费金币");
  69. headers.put("taskGold", "任务金币");
  70. headers.put("remark", "备注");
  71. headers.put("adminName", "提交人");
  72. headers.put("isRefund", "是否退款");
  73. headers.put("createTime", "消耗时间");
  74. headers.put("price", "折扣金币");
  75. // 如果需要翻译,则翻译表头
  76. if (!isChineseLanguage(lang)) {
  77. return translateHeaders(headers, lang);
  78. }
  79. return headers;
  80. }
  81. /**
  82. * 获取消费明细表头顺序
  83. */
  84. public List<String> getConsumeColumnOrder() {
  85. return Arrays.asList(
  86. "name", "orderCode", "jwcode", "market", "goodsName",
  87. "payPlatform", "sumGold", "permanentGold", "freeGold",
  88. "taskGold", "remark", "adminName", "isRefund", "createTime", "price"
  89. );
  90. }
  91. /**
  92. * 获取退款明细的Excel表头映射
  93. * 返回 Map<字段名, 中文表头>
  94. */
  95. public Map<String, String> getRefundHeaders(String lang) {
  96. Map<String, String> headers = new LinkedHashMap<>();
  97. // 定义所有表头的原始中文名称(对应 RefundUser 类的字段)
  98. headers.put("orderCode", "订单号");
  99. headers.put("name", "姓名");
  100. headers.put("jwcode", "精网号");
  101. headers.put("market", "所属地区");
  102. headers.put("goodsName", "商品名称");
  103. headers.put("refundType", "退款类型");
  104. headers.put("refundModelDesc", "退款方式");
  105. headers.put("sumGold", "退款金币总数");
  106. headers.put("permanentGold", "永久金币");
  107. headers.put("freeGold", "免费金币");
  108. headers.put("taskGold", "任务金币");
  109. headers.put("remark", "退款原因");
  110. headers.put("adminName", "提交人");
  111. headers.put("auditTime", "退款时间");
  112. // 如果需要翻译,则翻译表头
  113. if (!isChineseLanguage(lang)) {
  114. return translateHeaders(headers, lang);
  115. }
  116. return headers;
  117. }
  118. /**
  119. * 获取退款明细表头顺序
  120. */
  121. public List<String> getRefundColumnOrder() {
  122. return Arrays.asList(
  123. "orderCode", "name", "jwcode", "market", "goodsName",
  124. "refundType", "refundModelDesc", "sumGold", "permanentGold",
  125. "freeGold", "taskGold", "remark", "adminName", "auditTime"
  126. );
  127. }
  128. /**
  129. * 获取直播消费明细的Excel表头映射
  130. * 返回 Map<字段名, 中文表头>
  131. */
  132. public Map<String, String> getBeanConsumeLiveHeaders(String lang) {
  133. Map<String, String> headers = new LinkedHashMap<>();
  134. // 定义所有表头的原始中文名称(对应 BeanConsumeLive 类的字段)
  135. headers.put("id", "ID");
  136. headers.put("name", "姓名");
  137. headers.put("jwcode", "精网号");
  138. headers.put("dept", "地区");
  139. headers.put("gift", "礼物");
  140. headers.put("isBackpack", "是否为背包礼物");
  141. headers.put("beanNum", "金豆数量");
  142. headers.put("liveChannel", "频道");
  143. headers.put("freeBean", "免费金豆");
  144. headers.put("buyBean", "付费金豆");
  145. headers.put("liveName", "直播间名称");
  146. headers.put("consumeTime", "消费时间");
  147. // 如果需要翻译,则翻译表头
  148. if (!isChineseLanguage(lang)) {
  149. return translateHeaders(headers, lang);
  150. }
  151. return headers;
  152. }
  153. /**
  154. * 获取直播消费明细表头顺序
  155. */
  156. public List<String> getBeanConsumeLiveColumnOrder() {
  157. return Arrays.asList(
  158. "id", "name", "jwcode", "dept", "gift", "isBackpack",
  159. "beanNum", "liveChannel", "freeBean", "buyBean", "liveName", "consumeTime"
  160. );
  161. }
  162. /**
  163. * 获取在线充值明细的Excel表头映射
  164. * 返回 Map<字段名, 中文表头>
  165. */
  166. public Map<String, String> getBeanOnlineRechargeHeaders(String lang) {
  167. Map<String, String> headers = new LinkedHashMap<>();
  168. // 定义所有表头的原始中文名称(对应 BeanOnlineRechargeInfo 类的字段)
  169. headers.put("jwcode", "精网号");
  170. headers.put("name", "姓名");
  171. headers.put("market", "所属地区");
  172. headers.put("money", "金额");
  173. headers.put("num", "数量");
  174. headers.put("orderNo", "订单号");
  175. headers.put("platform", "充值平台 PC:1 手机:2");
  176. headers.put("rechargeTime", "充值时间");
  177. // 如果需要翻译,则翻译表头
  178. if (!isChineseLanguage(lang)) {
  179. return translateHeaders(headers, lang);
  180. }
  181. return headers;
  182. }
  183. /**
  184. * 获取在线充值明细表头顺序
  185. */
  186. public List<String> getBeanOnlineRechargeColumnOrder() {
  187. return Arrays.asList(
  188. "jwcode", "name", "market", "money", "num", "orderNo", "platform", "rechargeTime"
  189. );
  190. }
  191. /**
  192. * 获取现金收款明细的Excel表头映射
  193. * 返回 Map<字段名, 中文表头>
  194. */
  195. public Map<String, String> getCashCollectionHeaders(String lang) {
  196. Map<String, String> headers = new LinkedHashMap<>();
  197. // 定义所有表头的原始中文名称(对应 CashCollection 类的字段)
  198. headers.put("id", "序号");
  199. headers.put("jwcode", "精网号");
  200. headers.put("name", "姓名");
  201. headers.put("marketName", "所属地区");
  202. headers.put("activity", "活动名称");
  203. headers.put("orderCode", "金币订单号");
  204. headers.put("bankCode", "银行流水订单号");
  205. headers.put("goodsName", "商品名称");
  206. headers.put("goodNum", "商品数量");
  207. headers.put("numUnit", "数量单位");
  208. headers.put("permanentGold", "永久金币数量");
  209. headers.put("freeGold", "免费金币数量");
  210. headers.put("paymentCurrency", "付款币种");
  211. headers.put("paymentAmount", "付款金额");
  212. headers.put("receivedCurrency", "到账币种");
  213. headers.put("receivedAmount", "到账金额");
  214. headers.put("handlingCharge", "手续费");
  215. headers.put("receivedMarket", "到账地区");
  216. headers.put("payType", "支付方式");
  217. headers.put("payTime", "付款时间");
  218. headers.put("receivedTime", "到账时间");
  219. headers.put("submitterName", "提交人姓名");
  220. headers.put("voucher", "转账凭证");
  221. headers.put("remark", "备注");
  222. headers.put("auditName", "审核人");
  223. // 如果需要翻译,则翻译表头
  224. if (!isChineseLanguage(lang)) {
  225. return translateHeaders(headers, lang);
  226. }
  227. return headers;
  228. }
  229. /**
  230. * 获取现金收款明细表头顺序
  231. */
  232. public List<String> getCashCollectionColumnOrder() {
  233. return Arrays.asList(
  234. "id", "jwcode", "name", "marketName", "activity", "orderCode", "bankCode",
  235. "goodsName", "goodNum", "numUnit", "permanentGold", "freeGold", "paymentCurrency",
  236. "paymentAmount", "receivedCurrency", "receivedAmount", "handlingCharge",
  237. "receivedMarket", "payType", "payTime", "receivedTime", "submitterName",
  238. "voucher", "remark", "auditName"
  239. );
  240. }
  241. /**
  242. * 获取现金退款记录的Excel表头映射
  243. * 返回 Map<字段名, 中文表头>
  244. */
  245. public Map<String, String> getCashRecordHeaders(String lang) {
  246. Map<String, String> headers = new LinkedHashMap<>();
  247. // 定义所有表头的原始中文名称(对应 CashRecordDTO 类的字段)
  248. headers.put("goodsName", "产品名称");
  249. headers.put("goodsNum", "产品数量");
  250. headers.put("numUnit", "产品单位");
  251. headers.put("Submitter", "提交人");
  252. headers.put("id", "序号");
  253. headers.put("jwcode", "精网号");
  254. headers.put("name", "姓名");
  255. headers.put("market", "所属地区");
  256. headers.put("status", "订单状态");
  257. headers.put("remark", "备注");
  258. headers.put("refundReason", "退款理由");
  259. headers.put("refundModel", "退款方式");
  260. // 如果需要翻译,则翻译表头
  261. if (!isChineseLanguage(lang)) {
  262. return translateHeaders(headers, lang);
  263. }
  264. return headers;
  265. }
  266. /**
  267. * 获取现金退款记录表头顺序
  268. */
  269. public List<String> getCashRecordColumnOrder() {
  270. return Arrays.asList(
  271. "goodsName", "goodsNum", "numUnit", "Submitter", "id", "jwcode", "name", "market",
  272. "status", "remark", "refundReason", "refundModel"
  273. );
  274. }
  275. /**
  276. * 获取文章消费明细的Excel表头映射
  277. * 返回 Map<字段名, 中文表头>
  278. */
  279. public Map<String, String> getBeanConsumeArticleHeaders(String lang) {
  280. Map<String, String> headers = new LinkedHashMap<>();
  281. // 定义所有表头的原始中文名称(对应 BeanConsumeArticle 类的字段)
  282. headers.put("id", "ID");
  283. headers.put("name", "姓名");
  284. headers.put("jwcode", "精网号");
  285. headers.put("dept", "地区");
  286. headers.put("type", "类型 9-打赏 10-打赏 11-付费");
  287. headers.put("beanNum", "金豆总数");
  288. headers.put("buyBean", "付费金豆数");
  289. headers.put("freeBean", "免费金豆数");
  290. headers.put("articleId", "文章/视频ID");
  291. headers.put("articleName", "文章/视频标题");
  292. headers.put("author", "作者");
  293. headers.put("consumeTime", "付费时间");
  294. // 如果需要翻译,则翻译表头
  295. if (!isChineseLanguage(lang)) {
  296. return translateHeaders(headers, lang);
  297. }
  298. return headers;
  299. }
  300. /**
  301. * 获取文章消费明细表头顺序
  302. */
  303. public List<String> getBeanConsumeArticleColumnOrder() {
  304. return Arrays.asList(
  305. "id", "name", "jwcode", "dept", "type", "beanNum", "buyBean",
  306. "freeBean", "articleId", "articleName", "author", "consumeTime"
  307. );
  308. }
  309. /**
  310. * 获取系统充值明细的Excel表头映射
  311. * 返回 Map<字段名, 中文表头>
  312. */
  313. public Map<String, String> getBeanSystemRechargeHeaders(String lang) {
  314. Map<String, String> headers = new LinkedHashMap<>();
  315. // 定义所有表头的原始中文名称(对应 BeanSystemRechargeInfo 类的字段)
  316. headers.put("id", "ID");
  317. headers.put("jwcode", "精网号");
  318. headers.put("name", "姓名");
  319. headers.put("market", "所属地区");
  320. headers.put("freeBean", "免费金豆");
  321. headers.put("permanentBean", "付费金豆");
  322. headers.put("remark", "备注");
  323. headers.put("rechargeTime", "充值时间");
  324. // 如果需要翻译,则翻译表头
  325. if (!isChineseLanguage(lang)) {
  326. return translateHeaders(headers, lang);
  327. }
  328. return headers;
  329. }
  330. /**
  331. * 获取系统充值明细表头顺序
  332. */
  333. public List<String> getBeanSystemRechargeColumnOrder() {
  334. return Arrays.asList(
  335. "id","jwcode", "name", "market", "freeBean", "permanentBean", "remark", "rechargeTime"
  336. );
  337. }
  338. /**
  339. * 获取铁粉消费明细的Excel表头映射
  340. * 返回 Map<字段名, 中文表头>
  341. */
  342. public Map<String, String> getBeanConsumeFanHeaders(String lang) {
  343. Map<String, String> headers = new LinkedHashMap<>();
  344. // 定义所有表头的原始中文名称(对应 BeanConsumeFan 类的字段)
  345. headers.put("id", "ID");
  346. headers.put("name", "姓名");
  347. headers.put("jwcode", "精网号");
  348. headers.put("dept", "地区");
  349. headers.put("beanNum", "金豆数量");
  350. headers.put("freeBean", "免费金豆数");
  351. headers.put("buyBean", "付费金豆数");
  352. headers.put("channel", "频道");
  353. headers.put("type", "会员类型");
  354. headers.put("consumeTime", "加入时间");
  355. // 如果需要翻译,则翻译表头
  356. if (!isChineseLanguage(lang)) {
  357. return translateHeaders(headers, lang);
  358. }
  359. return headers;
  360. }
  361. /**
  362. * 获取铁粉消费明细表头顺序
  363. */
  364. public List<String> getBeanConsumeFanColumnOrder() {
  365. return Arrays.asList(
  366. "id", "name", "jwcode", "dept", "beanNum", "freeBean", "buyBean",
  367. "channel", "type", "consumeTime"
  368. );
  369. }
  370. /**
  371. * 获取用户金币余额的Excel表头映射
  372. * 返回 Map<字段名, 中文表头>
  373. */
  374. public Map<String, String> getUserHeaders(String lang) {
  375. Map<String, String> headers = new LinkedHashMap<>();
  376. // 定义所有表头的原始中文名称(对应 User 类的字段)
  377. headers.put("id", "客户id");
  378. headers.put("jwcode", "精网号");
  379. headers.put("name", "姓名");
  380. headers.put("market", "所属地区");
  381. headers.put("sumGold", "金币总数");
  382. headers.put("currentPermanentGold", "当前永久金币");
  383. headers.put("currentFreeJune", "当前六月到期免费金币");
  384. headers.put("currentFreeDecember", "当前十二月到期免费金币");
  385. headers.put("currentTaskGold", "当前任务金币");
  386. headers.put("rechargeNum", "充值次数(25年起)");
  387. headers.put("consumeNum", "消费次数(25年起)");
  388. headers.put("firstRecharge", "首充日期");
  389. headers.put("createTime", "创建时间");
  390. headers.put("updateTime", "更新时间");
  391. // 如果需要翻译,则翻译表头
  392. if (!isChineseLanguage(lang)) {
  393. return translateHeaders(headers, lang);
  394. }
  395. return headers;
  396. }
  397. /**
  398. * 获取用户金币余额表头顺序
  399. */
  400. public List<String> getUserColumnOrder() {
  401. return Arrays.asList(
  402. "id", "jwcode", "name", "market", "sumGold", "currentPermanentGold",
  403. "currentFreeJune", "currentFreeDecember", "currentTaskGold", "rechargeNum",
  404. "consumeNum", "firstRecharge", "createTime", "updateTime"
  405. );
  406. }
  407. /**
  408. * 获取金币明细的Excel表头映射
  409. * 返回 Map<字段名, 中文表头>
  410. */
  411. public Map<String, String> getGoldDetailHeaders(String lang) {
  412. Map<String, String> headers = new LinkedHashMap<>();
  413. // 定义所有表头的原始中文名称(对应 GoldDetail 类的字段)
  414. headers.put("name", "姓名");
  415. headers.put("jwcode", "精网号");
  416. headers.put("market", "所属地区");
  417. headers.put("payPlatform", "平台信息");
  418. headers.put("typeDesc", "更新类型");
  419. headers.put("sumGold", "金币数量");
  420. headers.put("permanentGold", "永久金币");
  421. headers.put("freeGold", "免费金币");
  422. headers.put("taskGold", "任务金币");
  423. headers.put("adminName", "提交人");
  424. headers.put("auditTime", "更新时间");
  425. // 如果需要翻译,则翻译表头
  426. if (!isChineseLanguage(lang)) {
  427. return translateHeaders(headers, lang);
  428. }
  429. return headers;
  430. }
  431. /**
  432. * 获取金币明细表头顺序
  433. */
  434. public List<String> getGoldDetailColumnOrder() {
  435. return Arrays.asList(
  436. "name", "jwcode", "market", "payPlatform", "typeDesc", "sumGold",
  437. "permanentGold", "freeGold", "taskGold", "adminName", "auditTime"
  438. );
  439. }
  440. /**
  441. * 翻译表头
  442. */
  443. private Map<String, String> translateHeaders(Map<String, String> headers, String lang) {
  444. log.info("开始翻译表头,目标语言: {}", lang);
  445. Map<String, String> translatedHeaders = new LinkedHashMap<>();
  446. for (Map.Entry<String, String> entry : headers.entrySet()) {
  447. String translatedHeader = languageTranslationUtil.translate(entry.getValue(), lang);
  448. log.debug("表头翻译: {} -> {}", entry.getValue(), translatedHeader);
  449. translatedHeaders.put(entry.getKey(), translatedHeader);
  450. }
  451. return translatedHeaders;
  452. }
  453. /**
  454. * 检查是否为中文语言
  455. */
  456. private boolean isChineseLanguage(String lang) {
  457. if (lang == null) return true;
  458. String langLower = lang.toLowerCase();
  459. return langLower.startsWith("zh") || langLower.equals("zh_cn") || langLower.equals("zh-tw");
  460. }
  461. }