Commit 2505f6dd authored by libin's avatar libin

Merge branch 'order_received_statistics'

# Conflicts:
#	xx-order/xx-order-server/src/main/java/com/xxfc/platform/order/biz/BaseOrderBiz.java
#	xx-order/xx-order-server/src/main/java/com/xxfc/platform/order/biz/OrderViolationBiz.java
#	xx-order/xx-order-server/src/main/java/com/xxfc/platform/order/mapper/OrderAccountMapper.java
parents 075c08ec 9d57dcd7
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;
/**
* @author libin
* @version 1.0
* @description
* @data 2019/11/20 20:25
*/
@FunctionalInterface
public interface ToBigDecimalFunction<T> {
BigDecimal applyAsBigDecimal(T value);
}
...@@ -10,7 +10,7 @@ spring: ...@@ -10,7 +10,7 @@ spring:
datasource: datasource:
type: com.alibaba.druid.pool.DruidDataSource type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://10.5.52.4:3307/xxfc_uccn?useUnicode=true&characterEncoding=UTF-8 url: jdbc:mysql://10.5.52.3:3306/xxfc_order?useUnicode=true&characterEncoding=UTF-8
username: root username: root
password: sslcloud123*() password: sslcloud123*()
jackson: jackson:
......
#\u4EE3\u7801\u751F\u6210\u5668\uFF0C\u914D\u7F6E\u4FE1\u606F #\u4EE3\u7801\u751F\u6210\u5668\uFF0C\u914D\u7F6E\u4FE1\u606F
#\u5305\u540D #\u5305\u540D
package=com.xxfc.platform.uccn package=com.xxfc.platform.order
#\u4F5C\u8005 #\u4F5C\u8005
author=libin author=libin
#Email #Email
......
package com.xxfc.platform.order.Utils; package com.xxfc.platform.order.Utils;
import org.joda.time.DateTime;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
...@@ -108,4 +112,51 @@ public class OrderDateUtils { ...@@ -108,4 +112,51 @@ public class OrderDateUtils {
cal.setTimeInMillis(System.currentTimeMillis()); cal.setTimeInMillis(System.currentTimeMillis());
return cal.get(Calendar.YEAR); return cal.get(Calendar.YEAR);
} }
public static LocalDate dateToLocalDate(Date date) {
return LocalDate.from(date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate());
}
public static Date localDateToDate(LocalDate localDate) {
return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
}
/**
* 获取当天的开始时间
* @return
*/
public static long getStartOfDay() {
return getStartOfDay(new Date());
}
/**
* 获取某天的开始时间
* @param date
* @return
*/
public static long getStartOfDay(Date date) {
DateTime dateTime = new DateTime(date);
DateTime startOfDay = dateTime.withTimeAtStartOfDay();
return startOfDay.getMillis();
}
/**
* 获取当天的结束时间
* @return
*/
public static long getEndOfDay() {
return getEndOfDay(new Date());
}
/**
* 获取某天的结束时间
* @param date
* @return
*/
public static long getEndOfDay(Date date) {
DateTime dateTime = new DateTime(date);
DateTime endOfDay = dateTime.millisOfDay().withMaximumValue();
return endOfDay.getMillis();
}
} }
package com.xxfc.platform.order.bo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.util.Date;
/**
* @author libin
* @version 1.0
* @description
* @data 2019/11/23 14:39
*/
@Data
@Builder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
public class CompanyPerformanceBo {
private Date date;
private Integer year;
private String month;
private String weekOfYear;
private Integer companyId;
private String companyName;
private BigDecimal memberAmount;
private BigDecimal rentVehilceAmount;
private BigDecimal travelAmount;
private BigDecimal noDeductibleAmount;
private BigDecimal depositAmount;
private Integer rentDays;
private BigDecimal extralAmount;
private Integer departureNum;
private Integer arrivalNum;
private String startDate;
private String endDate;
private String dateStr;
public BigDecimal getMemberAmount() {
return memberAmount==null?BigDecimal.ZERO:memberAmount;
}
public BigDecimal getRentVehilceAmount() {
return rentVehilceAmount==null?BigDecimal.ZERO:rentVehilceAmount;
}
public BigDecimal getTravelAmount() {
return travelAmount==null?BigDecimal.ZERO:travelAmount;
}
public BigDecimal getNoDeductibleAmount() {
return noDeductibleAmount==null?BigDecimal.ZERO:noDeductibleAmount;
}
public BigDecimal getDepositAmount() {
return depositAmount==null?BigDecimal.ZERO:depositAmount;
}
public Integer getRentDays() {
return rentDays==null?0:rentDays;
}
public BigDecimal getExtralAmount() {
return extralAmount==null?BigDecimal.ZERO:extralAmount;
}
public Integer getDepartureNum() {
return departureNum==null?0:departureNum;
}
public Integer getArrivalNum() {
return arrivalNum==null?0:arrivalNum;
}
}
package com.xxfc.platform.order.bo;
import cn.hutool.json.JSONObject;
import com.xxfc.platform.order.contant.enumerate.AccountTypeEnum;
import com.xxfc.platform.order.contant.enumerate.DeductionTypeEnum;
import com.xxfc.platform.order.contant.enumerate.StatisticsStatusEnum;
import com.xxfc.platform.order.pojo.account.OrderAccountBo;
import com.xxfc.platform.order.pojo.account.OrderAccountDeduction;
import com.xxfc.platform.order.pojo.account.OrderAccountDetail;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
import java.util.Objects;
/**
* @author libin
* @version 1.0
* @description
* @data 2019/11/27 16:10
*/
@Data
@Builder(toBuilder = true)
@AllArgsConstructor
@NoArgsConstructor
public class FeeTypeBo implements Serializable {
private static final long serialVersionUID = 1L;
private BigDecimal noDeductibleRefundAmount = BigDecimal.ZERO;
private BigDecimal noDeductibleAmount = BigDecimal.ZERO;
private BigDecimal totalAmount = BigDecimal.ZERO;
private BigDecimal orderRefundAmount = BigDecimal.ZERO;
private BigDecimal depositAmount = BigDecimal.ZERO;
private BigDecimal depositRefundAmount = BigDecimal.ZERO;
private BigDecimal lateFeeAmount = BigDecimal.ZERO;
private BigDecimal breakRulesRegulationAmount = BigDecimal.ZERO;
private BigDecimal lossSpecifiedAmount = BigDecimal.ZERO;
private BigDecimal extraAmount = BigDecimal.ZERO;
}
package com.xxfc.platform.order.contant.enumerate;
import com.xxfc.platform.order.entity.OrderMemberReceivedStatistics;
import com.xxfc.platform.order.entity.OrderReceivedStatisticsBase;
import com.xxfc.platform.order.pojo.vo.OrderReceivedStatisticsVo;
import java.math.BigDecimal;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @author libin
* @version 1.0
* @description
* @data 2019/11/11 10:36
*/
public enum OrderMemberReceivedStatisticsSignEnum{
MEMBER_TOTAL_AMOUNT("da_mta","会员订单总额"){
@Override
Map<String, List<OrderReceivedStatisticsVo>> wrapToMap(Map<Object,List<OrderReceivedStatisticsBase>> orderMap) {
Map<String, List<OrderReceivedStatisticsVo>> resultMap = new HashMap<>();
List<OrderReceivedStatisticsVo> orderReceivedStatisticsVos = new ArrayList<>();
orderMap.forEach((K,V)->{
List<OrderMemberReceivedStatistics> orderMemberReceivedStatisticsList = ReceivedStatisticsEnum.convertToTargetBean(V);
BigDecimal totalAmount = orderMemberReceivedStatisticsList.stream().map(x -> x.getTotalAmount()).reduce(BigDecimal.ZERO, (x, y) -> x.add(y));
OrderMemberReceivedStatistics orderMemberReceivedStatistics = orderMemberReceivedStatisticsList.get(0);
OrderReceivedStatisticsVo receivedStatisticsVo = ReceivedStatisticsEnum.createOrderReceivedStatistics(orderMemberReceivedStatistics,totalAmount,null);
orderReceivedStatisticsVos.add(receivedStatisticsVo);
});
resultMap.put(getSign(),orderReceivedStatisticsVos);
return resultMap;
}
},
COMMON__MEMBER_TOTAL_AMOUNT("db_cmta","普通会员订单总额"){
@Override
Map<String, List<OrderReceivedStatisticsVo>> wrapToMap(Map<Object, List<OrderReceivedStatisticsBase>> orderMap) {
Map<String, List<OrderReceivedStatisticsVo>> resultMap = new HashMap<>();
List<OrderReceivedStatisticsVo> orderReceivedStatisticsVos = new ArrayList<>();
orderMap.forEach((K,V)->{
List<OrderMemberReceivedStatistics> orderMemberReceivedStatisticsList = ReceivedStatisticsEnum.convertToTargetBean(V);
BigDecimal totalAmount = orderMemberReceivedStatisticsList.stream().map(x -> x.getToalCommonAmmount()).reduce(BigDecimal.ZERO, (x, y) -> x.add(y));
OrderMemberReceivedStatistics orderMemberReceivedStatistics = orderMemberReceivedStatisticsList.get(0);
OrderReceivedStatisticsVo receivedStatisticsVo = ReceivedStatisticsEnum.createOrderReceivedStatistics(orderMemberReceivedStatistics,totalAmount,null);
orderReceivedStatisticsVos.add(receivedStatisticsVo);
});
resultMap.put(getSign(),orderReceivedStatisticsVos);
return resultMap;
}
},
MEMBER_TOTAL_QUANTITY("dc_cmtq","普通会员订单量"){
@Override
Map<String, List<OrderReceivedStatisticsVo>> wrapToMap(Map<Object, List<OrderReceivedStatisticsBase>> orderMap) {
Map<String, List<OrderReceivedStatisticsVo>> resultMap = new HashMap<>();
List<OrderReceivedStatisticsVo> orderReceivedStatisticsVos = new ArrayList<>();
orderMap.forEach((K,V)->{
List<OrderMemberReceivedStatistics> orderMemberReceivedStatisticsList = V.stream().map(x -> (OrderMemberReceivedStatistics) x).collect(Collectors.toList());
Integer totalQuantity = orderMemberReceivedStatisticsList.stream().map(x -> x.getTotalCommonQuantity()).reduce(0, (x, y) -> x+y);
OrderMemberReceivedStatistics orderMemberReceivedStatistics = orderMemberReceivedStatisticsList.get(0);
OrderReceivedStatisticsVo receivedStatisticsVo = ReceivedStatisticsEnum.createOrderReceivedStatistics(orderMemberReceivedStatistics,null,totalQuantity);
orderReceivedStatisticsVos.add(receivedStatisticsVo);
});
resultMap.put(getSign(),orderReceivedStatisticsVos);
return resultMap;
}
},
GOLD_MEMBER_TOTAL_AMOUNT("dd_gmta","黄金会员订单总额"){
@Override
Map<String, List<OrderReceivedStatisticsVo>> wrapToMap(Map<Object, List<OrderReceivedStatisticsBase>> orderMap) {
Map<String, List<OrderReceivedStatisticsVo>> resultMap = new HashMap<>();
List<OrderReceivedStatisticsVo> orderReceivedStatisticsVos = new ArrayList<>();
orderMap.forEach((K,V)->{
List<OrderMemberReceivedStatistics> orderMemberReceivedStatisticsList = ReceivedStatisticsEnum.convertToTargetBean(V);
BigDecimal totalAmount = orderMemberReceivedStatisticsList.stream().map(x -> x.getTotalGoldAmount()).reduce(BigDecimal.ZERO, (x, y) -> x.add(y));
OrderMemberReceivedStatistics orderMemberReceivedStatistics = orderMemberReceivedStatisticsList.get(0);
OrderReceivedStatisticsVo receivedStatisticsVo = ReceivedStatisticsEnum.createOrderReceivedStatistics(orderMemberReceivedStatistics,totalAmount,null);
orderReceivedStatisticsVos.add(receivedStatisticsVo);
});
resultMap.put(getSign(),orderReceivedStatisticsVos);
return resultMap;
}
},
GOLD_MEMBER_TOTAL_QUANTITY("de_mgtq","黄金会员订单量"){
@Override
Map<String, List<OrderReceivedStatisticsVo>> wrapToMap(Map<Object, List<OrderReceivedStatisticsBase>> orderMap) {
Map<String, List<OrderReceivedStatisticsVo>> resultMap = new HashMap<>();
List<OrderReceivedStatisticsVo> orderReceivedStatisticsVos = new ArrayList<>();
orderMap.forEach((K,V)->{
List<OrderMemberReceivedStatistics> orderMemberReceivedStatisticsList = ReceivedStatisticsEnum.convertToTargetBean(V);
Integer totalQuantity = orderMemberReceivedStatisticsList.stream().map(x -> x.getTotalGoldQuantity()).reduce(0, (x, y) -> x+y);
OrderMemberReceivedStatistics orderMemberReceivedStatistics = orderMemberReceivedStatisticsList.get(0);
OrderReceivedStatisticsVo receivedStatisticsVo = ReceivedStatisticsEnum.createOrderReceivedStatistics(orderMemberReceivedStatistics,null,totalQuantity);
orderReceivedStatisticsVos.add(receivedStatisticsVo);
});
resultMap.put(getSign(),orderReceivedStatisticsVos);
return resultMap;
}
},
DIAMOND_MEMBER_TOTAL_AMOUNT("df_dmta","钻石会员订单总额"){
@Override
Map<String, List<OrderReceivedStatisticsVo>> wrapToMap(Map<Object, List<OrderReceivedStatisticsBase>> orderMap) {
Map<String, List<OrderReceivedStatisticsVo>> resultMap = new HashMap<>();
List<OrderReceivedStatisticsVo> orderReceivedStatisticsVos = new ArrayList<>();
orderMap.forEach((K,V)->{
List<OrderMemberReceivedStatistics> orderMemberReceivedStatisticsList = ReceivedStatisticsEnum.convertToTargetBean(V);
BigDecimal totalAmount = orderMemberReceivedStatisticsList.stream().map(x -> x.getTotalDiamondAmmount()).reduce(BigDecimal.ZERO, (x, y) -> x.add(y));
OrderMemberReceivedStatistics orderMemberReceivedStatistics = orderMemberReceivedStatisticsList.get(0);
OrderReceivedStatisticsVo receivedStatisticsVo = ReceivedStatisticsEnum.createOrderReceivedStatistics(orderMemberReceivedStatistics,totalAmount,null);
orderReceivedStatisticsVos.add(receivedStatisticsVo);
});
resultMap.put(getSign(),orderReceivedStatisticsVos);
return resultMap;
}
},
DIAMOND_MEMBER_TOTAL_QUANTITY("dg_dmtq","钻石会员订单量"){
@Override
Map<String, List<OrderReceivedStatisticsVo>> wrapToMap(Map<Object, List<OrderReceivedStatisticsBase>> orderMap) {
Map<String, List<OrderReceivedStatisticsVo>> resultMap = new HashMap<>();
List<OrderReceivedStatisticsVo> orderReceivedStatisticsVos = new ArrayList<>();
orderMap.forEach((K,V)->{
List<OrderMemberReceivedStatistics> orderMemberReceivedStatisticsList = ReceivedStatisticsEnum.convertToTargetBean(V);
Integer totalQuantity = orderMemberReceivedStatisticsList.stream().map(x -> x.getTotalDiamondQuantity()).reduce(0, (x, y) -> x+y);
OrderMemberReceivedStatistics orderMemberReceivedStatistics = orderMemberReceivedStatisticsList.get(0);
OrderReceivedStatisticsVo receivedStatisticsVo = ReceivedStatisticsEnum.createOrderReceivedStatistics(orderMemberReceivedStatistics,null,totalQuantity);
orderReceivedStatisticsVos.add(receivedStatisticsVo);
});
resultMap.put(getSign(),orderReceivedStatisticsVos);
return resultMap;
}
};
private String sign;
private String desc;
private static Map<String,OrderMemberReceivedStatisticsSignEnum> orderMemberReceivedStatisticsSignEnumMap;
static {
orderMemberReceivedStatisticsSignEnumMap = EnumSet.allOf(OrderMemberReceivedStatisticsSignEnum.class).stream().collect(Collectors.toMap(OrderMemberReceivedStatisticsSignEnum::getSign, Function.identity()));
}
OrderMemberReceivedStatisticsSignEnum(String sign, String desc) {
this.sign = sign;
this.desc = desc;
}
/**
* 统计项
* @param orderMap
* @return
*/
abstract Map<String, List<OrderReceivedStatisticsVo>> wrapToMap(Map<Object,List<OrderReceivedStatisticsBase>> orderMap);
public static Map<String, List<OrderReceivedStatisticsVo>> orderMemberstatisticsMap(Map<Object, List<OrderReceivedStatisticsBase>> orderMemberstatisticsMap, List<String> signs) {
Map<String,List<OrderReceivedStatisticsVo>> resultMap = new HashMap<>(signs.size());
for (String sign : signs) {
OrderMemberReceivedStatisticsSignEnum orderMemberReceivedStatisticsSignEnum = orderMemberReceivedStatisticsSignEnumMap.get(sign);
Map<String, List<OrderReceivedStatisticsVo>> wrapToMap = orderMemberReceivedStatisticsSignEnum.wrapToMap(orderMemberstatisticsMap);
resultMap.putAll(wrapToMap);
}
return resultMap;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
package com.xxfc.platform.order.contant.enumerate;
import com.xxfc.platform.order.entity.OrderReceivedStatistics;
import com.xxfc.platform.order.entity.OrderReceivedStatisticsBase;
import com.xxfc.platform.order.pojo.vo.OrderReceivedStatisticsVo;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @author libin
* @version 1.0
* @description
* @data 2019/11/11 10:36
*/
public enum OrderReceivedStatisticsSignEnum {
ORDER_TOTAL_AMOUNT("aa_ota","订单总额"){
@Override
Map<String, List<OrderReceivedStatisticsVo>> wrapToMap(Map<Object, List<OrderReceivedStatisticsBase>> orderMap) {
Map<String, List<OrderReceivedStatisticsVo>> resultMap = new HashMap<>();
List<OrderReceivedStatisticsVo> orderReceivedStatisticsVos = new ArrayList<>();
orderMap.forEach((K,V)->{
List<OrderReceivedStatistics> orderReceivedStatisticsList = ReceivedStatisticsEnum.convertToTargetBean(V);
BigDecimal totalAmount = orderReceivedStatisticsList.stream().map(x -> x.getTotalAmount()).reduce(BigDecimal.ZERO, (x, y) -> x.add(y));
OrderReceivedStatistics orderReceivedStatistics = orderReceivedStatisticsList.get(0);
OrderReceivedStatisticsVo receivedStatisticsVo = ReceivedStatisticsEnum.createOrderReceivedStatistics(orderReceivedStatistics,totalAmount,null);
orderReceivedStatisticsVos.add(receivedStatisticsVo);
});
resultMap.put(getSign(),orderReceivedStatisticsVos);
return resultMap;
}
},
ORDER_TOTAL_QUANTITY("ab_otq","订单量"){
@Override
Map<String, List<OrderReceivedStatisticsVo>> wrapToMap(Map<Object, List<OrderReceivedStatisticsBase>> orderMap) {
Map<String, List<OrderReceivedStatisticsVo>> resultMap = new HashMap<>();
List<OrderReceivedStatisticsVo> orderReceivedStatisticsVos = new ArrayList<>();
orderMap.forEach((K,V)->{
List<OrderReceivedStatistics> orderReceivedStatisticsList = ReceivedStatisticsEnum.convertToTargetBean(V);
Integer totalQuantity = orderReceivedStatisticsList.stream().map(x -> x.getTotalQuantity()).reduce(0, (x, y) -> x+y);
OrderReceivedStatistics orderReceivedStatistics = orderReceivedStatisticsList.get(0);
OrderReceivedStatisticsVo receivedStatisticsVo = ReceivedStatisticsEnum.createOrderReceivedStatistics(orderReceivedStatistics,null,totalQuantity);
orderReceivedStatisticsVos.add(receivedStatisticsVo);
});
resultMap.put(getSign(),orderReceivedStatisticsVos);
return resultMap;
}
},
ORDER_AVG_QUANTITY("ac_oavgq","订单arpu"){
@Override
Map<String, List<OrderReceivedStatisticsVo>> wrapToMap(Map<Object, List<OrderReceivedStatisticsBase>> orderMap) {
Map<String, List<OrderReceivedStatisticsVo>> resultMap = new HashMap<>();
List<OrderReceivedStatisticsVo> orderReceivedStatisticsVos = new ArrayList<>();
orderMap.forEach((K,V)->{
List<OrderReceivedStatistics> orderReceivedStatisticsList = ReceivedStatisticsEnum.convertToTargetBean(V);
Integer avgQuantity = orderReceivedStatisticsList.stream().map(x -> x.getTotalQuantity()).reduce(0, (x, y) -> x+y)/V.size();
OrderReceivedStatistics orderReceivedStatistics = orderReceivedStatisticsList.get(0);
OrderReceivedStatisticsVo receivedStatisticsVo = ReceivedStatisticsEnum.createOrderReceivedStatistics(orderReceivedStatistics,null,avgQuantity);
orderReceivedStatisticsVos.add(receivedStatisticsVo);
});
resultMap.put(getSign(),orderReceivedStatisticsVos);
return resultMap;
}
};
private String sign;
private String desc;
private static Map<String,OrderReceivedStatisticsSignEnum> orderReceivedStatisticsSignEnumMap;
static {
orderReceivedStatisticsSignEnumMap = EnumSet.allOf(OrderReceivedStatisticsSignEnum.class).stream().collect(Collectors.toMap(OrderReceivedStatisticsSignEnum::getSign, Function.identity()));
}
OrderReceivedStatisticsSignEnum(String sign, String desc) {
this.sign = sign;
this.desc = desc;
}
/**
* 统计项
* @param orderMap
* @return
*/
abstract Map<String, List<OrderReceivedStatisticsVo>> wrapToMap(Map<Object,List<OrderReceivedStatisticsBase>> orderMap);
public static Map<String, List<OrderReceivedStatisticsVo>> orderReceivedStatistics(Map<Object,List<OrderReceivedStatisticsBase>> orderMap,List<String> signs){
Map<String,List<OrderReceivedStatisticsVo>> resultMap = new HashMap<>(signs.size());
for (String sign : signs) {
OrderReceivedStatisticsSignEnum orderReceivedStatisticsSignEnum = orderReceivedStatisticsSignEnumMap.get(sign);
Map<String, List<OrderReceivedStatisticsVo>> wrapToMap = orderReceivedStatisticsSignEnum.wrapToMap(orderMap);
resultMap.putAll(wrapToMap);
}
return resultMap;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
package com.xxfc.platform.order.contant.enumerate;
import com.xxfc.platform.order.entity.OrderReceivedStatisticsBase;
import com.xxfc.platform.order.entity.OrderRentVehicleReceivedStatistics;
import com.xxfc.platform.order.pojo.vo.OrderReceivedStatisticsVo;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @author libin
* @version 1.0
* @description
* @data 2019/11/11 10:36
*/
public enum OrderRentVehicleReceivedStatisticsSignEnum{
RENT_VEHICLE_TOTAL_AMOUNT("ba_rvta","租车订单总额"){
@Override
Map<String, List<OrderReceivedStatisticsVo>> wrapToMap(Map<Object, List<OrderReceivedStatisticsBase>> orderMap) {
Map<String, List<OrderReceivedStatisticsVo>> resultMap = new HashMap<>();
List<OrderReceivedStatisticsVo> orderReceivedStatisticsVos = new ArrayList<>();
orderMap.forEach((K,V)->{
List<OrderRentVehicleReceivedStatistics> orderRentVehicleReceivedStatisticsList = ReceivedStatisticsEnum.convertToTargetBean(V);
BigDecimal totalAmount = orderRentVehicleReceivedStatisticsList.stream().map(x -> x.getTotalAmount()).reduce(BigDecimal.ZERO, (x, y) -> x.add(y));
OrderRentVehicleReceivedStatistics orderReceivedStatistics = orderRentVehicleReceivedStatisticsList.get(0);
OrderReceivedStatisticsVo receivedStatisticsVo = ReceivedStatisticsEnum.createOrderReceivedStatistics(orderReceivedStatistics,totalAmount,null);
orderReceivedStatisticsVos.add(receivedStatisticsVo);
});
resultMap.put(getSign(),orderReceivedStatisticsVos);
return resultMap;
}
},
RENT_VEHICLE_TOTAL_QUANTITY("bb_rvtq","租车订单量") {
@Override
Map<String, List<OrderReceivedStatisticsVo>> wrapToMap(Map<Object, List<OrderReceivedStatisticsBase>> orderMap) {
Map<String, List<OrderReceivedStatisticsVo>> resultMap = new HashMap<>();
List<OrderReceivedStatisticsVo> orderReceivedStatisticsVos = new ArrayList<>();
orderMap.forEach((K,V)->{
List<OrderRentVehicleReceivedStatistics> orderRentVehicleReceivedStatisticsList = ReceivedStatisticsEnum.convertToTargetBean(V);
Integer totalQuantity = orderRentVehicleReceivedStatisticsList.stream().map(x -> x.getTotalQuantity()).reduce(0, (x, y) -> x+y);
OrderRentVehicleReceivedStatistics orderReceivedStatistics = orderRentVehicleReceivedStatisticsList.get(0);
OrderReceivedStatisticsVo receivedStatisticsVo = ReceivedStatisticsEnum.createOrderReceivedStatistics(orderReceivedStatistics,null,totalQuantity);
orderReceivedStatisticsVos.add(receivedStatisticsVo);
});
resultMap.put(getSign(),orderReceivedStatisticsVos);
return resultMap;
}
},
RENT_VEHICLE_AVG_QUANTITY("bc_rvavgq","租车订单arpu") {
@Override
Map<String, List<OrderReceivedStatisticsVo>> wrapToMap(Map<Object, List<OrderReceivedStatisticsBase>> orderMap) {
Map<String, List<OrderReceivedStatisticsVo>> resultMap = new HashMap<>();
AtomicReference<Integer> divisorAtomicReference = new AtomicReference<>();
List<OrderReceivedStatisticsVo> orderReceivedStatisticsVos = new ArrayList<>();
orderMap.forEach((K,V)->{
List<OrderRentVehicleReceivedStatistics> orderRentVehicleReceivedStatisticsList = ReceivedStatisticsEnum.convertToTargetBean(V);
Integer divisor = divisorAtomicReference.get();
if (Objects.isNull(divisor)){
divisor = orderRentVehicleReceivedStatisticsList.get(0).getDivisor();
divisorAtomicReference.set(divisor);
}
Integer avgQuantity = orderRentVehicleReceivedStatisticsList.stream().map(x -> x.getTotalQuantity()).reduce(0, (x, y) -> x+y)/divisor;
OrderRentVehicleReceivedStatistics orderReceivedStatistics = orderRentVehicleReceivedStatisticsList.get(0);
OrderReceivedStatisticsVo receivedStatisticsVo = ReceivedStatisticsEnum.createOrderReceivedStatistics(orderReceivedStatistics,null,avgQuantity);
orderReceivedStatisticsVos.add(receivedStatisticsVo);
});
resultMap.put(getSign(),orderReceivedStatisticsVos);
return resultMap;
}
};
private String sign;
private String desc;
private static Map<String,OrderRentVehicleReceivedStatisticsSignEnum> orderRentVehicleReceivedStatisticsSignEnumMap;
static {
orderRentVehicleReceivedStatisticsSignEnumMap = EnumSet.allOf(OrderRentVehicleReceivedStatisticsSignEnum.class).stream().collect(Collectors.toMap(OrderRentVehicleReceivedStatisticsSignEnum::getSign, Function.identity()));
}
OrderRentVehicleReceivedStatisticsSignEnum(String sign, String desc) {
this.sign = sign;
this.desc = desc;
}
/**
* 统计项
* @param orderMap
* @return
*/
abstract Map<String, List<OrderReceivedStatisticsVo>> wrapToMap(Map<Object,List<OrderReceivedStatisticsBase>> orderMap);
public static Map<String, List<OrderReceivedStatisticsVo>> orderMemberstatisticsMap(Map<Object, List<OrderReceivedStatisticsBase>> orderRentVehiclestatisticsMap, List<String> signs) {
Map<String, List<OrderReceivedStatisticsVo>> resultMap = new HashMap<>(signs.size());
for (String sign : signs) {
OrderRentVehicleReceivedStatisticsSignEnum orderRentVehicleReceivedStatisticsSignEnum = orderRentVehicleReceivedStatisticsSignEnumMap.get(sign);
Map<String, List<OrderReceivedStatisticsVo>> wrapToMap = orderRentVehicleReceivedStatisticsSignEnum.wrapToMap(orderRentVehiclestatisticsMap);
resultMap.putAll(wrapToMap);
}
return resultMap;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
package com.xxfc.platform.order.contant.enumerate;
import com.xxfc.platform.order.entity.OrderReceivedStatisticsBase;
import com.xxfc.platform.order.entity.OrderTourReceivedStatistics;
import com.xxfc.platform.order.pojo.vo.OrderReceivedStatisticsVo;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @author libin
* @version 1.0
* @description
* @data 2019/11/11 10:36
*/
public enum OrderTourReceivedStatisticsSignEnum {
TOUR_TOTAL_AMOUNT("ca_tta", "旅游订单总额") {
@Override
Map<String, List<OrderReceivedStatisticsVo>> wrapToMap(Map<Object, List<OrderReceivedStatisticsBase>> orderMap) {
Map<String, List<OrderReceivedStatisticsVo>> resultMap = new HashMap<>();
List<OrderReceivedStatisticsVo> orderReceivedStatisticsVos = new ArrayList<>();
orderMap.forEach((K, V) -> {
List<OrderTourReceivedStatistics> orderTourReceivedStatisticsList = ReceivedStatisticsEnum.convertToTargetBean(V);
BigDecimal totalAmount = orderTourReceivedStatisticsList.stream().map(x -> x.getTotalAmount()).reduce(BigDecimal.ZERO, (x, y) -> x.add(y));
OrderTourReceivedStatistics orderReceivedStatistics = orderTourReceivedStatisticsList.get(0);
OrderReceivedStatisticsVo receivedStatisticsVo = ReceivedStatisticsEnum.createOrderReceivedStatistics(orderReceivedStatistics, totalAmount, null);
orderReceivedStatisticsVos.add(receivedStatisticsVo);
});
resultMap.put(getSign(), orderReceivedStatisticsVos);
return resultMap;
}
},
TOUR_TOTAL_QUANTITY("cb_ttq", "旅游订单量") {
@Override
Map<String, List<OrderReceivedStatisticsVo>> wrapToMap(Map<Object, List<OrderReceivedStatisticsBase>> orderMap) {
Map<String, List<OrderReceivedStatisticsVo>> resultMap = new HashMap<>();
List<OrderReceivedStatisticsVo> orderReceivedStatisticsVos = new ArrayList<>();
orderMap.forEach((K, V) -> {
List<OrderTourReceivedStatistics> orderTourReceivedStatisticsList = ReceivedStatisticsEnum.convertToTargetBean(V);
Integer totalQuantity = orderTourReceivedStatisticsList.stream().map(x -> x.getTotalQuantity()).reduce(0, (x, y) -> x + y);
OrderTourReceivedStatistics orderReceivedStatistics = orderTourReceivedStatisticsList.get(0);
OrderReceivedStatisticsVo receivedStatisticsVo = ReceivedStatisticsEnum.createOrderReceivedStatistics(orderReceivedStatistics, null, totalQuantity);
orderReceivedStatisticsVos.add(receivedStatisticsVo);
});
resultMap.put(getSign(), orderReceivedStatisticsVos);
return resultMap;
}
},
TOUR_AVG_QUANTITY("cd_tavgq", "旅游订单arpu") {
@Override
Map<String, List<OrderReceivedStatisticsVo>> wrapToMap(Map<Object, List<OrderReceivedStatisticsBase>> orderMap) {
Map<String, List<OrderReceivedStatisticsVo>> resultMap = new HashMap<>();
AtomicReference<Integer> divisorAtomicReference = new AtomicReference<>();
List<OrderReceivedStatisticsVo> orderReceivedStatisticsVos = new ArrayList<>();
orderMap.forEach((K, V) -> {
List<OrderTourReceivedStatistics> orderTourReceivedStatisticsList = ReceivedStatisticsEnum.convertToTargetBean(V);
Integer divisor = divisorAtomicReference.get();
if (Objects.isNull(divisor)){
divisor = orderTourReceivedStatisticsList.get(0).getDivisor();
divisorAtomicReference.set(divisor);
}
Integer avgQuantity = orderTourReceivedStatisticsList.stream().map(x -> x.getTotalQuantity()).reduce(0, (x, y) -> x + y) / divisor;
OrderTourReceivedStatistics orderReceivedStatistics = orderTourReceivedStatisticsList.get(0);
OrderReceivedStatisticsVo receivedStatisticsVo = ReceivedStatisticsEnum.createOrderReceivedStatistics(orderReceivedStatistics, null, avgQuantity);
orderReceivedStatisticsVos.add(receivedStatisticsVo);
});
resultMap.put(getSign(), orderReceivedStatisticsVos);
return resultMap;
}
};
private String sign;
private String desc;
private static Map<String, OrderTourReceivedStatisticsSignEnum> orderTourReceivedStatisticsSignEnumMap;
static {
orderTourReceivedStatisticsSignEnumMap = EnumSet.allOf(OrderTourReceivedStatisticsSignEnum.class).stream().collect(Collectors.toMap(OrderTourReceivedStatisticsSignEnum::getSign, Function.identity()));
}
OrderTourReceivedStatisticsSignEnum(String sign, String desc) {
this.sign = sign;
this.desc = desc;
}
/**
* 统计项
*
* @param orderMap
* @return
*/
abstract Map<String, List<OrderReceivedStatisticsVo>> wrapToMap(Map<Object, List<OrderReceivedStatisticsBase>> orderMap);
public static Map<String, List<OrderReceivedStatisticsVo>> orderMemberstatisticsMap(Map<Object, List<OrderReceivedStatisticsBase>> orderTourstatisticsMap, List<String> signs) {
Map<String, List<OrderReceivedStatisticsVo>> resultMap = new HashMap<>(signs.size());
for (String sign : signs) {
OrderTourReceivedStatisticsSignEnum orderTourReceivedStatisticsSignEnum = orderTourReceivedStatisticsSignEnumMap.get(sign);
Map<String, List<OrderReceivedStatisticsVo>> wrapToMap = orderTourReceivedStatisticsSignEnum.wrapToMap(orderTourstatisticsMap);
resultMap.putAll(wrapToMap);
}
return resultMap;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
package com.xxfc.platform.order.contant.enumerate;
import com.xxfc.platform.order.entity.OrderReceivedStatisticsBase;
import com.xxfc.platform.order.pojo.vo.OrderReceivedStatisticsVo;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @author libin
* @version 1.0
* @description
* @data 2019/11/11 15:25
*/
public enum ReceivedStatisticsEnum {
DAY(1, "按日统计") {
@Override
Map<Object, List<OrderReceivedStatisticsBase>> wrapMap(List<? extends OrderReceivedStatisticsBase> orderReceivedStatisticsBases) {
if (CollectionUtils.isEmpty(orderReceivedStatisticsBases)) {
return Collections.EMPTY_MAP;
}
return orderReceivedStatisticsBases.stream().peek(x -> {
((OrderReceivedStatisticsBase) x).setDivisor(1);
}).collect(Collectors.groupingBy(OrderReceivedStatisticsBase::getDate, Collectors.toList()));
}
},
WEEK(2, "按周统计") {
@Override
Map<Object, List<OrderReceivedStatisticsBase>> wrapMap(List<? extends OrderReceivedStatisticsBase> orderReceivedStatisticsBases) {
if (CollectionUtils.isEmpty(orderReceivedStatisticsBases)) {
return Collections.EMPTY_MAP;
}
return orderReceivedStatisticsBases.stream().peek(x -> ((OrderReceivedStatisticsBase) x).setDivisor(7)).collect(Collectors.groupingBy(OrderReceivedStatisticsBase::getWeekOfYear, Collectors.toList()));
}
},
MONTH(3, "按月统计") {
@Override
Map<Object, List<OrderReceivedStatisticsBase>> wrapMap(List<? extends OrderReceivedStatisticsBase> orderReceivedStatisticsBases) {
if (CollectionUtils.isEmpty(orderReceivedStatisticsBases)) {
return Collections.EMPTY_MAP;
}
return orderReceivedStatisticsBases.stream().peek(x -> {
OrderReceivedStatisticsBase orderReceivedStatisticsBase = (OrderReceivedStatisticsBase) x;
orderReceivedStatisticsBase.setDate(null);
orderReceivedStatisticsBase.setWeekOfYear(null);
LocalDate localDate = LocalDate.of(Integer.valueOf(orderReceivedStatisticsBase.getYear()),
Integer.valueOf(orderReceivedStatisticsBase.getMonth().replace(orderReceivedStatisticsBase.getYear(), "")), 1);
int lastDay = localDate.with(TemporalAdjusters.lastDayOfMonth()).getDayOfMonth();
orderReceivedStatisticsBase.setDivisor(lastDay);
}).collect(Collectors.groupingBy(OrderReceivedStatisticsBase::getMonth, Collectors.toList()));
}
};
private int wayCode;
private String value;
private static Map<Integer, ReceivedStatisticsEnum> statisticsEnumMap;
static {
statisticsEnumMap = EnumSet.allOf(ReceivedStatisticsEnum.class).stream().collect(Collectors.toMap(ReceivedStatisticsEnum::getWayCode, Function.identity()));
}
ReceivedStatisticsEnum(int wayCode, String value) {
this.wayCode = wayCode;
this.value = value;
}
/**
* 统计方式
*
* @param orderReceivedStatisticsBases
* @return
*/
abstract Map<Object, List<OrderReceivedStatisticsBase>> wrapMap(List<? extends OrderReceivedStatisticsBase> orderReceivedStatisticsBases);
public static Map<Object, List<OrderReceivedStatisticsBase>> orderstatistics(List<? extends OrderReceivedStatisticsBase> orderReceivedStatisticsBases, int wayCode) {
ReceivedStatisticsEnum statisticsEnum = createInstance(wayCode);
return statisticsEnum.wrapMap(orderReceivedStatisticsBases);
}
private static ReceivedStatisticsEnum createInstance(int wayCode) {
return statisticsEnumMap.get(wayCode);
}
/**
* 类型转换
*
* @param source
* @param <T>
* @return
*/
public static <T> List<T> convertToTargetBean(List<? extends OrderReceivedStatisticsBase> source) {
return source.stream().map(x -> (T) x).collect(Collectors.toList());
}
public static OrderReceivedStatisticsVo createOrderReceivedStatistics(OrderReceivedStatisticsBase orderReceivedStatisticsBase, BigDecimal amount, Integer quantity) {
return OrderReceivedStatisticsVo.builder()
.date(orderReceivedStatisticsBase.getDate())
.month(orderReceivedStatisticsBase.getMonth())
.weekOfYear(orderReceivedStatisticsBase.getWeekOfYear())
.year(orderReceivedStatisticsBase.getYear())
.orderNum(quantity)
.orderAmount(amount)
.build();
}
public int getWayCode() {
return wayCode;
}
public void setWayCode(int wayCode) {
this.wayCode = wayCode;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
package com.xxfc.platform.order.contant.enumerate; package com.xxfc.platform.order.contant.enumerate;
import cn.hutool.core.date.DateField; import cn.hutool.json.JSONObject;
import cn.hutool.core.date.DateTime; import cn.hutool.json.JSONUtil;
import com.xxfc.platform.order.bo.FeeTypeBo;
import com.xxfc.platform.order.entity.OrderReceivedStatisticsBase; import com.xxfc.platform.order.entity.OrderReceivedStatisticsBase;
import com.xxfc.platform.order.pojo.account.OrderAccountBo;
import com.xxfc.platform.order.pojo.account.OrderAccountDeduction;
import com.xxfc.platform.order.pojo.account.OrderAccountDetail;
import com.xxfc.platform.order.pojo.dto.OrderDTO;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.assertj.core.util.Lists; import org.assertj.core.util.Lists;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import tk.mybatis.mapper.additional.insert.InsertListMapper;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.ZoneId; import java.time.ZoneId;
import java.time.temporal.WeekFields; import java.time.temporal.WeekFields;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
/** /**
* @author libin * @author libin
...@@ -19,74 +26,208 @@ import java.util.*; ...@@ -19,74 +26,208 @@ import java.util.*;
* @description * @description
* @data 2019/11/14 14:28 * @data 2019/11/14 14:28
*/ */
public enum StatisticsStatusEnum { public enum StatisticsStatusEnum {
; ;
public static final int DEFAULT_COMPANY=1; public static final int DEFAULT_COMPANY = 1;
public static final int ORDER_MEMBER_TYPE=3; public static final int ORDER_MEMBER_TYPE = 3;
public static final int ORDER_RENT_VEHICLE_TYPE=1; public static final int ORDER_RENT_VEHICLE_TYPE = 1;
public static final int ORDER_TOUR_TYPE=2; public static final int ORDER_TOUR_TYPE = 2;
public static final int NO_PAY_WAY=0; public static final int NO_PAY_WAY = 0;
public static final Integer DEFAULT_SQL_SIZE=1000; public static final Integer DEFAULT_SQL_SIZE = 1000;
public static final String ORDER_AMOUNT="order_amount"; public static final String COMPANY_DEFAULT = "欣新房车控股集团";
public static final String LATEFEE_AMOUNT="late_fee"; public static final String NO_DEDUCTIBLE_AMOUNT = "damageSafeAmount";
public static final String ORDER_REFUND_AMOUNT="order_refund_amount"; public static final String PARMAM_JSON = "paramJson";
public static final String ORDER_DEPOSIT_AMOUNT="order_deposit_amount"; public static final int DAMAGE_SAFE = 1;
public static final String COMPANY_DEFAULT="欣新房车控股集团";
public static final String NO_DEDUCTIBLE_AMOUNT="damageSafeAmount";
public static final String PARMAM_JSON="paramJson";
public static final int DAMAGE_SAFE=1;
public static List<String> orderStates; public static List<String> orderStates;
public static List<String> orderOrigins; public static List<String> orderOrigins;
public static List<String> orderPayWays; public static List<String> orderPayWays;
static { static {
// 0 未支付 1 已支付 // 0 未支付 1 已支付
orderStates = Lists.newArrayList("0","1"); orderStates = Lists.newArrayList("0", "1");
// 1 app 2 小程序 3 其他 // 1 app 2 小程序 3 其他
orderOrigins = Lists.newArrayList("1","2","3"); orderOrigins = Lists.newArrayList("1", "2", "3");
// 1 微信 2 支付宝 0不需要支付(使用了优惠券之类的)或未支付 // 1 微信 2 支付宝 0不需要支付(使用了优惠券之类的)或未支付
orderPayWays = Lists.newArrayList("1","2","0"); orderPayWays = Lists.newArrayList("1", "2", "0");
} }
public static List<String> statisticsSateGroupWithCompanys(List<Integer> companyIdList){ public static List<String> statisticsSateGroupWithCompanys(List<Integer> companyIdList) {
List<String> orderStatisticsStateGroups = new ArrayList<>(); List<String> orderStatisticsStateGroups = new ArrayList<>();
List<String> stateGroup = statisticsStateGroup(); List<String> stateGroup = statisticsStateGroup();
for (String stgp : stateGroup) { for (String stgp : stateGroup) {
for (Integer companyId : companyIdList) { for (Integer companyId : companyIdList) {
// 公司id-订单来源-支付方式-订单状态 // 公司id-订单来源-支付方式-订单状态
orderStatisticsStateGroups.add(String.format("%d-%s",companyId,stgp)); orderStatisticsStateGroups.add(String.format("%d-%s", companyId, stgp));
} }
} }
return orderStatisticsStateGroups; return orderStatisticsStateGroups;
} }
public static List<String> statisticsStateGroup(){ public static List<String> statisticsStateGroup() {
List<String> orderStatisticsStateGroups = new ArrayList<>(); List<String> orderStatisticsStateGroups = new ArrayList<>();
for (String orderOrigin : orderOrigins) { for (String orderOrigin : orderOrigins) {
for (String orderPayWay : orderPayWays) { for (String orderPayWay : orderPayWays) {
for (String orderState : orderStates) { for (String orderState : orderStates) {
//订单来源-支付方式-订单状态 //订单来源-支付方式-订单状态
orderStatisticsStateGroups.add(String.format("%s-%s-%s",orderOrigin,orderPayWay,orderState)); orderStatisticsStateGroups.add(String.format("%s-%s-%s", orderOrigin, orderPayWay, orderState));
} }
} }
} }
return orderStatisticsStateGroups; return orderStatisticsStateGroups;
} }
public static List<String> getOtherStatisticsStateGroup(List<Integer> companyIdList,List<String> statisticsStates){
List<String> stateGroupList = CollectionUtils.isEmpty(companyIdList)?statisticsStateGroup():statisticsSateGroupWithCompanys(companyIdList); public static List<String> getOtherStatisticsStateGroup(List<Integer> companyIdList, List<String> statisticsStates) {
List<String> stateGroupList = CollectionUtils.isEmpty(companyIdList) ? statisticsStateGroup() : statisticsSateGroupWithCompanys(companyIdList);
stateGroupList.removeAll(statisticsStates); stateGroupList.removeAll(statisticsStates);
return stateGroupList; return stateGroupList;
} }
public static<T extends OrderReceivedStatisticsBase> T wrapStatisticsObject(Date date, String stateGroup, Map<Integer,String> companyMap, T targetObj){ /**
LocalDate localDate = LocalDate.from(new Date().toInstant().atZone(ZoneId.systemDefault())); * 订单状态组合处理
*
* @param stisticsActiveState
* @param orderDTOS
* @return
*/
public static Map<Boolean, Map<String, List<OrderDTO>>> processOrdersWithState(List<String> stisticsActiveState, List<OrderDTO> orderDTOS) {
Map<Boolean, Map<String, List<OrderDTO>>> stateGroupMap = orderDTOS.stream().peek(x -> {
x.setStateGroup(String.format("%d-%d-%d-%d", Objects.isNull(x.getCompanyId())?DEFAULT_COMPANY:x.getCompanyId(),
x.getOrderOrigin(),
x.getPayWay() == null ? 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())));
return stateGroupMap == null ? Collections.EMPTY_MAP : stateGroupMap;
}
/**
* 订单账目状态组合处理
* @param stisticsActiveState
* @param orderAccountBoList
* @return
*/
public static Map<String, List<OrderAccountBo>> processOrderAccountsWithState(List<String> stisticsActiveState, List<OrderAccountBo> orderAccountBoList) {
return orderAccountBoList.stream().peek(x -> {
x.setStateGroup(String.format("%d-%d-%d-%d", Objects.isNull(x.getCompanyId())?DEFAULT_COMPANY:x.getCompanyId(),
x.getOrderOrigin(),
x.getPayWay() == null ? StatisticsStatusEnum.NO_PAY_WAY : x.getPayWay(),
x.getHasPay()));
stisticsActiveState.add(x.getStateGroup());
}).collect(Collectors.groupingBy(OrderAccountBo::getStateGroup, Collectors.toList()));
}
/**
* 获取账目消费
*
* @param orderAccountBos
* @return
*/
public static FeeTypeBo getFeeTyBoByOrderAccounts(List<OrderAccountBo> orderAccountBos) {
FeeTypeBo feeTypeBo = new FeeTypeBo();
for (OrderAccountBo orderAccountBo : orderAccountBos) {
//账目详情
OrderAccountDetail accountDetailEntity = orderAccountBo.getAccountDetailEntity();
//是否买免赔
boolean hasDamageSafe = Objects.nonNull(orderAccountBo.getDamageSafe()) && (orderAccountBo.getDamageSafe() == StatisticsStatusEnum.DAMAGE_SAFE);
if (orderAccountBo.getAccountType().equals(AccountTypeEnum.IN_ORDER_PAY.getCode())) {
//订单押金
feeTypeBo.setDepositAmount(feeTypeBo.getDepositAmount().add(accountDetailEntity.getDepositAmount()));
if (hasDamageSafe) {
BigDecimal dameSafeAmount = getDameSafeAmount(orderAccountBo.getData());
feeTypeBo.setNoDeductibleAmount(feeTypeBo.getNoDeductibleAmount().add(dameSafeAmount));
}
//订单金额(不包含免赔和押金)
feeTypeBo.setTotalAmount(feeTypeBo.getTotalAmount().add(accountDetailEntity.getOrderAmount()).subtract(feeTypeBo.getNoDeductibleAmount()));
} else {
//退款订单押金
feeTypeBo.setDepositRefundAmount(feeTypeBo.getDepositRefundAmount().add(accountDetailEntity.getDepositAmount()));
//退款详细账目
List<OrderAccountDeduction> deductions = accountDetailEntity.getDeductions();
//其它消费明细(租车表详情)
JSONObject data = orderAccountBo.getData();
//免赔
if (hasDamageSafe) {
//账目类型是201 取消订单款且消费明细没有
if (orderAccountBo.getAccountType().equals(AccountTypeEnum.OUT_ORDER_FUND.getCode()) && CollectionUtils.isEmpty(deductions)) {
BigDecimal dameSafeAmount = getDameSafeAmount(data);
feeTypeBo.setNoDeductibleRefundAmount(feeTypeBo.getNoDeductibleRefundAmount().add(dameSafeAmount));
}
}
//遍历消费明细
for (OrderAccountDeduction deduction : deductions) {
BigDecimal deductionAmount = deduction.getAmount();
//违约金
if (DeductionTypeEnum.lateFeeCode.contains(deduction.getType())) {
feeTypeBo.setLateFeeAmount(feeTypeBo.getLateFeeAmount().add(deductionAmount));
//免赔 提前取消违约金
if (deduction.getType().equals(DeductionTypeEnum.VIOLATE_CANCEL.getCode())) {
if (hasDamageSafe) {
BigDecimal dameSafeAmount = getDameSafeAmount(data);
feeTypeBo.setNoDeductibleRefundAmount(feeTypeBo.getNoDeductibleRefundAmount().add(dameSafeAmount));
}
}
}
//违章
if (DeductionTypeEnum.breakRulesRegulationCode.contains(deduction.getType())) {
feeTypeBo.setBreakRulesRegulationAmount(feeTypeBo.getBreakRulesRegulationAmount().add(deductionAmount));
}
//定损
if (DeductionTypeEnum.lossSpecifiedCode.contains(deduction.getType())) {
feeTypeBo.setLossSpecifiedAmount(feeTypeBo.getLossSpecifiedAmount().add(deductionAmount));
}
//其他消费
if (DeductionTypeEnum.consumerCode.contains(deduction.getType())) {
BigDecimal extendAmount = deductionAmount.subtract(accountDetailEntity.getOriginOrderAmount());
if (extendAmount.doubleValue() > 0) {
feeTypeBo.setExtraAmount(feeTypeBo.getExtraAmount().add(extendAmount));
}
}
}
//退款订单金额(不包含免赔和押金)
feeTypeBo.setOrderRefundAmount(feeTypeBo.getOrderRefundAmount().add(accountDetailEntity.getOrderAmount()).subtract(feeTypeBo.getNoDeductibleRefundAmount()));
}
}
return feeTypeBo;
}
/**
* 获取免赔金额
*
* @param data
* @return
*/
public static BigDecimal getDameSafeAmount(JSONObject data) {
if (!data.isEmpty()) {
Object paramJson = data.get(StatisticsStatusEnum.PARMAM_JSON);
JSONObject jsonObject = JSONUtil.parseObj(paramJson);
BigDecimal safeAmount = jsonObject.get(StatisticsStatusEnum.NO_DEDUCTIBLE_AMOUNT, BigDecimal.class);
return safeAmount == null ? BigDecimal.ZERO : safeAmount;
}
return BigDecimal.ZERO;
}
/**
* 创建默认对象
*
* @param date 统计日期
* @param stateGroup 状态
* @param companyMap 公司map
* @param targetObj 目标对象
* @param <T> 目标对象类型
* @return
*/
public static <T extends OrderReceivedStatisticsBase> T wrapStatisticsObject(Date date, String stateGroup, Map<Integer, String> companyMap, T targetObj) {
LocalDate localDate = LocalDate.from(date.toInstant().atZone(ZoneId.systemDefault()));
String year = String.valueOf(localDate.getYear()); String year = String.valueOf(localDate.getYear());
String month = String.format("%s%d", year, localDate.getMonthValue()); String month = String.format("%s%d", year, localDate.getMonthValue());
String weekOfYear = String.format("%s%d", year,localDate.get(WeekFields.of(Locale.CHINESE).weekOfYear())); String weekOfYear = String.format("%s%d", year, localDate.get(WeekFields.of(Locale.CHINESE).weekOfYear()));
String[] status = stateGroup.split("-"); String[] status = stateGroup.split("-");
targetObj.setCrtTime(new Date()); targetObj.setCrtTime(new Date());
targetObj.setCompanyId(Integer.valueOf(status[0])); targetObj.setCompanyId(Integer.valueOf(status[0]));
String companyName = Objects.isNull(companyMap)?COMPANY_DEFAULT: StringUtils.hasText(companyMap.get(targetObj.getCompanyId()))?companyMap.get(targetObj.getCompanyId()):COMPANY_DEFAULT; String companyName = Objects.isNull(companyMap) ? COMPANY_DEFAULT : StringUtils.hasText(companyMap.get(targetObj.getCompanyId())) ? companyMap.get(targetObj.getCompanyId()) : COMPANY_DEFAULT;
targetObj.setCompanyName(companyName); targetObj.setCompanyName(companyName);
targetObj.setHasPay(Integer.valueOf(status[3])); targetObj.setHasPay(Integer.valueOf(status[3]));
targetObj.setOrderOrigin(Integer.valueOf(status[1])); targetObj.setOrderOrigin(Integer.valueOf(status[1]));
...@@ -103,4 +244,24 @@ public enum StatisticsStatusEnum { ...@@ -103,4 +244,24 @@ public enum StatisticsStatusEnum {
targetObj.setStateGroup(stateGroup); targetObj.setStateGroup(stateGroup);
return targetObj; return targetObj;
} }
/**
* 批量插入数据 mysql sql语句默认不能超过4M
*
* @param orderReceivedStatistics
*/
public static <T> void insertReceivedStatisticsBatch(List<T> orderReceivedStatistics, InsertListMapper<T> mapper) {
int orderSize = orderReceivedStatistics.size();
int sqlAdq = orderSize / StatisticsStatusEnum.DEFAULT_SQL_SIZE;
int sqlMod = orderSize % StatisticsStatusEnum.DEFAULT_SQL_SIZE;
sqlAdq = sqlMod == 0 ? sqlAdq : sqlAdq + 1;
for (int i = 0; i < sqlAdq; i++) {
int fromIndex = StatisticsStatusEnum.DEFAULT_SQL_SIZE * i;
int toIndex = StatisticsStatusEnum.DEFAULT_SQL_SIZE * (i + 1);
toIndex = toIndex > orderSize ? orderSize : toIndex;
List<T> orderRentVehicleReceivedStatisticsList = orderReceivedStatistics.subList(fromIndex, toIndex);
mapper.insertList(orderRentVehicleReceivedStatisticsList);
}
}
} }
package com.xxfc.platform.order.entity; package com.xxfc.platform.order.entity;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import org.assertj.core.util.Lists;
import tk.mybatis.mapper.annotation.Version; import tk.mybatis.mapper.annotation.Version;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/** /**
* *
......
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.math.BigDecimal;
/**
* 会员订单统计
*
* @author libin
* @email 18178966185@163.com
* @date 2019-11-08 18:03:42
*/
@Data
@Table(name = "order_member_received_statistics")
public class OrderMemberReceivedStatistics extends OrderReceivedStatisticsBase implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 普通会员订单总额
*/
@Column(name = "toal_common_ammount")
@ApiModelProperty(value = "普通会员订单总额")
private BigDecimal toalCommonAmmount;
/**
* 普通会员订单总量
*/
@Column(name = "total_common_quantity")
@ApiModelProperty(value = "普通会员订单总量")
private Integer totalCommonQuantity;
/**
* 黄金会员订单总额
*/
@Column(name = "total_gold_amount")
@ApiModelProperty(value = "黄金会员订单总额")
private BigDecimal totalGoldAmount;
/**
* 黄金会员订单总量
*/
@Column(name = "total_gold_quantity")
@ApiModelProperty(value = "黄金会员订单总量")
private Integer totalGoldQuantity;
/**
* 钻石会员订单总额
*/
@Column(name = "total_diamond_ammount")
@ApiModelProperty(value = "钻石会员订单总额")
private BigDecimal totalDiamondAmmount;
/**
* 钻石会员订单总量
*/
@Column(name = "total_diamond_quantity")
@ApiModelProperty(value = "钻石会员订单总量")
private Integer totalDiamondQuantity;
}
package com.xxfc.platform.order.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Table;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 全部订单统计
*
* @author libin
* @email 18178966185@163.com
* @date 2019-11-08 18:03:42
*/
@Data
@Table(name = "order_received_statistics")
@ApiModel("订单统计")
public class OrderReceivedStatistics extends OrderReceivedStatisticsBase implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name = "member_amount")
@ApiModelProperty("会员费")
private BigDecimal memberAmount;
@Column(name = "member_refund_amount")
@ApiModelProperty("会员退款费")
private BigDecimal memberRefundAmout;
@Column(name = "member_quantity")
@ApiModelProperty("会员订单量")
private Integer memberQuantity;
@Column(name = "travel_amount")
@ApiModelProperty("旅游费")
private BigDecimal travelAmount;
@Column(name = "travel_refund_amount")
@ApiModelProperty("旅游退款费")
private BigDecimal travelRefundAmount;
@Column(name = "travel_quantity")
@ApiModelProperty("旅游订单量")
private Integer travelQuantity;
@Column(name = "rent_vehicle_amount")
@ApiModelProperty("租车费")
private BigDecimal rentVehicleAmount;
@Column(name = "rent_vehicle_refund_amount")
@ApiModelProperty("租车退款费")
private BigDecimal rentVehicleRefundAmount;
@Column(name = "rent_vehicle_quantity")
@ApiModelProperty("租车订单量")
private Integer rentVehicleQuantity;
@Column(name = "no_deductible_amount")
@ApiModelProperty("不计免赔费")
private BigDecimal noDeductibleAmount;
@Column(name = "no_deductible_refund_amount")
@ApiModelProperty("不计免赔退款费用")
private BigDecimal noDeductibleRefundAmount;
@Column(name = "deposit_amount")
@ApiModelProperty("押金")
private BigDecimal depositAmount;
@Column(name = "deposit_refund_amount")
@ApiModelProperty("押金退款")
private BigDecimal depositRefundAmount;
@Column(name = "break_rules_regulation_amount")
@ApiModelProperty("违章金")
private BigDecimal breakRulesRegulationAmount;
@Column(name = "loss_specified_amount")
@ApiModelProperty("定损金")
private BigDecimal lossSpecifiedAmount;
}
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.math.BigDecimal;
/**
* 租车订单统计
*
* @author libin
* @email 18178966185@163.com
* @date 2019-11-08 18:03:42
*/
@Data
@Table(name = "order_rent_vehicle_received_statistics")
public class OrderRentVehicleReceivedStatistics extends OrderReceivedStatisticsBase implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name = "deposit_amount")
@ApiModelProperty("押金")
private BigDecimal depositAmount;
@Column(name = "deposit_refund_amount")
@ApiModelProperty("押金退款")
private BigDecimal depositRefundAmount;
@Column(name = "break_rules_regulation_amount")
@ApiModelProperty("违章金")
private BigDecimal breakRulesRegulationAmount;
@Column(name = "loss_specified_amount")
@ApiModelProperty("定损金")
private BigDecimal lossSpecifiedAmount;
@Column(name = "no_deductible_amount")
@ApiModelProperty("不计免赔费用")
private BigDecimal noDeductibleAmount;
@Column(name = "no_deductible_refund_amount")
@ApiModelProperty("不计免赔费用")
private BigDecimal noDeductibleRefundAmount;
}
package com.xxfc.platform.order.entity;
import lombok.Data;
import javax.persistence.Table;
import java.io.Serializable;
/**
* 旅游订单统计
*
* @author libin
* @email 18178966185@163.com
* @date 2019-11-08 18:03:42
*/
@Data
@Table(name = "order_tour_received_statistics")
public class OrderTourReceivedStatistics extends OrderReceivedStatisticsBase implements Serializable {
private static final long serialVersionUID = 1L;
}
package com.xxfc.platform.order.entity;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;
@Table(name = "order_vehicle_service_statistics")
@Data
public class OrderVehicleServiceStatistics {
@Id
private Integer id;
@Column(name = "company_id")
private Integer companyId;
/**
* 出车服务次数
*/
@Column(name = "departure_num")
private Integer departureNum;
/**
* 收车服务次数
*/
@Column(name = "arrival_num")
private Integer arrivalNum;
@Column(name = "count_year")
private String countYear;
@Column(name = "count_month")
private String countMonth;
@Column(name = "count_date")
private Date countDate;
@Column(name = "count_week")
private String countWeek;
/**
* 租车使用天数
*/
@Column(name = "rent_num")
private Integer rentNum;
}
\ No newline at end of file
package com.xxfc.platform.order.pojo;
import lombok.Data;
import java.util.Date;
@Data
public class CountVehicleServiceNumVo {
//年
private String countYear;
//年月
private String countMonth;
//年周
private String countWeek;
//天
private String countDay;
//日期
private Date countDate;
//公司ID
private Integer companyId;
//出车服务次数
private Integer departureNum;
//收车服务次数
private Integer arrivalNum;
//租车天数
private Integer rentNum;
}
package com.xxfc.platform.order.pojo.account; package com.xxfc.platform.order.pojo.account;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.xxfc.platform.order.entity.OrderAccount; import com.xxfc.platform.order.entity.OrderAccount;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.util.StringUtils;
import javax.persistence.Column; import javax.persistence.Column;
import javax.persistence.GeneratedValue; import javax.persistence.GeneratedValue;
...@@ -112,6 +114,7 @@ public class OrderAccountDTO implements Serializable { ...@@ -112,6 +114,7 @@ public class OrderAccountDTO implements Serializable {
private String oneDay; private String oneDay;
@Override @Override
public String toString() { public String toString() {
final StringBuffer sb = new StringBuffer("OrderAccountDTO{"); final StringBuffer sb = new StringBuffer("OrderAccountDTO{");
......
package com.xxfc.platform.order.pojo.dto;
import com.github.wxiaoqi.security.common.vo.PageParam;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
import java.util.Date;
/**
* @author libin
* @version 1.0
* @description
* @data 2019/11/23 14:36
*/
@Data
@Builder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
public class CompanyPerformanceFindDTO extends PageParam {
private Date startDate;
private Date endDate;
@ApiModelProperty("统计方式 1:日 2:周 3:月")
@NotNull(message = "统计方式不能为null")
private Integer statisticalWay;
private String companyName;
private Integer companyId;
private String groupFiled;
private long startIndex;
private long endInex;
public long getStartIndex() {
return getPage()==null?0:getPage()==0?0:(getPage()-1)*getLimit();
}
public long getEndInex() {
return getLimit()==null?20:getLimit()==0?20:getLimit();
}
}
...@@ -41,7 +41,7 @@ public class OrderDTO { ...@@ -41,7 +41,7 @@ public class OrderDTO {
/** /**
* 费用其他明细 租车使用 * 费用其他明细 租车使用
*/ */
protected String costDetailExtend; protected String costDetail;
/** /**
* 会员相关 * 会员相关
*/ */
...@@ -55,6 +55,6 @@ public class OrderDTO { ...@@ -55,6 +55,6 @@ public class OrderDTO {
} }
public JSONObject getData() { public JSONObject getData() {
return StringUtils.hasText(costDetailExtend)?JSONUtil.parseObj(costDetailExtend):new JSONObject(); return StringUtils.hasText(costDetail)?JSONUtil.parseObj(costDetail):new JSONObject();
} }
} }
package com.xxfc.platform.order.pojo.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.List;
/**
* @author libin
* @version 1.0
* @description
* @data 2019/11/11 9:49
*/
@Data
@ApiModel("统计查询")
public class OrderReceivedStatisticsFindDTO {
@ApiModelProperty("统计的开始时间 yyyy-MM-dd")
private Date startDate;
@ApiModelProperty("统计的结束时间 yyyy-MM-dd")
private Date endDate;
@ApiModelProperty("统计方式 1:日 2:周 3:月")
@NotNull(message = "统计方式不能为null")
private Integer statisticalWay;
@ApiModelProperty("订单状态 0:未完成 1:已完成")
private Integer orderState;
@ApiModelProperty("订单来源 1:app 2:小程序 3:后台")
private Integer orderOrigin;
@ApiModelProperty("支付方式 1:微信公众号支付 2:支付宝即时到账,3:银联")
private Integer payWay;
@ApiModelProperty("统计项标识")
@NotNull(message = "统计标识不能为null")
private List<String> statisticalSigns;
private List<Integer> companyId;
}
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;
}
package com.xxfc.platform.order.pojo.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.util.Date;
/**
* @author libin
* @version 1.0
* @description
* @data 2019/11/11 10:09
*/
@Data
@Builder(toBuilder = true)
@AllArgsConstructor
@NoArgsConstructor
public class OrderReceivedStatisticsVo {
private String year;
@ApiModelProperty("日期-->日统计方式")
private Date date;
@ApiModelProperty("第几周---->周统计方式")
private String weekOfYear;
@ApiModelProperty("月统计")
private String month;
@ApiModelProperty("订单总额|实际收入|平均收入")
private BigDecimal orderAmount;
@ApiModelProperty("订单总量|订单平均量")
private Integer orderNum;
}
...@@ -13,7 +13,8 @@ import org.springframework.scheduling.annotation.EnableScheduling; ...@@ -13,7 +13,8 @@ import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication(scanBasePackages = { @SpringBootApplication(scanBasePackages = {
"com.xxfc.platform", "com.xxfc.platform",
"com.github.wxiaoqi.security.common.handler", "com.github.wxiaoqi.security.common.handler",
"com.github.wxiaoqi.security.common.log" "com.github.wxiaoqi.security.common.log",
"com.github.wxiaoqi.security.common.support"
}) })
@EnableDiscoveryClient @EnableDiscoveryClient
@EnableScheduling @EnableScheduling
......
...@@ -915,7 +915,7 @@ public class BaseOrderBiz extends BaseBiz<BaseOrderMapper, BaseOrder> implements ...@@ -915,7 +915,7 @@ public class BaseOrderBiz extends BaseBiz<BaseOrderMapper, BaseOrder> implements
return Lists.newArrayList(); return Lists.newArrayList();
} }
public List<OrderDTO> selectOrdersByTypeAndTime(List<Integer> types,Integer hasPay, Date startDate, Date endDate) { public List<OrderDTO> selectOrdersByTypeAndTime(List<Integer> types, Integer hasPay, Date startDate, Date endDate) {
List<OrderDTO> orderDTOS = mapper.selectOrdersByTypeAndTime(types,hasPay,startDate,endDate); List<OrderDTO> orderDTOS = mapper.selectOrdersByTypeAndTime(types,hasPay,startDate,endDate);
return CollectionUtils.isEmpty(orderDTOS)?Collections.EMPTY_LIST:orderDTOS; return CollectionUtils.isEmpty(orderDTOS)?Collections.EMPTY_LIST:orderDTOS;
} }
...@@ -929,6 +929,10 @@ public class BaseOrderBiz extends BaseBiz<BaseOrderMapper, BaseOrder> implements ...@@ -929,6 +929,10 @@ public class BaseOrderBiz extends BaseBiz<BaseOrderMapper, BaseOrder> implements
return mapper.selectAllRentVehicleOrder(paramMap); return mapper.selectAllRentVehicleOrder(paramMap);
} }
public List<OrderPageVO> selectAllCountOrder(Map<String, Object> paramMap) {
return mapper.selectAllCountOrder(paramMap);
}
public List<Achievement> entryStatisticalData(QueryCriteria queryCriteria) { public List<Achievement> entryStatisticalData(QueryCriteria queryCriteria) {
return mapper.selectTotalStatistical(queryCriteria); return mapper.selectTotalStatistical(queryCriteria);
......
package com.xxfc.platform.order.biz;
import cn.hutool.core.date.DateUtil;
import com.github.wxiaoqi.security.common.vo.PageDataVO;
import com.xxfc.platform.order.bo.CompanyPerformanceBo;
import com.xxfc.platform.order.contant.enumerate.ReceivedStatisticsEnum;
import com.xxfc.platform.order.entity.OrderReceivedStatistics;
import com.xxfc.platform.order.pojo.dto.CompanyPerformanceFindDTO;
import com.xxfc.platform.vehicle.feign.VehicleFeign;
import lombok.RequiredArgsConstructor;
import org.apache.commons.collections.CollectionUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;
import javax.servlet.ServletOutputStream;
import java.io.IOException;
import java.util.*;
/**
* @author libin
* @version 1.0
* @description
* @data 2019/11/23 14:48
*/
@Transactional(rollbackFor = Exception.class)
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class CompanyPerformanceBiz {
private final OrderReceivedStatisticsBiz orderReceivedStatisticsBiz;
private final VehicleFeign vehicleFeign;
/**
* 导出数据
*
* @param companyPerformanceFindDTO
* @param outputStream
*/
public void exportOrderReceivedStatisticsData(CompanyPerformanceFindDTO companyPerformanceFindDTO, ServletOutputStream outputStream) throws IOException {
companyPerformanceFindDTO.setPage(null);
companyPerformanceFindDTO.setLimit(null);
//1.查询数据
List<CompanyPerformanceBo> companyPerformanceBos = selectCompanyPerformances(companyPerformanceFindDTO);
//excel相关
XSSFWorkbook hssfWorkbook = new XSSFWorkbook();
XSSFSheet sheet = hssfWorkbook.createSheet("公司业绩统计报表");
Row headerRow = sheet.createRow(0);
CellStyle headerCellStyle = createHeaderCellStyle(hssfWorkbook);
String[] headerValue = {"时间", "公司", "会员费", "租车费","押金","不计免赔费", "旅游费", "租借天数", "出车服务次数", "收车服务次数"};
createHeader(headerRow, 0, headerValue, headerCellStyle);
for (int i = 0; i < headerValue.length; i++) {
sheet.setColumnWidth(i, 24 * 256);
}
//设置数据
CellStyle generalCellStyle = createGeneralCellStyle(hssfWorkbook);
List<String[]> companyStatisticsData = getCompanyStatisticsData(companyPerformanceBos, companyPerformanceFindDTO.getStatisticalWay());
createCompnayStatisticsCellData(sheet, 1, generalCellStyle, companyStatisticsData);
hssfWorkbook.write(outputStream);
hssfWorkbook.close();
}
private void createCompnayStatisticsCellData(Sheet sheet, int startRowIndex, CellStyle cellStyle, List<String[]> staffStatisticsData) {
for (String[] data : staffStatisticsData) {
Row row = sheet.createRow(startRowIndex++);
createCellCount(row, 0, data, cellStyle);
}
}
private void createCellCount(Row row, int CellStartIndex, String[] data, CellStyle cellStyle) {
for (int i = CellStartIndex, y = 0; y < data.length; i++, y++) {
Cell cell = row.createCell(i);
cell.setCellStyle(cellStyle);
cell.setCellValue(data[y]);
}
}
private List<String[]> getCompanyStatisticsData(List<CompanyPerformanceBo> companyPerformanceBos, Integer statisticalWay) {
List<String[]> data = new ArrayList<>(companyPerformanceBos.size());
for (int i = 0; i < companyPerformanceBos.size(); i++) {
String[] companyData = getData(companyPerformanceBos.get(i), statisticalWay);
data.add(companyData);
}
return data;
}
private String[] getData(CompanyPerformanceBo companyPerformanceBo, Integer statisticalWay) {
String dateStr = "";
if (statisticalWay == ReceivedStatisticsEnum.DAY.getWayCode()) {
dateStr = companyPerformanceBo.getDateStr();
}
if (statisticalWay == ReceivedStatisticsEnum.WEEK.getWayCode()) {
dateStr=String.format("%s~%s",companyPerformanceBo.getStartDate(),companyPerformanceBo.getEndDate());
}
if (statisticalWay == ReceivedStatisticsEnum.MONTH.getWayCode()) {
dateStr = companyPerformanceBo.getMonth();
}
return new String[]{
dateStr,
companyPerformanceBo.getCompanyName(),
companyPerformanceBo.getMemberAmount().toString(),
companyPerformanceBo.getRentVehilceAmount().toString(),
companyPerformanceBo.getDepositAmount().toString(),
companyPerformanceBo.getNoDeductibleAmount().toString(),
companyPerformanceBo.getTravelAmount().toString(),
String.valueOf(companyPerformanceBo.getRentDays()),
String.valueOf(companyPerformanceBo.getDepartureNum()),
String.valueOf(companyPerformanceBo.getArrivalNum())};
}
private void createHeader(Row row, int cellStartIndex, String[] header, CellStyle cellStyle) {
for (int i = 0; i < header.length; i++) {
Cell cell = row.createCell(cellStartIndex);
cell.setCellValue(header[i]);
cell.setCellStyle(cellStyle);
cellStartIndex += 1;
}
}
private CellStyle createGeneralCellStyle(XSSFWorkbook hssfWorkbook) {
CellStyle cellStyleGeneral = createHeaderCellStyle(hssfWorkbook);
cellStyleGeneral.setWrapText(true);
XSSFFont generalFont = createFont(hssfWorkbook);
generalFont.setBold(false);
cellStyleGeneral.setFont(generalFont);
return cellStyleGeneral;
}
private CellStyle createHeaderCellStyle(XSSFWorkbook hssfWorkbook) {
XSSFCellStyle cellStyleHeader = hssfWorkbook.createCellStyle();
cellStyleHeader.setAlignment(HorizontalAlignment.CENTER);
cellStyleHeader.setVerticalAlignment(VerticalAlignment.CENTER);
cellStyleHeader.setLocked(false);
XSSFFont headerFont = createFont(hssfWorkbook);
cellStyleHeader.setFont(headerFont);
return cellStyleHeader;
}
private XSSFFont createFont(XSSFWorkbook hssfWorkbook) {
XSSFFont font = hssfWorkbook.createFont();
font.setFontName("黑体");
font.setBold(true);
return font;
}
public List<CompanyPerformanceBo> selectCompanyPerformances(CompanyPerformanceFindDTO companyPerformanceFindDTO){
Map<Integer, String> companyMap = vehicleFeign.findCompanyMap();
List<CompanyPerformanceBo> companyPerformanceBos = new ArrayList<>();
//日统计
if (companyPerformanceFindDTO.getStatisticalWay() == ReceivedStatisticsEnum.DAY.getWayCode()) {
companyPerformanceBos = orderReceivedStatisticsBiz.selectCompanyPerformanceWithDay(companyPerformanceFindDTO);
}
//按周
if (companyPerformanceFindDTO.getStatisticalWay() == ReceivedStatisticsEnum.WEEK.getWayCode()) {
companyPerformanceBos = orderReceivedStatisticsBiz.selectCompanyPerformanceWithWeek(companyPerformanceFindDTO);
}
//按月
if (companyPerformanceFindDTO.getStatisticalWay() == ReceivedStatisticsEnum.MONTH.getWayCode()) {
companyPerformanceBos = orderReceivedStatisticsBiz.selectCompanyPerformanceWithMonth(companyPerformanceFindDTO);
}
if (CollectionUtils.isEmpty(companyPerformanceBos)) {
return companyPerformanceBos;
}
companyPerformanceBos = wrapCompanyPermanceBo(companyPerformanceBos, companyMap, companyPerformanceFindDTO.getStatisticalWay());
return companyPerformanceBos;
}
/**
* 分页查询公司业绩
*
* @param companyPerformanceFindDTO
* @return
*/
public PageDataVO<CompanyPerformanceBo> selectCompanyPerformancePage(CompanyPerformanceFindDTO companyPerformanceFindDTO) {
Map<Integer, String> companyMap = vehicleFeign.findCompanyMap();
PageDataVO<CompanyPerformanceBo> pageDataVO = new PageDataVO<>();
//日统计
if (companyPerformanceFindDTO.getStatisticalWay() == ReceivedStatisticsEnum.DAY.getWayCode()) {
pageDataVO = orderReceivedStatisticsBiz.selectCompanyPerformanceWithDayPage(companyPerformanceFindDTO);
}
//按周
if (companyPerformanceFindDTO.getStatisticalWay() == ReceivedStatisticsEnum.WEEK.getWayCode()) {
pageDataVO = orderReceivedStatisticsBiz.selectCompanyPerformanceWithWeekPage(companyPerformanceFindDTO);
}
//按月
if (companyPerformanceFindDTO.getStatisticalWay() == ReceivedStatisticsEnum.MONTH.getWayCode()) {
pageDataVO = orderReceivedStatisticsBiz.selectCompanyPerformanceWithMonthPage(companyPerformanceFindDTO);
}
List<CompanyPerformanceBo> data = pageDataVO.getData();
if (CollectionUtils.isEmpty(data)) {
return pageDataVO;
}
List<CompanyPerformanceBo> companyPerformanceBos = wrapCompanyPermanceBo(data, companyMap, companyPerformanceFindDTO.getStatisticalWay());
pageDataVO.setData(companyPerformanceBos);
if (companyPerformanceFindDTO.getPage() == 1) {
int totalCount = orderReceivedStatisticsBiz.selectCountByCondition(companyPerformanceFindDTO);
long isZero = totalCount % companyPerformanceFindDTO.getLimit();
long totalPage = isZero == 0 ? totalCount / companyPerformanceFindDTO.getLimit() : totalCount / companyPerformanceFindDTO.getLimit() + 1;
pageDataVO.setTotalCount(Long.valueOf(totalCount));
pageDataVO.setTotalPage(Integer.valueOf(String.valueOf(totalPage)));
}
return pageDataVO;
}
public List<CompanyPerformanceBo> wrapCompanyPermanceBo(List<CompanyPerformanceBo> companyPerformanceBos,Map<Integer,String> companyMap,Integer statisticsWay){
for (CompanyPerformanceBo companyPerformanceBo : companyPerformanceBos) {
String companyName = companyMap == null ? "" : companyMap.get(companyPerformanceBo.getCompanyId());
companyPerformanceBo.setCompanyName(companyName);
if (statisticsWay == ReceivedStatisticsEnum.WEEK.getWayCode()) {
Calendar cal = Calendar.getInstance();
cal.setFirstDayOfWeek(Calendar.MONDAY);
cal.set(Calendar.YEAR, companyPerformanceBo.getYear());
cal.set(Calendar.WEEK_OF_YEAR, Integer.valueOf(companyPerformanceBo.getWeekOfYear().replace("" + companyPerformanceBo.getYear(), "")));
cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek());
Date startDate = cal.getTime();
cal.add(Calendar.DAY_OF_WEEK, 6);
Date endDate = cal.getTime();
companyPerformanceBo.setStartDate(DateUtil.format(startDate,"yyyy.MM.dd"));
companyPerformanceBo.setEndDate(DateUtil.format(endDate,"yyyy.MM.dd"));
companyPerformanceBo.setWeekOfYear(String.format("%s.%s",companyPerformanceBo.getYear()+"",companyPerformanceBo.getWeekOfYear().replace(companyPerformanceBo.getYear()+"","")));
}
if(statisticsWay == ReceivedStatisticsEnum.DAY.getWayCode()) {
companyPerformanceBo.setDateStr(DateUtil.format(companyPerformanceBo.getDate(),"yyyy.MM.dd"));
}
if (statisticsWay == ReceivedStatisticsEnum.MONTH.getWayCode()){
companyPerformanceBo.setMonth(String.format("%s.%s",companyPerformanceBo.getYear()+"",companyPerformanceBo.getMonth().replace(companyPerformanceBo.getYear()+"","")));
}
}
return companyPerformanceBos;
}
}
...@@ -432,10 +432,10 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> { ...@@ -432,10 +432,10 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> {
oad.setDepositAmount(oad.getDepositAmount().subtract(illegalReserve).subtract(csv.getDamagesAmount())); oad.setDepositAmount(oad.getDepositAmount().subtract(illegalReserve).subtract(csv.getDamagesAmount()));
//设置违约金 //设置违约金
//设置原来算出的违约金及描述 //设置原来算出的违约金及描述
csv.setViolateAmount(inProgressVO.getViolateAmount()); csv.setViolateAmount(inProgressVO.getViolateAmount());
csv.setViolateDesc(""); csv.setViolateDesc("");
//处理更改之后的违约金及描述 //处理更改之后的违约金及描述
handleCrosstownDetail(crosstown, oad, csv); handleCrosstownDetail(crosstown, oad, csv);
if(StrUtil.isBlank(csv.getViolateDesc())) { if(StrUtil.isBlank(csv.getViolateDesc())) {
...@@ -444,10 +444,10 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> { ...@@ -444,10 +444,10 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> {
//退款 //退款
BigDecimal refundAmont = oad.getDepositAmount().add(oad.getOrderAmount()); BigDecimal refundAmont = oad.getDepositAmount().add(oad.getOrderAmount());
//crosstown.getRestDeposit().subtract(illegalReserve); //crosstown.getRestDeposit().subtract(illegalReserve);
//原退款的钱 //原退款的钱
BigDecimal originalRefundAmount = oad.getOriginDepositAmount().add(oad.getOriginOrderAmount()); BigDecimal originalRefundAmount = oad.getOriginDepositAmount().add(oad.getOriginOrderAmount());
//crosstown.getRestDeposit().add(crosstown.getDeductionCost()).subtract(illegalReserve); //crosstown.getRestDeposit().add(crosstown.getDeductionCost()).subtract(illegalReserve);
String refundDesc = "退还车辆押金:"+ refundAmont.toString(); String refundDesc = "退还车辆押金:"+ refundAmont.toString();
...@@ -660,7 +660,7 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> { ...@@ -660,7 +660,7 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> {
* @return * @return
*/ */
public List<OrderAccountBo> selectByTypeAndDate(Integer orderType, Date startDate, Date endDate) { public List<OrderAccountBo> selectByTypeAndDate(Integer orderType, Date startDate, Date endDate) {
List<OrderAccountBo> accountBos = mapper.selectOrderAccountByOrderTypeAndStartTimeAndEndTime(orderType,startDate.getTime(),endDate.getTime()); List<OrderAccountBo> accountBos = mapper.selectOrderAccountByOrderTypeAndStartTimeAndEndTime(orderType,startDate.getTime(),endDate.getTime());
return CollectionUtils.isEmpty(accountBos)? Collections.EMPTY_LIST:accountBos; return CollectionUtils.isEmpty(accountBos)? Collections.EMPTY_LIST:accountBos;
} }
......
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.enumconstant.LevelEnum;
import com.google.common.collect.Lists;
import com.xxfc.platform.order.bo.FeeTypeBo;
import com.xxfc.platform.order.contant.enumerate.StatisticsStatusEnum;
import com.xxfc.platform.order.entity.OrderMemberReceivedStatistics;
import com.xxfc.platform.order.mapper.OrderMemberReceivedStatisticsMapper;
import com.xxfc.platform.order.pojo.account.OrderAccountBo;
import com.xxfc.platform.order.pojo.dto.OrderDTO;
import com.xxfc.platform.order.pojo.dto.OrderReceivedStatisticsFindDTO;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.BeanUtils;
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.stream.Collectors;
/**
* 会员订单统计
*
* @author libin
* @email 18178966185@163.com
* @date 2019-11-08 18:03:42
*/
@Service
@Transactional(rollbackFor = Exception.class)
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class OrderMemberReceivedStatisticsBiz extends BaseBiz<OrderMemberReceivedStatisticsMapper, OrderMemberReceivedStatistics> {
private final BaseOrderBiz baseOrderBiz;
private final OrderAccountBiz orderAccountBiz;
/**
* 会员统计查询
*
* @param orderReceivedStatisticsFindDTO
* @return
*/
public List<OrderMemberReceivedStatistics> selectOrderReceivedStatistics(OrderReceivedStatisticsFindDTO orderReceivedStatisticsFindDTO) {
return mapper.selectOrderMemberReceivedStatistics(orderReceivedStatisticsFindDTO);
}
/**
* 会员统计处理
*
* @param startDate 开始时间
* @param endDate 结束时间
* @param companyMap 公司
*/
public List<OrderMemberReceivedStatistics> orderMemberReceivedStatistics(Date startDate, Date endDate, Map<Integer, String> companyMap) {
List<OrderMemberReceivedStatistics> orderMemberReceivedStatisticsList = new ArrayList<>(18);
List<String> stisticsActiveState = new ArrayList<>();
//根据时间范围查询出会员单
List<OrderDTO> orders = baseOrderBiz.selectOrdersByTypeAndTime(Arrays.asList(StatisticsStatusEnum.ORDER_MEMBER_TYPE),null, startDate, endDate);
//数据处理 状态组合 按支付状态分组 而后按组合状态
Map<Boolean, Map<String, List<OrderDTO>>> stateGroupMap = StatisticsStatusEnum.processOrdersWithState(stisticsActiveState, orders);
//订单账目信息
List<OrderAccountBo> orderAccountBoList = orderAccountBiz.selectByTypeAndDate(StatisticsStatusEnum.ORDER_MEMBER_TYPE, startDate, endDate);
//账目数据处理 状态组合
Map<String, List<OrderAccountBo>> orderAccountMap = StatisticsStatusEnum.processOrderAccountsWithState(stisticsActiveState, orderAccountBoList);
//已经支付单
Set<Map.Entry<String, List<OrderAccountBo>>> ordersSet = orderAccountMap.entrySet();
for (Map.Entry<String, List<OrderAccountBo>> orderEntry : ordersSet) {
MemberLevelStatistics memberLevelStatistics = new MemberLevelStatistics();
//状态key
String orderKey = orderEntry.getKey();
//创建默认的会员统计对象
OrderMemberReceivedStatistics orderMemberReceivedStatistics = createDefaultOrderMemberReceivedStatistics();
//设置相关默认值
StatisticsStatusEnum.wrapStatisticsObject(startDate, orderKey, companyMap, orderMemberReceivedStatistics);
//按会员等级分组
Map<LevelEnum, List<OrderAccountBo>> orderMemberLevelMap = orderEntry.getValue().stream().collect(Collectors.groupingBy(OrderDTO::getLevelEnum, Collectors.toList()));
Set<Map.Entry<LevelEnum, List<OrderAccountBo>>> ordermemberLevelentries = orderMemberLevelMap.entrySet();
//遍历
for (Map.Entry<LevelEnum, List<OrderAccountBo>> orderMemberLevelEntry : ordermemberLevelentries) {
//对应状态的订单量
Integer totalQuantity = stateGroupMap == null ?
0 : stateGroupMap.get(Boolean.TRUE).get(orderKey) == null ?
0 : stateGroupMap.get(Boolean.TRUE).get(orderKey).size();
//处理支付金额(支付、退款、违约金)
wrapMemberLevelStatistics(orderMemberLevelEntry.getKey(), orderMemberLevelEntry.getValue(), totalQuantity, memberLevelStatistics);
}
//对应的金额或订单量的复制
BeanUtils.copyProperties(memberLevelStatistics, orderMemberReceivedStatistics);
orderMemberReceivedStatisticsList.add(orderMemberReceivedStatistics);
}
//未支付单
Map<String, List<OrderDTO>> noPayOrdersMap = stateGroupMap == null ?
Collections.EMPTY_MAP : stateGroupMap.get(Boolean.FALSE) == null ?
Collections.EMPTY_MAP : stateGroupMap.get(Boolean.FALSE);
List<OrderMemberReceivedStatistics> noPayOrderMemberReceivedStatisticsList = createNoPayOrderMemberReceivedStatisticsList(startDate, noPayOrdersMap, companyMap);
orderMemberReceivedStatisticsList.addAll(noPayOrderMemberReceivedStatisticsList);
//创建剩余状态数据
List<OrderMemberReceivedStatistics> otherStatisticsStateGroupList = createOtherStatisticsStateGroupList(startDate, stisticsActiveState, companyMap);
orderMemberReceivedStatisticsList.addAll(otherStatisticsStateGroupList);
//保存
StatisticsStatusEnum.insertReceivedStatisticsBatch(orderMemberReceivedStatisticsList, mapper);
return orderMemberReceivedStatisticsList;
}
/**
* memberLevelStatistics 对象包装
*
* @param levelEnum 会员等级
* @param orderAccountBos 账目对象
* @param totalQuantity 对应等级的单量
* @param memberLevelStatistics
* @return
*/
private MemberLevelStatistics wrapMemberLevelStatistics(LevelEnum levelEnum, List<OrderAccountBo> orderAccountBos, Integer totalQuantity, MemberLevelStatistics memberLevelStatistics) {
//获取账目各种费用
FeeTypeBo feeTypeBo = StatisticsStatusEnum.getFeeTyBoByOrderAccounts(orderAccountBos);
BeanUtils.copyProperties(feeTypeBo, memberLevelStatistics);
return wrapMemberLevelStatistics(levelEnum, feeTypeBo.getTotalAmount(), totalQuantity, memberLevelStatistics);
}
/**
* @param startDate 时间
* @param noPayOrdersMap 未支付单map
* @param companyMap 公司map
* @return
*/
private List<OrderMemberReceivedStatistics> createNoPayOrderMemberReceivedStatisticsList(Date startDate, Map<String, List<OrderDTO>> noPayOrdersMap, Map<Integer, String> companyMap) {
List<OrderMemberReceivedStatistics> orderMemberReceivedStatisticsList = new ArrayList<>();
if (noPayOrdersMap == null || noPayOrdersMap.isEmpty()) {
return orderMemberReceivedStatisticsList;
}
Set<Map.Entry<String, List<OrderDTO>>> noPayOrderSet = noPayOrdersMap.entrySet();
for (Map.Entry<String, List<OrderDTO>> noPayOrderEntry : noPayOrderSet) {
MemberLevelStatistics memberLevelStatistics = new MemberLevelStatistics();
//获取状态
String noPayOrderStateGroup = noPayOrderEntry.getKey();
//创建默认的会员订单统计对象
OrderMemberReceivedStatistics orderMemberReceivedStatistics = createDefaultOrderMemberReceivedStatistics();
//设置默认属性值
StatisticsStatusEnum.wrapStatisticsObject(startDate, noPayOrderStateGroup, companyMap, orderMemberReceivedStatistics);
//会员订单按等级分组
Map<LevelEnum, List<OrderDTO>> noPayOrderEntryMap = noPayOrderEntry.getValue().stream().collect(Collectors.groupingBy(OrderDTO::getLevelEnum, Collectors.toList()));
Set<Map.Entry<LevelEnum, List<OrderDTO>>> noPayOrderEntries = noPayOrderEntryMap.entrySet();
//遍历等级分组map
for (Map.Entry<LevelEnum, List<OrderDTO>> orderEntry : noPayOrderEntries) {
//处理金额(支付金额,订单量)
wrapOrderMemberReceivedStatistics(orderEntry.getValue(), orderEntry.getKey(), memberLevelStatistics);
}
//复制对象属性值(对应的等级金额和订单量)
BeanUtils.copyProperties(memberLevelStatistics, orderMemberReceivedStatistics);
orderMemberReceivedStatisticsList.add(orderMemberReceivedStatistics);
}
return orderMemberReceivedStatisticsList;
}
/**
* @param orders 某种状态下的会员单
* @param levelEnum 会员等级
* @param memberLevelStatistics 会员统计对象
* @return
*/
private MemberLevelStatistics wrapOrderMemberReceivedStatistics(List<OrderDTO> orders, LevelEnum levelEnum, MemberLevelStatistics memberLevelStatistics) {
//会员单对应等级的总量
orders = CollectionUtils.isEmpty(orders) ? Collections.EMPTY_LIST : orders;
//会员单对应等级的总金额
BigDecimal totalAmount = orders.stream().map(OrderDTO::getRealAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
return wrapMemberLevelStatistics(levelEnum, totalAmount, orders.size(), memberLevelStatistics);
}
/**
* memberLevelStatistics 对象包装
*
* @param levelEnum 会员等级
* @param amount 订单总额
* @param quantity 订单量
* @param memberLevelStatistics
* @return
*/
private MemberLevelStatistics wrapMemberLevelStatistics(LevelEnum levelEnum, BigDecimal amount, Integer quantity, MemberLevelStatistics memberLevelStatistics) {
switch (levelEnum) {
//普通会员
case GENERAL:
memberLevelStatistics.setToalCommonAmmount(amount);
memberLevelStatistics.setTotalCommonQuantity(quantity);
break;
//黄金会员
case GOLD:
memberLevelStatistics.setTotalGoldAmount(amount);
memberLevelStatistics.setTotalGoldQuantity(quantity);
break;
//钻石会员
case DIAMOND:
memberLevelStatistics.setTotalDiamondAmmount(amount);
memberLevelStatistics.setTotalDiamondQuantity(quantity);
break;
default:
break;
}
return memberLevelStatistics;
}
/**
* 创建剩余状态数据
*
* @param startDate 时间
* @param statisticsStateGroups 状态组合 集合
* @param companyMap 公司
* @return
*/
private List<OrderMemberReceivedStatistics> createOtherStatisticsStateGroupList(Date startDate, List<String> statisticsStateGroups, Map<Integer, String> companyMap) {
List<OrderMemberReceivedStatistics> orderMemberReceivedStatisticsList = new ArrayList<>();
//获取剩余状态组合
List<Integer> companyIds = Objects.isNull(companyMap) ? Collections.EMPTY_LIST : Lists.newArrayList(companyMap.keySet());
List<String> otherStatisticsStateGroup = StatisticsStatusEnum.getOtherStatisticsStateGroup(companyIds, statisticsStateGroups);
//创建会员克隆统计对象
OrderMemberReceivedStatistics orderMemberReceivedStatistics = createDefaultOrderMemberReceivedStatistics();
//统计对象的生成
otherStatisticsStateGroup.stream().peek(stateGroup -> {
OrderMemberReceivedStatistics orderMemberReceivedStatisticsClone = StatisticsStatusEnum.wrapStatisticsObject(startDate, stateGroup, companyMap,
ObjectUtil.clone(orderMemberReceivedStatistics));
orderMemberReceivedStatisticsList.add(orderMemberReceivedStatisticsClone);
}).count();
return orderMemberReceivedStatisticsList;
}
/**
* 创建默认的会员订单统计对象
*
* @return
*/
private OrderMemberReceivedStatistics createDefaultOrderMemberReceivedStatistics() {
OrderMemberReceivedStatistics orderMemberReceivedStatistics = new OrderMemberReceivedStatistics();
orderMemberReceivedStatistics.setTotalCommonQuantity(0);
orderMemberReceivedStatistics.setToalCommonAmmount(BigDecimal.ZERO);
orderMemberReceivedStatistics.setTotalGoldQuantity(0);
orderMemberReceivedStatistics.setTotalGoldAmount(BigDecimal.ZERO);
orderMemberReceivedStatistics.setTotalDiamondQuantity(0);
orderMemberReceivedStatistics.setTotalDiamondAmmount(BigDecimal.ZERO);
return orderMemberReceivedStatistics;
}
@Data
@NoArgsConstructor
private class MemberLevelStatistics {
private BigDecimal toalCommonAmmount = BigDecimal.ZERO;
private Integer totalCommonQuantity = new Integer(0);
private BigDecimal totalGoldAmount = BigDecimal.ZERO;
private Integer totalGoldQuantity = new Integer(0);
private BigDecimal totalDiamondAmmount = BigDecimal.ZERO;
private Integer totalDiamondQuantity = new Integer(0);
private BigDecimal totalAmount;
private Integer totalQuantity;
/**
* 违约金
*/
private BigDecimal lateFeeAmount = BigDecimal.ZERO;
/**
* 订单退款金额
*/
private BigDecimal orderRefundAmount = BigDecimal.ZERO;
public BigDecimal getTotalAmount() {
return toalCommonAmmount.add(totalGoldAmount).add(totalDiamondAmmount);
}
public Integer getTotalQuantity() {
return totalCommonQuantity + totalGoldQuantity + totalDiamondQuantity;
}
}
}
\ No newline at end of file
package com.xxfc.platform.order.biz;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.github.wxiaoqi.security.common.biz.BaseBiz;
import com.github.wxiaoqi.security.common.vo.PageDataVO;
import com.google.common.collect.Lists;
import com.xxfc.platform.order.bo.CompanyPerformanceBo;
import com.xxfc.platform.order.contant.enumerate.*;
import com.xxfc.platform.order.entity.*;
import com.xxfc.platform.order.mapper.OrderReceivedStatisticsMapper;
import com.xxfc.platform.order.pojo.dto.CompanyPerformanceFindDTO;
import com.xxfc.platform.order.pojo.dto.OrderReceivedStatisticsFindDTO;
import com.xxfc.platform.order.pojo.vo.OrderReceivedStatisticsVo;
import lombok.RequiredArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.ServletOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
/**
* 全部订单统计
*
* @author libin
* @email 18178966185@163.com
* @date 2019-11-08 18:03:42
*/
@Service
@Transactional(rollbackFor = Exception.class)
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class OrderReceivedStatisticsBiz extends BaseBiz<OrderReceivedStatisticsMapper, OrderReceivedStatistics> implements InitializingBean {
private final OrderRentVehicleReceivedStatisticsBiz orderRentVehicleReceivedStatisticsBiz;
private final OrderTourReceivedStatisticsBiz orderTourReceivedStatisticsBiz;
private final OrderMemberReceivedStatisticsBiz orderMemberReceivedStatisticsBiz;
private List<String> orderSigns;
private List<String> orderMemberSigns;
private List<String> orderRentVehicleSigns;
private List<String> orderTourSigns;
private Map<String, String> signAndDescMap;
private DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
/**
* 公司业绩(按日统计)
*
* @param companyPerformanceFindDTO
* @return
*/
public PageDataVO<CompanyPerformanceBo> selectCompanyPerformanceWithDayPage(CompanyPerformanceFindDTO companyPerformanceFindDTO) {
List<CompanyPerformanceBo> companyPerformanceBos = mapper.selectCompanyPerformanceWithDay(companyPerformanceFindDTO);
PageDataVO<CompanyPerformanceBo> pageDataVO = new PageDataVO<>();
pageDataVO.setData(companyPerformanceBos);
return pageDataVO;
/* return PageDataVO.pageInfo(companyPerformanceFindDTO.getPage(), companyPerformanceFindDTO.getLimit(),
() -> mapper.selectCompanyPerformanceWithDay(companyPerformanceFindDTO));*/
}
public List<CompanyPerformanceBo> selectCompanyPerformanceWithDay(CompanyPerformanceFindDTO companyPerformanceFindDTO) {
List<CompanyPerformanceBo> companyPerformanceBos = mapper.selectCompanyPerformanceWithDay(companyPerformanceFindDTO);
return CollectionUtils.isEmpty(companyPerformanceBos) ? Collections.EMPTY_LIST : companyPerformanceBos;
}
/**
* 公司业绩(按月统计)
*
* @param companyPerformanceFindDTO
* @return
*/
public PageDataVO<CompanyPerformanceBo> selectCompanyPerformanceWithMonthPage(CompanyPerformanceFindDTO companyPerformanceFindDTO) {
/* return PageDataVO.pageInfo(companyPerformanceFindDTO.getPage(), companyPerformanceFindDTO.getLimit(),
() -> mapper.selectCompanyPerformanceWithMonth(companyPerformanceFindDTO));*/
List<CompanyPerformanceBo> companyPerformanceBos = mapper.selectCompanyPerformanceWithMonth(companyPerformanceFindDTO);
PageDataVO<CompanyPerformanceBo> pageDataVO = new PageDataVO<>();
pageDataVO.setData(companyPerformanceBos);
return pageDataVO;
}
public List<CompanyPerformanceBo> selectCompanyPerformanceWithMonth(CompanyPerformanceFindDTO companyPerformanceFindDTO) {
List<CompanyPerformanceBo> companyPerformanceBos = mapper.selectCompanyPerformanceWithMonth(companyPerformanceFindDTO);
return CollectionUtils.isEmpty(companyPerformanceBos) ? Collections.EMPTY_LIST : companyPerformanceBos;
}
/**
* 公司业绩(按周统计)
*
* @param companyPerformanceFindDTO
* @return
*/
public PageDataVO<CompanyPerformanceBo> selectCompanyPerformanceWithWeekPage(CompanyPerformanceFindDTO companyPerformanceFindDTO) {
/*return PageDataVO.pageInfo(companyPerformanceFindDTO.getPage(), companyPerformanceFindDTO.getLimit(),
() -> mapper.selectCompanyPerformanceWithWeek(companyPerformanceFindDTO));*/
List<CompanyPerformanceBo> companyPerformanceBos = mapper.selectCompanyPerformanceWithWeek(companyPerformanceFindDTO);
PageDataVO<CompanyPerformanceBo> pageDataVO = new PageDataVO<>();
pageDataVO.setData(companyPerformanceBos);
return pageDataVO;
}
public List<CompanyPerformanceBo> selectCompanyPerformanceWithWeek(CompanyPerformanceFindDTO companyPerformanceFindDTO) {
List<CompanyPerformanceBo> companyPerformanceBos = mapper.selectCompanyPerformanceWithWeek(companyPerformanceFindDTO);
return CollectionUtils.isEmpty(companyPerformanceBos) ? Collections.EMPTY_LIST : companyPerformanceBos;
}
/**
* 订单统计数据导出
*
* @param orderReceivedStatisticsFindDTO
* @param outputStream
*/
public void exportOrderReceivedStatisticsData(OrderReceivedStatisticsFindDTO orderReceivedStatisticsFindDTO, ServletOutputStream outputStream) throws IOException {
Map<String, List<OrderReceivedStatisticsVo>> orderReceivedStatisticsResult = getOrderReceivedStatisticsResult(orderReceivedStatisticsFindDTO);
XSSFWorkbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("订单统计");
Row headerRow = sheet.createRow(0);
//标题样式
CellStyle headerCellStyle = createCellStyle(workbook, true);
//创建标题
createHeader(headerRow, headerCellStyle, orderReceivedStatisticsFindDTO.getStatisticalSigns());
//创建数据样式
CellStyle dataCellStyle = createCellStyle(workbook, false);
createData(orderReceivedStatisticsResult, orderReceivedStatisticsFindDTO.getStatisticalWay(), orderReceivedStatisticsFindDTO.getStatisticalSigns(), sheet, 1, dataCellStyle);
workbook.write(outputStream);
workbook.close();
}
private void createData(Map<String, List<OrderReceivedStatisticsVo>> data, Integer statisticalWay, List<String> signs, Sheet sheet, int rowIndex, CellStyle cellStyle) {
//自然排序
Collections.sort(signs);
int size = data.get(signs.get(0)).size();
for (int i = 0; i < size; i++) {
Row dataRow = sheet.createRow(rowIndex++);
Cell firstCell = dataRow.createCell(0);
firstCell.setCellStyle(cellStyle);
for (int cellIndex = 1; cellIndex <= signs.size(); cellIndex++) {
Cell dataCell = dataRow.createCell(cellIndex);
dataCell.setCellStyle(cellStyle);
String sign = signs.get(cellIndex - 1);
List<OrderReceivedStatisticsVo> orderReceivedStatisticsVos = data.get(sign);
if (CollectionUtils.isEmpty(orderReceivedStatisticsVos) || i > orderReceivedStatisticsVos.size()) {
continue;
}
OrderReceivedStatisticsVo orderReceivedStatisticsVo = orderReceivedStatisticsVos.get(i);
if (sign.endsWith("q")) {
dataCell.setCellValue(String.valueOf(orderReceivedStatisticsVo.getOrderNum()));
}
if (sign.endsWith("a")) {
dataCell.setCellValue(String.valueOf(orderReceivedStatisticsVo.getOrderAmount()));
}
if (cellIndex == 1) {
if (ReceivedStatisticsEnum.DAY.getWayCode() == statisticalWay) {
firstCell.setCellValue(DateUtil.format(orderReceivedStatisticsVo.getDate(), "yyyy.MM.dd"));
}
if (ReceivedStatisticsEnum.WEEK.getWayCode() == statisticalWay) {
LocalDate localDate = LocalDate.of(Integer.valueOf(orderReceivedStatisticsVo.getYear()), Integer.valueOf(orderReceivedStatisticsVo.getMonth().replace(orderReceivedStatisticsVo.getYear(), "")), 1);
int dayOfYear = localDate.getDayOfYear();
int days = Integer.valueOf(orderReceivedStatisticsVo.getWeekOfYear().replace(orderReceivedStatisticsVo.getYear(), "")) * 7;
int betweenDays = days - dayOfYear;
LocalDate endLocalDate = localDate.withDayOfMonth(betweenDays);
LocalDate startLocalDate = endLocalDate.minusDays(6);
String startDateStr = startLocalDate.format(dateTimeFormatter);
String endDateStr = endLocalDate.format(dateTimeFormatter);
firstCell.setCellValue(String.format("%s~%s", startDateStr, endDateStr));
}
if (ReceivedStatisticsEnum.MONTH.getWayCode() == statisticalWay) {
StringBuilder sb = new StringBuilder(orderReceivedStatisticsVo.getMonth());
sb.insert(4, ".");
firstCell.setCellValue(sb.toString());
}
}
}
}
}
private void createHeader(Row row, CellStyle cellStyle, List<String> signs) {
//自然排序
Collections.sort(signs);
Cell firstCell = row.createCell(0);
firstCell.setCellValue("时间");
firstCell.setCellStyle(cellStyle);
for (int i = 1; i <= signs.size(); i++) {
Cell cell = row.createCell(i);
cell.setCellValue(signAndDescMap.get(signs.get(i - 1)));
cell.setCellStyle(cellStyle);
}
}
private CellStyle createCellStyle(Workbook workbook, boolean bold) {
CellStyle cellStyle = workbook.createCellStyle();
Font font = createFont(workbook, bold);
cellStyle.setFont(font);
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
cellStyle.setAlignment(HorizontalAlignment.CENTER);
return cellStyle;
}
private Font createFont(Workbook workbook, boolean bold) {
Font font = workbook.createFont();
font.setFontName("黑体");
font.setBold(bold);
font.setBold(true);
return font;
}
/**
* 获取订单统计数据
*
* @param orderReceivedStatisticsFindDTO
* @return
*/
public Map<String, List<OrderReceivedStatisticsVo>> getOrderReceivedStatisticsResult(OrderReceivedStatisticsFindDTO orderReceivedStatisticsFindDTO) {
Map<String, List<OrderReceivedStatisticsVo>> resultMap = new HashMap<>();
List<String> statisticalSigns = orderReceivedStatisticsFindDTO.getStatisticalSigns();
//订单统计
Map<String, List<OrderReceivedStatisticsVo>> orderReceivedStatisticsMap = orderReceivedStatistics(orderReceivedStatisticsFindDTO, statisticalSigns);
//租车订单统计
Map<String, List<OrderReceivedStatisticsVo>> orderRentVehicleReceivedStatisticsMap = orderRentVehicleRceicedStatistics(orderReceivedStatisticsFindDTO, statisticalSigns);
//旅游订单统计
Map<String, List<OrderReceivedStatisticsVo>> orderTourReceivedStatisticsMap = orderTourReceivedStatistcs(orderReceivedStatisticsFindDTO, statisticalSigns);
//会员订单统计
Map<String, List<OrderReceivedStatisticsVo>> orderMemberReceivedStatisticsMap = orderMemberReceivedStatistics(orderReceivedStatisticsFindDTO, statisticalSigns);
resultMap.putAll(orderReceivedStatisticsMap);
resultMap.putAll(orderRentVehicleReceivedStatisticsMap);
resultMap.putAll(orderTourReceivedStatisticsMap);
resultMap.putAll(orderMemberReceivedStatisticsMap);
return resultMap;
}
/**
* 统计汇总
*
* @param orderMemberReceivedStatistics
* @param orderTourReceivedStatistics
* @param orderRentVehicleReceivedStatistics
*/
public void orderReceivedStatistics(List<OrderMemberReceivedStatistics> orderMemberReceivedStatistics,
List<OrderTourReceivedStatistics> orderTourReceivedStatistics,
List<OrderRentVehicleReceivedStatistics> orderRentVehicleReceivedStatistics, Date date) {
List<OrderReceivedStatistics> orderReceivedStatisticsList = new ArrayList<>();
Map<String, List<OrderMemberReceivedStatistics>> memberMap = orderMemberReceivedStatistics.stream().collect(Collectors.groupingBy(OrderMemberReceivedStatistics::getStateGroup, Collectors.toList()));
Map<String, List<OrderTourReceivedStatistics>> tourMap = orderTourReceivedStatistics.stream().collect(Collectors.groupingBy(OrderTourReceivedStatistics::getStateGroup, Collectors.toList()));
Map<String, List<OrderRentVehicleReceivedStatistics>> rentVehicleMap = orderRentVehicleReceivedStatistics.stream().collect(Collectors.groupingBy(OrderRentVehicleReceivedStatistics::getStateGroup, Collectors.toList()));
OrderReceivedStatistics orderReceivedStatistics = new OrderReceivedStatistics();
Set<Map.Entry<String, List<OrderRentVehicleReceivedStatistics>>> rentVehicleSet = rentVehicleMap.entrySet();
for (Map.Entry<String, List<OrderRentVehicleReceivedStatistics>> rentVehicleEntry : rentVehicleSet) {
String stateGroup = rentVehicleEntry.getKey();
List<OrderRentVehicleReceivedStatistics> rentVehicleEntryValue = rentVehicleEntry.getValue();
//创建默认的订单统计对象并设置默认值
OrderReceivedStatistics orderReceivedStatisticsClone = StatisticsStatusEnum.wrapStatisticsObject(date, stateGroup, Collections.EMPTY_MAP, ObjectUtil.clone(orderReceivedStatistics));
//租车单
OrderRentVehicleReceivedStatistics orderRentVehicle = rentVehicleEntryValue.get(0);
//会员单
OrderMemberReceivedStatistics orderMember = memberMap.get(stateGroup).get(0);
//旅游单
OrderTourReceivedStatistics orderTour = tourMap.get(stateGroup).get(0);
//公司id
orderReceivedStatisticsClone.setCompanyId(orderRentVehicle.getCompanyId());
//公司名称
orderReceivedStatisticsClone.setCompanyName(orderRentVehicle.getCompanyName());
//押金
orderReceivedStatisticsClone.setDepositAmount(orderRentVehicle.getDepositAmount());
//退款押金
orderReceivedStatisticsClone.setDepositRefundAmount(orderRentVehicle.getDepositRefundAmount());
//定损
orderReceivedStatisticsClone.setLossSpecifiedAmount(orderRentVehicle.getLossSpecifiedAmount());
//违章
orderReceivedStatisticsClone.setBreakRulesRegulationAmount(orderRentVehicle.getBreakRulesRegulationAmount());
//免赔退款金额
orderReceivedStatisticsClone.setNoDeductibleRefundAmount(orderRentVehicle.getNoDeductibleRefundAmount());
//免赔金额
orderReceivedStatisticsClone.setNoDeductibleAmount(orderRentVehicle.getNoDeductibleAmount());
//旅游订单总额
orderReceivedStatisticsClone.setTravelAmount(orderTour.getTotalAmount());
orderReceivedStatisticsClone.setTravelRefundAmount(orderTour.getOrderRefundAmount());
//会员订单总额
orderReceivedStatisticsClone.setMemberAmount(orderMember.getTotalAmount());
orderReceivedStatisticsClone.setMemberRefundAmout(orderMember.getOrderRefundAmount());
//租车订单总额
orderReceivedStatisticsClone.setRentVehicleAmount(orderRentVehicle.getTotalAmount());
orderReceivedStatisticsClone.setRentVehicleRefundAmount(orderRentVehicle.getOrderRefundAmount());
//合计订单总额
BigDecimal totalAmount = orderRentVehicle.getTotalAmount().add(orderTour.getTotalAmount()).add(orderMember.getTotalAmount());
//合计订单退款总额
BigDecimal totalRefundAmount = orderRentVehicle.getOrderRefundAmount().add(orderTour.getOrderRefundAmount()).add(orderMember.getOrderRefundAmount());
//合计订单违约金
BigDecimal lateFeeAmount = orderRentVehicle.getLateFeeAmount().add(orderTour.getLateFeeAmount()).add(orderMember.getLateFeeAmount());
//合计额外费用
BigDecimal totalExtraAmount = orderRentVehicle.getExtraAmount().add(orderMember.getExtraAmount()).add(orderTour.getExtraAmount());
//会员订单量
orderReceivedStatisticsClone.setMemberQuantity(orderMember.getTotalQuantity());
//旅游订单量
orderReceivedStatisticsClone.setTravelQuantity(orderTour.getTotalQuantity());
//租车订单量
orderReceivedStatisticsClone.setRentVehicleQuantity(orderRentVehicle.getTotalQuantity());
//合计订单量
Integer totalQuantity = orderRentVehicle.getTotalQuantity() + (orderTour.getTotalQuantity()) + orderMember.getTotalQuantity();
orderReceivedStatisticsClone.setExtraAmount(totalExtraAmount);
orderReceivedStatisticsClone.setLateFeeAmount(lateFeeAmount);
orderReceivedStatisticsClone.setTotalAmount(totalAmount);
orderReceivedStatisticsClone.setOrderRefundAmount(totalRefundAmount);
orderReceivedStatisticsClone.setTotalQuantity(totalQuantity);
orderReceivedStatisticsList.add(orderReceivedStatisticsClone);
}
//保存
StatisticsStatusEnum.insertReceivedStatisticsBatch(orderReceivedStatisticsList, mapper);
}
/**
* 订单统计
*
* @param orderReceivedStatisticsFindDTO
* @param statisticalSigns
* @return
*/
private Map<String, List<OrderReceivedStatisticsVo>> orderReceivedStatistics(OrderReceivedStatisticsFindDTO orderReceivedStatisticsFindDTO, List<String> statisticalSigns) {
if (CollectionUtil.containsAny(statisticalSigns, orderSigns)) {
List<OrderReceivedStatistics> orderReceivedStatisticsList = selectOrderReceivedStatistics(orderReceivedStatisticsFindDTO);
//日 周 月 的统计
Map<Object, List<OrderReceivedStatisticsBase>> orderstatisticsMap = ReceivedStatisticsEnum.orderstatistics(orderReceivedStatisticsList, orderReceivedStatisticsFindDTO.getStatisticalWay());
//统计项
Map<String, List<OrderReceivedStatisticsVo>> orderReceivedStatisticsMap = OrderReceivedStatisticsSignEnum.orderReceivedStatistics(orderstatisticsMap, retainAll(orderSigns, statisticalSigns));
return orderReceivedStatisticsMap.isEmpty() ? Collections.EMPTY_MAP : orderReceivedStatisticsMap;
}
return Collections.EMPTY_MAP;
}
/**
* 租车统计
*
* @param orderReceivedStatisticsFindDTO
* @param statisticalSigns
* @return
*/
private Map<String, List<OrderReceivedStatisticsVo>> orderRentVehicleRceicedStatistics(OrderReceivedStatisticsFindDTO orderReceivedStatisticsFindDTO, List<String> statisticalSigns) {
if (CollectionUtil.containsAny(statisticalSigns, orderRentVehicleSigns)) {
List<OrderRentVehicleReceivedStatistics> orderRentVehicleReceivedStatisticsList = orderRentVehicleReceivedStatisticsBiz.selectOrderReceivedStatistics(orderReceivedStatisticsFindDTO);
//日 周 月 的统计
Map<Object, List<OrderReceivedStatisticsBase>> orderRentVehiclestatisticsMap = ReceivedStatisticsEnum.orderstatistics(orderRentVehicleReceivedStatisticsList, orderReceivedStatisticsFindDTO.getStatisticalWay());
//统计项
Map<String, List<OrderReceivedStatisticsVo>> orderRentVehicleReceivedStatisticsMap = OrderRentVehicleReceivedStatisticsSignEnum.orderMemberstatisticsMap(orderRentVehiclestatisticsMap, retainAll(orderRentVehicleSigns, statisticalSigns));
return orderRentVehicleReceivedStatisticsMap.isEmpty() ? Collections.EMPTY_MAP : orderRentVehicleReceivedStatisticsMap;
}
return Collections.EMPTY_MAP;
}
/**
* 旅游统计
*
* @param orderReceivedStatisticsFindDTO
* @param statisticalSigns
* @return
*/
private Map<String, List<OrderReceivedStatisticsVo>> orderTourReceivedStatistcs(OrderReceivedStatisticsFindDTO orderReceivedStatisticsFindDTO, List<String> statisticalSigns) {
if (CollectionUtil.containsAny(statisticalSigns, orderTourSigns)) {
List<OrderTourReceivedStatistics> orderTourReceivedStatisticsList = orderTourReceivedStatisticsBiz.selectOrderReceivedStatistics(orderReceivedStatisticsFindDTO);
//日 周 月 的统计
Map<Object, List<OrderReceivedStatisticsBase>> orderTourstatisticsMap = ReceivedStatisticsEnum.orderstatistics(orderTourReceivedStatisticsList, orderReceivedStatisticsFindDTO.getStatisticalWay());
//统计项
Map<String, List<OrderReceivedStatisticsVo>> orderTourReceivedStatisticsMap = OrderTourReceivedStatisticsSignEnum.orderMemberstatisticsMap(orderTourstatisticsMap, retainAll(orderTourSigns, statisticalSigns));
return orderTourReceivedStatisticsMap.isEmpty() ? Collections.EMPTY_MAP : orderTourReceivedStatisticsMap;
}
return Collections.EMPTY_MAP;
}
/**
* 会员统计
*
* @param orderReceivedStatisticsFindDTO
* @param statisticalSigns
* @return
*/
private Map<String, List<OrderReceivedStatisticsVo>> orderMemberReceivedStatistics(OrderReceivedStatisticsFindDTO orderReceivedStatisticsFindDTO, List<String> statisticalSigns) {
if (CollectionUtil.containsAny(statisticalSigns, orderMemberSigns)) {
List<OrderMemberReceivedStatistics> orderMemberReceivedStatisticsList = orderMemberReceivedStatisticsBiz.selectOrderReceivedStatistics(orderReceivedStatisticsFindDTO);
//日 周 月 的统计
Map<Object, List<OrderReceivedStatisticsBase>> orderMemberstatisticsMap = ReceivedStatisticsEnum.orderstatistics(orderMemberReceivedStatisticsList, orderReceivedStatisticsFindDTO.getStatisticalWay());
//统计项
Map<String, List<OrderReceivedStatisticsVo>> orderMemberReceivedStatisticsMap = OrderMemberReceivedStatisticsSignEnum.orderMemberstatisticsMap(orderMemberstatisticsMap, retainAll(orderMemberSigns, statisticalSigns));
return orderMemberReceivedStatisticsMap.isEmpty() ? Collections.EMPTY_MAP : orderMemberReceivedStatisticsMap;
}
return Collections.EMPTY_MAP;
}
private List<OrderReceivedStatistics> selectOrderReceivedStatistics(OrderReceivedStatisticsFindDTO orderReceivedStatisticsFindDTO) {
return mapper.selectOrderReceivedStatisticsList(orderReceivedStatisticsFindDTO);
}
public int selectCountByCondition(CompanyPerformanceFindDTO companyPerformanceFindDTO) {
if (companyPerformanceFindDTO.getStatisticalWay() == ReceivedStatisticsEnum.DAY.getWayCode()) {
return mapper.selectCountByDate(companyPerformanceFindDTO);
}
if (companyPerformanceFindDTO.getStatisticalWay() == ReceivedStatisticsEnum.MONTH.getWayCode()) {
return mapper.selectCountByMonth(companyPerformanceFindDTO);
}
if (companyPerformanceFindDTO.getStatisticalWay() == ReceivedStatisticsEnum.WEEK.getWayCode()) {
return mapper.selectCountByWeekOfYear(companyPerformanceFindDTO);
}
return 0;
}
/**
* 取两个集合的交集
*
* @param source
* @param target
* @return
*/
private List<String> retainAll(List<String> source, List<String> target) {
ArrayList<String> sourceBak = Lists.newArrayList(source);
sourceBak.retainAll(target);
return sourceBak;
}
@Override
public void afterPropertiesSet() throws Exception {
signAndDescMap = new HashMap<>();
orderSigns = EnumSet.allOf(OrderReceivedStatisticsSignEnum.class).stream().map(OrderReceivedStatisticsSignEnum::getSign).collect(Collectors.toList());
Map<String, String> orderSignAndDescMap = EnumSet.allOf(OrderReceivedStatisticsSignEnum.class).stream().collect(Collectors.toMap(OrderReceivedStatisticsSignEnum::getSign, OrderReceivedStatisticsSignEnum::getDesc));
signAndDescMap.putAll(orderSignAndDescMap);
orderMemberSigns = EnumSet.allOf(OrderMemberReceivedStatisticsSignEnum.class).stream().map(OrderMemberReceivedStatisticsSignEnum::getSign).collect(Collectors.toList());
Map<String, String> orderMemberSignAndDescMap = EnumSet.allOf(OrderMemberReceivedStatisticsSignEnum.class).stream().collect(Collectors.toMap(OrderMemberReceivedStatisticsSignEnum::getSign, OrderMemberReceivedStatisticsSignEnum::getDesc));
signAndDescMap.putAll(orderMemberSignAndDescMap);
orderRentVehicleSigns = EnumSet.allOf(OrderRentVehicleReceivedStatisticsSignEnum.class).stream().map(OrderRentVehicleReceivedStatisticsSignEnum::getSign).collect(Collectors.toList());
Map<String, String> orderRentVehicleSignAndDescMap = EnumSet.allOf(OrderRentVehicleReceivedStatisticsSignEnum.class).stream().collect(Collectors.toMap(OrderRentVehicleReceivedStatisticsSignEnum::getSign, OrderRentVehicleReceivedStatisticsSignEnum::getDesc));
signAndDescMap.putAll(orderRentVehicleSignAndDescMap);
orderTourSigns = EnumSet.allOf(OrderTourReceivedStatisticsSignEnum.class).stream().map(OrderTourReceivedStatisticsSignEnum::getSign).collect(Collectors.toList());
Map<String, String> orderTourSignAndDescMap = EnumSet.allOf(OrderTourReceivedStatisticsSignEnum.class).stream().collect(Collectors.toMap(OrderTourReceivedStatisticsSignEnum::getSign, OrderTourReceivedStatisticsSignEnum::getDesc));
signAndDescMap.putAll(orderTourSignAndDescMap);
}
}
\ No newline at end of file
package com.xxfc.platform.order.biz;
import cn.hutool.core.util.ObjectUtil;
import com.github.wxiaoqi.security.common.biz.BaseBiz;
import com.google.common.collect.Lists;
import com.xxfc.platform.order.bo.FeeTypeBo;
import com.xxfc.platform.order.contant.enumerate.StatisticsStatusEnum;
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.dto.OrderDTO;
import com.xxfc.platform.order.pojo.dto.OrderReceivedStatisticsFindDTO;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
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.Supplier;
import java.util.stream.Stream;
/**
* 租车订单统计
*
* @author libin
* @email 18178966185@163.com
* @date 2019-11-08 18:03:42
*/
@Service
@Transactional(rollbackFor = Exception.class)
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class OrderRentVehicleReceivedStatisticsBiz extends BaseBiz<OrderRentVehicleReceivedStatisticsMapper, OrderRentVehicleReceivedStatistics> {
private final BaseOrderBiz baseOrderBiz;
private final OrderAccountBiz orderAccountBiz;
/**
* 租车统计查询
*
* @param orderReceivedStatisticsFindDTO
* @return
*/
public List<OrderRentVehicleReceivedStatistics> selectOrderReceivedStatistics(OrderReceivedStatisticsFindDTO orderReceivedStatisticsFindDTO) {
return mapper.selectOrderRentVehicleReceivedStatistics(orderReceivedStatisticsFindDTO);
}
/**
* 租车统计处理
*
* @param startDate 开始时间
* @param endDate 结束时间
* @param companyMap 公司
*/
public List<OrderRentVehicleReceivedStatistics> orderRentVehicleReceivedStatistics(Date startDate, Date endDate, Map<Integer, String> companyMap) {
List<OrderRentVehicleReceivedStatistics> orderRentVehicleReceivedStatisticsList = new ArrayList<>();
List<String> stisticsActiveState = new ArrayList<>();
//根据租车订单类型 时间查询
List<OrderDTO> orderDTOS = baseOrderBiz.selectOrdersByTypeAndTime(Arrays.asList(StatisticsStatusEnum.ORDER_RENT_VEHICLE_TYPE),null, startDate, endDate);
//数据处理 状态组合 按支付状态分组 而后按组合状态
Map<Boolean, Map<String, List<OrderDTO>>> stateGroupMap = StatisticsStatusEnum.processOrdersWithState(stisticsActiveState, orderDTOS);
//订单账目信息
List<OrderAccountBo> orderAccountBoList = orderAccountBiz.selectByTypeAndDate(StatisticsStatusEnum.ORDER_RENT_VEHICLE_TYPE, startDate, endDate);
//账目数据处理 状态组合
Map<String, List<OrderAccountBo>> ordersMap = StatisticsStatusEnum.processOrderAccountsWithState(stisticsActiveState, orderAccountBoList);
//遍历已经支付单
Set<Map.Entry<String, List<OrderAccountBo>>> ordersSet = ordersMap.entrySet();
for (Map.Entry<String, List<OrderAccountBo>> orderEntry : ordersSet) {
String orderKey = orderEntry.getKey();
List<OrderAccountBo> orderAccountBos = orderEntry.getValue();
OrderRentVehicleReceivedStatistics orderRentVehicleReceivedStatistics = createDefaultOrderMemberReceivedStatistics();
StatisticsStatusEnum.wrapStatisticsObject(startDate, orderKey, companyMap,orderRentVehicleReceivedStatistics);
//账目处理
FeeTypeBo feeTypeBo = StatisticsStatusEnum.getFeeTyBoByOrderAccounts(orderAccountBos);
BeanUtils.copyProperties(feeTypeBo, orderRentVehicleReceivedStatistics);
//订单量
Integer totalQuantity = stateGroupMap == null ?
0 : stateGroupMap.get(Boolean.TRUE) == null ?
0 : stateGroupMap.get(Boolean.TRUE).get(orderKey) == null ?
0 : stateGroupMap.get(Boolean.TRUE).get(orderKey).size();
orderRentVehicleReceivedStatistics.setTotalQuantity(totalQuantity);
orderRentVehicleReceivedStatisticsList.add(orderRentVehicleReceivedStatistics);
}
//未支付单
Map<String, List<OrderDTO>> noPayOrderRentvehicleMap = stateGroupMap == null ?
Collections.EMPTY_MAP : stateGroupMap.get(Boolean.FALSE) == null ?
Collections.EMPTY_MAP : stateGroupMap.get(Boolean.FALSE);
List<OrderRentVehicleReceivedStatistics> noPayOrderRentVehicleStatisticsList = createNoPayOrderRentVehicleStatisticsList(startDate, noPayOrderRentvehicleMap, companyMap);
orderRentVehicleReceivedStatisticsList.addAll(noPayOrderRentVehicleStatisticsList);
//创建剩余状态组合的租车统计对象
List<OrderRentVehicleReceivedStatistics> otherStatisticsStateGroupList = createOtherStatisticsStateGroupList(startDate, stisticsActiveState, companyMap);
orderRentVehicleReceivedStatisticsList.addAll(otherStatisticsStateGroupList);
//保存
StatisticsStatusEnum.insertReceivedStatisticsBatch(orderRentVehicleReceivedStatisticsList,mapper);
return orderRentVehicleReceivedStatisticsList;
}
/**
* @param startDate 时间
* @param noPayOrdersMap 未支付单map
* @param companyMap 公司map
* @return
*/
private List<OrderRentVehicleReceivedStatistics> createNoPayOrderRentVehicleStatisticsList(Date startDate, Map<String, List<OrderDTO>> noPayOrdersMap, Map<Integer, String> companyMap) {
List<OrderRentVehicleReceivedStatistics> orderRentVehicleReceivedStatisticsList = new ArrayList<>();
if (noPayOrdersMap == null || noPayOrdersMap.isEmpty()) {
return orderRentVehicleReceivedStatisticsList;
}
Set<Map.Entry<String, List<OrderDTO>>> noPayOrderSet = noPayOrdersMap.entrySet();
//遍历未支付单map
for (Map.Entry<String, List<OrderDTO>> noPayOrderEntry : noPayOrderSet) {
//某种状态组合的租车单
List<OrderDTO> noPayOrders = noPayOrderEntry.getValue();
//创建默认的租车订单统计对象
OrderRentVehicleReceivedStatistics orderRentVehicleReceivedStatistics = createDefaultOrderMemberReceivedStatistics();
//设置相关默认值
StatisticsStatusEnum.wrapStatisticsObject(startDate, noPayOrderEntry.getKey(), companyMap, orderRentVehicleReceivedStatistics);
//租车订单流
Supplier<Stream<OrderDTO>> orderDtoStreamSupplier = ()-> noPayOrders.stream();
//总免赔
BigDecimal damageSafeAmount = BigDecimal.ZERO;
//总订单金额(包含免赔,不包含押金)
BigDecimal totalAmount = BigDecimal.ZERO;
//总押金
BigDecimal depositAmount = BigDecimal.ZERO;
//遍历租车单 累计订单总额 总押金 总免赔
for (OrderDTO noPayOrder : noPayOrders) {
//免赔
boolean hasDamageSafe = Objects.nonNull(noPayOrder.getDamageSafe()) && (noPayOrder.getDamageSafe() == StatisticsStatusEnum.DAMAGE_SAFE);
if (hasDamageSafe) {
damageSafeAmount = damageSafeAmount.add(StatisticsStatusEnum.getDameSafeAmount(noPayOrder.getData()));
}
totalAmount = totalAmount.add(noPayOrder.getRealAmount()).subtract(totalAmount);
depositAmount = depositAmount.add(noPayOrder.getDeposit());
}
orderRentVehicleReceivedStatistics.setNoDeductibleAmount(damageSafeAmount);
orderRentVehicleReceivedStatistics.setDepositAmount(depositAmount);
BigDecimal totalNoPayAmount = orderDtoStreamSupplier.get().map(OrderDTO::getRealAmount).reduce(BigDecimal.ZERO,BigDecimal::add);
//租车费减去 押金和不计免赔费
orderRentVehicleReceivedStatistics.setTotalAmount(totalNoPayAmount.subtract(depositAmount).subtract(damageSafeAmount));
//总订单总量
orderRentVehicleReceivedStatistics.setTotalQuantity(noPayOrders.size());
orderRentVehicleReceivedStatisticsList.add(orderRentVehicleReceivedStatistics);
}
return orderRentVehicleReceivedStatisticsList;
}
/**
* 创建剩余状态数据
*
* @param startDate 时间
* @param statisticsStateGroups 状态组合 集合
* @param companyMap 公司
* @return
*/
private List<OrderRentVehicleReceivedStatistics> createOtherStatisticsStateGroupList(Date startDate,
List<String> statisticsStateGroups,
Map<Integer, String> companyMap) {
List<OrderRentVehicleReceivedStatistics> orderRentVehicleReceivedStatisticsList = new ArrayList<>(statisticsStateGroups.size());
//获取剩余状态组合
List<Integer> companyIds = Objects.isNull(companyMap) ? Collections.EMPTY_LIST : Lists.newArrayList(companyMap.keySet());
List<String> otherStatisticsStateGroup = StatisticsStatusEnum.getOtherStatisticsStateGroup(companyIds, statisticsStateGroups);
//创建租车统计克隆对象
OrderRentVehicleReceivedStatistics orderRentVehicleReceivedStatistics = createDefaultOrderMemberReceivedStatistics();
//统计对象的生成
otherStatisticsStateGroup.stream().map(stateGroup -> {
OrderRentVehicleReceivedStatistics orderRentVehicleReceivedStatisticsClone = StatisticsStatusEnum.wrapStatisticsObject(startDate, stateGroup, companyMap, ObjectUtil.cloneByStream(orderRentVehicleReceivedStatistics));
orderRentVehicleReceivedStatisticsList.add(orderRentVehicleReceivedStatisticsClone);
return orderRentVehicleReceivedStatisticsClone;
}).count();
return orderRentVehicleReceivedStatisticsList;
}
/**
* 创建默认的租车订单统计对象
*
* @return
*/
private OrderRentVehicleReceivedStatistics createDefaultOrderMemberReceivedStatistics() {
OrderRentVehicleReceivedStatistics orderRentVehicleReceivedStatistics = new OrderRentVehicleReceivedStatistics();
orderRentVehicleReceivedStatistics.setDepositAmount(BigDecimal.ZERO);
orderRentVehicleReceivedStatistics.setDepositRefundAmount(BigDecimal.ZERO);
orderRentVehicleReceivedStatistics.setNoDeductibleAmount(BigDecimal.ZERO);
orderRentVehicleReceivedStatistics.setNoDeductibleRefundAmount(BigDecimal.ZERO);
orderRentVehicleReceivedStatistics.setLossSpecifiedAmount(BigDecimal.ZERO);
orderRentVehicleReceivedStatistics.setBreakRulesRegulationAmount(BigDecimal.ZERO);
return orderRentVehicleReceivedStatistics;
}
}
\ No newline at end of file
package com.xxfc.platform.order.biz;
import cn.hutool.core.util.ObjectUtil;
import com.github.wxiaoqi.security.common.biz.BaseBiz;
import com.google.common.collect.Lists;
import com.xxfc.platform.order.bo.FeeTypeBo;
import com.xxfc.platform.order.contant.enumerate.StatisticsStatusEnum;
import com.xxfc.platform.order.entity.OrderTourReceivedStatistics;
import com.xxfc.platform.order.mapper.OrderTourReceivedStatisticsMapper;
import com.xxfc.platform.order.pojo.account.OrderAccountBo;
import com.xxfc.platform.order.pojo.dto.OrderDTO;
import com.xxfc.platform.order.pojo.dto.OrderReceivedStatisticsFindDTO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*;
/**
* @author libin
* @version 1.0 旅游统计
* @description
* @data 2019/11/28 9:57
*/
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
@Slf4j
public class OrderTourReceivedStatisticsBiz extends BaseBiz<OrderTourReceivedStatisticsMapper, OrderTourReceivedStatistics> {
private final BaseOrderBiz baseOrderBiz;
private final OrderAccountBiz orderAccountBiz;
public List<OrderTourReceivedStatistics> selectOrderReceivedStatistics(OrderReceivedStatisticsFindDTO orderReceivedStatisticsFindDTO) {
return mapper.selectOrderTourReceivedStatistics(orderReceivedStatisticsFindDTO);
}
/**
* 订单统计批量插入旅游统计表
* zuoyihang
* 2019-11-12
*
* @param startDate 开始时间
* @param endDate 结束时间
*/
public List<OrderTourReceivedStatistics> orderTourInsertStatisticsNew(Date startDate, Date endDate, Map<Integer, String> companyMap) {
List<OrderTourReceivedStatistics> orderTourReceivedStatisticsList = new ArrayList();
List<String> stisticsActiveState = new ArrayList<>();
//根据旅游类型 时间查询
List<OrderDTO> orderDTOS = baseOrderBiz.selectOrdersByTypeAndTime(Arrays.asList(StatisticsStatusEnum.ORDER_TOUR_TYPE),null, startDate, endDate);
//数据处理 状态组合 按支付状态分组 而后按组合状态
Map<Boolean, Map<String, List<OrderDTO>>> stateGroupMap = StatisticsStatusEnum.processOrdersWithState(stisticsActiveState, orderDTOS);
//订单账目信息
List<OrderAccountBo> orderAccountBoList = orderAccountBiz.selectByTypeAndDate(StatisticsStatusEnum.ORDER_TOUR_TYPE, startDate, endDate);
//账目数据整理 状态组合
Map<String, List<OrderAccountBo>> orderMap = StatisticsStatusEnum.processOrderAccountsWithState(stisticsActiveState,orderAccountBoList);
//已经支付订单
Set<Map.Entry<String, List<OrderAccountBo>>> orderSet = orderMap.entrySet();
for (Map.Entry<String, List<OrderAccountBo>> orderEntry : orderSet) {
String orderKey = orderEntry.getKey();
List<OrderAccountBo> orderAccountBos = orderEntry.getValue();
//创建并设置旅游统计对象默认值
OrderTourReceivedStatistics orderTourReceivedStatistics = StatisticsStatusEnum.wrapStatisticsObject(startDate, orderKey, companyMap, new OrderTourReceivedStatistics());
//账目处理
FeeTypeBo feeTypeBo = StatisticsStatusEnum.getFeeTyBoByOrderAccounts(orderAccountBos);
//旅游订单量
Integer totalQuantity = stateGroupMap == null ?
0 : stateGroupMap.get(Boolean.TRUE) == null ?
0 : stateGroupMap.get(Boolean.TRUE).get(orderKey) == null ?
0 : stateGroupMap.get(Boolean.TRUE).get(orderKey).size();
orderTourReceivedStatistics.setTotalQuantity(totalQuantity);
//复制对应的金额(订单支付金额、退款金额、违约金)
BeanUtils.copyProperties(feeTypeBo,orderTourReceivedStatistics);
orderTourReceivedStatisticsList.add(orderTourReceivedStatistics);
}
//未支付订单
Map<String, List<OrderDTO>> noPayOrderRentvehicleMap = stateGroupMap == null ?
Collections.EMPTY_MAP : stateGroupMap.get(Boolean.FALSE) == null ?
Collections.EMPTY_MAP : stateGroupMap.get(Boolean.FALSE);
List<OrderTourReceivedStatistics> noPayOrderTourReceivedStatisticsList = createNoPayOrderTourReceivedStatisticsListList(startDate, noPayOrderRentvehicleMap, companyMap);
orderTourReceivedStatisticsList.addAll(noPayOrderTourReceivedStatisticsList);
//创建剩余状态组合旅游统计对象
List<OrderTourReceivedStatistics> otherStatisticsStateGroupList = createOtherStatisticsStateGroupList(startDate, stisticsActiveState, companyMap);
orderTourReceivedStatisticsList.addAll(otherStatisticsStateGroupList);
//保存
StatisticsStatusEnum.insertReceivedStatisticsBatch(orderTourReceivedStatisticsList,mapper);
return orderTourReceivedStatisticsList;
}
/**
*创建未支付
* @param startDate 统计的时间
* @param noPayOrdersMap 未支付单map
* @param companyMap 公司map
*/
private List<OrderTourReceivedStatistics> createNoPayOrderTourReceivedStatisticsListList(Date startDate, Map<String, List<OrderDTO>> noPayOrdersMap, Map<Integer, String> companyMap) {
List<OrderTourReceivedStatistics> orderTourReceivedStatisticsList = new ArrayList<>();
if (noPayOrdersMap == null || noPayOrdersMap.isEmpty()) {
return orderTourReceivedStatisticsList;
}
//遍历未支付单
Set<Map.Entry<String, List<OrderDTO>>> noPayOrderSet = noPayOrdersMap.entrySet();
for (Map.Entry<String, List<OrderDTO>> noPayOrderEntry : noPayOrderSet) {
String noPayOrderStateGroup = noPayOrderEntry.getKey();
List<OrderDTO> noPayOrders = noPayOrderEntry.getValue();
//创建旅游统计对象并设置默认值
OrderTourReceivedStatistics orderTourReceivedStatistics = StatisticsStatusEnum.wrapStatisticsObject(startDate, noPayOrderStateGroup, companyMap, new OrderTourReceivedStatistics());
//订单总金额
BigDecimal totalNoPayAmount = noPayOrders.stream().map(OrderDTO::getRealAmount).reduce(BigDecimal.ZERO,BigDecimal::add);
orderTourReceivedStatistics.setTotalQuantity(noPayOrders.size());
orderTourReceivedStatistics.setTotalAmount(totalNoPayAmount);
orderTourReceivedStatisticsList.add(orderTourReceivedStatistics);
}
return orderTourReceivedStatisticsList;
}
/**
* 创建剩余状态数据
*
* @param startDate 时间
* @param statisticsStateGroups 状态组合 集合
* @param companyMap 公司ids
* @return
*/
private List<OrderTourReceivedStatistics> createOtherStatisticsStateGroupList(Date startDate,
List<String> statisticsStateGroups,
Map<Integer, String> companyMap) {
List<OrderTourReceivedStatistics> orderTourReceivedStatisticsList = new ArrayList<>();
//获取剩余状态组合
List<Integer> companyIds = Objects.isNull(companyMap) ? Collections.EMPTY_LIST : Lists.newArrayList(companyMap.keySet());
List<String> otherStatisticsStateGroup = StatisticsStatusEnum.getOtherStatisticsStateGroup(companyIds, statisticsStateGroups);
//创建租车统计克隆对象
OrderTourReceivedStatistics orderTourReceivedStatistics = new OrderTourReceivedStatistics();
//统计对象的生成
otherStatisticsStateGroup.stream().peek(stateGroup -> {
OrderTourReceivedStatistics orderTourReceivedStatisticsClone = StatisticsStatusEnum.wrapStatisticsObject(startDate, stateGroup, companyMap, ObjectUtil.cloneByStream(orderTourReceivedStatistics));
orderTourReceivedStatisticsList.add(orderTourReceivedStatisticsClone);
}).count();
return orderTourReceivedStatisticsList;
}
}
\ No newline at end of file
package com.xxfc.platform.order.biz;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.github.wxiaoqi.security.common.biz.BaseBiz;
import com.xxfc.platform.order.Utils.OrderDateUtils;
import com.xxfc.platform.order.biz.inner.OrderCalculateBiz;
import com.xxfc.platform.order.contant.enumerate.CrosstownTypeEnum;
import com.xxfc.platform.order.contant.enumerate.OrderStatusEnum;
import com.xxfc.platform.order.entity.OrderVehicleServiceStatistics;
import com.xxfc.platform.order.mapper.OrderVehicleServiceStatisticsMapper;
import com.xxfc.platform.order.pojo.CountVehicleServiceNumVo;
import com.xxfc.platform.order.pojo.order.OrderPageVO;
import com.xxfc.platform.order.pojo.order.OrderVehicleCrosstownDto;
import com.xxfc.platform.universal.utils.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
@Slf4j
public class OrderVehicleServiceStatisticsBiz extends BaseBiz<OrderVehicleServiceStatisticsMapper, OrderVehicleServiceStatistics> {
@Autowired
BaseOrderBiz baseOrderBiz;
@Autowired
OrderVehicleCrosstownBiz orderVehicleCrosstownBiz;
@Autowired
OrderCalculateBiz orderCalculateBiz;
Map<Integer, Map<String, Integer>> mapMap = new HashMap<>();
//获取订单,解析租车天数
//根据订单状态,待出行的添加一天,出行中的加一天,已完成的判断订单时间和实际结束时间如果实际结束天数大于订单天数,则需要加一天
public void getAllOrder(DateTime dateTime) {
Date nowTime = DateTime.now().minusDays(1).toDate();
if (dateTime != null) {
nowTime = dateTime.minusDays(1).toDate();
}
String timeStr = DateUtil.dateToStr(nowTime, "yyyy-MM-dd");
//以公司ID为key, 日期+次数为value组成map
Map<String, Object> param = new HashMap<>();
param.put("startTime", OrderDateUtils.getStartOfDay(nowTime));
param.put("endTime", OrderDateUtils.getEndOfDay(nowTime));
param.put("status", 1);
List<OrderPageVO> orderPageVOS = baseOrderBiz.selectAllCountOrder(param);
if (orderPageVOS != null && orderPageVOS.size() > 0) {
log.info(timeStr + "所有订单: list = {}", orderPageVOS);
orderPageVOS.parallelStream().forEach(result -> {
if (result.getOrderRentVehicleDetail() != null) {
Map<String, Integer> dateNumMap = mapMap.getOrDefault(result.getOrderRentVehicleDetail().getStartCompanyId(), new HashMap<>());
if (result.getStatus() == OrderStatusEnum.ORDER_TOSTART.getCode() || result.getStatus() == OrderStatusEnum.ORDER_WAIT.getCode()) {//待出行或者出行中
dateNumMap.put(timeStr, dateNumMap.getOrDefault(timeStr, 0) + 1);
}
if (result.getStatus() == OrderStatusEnum.ORDER_FINISH.getCode() || result.getStatus() == OrderStatusEnum.ORDER_FIXED_LOSS.getCode()) {//已完成或者定损中
//判断租车时间是否小于实际用车时间
//实际预定天数
Integer bookDays = result.getOrderRentVehicleDetail().getDayNum();
//实际使用天数
Integer actualUsedDays = result.getOrderRentVehicleDetail().getUsedDay();
Long startTime = result.getOrderRentVehicleDetail().getStartTime();
if (actualUsedDays == null) {//字段为空,重新计算天数
//查询还车时间
OrderVehicleCrosstownDto orderVehicleCrosstownDto = new OrderVehicleCrosstownDto();
orderVehicleCrosstownDto.setOrderId(result.getId());
List<OrderVehicleCrosstownDto> list = orderVehicleCrosstownBiz.selectByOrderId(orderVehicleCrosstownDto);
if (list != null && list.size() > 0) {
list.parallelStream().forEach(order -> {
//获取还车时间
if (order.getType() == CrosstownTypeEnum.ARRIVE.getCode() || order.getType() == CrosstownTypeEnum.FIXED_LOSS.getCode() || order.getType() == CrosstownTypeEnum.FIXED_LOSS_NOW.getCode()) {
Long endTime = order.getCrtTime();
int userUsedDay = orderCalculateBiz.getIncludeDays(startTime, endTime);
if (bookDays < userUsedDay) { //实际使用天数>预定天数,还车当天+1
dateNumMap.put(timeStr, dateNumMap.getOrDefault(timeStr, 0) + 1);
}
}
});
} else { //还车记录不存在,异常数据
log.info("还车记录不存在,异常数据, {}", result.toString());
}
} else if (bookDays - actualUsedDays < 0) { //如果实际使用时间大于预定时间,还车时租车天数为多出的天数
dateNumMap.put(timeStr, dateNumMap.getOrDefault(timeStr, 0) + (actualUsedDays - bookDays));
} else if (bookDays - actualUsedDays > 0){
dateNumMap.put(timeStr, dateNumMap.getOrDefault(timeStr, 0) + actualUsedDays);
}
}
mapMap.put(result.getOrderRentVehicleDetail().getStartCompanyId(), dateNumMap);
}
});
}
log.info("统计数据,Map = {}", mapMap);
}
public void countVehicleServiceNum(DateTime dateTime) {
Date nowTime = DateTime.now().minusDays(1).toDate();
if (dateTime != null) {
nowTime = dateTime.minusDays(1).toDate();
}
Map<String, Object> map = new HashMap<>();
map.put("startTime", OrderDateUtils.getStartOfDay(nowTime));
map.put("endTime", OrderDateUtils.getEndOfDay(nowTime));
List<CountVehicleServiceNumVo> list = mapper.countVehicleServiceNum(map);
if (list != null && list.size() > 0) {
list.parallelStream().forEach(result -> {
OrderVehicleServiceStatistics orderVehicleServiceStatistics = new OrderVehicleServiceStatistics();
log.info(result.toString());
BeanUtil.copyProperties(result, orderVehicleServiceStatistics, CopyOptions.create().setIgnoreNullValue(true).setIgnoreError(true));
String dateStr = result.getCountYear() + "-" + result.getCountMonth() + "-" + result.getCountDay();
DateTime date = DateTime.parse(dateStr);
orderVehicleServiceStatistics.setCountDate(date.toDate());
orderVehicleServiceStatistics.setCountMonth(result.getCountYear() + result.getCountMonth());
orderVehicleServiceStatistics.setCountWeek(result.getCountYear() + result.getCountWeek());
add(orderVehicleServiceStatistics);
});
}
}
public void add(OrderVehicleServiceStatistics orderVehicleServiceStatistics) {
if (orderVehicleServiceStatistics != null) {
OrderVehicleServiceStatistics oldValue = mapper.selectByCompanyIdAndDate(orderVehicleServiceStatistics);
if (oldValue == null) {
insertSelectiveRe(orderVehicleServiceStatistics);
} else {
if (orderVehicleServiceStatistics.getArrivalNum() != null) {
orderVehicleServiceStatistics.setArrivalNum(orderVehicleServiceStatistics.getArrivalNum() + oldValue.getArrivalNum());
}
if (orderVehicleServiceStatistics.getDepartureNum() != null) {
orderVehicleServiceStatistics.setDepartureNum(orderVehicleServiceStatistics.getDepartureNum() + oldValue.getDepartureNum());
}
if (orderVehicleServiceStatistics.getRentNum() != null) {
orderVehicleServiceStatistics.setRentNum(orderVehicleServiceStatistics.getRentNum() + oldValue.getRentNum());
}
BeanUtil.copyProperties(orderVehicleServiceStatistics, oldValue, CopyOptions.create().setIgnoreNullValue(true).setIgnoreError(true));
updateSelectiveByIdRe(oldValue);
}
}
}
//添加记录
public void addAll() {
DateTime dateTime = DateTime.parse("2019-08-01");
for (DateTime curDate = dateTime.plusDays(1); curDate.compareTo(DateTime.now()) < 0; curDate = curDate.plusDays(1)) {
countVehicleServiceNum(curDate);
getAllOrder(curDate);
}
if (MapUtils.isNotEmpty(mapMap)) {
for (Map.Entry<Integer, Map<String, Integer>> entry : mapMap.entrySet()) {
if (MapUtils.isNotEmpty(entry.getValue())) {
OrderVehicleServiceStatistics orderVehicleServiceStatistics = new OrderVehicleServiceStatistics();
orderVehicleServiceStatistics.setCompanyId(entry.getKey());
for (Map.Entry<String, Integer> values : entry.getValue().entrySet()) {
if (StringUtils.isNotBlank(values.getKey()) && StringUtils.isNotBlank(values.getValue() + "")) {
DateTime dateTime1 = DateTime.parse(values.getKey());
orderVehicleServiceStatistics.setCountDate(dateTime1.toDate());
orderVehicleServiceStatistics.setRentNum(values.getValue());
orderVehicleServiceStatistics.setCountYear(dateTime1.getYear() + "");
orderVehicleServiceStatistics.setCountMonth(dateTime1.getYear() + "" + dateTime1.getMonthOfYear() + "");
orderVehicleServiceStatistics.setCountWeek(dateTime1.getYear() + "" + dateTime1.getWeekOfWeekyear() + "");
add(orderVehicleServiceStatistics);
}
}
}
}
}
mapMap.clear();
}
//添加记录
@Scheduled(cron = "0 0 2 * * *")
public void add() {
countVehicleServiceNum(DateTime.now());
getAllOrder(DateTime.now());
if (MapUtils.isNotEmpty(mapMap)) {
for (Map.Entry<Integer, Map<String, Integer>> entry : mapMap.entrySet()) {
if (MapUtils.isNotEmpty(entry.getValue())) {
OrderVehicleServiceStatistics orderVehicleServiceStatistics = new OrderVehicleServiceStatistics();
orderVehicleServiceStatistics.setCompanyId(entry.getKey());
for (Map.Entry<String, Integer> values : entry.getValue().entrySet()) {
if (StringUtils.isNotBlank(values.getKey()) && StringUtils.isNotBlank(values.getValue() + "")) {
DateTime dateTime1 = DateTime.parse(values.getKey());
orderVehicleServiceStatistics.setCountDate(dateTime1.toDate());
orderVehicleServiceStatistics.setRentNum(values.getValue());
orderVehicleServiceStatistics.setCountYear(dateTime1.getYear() + "");
orderVehicleServiceStatistics.setCountMonth(dateTime1.getYear() + "" + dateTime1.getMonthOfYear() + "");
orderVehicleServiceStatistics.setCountWeek(dateTime1.getYear() + "" + dateTime1.getWeekOfWeekyear() + "");
add(orderVehicleServiceStatistics);
}
}
}
}
}
mapMap.clear();
}
}
...@@ -101,7 +101,7 @@ public class OrderViolationBiz extends BaseBiz<OrderViolationMapper, OrderViolat ...@@ -101,7 +101,7 @@ public class OrderViolationBiz extends BaseBiz<OrderViolationMapper, OrderViolat
String filePath = ovUpload + realFileRelPath; String filePath = ovUpload + realFileRelPath;
// FileUtils.copyInputStreamToFile(file.getInputStream(), new File(filePath)); FileUtils.copyInputStreamToFile(file.getInputStream(), new File(filePath));
return ObjectRestResponse.succ(filePath); return ObjectRestResponse.succ(filePath);
} }
......
package com.xxfc.platform.order.jobhandler;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.xxfc.platform.order.biz.OrderMemberReceivedStatisticsBiz;
import com.xxfc.platform.order.biz.OrderReceivedStatisticsBiz;
import com.xxfc.platform.order.biz.OrderRentVehicleReceivedStatisticsBiz;
import com.xxfc.platform.order.biz.OrderTourReceivedStatisticsBiz;
import com.xxfc.platform.order.entity.OrderMemberReceivedStatistics;
import com.xxfc.platform.order.entity.OrderRentVehicleReceivedStatistics;
import com.xxfc.platform.order.entity.OrderTourReceivedStatistics;
import com.xxfc.platform.vehicle.feign.VehicleFeign;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.JobHandler;
import com.xxl.job.core.log.XxlJobLogger;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @author libin
* @version 1.0
* @description 订单统计 定时任务
* @data 2019/11/11 11:09
*/
@JobHandler(value = "orderReceivedStatisticsJobHandler")
@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class OrderReceivedStatisticsJobHandler extends IJobHandler {
private final OrderReceivedStatisticsBiz orderReceivedStatisticsBiz;
private final OrderRentVehicleReceivedStatisticsBiz orderRentVehicleReceivedStatisticsBiz;
private final OrderTourReceivedStatisticsBiz orderTourReceivedStatisticsBiz;
private final OrderMemberReceivedStatisticsBiz orderMemberReceivedStatisticsBiz;
private final VehicleFeign vehicleFeign;
@Override
public ReturnT<String> execute(String arg) throws Exception {
DateTime yesterday = DateUtil.yesterday();
if (StringUtils.hasText(arg)){
try {
yesterday = DateUtil.parse(arg, "yyyy-MM-dd");
}catch (Exception ex){
XxlJobLogger.log(ex);
yesterday = DateUtil.yesterday();
}
}
Date startDate = DateUtil.beginOfDay(yesterday).toJdkDate();
Date endDate = DateUtil.endOfDay(yesterday).toJdkDate();
Map<Integer, String> companyMap = vehicleFeign.findCompanyMap();
//旅游订单
List<OrderTourReceivedStatistics> orderTourReceivedStatisticsList = orderTourReceivedStatisticsBiz.orderTourInsertStatisticsNew(startDate,endDate,companyMap);
//租车订单
List<OrderRentVehicleReceivedStatistics> orderRentVehicleReceivedStatisticsList = orderRentVehicleReceivedStatisticsBiz.orderRentVehicleReceivedStatistics(startDate, endDate, companyMap);
//会员订单
List<OrderMemberReceivedStatistics> orderMemberReceivedStatisticsList = orderMemberReceivedStatisticsBiz.orderMemberReceivedStatistics(startDate, endDate, companyMap);
//订单
orderReceivedStatisticsBiz.orderReceivedStatistics(orderMemberReceivedStatisticsList,
orderTourReceivedStatisticsList,
orderRentVehicleReceivedStatisticsList,
startDate);
return new ReturnT<>(ReturnT.SUCCESS_CODE,"订单统计成功执行");
}
}
...@@ -36,7 +36,7 @@ public interface BaseOrderMapper extends Mapper<BaseOrder> { ...@@ -36,7 +36,7 @@ public interface BaseOrderMapper extends Mapper<BaseOrder> {
public OrderPageVO getOrderDetail(String no); public OrderPageVO getOrderDetail(String no);
public List<OrderPageVO> selectAllRentVehicleOrder(Map<String, Object> paramMap); public List<OrderPageVO> selectAllRentVehicleOrder(Map<String, Object> paramMap);
public List<OrderPageVO> selectAllCountOrder(Map<String, Object> paramMap);
public List<OrderPageVO> selectAllTourOrder(Map<String, Object> paramMap); public List<OrderPageVO> selectAllTourOrder(Map<String, Object> paramMap);
List<MemberOrderBo> findMemberOrders(MemberOrderFindDTO memberOrderFindDTO); List<MemberOrderBo> findMemberOrders(MemberOrderFindDTO memberOrderFindDTO);
...@@ -44,9 +44,9 @@ public interface BaseOrderMapper extends Mapper<BaseOrder> { ...@@ -44,9 +44,9 @@ public interface BaseOrderMapper extends Mapper<BaseOrder> {
public List<BgOrderListVo> getAllOrderList(Map<String, Object> paramMap); public List<BgOrderListVo> getAllOrderList(Map<String, Object> paramMap);
List<OrderDTO> selectOrdersByTypeAndTime(@Param("types") List<Integer> types, List<OrderDTO> selectOrdersByTypeAndTime(@Param("types") List<Integer> types,
@Param("hasPay") Integer hasPay, @Param("hasPay") Integer hasPay,
@Param("startDate") Date startDate, @Param("startDate") Date startDate,
@Param("endDate") Date endDate); @Param("endDate") Date endDate);
List<OrderDTO> selectBaeOrderByOrderIds(@Param("orderIds") List<Integer> orderIds); List<OrderDTO> selectBaeOrderByOrderIds(@Param("orderIds") List<Integer> orderIds);
List<Achievement> selectTotalStatistical(QueryCriteria queryCriteria); List<Achievement> selectTotalStatistical(QueryCriteria queryCriteria);
......
...@@ -11,12 +11,11 @@ import tk.mybatis.mapper.common.Mapper; ...@@ -11,12 +11,11 @@ import tk.mybatis.mapper.common.Mapper;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* 订单帐目 * 订单帐目
* *
* @author zhoujw * @author zhoujw
* @email 18178966185@163.com * @email 18178966185@163.com
* @date 2019-09-09 15:51:16 * @date 2019-09-09 15:51:16
...@@ -33,5 +32,5 @@ public interface OrderAccountMapper extends Mapper<OrderAccount> { ...@@ -33,5 +32,5 @@ public interface OrderAccountMapper extends Mapper<OrderAccount> {
@Param("endDate") Date endDate, @Param("endDate") Date endDate,
@Param("staffUserIds") List<Integer> staffUserIds); @Param("staffUserIds") List<Integer> staffUserIds);
List<ReturnOrderAmount> outStatisticalData(@Param("queryCriteria")QueryCriteria queryCriteria,@Param("startTime") Long startTime,@Param("endTime")Long endTime); List<ReturnOrderAmount> outStatisticalData(@Param("queryCriteria")QueryCriteria queryCriteria, @Param("startTime") Long startTime, @Param("endTime")Long endTime);
} }
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 java.util.List;
/**
* 会员订单统计
*
* @author libin
* @email 18178966185@163.com
* @date 2019-11-08 18:03:42
*/
public interface OrderMemberReceivedStatisticsMapper extends Mapper<OrderMemberReceivedStatistics>, InsertListMapper<OrderMemberReceivedStatistics> {
List<OrderMemberReceivedStatistics> selectOrderMemberReceivedStatistics(OrderReceivedStatisticsFindDTO orderReceivedStatisticsFindDTO);
void inserMemberReceivedtList(@Param("orderMembers") List<OrderMemberReceivedStatistics> orderMemberReceivedStatistics);
}
package com.xxfc.platform.order.mapper;
import com.xxfc.platform.order.bo.CompanyPerformanceBo;
import com.xxfc.platform.order.entity.OrderReceivedStatistics;
import com.xxfc.platform.order.pojo.dto.CompanyPerformanceFindDTO;
import com.xxfc.platform.order.pojo.dto.OrderReceivedStatisticsFindDTO;
import tk.mybatis.mapper.additional.insert.InsertListMapper;
import tk.mybatis.mapper.common.Mapper;
import java.util.List;
/**
* 全部订单统计
*
* @author libin
* @email 18178966185@163.com
* @date 2019-11-08 18:03:42
*/
public interface OrderReceivedStatisticsMapper extends Mapper<OrderReceivedStatistics>, InsertListMapper<OrderReceivedStatistics> {
List<OrderReceivedStatistics> selectOrderReceivedStatisticsList(OrderReceivedStatisticsFindDTO orderReceivedStatisticsFindDTO);
List<CompanyPerformanceBo> selectCompanyPerformanceWithDay(CompanyPerformanceFindDTO companyPerformanceFindDTO);
List<CompanyPerformanceBo> selectCompanyPerformanceWithMonth(CompanyPerformanceFindDTO companyPerformanceFindDTO);
List<CompanyPerformanceBo> selectCompanyPerformanceWithWeek(CompanyPerformanceFindDTO companyPerformanceFindDTO);
int selectCountByDate(CompanyPerformanceFindDTO companyPerformanceFindDTO);
int selectCountByMonth(CompanyPerformanceFindDTO companyPerformanceFindDTO);
int selectCountByWeekOfYear(CompanyPerformanceFindDTO companyPerformanceFindDTO);
}
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 java.util.List;
/**
* 租车订单统计
*
* @author libin
* @email 18178966185@163.com
* @date 2019-11-08 18:03:42
*/
public interface OrderRentVehicleReceivedStatisticsMapper extends Mapper<OrderRentVehicleReceivedStatistics>, InsertListMapper<OrderRentVehicleReceivedStatistics> {
List<OrderRentVehicleReceivedStatistics> selectOrderRentVehicleReceivedStatistics(OrderReceivedStatisticsFindDTO orderReceivedStatisticsFindDTO);
}
package com.xxfc.platform.order.mapper;
import com.xxfc.platform.order.entity.OrderTourReceivedStatistics;
import com.xxfc.platform.order.pojo.dto.OrderReceivedStatisticsFindDTO;
import tk.mybatis.mapper.additional.insert.InsertListMapper;
import tk.mybatis.mapper.common.Mapper;
import java.util.List;
/**
* 旅游订单统计
*
* @author libin
* @email 18178966185@163.com
* @date 2019-11-08 18:03:42
*/
public interface OrderTourReceivedStatisticsMapper extends Mapper<OrderTourReceivedStatistics>, InsertListMapper<OrderTourReceivedStatistics> {
List<OrderTourReceivedStatistics> selectOrderTourReceivedStatistics(OrderReceivedStatisticsFindDTO orderReceivedStatisticsFindDTO);
}
package com.xxfc.platform.order.mapper;
import com.xxfc.platform.order.entity.OrderVehicleServiceStatistics;
import com.xxfc.platform.order.pojo.CountVehicleServiceNumVo;
import tk.mybatis.mapper.common.Mapper;
import java.util.List;
import java.util.Map;
/**
* 出车、收车服务次数统计
*/
public interface OrderVehicleServiceStatisticsMapper extends Mapper<OrderVehicleServiceStatistics> {
List<CountVehicleServiceNumVo> countVehicleServiceNum(Map<String, Object> param);
OrderVehicleServiceStatistics selectByCompanyIdAndDate(OrderVehicleServiceStatistics orderVehicleServiceStatistics);
}
\ No newline at end of file
...@@ -11,8 +11,10 @@ import com.github.wxiaoqi.security.common.context.BaseContextHandler; ...@@ -11,8 +11,10 @@ import com.github.wxiaoqi.security.common.context.BaseContextHandler;
import com.github.wxiaoqi.security.common.msg.ObjectRestResponse; import com.github.wxiaoqi.security.common.msg.ObjectRestResponse;
import com.github.wxiaoqi.security.common.rest.BaseController; import com.github.wxiaoqi.security.common.rest.BaseController;
import com.xxfc.platform.order.biz.OrderTourDetailBiz; import com.xxfc.platform.order.biz.OrderTourDetailBiz;
import com.xxfc.platform.order.biz.OrderTourReceivedStatisticsBiz;
import com.xxfc.platform.order.entity.BaseOrder; import com.xxfc.platform.order.entity.BaseOrder;
import com.xxfc.platform.order.entity.OrderTourDetail; import com.xxfc.platform.order.entity.OrderTourDetail;
import com.xxfc.platform.order.entity.OrderTourReceivedStatistics;
import com.xxfc.platform.order.pojo.order.add.AddTourDTO; import com.xxfc.platform.order.pojo.order.add.AddTourDTO;
import com.xxfc.platform.order.pojo.order.TourBO; import com.xxfc.platform.order.pojo.order.TourBO;
import com.xxfc.platform.order.pojo.price.TourPriceVO; import com.xxfc.platform.order.pojo.price.TourPriceVO;
...@@ -31,16 +33,21 @@ import org.springframework.web.bind.annotation.RequestMethod; ...@@ -31,16 +33,21 @@ import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
import java.util.Arrays; import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
@Controller @Controller
@RequestMapping("orderTour") @RequestMapping("orderTour")
@IgnoreClientToken @IgnoreClientToken
@Api(value="旅游订单",tags={"旅游订单"}) @Api(value = "旅游订单", tags = {"旅游订单"})
public class OrderTourController extends BaseController<OrderTourDetailBiz,OrderTourDetail> { public class OrderTourController extends BaseController<OrderTourDetailBiz, OrderTourDetail> {
@Autowired @Autowired
OrderTourService orderTourService; OrderTourService orderTourService;
@Autowired
OrderTourReceivedStatisticsBiz orderTourReceivedStatisticsBiz;
@Autowired @Autowired
TourFeign tourFeign; TourFeign tourFeign;
...@@ -50,33 +57,51 @@ public class OrderTourController extends BaseController<OrderTourDetailBiz,Order ...@@ -50,33 +57,51 @@ public class OrderTourController extends BaseController<OrderTourDetailBiz,Order
@Autowired @Autowired
UserFeign userFeign; UserFeign userFeign;
public AppUserDTO getUserInfo(){ public AppUserDTO getUserInfo() {
return userFeign.userDetailByToken(userAuthConfig.getToken(request)).getData(); return userFeign.userDetailByToken(userAuthConfig.getToken(request)).getData();
}
@RequestMapping(value = "/orderTourStatistics", method = RequestMethod.GET)
@ResponseBody
@ApiOperation(value = "旅游订单统计")
public ObjectRestResponse<OrderTourReceivedStatistics> orderTourStatistics() {
Date today = new Date();//获取今天的日期
Calendar c = Calendar.getInstance();
c.setTime(today);
c.add(Calendar.DAY_OF_MONTH, 1);
Date tomorrow = c.getTime();//这是明天
c.setTime(today);
c.add(Calendar.DAY_OF_MONTH, -1);
Date yesterday = c.getTime();//这是昨天
orderTourReceivedStatisticsBiz.orderTourInsertStatisticsNew(yesterday, tomorrow,null
);
return ObjectRestResponse.succ();
} }
@RequestMapping(value = "add",method = RequestMethod.POST)
@RequestMapping(value = "add", method = RequestMethod.POST)
@ResponseBody @ResponseBody
@ApiOperation(value = "确认旅游订单") @ApiOperation(value = "确认旅游订单")
public ObjectRestResponse<BaseOrder> add(@RequestBody AddTourDTO vo){ public ObjectRestResponse<BaseOrder> add(@RequestBody AddTourDTO vo) {
TourBO bo = BeanUtil.toBean(vo, TourBO.class); TourBO bo = BeanUtil.toBean(vo, TourBO.class);
bo.setAppUserDTO(userFeign.userDetailByToken(BaseContextHandler.getToken()).getData()); bo.setAppUserDTO(userFeign.userDetailByToken(BaseContextHandler.getToken()).getData());
bo.setTickerNo(StrUtil.isNotBlank(vo.getTickerNos())? Arrays.asList(vo.getTickerNos().split(",")):null); bo.setTickerNo(StrUtil.isNotBlank(vo.getTickerNos()) ? Arrays.asList(vo.getTickerNos().split(",")) : null);
orderTourService.createOrder(bo); orderTourService.createOrder(bo);
return ObjectRestResponse.succ(bo.getOrder()); return ObjectRestResponse.succ(bo.getOrder());
} }
@RequestMapping(value = "/calculate-price",method = RequestMethod.GET) @RequestMapping(value = "/calculate-price", method = RequestMethod.GET)
@ResponseBody @ResponseBody
@ApiOperation(value = "价格计算") @ApiOperation(value = "价格计算")
@IgnoreUserToken @IgnoreUserToken
public ObjectRestResponse<TourPriceVO> calculatePrice(CalculatePriceVO vo){ public ObjectRestResponse<TourPriceVO> calculatePrice(CalculatePriceVO vo) {
TourBO bo = BeanUtil.toBean(vo, TourBO.class); TourBO bo = BeanUtil.toBean(vo, TourBO.class);
bo.setAppUserDTO(getUserInfo()); bo.setAppUserDTO(getUserInfo());
bo.setAdultNum(vo.getNumber()); bo.setAdultNum(vo.getNumber());
bo.setChildNum(vo.getChildNumber()); bo.setChildNum(vo.getChildNumber());
TourGood tourGood = tourFeign.usableGet(bo.getGoodId()).getData(); TourGood tourGood = tourFeign.usableGet(bo.getGoodId()).getData();
bo.setTourGood(tourGood); bo.setTourGood(tourGood);
bo.setTickerNo(StrUtil.isNotBlank(vo.getTickerNos())? Arrays.asList(vo.getTickerNos().split(",")):null); bo.setTickerNo(StrUtil.isNotBlank(vo.getTickerNos()) ? Arrays.asList(vo.getTickerNos().split(",")) : null);
return ObjectRestResponse.succ(orderTourService.calculatePrice(bo)); return ObjectRestResponse.succ(orderTourService.calculatePrice(bo));
} }
......
package com.xxfc.platform.order.rest.background;
import com.github.wxiaoqi.security.common.msg.ObjectRestResponse;
import com.github.wxiaoqi.security.common.vo.PageDataVO;
import com.xxfc.platform.order.biz.CompanyPerformanceBiz;
import com.xxfc.platform.order.pojo.dto.CompanyPerformanceFindDTO;
import com.xxfc.platform.order.bo.CompanyPerformanceBo;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import com.github.wxiaoqi.security.common.exception.BaseException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
* @author libin
* @version 1.0
* @description 公司业绩查询
* @data 2019/11/23 14:32
*/
@Slf4j
@RestController
@RequestMapping("/statistics")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class CompanyOrderReceivedStatiscsAdminController {
private final CompanyPerformanceBiz companyPerformanceBiz;
@PostMapping("/company_performance")
public ObjectRestResponse<PageDataVO<CompanyPerformanceBo>> companyPerformance(@RequestBody CompanyPerformanceFindDTO companyPerformanceFindDTO){
PageDataVO<CompanyPerformanceBo> dataVO = companyPerformanceBiz.selectCompanyPerformancePage(companyPerformanceFindDTO);
return ObjectRestResponse.succ(dataVO);
}
@ApiOperation("导出")
@PostMapping("/export")
public void exportCompanyPerformance(@RequestBody CompanyPerformanceFindDTO companyPerformanceFindDTO, HttpServletResponse response){
try {
String name = DateTimeFormatter.ofPattern("YYYYMMddHHmmss").format(LocalDateTime.now());
response.setContentType("application/vnd.ms-excel;charset=utf-8");
String filename = String.format("%s-company-statistics.xlsx",name);
response.setHeader("Content-Disposition","attachment;filename="+ new String(filename.getBytes(), "iso8859-1"));
ServletOutputStream outputStream = response.getOutputStream();
companyPerformanceBiz.exportOrderReceivedStatisticsData(companyPerformanceFindDTO,outputStream);
response.setCharacterEncoding("UTF-8");
}catch (Exception ex){
log.error("导出数据失败【{}】",ex);
throw new BaseException("导出数据失败");
}
}
}
package com.xxfc.platform.order.rest.background;
import com.github.wxiaoqi.security.admin.feign.dto.UserDTO;
import com.github.wxiaoqi.security.common.annotation.BeanValid;
import com.github.wxiaoqi.security.common.annotation.SimpleValid;
import com.github.wxiaoqi.security.common.exception.BaseException;
import com.github.wxiaoqi.security.common.msg.ObjectRestResponse;
import com.xxfc.platform.order.biz.OrderReceivedStatisticsBiz;
import com.xxfc.platform.order.pojo.dto.OrderReceivedStatisticsFindDTO;
import com.xxfc.platform.order.pojo.vo.OrderReceivedStatisticsVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* @author libin
* @version 1.0
* @description 订单统计
* @data 2019/11/11 9:14
*/
@Slf4j
@Api(tags = "订单统计")
@RestController
@RequestMapping("admin/order/received_statistics")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class OrderReceivedStatisticsAdminController {
private final OrderReceivedStatisticsBiz orderReceivedStatisticsBiz;
@ApiOperation("订单统计")
@PostMapping("")
public ObjectRestResponse<Map<String, List<OrderReceivedStatisticsVo>>> orderReceivedStatistics(@RequestBody @SimpleValid OrderReceivedStatisticsFindDTO orderReceivedStatisticsFindDTO, UserDTO userDTO){
orderReceivedStatisticsFindDTO.setCompanyId(Arrays.asList(userDTO.getCompanyId()));
Map<String, List<OrderReceivedStatisticsVo>> orderReceivedStatisticsPageVo = orderReceivedStatisticsBiz.getOrderReceivedStatisticsResult(orderReceivedStatisticsFindDTO);
return ObjectRestResponse.succ(orderReceivedStatisticsPageVo);
}
@ApiOperation("订单统计excel导出下载")
@PostMapping(value = "/export",consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
public ObjectRestResponse<Void> exportOrderReceivedStatistics(@RequestBody @BeanValid OrderReceivedStatisticsFindDTO orderReceivedStatisticsFindDTO,UserDTO userDTO, HttpServletResponse response){
try {
orderReceivedStatisticsFindDTO.setCompanyId(Arrays.asList(userDTO.getCompanyId()));
String name = DateTimeFormatter.ofPattern("YYYYMMddHHmmss").format(LocalDateTime.now());
response.setContentType("application/vnd.ms-excel;charset=utf-8");
String filename = String.format("%s-OrderReceivedStatistics.xlsx",name);
response.setHeader("Content-Disposition","attachment;filename="+ new String(filename.getBytes(), "iso8859-1"));
ServletOutputStream outputStream = response.getOutputStream();
orderReceivedStatisticsBiz.exportOrderReceivedStatisticsData(orderReceivedStatisticsFindDTO,outputStream);
response.setCharacterEncoding("UTF-8");
return ObjectRestResponse.succ();
}catch (Exception ex){
log.error("导出数据失败【{}】",ex);
throw new BaseException("导出数据失败");
}
}
}
package com.xxfc.platform.order.rest.background;
import com.github.wxiaoqi.security.common.rest.BaseController;
import com.xxfc.platform.order.biz.OrderVehicleServiceStatisticsBiz;
import com.xxfc.platform.order.entity.OrderVehicleServiceStatistics;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/vehicle/serviceNum")
public class VehicleServiceNumController extends BaseController<OrderVehicleServiceStatisticsBiz, OrderVehicleServiceStatistics> {
@GetMapping(value = "/app/unauth/addAll")
public void addAll() {
baseBiz.addAll();
}
}
...@@ -6,6 +6,7 @@ import com.github.wxiaoqi.security.admin.entity.BaseUserMemberLevel; ...@@ -6,6 +6,7 @@ import com.github.wxiaoqi.security.admin.entity.BaseUserMemberLevel;
import com.github.wxiaoqi.security.admin.feign.UserFeign; import com.github.wxiaoqi.security.admin.feign.UserFeign;
import com.github.wxiaoqi.security.admin.feign.rest.UserRestInterface; import com.github.wxiaoqi.security.admin.feign.rest.UserRestInterface;
import com.github.wxiaoqi.security.auth.client.config.UserAuthConfig; import com.github.wxiaoqi.security.auth.client.config.UserAuthConfig;
import com.github.wxiaoqi.security.common.enumconstant.LevelEnum;
import com.github.wxiaoqi.security.common.exception.BaseException; import com.github.wxiaoqi.security.common.exception.BaseException;
import com.github.wxiaoqi.security.common.util.process.ResultCode; import com.github.wxiaoqi.security.common.util.process.ResultCode;
import com.github.wxiaoqi.security.common.vo.PageDataVO; import com.github.wxiaoqi.security.common.vo.PageDataVO;
...@@ -412,57 +413,27 @@ public class OrderMemberService extends AbstractOrderHandle<OrderMemberDetailBiz ...@@ -412,57 +413,27 @@ public class OrderMemberService extends AbstractOrderHandle<OrderMemberDetailBiz
BigDecimal totalAmount = baseOrders.stream().filter(x->x.getHasPay()==1).map(MemberOrderBo::getOrderAmount).reduce(BigDecimal.ZERO, (x, y) -> x.add(y)); BigDecimal totalAmount = baseOrders.stream().filter(x->x.getHasPay()==1).map(MemberOrderBo::getOrderAmount).reduce(BigDecimal.ZERO, (x, y) -> x.add(y));
memberOrderStatisticsBo.setTotalAmount(totalAmount); memberOrderStatisticsBo.setTotalAmount(totalAmount);
List<MemberOrderBo> diamondOrders = baseOrderMap.get(levelEnum.DIAMOND.getLevel()); List<MemberOrderBo> diamondOrders = baseOrderMap.get(LevelEnum.DIAMOND.getLevel());
memberOrderStatisticsBo.setDiamondOrderNum(diamondOrders==null?0:diamondOrders.size()); memberOrderStatisticsBo.setDiamondOrderNum(diamondOrders==null?0:diamondOrders.size());
List<MemberOrderBo> diamondHashPayOrders = baseOrderHasPayMap.get(levelEnum.DIAMOND.getLevel()); List<MemberOrderBo> diamondHashPayOrders = baseOrderHasPayMap.get(LevelEnum.DIAMOND.getLevel());
diamondHashPayOrders = diamondHashPayOrders==null?Collections.EMPTY_LIST:diamondHashPayOrders; diamondHashPayOrders = diamondHashPayOrders==null?Collections.EMPTY_LIST:diamondHashPayOrders;
BigDecimal diamondAmount = diamondHashPayOrders.stream().map(MemberOrderBo::getOrderAmount).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal diamondAmount = diamondHashPayOrders.stream().map(MemberOrderBo::getOrderAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
memberOrderStatisticsBo.setTotalDiamondAmount(diamondAmount); memberOrderStatisticsBo.setTotalDiamondAmount(diamondAmount);
List<MemberOrderBo> goldOrders = baseOrderMap.get(levelEnum.GOLD.getLevel()); List<MemberOrderBo> goldOrders = baseOrderMap.get(LevelEnum.GOLD.getLevel());
memberOrderStatisticsBo.setGoldOrderNum(goldOrders==null?0:goldOrders.size()); memberOrderStatisticsBo.setGoldOrderNum(goldOrders==null?0:goldOrders.size());
List<MemberOrderBo> goldHasPayOrders = baseOrderHasPayMap.get(levelEnum.GOLD.getLevel()); List<MemberOrderBo> goldHasPayOrders = baseOrderHasPayMap.get(LevelEnum.GOLD.getLevel());
goldHasPayOrders = goldHasPayOrders==null?Collections.EMPTY_LIST:goldHasPayOrders; goldHasPayOrders = goldHasPayOrders==null?Collections.EMPTY_LIST:goldHasPayOrders;
BigDecimal goldAmount = goldHasPayOrders.stream().map(MemberOrderBo::getOrderAmount).reduce(BigDecimal.ZERO, (x, y) -> x.add(y)); BigDecimal goldAmount = goldHasPayOrders.stream().map(MemberOrderBo::getOrderAmount).reduce(BigDecimal.ZERO, (x, y) -> x.add(y));
memberOrderStatisticsBo.setTotalGoldAmount(goldAmount); memberOrderStatisticsBo.setTotalGoldAmount(goldAmount);
List<MemberOrderBo> generalOrders = baseOrderMap.get(levelEnum.GENERAL.getLevel()); List<MemberOrderBo> generalOrders = baseOrderMap.get(LevelEnum.GENERAL.getLevel());
memberOrderStatisticsBo.setGeneralOrderNum(generalOrders==null?0:generalOrders.size()); memberOrderStatisticsBo.setGeneralOrderNum(generalOrders==null?0:generalOrders.size());
List<MemberOrderBo> generalHasPayOrders = baseOrderHasPayMap.get(levelEnum.GENERAL.getLevel()); List<MemberOrderBo> generalHasPayOrders = baseOrderHasPayMap.get(LevelEnum.GENERAL.getLevel());
generalHasPayOrders = generalHasPayOrders==null?Collections.EMPTY_LIST:generalHasPayOrders; generalHasPayOrders = generalHasPayOrders==null?Collections.EMPTY_LIST:generalHasPayOrders;
BigDecimal generalAmount = generalHasPayOrders.stream().map(MemberOrderBo::getOrderAmount).reduce(BigDecimal.ZERO, (x, y) -> x.add(y)); BigDecimal generalAmount = generalHasPayOrders.stream().map(MemberOrderBo::getOrderAmount).reduce(BigDecimal.ZERO, (x, y) -> x.add(y));
memberOrderStatisticsBo.setTotalGeneralAmount(generalAmount); memberOrderStatisticsBo.setTotalGeneralAmount(generalAmount);
return memberOrderStatisticsBo; return memberOrderStatisticsBo;
} }
private enum levelEnum{
DIAMOND(3,"钻石"),
GOLD(2,"黄金"),
GENERAL(1,"普通");
levelEnum(Integer level,String desc) {
this.level = level;
this.desc = desc;
}
private Integer level;
private String desc;
public Integer getLevel() {
return level;
}
public void setLevel(Integer level) {
this.level = level;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
} }
...@@ -151,9 +151,6 @@ ...@@ -151,9 +151,6 @@
<if test="no != null and no != '' "> <if test="no != null and no != '' ">
and no like CONCAT ("%", #{no}, "%") and no like CONCAT ("%", #{no}, "%")
</if> </if>
<if test="oneNo != null and oneNo != '' ">
and no =#{oneNo}
</if>
<if test="name != null"> <if test="name != null">
and b.name like CONCAT ("%", #{name}, "%") and b.name like CONCAT ("%", #{name}, "%")
</if> </if>
...@@ -295,7 +292,6 @@ ...@@ -295,7 +292,6 @@
order by crtTime desc order by crtTime desc
</select> </select>
<select id="getTourList" parameterType="Map" resultMap="orderPageMap"> <select id="getTourList" parameterType="Map" resultMap="orderPageMap">
select b.* select b.*
from base_order b from base_order b
...@@ -319,6 +315,33 @@ ...@@ -319,6 +315,33 @@
order by b.crt_time desc order by b.crt_time desc
</select> </select>
<select id="selectAllCountOrder" parameterType="Map" resultMap="orderPageMap">
SELECT bo.* from base_order bo
LEFT JOIN order_rent_vehicle_detail orv on bo.id = orv.order_id
where bo.type = 1 and (bo.status >= 4 or bo.status = -1)
and
(
(
orv.start_time &gt; #{startTime}
AND orv.start_time &lt; #{startTime}
AND orv.end_time &gt; #{endTime}
)
OR (
orv.start_time &lt; #{startTime}
AND orv.end_time &gt; #{endTime}
)
OR (
orv.start_time &lt; #{startTime}
AND orv.end_time &gt; #{endTime}
AND orv.end_time &lt; #{endTime}
)
OR (
orv.start_time &gt; #{startTime}
AND orv.end_time &lt; #{endTime}
)
)
</select>
<select id="getOrderDetail" parameterType="java.lang.String" resultMap="orderPageMap"> <select id="getOrderDetail" parameterType="java.lang.String" resultMap="orderPageMap">
select * select *
from base_order from base_order
...@@ -329,7 +352,7 @@ ...@@ -329,7 +352,7 @@
select b.* select b.*
from base_order b from base_order b
LEFT JOIN order_rent_vehicle_detail r on r.order_id = b.id LEFT JOIN order_rent_vehicle_detail r on r.order_id = b.id
where b.type = 2 and b.status &gt;= 4 where b.type = 1 and (b.status &gt;= 4 or b.status = -1)
<if test="startTime != null and status == 1"> <if test="startTime != null and status == 1">
and r.start_time between #{startTime} and #{endTime} and r.start_time between #{startTime} and #{endTime}
</if> </if>
...@@ -412,11 +435,10 @@ ...@@ -412,11 +435,10 @@
</select> </select>
<select id="selectOrdersByTypeAndTime" resultType="com.xxfc.platform.order.pojo.dto.OrderDTO"> <select id="selectOrdersByTypeAndTime" resultType="com.xxfc.platform.order.pojo.dto.OrderDTO">
select bo.id,bo.type,bo.status,bo.order_amount,bo.real_amount,bo.order_origin,bo.parent_user_id as `userId`,bo.parent_postion_id as `postionId`, select bo.id,bo.type,bo.status,bo.order_amount,bo.real_amount,bo.order_origin,bo.parent_user_id as `userId`,bo.parent_position_id as `postionId`,
bo.has_pay,bo.pay_way,omd.memberLevel,IFNULL(IFNULL(orvd.start_company_id,otd.start_company_id),`parent_user_company_id`) AS `companyId`,orvd.deposit,orvd.cost_detail_extend AS `costDetailExtend` from (select `id`,`type`,`status`,`order_amount` AS `orderAmount`, `real_amount`AS bo.has_pay,bo.pay_way,omd.memberLevel,IFNULL(IFNULL(orvd.start_company_id,otd.start_company_id),`parent_user_company_id`) AS `companyId`,
`realAmount`,`order_origin` AS `orderOrigin`, `has_pay` AS `hasPay`, orvd.deposit,orvd.cost_detail AS `costDetail`
`pay_way` AS `payWay` from (select * from `base_order` where 1=1
from `base_order` where 1=1
<if test="hasPay!=null"> <if test="hasPay!=null">
and `has_pay`=#{hasPay} and `has_pay`=#{hasPay}
</if> </if>
...@@ -426,7 +448,7 @@ ...@@ -426,7 +448,7 @@
separator=","> separator=",">
#{type} #{type}
</foreach> ) AS `bo` </foreach> ) AS `bo`
LEFT JOIN (select `order_id`,`start_company_id`,`deposit`,`cost_detail_extend` from `order_rent_vehicle_detail`) AS `orvd` ON LEFT JOIN (select `order_id`,`start_company_id`,`deposit`,`cost_detail` from `order_rent_vehicle_detail`) AS `orvd` ON
orvd.order_id=bo.id orvd.order_id=bo.id
LEFT JOIN (select `order_id`,`start_company_id` from `order_tour_detail`) AS `otd` ON otd.order_id=bo.id LEFT JOIN (select `order_id`,`start_company_id` from `order_tour_detail`) AS `otd` ON otd.order_id=bo.id
LEFT JOIN (select `order_id`,`member_level` AS `memberLevel` from `order_member_detail`) AS `omd` ON LEFT JOIN (select `order_id`,`member_level` AS `memberLevel` from `order_member_detail`) AS `omd` ON
......
...@@ -84,7 +84,7 @@ ...@@ -84,7 +84,7 @@
bo.pay_way, bo.pay_way,
bo.has_pay, bo.has_pay,
IFNULL(brvd.start_company_id,IFNULL(otd.start_company_id,bo.parent_user_company_id)) AS `companyId`, IFNULL(brvd.start_company_id,IFNULL(otd.start_company_id,bo.parent_user_company_id)) AS `companyId`,
brvd.cost_detail_extend AS `costDetailExtend`, brvd.cost_detail AS `costDetail`,
brvd.damage_safe AS `damageSafe`, brvd.damage_safe AS `damageSafe`,
omd.member_level AS `memberLevel` omd.member_level AS `memberLevel`
...@@ -92,38 +92,38 @@ ...@@ -92,38 +92,38 @@
`order_account` AS `oa` `order_account` AS `oa`
LEFT JOIN `base_order` AS `bo` ON bo.id = oa.order_id LEFT JOIN `base_order` AS `bo` ON bo.id = oa.order_id
LEFT 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_tour_detail` as `otd` ON otd.order_id=oa.order_id LEFT JOIN `order_tour_detail` AS `otd` ON otd.order_id=oa.order_id
LEFT JOIN `order_member_detail` AS `omd` ON omd.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`.account_status=1 AND oa.`crt_time` BETWEEN #{startTime} AND #{endTime} WHERE bo.type=#{orderType} AND (`oa`.account_status=1 or(bo.pay_way=0 AND bo.has_pay=1 AND oa.account_status=0)) AND oa.`crt_time` BETWEEN #{startTime} AND #{endTime}
</select> </select>
<select id="selectByDateAndStatffIds" resultType="com.xxfc.platform.order.pojo.account.OrderAccountBo"> <select id="selectByDateAndStatffIds" resultType="com.xxfc.platform.order.pojo.account.OrderAccountBo">
oa.*, oa.*,
bo.id, bo.id,
bo.`status`, bo.`status`,
bo.order_origin, bo.order_origin,
bo.pay_way, bo.pay_way,
bo.has_pay, bo.has_pay,
bo.parent_user_id as `userId`, bo.parent_user_id as `userId`,
bo.parent_position_id as `postionId`, bo.parent_position_id as `postionId`,
IFNULL(brvd.start_company_id,IFNULL(otd.start_company_id,bo.parent_user_company_id)) AS `companyId`, IFNULL(brvd.start_company_id,IFNULL(otd.start_company_id,bo.parent_user_company_id)) AS `companyId`,
brvd.cost_detail_extend AS `costDetailExtend`, brvd.cost_detail_extend AS `costDetailExtend`,
brvd.damage_safe AS `damageSafe`, brvd.damage_safe AS `damageSafe`,
omd.member_level AS `memberLevel` omd.member_level AS `memberLevel`
FROM FROM
`order_account` AS `oa` `order_account` AS `oa`
LEFT JOIN `base_order` AS `bo` ON bo.id = oa.order_id LEFT JOIN `base_order` AS `bo` ON bo.id = oa.order_id
LEFT 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_tour_detail` as `otd` ON otd.order_id=oa.order_id LEFT JOIN `order_tour_detail` as `otd` ON otd.order_id=oa.order_id
LEFT JOIN `order_member_detail` AS `omd` ON omd.order_id=oa.order_id LEFT JOIN `order_member_detail` AS `omd` ON omd.order_id=oa.order_id
WHERE `oa`.account_status=1 WHERE `oa`.account_status=1
AND oa.`crt_time` BETWEEN #{startDate} AND #{endDate} AND oa.`crt_time` BETWEEN #{startDate} AND #{endDate}
<if test="staffUserIds!=null and staffUserIds.size>0"> <if test="staffUserIds!=null and staffUserIds.size>0">
and bo.id IN <foreach collection="staffUserIds" item="staffId" open="(" close=")" separator=","> and bo.id IN <foreach collection="staffUserIds" item="staffId" open="(" close=")" separator=",">
#{staffId} #{staffId}
</foreach> </foreach>
</if> </if>
</select> </select>
</mapper> </mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxfc.platform.order.mapper.OrderMemberReceivedStatisticsMapper">
<!-- 可根据自己的需求,是否要使用 -->
<resultMap type="com.xxfc.platform.order.entity.OrderMemberReceivedStatistics" id="orderMemberReceivedStatisticsMap">
<result property="id" column="id"/>
<result property="year" column="year"/>
<result property="month" column="month"/>
<result property="date" column="date"/>
<result property="weekOfYear" column="week_of_year"/>
<result property="companyName" column="company_name"/>
<result property="extraAmount" column="extra_amount"/>
<result property="lateFeeAmount" column="late_fee_amount"/>
<result property="orderRefundAmount" column="order_refund_amount"/>
<result property="companyName" column="company_name"/>
<result property="totalAmount" column="total_amount"/>
<result property="toalCommonAmmount" column="toal_common_ammount"/>
<result property="totalCommonQuantity" column="total_common_quantity"/>
<result property="totalGoldAmount" column="total_gold_amount"/>
<result property="totalGoldQuantity" column="total_gold_quantity"/>
<result property="totalDiamondAmmount" column="total_diamond_ammount"/>
<result property="totalDiamondQuantity" column="total_diamond_quantity"/>
<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"/>
</resultMap>
<select id="selectOrderMemberReceivedStatistics" resultMap="orderMemberReceivedStatisticsMap">
select * from `order_member_received_statistics` where 1=1
<if test="orderState!=null">
and `is_finish`=#{orderState}
</if>
<if test="orderOrigin!=null">
and `order_origin`=#{orderOrigin}
</if>
<if test="payWay!=null">
and `pay_way`=#{payWay}
</if>
<if test="startDate!=null and endDate!=null">
and `date` between #{startDate} and #{endDate}
</if>
<if test="startDate!=null and endDate==null">
and <![CDATA[
`date` >= #{startDate}
]]>
</if>
<if test="startDate==null and endDate!=null">
and <![CDATA[
`date` <= #{endDate}
]]>
</if>
</select>
<delete id="inserMemberReceivedtList">
</delete>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxfc.platform.order.mapper.OrderReceivedStatisticsMapper">
<!-- 可根据自己的需求,是否要使用 -->
<resultMap type="com.xxfc.platform.order.entity.OrderReceivedStatistics" id="orderReceivedStatisticsMap">
<result property="id" column="id"/>
<result property="year" column="year"/>
<result property="month" column="month"/>
<result property="date" column="date"/>
<result property="weekOfYear" column="week_of_year"/>
<result property="breakRulesRegulationAmount" column="break_rules_regulation_amount"/>
<result property="companyName" column="company_name"/>
<result property="depositAmount" column="deposit_amount"/>
<result property="depositRefundAmount" column="deposit_refund_amount"/>
<result property="extraAmount" column="extra_amount"/>
<result property="lateFeeAmount" column="late_fee_amount" />
<result property="lossSpecifiedAmount" column="loss_specified_amount" />
<result property="memberAmount" column="member_amount" />
<result property="travelAmount" column="travel_amount"/>
<result property="rentVehicleAmount" column="rent_vehicle_amount"/>
<result property="noDeductibleAmount" column="no_deductible_amount"/>
<result property="noDeductibleRefundAmount" column="no_deductible_refund_amount"/>
<result property="orderRefundAmount" column="order_refund_amount"/>
<result property="totalAmount" column="total_amount"/>
<result property="totalQuantity" column="total_quantity"/>
<result property="orderOrigin" column="order_origin"/>
<result property="payWay" column="pay_way"/>
<result property="companyId" column="company_id"/>
<result property="crtTime" column="crt_time"/>
</resultMap>
<select id="selectOrderReceivedStatisticsList" resultMap="orderReceivedStatisticsMap">
select * from `order_received_statistics` where 1=1
<if test="orderState!=null">
and `is_finish`=#{orderState}
</if>
<if test="orderOrigin!=null">
and `order_origin`=#{orderOrigin}
</if>
<if test="payWay!=null">
and `pay_way`=#{payWay}
</if>
<if test="startDate!=null and endDate!=null">
and `date` between #{startDate} and #{endDate}
</if>
<if test="startDate!=null and endDate==null">
and <![CDATA[
`date` >= #{startDate}
]]>
</if>
<if test="startDate==null and endDate!=null">
and <![CDATA[
`date` <= #{endDate}
]]>
</if>
</select>
<!--按日统计-->
<select id="selectCompanyPerformanceWithDay" resultType="com.xxfc.platform.order.bo.CompanyPerformanceBo">
SELECT
ors.*,
IFNULL(ovss.departureNum,0) as `departureNum`,
IFNULL(ovss.rentDays,0) as `rentDays`,
IFNULL(ovss.arrivalNum,0) as `arrivalNum`
FROM
(
SELECT
`company_id` AS `companyId`,
`year`,
`date`,
SUM(`member_amount`-`member_refund_amount`) AS `memberAmount`,
SUM(`travel_amount`-`travel_refund_amount` ) AS `travelAmount`,
SUM(`rent_vehicle_amount`-`rent_vehicle_refund_amount`) AS `rentVehilceAmount`,
SUM(`no_deductible_amount` - `no_deductible_refund_amount`) as `noDeductibleAmount`,
SUM(`deposit_amount` - `deposit_refund_amount`) as `depositAmount`
FROM
`order_received_statistics` WHERE `has_pay`=1
<if test="companyName!=null and companyName!=''">
AND `company_name` LIKE CONCAT('%',#{companyName},'%')
</if>
<if test="companyId!=null">
AND `company_id`=#{companyId}
</if>
<if test="startDate!=null and endDate!=null">
AND `date` BETWEEN #{startDate} AND #{endDate}
</if>
<if test="startDate!=null and endDate==null">
AND <![CDATA[
`date` >= #{startDate}
]]>
</if>
<if test="startDate==null and endDate!=null">
AND <![CDATA[
`date` <= #{startDate}
]]>
</if>
GROUP BY
`company_id` ,
`year`,
`date`
<if test="page!=null and limit!=null">
limit #{startIndex},#{endInex}
</if>
) AS `ors`
LEFT JOIN (
SELECT
`company_id` AS `cyid`,
`count_date`,
IFNULL(SUM( `departure_num` ),0) AS `departureNum`,
IFNULL(SUM( `arrival_num` ),0) AS `arrivalNum`,
IFNULL(SUM( `rent_num` ),0) AS `rentDays`
FROM
`order_vehicle_service_statistics` WHERE 1=1
<if test="companyId!=null">
AND `company_id`=#{companyId}
</if>
<if test="startDate!=null and endDate!=null">
AND `count_date` BETWEEN #{startDate} AND #{endDate}
</if>
<if test="startDate!=null and endDate==null">
AND <![CDATA[
`count_date` >= #{startDate}
]]>
</if>
<if test="startDate==null and endDate!=null">
AND <![CDATA[
`count_date` <= #{startDate}
]]>
</if>
GROUP BY
`company_id`,
`count_year`,
`count_date`
) AS `ovss` ON ovss.cyid = ors.companyId
AND ovss.count_date = ors.date
<!-- order by ors.rentVehilceAmount desc,ors.memberAmount desc,ors.travelAmount desc,ors.depositAmount desc,ors.noDeductibleAmount desc ,rentDays desc,departureNum desc, arrivalNum desc-->
</select>
<!--按月统计-->
<select id="selectCompanyPerformanceWithMonth"
resultType="com.xxfc.platform.order.bo.CompanyPerformanceBo">
SELECT
ors.*,
IFNULL(ovss.departureNum,0) as `departureNum`,
IFNULL(ovss.rentDays,0) as `rentDays`,
IFNULL(ovss.arrivalNum,0) as `arrivalNum`
FROM
(
SELECT
company_id AS `companyId`,
`year`,
`month`,
SUM(`member_amount`-`member_refund_amount`) AS `memberAmount`,
SUM(`travel_amount`-`travel_refund_amount` ) AS `travelAmount`,
SUM(`rent_vehicle_amount`-`rent_vehicle_refund_amount`) AS `rentVehilceAmount`,
SUM(`no_deductible_amount` - `no_deductible_refund_amount`) as `noDeductibleAmount`,
SUM(`deposit_amount` - `deposit_refund_amount`) as `depositAmount`
FROM
`order_received_statistics` WHERE `has_pay`=1
<if test="companyName!=null and companyName!=''">
AND `company_name` LIKE CONCAT('%',#{companyName},'%')
</if>
<if test="companyId!=null">
AND `company_id`=#{companyId}
</if>
<if test="startDate!=null and endDate!=null">
AND `date` BETWEEN #{startDate} AND #{endDate}
</if>
<if test="startDate!=null and endDate==null">
AND <![CDATA[
`date` >= #{startDate}
]]>
</if>
<if test="startDate==null and endDate!=null">
AND <![CDATA[
`date` <= #{startDate}
]]>
</if>
GROUP BY
company_id,
`year`,
`month`
<if test="page!=null and limit!=null">
limit #{startIndex},#{endInex}
</if>
) AS `ors`
LEFT JOIN (
SELECT
`company_id` AS `cyid`,
`count_month`,
COALESCE(SUM( `departure_num` ),0) AS `departureNum`,
COALESCE(SUM( `arrival_num` ),0) AS `arrivalNum`,
COALESCE(SUM( `rent_num` ),0) AS `rentDays`
FROM
`order_vehicle_service_statistics` WHERE 1=1
<if test="companyId!=null">
AND `company_id`=#{companyId}
</if>
<if test="startDate!=null and endDate!=null">
AND `count_date` BETWEEN #{startDate} AND #{endDate}
</if>
<if test="startDate!=null and endDate==null">
AND <![CDATA[
`count_date` >= #{startDate}
]]>
</if>
<if test="startDate==null and endDate!=null">
AND <![CDATA[
`count_date` <= #{startDate}
]]>
</if>
GROUP BY
`company_id`,
`count_year`,
`count_month`
) AS `ovss` ON ovss.cyid = ors.companyId
AND ovss.count_month = ors.month
<!--order by ors.rentVehilceAmount desc,ors.memberAmount desc,ors.travelAmount desc,ors.depositAmount desc,ors.noDeductibleAmount desc ,rentDays desc,departureNum desc, arrivalNum desc-->
</select>
<!--按周统计-->
<select id="selectCompanyPerformanceWithWeek" resultType="com.xxfc.platform.order.bo.CompanyPerformanceBo">
SELECT
ors.*,
IFNULL(ovss.departureNum,0) as `departureNum`,
IFNULL(ovss.rentDays,0) as `rentDays`,
IFNULL(ovss.arrivalNum,0) as `arrivalNum`
FROM
(
SELECT
company_id AS `companyId`,
`year`,
`week_of_year` AS `weekOfYear`,
SUM(`member_amount`-`member_refund_amount`) AS `memberAmount`,
SUM(`travel_amount`-`travel_refund_amount` ) AS `travelAmount`,
SUM(`rent_vehicle_amount`-`rent_vehicle_refund_amount`) AS `rentVehilceAmount`,
SUM(`no_deductible_amount` - `no_deductible_refund_amount`) as `noDeductibleAmount`,
SUM(`deposit_amount` - `deposit_refund_amount`) as `depositAmount`
FROM
`order_received_statistics` WHERE `has_pay`=1
<if test="companyName!=null and companyName!=''">
AND `company_name` LIKE CONCAT('%',#{companyName},'%')
</if>
<if test="companyId!=null">
AND `company_id`=#{companyId}
</if>
<if test="startDate!=null and endDate!=null">
AND `date` BETWEEN #{startDate} AND #{endDate}
</if>
<if test="startDate!=null and endDate==null">
AND <![CDATA[
`date` >= #{startDate}
]]>
</if>
<if test="startDate==null and endDate!=null">
AND <![CDATA[
`date` <= #{startDate}
]]>
</if>
GROUP BY
company_id,
`year`,
`week_of_year`
<if test="page!=null and limit!=null">
limit #{startIndex},#{endInex}
</if>
) AS `ors`
LEFT JOIN (
SELECT
`company_id` AS `cyid`,
`count_week`,
IFNULL(SUM( `departure_num` ),0) AS `departureNum`,
IFNULL(SUM( `arrival_num` ),0) AS `arrivalNum`,
IFNULL(SUM( `rent_num` ),0) AS `rentDays`
FROM
`order_vehicle_service_statistics`
WHERE 1=1
<if test="companyId!=null">
AND `company_id`=#{companyId}
</if>
<if test="startDate!=null and endDate!=null">
AND `count_date` BETWEEN #{startDate} AND #{endDate}
</if>
<if test="startDate!=null and endDate==null">
AND <![CDATA[
`count_date` >= #{startDate}
]]>
</if>
<if test="startDate==null and endDate!=null">
AND <![CDATA[
`count_date` <= #{startDate}
]]>
</if>
GROUP BY
`company_id`,
`count_year`,
`count_week`
) AS `ovss` ON ovss.cyid = ors.companyId
AND ovss.count_week = ors.weekOfYear
<!-- order by ors.rentVehilceAmount desc,ors.memberAmount desc,ors.travelAmount desc,ors.depositAmount desc,ors.noDeductibleAmount desc ,rentDays desc,departureNum desc, arrivalNum desc-->
</select>
<select id="selectCountByDate" resultType="int">
select count(*) from (SELECT `date` FROM `order_received_statistics` WHERE `has_pay`=1
<if test="companyName!=null and companyName!=''">
AND `company_name` LIKE CONCAT('%',#{companyName},'%')
</if>
<if test="companyId!=null">
AND `company_id`=#{companyId}
</if>
<if test="startDate!=null and endDate!=null">
AND `date` BETWEEN #{startDate} AND #{endDate}
</if>
<if test="startDate!=null and endDate==null">
AND <![CDATA[
`date` >= #{startDate}
]]>
</if>
<if test="startDate==null and endDate!=null">
AND <![CDATA[
`date` <= #{startDate}
]]>
</if>
GROUP BY
company_id,
`year`,
`date`
) as `ds`
</select>
<select id="selectCountByMonth" resultType="int">
select count(*) from (SELECT `month` FROM `order_received_statistics` WHERE `has_pay`=1
<if test="companyName!=null and companyName!=''">
AND `company_name` LIKE CONCAT('%',#{companyName},'%')
</if>
<if test="companyId!=null">
AND `company_id`=#{companyId}
</if>
<if test="startDate!=null and endDate!=null">
AND `date` BETWEEN #{startDate} AND #{endDate}
</if>
<if test="startDate!=null and endDate==null">
AND <![CDATA[
`date` >= #{startDate}
]]>
</if>
<if test="startDate==null and endDate!=null">
AND <![CDATA[
`date` <= #{startDate}
]]>
</if>
GROUP BY
company_id,
`year`,
`month`
) as `ds`
</select>
<select id="selectCountByWeekOfYear" resultType="int">
select count(*) from (SELECT `week_of_year` FROM `order_received_statistics` WHERE `has_pay`=1
<if test="companyName!=null and companyName!=''">
AND `company_name` LIKE CONCAT('%',#{companyName},'%')
</if>
<if test="companyId!=null">
AND `company_id`=#{companyId}
</if>
<if test="startDate!=null and endDate!=null">
AND `date` BETWEEN #{startDate} AND #{endDate}
</if>
<if test="startDate!=null and endDate==null">
AND <![CDATA[
`date` >= #{startDate}
]]>
</if>
<if test="startDate==null and endDate!=null">
AND <![CDATA[
`date` <= #{startDate}
]]>
</if>
GROUP BY
company_id,
`year`,
`week_of_year`
) as `ds`
</select>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxfc.platform.order.mapper.OrderRentVehicleReceivedStatisticsMapper">
<!-- 可根据自己的需求,是否要使用 -->
<resultMap type="com.xxfc.platform.order.entity.OrderRentVehicleReceivedStatistics" id="orderRentVehicleReceivedStatisticsMap">
<result property="id" column="id"/>
<result property="year" column="year"/>
<result property="month" column="month"/>
<result property="date" column="date"/>
<result property="weekOfYear" column="week_of_year"/>
<result property="totalAmount" column="total_amount"/>
<result property="totalQuantity" column="total_quantity"/>
<result property="hasPay" column="has_pay"/>
<result property="orderOrigin" column="order_origin"/>
<result property="payWay" column="pay_way"/>
<result property="companyId" column="company_id"/>
<result property="crtTime" column="crt_time"/>
</resultMap>
<select id="selectOrderRentVehicleReceivedStatistics" resultMap="orderRentVehicleReceivedStatisticsMap">
select * from `order_rent_vehicle_received_statistics` where 1=1
<if test="orderState!=null">
and `is_finish`=#{orderState}
</if>
<if test="orderOrigin!=null">
and `order_origin`=#{orderOrigin}
</if>
<if test="payWay!=null">
and `pay_way`=#{payWay}
</if>
<if test="startDate!=null and endDate!=null">
and `date` between #{startDate} and #{endDate}
</if>
<if test="startDate!=null and endDate==null">
and <![CDATA[
`date` >= #{startDate}
]]>
</if>
<if test="startDate==null and endDate!=null">
and <![CDATA[
`date` <= #{endDate}
]]>
</if>
</select>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxfc.platform.order.mapper.OrderTourReceivedStatisticsMapper">
<!-- 可根据自己的需求,是否要使用 -->
<resultMap type="com.xxfc.platform.order.entity.OrderTourReceivedStatistics" id="orderTourReceivedStatisticsMap">
<result property="id" column="id"/>
<result property="year" column="year"/>
<result property="month" column="month"/>
<result property="date" column="date"/>
<result property="weekOfYear" column="week_of_year"/>
<result property="companyName" column="company_name"/>
<result property="extraAmount" column="extra_amount"/>
<result property="lateFeeAmount" column="late_fee_amount"/>
<result property="orderRefundAmount" column="order_refund_amount"/>
<result property="totalAmount" column="total_amount"/>
<result property="totalQuantity" column="total_quantity"/>
<result property="hasPay" column="has_pay"/>
<result property="orderOrigin" column="order_origin"/>
<result property="payWay" column="pay_way"/>
<result property="companyId" column="company_id"/>
<result property="crtTime" column="crt_time"/>
</resultMap>
<select id="selectOrderTourReceivedStatistics" resultMap="orderTourReceivedStatisticsMap">
select * from `order_tour_received_statistics` where 1=1
<if test="orderState!=null">
and `is_finish`=#{orderState}
</if>
<if test="orderOrigin!=null">
and `order_origin`=#{orderOrigin}
</if>
<if test="payWay!=null">
and `pay_way`=#{payWay}
</if>
<if test="startDate!=null and endDate!=null">
and `date` between #{startDate} and #{endDate}
</if>
<if test="startDate!=null and endDate==null">
and <![CDATA[
`date` >= #{startDate}
]]>
</if>
<if test="startDate==null and endDate!=null">
and <![CDATA[
`date` <= #{endDate}
]]>
</if>
</select>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.xxfc.platform.order.mapper.OrderVehicleServiceStatisticsMapper" >
<!--统计车辆服务次数-->
<select id="countVehicleServiceNum" parameterType="Map" resultType="com.xxfc.platform.order.pojo.CountVehicleServiceNumVo">
SELECT tmp1.countYear,tmp1.countMonth,tmp1.countDay, tmp1.companyId, tmp1.countWeek, tmp1.countNum as departureNum, tmp2.countNum as arrivalNum from (
SELECT YEAR(FROM_UNIXTIME(o.crt_time/1000)) as countYear, MONTH(FROM_UNIXTIME(o.crt_time/1000)) AS countMonth, DAY(FROM_UNIXTIME(o.crt_time/1000)) AS countDay, WEEK(FROM_UNIXTIME(o.crt_time/1000))as countWeek, o1.start_company_id as companyId, count(*) as countNum from order_vehicle_crosstown o
LEFT JOIN order_rent_vehicle_detail o1 on o.order_id = o1.order_id
where o.type = 1
<if test="startTime != null">
and o.crt_time &gt;= #{startTime} and o.crt_time &lt;= #{endTime}
</if>
GROUP BY companyId, countYear,countMonth,countDay,countWeek
) tmp1
LEFT JOIN
(SELECT YEAR(FROM_UNIXTIME(o.crt_time/1000)) as countYear, MONTH(FROM_UNIXTIME(o.crt_time/1000)) AS countMonth, DAY(FROM_UNIXTIME(o.crt_time/1000)) AS countDay, WEEK(FROM_UNIXTIME(o.crt_time/1000))as countWeek, o1.end_company_id as companyId, count(*) as countNum from order_vehicle_crosstown o
LEFT JOIN order_rent_vehicle_detail o1 on o.order_id = o1.order_id
where (o.type = 2 or o.type = 3)
<if test="startTime != null">
and o.crt_time &gt;= #{startTime} and o.crt_time &lt;= #{endTime}
</if>
GROUP BY companyId, countYear,countMonth,countDay,countWeek
) tmp2 on tmp1.companyId = tmp2.companyId
</select>
<select id="selectByCompanyIdAndDate" resultType="com.xxfc.platform.order.entity.OrderVehicleServiceStatistics" parameterType="com.xxfc.platform.order.entity.OrderVehicleServiceStatistics">
select * from order_vehicle_service_statistics where company_id = #{companyId} and count_date = #{countDate}
</select>
</mapper>
\ No newline at end of file
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import com.xxfc.platform.order.OrderApplication; import com.xxfc.platform.order.OrderApplication;
import com.xxfc.platform.order.biz.DailyOrderStatisticsBiz; import com.xxfc.platform.order.biz.*;
import com.xxfc.platform.order.biz.OrderStatisticsBiz;
import com.xxfc.platform.order.jobhandler.BaseOrderStatisticsJobHandler; import com.xxfc.platform.order.jobhandler.BaseOrderStatisticsJobHandler;
import com.xxfc.platform.order.jobhandler.SaffStatisticsJobHandler; import com.xxfc.platform.order.jobhandler.OrderReceivedStatisticsJobHandler;
import com.xxfc.platform.order.pojo.HomePageOrderData; import com.xxfc.platform.order.pojo.HomePageOrderData;
import com.xxfc.platform.vehicle.feign.VehicleFeign;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.junit.Test; import org.junit.Test;
...@@ -14,7 +16,10 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; ...@@ -14,7 +16,10 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Date; import java.util.Date;
import java.util.Map;
/** /**
* @author libin * @author libin
...@@ -36,12 +41,21 @@ public class ServiceTest { ...@@ -36,12 +41,21 @@ public class ServiceTest {
private BaseOrderStatisticsJobHandler handler; private BaseOrderStatisticsJobHandler handler;
@Autowired @Autowired
private SaffStatisticsJobHandler statisticsJobHandler; private OrderMemberReceivedStatisticsBiz orderMemberReceivedStatisticsBiz;
@Autowired
private OrderRentVehicleReceivedStatisticsBiz orderRentVehicleReceivedStatisticsBiz;
@Autowired
private OrderReceivedStatisticsJobHandler orderReceivedStatisticsJobHandler;
@Autowired
private OrderTourReceivedStatisticsBiz orderTourReceivedStatisticsBiz;
@Autowired
private VehicleFeign vehicleFeign;
@Test @Test
public void testSchedu(){ public void testSchedu(){
dailyOrderStatisticsBiz.statisticalOrder(1); dailyOrderStatisticsBiz.statisticalOrder(1);
} }
@Test @Test
...@@ -83,9 +97,46 @@ public class ServiceTest { ...@@ -83,9 +97,46 @@ public class ServiceTest {
} }
@Test @Test
@SneakyThrows public void testMemberStatistics(){
public void testStaffStatisticsJob(){ Date date = DateTime.parse("2019-11-15").toDate();
statisticsJobHandler.execute(""); Date startDate = DateUtil.beginOfDay(date).toJdkDate();
Date endDate = DateUtil.endOfDay(date).toJdkDate();
Map<Integer, String> companyMap = vehicleFeign.findCompanyMap();
orderMemberReceivedStatisticsBiz.orderMemberReceivedStatistics(startDate,endDate,companyMap);
}
@Test
public void testRentVehicleStatistics(){
Date date = DateTime.parse("2019-11-29").toDate();
Date startDate = DateUtil.beginOfDay(date).toJdkDate();
Date endDate = DateUtil.endOfDay(date).toJdkDate();
Map<Integer, String> companyMap = vehicleFeign.findCompanyMap();
orderRentVehicleReceivedStatisticsBiz.orderRentVehicleReceivedStatistics(startDate,endDate,companyMap);
}
@Test
public void testTourStatistics(){
Date date = DateTime.parse("2019-11-15").toDate();
Date startDate = DateUtil.beginOfDay(date).toJdkDate();
Date endDate = DateUtil.endOfDay(date).toJdkDate();
Map<Integer, String> companyMap = vehicleFeign.findCompanyMap();
orderTourReceivedStatisticsBiz.orderTourInsertStatisticsNew(startDate,endDate,companyMap);
} }
@Test
@SneakyThrows
public void testOrderReceivedStatisticsJobHandler(){
cn.hutool.core.date.DateTime dateTime = DateUtil.parse("2019-11-29", "yyyy-MM-dd");
// cn.hutool.core.date.DateTime offset = DateUtil.offset(dateTime, DateField.DAY_OF_MONTH, 1);
orderReceivedStatisticsJobHandler.execute("2019-11-29");
/* LocalDate startLocalDate = LocalDate.of(2019, 10, 1);
LocalDate endLocalDate = LocalDate.of(2019,11,29);
while (startLocalDate.isBefore(endLocalDate)){
String dateStr = startLocalDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
startLocalDate = startLocalDate.plusDays(1);
orderReceivedStatisticsJobHandler.execute(dateStr);
}
*/
}
} }
...@@ -62,7 +62,10 @@ ...@@ -62,7 +62,10 @@
</if> </if>
</select> </select>
<select id="findCompanyIdsByAreaId" resultType="integer"> <select id="findCompanyIdsByAreaId" resultType="integer">
select `id` from `branch_company` where `zone_id`=#{areaId} select `id` from `branch_company` where `is_del`=0
<if test="areaId!=null">
and `zone_id`=#{areaId}
</if>
</select> </select>
<select id="findBranchCompanys" resultType="com.xxfc.platform.vehicle.pojo.dto.BranchCompanyListDTO"> <select id="findBranchCompanys" resultType="com.xxfc.platform.vehicle.pojo.dto.BranchCompanyListDTO">
......
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