Commit 853b658e authored by zuoyh's avatar zuoyh

Merge remote-tracking branch 'origin/order_received_statistics' into order_received_statistics

parents 4097aee6 009eff2f
package com.github.wxiaoqi.security.common.util;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collector;
/**
* @author libin
* @version 1.0
* @description
* @data 2019/11/20 19:59
*/
public class CollectorsUtil {
static final Set<Collector.Characteristics> CH_NOID = Collections.emptySet();
private CollectorsUtil() {
}
@SuppressWarnings("unchecked")
private static <I, R> Function<I, R> castingIdentity() {
return i -> (R) i;
}
/**
* Simple implementation class for {@code Collector}.
*
* @param <T>
* the type of elements to be collected
* @param <R>
* the type of the result
*/
static class CollectorImpl<T, A, R> implements Collector<T, A, R> {
private final Supplier<A> supplier;
private final BiConsumer<A, T> accumulator;
private final BinaryOperator<A> combiner;
private final Function<A, R> finisher;
private final Set<Characteristics> characteristics;
CollectorImpl(Supplier<A> supplier, BiConsumer<A, T> accumulator, BinaryOperator<A> combiner,
Function<A, R> finisher, Set<Characteristics> characteristics) {
this.supplier = supplier;
this.accumulator = accumulator;
this.combiner = combiner;
this.finisher = finisher;
this.characteristics = characteristics;
}
CollectorImpl(Supplier<A> supplier, BiConsumer<A, T> accumulator, BinaryOperator<A> combiner,
Set<Characteristics> characteristics) {
this(supplier, accumulator, combiner, castingIdentity(), characteristics);
}
@Override
public BiConsumer<A, T> accumulator() {
return accumulator;
}
@Override
public Supplier<A> supplier() {
return supplier;
}
@Override
public BinaryOperator<A> combiner() {
return combiner;
}
@Override
public Function<A, R> finisher() {
return finisher;
}
@Override
public Set<Characteristics> characteristics() {
return characteristics;
}
}
public static <T> Collector<T, ?, BigDecimal> summingBigDecimal(ToBigDecimalFunction<? super T> mapper) {
return new CollectorImpl<>(() -> new BigDecimal[1], (a, t) -> {
if (a[0] == null) {
a[0] = BigDecimal.ZERO;
}
a[0] = a[0].add(mapper.applyAsBigDecimal(t));
}, (a, b) -> {
a[0] = a[0].add(b[0]);
return a;
}, a -> a[0], CH_NOID);
}
}
package com.github.wxiaoqi.security.common.util;
import java.math.BigDecimal;
@FunctionalInterface
public interface ToBigDecimalFunction<T> {
BigDecimal applyAsBigDecimal(T value);
}
......@@ -23,7 +23,9 @@ public enum StatisticsStatusEnum {
public static final int ORDER_RENT_VEHICLE_TYPE=1;
public static final int ORDER_TOUR_TYPE=2;
public static final String UN_PAY_STATE="0";
public static final int NO_PAY_WAY=99;
public static final int NO_PAY_WAY=0;
public static final int NO_ORDER_ORIGN=99;
public static final int NO_ORDER_STATE=99;
public static final Integer DEFAULT_SQL_SIZE=1000;
public static List<String> orderStates;
......@@ -35,8 +37,8 @@ public enum StatisticsStatusEnum {
orderStates = Lists.newArrayList("0","1");
// 1 app 2 小程序 3 其他
orderOrigins = Lists.newArrayList("1","2","3");
// 1 微信 2 支付宝
orderPayWays = Lists.newArrayList("1","2");
// 1 微信 2 支付宝 0不需要支付(使用了优惠券之类的)或未支付
orderPayWays = Lists.newArrayList("1","2","0");
}
public static List<String> statisticsSateGroupWithCompanys(List<Integer> companyIdList){
......@@ -57,7 +59,7 @@ public enum StatisticsStatusEnum {
for (String orderPayWay : orderPayWays) {
for (String orderState : orderStates) {
//订单来源-支付方式-订单状态
orderStatisticsStateGroups.add(String.format("%s-%s-%s",orderOrigin,orderState==UN_PAY_STATE?String.valueOf(NO_PAY_WAY):orderPayWay,orderState));
orderStatisticsStateGroups.add(String.format("%s-%s-%s",orderOrigin,orderPayWay,orderState));
}
}
}
......@@ -69,6 +71,10 @@ public enum StatisticsStatusEnum {
return stateGroupList;
}
public static Integer getCompnayId(String stateGroup){
return Integer.valueOf(stateGroup.split("-")[0]);
}
public static<T extends OrderReceivedStatisticsBase> T wrapStatisticsObject(Date date,String stateGroup,T targetObj){
DateTime yesterday = DateTime.of(date);
String year = String.valueOf(yesterday.getField(DateField.YEAR));
......
package com.xxfc.platform.order.entity;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import javax.persistence.*;
import cn.hutool.core.clone.CloneSupport;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Table;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 会员订单统计
......@@ -22,6 +21,7 @@ import lombok.Data;
public class OrderMemberReceivedStatistics extends OrderReceivedStatisticsBase implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 普通会员订单总额
*/
......
package com.xxfc.platform.order.entity;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import javax.persistence.*;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Table;
import java.io.Serializable;
/**
* 全部订单统计
......
......@@ -3,10 +3,7 @@ package com.xxfc.platform.order.entity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Transient;
import javax.persistence.*;
import java.math.BigDecimal;
import java.util.Date;
......@@ -22,7 +19,7 @@ public class OrderReceivedStatisticsBase {
*
*/
@Id
@GeneratedValue(generator = "JDBC")
@GeneratedValue(strategy = GenerationType.IDENTITY,generator = "JDBC")
@ApiModelProperty("")
protected Long id;
......
......@@ -6,7 +6,6 @@ import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Table;
import java.io.Serializable;
import java.math.BigDecimal;
/**
......
package com.xxfc.platform.order.entity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Date;
/**
......@@ -22,6 +19,4 @@ public class OrderTourReceivedStatistics extends OrderReceivedStatisticsBase imp
private static final long serialVersionUID = 1L;
}
......@@ -20,22 +20,22 @@ import java.util.Date;
@AllArgsConstructor
@NoArgsConstructor
public class OrderDTO {
private Integer id;
private Integer type;
private Integer status;
private BigDecimal orderAmount;
private BigDecimal realAmount;
private Integer orderOrigin;
private Integer payWay;
private Integer companyId;
private String stateGroup;
private Integer hasPay;
protected Integer id;
protected Integer type;
protected Integer status;
protected BigDecimal orderAmount;
protected BigDecimal realAmount;
protected Integer orderOrigin;
protected Integer payWay;
protected Integer companyId;
protected String stateGroup;
protected Integer hasPay;
/**
* 会员相关
*/
private Integer memberLevel;
protected Integer memberLevel;
private LevelEnum levelEnum;
protected LevelEnum levelEnum;
public LevelEnum getLevelEnum(){
......
package com.xxfc.platform.order.pojo.order;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
/**
* @author libin
* @version 1.0
* @description
* @data 2019/11/20 19:11
*/
@Data
@Builder(toBuilder = true)
@AllArgsConstructor
@NoArgsConstructor
public class CompanyAmountBo {
private Integer companyId;
private BigDecimal amount;
}
......@@ -2,21 +2,26 @@ package com.xxfc.platform.order.biz;
import cn.hutool.core.util.ObjectUtil;
import com.github.wxiaoqi.security.common.biz.BaseBiz;
import com.github.wxiaoqi.security.common.util.CollectorsUtil;
import com.xxfc.platform.order.contant.enumerate.StatisticsStatusEnum;
import com.xxfc.platform.order.entity.OrderReceivedStatisticsBase;
import com.xxfc.platform.order.entity.OrderRentVehicleReceivedStatistics;
import com.xxfc.platform.order.mapper.OrderRentVehicleReceivedStatisticsMapper;
import com.xxfc.platform.order.pojo.account.OrderAccountBo;
import com.xxfc.platform.order.pojo.account.OrderAccountDetail;
import com.xxfc.platform.order.pojo.dto.OrderDTO;
import com.xxfc.platform.order.pojo.dto.OrderReceivedStatisticsFindDTO;
import com.xxfc.platform.order.pojo.order.CompanyAmountBo;
import com.xxfc.platform.vehicle.feign.VehicleFeign;
import lombok.RequiredArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.*;
import java.util.function.BinaryOperator;
import java.util.stream.Collectors;
/**
......@@ -55,12 +60,17 @@ public class OrderRentVehicleReceivedStatisticsBiz extends BaseBiz<OrderRentVehi
public void orderRentVehicleReceivedStatistics(Date startDate, Date endDate) {
List<OrderRentVehicleReceivedStatistics> orderRentVehicleReceivedStatisticsList = new ArrayList<>();
List<String> stisticsActiveState = new ArrayList<>();
//公司的收入与支出 ---》无状态
List<CompanyAmountBo> companyAmoutList = new ArrayList<>();
//根据租车订单类型 时间查询
List<OrderDTO> orderDTOS = baseOrderBiz.selectOrdersByTypeAndTime(Arrays.asList(StatisticsStatusEnum.ORDER_RENT_VEHICLE_TYPE), startDate, endDate);
//数据处理 状态组合 按支付状态分组 而后按组合状态
Map<Boolean, Map<String, List<OrderDTO>>> stateGroupMap = orderDTOS.stream().peek(x -> {
x.setStateGroup(String.format("%d-%d-%d-%d", x.getCompanyId(), x.getOrderOrigin(), x.getPayWay() == null ? StatisticsStatusEnum.NO_PAY_WAY : x.getPayWay(),x.getHasPay()));
x.setStateGroup(String.format("%d-%d-%d-%d", x.getCompanyId(),
x.getOrderOrigin(),
x.getPayWay() == null ? StatisticsStatusEnum.NO_PAY_WAY:x.getPayWay()
,x.getHasPay()));
stisticsActiveState.add(x.getStateGroup());
})
.collect(Collectors.partitioningBy(x -> Objects.nonNull(x.getPayWay()), Collectors.groupingBy(OrderDTO::getStateGroup, Collectors.toList())));
......@@ -69,11 +79,12 @@ public class OrderRentVehicleReceivedStatisticsBiz extends BaseBiz<OrderRentVehi
List<OrderAccountBo> orderAccountBoList = orderAccountBiz.selectByTypeAndDate(StatisticsStatusEnum.ORDER_RENT_VEHICLE_TYPE,startDate, endDate);
//账目数据处理 状态组合
Map<String, List<OrderAccountBo>> ordersMap = orderAccountBoList.stream().peek(x -> {
x.setStateGroup(String.format("%d-%d-%d-%d", x.getCompanyId(), x.getOrderOrigin(), x.getPayWay() == null ? StatisticsStatusEnum.NO_PAY_WAY : x.getPayWay(),x.getHasPay()));
x.setStateGroup(String.format("%d-%d-%d-%d", x.getCompanyId(),
x.getOrderOrigin(),
x.getPayWay() == null ? StatisticsStatusEnum.NO_PAY_WAY:x.getPayWay(),
x.getHasPay()));
}).collect(Collectors.groupingBy(OrderAccountBo::getStateGroup, Collectors.toList()));
BigDecimal globalTotalAmount = BigDecimal.ZERO;
//已经支付单
Set<Map.Entry<String, List<OrderAccountBo>>> ordersSet = ordersMap.entrySet();
for (Map.Entry<String, List<OrderAccountBo>> orderEntry : ordersSet) {
......@@ -91,15 +102,27 @@ public class OrderRentVehicleReceivedStatisticsBiz extends BaseBiz<OrderRentVehi
refundAmount.add(accountDetailEntity.getOrderAmount()).add(accountDetailEntity.getDepositAmount());
}
}
boolean flag = stateGroupMap == null ? false : stateGroupMap.get(Boolean.TRUE) == null ? false : stateGroupMap.get(Boolean.TRUE).get(orderKey)==null?false:true;
if (flag){
if (stisticsActiveState.contains(orderKey)){
OrderRentVehicleReceivedStatistics orderRentVehicleReceivedStatistics = StatisticsStatusEnum.wrapStatisticsObject(startDate, orderKey, new OrderRentVehicleReceivedStatistics());
orderRentVehicleReceivedStatistics.setTotalAmount(totalAmount.subtract(refundAmount));
orderRentVehicleReceivedStatistics.setTotalQuantity(stateGroupMap.get(Boolean.TRUE).get(orderKey).size());
orderRentVehicleReceivedStatisticsList.add(orderRentVehicleReceivedStatistics);
}else {
Integer compnayId = StatisticsStatusEnum.getCompnayId(orderKey);
CompanyAmountBo companyAmountBo = CompanyAmountBo.builder().companyId(compnayId).amount(totalAmount.subtract(refundAmount)).build();
companyAmoutList.add(companyAmountBo);
}
globalTotalAmount.add(totalAmount.subtract(refundAmount));
}
Map<Integer, BigDecimal> companyAmountMap = companyAmoutList.stream().collect(Collectors.groupingBy(CompanyAmountBo::getCompanyId,
CollectorsUtil.summingBigDecimal(CompanyAmountBo::getAmount)));
Set<Map.Entry<Integer, BigDecimal>> companyAmountSet = companyAmountMap.entrySet();
for (Map.Entry<Integer, BigDecimal> companyAmountEntry : companyAmountSet) {
String stateGrp = String.format("%d-%d-%d-%d",companyAmountEntry.getKey(),StatisticsStatusEnum.NO_ORDER_ORIGN,StatisticsStatusEnum.NO_PAY_WAY,StatisticsStatusEnum.NO_ORDER_STATE);
OrderRentVehicleReceivedStatistics orderRentVehicleReceivedStatistics = StatisticsStatusEnum.wrapStatisticsObject(startDate, stateGrp, new OrderRentVehicleReceivedStatistics());
orderRentVehicleReceivedStatistics.setTotalQuantity(0);
orderRentVehicleReceivedStatistics.setTotalAmount(companyAmountEntry.getValue());
orderRentVehicleReceivedStatisticsList.add(orderRentVehicleReceivedStatistics);
}
//未支付单
......@@ -109,7 +132,7 @@ public class OrderRentVehicleReceivedStatisticsBiz extends BaseBiz<OrderRentVehi
//查询分公司ids
List<Integer> companyIds = vehicleFeign.findCompanyIdsByAreaId(null);
//创建剩余状态组合的租车统计对象
List<OrderRentVehicleReceivedStatistics> otherStatisticsStateGroupList = createOtherStatisticsStateGroupList(startDate,globalTotalAmount,stisticsActiveState, companyIds);
List<OrderRentVehicleReceivedStatistics> otherStatisticsStateGroupList = createOtherStatisticsStateGroupList(startDate,stisticsActiveState, companyIds);
orderRentVehicleReceivedStatisticsList.addAll(otherStatisticsStateGroupList);
//保存
insertMemberReceivedStatisticsBatch(orderRentVehicleReceivedStatisticsList);
......@@ -143,13 +166,11 @@ public class OrderRentVehicleReceivedStatisticsBiz extends BaseBiz<OrderRentVehi
* 创建剩余状态数据
*
* @param startDate 时间
* @param totalAmount 订单状态
* @param statisticsStateGroups 状态组合 集合
* @param companyIds 公司ids
* @return
*/
private List<OrderRentVehicleReceivedStatistics> createOtherStatisticsStateGroupList(Date startDate,
BigDecimal totalAmount,
List<String> statisticsStateGroups,
List<Integer> companyIds) {
......@@ -159,13 +180,14 @@ public class OrderRentVehicleReceivedStatisticsBiz extends BaseBiz<OrderRentVehi
//创建租车统计克隆对象
OrderRentVehicleReceivedStatistics orderRentVehicleReceivedStatistics = new OrderRentVehicleReceivedStatistics();
//统计对象的生成
otherStatisticsStateGroup.parallelStream().map(stateGroup -> {
otherStatisticsStateGroup.stream().map(stateGroup -> {
OrderRentVehicleReceivedStatistics orderRentVehicleReceivedStatisticsClone = StatisticsStatusEnum.wrapStatisticsObject(startDate, stateGroup, ObjectUtil.cloneByStream(orderRentVehicleReceivedStatistics));
orderRentVehicleReceivedStatisticsClone.setTotalAmount(totalAmount);
orderRentVehicleReceivedStatisticsClone.setTotalAmount(BigDecimal.ZERO);
orderRentVehicleReceivedStatisticsClone.setTotalQuantity(0);
orderRentVehicleReceivedStatisticsList.add(orderRentVehicleReceivedStatisticsClone);
return orderRentVehicleReceivedStatisticsClone;
}).count();
return orderRentVehicleReceivedStatisticsList;
}
......@@ -175,7 +197,7 @@ public class OrderRentVehicleReceivedStatisticsBiz extends BaseBiz<OrderRentVehi
* @param orderRentVehicleReceivedStatistics
*/
public void insertMemberReceivedStatisticsBatch(List<OrderRentVehicleReceivedStatistics> orderRentVehicleReceivedStatistics) {
orderRentVehicleReceivedStatistics.sort(Comparator.comparing(OrderRentVehicleReceivedStatistics::getCompanyId));
int orderSize = orderRentVehicleReceivedStatistics.size();
int sqlAdq = orderSize / StatisticsStatusEnum.DEFAULT_SQL_SIZE;
int sqlMod = orderSize % StatisticsStatusEnum.DEFAULT_SQL_SIZE;
......
......@@ -2,8 +2,9 @@ package com.xxfc.platform.order.mapper;
import com.xxfc.platform.order.entity.OrderMemberReceivedStatistics;
import com.xxfc.platform.order.pojo.dto.OrderReceivedStatisticsFindDTO;
import org.apache.ibatis.annotations.Param;
import tk.mybatis.mapper.additional.insert.InsertListMapper;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.special.InsertListMapper;
import java.util.List;
......@@ -17,4 +18,6 @@ import java.util.List;
public interface OrderMemberReceivedStatisticsMapper extends Mapper<OrderMemberReceivedStatistics>, InsertListMapper<OrderMemberReceivedStatistics> {
List<OrderMemberReceivedStatistics> selectOrderMemberReceivedStatistics(OrderReceivedStatisticsFindDTO orderReceivedStatisticsFindDTO);
void inserMemberReceivedtList(@Param("orderMembers") List<OrderMemberReceivedStatistics> orderMemberReceivedStatistics);
}
......@@ -2,8 +2,8 @@ package com.xxfc.platform.order.mapper;
import com.xxfc.platform.order.entity.OrderRentVehicleReceivedStatistics;
import com.xxfc.platform.order.pojo.dto.OrderReceivedStatisticsFindDTO;
import tk.mybatis.mapper.additional.insert.InsertListMapper;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.special.InsertListMapper;
import java.util.List;
......
......@@ -62,11 +62,13 @@
bo.order_origin,
bo.pay_way,
bo.has_pay,
brvd.start_company_id AS `companyId`
brvd.start_company_id AS `companyId`,
omd.member_level AS `memberLevel`
FROM
`order_account` AS `oa`
INNER JOIN `base_order` AS `bo` ON bo.id = oa.order_id
INNER JOIN `order_rent_vehicle_detail` AS `brvd` ON brvd.order_id=oa.order_id
LEFT JOIN `order_rent_vehicle_detail` AS `brvd` ON brvd.order_id=oa.order_id
LEFT JOIN `order_member_detail` AS `omd` ON omd.order_id=oa.order_id
WHERE bo.type=#{orderType} AND oa.`crt_time` BETWEEN #{startTime} AND #{endTime}
</select>
</mapper>
\ No newline at end of file
......@@ -17,8 +17,8 @@
<result property="totalGoldQuantity" column="total_gold_quantity"/>
<result property="totalDiamondAmmount" column="total_diamond_ammount"/>
<result property="totalDiamondQuantity" column="total_diamond_quantity"/>
<result property="isFinish" column="is_finish"/>
<result property="orderOrigin" column="order_origin"/>
<result property="hasPay" column="has_pay"/>
<result property="payWay" column="pay_way"/>
<result property="companyId" column="company_id"/>
<result property="crtTime" column="crt_time"/>
......@@ -50,4 +50,7 @@
</if>
</select>
<delete id="inserMemberReceivedtList">
</delete>
</mapper>
\ No newline at end of file
......@@ -12,8 +12,7 @@
<result property="weekOfYear" column="week_of_year"/>
<result property="totalAmount" column="total_amount"/>
<result property="totalQuantity" column="total_quantity"/>
<result property="realAmount" column="real_amount"/>
<result property="isFinish" column="is_finish"/>
<result property="hasPay" column="has_pay"/>
<result property="orderOrigin" column="order_origin"/>
<result property="payWay" column="pay_way"/>
<result property="companyId" column="company_id"/>
......
......@@ -12,7 +12,7 @@
<result property="weekOfYear" column="week_of_year"/>
<result property="totalAmount" column="total_amount"/>
<result property="totalQuantity" column="total_quantity"/>
<result property="isFinish" column="is_finish"/>
<result property="hasPay" column="has_pay"/>
<result property="orderOrigin" column="order_origin"/>
<result property="payWay" column="pay_way"/>
<result property="companyId" column="company_id"/>
......
......@@ -46,8 +46,10 @@ public class ServiceTest {
@Test
public void testMemberStatisticsInsert(){
Date date = cn.hutool.core.date.DateTime.of("2019-11-16", "yyyy-MM-dd").toJdkDate();
//orderMemberReceivedStatisticsBiz.orderMemberReceivedStatistics(date);
Date date = cn.hutool.core.date.DateTime.of("2019-11-15", "yyyy-MM-dd").toJdkDate();
Date startDate = DateUtil.beginOfDay(date).toJdkDate();
Date endDate = DateUtil.endOfDay(date).toJdkDate();
orderMemberReceivedStatisticsBiz.orderMemberReceivedStatistics(startDate,endDate);
}
@Test
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment