From 2785d91b4f29c1a9f5d081e0fc9dfecde3eade54 Mon Sep 17 00:00:00 2001 From: Guoqs <123@jsowell.com> Date: Fri, 17 Jan 2025 15:13:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=97=B6=E9=97=B4=E6=AE=B5?= =?UTF-8?q?=E5=86=85=E7=9A=84=E8=AE=A2=E5=8D=95=E5=88=86=E8=B4=A6=E8=AE=B0?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/java/SpringBootTestController.java | 12 ++ .../pile/mapper/OrderSplitRecordMapper.java | 8 +- .../pile/service/OrderSplitRecordService.java | 23 +++- .../impl/OrderSplitRecordServiceImpl.java | 125 +++++++++++++++++- .../vo/web/OrderSplitDailySummaryData.java | 54 ++++++++ .../pile/vo/{ => web}/OrderSplitRecordVO.java | 2 +- .../jsowell/pile/vo/web/OtherSplitDetail.java | 42 ++++++ .../mapper/pile/OrderSplitRecordMapper.xml | 12 ++ 8 files changed, 273 insertions(+), 5 deletions(-) create mode 100644 jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderSplitDailySummaryData.java rename jsowell-pile/src/main/java/com/jsowell/pile/vo/{ => web}/OrderSplitRecordVO.java (97%) create mode 100644 jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OtherSplitDetail.java diff --git a/jsowell-admin/src/test/java/SpringBootTestController.java b/jsowell-admin/src/test/java/SpringBootTestController.java index bc5cc9977..3ccce38bd 100644 --- a/jsowell-admin/src/test/java/SpringBootTestController.java +++ b/jsowell-admin/src/test/java/SpringBootTestController.java @@ -278,9 +278,21 @@ public class SpringBootTestController { @Autowired private RabbitTemplate rabbitTemplate; + @Autowired + private OrderSplitRecordService orderSplitRecordService; + @Qualifier("zhongDianLianPlatformServiceImpl") private ThirdPartyPlatformService platformLogic; + @Test + public void queryOrderSplitDataTest() { + String merchantId = "18"; + String startTime = "2025-01-06"; + String endTime = "2025-01-06"; + List orderSplitDailySummaryData = orderSplitRecordService.queryOrderSplitData(merchantId, null, startTime, endTime); + System.out.println(JSON.toJSONString(orderSplitDailySummaryData)); + } + @Test public void test() { System.out.println(YKCUtils.getNewLogicStationIdList()); diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/OrderSplitRecordMapper.java b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/OrderSplitRecordMapper.java index 56fec8385..9687561bf 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/OrderSplitRecordMapper.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/OrderSplitRecordMapper.java @@ -1,11 +1,10 @@ package com.jsowell.pile.mapper; import com.jsowell.pile.domain.OrderSplitRecord; +import org.apache.ibatis.annotations.Param; import java.util.List; -import org.apache.ibatis.annotations.Param; - public interface OrderSplitRecordMapper { int deleteByPrimaryKey(Integer id); @@ -24,4 +23,9 @@ public interface OrderSplitRecordMapper { int insertOrUpdateSelective(OrderSplitRecord record); List selectByOrderCode(String orderCode); + + List queryOrderSplitDataList(@Param("merchantId") String merchantId, + @Param("stationId") String stationId, + @Param("startTime") String startTime, + @Param("endTime") String endTime); } \ No newline at end of file diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderSplitRecordService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderSplitRecordService.java index fde8ed196..679f042af 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderSplitRecordService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderSplitRecordService.java @@ -4,7 +4,8 @@ import com.jsowell.adapay.dto.PaymentConfirmParam; import com.jsowell.adapay.dto.SplitData; import com.jsowell.pile.domain.OrderSplitRecord; import com.jsowell.pile.vo.OrderInfoDetailVO; -import com.jsowell.pile.vo.OrderSplitRecordVO; +import com.jsowell.pile.vo.web.OrderSplitDailySummaryData; +import com.jsowell.pile.vo.web.OrderSplitRecordVO; import java.util.List; @@ -24,6 +25,11 @@ public interface OrderSplitRecordService { // int updateBatchSelective(List list); + /** + * 批量保存订单分账记录 + * @param list + * @return + */ int batchInsert(List list); /** @@ -32,5 +38,20 @@ public interface OrderSplitRecordService { void saveOrderSplitRecord(PaymentConfirmParam param, String id, List stationSplitConfigList, OrderInfoDetailVO orderInfoDetailVO); List selectByOrderCode(String orderCode); + + /** + * 根据入参拉出时间段内所有订单的分账记录 + * @param merchantId 运营商id + * @param stationId 站点id + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return + */ + List queryOrderSplitRecordList(String merchantId, String stationId, String startTime, String endTime); + + /** + * 查询时间段内的订单分账记录 + */ + List queryOrderSplitData(String merchantId, String stationId, String startTime, String endTime); } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderSplitRecordServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderSplitRecordServiceImpl.java index c72af4ec3..66e7425d6 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderSplitRecordServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderSplitRecordServiceImpl.java @@ -1,23 +1,33 @@ package com.jsowell.pile.service.impl; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import com.jsowell.adapay.dto.PaymentConfirmParam; import com.jsowell.adapay.dto.SplitData; import com.jsowell.common.constant.Constants; import com.jsowell.common.enums.DelFlagEnum; import com.jsowell.common.enums.adapay.AdapayStatusEnum; import com.jsowell.common.util.DateUtils; +import com.jsowell.common.util.StringUtils; +import com.jsowell.pile.domain.AdapayMemberAccount; import com.jsowell.pile.domain.OrderSplitRecord; import com.jsowell.pile.mapper.OrderSplitRecordMapper; +import com.jsowell.pile.service.AdapayMemberAccountService; import com.jsowell.pile.service.OrderSplitRecordService; import com.jsowell.pile.vo.OrderInfoDetailVO; -import com.jsowell.pile.vo.OrderSplitRecordVO; +import com.jsowell.pile.vo.web.OrderSplitDailySummaryData; +import com.jsowell.pile.vo.web.OrderSplitRecordVO; +import com.jsowell.pile.vo.web.OtherSplitDetail; import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; @Service public class OrderSplitRecordServiceImpl implements OrderSplitRecordService { @@ -25,6 +35,9 @@ public class OrderSplitRecordServiceImpl implements OrderSplitRecordService { @Resource private OrderSplitRecordMapper orderSplitRecordMapper; + @Autowired + private AdapayMemberAccountService adapayMemberAccountService; + // @Override // public int deleteByPrimaryKey(Integer id) { // return orderSplitRecordMapper.deleteByPrimaryKey(id); @@ -129,5 +142,115 @@ public class OrderSplitRecordServiceImpl implements OrderSplitRecordService { return resultList; } + /** + * 根据入参拉出时间段内所有订单的分账记录 + * @param merchantId 运营商id + * @param stationId 站点id + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return + */ + @Override + public List queryOrderSplitRecordList(String merchantId, String stationId, String startTime, String endTime) { + /* + 入参校验规则 + 1. merchantId, startTime, endTime不能为空, stationId可以为空 + 2. startTime不能早于endTime + */ + if (StringUtils.isBlank(merchantId) || StringUtils.isBlank(startTime) || StringUtils.isBlank(endTime)) { + return Lists.newArrayList(); + } + if (DateUtils.parseDate(startTime).after(DateUtils.parseDate(endTime))) { + return Lists.newArrayList(); + } + // 根据入参拉出时间段内所有订单的分账记录 + return orderSplitRecordMapper.queryOrderSplitDataList(merchantId, stationId, startTime, endTime); + } + + /** + * 查询时间段内的订单分账记录 + */ + @Override + public List queryOrderSplitData(String merchantId, String stationId, String startTime, String endTime) { + List resultList = Lists.newArrayList(); + // 根据入参拉出时间段内所有订单的分账记录 + List orderSplitRecords = this.queryOrderSplitRecordList(merchantId, stationId, startTime, endTime); + if (CollectionUtils.isEmpty(orderSplitRecords)) { + return resultList; + } + // 根据merchantId查询汇付账户信息 + AdapayMemberAccount adapayMemberAccount = adapayMemberAccountService.selectByMerchantId(merchantId); + // 按天分组, 组装结果集 key 为 tradeDate, value 为该天的订单分账记录 + Map> dailyRecordMap = orderSplitRecords.stream().collect(Collectors.groupingBy(OrderSplitRecord::getTradeDate)); + // 按天分组 key 为 tradeDate, value 为该天的订单分账记录 + for (Map.Entry> entry : dailyRecordMap.entrySet()) { + String tradeDate = entry.getKey(); + List dailyRecordList = entry.getValue(); + // dailyRecordList中的订单号集合Set + Set orderCodeSet = dailyRecordList.stream().map(OrderSplitRecord::getOrderCode).collect(Collectors.toSet()); + // 按adapayMemberId 分组 key 为 adapayMemberId, value 为该adapayMemberId的订单分账记录 + Map> adapayMemberIdRecordMap = dailyRecordList.stream().collect(Collectors.groupingBy(OrderSplitRecord::getAdapayMemberId)); + OrderSplitDailySummaryData summaryData = new OrderSplitDailySummaryData(); + summaryData.setTradeDate(tradeDate); + summaryData.setMerchantId(merchantId); + summaryData.setOrderCount(orderCodeSet.size()); + BigDecimal totalSettleAmount = BigDecimal.ZERO; // 当天结算金额汇总 + BigDecimal totalMerchantSplitAmount = BigDecimal.ZERO; // 当天运营商分账金额汇总 + BigDecimal totalOtherSplitAmount = BigDecimal.ZERO; // 当天其他人分账金额汇总 + Map> otherSplitDetailMap = Maps.newHashMap(); // 当天其他人分账的记录 + for (Map.Entry> listEntry : adapayMemberIdRecordMap.entrySet()) { + List recordList = listEntry.getValue(); + for (OrderSplitRecord record : recordList) { + // 由于存在订单被多家分账, recordList里的订单号是存在重复的, 判断orderCode是否存在orderCodeSet中, 存在则累计totalSettleAmount, 并从orderCodeSet中删除 + if (orderCodeSet.contains(record.getOrderCode())) { + totalSettleAmount = totalSettleAmount.add(record.getSettleAmount()); + orderCodeSet.remove(record.getOrderCode()); + } + // 区分运营商自己分账的金额, 和他人的分账金额 + if (adapayMemberAccount != null && adapayMemberAccount.getAdapayMemberId().equals(record.getAdapayMemberId())) { + totalMerchantSplitAmount = totalMerchantSplitAmount.add(record.getElectricitySplitAmount()).add(record.getServiceSplitAmount()); + } else { + totalOtherSplitAmount = totalOtherSplitAmount.add(record.getElectricitySplitAmount()).add(record.getServiceSplitAmount()); + // 他人分账的记录保存到otherSplitDetailMap + if (otherSplitDetailMap.containsKey(record.getAdapayMemberId())) { + List otherSplitDetailList = otherSplitDetailMap.get(record.getAdapayMemberId()); + otherSplitDetailList.add(record); + } else { + List otherSplitDetailList = Lists.newArrayList(); + otherSplitDetailList.add(record); + otherSplitDetailMap.put(record.getAdapayMemberId(), otherSplitDetailList); + } + } + } + } + // 根据otherSplitDetailMap 组装otherSplitDetailList + List otherSplitDetailList = Lists.newArrayList(); + for (Map.Entry> e : otherSplitDetailMap.entrySet()) { + String adapayMemberId = e.getKey(); + List recordList = e.getValue(); + BigDecimal totalElecSplitAmount = BigDecimal.ZERO; // 该adapayMemberId的电度分账金额汇总 + BigDecimal totalServiceSplitAmount = BigDecimal.ZERO; // 该adapayMemberId的服务分账金额汇总 + for (OrderSplitRecord record : recordList) { + totalElecSplitAmount = totalElecSplitAmount.add(record.getElectricitySplitAmount()); + totalServiceSplitAmount = totalServiceSplitAmount.add(record.getServiceSplitAmount()); + } + OtherSplitDetail build = OtherSplitDetail.builder() + .adapayMemberId(adapayMemberId) + .totalSplitAmount(totalElecSplitAmount.add(totalServiceSplitAmount)) + .totalElecSplitAmount(totalElecSplitAmount) + .totalServiceSplitAmount(totalServiceSplitAmount) + .adapayMemberName("") + .build(); + otherSplitDetailList.add(build); + } + summaryData.setOtherSplitDetailList(otherSplitDetailList); + summaryData.setTotalSettleAmount(totalSettleAmount); + summaryData.setMerchantSplitAmount(totalMerchantSplitAmount); + summaryData.setOtherSplitAmount(totalOtherSplitAmount); + resultList.add(summaryData); + } + return resultList; + } + } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderSplitDailySummaryData.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderSplitDailySummaryData.java new file mode 100644 index 000000000..cb94e1976 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderSplitDailySummaryData.java @@ -0,0 +1,54 @@ +package com.jsowell.pile.vo.web; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 订单分账每日汇总数据 + */ +@Data +public class OrderSplitDailySummaryData { + /** + * 交易日期 + */ + private String tradeDate; + + /** + * 运营商id + */ + private String merchantId; + + /** + * 订单数量 + */ + private Integer orderCount; + + /** + * 订单总消费金额 + */ + private BigDecimal totalOrderAmount; + + /** + * 订单总结算金额 + * 除去不需要分账的金额, 剩下的是结算金额 + */ + private BigDecimal totalSettleAmount; + + /** + * 本运营商分账金额 + */ + private BigDecimal merchantSplitAmount; + + /** + * 他人分账金额 + */ + private BigDecimal otherSplitAmount; + + /** + * 他人分账明细 + */ + private List otherSplitDetailList; + +} diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/OrderSplitRecordVO.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderSplitRecordVO.java similarity index 97% rename from jsowell-pile/src/main/java/com/jsowell/pile/vo/OrderSplitRecordVO.java rename to jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderSplitRecordVO.java index 12b1760f8..4a9e15930 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/vo/OrderSplitRecordVO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderSplitRecordVO.java @@ -1,4 +1,4 @@ -package com.jsowell.pile.vo; +package com.jsowell.pile.vo.web; import lombok.Data; diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OtherSplitDetail.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OtherSplitDetail.java new file mode 100644 index 000000000..246434048 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OtherSplitDetail.java @@ -0,0 +1,42 @@ +package com.jsowell.pile.vo.web; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * 他人分账详情 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class OtherSplitDetail { + /** + * adapay会员id + */ + private String adapayMemberId; + + /** + * adapay会员名称 + */ + private String adapayMemberName; + + /** + * 总电费分账金额 + */ + private BigDecimal totalElecSplitAmount; + + /** + * 总服务费分账金额 + */ + private BigDecimal totalServiceSplitAmount; + + /** + * 总分账金额 + */ + private BigDecimal totalSplitAmount; +} diff --git a/jsowell-pile/src/main/resources/mapper/pile/OrderSplitRecordMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/OrderSplitRecordMapper.xml index ff1975809..27c58f360 100644 --- a/jsowell-pile/src/main/resources/mapper/pile/OrderSplitRecordMapper.xml +++ b/jsowell-pile/src/main/resources/mapper/pile/OrderSplitRecordMapper.xml @@ -729,4 +729,16 @@ where del_flag = '0' and order_code = #{orderCode,jdbcType=VARCHAR} + + \ No newline at end of file