From a1dfc6a991f99bd0ca21fa1a5c9ca18d70ce8393 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Mon, 7 Sep 2026 16:12:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=8F=90=E4=BE=9B=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=92=B1=E5=8C=85=E6=B5=81=E6=B0=B4=E7=9A=84?= =?UTF-8?q?"=E5=88=9B=E5=BB=BA=E6=97=B6=E9=97=B4"=E5=92=8C"=E9=83=A8?= =?UTF-8?q?=E9=97=A8"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/WalletTransactionUpdateInfoDto.java | 37 +++++++++++++++++++ .../WalletTransactionController.java | 15 ++++++++ .../service/WalletTransactionService.java | 9 +++++ .../impl/WalletTransactionServiceImpl.java | 27 ++++++++++++++ 4 files changed, 88 insertions(+) create mode 100644 pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletTransactionUpdateInfoDto.java diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletTransactionUpdateInfoDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletTransactionUpdateInfoDto.java new file mode 100644 index 000000000..9532d6a0b --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletTransactionUpdateInfoDto.java @@ -0,0 +1,37 @@ +package com.bsd.pjcloud.wallet.api.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 钱包流水信息修改参数,仅允许后台修正流水触发事件的归属部门和创建时间, + * 不承载金额、余额、业务关联等不可变流水信息。 + */ +@Data +@Schema(description = "钱包流水信息修改参数") +public class WalletTransactionUpdateInfoDto { + + /** + * 需要修改信息的钱包流水编号,由钱包流水列表返回。 + */ + @NotNull(message = "钱包流水编号不能为空") + @Schema(description = "钱包流水编号", requiredMode = Schema.RequiredMode.REQUIRED) + private Long id; + + /** + * 流水触发事件归属的新部门编号;必须是当前租户有效部门,用于更正部门归属统计口径。 + */ + @NotNull(message = "流水归属部门不能为空") + @Schema(description = "流水归属部门编号", requiredMode = Schema.RequiredMode.REQUIRED) + private Long deptId; + + /** + * 流水新的创建时间,用于更正流水归属的统计周期;时间格式为 yyyy-MM-dd HH:mm:ss。 + */ + @NotNull(message = "流水创建时间不能为空") + @Schema(description = "流水创建时间,格式 yyyy-MM-dd HH:mm:ss", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; +} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java index 85cf05389..3cd63b61e 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java @@ -18,6 +18,7 @@ import com.bsd.pjcloud.wallet.api.dto.WalletTransactionDto; import com.bsd.pjcloud.wallet.api.dto.WalletTransactionDepartmentSnapshotBatchDto; import com.bsd.pjcloud.wallet.api.dto.WalletTransactionDepartmentSnapshotDto; import com.bsd.pjcloud.wallet.api.dto.WalletTransactionRemarkDto; +import com.bsd.pjcloud.wallet.api.dto.WalletTransactionUpdateInfoDto; import com.bsd.pjcloud.wallet.api.dto.WalletTransactionSumAndCountDto; import com.bsd.pjcloud.wallet.api.entity.WalletTransactionEntity; import com.bsd.pjcloud.wallet.api.vo.WalletCzTotalVo; @@ -214,6 +215,20 @@ public class WalletTransactionController { return R.ok(walletTransactionService.updateRemark(dto)); } + /** + * 修改单笔钱包流水的归属部门和创建时间,用于更正流水归属统计口径,不开放金额、余额等核心字段变更。 + * + * @param dto 流水编号、新部门编号和新创建时间 + * @return 更新到当前租户有效流水时返回 {@code true} + */ + @PutMapping("/update-info") + @Operation(summary = "修改钱包流水信息") + @SysLog("修改钱包流水信息") + @PreAuthorize("@pms.hasPermission('wallet_walletTransaction_update_info')") + public R updateInfo(@Valid @RequestBody WalletTransactionUpdateInfoDto dto) { + return R.ok(walletTransactionService.updateInfo(dto)); + } + @Operation(summary = "后台充值分页", description = "后台充值分页") @PostMapping("/page-cz") public R pageCz(@ParameterObject Page page, @RequestBody WalletTransactionDto dto) { diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTransactionService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTransactionService.java index 54e20df8b..3e90a21e5 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTransactionService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTransactionService.java @@ -8,6 +8,7 @@ import com.bsd.pjcloud.wallet.api.dto.WalletBalanceTransactionDto; import com.bsd.pjcloud.wallet.api.dto.WalletTransactionDepartmentSnapshotBatchDto; import com.bsd.pjcloud.wallet.api.dto.WalletTransactionDto; import com.bsd.pjcloud.wallet.api.dto.WalletTransactionRemarkDto; +import com.bsd.pjcloud.wallet.api.dto.WalletTransactionUpdateInfoDto; import com.bsd.pjcloud.wallet.api.entity.WalletTransactionEntity; import com.bsd.pjcloud.wallet.api.vo.WalletCzTotalVo; import com.bsd.pjcloud.wallet.api.vo.WalletTransactionDepartmentSnapshotVo; @@ -186,6 +187,14 @@ public interface WalletTransactionService extends IService deptResult = deptService.getDeptByDeptId(dto.getDeptId()); + if (deptResult == null || !deptResult.isOk() || ObjectUtil.isEmpty(deptResult.getData())) { + throw new I18nBizException(ErrorCodes.COMMON_RECORD_NOT_FOUND); + } + // 传入空实体会跳过 MyBatis-Plus 的修改人和修改时间填充,因此保留更新实体承载审计字段。 + WalletTransactionEntity updateEntity = new WalletTransactionEntity(); + int updated = baseMapper.update(updateEntity, Wrappers.lambdaUpdate() + .eq(WalletTransactionEntity::getId, dto.getId()) + .set(WalletTransactionEntity::getDeptId, dto.getDeptId()) + .set(WalletTransactionEntity::getCreateTime, dto.getCreateTime())); + // 部分 MySQL affected-row 配置会把“值未变化”返回为 0,仅在记录也查不到时才判定失败。 + if (updated == 0 && baseMapper.selectById(dto.getId()) == null) { + throw new I18nBizException(ErrorCodes.WALLET_TX_NOT_FOUND); + } + return true; + } + @Override // @CacheEvict(value = CacheConstants.WALLET_DETAIL, key = "#dto.getWalletId()") public Boolean updateWalletBalance(WalletTransactionDto dto) {