|
|
|
@ -6,6 +6,7 @@ import com.alibaba.excel.ExcelWriter; |
|
|
|
import com.alibaba.excel.write.metadata.WriteSheet; |
|
|
|
import com.example.demo.Util.ExcelUploadUtil; |
|
|
|
import com.example.demo.Util.JWTUtil; |
|
|
|
import com.example.demo.Util.LanguageTranslationUtil; |
|
|
|
import com.example.demo.controller.bean.BeanConsumeController; |
|
|
|
import com.example.demo.controller.bean.BeanRechargeController; |
|
|
|
import com.example.demo.controller.cash.CashCollectionController; |
|
|
|
@ -85,6 +86,9 @@ public class ExportExcelServiceImpl implements ExportExcelService { |
|
|
|
private CashRefundController cashRefundController; |
|
|
|
@Autowired |
|
|
|
private CashCollectionController cashCollectionController; |
|
|
|
// 注入LanguageTranslationUtil |
|
|
|
@Autowired |
|
|
|
private LanguageTranslationUtil languageTranslationUtil; |
|
|
|
// 每页查询的数据量 |
|
|
|
private static final int PAGE_SIZE = 5000; |
|
|
|
@Autowired |
|
|
|
@ -216,7 +220,14 @@ public class ExportExcelServiceImpl implements ExportExcelService { |
|
|
|
List<String> markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); |
|
|
|
refundUser.setMarkets(markets); |
|
|
|
page.setRefundUser(refundUser); |
|
|
|
return refundController.select(page, String.join(",", markets)); |
|
|
|
|
|
|
|
// 从请求数据中获取语言设置,如果没有则使用默认值 |
|
|
|
String lang = "zh_CN"; |
|
|
|
JsonNode langNode = requestDataNode.path("lang"); |
|
|
|
if (langNode != null && !langNode.asText().isEmpty()) { |
|
|
|
lang = langNode.asText(); |
|
|
|
} |
|
|
|
return refundController.select(page, lang); |
|
|
|
} catch (Exception e) { |
|
|
|
throw new RuntimeException(e); |
|
|
|
} |
|
|
|
@ -420,6 +431,13 @@ public class ExportExcelServiceImpl implements ExportExcelService { |
|
|
|
JsonNode requestDataNode = rootNode.path("requestData"); |
|
|
|
String tokenValue = requestDataNode.path("token").asText(); |
|
|
|
|
|
|
|
// 获取语言参数 |
|
|
|
String lang = "zh_CN"; |
|
|
|
JsonNode langNode = rootNode.path("lang"); |
|
|
|
if (langNode != null && !langNode.asText().isEmpty()) { |
|
|
|
lang = langNode.asText(); |
|
|
|
} |
|
|
|
|
|
|
|
// 2. 验证导出记录 |
|
|
|
AiEmotionExportRecordVO record = validateExportRecord(recordId); |
|
|
|
if (record == null) return null; |
|
|
|
@ -469,11 +487,60 @@ public class ExportExcelServiceImpl implements ExportExcelService { |
|
|
|
// 在这里添加类型转换逻辑 |
|
|
|
if ("goldDetail".equals(exportType) && list.get(0) instanceof GoldDetail) { |
|
|
|
fillGoldDetailTypeDescriptions((List<GoldDetail>) list); |
|
|
|
// 添加翻译支持 |
|
|
|
translateGoldDetailList((List<GoldDetail>) list, lang); |
|
|
|
} |
|
|
|
|
|
|
|
// 添加退款方式转换逻辑 |
|
|
|
if ("refundUser".equals(exportType) && list.get(0) instanceof RefundUser) { |
|
|
|
fillRefundUserModelDescriptions((List<RefundUser>) list); |
|
|
|
// 添加翻译支持 |
|
|
|
translateRefundUserList((List<RefundUser>) list, lang); |
|
|
|
} |
|
|
|
|
|
|
|
// 添加充值用户翻译支持 |
|
|
|
if ("rechargeUser".equals(exportType) && list.get(0) instanceof RechargeUser) { |
|
|
|
translateRechargeUserList((List<RechargeUser>) list, lang); |
|
|
|
} |
|
|
|
|
|
|
|
// 添加消费用户翻译支持 |
|
|
|
if ("consumeUser".equals(exportType) && list.get(0) instanceof ConsumeUser) { |
|
|
|
translateConsumeUserList((List<ConsumeUser>) list, lang); |
|
|
|
} |
|
|
|
|
|
|
|
// 添加直播用户翻译支持 |
|
|
|
if ("liveUser".equals(exportType) && list.get(0) instanceof BeanConsumeLive) { |
|
|
|
translateBeanConsumeLiveList((List<BeanConsumeLive>) list, lang); |
|
|
|
} |
|
|
|
|
|
|
|
// 添加铁粉用户翻译支持 |
|
|
|
if ("fanUser".equals(exportType) && list.get(0) instanceof BeanConsumeFan) { |
|
|
|
translateBeanConsumeFanList((List<BeanConsumeFan>) list, lang); |
|
|
|
} |
|
|
|
|
|
|
|
// 添加文章用户翻译支持 |
|
|
|
if ("articleUser".equals(exportType) && list.get(0) instanceof BeanConsumeArticle) { |
|
|
|
translateBeanConsumeArticleList((List<BeanConsumeArticle>) list, lang); |
|
|
|
} |
|
|
|
|
|
|
|
// 添加金豆充值翻译支持 |
|
|
|
if ("beanUser".equals(exportType) && list.get(0) instanceof BeanSystemRechargeInfo) { |
|
|
|
translateBeanSystemRechargeInfoList((List<BeanSystemRechargeInfo>) list, lang); |
|
|
|
} |
|
|
|
|
|
|
|
// 添加在线充值翻译支持 |
|
|
|
if ("onlineUser".equals(exportType) && list.get(0) instanceof BeanOnlineRechargeInfo) { |
|
|
|
translateBeanOnlineRechargeInfoList((List<BeanOnlineRechargeInfo>) list, lang); |
|
|
|
} |
|
|
|
|
|
|
|
// 添加财务退款翻译支持 |
|
|
|
if ("financeUser".equals(exportType) && list.get(0) instanceof CashRecordDTO) { |
|
|
|
translateCashRecordDTOList((List<CashRecordDTO>) list, lang); |
|
|
|
} |
|
|
|
|
|
|
|
// 添加现金收款翻译支持 |
|
|
|
if ("cashUser".equals(exportType) && list.get(0) instanceof CashCollection) { |
|
|
|
translateCashCollectionList((List<CashCollection>) list, lang); |
|
|
|
} |
|
|
|
|
|
|
|
excelWriter.write(list, writeSheet); |
|
|
|
@ -680,4 +747,347 @@ public class ExportExcelServiceImpl implements ExportExcelService { |
|
|
|
default: return "未知退款方式"; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 各种实体类的翻译方法 |
|
|
|
|
|
|
|
/** |
|
|
|
* 翻译金币明细列表 |
|
|
|
*/ |
|
|
|
private void translateGoldDetailList(List<GoldDetail> list, String lang) { |
|
|
|
if (list == null || list.isEmpty() || "zh_CN".equalsIgnoreCase(lang) || "zh".equalsIgnoreCase(lang)) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
for (GoldDetail item : list) { |
|
|
|
// 翻译类型描述 |
|
|
|
if (item.getTypeDesc() != null && !item.getTypeDesc().isEmpty()) { |
|
|
|
item.setTypeDesc(languageTranslationUtil.translate(item.getTypeDesc(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译市场名称 |
|
|
|
if (item.getMarket() != null && !item.getMarket().isEmpty()) { |
|
|
|
item.setMarket(languageTranslationUtil.translate(item.getMarket(), lang)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 翻译退款用户列表 |
|
|
|
*/ |
|
|
|
private void translateRefundUserList(List<RefundUser> list, String lang) { |
|
|
|
if (list == null || list.isEmpty() || "zh_CN".equalsIgnoreCase(lang) || "zh".equalsIgnoreCase(lang)) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
for (RefundUser item : list) { |
|
|
|
// 翻译市场名称 |
|
|
|
if (item.getMarket() != null && !item.getMarket().isEmpty()) { |
|
|
|
item.setMarket(languageTranslationUtil.translate(item.getMarket(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译商品名称 |
|
|
|
if (item.getGoodsName() != null && !item.getGoodsName().isEmpty()) { |
|
|
|
item.setGoodsName(languageTranslationUtil.translate(item.getGoodsName(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译退款类型 |
|
|
|
if (item.getRefundType() != null && !item.getRefundType().isEmpty()) { |
|
|
|
item.setRefundType(languageTranslationUtil.translate(item.getRefundType(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译退款方式描述 |
|
|
|
if (item.getRefundModelDesc() != null && !item.getRefundModelDesc().isEmpty()) { |
|
|
|
item.setRefundModelDesc(languageTranslationUtil.translate(item.getRefundModelDesc(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译备注 |
|
|
|
if (item.getRemark() != null && !item.getRemark().isEmpty()) { |
|
|
|
item.setRemark(languageTranslationUtil.translate(item.getRemark(), lang)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 翻译充值用户列表 |
|
|
|
*/ |
|
|
|
private void translateRechargeUserList(List<RechargeUser> list, String lang) { |
|
|
|
if (list == null || list.isEmpty() || "zh_CN".equalsIgnoreCase(lang) || "zh".equalsIgnoreCase(lang)) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
for (RechargeUser item : list) { |
|
|
|
// 翻译市场名称 |
|
|
|
if (item.getMarket() != null && !item.getMarket().isEmpty()) { |
|
|
|
item.setMarket(languageTranslationUtil.translate(item.getMarket(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译汇率名称 |
|
|
|
if (item.getRateName() != null && !item.getRateName().isEmpty()) { |
|
|
|
item.setRateName(languageTranslationUtil.translate(item.getRateName(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译支付方式 |
|
|
|
if (item.getPayModel() != null && !item.getPayModel().isEmpty()) { |
|
|
|
item.setPayModel(languageTranslationUtil.translate(item.getPayModel(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译备注 |
|
|
|
if (item.getRemark() != null && !item.getRemark().isEmpty()) { |
|
|
|
item.setRemark(languageTranslationUtil.translate(item.getRemark(), lang)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 翻译消费用户列表 |
|
|
|
*/ |
|
|
|
private void translateConsumeUserList(List<ConsumeUser> list, String lang) { |
|
|
|
if (list == null || list.isEmpty() || "zh_CN".equalsIgnoreCase(lang) || "zh".equalsIgnoreCase(lang)) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
for (ConsumeUser item : list) { |
|
|
|
// 翻译商品名称 |
|
|
|
if (item.getGoodsName() != null && !item.getGoodsName().isEmpty()) { |
|
|
|
item.setGoodsName(languageTranslationUtil.translate(item.getGoodsName(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译市场名称 |
|
|
|
if (item.getMarket() != null && !item.getMarket().isEmpty()) { |
|
|
|
item.setMarket(languageTranslationUtil.translate(item.getMarket(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译备注 |
|
|
|
if (item.getRemark() != null && !item.getRemark().isEmpty()) { |
|
|
|
item.setRemark(languageTranslationUtil.translate(item.getRemark(), lang)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 翻译直播消费列表 |
|
|
|
*/ |
|
|
|
private void translateBeanConsumeLiveList(List<BeanConsumeLive> list, String lang) { |
|
|
|
if (list == null || list.isEmpty() || "zh_CN".equalsIgnoreCase(lang) || "zh".equalsIgnoreCase(lang)) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
for (BeanConsumeLive item : list) { |
|
|
|
// 翻译地区/分部 |
|
|
|
if (item.getDept() != null && !item.getDept().isEmpty()) { |
|
|
|
item.setDept(languageTranslationUtil.translate(item.getDept(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译礼物名称 |
|
|
|
if (item.getGift() != null && !item.getGift().isEmpty()) { |
|
|
|
item.setGift(languageTranslationUtil.translate(item.getGift(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译频道名称 |
|
|
|
if (item.getLiveChannel() != null && !item.getLiveChannel().isEmpty()) { |
|
|
|
item.setLiveChannel(languageTranslationUtil.translate(item.getLiveChannel(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译直播间名称 |
|
|
|
if (item.getLiveName() != null && !item.getLiveName().isEmpty()) { |
|
|
|
item.setLiveName(languageTranslationUtil.translate(item.getLiveName(), lang)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 翻译铁粉消费列表 |
|
|
|
*/ |
|
|
|
private void translateBeanConsumeFanList(List<BeanConsumeFan> list, String lang) { |
|
|
|
if (list == null || list.isEmpty() || "zh_CN".equalsIgnoreCase(lang) || "zh".equalsIgnoreCase(lang)) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
for (BeanConsumeFan item : list) { |
|
|
|
// 翻译地区/分部 |
|
|
|
if (item.getDept() != null && !item.getDept().isEmpty()) { |
|
|
|
item.setDept(languageTranslationUtil.translate(item.getDept(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译频道名称 |
|
|
|
if (item.getChannel() != null && !item.getChannel().isEmpty()) { |
|
|
|
item.setChannel(languageTranslationUtil.translate(item.getChannel(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译会员类型 |
|
|
|
if (item.getType() != null && !item.getType().isEmpty()) { |
|
|
|
item.setType(languageTranslationUtil.translate(item.getType(), lang)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 翻译文章消费列表 |
|
|
|
*/ |
|
|
|
private void translateBeanConsumeArticleList(List<BeanConsumeArticle> list, String lang) { |
|
|
|
if (list == null || list.isEmpty() || "zh_CN".equalsIgnoreCase(lang) || "zh".equalsIgnoreCase(lang)) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
for (BeanConsumeArticle item : list) { |
|
|
|
// 翻译地区/分部 |
|
|
|
if (item.getDept() != null && !item.getDept().isEmpty()) { |
|
|
|
item.setDept(languageTranslationUtil.translate(item.getDept(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译类型 |
|
|
|
if (item.getType() != null && !item.getType().isEmpty()) { |
|
|
|
item.setType(languageTranslationUtil.translate(item.getType(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译文章/视频标题 |
|
|
|
if (item.getArticleName() != null && !item.getArticleName().isEmpty()) { |
|
|
|
item.setArticleName(languageTranslationUtil.translate(item.getArticleName(), lang)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 翻译金豆系统充值列表 |
|
|
|
*/ |
|
|
|
private void translateBeanSystemRechargeInfoList(List<BeanSystemRechargeInfo> list, String lang) { |
|
|
|
if (list == null || list.isEmpty() || "zh_CN".equalsIgnoreCase(lang) || "zh".equalsIgnoreCase(lang)) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
for (BeanSystemRechargeInfo item : list) { |
|
|
|
// 翻译所属地区 |
|
|
|
if (item.getMarket() != null && !item.getMarket().isEmpty()) { |
|
|
|
item.setMarket(languageTranslationUtil.translate(item.getMarket(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译备注 |
|
|
|
if (item.getRemark() != null && !item.getRemark().isEmpty()) { |
|
|
|
item.setRemark(languageTranslationUtil.translate(item.getRemark(), lang)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 翻译金豆在线充值列表 |
|
|
|
*/ |
|
|
|
private void translateBeanOnlineRechargeInfoList(List<BeanOnlineRechargeInfo> list, String lang) { |
|
|
|
if (list == null || list.isEmpty() || "zh_CN".equalsIgnoreCase(lang) || "zh".equalsIgnoreCase(lang)) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
for (BeanOnlineRechargeInfo item : list) { |
|
|
|
// 翻译所属地区 |
|
|
|
if (item.getMarket() != null && !item.getMarket().isEmpty()) { |
|
|
|
item.setMarket(languageTranslationUtil.translate(item.getMarket(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译充值平台 |
|
|
|
if (item.getPlatform() != null && !item.getPlatform().isEmpty()) { |
|
|
|
item.setPlatform(languageTranslationUtil.translate(item.getPlatform(), lang)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 翻译现金退款记录列表 |
|
|
|
*/ |
|
|
|
private void translateCashRecordDTOList(List<CashRecordDTO> list, String lang) { |
|
|
|
if (list == null || list.isEmpty() || "zh_CN".equalsIgnoreCase(lang) || "zh".equalsIgnoreCase(lang)) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
for (CashRecordDTO item : list) { |
|
|
|
// 翻译商品名称 |
|
|
|
if (item.getGoodsName() != null && !item.getGoodsName().isEmpty()) { |
|
|
|
item.setGoodsName(languageTranslationUtil.translate(item.getGoodsName(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译备注 |
|
|
|
if (item.getRemark() != null && !item.getRemark().isEmpty()) { |
|
|
|
item.setRemark(languageTranslationUtil.translate(item.getRemark(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译退款理由 |
|
|
|
if (item.getRefundReason() != null && !item.getRefundReason().isEmpty()) { |
|
|
|
item.setRefundReason(languageTranslationUtil.translate(item.getRefundReason(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译驳回理由 |
|
|
|
if (item.getRejectReason() != null && !item.getRejectReason().isEmpty()) { |
|
|
|
item.setRejectReason(languageTranslationUtil.translate(item.getRejectReason(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译退款备注 |
|
|
|
if (item.getRefundRemark() != null && !item.getRefundRemark().isEmpty()) { |
|
|
|
item.setRefundRemark(languageTranslationUtil.translate(item.getRefundRemark(), lang)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 翻译现金收款列表 |
|
|
|
*/ |
|
|
|
private void translateCashCollectionList(List<CashCollection> list, String lang) { |
|
|
|
if (list == null || list.isEmpty() || "zh_CN".equalsIgnoreCase(lang) || "zh".equalsIgnoreCase(lang)) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
for (CashCollection item : list) { |
|
|
|
// 翻译所属地区名称 |
|
|
|
if (item.getMarketName() != null && !item.getMarketName().isEmpty()) { |
|
|
|
item.setMarketName(languageTranslationUtil.translate(item.getMarketName(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译活动名称 |
|
|
|
if (item.getActivity() != null && !item.getActivity().isEmpty()) { |
|
|
|
item.setActivity(languageTranslationUtil.translate(item.getActivity(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译商品名称 |
|
|
|
if (item.getGoodsName() != null && !item.getGoodsName().isEmpty()) { |
|
|
|
item.setGoodsName(languageTranslationUtil.translate(item.getGoodsName(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译数量单位 |
|
|
|
if (item.getNumUnit() != null && !item.getNumUnit().isEmpty()) { |
|
|
|
item.setNumUnit(languageTranslationUtil.translate(item.getNumUnit(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译付款币种 |
|
|
|
if (item.getPaymentCurrency() != null && !item.getPaymentCurrency().isEmpty()) { |
|
|
|
item.setPaymentCurrency(languageTranslationUtil.translate(item.getPaymentCurrency(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译到账币种 |
|
|
|
if (item.getReceivedCurrency() != null && !item.getReceivedCurrency().isEmpty()) { |
|
|
|
item.setReceivedCurrency(languageTranslationUtil.translate(item.getReceivedCurrency(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译支付方式 |
|
|
|
if (item.getPayType() != null && !item.getPayType().isEmpty()) { |
|
|
|
item.setPayType(languageTranslationUtil.translate(item.getPayType(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译到账地区 |
|
|
|
if (item.getReceivedMarket() != null && !item.getReceivedMarket().isEmpty()) { |
|
|
|
item.setReceivedMarket(languageTranslationUtil.translate(item.getReceivedMarket(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译备注 |
|
|
|
if (item.getRemark() != null && !item.getRemark().isEmpty()) { |
|
|
|
item.setRemark(languageTranslationUtil.translate(item.getRemark(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译驳回理由 |
|
|
|
if (item.getRejectReason() != null && !item.getRejectReason().isEmpty()) { |
|
|
|
item.setRejectReason(languageTranslationUtil.translate(item.getRejectReason(), lang)); |
|
|
|
} |
|
|
|
|
|
|
|
// 翻译到账备注 |
|
|
|
if (item.getReceivedRemark() != null && !item.getReceivedRemark().isEmpty()) { |
|
|
|
item.setReceivedRemark(languageTranslationUtil.translate(item.getReceivedRemark(), lang)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |