查询时间段内的订单分账记录

This commit is contained in:
Guoqs
2025-01-17 15:13:53 +08:00
parent 363a5b62cc
commit 2785d91b4f
8 changed files with 273 additions and 5 deletions

View File

@@ -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<OrderSplitRecord> selectByOrderCode(String orderCode);
List<OrderSplitRecord> queryOrderSplitDataList(@Param("merchantId") String merchantId,
@Param("stationId") String stationId,
@Param("startTime") String startTime,
@Param("endTime") String endTime);
}

View File

@@ -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<OrderSplitRecord> list);
/**
* 批量保存订单分账记录
* @param list
* @return
*/
int batchInsert(List<OrderSplitRecord> list);
/**
@@ -32,5 +38,20 @@ public interface OrderSplitRecordService {
void saveOrderSplitRecord(PaymentConfirmParam param, String id, List<SplitData> stationSplitConfigList, OrderInfoDetailVO orderInfoDetailVO);
List<OrderSplitRecordVO> selectByOrderCode(String orderCode);
/**
* 根据入参拉出时间段内所有订单的分账记录
* @param merchantId 运营商id
* @param stationId 站点id
* @param startTime 开始时间
* @param endTime 结束时间
* @return
*/
List<OrderSplitRecord> queryOrderSplitRecordList(String merchantId, String stationId, String startTime, String endTime);
/**
* 查询时间段内的订单分账记录
*/
List<OrderSplitDailySummaryData> queryOrderSplitData(String merchantId, String stationId, String startTime, String endTime);
}

View File

@@ -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<OrderSplitRecord> 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<OrderSplitDailySummaryData> queryOrderSplitData(String merchantId, String stationId, String startTime, String endTime) {
List<OrderSplitDailySummaryData> resultList = Lists.newArrayList();
// 根据入参拉出时间段内所有订单的分账记录
List<OrderSplitRecord> orderSplitRecords = this.queryOrderSplitRecordList(merchantId, stationId, startTime, endTime);
if (CollectionUtils.isEmpty(orderSplitRecords)) {
return resultList;
}
// 根据merchantId查询汇付账户信息
AdapayMemberAccount adapayMemberAccount = adapayMemberAccountService.selectByMerchantId(merchantId);
// 按天分组, 组装结果集 key 为 tradeDate, value 为该天的订单分账记录
Map<String, List<OrderSplitRecord>> dailyRecordMap = orderSplitRecords.stream().collect(Collectors.groupingBy(OrderSplitRecord::getTradeDate));
// 按天分组 key 为 tradeDate, value 为该天的订单分账记录
for (Map.Entry<String, List<OrderSplitRecord>> entry : dailyRecordMap.entrySet()) {
String tradeDate = entry.getKey();
List<OrderSplitRecord> dailyRecordList = entry.getValue();
// dailyRecordList中的订单号集合Set
Set<String> orderCodeSet = dailyRecordList.stream().map(OrderSplitRecord::getOrderCode).collect(Collectors.toSet());
// 按adapayMemberId 分组 key 为 adapayMemberId, value 为该adapayMemberId的订单分账记录
Map<String, List<OrderSplitRecord>> 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<String, List<OrderSplitRecord>> otherSplitDetailMap = Maps.newHashMap(); // 当天其他人分账的记录
for (Map.Entry<String, List<OrderSplitRecord>> listEntry : adapayMemberIdRecordMap.entrySet()) {
List<OrderSplitRecord> 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<OrderSplitRecord> otherSplitDetailList = otherSplitDetailMap.get(record.getAdapayMemberId());
otherSplitDetailList.add(record);
} else {
List<OrderSplitRecord> otherSplitDetailList = Lists.newArrayList();
otherSplitDetailList.add(record);
otherSplitDetailMap.put(record.getAdapayMemberId(), otherSplitDetailList);
}
}
}
}
// 根据otherSplitDetailMap 组装otherSplitDetailList
List<OtherSplitDetail> otherSplitDetailList = Lists.newArrayList();
for (Map.Entry<String, List<OrderSplitRecord>> e : otherSplitDetailMap.entrySet()) {
String adapayMemberId = e.getKey();
List<OrderSplitRecord> 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;
}
}

View File

@@ -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<OtherSplitDetail> otherSplitDetailList;
}

View File

@@ -1,4 +1,4 @@
package com.jsowell.pile.vo;
package com.jsowell.pile.vo.web;
import lombok.Data;

View File

@@ -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;
}

View File

@@ -729,4 +729,16 @@
where del_flag = '0'
and order_code = #{orderCode,jdbcType=VARCHAR}
</select>
<select id="queryOrderSplitDataList" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from order_split_record
where del_flag = '0'
and merchant_id = #{merchantId,jdbcType=VARCHAR}
<if test="stationId != null and stationId != ''">
and station_id = #{stationId,jdbcType=VARCHAR}
</if>
and trade_date between #{startTime,jdbcType=VARCHAR} and #{endTime,jdbcType=VARCHAR}
</select>
</mapper>