From 5f8b4fdedeecd077f57a54a0efdb098f423f15f6 Mon Sep 17 00:00:00 2001 From: "YAS\\29473" <2947326429@qq.com> Date: Wed, 2 Apr 2025 14:48:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BC=9A=E5=91=98=E6=98=8E?= =?UTF-8?q?=E7=BB=86=E5=92=8C=E5=AF=BC=E5=87=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pile/MemberBasicInfoController.java | 26 ++- .../pile/service/MemberBasicInfoService.java | 7 + .../impl/MemberBasicInfoServiceImpl.java | 89 ++++++++ .../vo/uniapp/customer/MemberWalletLogVO.java | 5 + .../jsowell/pile/vo/web/MemberDetailsVO.java | 45 +++++ .../mapper/pile/MemberWalletLogMapper.xml | 3 +- jsowell-ui/src/api/member/info.js | 8 + jsowell-ui/src/views/member/info/index.vue | 191 +++++++++++++++++- 8 files changed, 368 insertions(+), 6 deletions(-) create mode 100644 jsowell-pile/src/main/java/com/jsowell/pile/vo/web/MemberDetailsVO.java diff --git a/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/MemberBasicInfoController.java b/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/MemberBasicInfoController.java index 0c0f83a8c..cda6319f9 100644 --- a/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/MemberBasicInfoController.java +++ b/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/MemberBasicInfoController.java @@ -28,10 +28,7 @@ import com.jsowell.pile.vo.base.MerchantInfoVO; import com.jsowell.pile.vo.uniapp.customer.MemberVO; import com.jsowell.pile.vo.uniapp.customer.MemberWalletLogVO; import com.jsowell.pile.vo.uniapp.customer.MerchantVipVO; -import com.jsowell.pile.vo.web.MemberTransactionVO; -import com.jsowell.pile.vo.web.OrderListVO; -import com.jsowell.pile.vo.web.PlatformTesterVO; -import com.jsowell.pile.vo.web.UpdateMemberBalanceDTO; +import com.jsowell.pile.vo.web.*; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; @@ -321,4 +318,25 @@ public class MemberBasicInfoController extends BaseController { } return result; } + /** + * 查询会员明细 + * @param dto + * @return + */ + @PostMapping("/queryMemberDetails") + public AjaxResult queryMemberDetails(@RequestBody UniAppQueryMemberBalanceDTO dto) { + try { + if (StringUtils.isBlank(dto.getMemberId())) { + throw new BusinessException(ReturnCodeEnum.CODE_PARAM_NOT_NULL_ERROR); + } + MemberDetailsVO memberDetailsVO = memberBasicInfoService.queryMemberDetails(dto); + return AjaxResult.success(memberDetailsVO); + } catch (BusinessException e) { + logger.error("查询会员明细失败,dto: {}", dto, e); + return AjaxResult.error(e.getMessage()); + } catch (Exception e) { + logger.error("查询会员明细发生未知异常,dto: {}", dto, e); + return AjaxResult.error("查询会员明细发生未知异常,请稍后重试"); + } + } } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberBasicInfoService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberBasicInfoService.java index febbe5c6e..222ca2f43 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberBasicInfoService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberBasicInfoService.java @@ -6,6 +6,7 @@ import com.jsowell.pile.dto.PlatformTesterDTO; import com.jsowell.pile.dto.QueryMemberInfoDTO; import com.jsowell.pile.dto.UniAppQueryMemberBalanceDTO; import com.jsowell.pile.vo.uniapp.customer.*; +import com.jsowell.pile.vo.web.MemberDetailsVO; import com.jsowell.pile.vo.web.PlatformTesterVO; import com.jsowell.pile.vo.web.UpdateMemberBalanceDTO; @@ -162,4 +163,10 @@ public interface MemberBasicInfoService { List getMemberInfoByPlateNumber(String plateNumber); + /** + * 会员明细查询 + * @param dto + * @return + */ + MemberDetailsVO queryMemberDetails(UniAppQueryMemberBalanceDTO dto); } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberBasicInfoServiceImpl.java index b9070cfbc..27d6ecedb 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberBasicInfoServiceImpl.java @@ -2,9 +2,11 @@ package com.jsowell.pile.service.impl; import com.alibaba.fastjson2.JSON; import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; import com.google.common.collect.Lists; import com.jsowell.common.constant.CacheConstants; import com.jsowell.common.constant.Constants; +import com.jsowell.common.core.page.PageResponse; import com.jsowell.common.core.redis.RedisCache; import com.jsowell.common.enums.MemberWalletEnum; import com.jsowell.common.enums.ykc.ReturnCodeEnum; @@ -23,12 +25,14 @@ import com.jsowell.pile.dto.QueryMemberInfoDTO; import com.jsowell.pile.dto.UniAppQueryMemberBalanceDTO; import com.jsowell.pile.mapper.MemberBasicInfoMapper; import com.jsowell.pile.mapper.MemberPlateNumberRelationMapper; +import com.jsowell.pile.mapper.MemberWalletInfoMapper; import com.jsowell.pile.mapper.MemberWalletLogMapper; import com.jsowell.pile.service.*; import com.jsowell.pile.util.MerchantUtils; import com.jsowell.pile.util.UserUtils; import com.jsowell.pile.vo.base.MerchantInfoVO; import com.jsowell.pile.vo.uniapp.customer.*; +import com.jsowell.pile.vo.web.MemberDetailsVO; import com.jsowell.pile.vo.web.PlatformTesterVO; import com.jsowell.pile.vo.web.UpdateMemberBalanceDTO; import lombok.extern.slf4j.Slf4j; @@ -40,6 +44,7 @@ import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; /** @@ -84,6 +89,9 @@ public class MemberBasicInfoServiceImpl implements MemberBasicInfoService { @Autowired private PileStationInfoService pileStationInfoService; + @Autowired + private MemberWalletInfoMapper memberWalletInfoMapper; + /** * 查询会员基础信息 * @@ -679,4 +687,85 @@ public class MemberBasicInfoServiceImpl implements MemberBasicInfoService { return memberBasicInfoMapper.getMemberInfoByPlateNumber(plateNumber); } + /** + * 会员明细 + * @param dto + * @return + */ + @Override + public MemberDetailsVO queryMemberDetails(UniAppQueryMemberBalanceDTO dto) { + // 获取会员钱包信息 + List memberWalletInfos = memberWalletInfoMapper.selectByMemberWalletList(dto.getMemberId()); + + // 计算总余额 + BigDecimal totalPrincipalBalance = memberWalletInfos.stream() + .map(MemberWalletInfo::getPrincipalBalance) + .reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal totalGiftBalance = memberWalletInfos.stream() + .map(MemberWalletInfo::getGiftBalance) + .reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal totalBalance = totalPrincipalBalance.add(totalGiftBalance); + + // 获取会员所有钱包流水 + List allWalletLogs = memberWalletLogMapper.getMemberBalanceChanges(dto.getMemberId(), null); + + // 计算总充值金额 + BigDecimal totalRechargeAmount = allWalletLogs.stream() + .filter(log -> "1".equals(log.getType()) && ("10".equals(log.getSubType()) || "11".equals(log.getSubType()))) + .map(MemberWalletLogVO::getAmount) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + // 计算总消费金额 + BigDecimal totalConsumeAmount = totalRechargeAmount.subtract(totalBalance); + + // 获取指定时间段的钱包流水 + List walletLogs = memberWalletLogMapper.getMemberWalletDetailV2(dto); + + // 计算时间段累计消费金额 + BigDecimal cumulativeConsumeAmount = walletLogs.stream() + .map(MemberWalletLogVO::getOrderAmount) + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + // 计算时间段累计充值金额 + BigDecimal cumulativeRechargeAmount = walletLogs.stream() + .filter(log -> "1".equals(log.getType()) && ("10".equals(log.getSubType()) || "11".equals(log.getSubType()))) + .map(MemberWalletLogVO::getAmount) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + // 分页查询 + PageHelper.startPage(dto.getPageNum(), dto.getPageSize()); + List pagedWalletLogs = memberWalletLogMapper.getMemberWalletDetailV2(dto); + for (MemberWalletLogVO pagedWalletLog : pagedWalletLogs) { + if (pagedWalletLog.getOrderAmount() != null ){ + BigDecimal orderAmount = pagedWalletLog.getOrderAmount(); + pagedWalletLog.setOrderAmount(orderAmount.negate()); + }else { + //当没有订单金额时,就获取amount的值 + pagedWalletLog.setOrderAmount(pagedWalletLog.getAmount()); + } + } + + PageInfo pageInfo = new PageInfo<>(pagedWalletLogs); + + // 构建分页响应 + PageResponse pageResponse = PageResponse.builder() + .pageNum(dto.getPageNum()) + .pageSize(dto.getPageSize()) + .list(pagedWalletLogs) + .total(pageInfo.getTotal()) + .pages(pageInfo.getPages()) + .build(); + + // 构建会员明细VO + return MemberDetailsVO.builder() + .totalRechargeAmount(totalRechargeAmount) + .totalConsumeAmount(totalConsumeAmount.negate()) + .totalBalance(totalBalance) + .cumulativeRechargeAmount(cumulativeRechargeAmount) + .cumulativeConsumeAmount(cumulativeConsumeAmount.negate()) + .pageResponse(pageResponse) + .build(); + } + } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/uniapp/customer/MemberWalletLogVO.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/uniapp/customer/MemberWalletLogVO.java index 827c51b2b..e999aa416 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/vo/uniapp/customer/MemberWalletLogVO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/uniapp/customer/MemberWalletLogVO.java @@ -81,4 +81,9 @@ public class MemberWalletLogVO { * 变动后金额 */ private BigDecimal afterAmount; + + /** + * 操作人员 + */ + private String createBy; } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/MemberDetailsVO.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/MemberDetailsVO.java new file mode 100644 index 000000000..e8928c77a --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/MemberDetailsVO.java @@ -0,0 +1,45 @@ +package com.jsowell.pile.vo.web; + +import com.jsowell.common.core.page.PageResponse; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class MemberDetailsVO { + /** + * 总充值金额 + */ + private BigDecimal totalRechargeAmount; + + /** + * 总消费金额 + */ + private BigDecimal totalConsumeAmount; + + /** + * 总余额 + */ + private BigDecimal totalBalance; + + /** + * 充值金额 + */ + private BigDecimal cumulativeRechargeAmount; + + /** + * 消费金额 + */ + private BigDecimal cumulativeConsumeAmount; + + /** + * 分页信息 + */ + private PageResponse pageResponse; +} diff --git a/jsowell-pile/src/main/resources/mapper/pile/MemberWalletLogMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/MemberWalletLogMapper.xml index ed074ba8a..7481fe927 100644 --- a/jsowell-pile/src/main/resources/mapper/pile/MemberWalletLogMapper.xml +++ b/jsowell-pile/src/main/resources/mapper/pile/MemberWalletLogMapper.xml @@ -516,7 +516,8 @@ t2.pay_amount as payAmount, t2.order_amount as orderAmount, t2.refund_amount as refundAmount, - t1.create_time as transactionTime + t1.create_time as transactionTime, + t1.create_by as createBy from member_wallet_log t1 left join order_basic_info t2 on t1.related_order_code = t2.order_code where t1.sub_type != '12' diff --git a/jsowell-ui/src/api/member/info.js b/jsowell-ui/src/api/member/info.js index ffb3a783d..0adab19e3 100644 --- a/jsowell-ui/src/api/member/info.js +++ b/jsowell-ui/src/api/member/info.js @@ -157,3 +157,11 @@ export function exportWalletList(data) { data: data }); } + +export function queryMemberDetails(data) { + return request({ + url: '/member/info/queryMemberDetails', + method: 'post', + data: data + }); +} diff --git a/jsowell-ui/src/views/member/info/index.vue b/jsowell-ui/src/views/member/info/index.vue index 0e465c19e..c29dd7a5c 100644 --- a/jsowell-ui/src/views/member/info/index.vue +++ b/jsowell-ui/src/views/member/info/index.vue @@ -168,6 +168,13 @@ + + + + + + + + + + + + 搜索 + + + 导出 + + + + {{ totalRechargeAmount }} + {{ totalConsumeAmount }} + {{ totalBalance }} + {{ cumulativeRechargeAmount }} + {{ cumulativeConsumeAmount }} + + + + + + + + + + + + + + + + + + + @@ -247,6 +305,7 @@ import { updateInfo, updateMemberBalance, getMerchantListByAuth, + queryMemberDetails } from "@/api/member/info"; export default { @@ -297,7 +356,26 @@ export default { // 表单参数 form: {}, // 表单校验 - rules: {} + rules: {}, + detailParameters: { + memberId: null, + pageNum: 1, + pageSize: 10, + tradeDate: null, // 添加日期范围参数 + endDate: null // 新增结束日期参数 + }, + // 明细相关变量 + memberLogList: [], + closeTotal: 0, + totalRechargeAmount: 0, + totalConsumeAmount: 0, + totalBalance: 0, + cumulativeRechargeAmount: 0, + cumulativeConsumeAmount: 0, + detailLoading: false, + vehicleDetails: false, + createTimeRange: null, + dateRange: null }; }, computed: { @@ -310,6 +388,7 @@ export default { this.getList(); this.getMerchantList(); + this.defaultDateRange = this.getValidDateRange(); }, methods: { /** 查询会员基础信息列表 */ @@ -475,6 +554,116 @@ export default { this.download('member/info/export', { ...this.queryParams }, `info_${new Date().getTime()}.xlsx`) + }, + getTypeText(type) { + switch (type) { + case '1': + return '进账'; + case '2': + return '出账'; + default: + return type; + } + }, + getSubTypeText(subType) { + switch (subType) { + case '10': + return '充值'; + case '11': + return '赠送'; + case '12': + return '订单结算退款'; + case '20': + return '后管扣款'; + case '21': + return '订单付款'; + case '22': + return '用户退款'; + default: + return subType; + } + }, + // 查看会员钱包流水明细 + viewWalletDetails(row) { + if (!row.memberId) { + this.$modal.msgError('会员 ID 不能为空'); + return; + } + + // 设置日期范围为默认值 + this.dateRange = this.defaultDateRange; + + // 设置查询参数 + this.detailParameters = { + memberId: row.memberId, + pageNum: 1, + pageSize: 10, + tradeDate: this.defaultDateRange[0], + endDate: this.defaultDateRange[1] + }; + + // 获取明细数据 + this.fetchWalletDetails(); + this.vehicleDetails = true; + }, + getValidDateRange() { + if (this.dateRange) { + return this.dateRange; + } + + // 默认查询当前月 + const now = new Date(); + const year = now.getFullYear(); + const month = String(now.getMonth() + 1).padStart(2, '0'); + return [ + `${year}-${month}`, + `${year}-${month}` + ]; + }, + fetchWalletDetails() { + const params = { + memberId: this.detailParameters.memberId, + tradeDate: this.detailParameters.tradeDate, + endDate: this.detailParameters.endDate, + pageNum: this.detailParameters.pageNum, + pageSize: this.detailParameters.pageSize + }; + + queryMemberDetails(params).then(response => { + if (response.code === 200) { + const data = response.data; + this.memberLogList = data.pageResponse.list || []; + this.closeTotal = data.pageResponse.total || 0; + + this.totalRechargeAmount = data.totalRechargeAmount || 0; + this.totalConsumeAmount = data.totalConsumeAmount || 0; + this.totalBalance = data.totalBalance || 0; + this.cumulativeRechargeAmount = data.cumulativeRechargeAmount || 0; + this.cumulativeConsumeAmount = data.cumulativeConsumeAmount || 0; + } else { + this.$modal.msgError(response.msg); + } + this.detailLoading = false; + }).catch(() => { + this.detailLoading = false; + }); + }, + searchWalletDetails() { + if (this.dateRange) { + this.detailParameters.tradeDate = this.dateRange[0]; + this.detailParameters.endDate = this.dateRange[1]; + } else { + this.$modal.msgWarning('请选择日期范围'); + return; + } + this.detailParameters.pageNum = 1; + this.fetchWalletDetails(); + }, + exportWalletList(){ + this.download('member/info/exportWalletList', { + ...this.queryParams, + memberId: this.detailParameters.memberId + }, `info_${new Date().getTime()}.xlsx`) } } };