diff --git a/rc-service/rc-inner-api/wallet-inner/wallet-inner-model/src/main/java/com/red/circle/wallet/inner/model/cmd/UserFreightBalanceRunningWaterExportQryCmd.java b/rc-service/rc-inner-api/wallet-inner/wallet-inner-model/src/main/java/com/red/circle/wallet/inner/model/cmd/UserFreightBalanceRunningWaterExportQryCmd.java index 8819f4c1..5e4a98f3 100644 --- a/rc-service/rc-inner-api/wallet-inner/wallet-inner-model/src/main/java/com/red/circle/wallet/inner/model/cmd/UserFreightBalanceRunningWaterExportQryCmd.java +++ b/rc-service/rc-inner-api/wallet-inner/wallet-inner-model/src/main/java/com/red/circle/wallet/inner/model/cmd/UserFreightBalanceRunningWaterExportQryCmd.java @@ -1,6 +1,6 @@ package com.red.circle.wallet.inner.model.cmd; -import com.red.circle.framework.core.dto.CommonCommand; +import com.red.circle.common.business.dto.cmd.HistoryRangeTimeQryPageCmd; import jakarta.validation.constraints.NotBlank; import java.io.Serial; import lombok.Data; @@ -13,7 +13,7 @@ import lombok.experimental.Accessors; @Data @EqualsAndHashCode(callSuper = true) @Accessors(chain = true) -public class UserFreightBalanceRunningWaterExportQryCmd extends CommonCommand { +public class UserFreightBalanceRunningWaterExportQryCmd extends HistoryRangeTimeQryPageCmd { @Serial private static final long serialVersionUID = 1L; @@ -27,7 +27,31 @@ public class UserFreightBalanceRunningWaterExportQryCmd extends CommonCommand { /** * 日期yyyyMM. */ - @NotBlank private String monthDate; + /** + * 发送人用户id. + */ + private Long userId; + + /** + * 接收人用户id. + */ + private Long acceptUserId; + + /** + * 来源. + */ + private String origin; + + /** + * 查询后台操作流水. + */ + private Boolean queryBackOperationUser; + + /** + * 操作用户ID,多个用逗号分隔. + */ + private String createUsers; + } diff --git a/rc-service/rc-inner-api/wallet-inner/wallet-inner-model/src/main/java/com/red/circle/wallet/inner/model/cmd/UserFreightBalanceRunningWaterPageQryCmd.java b/rc-service/rc-inner-api/wallet-inner/wallet-inner-model/src/main/java/com/red/circle/wallet/inner/model/cmd/UserFreightBalanceRunningWaterPageQryCmd.java index 5d748df3..a859b7d2 100644 --- a/rc-service/rc-inner-api/wallet-inner/wallet-inner-model/src/main/java/com/red/circle/wallet/inner/model/cmd/UserFreightBalanceRunningWaterPageQryCmd.java +++ b/rc-service/rc-inner-api/wallet-inner/wallet-inner-model/src/main/java/com/red/circle/wallet/inner/model/cmd/UserFreightBalanceRunningWaterPageQryCmd.java @@ -42,5 +42,9 @@ public class UserFreightBalanceRunningWaterPageQryCmd extends HistoryRangeTimeQr */ private Boolean queryBackOperationUser; + /** + * 操作用户ID,多个用逗号分隔. + */ + private String createUsers; } diff --git a/rc-service/rc-inner-api/wallet-inner/wallet-inner-model/src/main/java/com/red/circle/wallet/inner/model/cmd/UserGoldRunningWaterBackQryCmd.java b/rc-service/rc-inner-api/wallet-inner/wallet-inner-model/src/main/java/com/red/circle/wallet/inner/model/cmd/UserGoldRunningWaterBackQryCmd.java index 803a2d2d..31abf228 100644 --- a/rc-service/rc-inner-api/wallet-inner/wallet-inner-model/src/main/java/com/red/circle/wallet/inner/model/cmd/UserGoldRunningWaterBackQryCmd.java +++ b/rc-service/rc-inner-api/wallet-inner/wallet-inner-model/src/main/java/com/red/circle/wallet/inner/model/cmd/UserGoldRunningWaterBackQryCmd.java @@ -50,6 +50,11 @@ public class UserGoldRunningWaterBackQryCmd extends Command { @JsonSerialize(using = ToStringSerializer.class) private Long backOperationUser; + /** + * 后台操作用户ID,多个用逗号分隔. + */ + private String backOperationUsers; + /** * 跟踪id. */ diff --git a/rc-service/rc-service-console/console-adapter/src/main/java/com/red/circle/console/adapter/app/user/UserFreightRestController.java b/rc-service/rc-service-console/console-adapter/src/main/java/com/red/circle/console/adapter/app/user/UserFreightRestController.java index 0738bff0..4a175913 100644 --- a/rc-service/rc-service-console/console-adapter/src/main/java/com/red/circle/console/adapter/app/user/UserFreightRestController.java +++ b/rc-service/rc-service-console/console-adapter/src/main/java/com/red/circle/console/adapter/app/user/UserFreightRestController.java @@ -141,15 +141,22 @@ public class UserFreightRestController extends BaseController { response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); - String fileName = URLEncoder.encode("Export Freight RunningWater " + query.getMonthDate(), - StandardCharsets.UTF_8) - .replaceAll("\\+", "%20"); - String sheetName = URLEncoder.encode("Export Freight RunningWater " + query.getMonthDate(), + String fileName = URLEncoder.encode("Export Freight RunningWater " + getExportNameSuffix(query), StandardCharsets.UTF_8) .replaceAll("\\+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); EasyExcel.write(response.getOutputStream(), UserFreightBalanceRunningWaterExportModel.class) - .sheet(sheetName).doWrite(userFreightService.listExport(query)); + .sheet("FreightRunningWater").doWrite(userFreightService.listExport(query)); + } + + private String getExportNameSuffix(UserFreightBalanceRunningWaterExportQryCmd query) { + if (query.getMonthDate() != null && !query.getMonthDate().isBlank()) { + return query.getMonthDate(); + } + if (query.getStartTime() != null || query.getEndTime() != null) { + return query.getStartTime() + "-" + query.getEndTime(); + } + return "Filtered"; } /** diff --git a/rc-service/rc-service-console/console-adapter/src/main/java/com/red/circle/console/adapter/app/user/UserWalletRestController.java b/rc-service/rc-service-console/console-adapter/src/main/java/com/red/circle/console/adapter/app/user/UserWalletRestController.java index cbc0fa9e..37301dea 100644 --- a/rc-service/rc-service-console/console-adapter/src/main/java/com/red/circle/console/adapter/app/user/UserWalletRestController.java +++ b/rc-service/rc-service-console/console-adapter/src/main/java/com/red/circle/console/adapter/app/user/UserWalletRestController.java @@ -9,11 +9,13 @@ import com.red.circle.console.infra.annotations.OpsOperationReqLog; import com.red.circle.framework.web.controller.BaseController; import com.red.circle.wallet.inner.model.cmd.DeductGoldCmd; import com.red.circle.wallet.inner.model.cmd.DiamondCmd; -import com.red.circle.wallet.inner.model.cmd.SendGoldCmd; -import com.red.circle.wallet.inner.model.cmd.UserGoldRunningWaterBackQryCmd; -import java.util.List; -import lombok.RequiredArgsConstructor; -import org.springframework.validation.annotation.Validated; +import com.red.circle.wallet.inner.model.cmd.SendGoldCmd; +import com.red.circle.wallet.inner.model.cmd.UserGoldRunningWaterBackQryCmd; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -48,10 +50,20 @@ public class UserWalletRestController extends BaseController { * 流水列表. */ @GetMapping("/gold/running-water/cls") - public UserGoldRunningWaterClsTmpCO getGoldRunningWaterCls(UserGoldRunningWaterBackQryCmd query) { - return userWalletService.getGoldRunningWaterCls(query); - } - + public UserGoldRunningWaterClsTmpCO getGoldRunningWaterCls(UserGoldRunningWaterBackQryCmd query) { + return userWalletService.getGoldRunningWaterCls(query); + } + + /** + * 流水导出. + */ + @GetMapping("/gold/running-water/cls/export") + public void exportGoldRunningWaterCls( + HttpServletResponse response, + @Validated UserGoldRunningWaterBackQryCmd query) throws IOException { + userWalletService.exportGoldRunningWater(response, query); + } + @OpsOperationReqLog("发送金币") @PostMapping("/send-gold") public void sendGold(@RequestBody @Validated SendGoldCmd param) { diff --git a/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/excel/model/freight/UserFreightBalanceRunningWaterExportModel.java b/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/excel/model/freight/UserFreightBalanceRunningWaterExportModel.java index 9dba361b..a564d05a 100644 --- a/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/excel/model/freight/UserFreightBalanceRunningWaterExportModel.java +++ b/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/excel/model/freight/UserFreightBalanceRunningWaterExportModel.java @@ -94,6 +94,12 @@ public class UserFreightBalanceRunningWaterExportModel implements Serializable { @ExcelProperty(value = "Origin Name") private String originName; + /** + * 操作人. + */ + @ExcelProperty(value = "Operator") + private String operationUserNickname; + /** * 备注 */ diff --git a/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/excel/model/wallet/UserGoldRunningWaterExportModel.java b/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/excel/model/wallet/UserGoldRunningWaterExportModel.java new file mode 100644 index 00000000..3082cdf2 --- /dev/null +++ b/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/excel/model/wallet/UserGoldRunningWaterExportModel.java @@ -0,0 +1,91 @@ +package com.red.circle.console.app.excel.model.wallet; + +import com.alibaba.excel.annotation.ExcelProperty; +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 后台金币流水导出. + */ +@Data +@Accessors(chain = true) +public class UserGoldRunningWaterExportModel implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 流水ID. + */ + @ExcelProperty(value = "Record ID") + private String recordId; + + /** + * 系统来源. + */ + @ExcelProperty(value = "Sys Origin") + private String sysOrigin; + + /** + * 用户ID. + */ + @ExcelProperty(value = "User ID") + private String userId; + + /** + * 用户账号. + */ + @ExcelProperty(value = "User Account") + private String userAccount; + + /** + * 用户昵称. + */ + @ExcelProperty(value = "User Nickname") + private String userNickname; + + /** + * 类型. + */ + @ExcelProperty(value = "Type") + private String type; + + /** + * 金币金额. + */ + @ExcelProperty(value = "Amount") + private BigDecimal quantity; + + /** + * 操作后余额. + */ + @ExcelProperty(value = "Balance") + private BigDecimal balance; + + /** + * 原因. + */ + @ExcelProperty(value = "Reason") + private String originName; + + /** + * 备注. + */ + @ExcelProperty(value = "Remark") + private String remark; + + /** + * 操作人. + */ + @ExcelProperty(value = "Operator") + private String backOperationName; + + /** + * 操作时间. + */ + @ExcelProperty(value = "Create Time") + private String createTime; +} diff --git a/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/user/UserFreightBalanceServiceImpl.java b/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/user/UserFreightBalanceServiceImpl.java index b42b3954..35a1e1b0 100644 --- a/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/user/UserFreightBalanceServiceImpl.java +++ b/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/user/UserFreightBalanceServiceImpl.java @@ -456,6 +456,11 @@ public class UserFreightBalanceServiceImpl implements Map regionConfigMap = ResponseAssert.requiredSuccess( userRegionClient.mapUserRegionConfig( new UserRegionConfigMapCmd().setUserIds(userIds))); + Map opsUserNicknameMap = userService.mapBackUserNickname( + waters.stream() + .map(UserFreightBalanceRunningWaterDTO::getCreateUser) + .filter(Objects::nonNull) + .collect(Collectors.toSet())); return waters.stream().map(water -> { @@ -472,6 +477,9 @@ public class UserFreightBalanceServiceImpl implements .map(RegionConfigDTO::getRegionCode) .orElse("未知")); exportModel.setOriginName(FreightBalanceOrigin.getDesc(water.getOrigin())); + exportModel.setOperationUserNickname(Optional.ofNullable(water.getCreateUser()) + .map(opsUserNicknameMap::get) + .orElse("")); exportModel.setAccount(getAccountDescribe(sendUser)); exportModel.setNickname(Optional.ofNullable(sendUser) .map(UserProfileDTO::getUserNickname).orElse("?")); diff --git a/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/user/UserWalletServiceImpl.java b/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/user/UserWalletServiceImpl.java index 47fcad50..2c653476 100644 --- a/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/user/UserWalletServiceImpl.java +++ b/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/user/UserWalletServiceImpl.java @@ -1,18 +1,23 @@ -package com.red.circle.console.app.service.app.user; - -import com.alibaba.nacos.shaded.com.google.common.collect.Lists; -import com.red.circle.common.business.core.enums.ReceiptType; -import com.red.circle.common.business.core.enums.SysOriginPlatformEnum; -import com.red.circle.common.business.enums.DiamondOrigin; -import com.red.circle.console.app.convertor.WalletAppConvertor; -import com.red.circle.console.app.dto.clienobject.user.UserGoldBalanceCO; -import com.red.circle.console.app.dto.clienobject.user.UserGoldRunningWaterCO; -import com.red.circle.console.app.dto.clienobject.user.UserGoldRunningWaterClsTmpCO; -import com.red.circle.console.infra.database.rds.service.admin.UserService; -import com.red.circle.console.inner.error.ConsoleErrorCode; -import com.red.circle.framework.core.asserts.ResponseAssert; -import com.red.circle.framework.mybatis.constant.PageConstant; -import com.red.circle.order.inner.endpoint.UserRechargeCountClient; +package com.red.circle.console.app.service.app.user; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.nacos.shaded.com.google.common.collect.Lists; +import com.red.circle.common.business.core.enums.ReceiptType; +import com.red.circle.common.business.core.enums.SysOriginPlatformEnum; +import com.red.circle.common.business.enums.DiamondOrigin; +import com.red.circle.console.app.convertor.WalletAppConvertor; +import com.red.circle.console.app.dto.clienobject.user.UserGoldBalanceCO; +import com.red.circle.console.app.dto.clienobject.user.UserGoldRunningWaterCO; +import com.red.circle.console.app.dto.clienobject.user.UserGoldRunningWaterClsTmpCO; +import com.red.circle.console.app.excel.EasyExcelUtils; +import com.red.circle.console.app.excel.model.wallet.UserGoldRunningWaterExportModel; +import com.red.circle.console.infra.database.rds.service.admin.UserService; +import com.red.circle.console.inner.error.ConsoleErrorCode; +import com.red.circle.framework.core.asserts.ResponseAssert; +import com.red.circle.framework.mybatis.constant.PageConstant; +import com.red.circle.order.inner.endpoint.UserRechargeCountClient; import com.red.circle.order.inner.model.enums.MonthlyRechargeType; import com.red.circle.other.inner.endpoint.activity.CumulativeRechargeClient; import com.red.circle.other.inner.endpoint.sys.AnchorSalaryExchangeGoldClient; @@ -21,11 +26,11 @@ import com.red.circle.other.inner.model.cmd.sys.SysAnchorSalaryExchangeGoldCmd; import com.red.circle.tool.core.collection.CollectionUtils; import com.red.circle.tool.core.date.TimestampUtils; import com.red.circle.tool.core.num.ArithmeticUtils; -import com.red.circle.tool.core.sequence.IdWorkerUtils; -import com.red.circle.tool.core.text.StringUtils; -import com.red.circle.other.inner.asserts.user.UserErrorCode; -import com.red.circle.other.inner.endpoint.user.user.UserProfileClient; -import com.red.circle.other.inner.endpoint.user.user.UserSvipClient; +import com.red.circle.tool.core.sequence.IdWorkerUtils; +import com.red.circle.tool.core.text.StringUtils; +import com.red.circle.other.inner.asserts.user.UserErrorCode; +import com.red.circle.other.inner.endpoint.user.user.UserProfileClient; +import com.red.circle.other.inner.endpoint.user.user.UserSvipClient; import com.red.circle.other.inner.model.dto.user.UserProfileDTO; import com.red.circle.wallet.inner.endpoint.wallet.WalletDiamondClient; import com.red.circle.wallet.inner.endpoint.wallet.WalletGoldClient; @@ -35,15 +40,23 @@ import com.red.circle.wallet.inner.model.cmd.DiamondCmd; import com.red.circle.wallet.inner.model.cmd.DiamondReceiptCmd; import com.red.circle.wallet.inner.model.cmd.GoldReceiptCmd; import com.red.circle.wallet.inner.model.cmd.SendGoldCmd; -import com.red.circle.wallet.inner.model.cmd.UserGoldRunningWaterBackQryCmd; -import com.red.circle.wallet.inner.model.dto.UserGoldRunningWaterClsHistoryDTO; -import com.red.circle.wallet.inner.model.dto.UserGoldRunningWaterHistoryDTO; -import com.red.circle.wallet.inner.model.enums.GoldOrigin; -import java.math.BigDecimal; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; +import com.red.circle.wallet.inner.model.cmd.UserGoldRunningWaterBackQryCmd; +import com.red.circle.wallet.inner.model.dto.UserGoldRunningWaterClsHistoryDTO; +import com.red.circle.wallet.inner.model.dto.UserGoldRunningWaterDTO; +import com.red.circle.wallet.inner.model.dto.UserGoldRunningWaterHistoryDTO; +import com.red.circle.wallet.inner.model.enums.GoldOrigin; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.math.BigDecimal; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -54,12 +67,16 @@ import org.springframework.stereotype.Service; * @author pengliang on 2022/7/21 */ @Service -@RequiredArgsConstructor -public class UserWalletServiceImpl implements UserWalletService { - - private final UserService userService; - private final UserSvipClient userSvipClient; - private final WalletGoldClient walletGoldClient; +@RequiredArgsConstructor +public class UserWalletServiceImpl implements UserWalletService { + + private static final int EXPORT_BATCH_SIZE = 1000; + private static final DateTimeFormatter EXPORT_TIME_FORMATTER = + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + private final UserService userService; + private final UserSvipClient userSvipClient; + private final WalletGoldClient walletGoldClient; private final UserProfileClient userProfileClient; private final UserLevelClient userLevelClient; private final WalletAppConvertor walletAppConvertor; @@ -178,6 +195,133 @@ public class UserWalletServiceImpl implements UserWalletService { ); } + @Override + public void exportGoldRunningWater(HttpServletResponse response, UserGoldRunningWaterBackQryCmd query) + throws IOException { + UserGoldRunningWaterBackQryCmd exportQuery = copyGoldRunningWaterQuery(query) + .setContext(null) + .setLastId(null) + .setLimit(EXPORT_BATCH_SIZE); + + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding(StandardCharsets.UTF_8.name()); + String fileName = URLEncoder.encode("GmGoldRunningWater", StandardCharsets.UTF_8) + .replaceAll("\\+", "%20"); + response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); + + ExcelWriter excelWriter = null; + try { + excelWriter = EasyExcel.write(response.getOutputStream(), UserGoldRunningWaterExportModel.class) + .registerWriteHandler(EasyExcelUtils.getStyleStrategy()) + .build(); + WriteSheet sheet = EasyExcel.writerSheet("GmGoldRunningWater").build(); + boolean wroteAnyData = false; + while (true) { + List waters = listGoldRunningWater(exportQuery); + if (CollectionUtils.isEmpty(waters)) { + break; + } + + excelWriter.write(toGoldRunningWaterExportModels(waters), sheet); + wroteAnyData = true; + Long nextLastId = getLastRunningWaterId(waters); + if (Objects.isNull(nextLastId) || Objects.equals(nextLastId, exportQuery.getLastId())) { + break; + } + exportQuery.setLastId(nextLastId); + } + if (!wroteAnyData) { + excelWriter.write(Lists.newArrayList(), sheet); + } + } finally { + if (Objects.nonNull(excelWriter)) { + excelWriter.finish(); + } + } + } + + private UserGoldRunningWaterBackQryCmd copyGoldRunningWaterQuery( + UserGoldRunningWaterBackQryCmd source) { + if (Objects.isNull(source)) { + return new UserGoldRunningWaterBackQryCmd(); + } + return new UserGoldRunningWaterBackQryCmd() + .setId(source.getId()) + .setSysOrigin(source.getSysOrigin()) + .setUserId(source.getUserId()) + .setQueryBackOperationUser(source.getQueryBackOperationUser()) + .setBackOperationUser(source.getBackOperationUser()) + .setBackOperationUsers(source.getBackOperationUsers()) + .setTrackId(source.getTrackId()) + .setType(source.getType()) + .setOrigin(source.getOrigin()) + .setStartTime(source.getStartTime()) + .setEndTime(source.getEndTime()); + } + + private List toGoldRunningWaterExportModels( + List waters) { + return waters.stream() + .map(water -> { + UserGoldRunningWaterDTO runningWater = water.getRunningWater(); + UserProfileDTO userProfile = water.getUserProfile(); + return new UserGoldRunningWaterExportModel() + .setRecordId(Objects.toString(runningWater.getId(), "")) + .setSysOrigin(runningWater.getSysOrigin()) + .setUserId(Objects.toString(runningWater.getUserId(), "")) + .setUserAccount(getAccountDescribe(userProfile)) + .setUserNickname(Optional.ofNullable(userProfile) + .map(UserProfileDTO::getUserNickname).orElse("")) + .setType(getGoldRunningWaterTypeName(runningWater.getType())) + .setQuantity(runningWater.getQuantity()) + .setBalance(runningWater.getBalance()) + .setOriginName(runningWater.getOriginName()) + .setRemark(runningWater.getRemark()) + .setBackOperationName(StringUtils.isBlank(water.getBackOperationName()) + ? "-" : water.getBackOperationName()) + .setCreateTime(formatExportTime(runningWater.getCreateTime())); + }) + .toList(); + } + + private Long getLastRunningWaterId(List waters) { + if (CollectionUtils.isEmpty(waters)) { + return null; + } + return Optional.ofNullable(waters.get(waters.size() - 1)) + .map(UserGoldRunningWaterCO::getRunningWater) + .map(UserGoldRunningWaterDTO::getId) + .orElse(null); + } + + private String getGoldRunningWaterTypeName(Integer type) { + if (Objects.equals(type, 0)) { + return "增加"; + } + if (Objects.equals(type, 1)) { + return "减少"; + } + return Objects.toString(type, ""); + } + + private String formatExportTime(Long time) { + if (Objects.isNull(time)) { + return ""; + } + return EXPORT_TIME_FORMATTER.format( + Instant.ofEpochMilli(time).atZone(ZoneId.systemDefault())); + } + + private String getAccountDescribe(UserProfileDTO userProfile) { + if (Objects.isNull(userProfile)) { + return ""; + } + if (Objects.nonNull(userProfile.getOwnSpecialId())) { + return userProfile.getOwnSpecialId().getAccount() + "(" + userProfile.getAccount() + ")"; + } + return userProfile.getAccount(); + } + private UserGoldRunningWaterClsTmpCO getGoldRunningWaterDbFallback( UserGoldRunningWaterBackQryCmd query) { if (StringUtils.isNotBlank(query.getContext()) && Objects.isNull(query.getLastId())) { diff --git a/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/service/app/user/UserWalletService.java b/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/service/app/user/UserWalletService.java index 78d6768f..b79abd74 100644 --- a/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/service/app/user/UserWalletService.java +++ b/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/service/app/user/UserWalletService.java @@ -4,11 +4,13 @@ import com.red.circle.console.app.dto.clienobject.user.UserGoldBalanceCO; import com.red.circle.console.app.dto.clienobject.user.UserGoldRunningWaterCO; import com.red.circle.console.app.dto.clienobject.user.UserGoldRunningWaterClsTmpCO; import com.red.circle.wallet.inner.model.cmd.DeductGoldCmd; -import com.red.circle.wallet.inner.model.cmd.DiamondCmd; -import com.red.circle.wallet.inner.model.cmd.SendGoldCmd; -import com.red.circle.wallet.inner.model.cmd.UserGoldRunningWaterBackQryCmd; -import java.math.BigDecimal; -import java.util.List; +import com.red.circle.wallet.inner.model.cmd.DiamondCmd; +import com.red.circle.wallet.inner.model.cmd.SendGoldCmd; +import com.red.circle.wallet.inner.model.cmd.UserGoldRunningWaterBackQryCmd; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.math.BigDecimal; +import java.util.List; /** * 用户钱包 服务. @@ -29,15 +31,21 @@ public interface UserWalletService { List listGoldRunningWater(UserGoldRunningWaterBackQryCmd query); - /** - * 查询用户金币流水 cls. - */ - UserGoldRunningWaterClsTmpCO getGoldRunningWaterCls(UserGoldRunningWaterBackQryCmd query); - - /** - * 发送金币. - */ - void sendGold(SendGoldCmd param); + /** + * 查询用户金币流水 cls. + */ + UserGoldRunningWaterClsTmpCO getGoldRunningWaterCls(UserGoldRunningWaterBackQryCmd query); + + /** + * 导出用户金币流水. + */ + void exportGoldRunningWater(HttpServletResponse response, UserGoldRunningWaterBackQryCmd query) + throws IOException; + + /** + * 发送金币. + */ + void sendGold(SendGoldCmd param); /** * 扣除金币. diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/material/query/EmojiAllQryExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/material/query/EmojiAllQryExe.java index da3dd7e0..6ab8df13 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/material/query/EmojiAllQryExe.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/material/query/EmojiAllQryExe.java @@ -8,7 +8,6 @@ import com.red.circle.other.infra.database.cache.service.other.EmojiCacheService import com.red.circle.tool.core.collection.CollectionUtils; import java.util.Comparator; import java.util.List; -import java.util.Objects; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -41,19 +40,15 @@ public class EmojiAllQryExe { } public List listUserEmojiBackpackCache(AppExtCommand cmd) { - List emojiBackpackCaches = emojiCacheService.listEmojiAll(cmd.requireReqSysOrigin()); - - List emojiBagIds = emojiCacheService.listEmojiBagIds(cmd.requiredReqUserId()); - - if (CollectionUtils.isEmpty(emojiBagIds)) { + List emojiBackpackCaches = emojiCacheService.listEmojiAll( + cmd.requireReqSysOrigin()); + if (CollectionUtils.isEmpty(emojiBackpackCaches)) { return emojiBackpackCaches; } - return emojiBackpackCaches.stream().peek(cache -> { - if (emojiBagIds.contains(cache.getId())) { - cache.setHave(Boolean.TRUE); - } - }).collect(Collectors.toList()); + return emojiBackpackCaches.stream() + .peek(cache -> cache.setHave(Boolean.TRUE)) + .collect(Collectors.toList()); } } diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/material/query/UserEmojiBackpackQryExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/material/query/UserEmojiBackpackQryExe.java index 5718d0e4..39a869e4 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/material/query/UserEmojiBackpackQryExe.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/material/query/UserEmojiBackpackQryExe.java @@ -7,7 +7,6 @@ import com.red.circle.other.infra.database.cache.entity.material.UserEmojiBackpa import com.red.circle.other.infra.database.cache.service.other.EmojiCacheService; import com.red.circle.tool.core.collection.CollectionUtils; import java.util.List; -import java.util.Optional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -24,26 +23,13 @@ public class UserEmojiBackpackQryExe { private final EmojiAppConvertor emojiAppConvertor; public List execute(AppExtCommand cmd) { - return Optional - .ofNullable(emojiCacheService.getBySystemUserBag(cmd.requireReqSysOrigin())) - .map(systemBag -> getUserEmojiBagIncludeSystem(cmd, systemBag)) - .orElseGet(() -> getUserEmojiBags(cmd)); - } - - private List getUserEmojiBagIncludeSystem(AppExtCommand cmd, - UserEmojiBackpackCache systemBag) { - List userEmojiBag = CollectionUtils.newArrayList(); - userEmojiBag.add(emojiAppConvertor.toUserEmojiBagCO(systemBag)); - List userEmojiBags = getUserEmojiBags(cmd); - if (CollectionUtils.isNotEmpty(userEmojiBags)) { - userEmojiBag.addAll(userEmojiBags); + List emojiBackpackCaches = emojiCacheService.listEmojiAll( + cmd.requireReqSysOrigin()); + if (CollectionUtils.isEmpty(emojiBackpackCaches)) { + return CollectionUtils.newArrayList(); } - return userEmojiBag; - } - - private List getUserEmojiBags(AppExtCommand cmd) { - return emojiAppConvertor.toListUserEmojiBagCO( - emojiCacheService.listEmojiBag(cmd.requiredReqUserId())); + emojiBackpackCaches.forEach(cache -> cache.setHave(Boolean.TRUE)); + return emojiAppConvertor.toListUserEmojiBagCO(emojiBackpackCaches); } } diff --git a/rc-service/rc-service-wallet/wallet-infrastructure/src/main/java/com/red/circle/wallet/infra/database/rds/service/freight/impl/FreightBalanceRunningWaterServiceImpl.java b/rc-service/rc-service-wallet/wallet-infrastructure/src/main/java/com/red/circle/wallet/infra/database/rds/service/freight/impl/FreightBalanceRunningWaterServiceImpl.java index ccd999f3..9f6dc9ad 100644 --- a/rc-service/rc-service-wallet/wallet-infrastructure/src/main/java/com/red/circle/wallet/infra/database/rds/service/freight/impl/FreightBalanceRunningWaterServiceImpl.java +++ b/rc-service/rc-service-wallet/wallet-infrastructure/src/main/java/com/red/circle/wallet/infra/database/rds/service/freight/impl/FreightBalanceRunningWaterServiceImpl.java @@ -7,6 +7,7 @@ import com.red.circle.framework.mybatis.mybatisplus.LambdaQueryWrapperChain; import com.red.circle.framework.mybatis.service.impl.BaseServiceImpl; import com.red.circle.tool.core.collection.CollectionUtils; import com.red.circle.tool.core.date.TimestampUtils; +import com.red.circle.tool.core.parse.DataTypeUtils; import com.red.circle.tool.core.text.StringUtils; import com.red.circle.wallet.infra.database.rds.dao.FreightBalanceRunningWaterDAO; import com.red.circle.wallet.infra.database.rds.entity.freight.FreightBalanceRunningWater; @@ -17,6 +18,7 @@ import com.red.circle.wallet.inner.model.cmd.UserFreightSellerRunningWaterPageQr import java.math.BigDecimal; import java.sql.Timestamp; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -99,6 +101,7 @@ public class FreightBalanceRunningWaterServiceImpl extends @Override public PageResult pageRunningWater( UserFreightBalanceRunningWaterPageQryCmd query) { + List createUsers = parseLongIds(query.getCreateUsers()); return query() .eq(StringUtils.isNotBlank(query.getSysOrigin()), FreightBalanceRunningWater::getSysOrigin, query.getSysOrigin()) @@ -113,7 +116,9 @@ public class FreightBalanceRunningWaterServiceImpl extends .le(Objects.nonNull(query.getEndTime()), FreightBalanceRunningWater::getCreateTime, query.endTimeToLocalDateTime()) .gt(Objects.equals(query.getQueryBackOperationUser(), true), - FreightBalanceRunningWater::getUpdateUser, 0) + FreightBalanceRunningWater::getCreateUser, 0) + .in(CollectionUtils.isNotEmpty(createUsers), FreightBalanceRunningWater::getCreateUser, + createUsers) .orderByDesc(FreightBalanceRunningWater::getCreateTime) .page(query.getPageQuery()); } @@ -132,12 +137,44 @@ public class FreightBalanceRunningWaterServiceImpl extends @Override public List listExportBalanceRunningWater( UserFreightBalanceRunningWaterExportQryCmd query) { + List createUsers = parseLongIds(query.getCreateUsers()); return query() - .eq(FreightBalanceRunningWater::getSysOrigin, query.getSysOrigin()) - .apply("DATE_FORMAT(create_time,'%Y%m')={0}", query.getMonthDate()) + .eq(StringUtils.isNotBlank(query.getSysOrigin()), + FreightBalanceRunningWater::getSysOrigin, query.getSysOrigin()) + .eq(Objects.nonNull(query.getUserId()), + FreightBalanceRunningWater::getUserId, query.getUserId()) + .eq(Objects.nonNull(query.getAcceptUserId()), + FreightBalanceRunningWater::getAcceptUserId, query.getAcceptUserId()) + .eq(StringUtils.isNotBlank(query.getOrigin()), + FreightBalanceRunningWater::getOrigin, query.getOrigin()) + .ge(Objects.nonNull(query.getStartTime()), + FreightBalanceRunningWater::getCreateTime, query.startTimeToLocalDateTime()) + .le(Objects.nonNull(query.getEndTime()), + FreightBalanceRunningWater::getCreateTime, query.endTimeToLocalDateTime()) + .gt(Objects.equals(query.getQueryBackOperationUser(), true), + FreightBalanceRunningWater::getCreateUser, 0) + .in(CollectionUtils.isNotEmpty(createUsers), FreightBalanceRunningWater::getCreateUser, + createUsers) + .apply(Objects.isNull(query.getStartTime()) && Objects.isNull(query.getEndTime()) + && StringUtils.isNotBlank(query.getMonthDate()), + "DATE_FORMAT(create_time,'%Y%m')={0}", query.getMonthDate()) + .orderByDesc(FreightBalanceRunningWater::getCreateTime) .list(); } + private List parseLongIds(String values) { + if (StringUtils.isBlank(values)) { + return CollectionUtils.newArrayList(); + } + return Arrays.stream(values.split(",")) + .map(String::trim) + .filter(StringUtils::isNotBlank) + .map(DataTypeUtils::toLong) + .filter(Objects::nonNull) + .distinct() + .toList(); + } + @Override public boolean existsRecord(String txId) { if (!StringUtils.isNotBlank(txId)) { diff --git a/rc-service/rc-service-wallet/wallet-inner-endpoint/src/main/java/com/red/circle/wallet/inner/service/wallet/impl/WalletGoldClientServiceImpl.java b/rc-service/rc-service-wallet/wallet-inner-endpoint/src/main/java/com/red/circle/wallet/inner/service/wallet/impl/WalletGoldClientServiceImpl.java index 5a85dc19..bf0334d9 100644 --- a/rc-service/rc-service-wallet/wallet-inner-endpoint/src/main/java/com/red/circle/wallet/inner/service/wallet/impl/WalletGoldClientServiceImpl.java +++ b/rc-service/rc-service-wallet/wallet-inner-endpoint/src/main/java/com/red/circle/wallet/inner/service/wallet/impl/WalletGoldClientServiceImpl.java @@ -146,11 +146,12 @@ public class WalletGoldClientServiceImpl implements WalletGoldClientService { } - @Override - public List listWater(UserGoldRunningWaterBackQryCmd cmd) { - List querySysOrigin = listWaterQuerySysOrigin(cmd); - - LambdaQueryWrapperChain queryChain = walletGoldAssetRecordService.query(); + @Override + public List listWater(UserGoldRunningWaterBackQryCmd cmd) { + List querySysOrigin = listWaterQuerySysOrigin(cmd); + List backOperationUsers = parseLongIds(cmd.getBackOperationUsers()); + + LambdaQueryWrapperChain queryChain = walletGoldAssetRecordService.query(); if (CollectionUtils.isEmpty(querySysOrigin) || querySysOrigin.size() <= 1) { queryChain.eq(WalletGoldAssetRecord::getSysOrigin, @@ -164,9 +165,12 @@ public class WalletGoldClientServiceImpl implements WalletGoldClientService { .le(WalletGoldAssetRecord::getCreateTime, cmd.getEndTime()) .eq(Objects.nonNull(cmd.getId()), WalletGoldAssetRecord::getId, cmd.getId()) .eq(Objects.nonNull(cmd.getQueryBackOperationUser()), WalletGoldAssetRecord::getOpUserType, - cmd.getQueryBackOperationUser()) - .eq(Objects.nonNull(cmd.getBackOperationUser()), WalletGoldAssetRecord::getCreateUser, + DataTypeUtils.toInteger(cmd.getQueryBackOperationUser())) + .eq(CollectionUtils.isEmpty(backOperationUsers) && Objects.nonNull(cmd.getBackOperationUser()), + WalletGoldAssetRecord::getCreateUser, cmd.getBackOperationUser()) + .in(CollectionUtils.isNotEmpty(backOperationUsers), WalletGoldAssetRecord::getCreateUser, + backOperationUsers) .eq(Objects.nonNull(cmd.getType()), WalletGoldAssetRecord::getType, cmd.getType()) .eq(Objects.nonNull(cmd.getUserId()), WalletGoldAssetRecord::getUserId, cmd.getUserId()) .eq(StringUtils.isNotBlank(cmd.getTrackId()), WalletGoldAssetRecord::getEventId, @@ -301,10 +305,10 @@ public class WalletGoldClientServiceImpl implements WalletGoldClientService { private String getQueryString(UserGoldRunningWaterBackQryCmd cmd) { List query = Stream.of( - toQuery("sysOrigin", querySysOrigin(cmd)), + toQuery("sysOrigin", querySysOrigin(cmd)), toQuery("id", cmd.getId()), toQuery("opUserType", DataTypeUtils.toInteger(cmd.getQueryBackOperationUser())), - toQuery("createUser", cmd.getBackOperationUser()), + toQuery("createUser", getBackOperationUsers(cmd)), toQuery("type", cmd.getType()), toQuery("userId", cmd.getUserId()), toQuery("eventId", cmd.getTrackId()), @@ -315,7 +319,7 @@ public class WalletGoldClientServiceImpl implements WalletGoldClientService { return StringUtils.isBlank(queryString) ? "*" : queryString; } - private List getOrigin(String origin) { + private List getOrigin(String origin) { if (StringUtils.isBlank(origin)) { return null; } @@ -323,10 +327,34 @@ public class WalletGoldClientServiceImpl implements WalletGoldClientService { ? Stream.of(origin.split(",")).filter(StringUtils::isNotBlank).toList() : List.of(origin); - } - - /** - * cls最多一次返回1000条. + } + + private List getBackOperationUsers(UserGoldRunningWaterBackQryCmd cmd) { + List backOperationUsers = parseLongIds(cmd.getBackOperationUsers()); + if (CollectionUtils.isNotEmpty(backOperationUsers)) { + return backOperationUsers.stream().map(Objects::toString).toList(); + } + if (Objects.nonNull(cmd.getBackOperationUser())) { + return List.of(Objects.toString(cmd.getBackOperationUser())); + } + return null; + } + + private List parseLongIds(String values) { + if (StringUtils.isBlank(values)) { + return Lists.newArrayList(); + } + return Arrays.stream(values.split(",")) + .map(StringUtils::trim) + .filter(StringUtils::isNotBlank) + .map(DataTypeUtils::toLong) + .filter(Objects::nonNull) + .distinct() + .toList(); + } + + /** + * cls最多一次返回1000条. */ private Integer getLimit(UserGoldRunningWaterBackQryCmd cmd) { if (Objects.nonNull(cmd.getLimit()) && cmd.getLimit() > 0) {