Commit c3a5dbaf authored by libin's avatar libin

公司业绩统计

parent 208f09f8
package com.xxfc.platform.order.bo; package com.xxfc.platform.order.bo;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
......
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; 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,206 @@ import java.util.*; ...@@ -19,74 +26,206 @@ 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.setTotalAmount(feeTypeBo.getTotalAmount().add(accountDetailEntity.getOrderAmount()));
//订单押金
feeTypeBo.setDepositAmount(feeTypeBo.getDepositAmount().add(accountDetailEntity.getDepositAmount()));
if (hasDamageSafe) {
BigDecimal dameSafeAmount = getDameSafeAmount(orderAccountBo.getData());
feeTypeBo.setNoDeductibleAmount(feeTypeBo.getNoDeductibleAmount().add(dameSafeAmount));
}
} else {
//退款订单金额(包含免赔,不包含押金)
feeTypeBo.setOrderRefundAmount(feeTypeBo.getOrderRefundAmount().add(accountDetailEntity.getOrderAmount()));
//退款订单押金
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));
}
}
}
}
}
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 +242,24 @@ public enum StatisticsStatusEnum { ...@@ -103,4 +242,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);
}
}
} }
...@@ -21,7 +21,6 @@ import java.math.BigDecimal; ...@@ -21,7 +21,6 @@ import java.math.BigDecimal;
public class OrderMemberReceivedStatistics extends OrderReceivedStatisticsBase implements Serializable { public class OrderMemberReceivedStatistics extends OrderReceivedStatisticsBase implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**
* 普通会员订单总额 * 普通会员订单总额
*/ */
......
package com.xxfc.platform.order.entity; package com.xxfc.platform.order.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
...@@ -18,6 +19,7 @@ import java.math.BigDecimal; ...@@ -18,6 +19,7 @@ import java.math.BigDecimal;
*/ */
@Data @Data
@Table(name = "order_received_statistics") @Table(name = "order_received_statistics")
@ApiModel("订单统计")
public class OrderReceivedStatistics extends OrderReceivedStatisticsBase implements Serializable { public class OrderReceivedStatistics extends OrderReceivedStatisticsBase implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
...@@ -25,14 +27,26 @@ public class OrderReceivedStatistics extends OrderReceivedStatisticsBase impleme ...@@ -25,14 +27,26 @@ public class OrderReceivedStatistics extends OrderReceivedStatisticsBase impleme
@ApiModelProperty("会员费") @ApiModelProperty("会员费")
private BigDecimal memberAmount; private BigDecimal memberAmount;
@Column(name = "member_quantity")
@ApiModelProperty("会员订单量")
private Integer memberQuantity;
@Column(name = "travel_amount") @Column(name = "travel_amount")
@ApiModelProperty("旅游费") @ApiModelProperty("旅游费")
private BigDecimal travelAmount; private BigDecimal travelAmount;
@Column(name = "travel_quantity")
@ApiModelProperty("旅游订单量")
private Integer travelQuantity;
@Column(name = "rent_vehicle_amount") @Column(name = "rent_vehicle_amount")
@ApiModelProperty("租车费") @ApiModelProperty("租车费")
private BigDecimal rentVehicleAmount; private BigDecimal rentVehicleAmount;
@Column(name = "rent_vehicle_quantity")
@ApiModelProperty("租车订单量")
private Integer rentVehicleQuantity;
@Column(name = "no_deductible_amount") @Column(name = "no_deductible_amount")
@ApiModelProperty("不计免赔费") @ApiModelProperty("不计免赔费")
private BigDecimal noDeductibleAmount; private BigDecimal noDeductibleAmount;
......
...@@ -29,7 +29,7 @@ public class CompanyPerformanceFindDTO extends PageParam { ...@@ -29,7 +29,7 @@ public class CompanyPerformanceFindDTO extends PageParam {
@ApiModelProperty("统计方式 1:日 2:周 3:月") @ApiModelProperty("统计方式 1:日 2:周 3:月")
@NotNull(message = "统计方式不能为null") @NotNull(message = "统计方式不能为null")
private Integer statisticalWay; private Integer statisticalWay;
private String companyName; private String companyName;
private Integer companyId;
} }
...@@ -12,6 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -12,6 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.servlet.ServletOutputStream;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
...@@ -33,6 +34,17 @@ public class CompanyPerformanceBiz { ...@@ -33,6 +34,17 @@ public class CompanyPerformanceBiz {
private final OrderReceivedStatisticsBiz orderReceivedStatisticsBiz; private final OrderReceivedStatisticsBiz orderReceivedStatisticsBiz;
private final VehicleFeign vehicleFeign; private final VehicleFeign vehicleFeign;
/**
* 导出数据
* @param companyPerformanceFindDTO
* @param outputStream
*/
public void exportOrderReceivedStatisticsData(CompanyPerformanceFindDTO companyPerformanceFindDTO, ServletOutputStream outputStream) {
//1.查询数据
PageDataVO<CompanyPerformanceBo> pageDataVO = selectCompanyPerformancePage(companyPerformanceFindDTO);
List<CompanyPerformanceBo> data = pageDataVO.getData();
}
public PageDataVO<CompanyPerformanceBo> selectCompanyPerformancePage(CompanyPerformanceFindDTO companyPerformanceFindDTO) { public PageDataVO<CompanyPerformanceBo> selectCompanyPerformancePage(CompanyPerformanceFindDTO companyPerformanceFindDTO) {
Map<Integer, String> companyMap = vehicleFeign.findCompanyMap(); Map<Integer, String> companyMap = vehicleFeign.findCompanyMap();
...@@ -73,4 +85,5 @@ public class CompanyPerformanceBiz { ...@@ -73,4 +85,5 @@ public class CompanyPerformanceBiz {
} }
return pageDataVO; return pageDataVO;
} }
} }
...@@ -4,16 +4,13 @@ import cn.hutool.core.util.ObjectUtil; ...@@ -4,16 +4,13 @@ import cn.hutool.core.util.ObjectUtil;
import com.github.wxiaoqi.security.common.biz.BaseBiz; import com.github.wxiaoqi.security.common.biz.BaseBiz;
import com.github.wxiaoqi.security.common.enumconstant.LevelEnum; import com.github.wxiaoqi.security.common.enumconstant.LevelEnum;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.xxfc.platform.order.contant.enumerate.DeductionTypeEnum; import com.xxfc.platform.order.bo.FeeTypeBo;
import com.xxfc.platform.order.contant.enumerate.StatisticsStatusEnum; import com.xxfc.platform.order.contant.enumerate.StatisticsStatusEnum;
import com.xxfc.platform.order.entity.OrderMemberReceivedStatistics; import com.xxfc.platform.order.entity.OrderMemberReceivedStatistics;
import com.xxfc.platform.order.mapper.OrderMemberReceivedStatisticsMapper; import com.xxfc.platform.order.mapper.OrderMemberReceivedStatisticsMapper;
import com.xxfc.platform.order.pojo.account.OrderAccountBo; 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 com.xxfc.platform.order.pojo.dto.OrderDTO;
import com.xxfc.platform.order.pojo.dto.OrderReceivedStatisticsFindDTO; import com.xxfc.platform.order.pojo.dto.OrderReceivedStatisticsFindDTO;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
...@@ -37,10 +34,9 @@ import java.util.stream.Collectors; ...@@ -37,10 +34,9 @@ import java.util.stream.Collectors;
@Service @Service
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@RequiredArgsConstructor(onConstructor = @__(@Autowired)) @RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class OrderMemberReceivedStatisticsBiz extends BaseBiz<OrderMemberReceivedStatisticsMapper, OrderMemberReceivedStatistics>{ public class OrderMemberReceivedStatisticsBiz extends BaseBiz<OrderMemberReceivedStatisticsMapper, OrderMemberReceivedStatistics> {
private final BaseOrderBiz baseOrderBiz; private final BaseOrderBiz baseOrderBiz;
private final OrderAccountBiz orderAccountBiz; private final OrderAccountBiz orderAccountBiz;
private final int PAY_ORDER = 101;
/** /**
* 会员统计查询 * 会员统计查询
...@@ -55,142 +51,113 @@ public class OrderMemberReceivedStatisticsBiz extends BaseBiz<OrderMemberReceive ...@@ -55,142 +51,113 @@ public class OrderMemberReceivedStatisticsBiz extends BaseBiz<OrderMemberReceive
/** /**
* 会员统计处理 * 会员统计处理
* *
* @param startDate 开始时间 * @param startDate 开始时间
* @param endDate 结束时间 * @param endDate 结束时间
* @param companyMap 公司 * @param companyMap 公司
*/ */
public List<OrderMemberReceivedStatistics> orderMemberReceivedStatistics(Date startDate, Date endDate,Map<Integer,String> companyMap) { public List<OrderMemberReceivedStatistics> orderMemberReceivedStatistics(Date startDate, Date endDate, Map<Integer, String> companyMap) {
List<OrderMemberReceivedStatistics> orderMemberReceivedStatisticsList = new ArrayList<>(18); List<OrderMemberReceivedStatistics> orderMemberReceivedStatisticsList = new ArrayList<>(18);
List<String> stisticsActiveState = new ArrayList<>(); List<String> stisticsActiveState = new ArrayList<>();
//根据时间范围查询出会员单 //根据时间范围查询出会员单
List<OrderDTO> orders = baseOrderBiz.selectOrdersByTypeAndTime(Arrays.asList(StatisticsStatusEnum.ORDER_MEMBER_TYPE), startDate, endDate); List<OrderDTO> orders = baseOrderBiz.selectOrdersByTypeAndTime(Arrays.asList(StatisticsStatusEnum.ORDER_MEMBER_TYPE), startDate, endDate);
//数据处理 状态组合 按支付状态分组 而后按组合状态 //数据处理 状态组合 按支付状态分组 而后按组合状态
Map<Boolean, Map<String, Map<LevelEnum, List<OrderDTO>>>> stateGroupMap = orders.stream().peek(x -> { Map<Boolean, Map<String, List<OrderDTO>>> stateGroupMap = StatisticsStatusEnum.processOrdersWithState(stisticsActiveState, orders);
x.setStateGroup(String.format("%d-%d-%d-%d", Objects.isNull(x.getCompanyId())?StatisticsStatusEnum.DEFAULT_COMPANY:x.getCompanyId(),
x.getOrderOrigin(), Objects.isNull(x.getPayWay()) ? StatisticsStatusEnum.NO_PAY_WAY : x.getPayWay(),
x.getHasPay()));
stisticsActiveState.add(x.getStateGroup());
})
.collect(Collectors.partitioningBy(x -> Objects.nonNull(x.getPayWay()), Collectors.groupingBy(OrderDTO::getStateGroup, Collectors.groupingBy(OrderDTO::getLevelEnum, Collectors.toList()))));
//订单账目信息 //订单账目信息
List<OrderAccountBo> orderAccountBoList = orderAccountBiz.selectByTypeAndDate(StatisticsStatusEnum.ORDER_MEMBER_TYPE, startDate, endDate); List<OrderAccountBo> orderAccountBoList = orderAccountBiz.selectByTypeAndDate(StatisticsStatusEnum.ORDER_MEMBER_TYPE, startDate, endDate);
//账目数据处理 状态组合 //账目数据处理 状态组合
Map<String, Map<LevelEnum, List<OrderAccountBo>>> orderAccountMap = orderAccountBoList.stream().peek(x -> { Map<String, List<OrderAccountBo>> orderAccountMap = StatisticsStatusEnum.processOrderAccountsWithState(stisticsActiveState, orderAccountBoList);
x.setStateGroup(String.format("%d-%d-%d-%d", Objects.isNull(x.getCompanyId())?StatisticsStatusEnum.DEFAULT_COMPANY:x.getCompanyId(), x.getOrderOrigin(),
Objects.isNull(x.getPayWay()) ? StatisticsStatusEnum.NO_PAY_WAY : x.getPayWay(),
x.getHasPay()));
stisticsActiveState.add(x.getStateGroup());
}).collect(Collectors.groupingBy(OrderAccountBo::getStateGroup, Collectors.groupingBy(OrderAccountBo::getLevelEnum, Collectors.toList())));
//已经支付单 //已经支付单
Set<Map.Entry<String, Map<LevelEnum, List<OrderAccountBo>>>> ordersSet = orderAccountMap.entrySet(); Set<Map.Entry<String, List<OrderAccountBo>>> ordersSet = orderAccountMap.entrySet();
for (Map.Entry<String, Map<LevelEnum, List<OrderAccountBo>>> orderEntry : ordersSet) { for (Map.Entry<String, List<OrderAccountBo>> orderEntry : ordersSet) {
MemberLevelStatistics memberLevelStatistics = new MemberLevelStatistics();
//状态key //状态key
String orderKey = orderEntry.getKey(); String orderKey = orderEntry.getKey();
Map<LevelEnum, List<OrderAccountBo>> orderMemberLevelMap = orderEntry.getValue(); //创建默认的会员统计对象
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(); Set<Map.Entry<LevelEnum, List<OrderAccountBo>>> ordermemberLevelentries = orderMemberLevelMap.entrySet();
MemberLevelStatistics memberLevelStatistics = new MemberLevelStatistics();
//遍历 //遍历
for (Map.Entry<LevelEnum, List<OrderAccountBo>> orderMemberLevelEntry : ordermemberLevelentries) { 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(); //对应状态的订单量
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); wrapMemberLevelStatistics(orderMemberLevelEntry.getKey(), orderMemberLevelEntry.getValue(), totalQuantity, memberLevelStatistics);
} }
OrderMemberReceivedStatistics orderMemberReceivedStatistics = StatisticsStatusEnum.wrapStatisticsObject(startDate, orderKey,companyMap,new OrderMemberReceivedStatistics()); //对应的金额或订单量的复制
BeanUtils.copyProperties(memberLevelStatistics, orderMemberReceivedStatistics); BeanUtils.copyProperties(memberLevelStatistics, orderMemberReceivedStatistics);
orderMemberReceivedStatisticsList.add(orderMemberReceivedStatistics); orderMemberReceivedStatisticsList.add(orderMemberReceivedStatistics);
} }
//未支付单 //未支付单
Map<String, Map<LevelEnum, List<OrderDTO>>> noPayOrdersMap = stateGroupMap==null?Collections.EMPTY_MAP:stateGroupMap.get(Boolean.FALSE)==null?Collections.EMPTY_MAP:stateGroupMap.get(Boolean.FALSE); Map<String, List<OrderDTO>> noPayOrdersMap = stateGroupMap == null ?
List<OrderMemberReceivedStatistics> noPayOrderMemberReceivedStatisticsList = createOrderMemberReceivedStatisticsList(startDate,noPayOrdersMap,companyMap); 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); orderMemberReceivedStatisticsList.addAll(noPayOrderMemberReceivedStatisticsList);
//创建剩余状态数据 //创建剩余状态数据
List<OrderMemberReceivedStatistics> otherStatisticsStateGroupList = createOtherStatisticsStateGroupList(startDate, stisticsActiveState,companyMap); List<OrderMemberReceivedStatistics> otherStatisticsStateGroupList = createOtherStatisticsStateGroupList(startDate, stisticsActiveState, companyMap);
orderMemberReceivedStatisticsList.addAll(otherStatisticsStateGroupList); orderMemberReceivedStatisticsList.addAll(otherStatisticsStateGroupList);
//保存 //保存
insertMemberReceivedStatisticsBatch(orderMemberReceivedStatisticsList); StatisticsStatusEnum.insertReceivedStatisticsBatch(orderMemberReceivedStatisticsList, mapper);
return orderMemberReceivedStatisticsList; return orderMemberReceivedStatisticsList;
} }
/** /**
* memberLevelStatistics 对象包装 * memberLevelStatistics 对象包装
* *
* @param levelEnum 会员等级 * @param levelEnum 会员等级
* @param orderAccountBos 账目对象 * @param orderAccountBos 账目对象
* @param totalQuantity 对应等级的单量 * @param totalQuantity 对应等级的单量
* @param memberLevelStatistics * @param memberLevelStatistics
* @return * @return
*/ */
private MemberLevelStatistics wrapMemberLevelStatistics(LevelEnum levelEnum, List<OrderAccountBo> orderAccountBos, Integer totalQuantity, MemberLevelStatistics memberLevelStatistics) { private MemberLevelStatistics wrapMemberLevelStatistics(LevelEnum levelEnum, List<OrderAccountBo> orderAccountBos, Integer totalQuantity, MemberLevelStatistics memberLevelStatistics) {
Map<String,BigDecimal> orderFeeMap = getOrderAmountAndLateFeeAmount(orderAccountBos); //获取账目各种费用
memberLevelStatistics.setLateFeeAmount(orderFeeMap.get(StatisticsStatusEnum.LATEFEE_AMOUNT)); FeeTypeBo feeTypeBo = StatisticsStatusEnum.getFeeTyBoByOrderAccounts(orderAccountBos);
memberLevelStatistics.setOrderRefundAmount(orderFeeMap.get(StatisticsStatusEnum.ORDER_REFUND_AMOUNT)); BeanUtils.copyProperties(feeTypeBo, memberLevelStatistics);
return wrapMemberLevelStatistics(levelEnum,orderFeeMap.get(StatisticsStatusEnum.ORDER_AMOUNT),totalQuantity,memberLevelStatistics); return wrapMemberLevelStatistics(levelEnum, feeTypeBo.getTotalAmount(), totalQuantity, memberLevelStatistics);
}
/**
* 获取收入
*
* @param orderAccountBos
* @return
*/
private Map<String,BigDecimal> getOrderAmountAndLateFeeAmount(List<OrderAccountBo> orderAccountBos) {
Map<String,BigDecimal> orderAndLateMap = new HashMap<>();
//订单金额
BigDecimal totalOrderAmount = BigDecimal.ZERO;
//续约金额
BigDecimal totalLateFeeAmount = BigDecimal.ZERO;
//订单退款金额
BigDecimal totalOrderRefundAmount = BigDecimal.ZERO;
if (CollectionUtils.isEmpty(orderAccountBos)) {
return orderAndLateMap;
}
for (OrderAccountBo orderAccountBo : orderAccountBos) {
OrderAccountDetail accountDetailEntity = orderAccountBo.getAccountDetailEntity();
if (orderAccountBo.getAccountType() == PAY_ORDER) {
totalOrderAmount = totalOrderAmount.add(accountDetailEntity.getOrderAmount()).add(accountDetailEntity.getDepositAmount());
} else {
totalOrderRefundAmount = totalOrderRefundAmount.add(accountDetailEntity.getOrderAmount());
List<OrderAccountDeduction> deductions = accountDetailEntity.getDeductions();
for (OrderAccountDeduction deduction : deductions) {
Integer type = deduction.getType();
if (DeductionTypeEnum.lateFeeCode.contains(type)){
totalLateFeeAmount = totalLateFeeAmount.add(deduction.getAmount());
}
}
}
}
orderAndLateMap.put(StatisticsStatusEnum.ORDER_AMOUNT,totalOrderAmount);
orderAndLateMap.put(StatisticsStatusEnum.LATEFEE_AMOUNT,totalLateFeeAmount);
orderAndLateMap.put(StatisticsStatusEnum.ORDER_REFUND_AMOUNT,totalOrderRefundAmount);
return orderAndLateMap;
} }
/** /**
* @param startDate 时间 * @param startDate 时间
* @param noPayOrdersMap 未支付单map * @param noPayOrdersMap 未支付单map
* @param companyMap 公司map
* @return * @return
*/ */
private List<OrderMemberReceivedStatistics> createOrderMemberReceivedStatisticsList(Date startDate, Map<String, Map<LevelEnum, List<OrderDTO>>> noPayOrdersMap,Map<Integer,String> companyMap) { private List<OrderMemberReceivedStatistics> createNoPayOrderMemberReceivedStatisticsList(Date startDate, Map<String, List<OrderDTO>> noPayOrdersMap, Map<Integer, String> companyMap) {
List<OrderMemberReceivedStatistics> orderMemberReceivedStatisticsList = new ArrayList<>(); List<OrderMemberReceivedStatistics> orderMemberReceivedStatisticsList = new ArrayList<>();
if (noPayOrdersMap == null || noPayOrdersMap.isEmpty()) { if (noPayOrdersMap == null || noPayOrdersMap.isEmpty()) {
return orderMemberReceivedStatisticsList; return orderMemberReceivedStatisticsList;
} }
Set<Map.Entry<String, Map<LevelEnum, List<OrderDTO>>>> noPayOrderSet = noPayOrdersMap.entrySet(); Set<Map.Entry<String, List<OrderDTO>>> noPayOrderSet = noPayOrdersMap.entrySet();
for (Map.Entry<String, Map<LevelEnum, List<OrderDTO>>> noPayOrderEntry : noPayOrderSet) { for (Map.Entry<String, List<OrderDTO>> noPayOrderEntry : noPayOrderSet) {
MemberLevelStatistics memberLevelStatistics = new MemberLevelStatistics(); MemberLevelStatistics memberLevelStatistics = new MemberLevelStatistics();
//获取状态 //获取状态
String noPayOrderStateGroup = noPayOrderEntry.getKey(); String noPayOrderStateGroup = noPayOrderEntry.getKey();
Map<LevelEnum, List<OrderDTO>> noPayOrderEntryValue = noPayOrderEntry.getValue(); //创建默认的会员订单统计对象
OrderMemberReceivedStatistics orderMemberReceivedStatistics = StatisticsStatusEnum.wrapStatisticsObject(startDate, noPayOrderStateGroup,companyMap,new OrderMemberReceivedStatistics()); OrderMemberReceivedStatistics orderMemberReceivedStatistics = createDefaultOrderMemberReceivedStatistics();
Set<Map.Entry<LevelEnum, List<OrderDTO>>> noPayOrderEntries = noPayOrderEntryValue.entrySet(); //设置默认属性值
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) { for (Map.Entry<LevelEnum, List<OrderDTO>> orderEntry : noPayOrderEntries) {
//处理金额(支付金额,订单量)
wrapOrderMemberReceivedStatistics(orderEntry.getValue(), orderEntry.getKey(), memberLevelStatistics); wrapOrderMemberReceivedStatistics(orderEntry.getValue(), orderEntry.getKey(), memberLevelStatistics);
} }
//复制对象属性值(对应的等级金额和订单量)
BeanUtils.copyProperties(memberLevelStatistics, orderMemberReceivedStatistics); BeanUtils.copyProperties(memberLevelStatistics, orderMemberReceivedStatistics);
orderMemberReceivedStatisticsList.add(orderMemberReceivedStatistics); orderMemberReceivedStatisticsList.add(orderMemberReceivedStatistics);
} }
...@@ -204,29 +171,35 @@ public class OrderMemberReceivedStatisticsBiz extends BaseBiz<OrderMemberReceive ...@@ -204,29 +171,35 @@ public class OrderMemberReceivedStatisticsBiz extends BaseBiz<OrderMemberReceive
* @return * @return
*/ */
private MemberLevelStatistics wrapOrderMemberReceivedStatistics(List<OrderDTO> orders, LevelEnum levelEnum, MemberLevelStatistics memberLevelStatistics) { private MemberLevelStatistics wrapOrderMemberReceivedStatistics(List<OrderDTO> orders, LevelEnum levelEnum, MemberLevelStatistics memberLevelStatistics) {
//会员单对应等级的总量
orders = CollectionUtils.isEmpty(orders) ? Collections.EMPTY_LIST : orders; orders = CollectionUtils.isEmpty(orders) ? Collections.EMPTY_LIST : orders;
BigDecimal totalAmount = orders.stream().map(OrderDTO::getRealAmount).reduce(BigDecimal.ZERO, (x, y) -> x.add(y)); //会员单对应等级的总金额
return wrapMemberLevelStatistics(levelEnum,totalAmount,orders.size(),memberLevelStatistics); BigDecimal totalAmount = orders.stream().map(OrderDTO::getRealAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
return wrapMemberLevelStatistics(levelEnum, totalAmount, orders.size(), memberLevelStatistics);
} }
/** /**
* memberLevelStatistics 对象包装 * memberLevelStatistics 对象包装
* @param levelEnum *
* @param amount * @param levelEnum 会员等级
* @param quantity * @param amount 订单总额
* @param quantity 订单量
* @param memberLevelStatistics * @param memberLevelStatistics
* @return * @return
*/ */
private MemberLevelStatistics wrapMemberLevelStatistics(LevelEnum levelEnum,BigDecimal amount,Integer quantity,MemberLevelStatistics memberLevelStatistics){ private MemberLevelStatistics wrapMemberLevelStatistics(LevelEnum levelEnum, BigDecimal amount, Integer quantity, MemberLevelStatistics memberLevelStatistics) {
switch (levelEnum) { switch (levelEnum) {
//普通会员
case GENERAL: case GENERAL:
memberLevelStatistics.setToalCommonAmmount(amount); memberLevelStatistics.setToalCommonAmmount(amount);
memberLevelStatistics.setTotalCommonQuantity(quantity); memberLevelStatistics.setTotalCommonQuantity(quantity);
break; break;
//黄金会员
case GOLD: case GOLD:
memberLevelStatistics.setTotalGoldAmount(amount); memberLevelStatistics.setTotalGoldAmount(amount);
memberLevelStatistics.setTotalGoldQuantity(quantity); memberLevelStatistics.setTotalGoldQuantity(quantity);
break; break;
//钻石会员
case DIAMOND: case DIAMOND:
memberLevelStatistics.setTotalDiamondAmmount(amount); memberLevelStatistics.setTotalDiamondAmmount(amount);
memberLevelStatistics.setTotalDiamondQuantity(quantity); memberLevelStatistics.setTotalDiamondQuantity(quantity);
...@@ -242,19 +215,19 @@ public class OrderMemberReceivedStatisticsBiz extends BaseBiz<OrderMemberReceive ...@@ -242,19 +215,19 @@ public class OrderMemberReceivedStatisticsBiz extends BaseBiz<OrderMemberReceive
* *
* @param startDate 时间 * @param startDate 时间
* @param statisticsStateGroups 状态组合 集合 * @param statisticsStateGroups 状态组合 集合
* @param companyMap 公司 * @param companyMap 公司
* @return * @return
*/ */
private List<OrderMemberReceivedStatistics> createOtherStatisticsStateGroupList(Date startDate, List<String> statisticsStateGroups,Map<Integer,String> companyMap) { private List<OrderMemberReceivedStatistics> createOtherStatisticsStateGroupList(Date startDate, List<String> statisticsStateGroups, Map<Integer, String> companyMap) {
List<OrderMemberReceivedStatistics> orderMemberReceivedStatisticsList = new ArrayList<>(); List<OrderMemberReceivedStatistics> orderMemberReceivedStatisticsList = new ArrayList<>();
//获取剩余状态组合 //获取剩余状态组合
List<Integer> companyIds = Objects.isNull(companyMap)?Collections.EMPTY_LIST: Lists.newArrayList(companyMap.keySet()); List<Integer> companyIds = Objects.isNull(companyMap) ? Collections.EMPTY_LIST : Lists.newArrayList(companyMap.keySet());
List<String> otherStatisticsStateGroup = StatisticsStatusEnum.getOtherStatisticsStateGroup(companyIds,statisticsStateGroups); List<String> otherStatisticsStateGroup = StatisticsStatusEnum.getOtherStatisticsStateGroup(companyIds, statisticsStateGroups);
//创建会员克隆统计对象 //创建会员克隆统计对象
OrderMemberReceivedStatistics orderMemberReceivedStatistics = createDefaultOrderMemberReceivedStatistics(); OrderMemberReceivedStatistics orderMemberReceivedStatistics = createDefaultOrderMemberReceivedStatistics();
//统计对象的生成 //统计对象的生成
otherStatisticsStateGroup.stream().peek(stateGroup -> { otherStatisticsStateGroup.stream().peek(stateGroup -> {
OrderMemberReceivedStatistics orderMemberReceivedStatisticsClone = StatisticsStatusEnum.wrapStatisticsObject(startDate, stateGroup,companyMap, OrderMemberReceivedStatistics orderMemberReceivedStatisticsClone = StatisticsStatusEnum.wrapStatisticsObject(startDate, stateGroup, companyMap,
ObjectUtil.clone(orderMemberReceivedStatistics)); ObjectUtil.clone(orderMemberReceivedStatistics));
orderMemberReceivedStatisticsList.add(orderMemberReceivedStatisticsClone); orderMemberReceivedStatisticsList.add(orderMemberReceivedStatisticsClone);
}).count(); }).count();
...@@ -268,8 +241,6 @@ public class OrderMemberReceivedStatisticsBiz extends BaseBiz<OrderMemberReceive ...@@ -268,8 +241,6 @@ public class OrderMemberReceivedStatisticsBiz extends BaseBiz<OrderMemberReceive
*/ */
private OrderMemberReceivedStatistics createDefaultOrderMemberReceivedStatistics() { private OrderMemberReceivedStatistics createDefaultOrderMemberReceivedStatistics() {
OrderMemberReceivedStatistics orderMemberReceivedStatistics = new OrderMemberReceivedStatistics(); OrderMemberReceivedStatistics orderMemberReceivedStatistics = new OrderMemberReceivedStatistics();
orderMemberReceivedStatistics.setTotalAmount(BigDecimal.ZERO);
orderMemberReceivedStatistics.setTotalQuantity(0);
orderMemberReceivedStatistics.setTotalCommonQuantity(0); orderMemberReceivedStatistics.setTotalCommonQuantity(0);
orderMemberReceivedStatistics.setToalCommonAmmount(BigDecimal.ZERO); orderMemberReceivedStatistics.setToalCommonAmmount(BigDecimal.ZERO);
orderMemberReceivedStatistics.setTotalGoldQuantity(0); orderMemberReceivedStatistics.setTotalGoldQuantity(0);
...@@ -279,15 +250,6 @@ public class OrderMemberReceivedStatisticsBiz extends BaseBiz<OrderMemberReceive ...@@ -279,15 +250,6 @@ public class OrderMemberReceivedStatisticsBiz extends BaseBiz<OrderMemberReceive
return orderMemberReceivedStatistics; return orderMemberReceivedStatistics;
} }
/**
* 批量插入
*
* @param orderMemberReceivedStatistics
*/
public void insertMemberReceivedStatisticsBatch(List<OrderMemberReceivedStatistics> orderMemberReceivedStatistics) {
mapper.insertList(orderMemberReceivedStatistics);
}
@Data @Data
@NoArgsConstructor @NoArgsConstructor
private class MemberLevelStatistics { private class MemberLevelStatistics {
...@@ -316,16 +278,6 @@ public class OrderMemberReceivedStatisticsBiz extends BaseBiz<OrderMemberReceive ...@@ -316,16 +278,6 @@ public class OrderMemberReceivedStatisticsBiz extends BaseBiz<OrderMemberReceive
*/ */
private BigDecimal orderRefundAmount = BigDecimal.ZERO; private BigDecimal orderRefundAmount = BigDecimal.ZERO;
/**
* 非会员费
*/
private BigDecimal totalNonMemberAmount;
/**
* 非会员费
*/
private BigDecimal totalMemberAmount;
public BigDecimal getTotalAmount() { public BigDecimal getTotalAmount() {
return toalCommonAmmount.add(totalGoldAmount).add(totalDiamondAmmount); return toalCommonAmmount.add(totalGoldAmount).add(totalDiamondAmmount);
} }
......
...@@ -28,7 +28,6 @@ import java.math.BigDecimal; ...@@ -28,7 +28,6 @@ import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -56,16 +55,18 @@ public class OrderReceivedStatisticsBiz extends BaseBiz<OrderReceivedStatisticsM ...@@ -56,16 +55,18 @@ public class OrderReceivedStatisticsBiz extends BaseBiz<OrderReceivedStatisticsM
/** /**
* 公司业绩(按日统计) * 公司业绩(按日统计)
*
* @param companyPerformanceFindDTO * @param companyPerformanceFindDTO
* @return * @return
*/ */
public PageDataVO<CompanyPerformanceBo> selectCompanyPerformanceWithDayPage(CompanyPerformanceFindDTO companyPerformanceFindDTO) { public PageDataVO<CompanyPerformanceBo> selectCompanyPerformanceWithDayPage(CompanyPerformanceFindDTO companyPerformanceFindDTO) {
return PageDataVO.pageInfo(companyPerformanceFindDTO.getPage(), companyPerformanceFindDTO.getLimit(), return PageDataVO.pageInfo(companyPerformanceFindDTO.getPage(), companyPerformanceFindDTO.getLimit(),
() -> mapper.selectCompanyPerformanceWithDay(companyPerformanceFindDTO)); () -> mapper.selectCompanyPerformanceWithDay(companyPerformanceFindDTO));
} }
/** /**
* 公司业绩(按月统计) * 公司业绩(按月统计)
*
* @param companyPerformanceFindDTO * @param companyPerformanceFindDTO
* @return * @return
*/ */
...@@ -76,6 +77,7 @@ public class OrderReceivedStatisticsBiz extends BaseBiz<OrderReceivedStatisticsM ...@@ -76,6 +77,7 @@ public class OrderReceivedStatisticsBiz extends BaseBiz<OrderReceivedStatisticsM
/** /**
* 公司业绩(按周统计) * 公司业绩(按周统计)
*
* @param companyPerformanceFindDTO * @param companyPerformanceFindDTO
* @return * @return
*/ */
...@@ -237,34 +239,55 @@ public class OrderReceivedStatisticsBiz extends BaseBiz<OrderReceivedStatisticsM ...@@ -237,34 +239,55 @@ public class OrderReceivedStatisticsBiz extends BaseBiz<OrderReceivedStatisticsM
for (Map.Entry<String, List<OrderRentVehicleReceivedStatistics>> rentVehicleEntry : rentVehicleSet) { for (Map.Entry<String, List<OrderRentVehicleReceivedStatistics>> rentVehicleEntry : rentVehicleSet) {
String stateGroup = rentVehicleEntry.getKey(); String stateGroup = rentVehicleEntry.getKey();
List<OrderRentVehicleReceivedStatistics> rentVehicleEntryValue = rentVehicleEntry.getValue(); List<OrderRentVehicleReceivedStatistics> rentVehicleEntryValue = rentVehicleEntry.getValue();
OrderRentVehicleReceivedStatistics orderRentVehicle = rentVehicleEntryValue.get(0); //创建默认的订单统计对象并设置默认值
OrderReceivedStatistics orderReceivedStatisticsClone = StatisticsStatusEnum.wrapStatisticsObject(date, stateGroup, Collections.EMPTY_MAP, ObjectUtil.clone(orderReceivedStatistics)); 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.setCompanyId(orderRentVehicle.getCompanyId());
//公司名称
orderReceivedStatisticsClone.setCompanyName(orderRentVehicle.getCompanyName()); orderReceivedStatisticsClone.setCompanyName(orderRentVehicle.getCompanyName());
//押金
OrderMemberReceivedStatistics orderMember = memberMap.get(stateGroup).get(0);
OrderTourReceivedStatistics orderTour = tourMap==null?null:tourMap.get(stateGroup)==null?null:tourMap.get(stateGroup).get(0);
orderReceivedStatisticsClone.setExtraAmount(orderRentVehicle.getExtraAmount());
orderReceivedStatisticsClone.setLossSpecifiedAmount(orderRentVehicle.getLossSpecifiedAmount());
orderReceivedStatisticsClone.setDepositAmount(orderRentVehicle.getDepositAmount()); orderReceivedStatisticsClone.setDepositAmount(orderRentVehicle.getDepositAmount());
//退款押金
orderReceivedStatisticsClone.setDepositRefundAmount(orderRentVehicle.getDepositRefundAmount()); orderReceivedStatisticsClone.setDepositRefundAmount(orderRentVehicle.getDepositRefundAmount());
//定损
orderReceivedStatisticsClone.setLossSpecifiedAmount(orderRentVehicle.getLossSpecifiedAmount());
//违章
orderReceivedStatisticsClone.setBreakRulesRegulationAmount(orderRentVehicle.getBreakRulesRegulationAmount()); orderReceivedStatisticsClone.setBreakRulesRegulationAmount(orderRentVehicle.getBreakRulesRegulationAmount());
//免赔退款金额
orderReceivedStatisticsClone.setNoDeductibleRefundAmount(orderRentVehicle.getNoDeductibleRefundAmount()); orderReceivedStatisticsClone.setNoDeductibleRefundAmount(orderRentVehicle.getNoDeductibleRefundAmount());
//免赔金额
orderReceivedStatisticsClone.setNoDeductibleAmount(orderRentVehicle.getNoDeductibleAmount()); orderReceivedStatisticsClone.setNoDeductibleAmount(orderRentVehicle.getNoDeductibleAmount());
orderReceivedStatisticsClone.setTravelAmount(orderTour == null?BigDecimal.ZERO:orderTour.getTotalAmount()); //旅游订单总额
orderReceivedStatisticsClone.setTravelAmount(orderTour.getTotalAmount());
//会员订单总额
orderReceivedStatisticsClone.setMemberAmount(orderMember.getTotalAmount()); orderReceivedStatisticsClone.setMemberAmount(orderMember.getTotalAmount());
//租车订单总额
orderReceivedStatisticsClone.setRentVehicleAmount(orderRentVehicle.getTotalAmount()); orderReceivedStatisticsClone.setRentVehicleAmount(orderRentVehicle.getTotalAmount());
//合计订单总额
BigDecimal totalAmount = orderRentVehicle.getTotalAmount().add(orderTour == null?BigDecimal.ZERO:orderTour.getTotalAmount()).add(orderMember.getTotalAmount()); BigDecimal totalAmount = orderRentVehicle.getTotalAmount().add(orderTour.getTotalAmount()).add(orderMember.getTotalAmount());
BigDecimal totalRefundAmount = orderRentVehicle.getOrderRefundAmount().add(orderTour==null?BigDecimal.ZERO:orderTour.getOrderRefundAmount()).add(orderMember.getOrderRefundAmount()); //合计订单退款总额
BigDecimal lateFeeAmount = orderRentVehicle.getLateFeeAmount().add(orderTour==null?BigDecimal.ZERO:orderTour.getLateFeeAmount()).add(orderMember.getLateFeeAmount()); BigDecimal totalRefundAmount = orderRentVehicle.getOrderRefundAmount().add(orderTour.getOrderRefundAmount()).add(orderMember.getOrderRefundAmount());
Integer totalQuantity = orderRentVehicle.getTotalQuantity() + (orderTour == null?0:orderTour.getTotalQuantity()) + orderMember.getTotalQuantity(); //合计订单违约金
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.setLateFeeAmount(lateFeeAmount);
orderReceivedStatisticsClone.setTotalAmount(totalAmount); orderReceivedStatisticsClone.setTotalAmount(totalAmount);
orderReceivedStatisticsClone.setOrderRefundAmount(totalRefundAmount); orderReceivedStatisticsClone.setOrderRefundAmount(totalRefundAmount);
...@@ -272,30 +295,8 @@ public class OrderReceivedStatisticsBiz extends BaseBiz<OrderReceivedStatisticsM ...@@ -272,30 +295,8 @@ public class OrderReceivedStatisticsBiz extends BaseBiz<OrderReceivedStatisticsM
orderReceivedStatisticsList.add(orderReceivedStatisticsClone); orderReceivedStatisticsList.add(orderReceivedStatisticsClone);
} }
//保存
insertReceivedStatisticsBatch(orderReceivedStatisticsList); StatisticsStatusEnum.insertReceivedStatisticsBatch(orderReceivedStatisticsList, mapper);
}
/**
* 批量插入数据 mysql sql语句默认不能超过4M
*
* @param orderReceivedStatistics
*/
public void insertReceivedStatisticsBatch(List<OrderReceivedStatistics> orderReceivedStatistics) {
orderReceivedStatistics.sort(Comparator.comparing(OrderReceivedStatistics::getCompanyId));
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<OrderReceivedStatistics> orderRentVehicleReceivedStatisticsList = orderReceivedStatistics.subList(fromIndex, toIndex);
mapper.insertList(orderRentVehicleReceivedStatisticsList);
}
} }
/** /**
......
package com.xxfc.platform.order.biz; package com.xxfc.platform.order.biz;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.github.wxiaoqi.security.common.biz.BaseBiz; import com.github.wxiaoqi.security.common.biz.BaseBiz;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.xxfc.platform.order.contant.enumerate.DeductionTypeEnum; import com.xxfc.platform.order.bo.FeeTypeBo;
import com.xxfc.platform.order.contant.enumerate.StatisticsStatusEnum; import com.xxfc.platform.order.contant.enumerate.StatisticsStatusEnum;
import com.xxfc.platform.order.entity.OrderRentVehicleReceivedStatistics; import com.xxfc.platform.order.entity.OrderRentVehicleReceivedStatistics;
import com.xxfc.platform.order.mapper.OrderRentVehicleReceivedStatisticsMapper; import com.xxfc.platform.order.mapper.OrderRentVehicleReceivedStatisticsMapper;
import com.xxfc.platform.order.pojo.account.OrderAccountBo; 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 com.xxfc.platform.order.pojo.dto.OrderDTO;
import com.xxfc.platform.order.pojo.dto.OrderReceivedStatisticsFindDTO; import com.xxfc.platform.order.pojo.dto.OrderReceivedStatisticsFindDTO;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.function.Supplier;
import java.util.stream.Stream;
/** /**
* 租车订单统计 * 租车订单统计
...@@ -34,10 +32,8 @@ import java.util.stream.Collectors; ...@@ -34,10 +32,8 @@ import java.util.stream.Collectors;
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@RequiredArgsConstructor(onConstructor = @__(@Autowired)) @RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class OrderRentVehicleReceivedStatisticsBiz extends BaseBiz<OrderRentVehicleReceivedStatisticsMapper, OrderRentVehicleReceivedStatistics> { public class OrderRentVehicleReceivedStatisticsBiz extends BaseBiz<OrderRentVehicleReceivedStatisticsMapper, OrderRentVehicleReceivedStatistics> {
private final BaseOrderBiz baseOrderBiz; private final BaseOrderBiz baseOrderBiz;
private final OrderAccountBiz orderAccountBiz; private final OrderAccountBiz orderAccountBiz;
private final int PAY_ORDER = 101;
/** /**
* 租车统计查询 * 租车统计查询
...@@ -61,136 +57,55 @@ public class OrderRentVehicleReceivedStatisticsBiz extends BaseBiz<OrderRentVehi ...@@ -61,136 +57,55 @@ public class OrderRentVehicleReceivedStatisticsBiz extends BaseBiz<OrderRentVehi
List<String> stisticsActiveState = new ArrayList<>(); List<String> stisticsActiveState = new ArrayList<>();
//根据租车订单类型 时间查询 //根据租车订单类型 时间查询
List<OrderDTO> orderDTOS = baseOrderBiz.selectOrdersByTypeAndTime(Arrays.asList(StatisticsStatusEnum.ORDER_RENT_VEHICLE_TYPE), startDate, endDate); List<OrderDTO> orderDTOS = baseOrderBiz.selectOrdersByTypeAndTime(Arrays.asList(StatisticsStatusEnum.ORDER_RENT_VEHICLE_TYPE), startDate, endDate);
//数据处理 状态组合 按支付状态分组 而后按组合状态 //数据处理 状态组合 按支付状态分组 而后按组合状态
Map<Boolean, Map<String, List<OrderDTO>>> stateGroupMap = orderDTOS.stream().peek(x -> { Map<Boolean, Map<String, List<OrderDTO>>> stateGroupMap = StatisticsStatusEnum.processOrdersWithState(stisticsActiveState, orderDTOS);
x.setStateGroup(String.format("%d-%d-%d-%d", x.getCompanyId(),
x.getOrderOrigin(),
x.getPayWay() == null ? StatisticsStatusEnum.NO_PAY_WAY : x.getPayWay()
, x.getHasPay()));
stisticsActiveState.add(x.getStateGroup());
}).collect(Collectors.partitioningBy(x -> Objects.nonNull(x.getPayWay()), Collectors.groupingBy(OrderDTO::getStateGroup, Collectors.toList())));
//订单账目信息 //订单账目信息
List<OrderAccountBo> orderAccountBoList = orderAccountBiz.selectByTypeAndDate(StatisticsStatusEnum.ORDER_RENT_VEHICLE_TYPE, startDate, endDate); List<OrderAccountBo> orderAccountBoList = orderAccountBiz.selectByTypeAndDate(StatisticsStatusEnum.ORDER_RENT_VEHICLE_TYPE, startDate, endDate);
//账目数据处理 状态组合 //账目数据处理 状态组合
Map<String, List<OrderAccountBo>> ordersMap = orderAccountBoList.stream().peek(x -> { Map<String, List<OrderAccountBo>> ordersMap = StatisticsStatusEnum.processOrderAccountsWithState(stisticsActiveState, orderAccountBoList);
x.setStateGroup(String.format("%d-%d-%d-%d", x.getCompanyId(),
x.getOrderOrigin(),
x.getPayWay() == null ? StatisticsStatusEnum.NO_PAY_WAY : x.getPayWay(),
x.getHasPay()));
stisticsActiveState.add(x.getStateGroup());
}).collect(Collectors.groupingBy(OrderAccountBo::getStateGroup, Collectors.toList()));
//遍历已经支付单
//已经支付单
Set<Map.Entry<String, List<OrderAccountBo>>> ordersSet = ordersMap.entrySet(); Set<Map.Entry<String, List<OrderAccountBo>>> ordersSet = ordersMap.entrySet();
for (Map.Entry<String, List<OrderAccountBo>> orderEntry : ordersSet) { for (Map.Entry<String, List<OrderAccountBo>> orderEntry : ordersSet) {
String orderKey = orderEntry.getKey(); String orderKey = orderEntry.getKey();
List<OrderAccountBo> orderAccountBos = orderEntry.getValue(); List<OrderAccountBo> orderAccountBos = orderEntry.getValue();
OrderRentVehicleReceivedStatistics orderRentVehicleReceivedStatistics = StatisticsStatusEnum.wrapStatisticsObject(startDate, orderKey, companyMap, new OrderRentVehicleReceivedStatistics()); OrderRentVehicleReceivedStatistics orderRentVehicleReceivedStatistics = createDefaultOrderMemberReceivedStatistics();
//订单总金额 StatisticsStatusEnum.wrapStatisticsObject(startDate, orderKey, companyMap,orderRentVehicleReceivedStatistics);
BigDecimal totalOrderAmount = BigDecimal.ZERO; //账目处理
//订单总押金 FeeTypeBo feeTypeBo = StatisticsStatusEnum.getFeeTyBoByOrderAccounts(orderAccountBos);
BigDecimal totalDepositAmount = BigDecimal.ZERO; BeanUtils.copyProperties(feeTypeBo, orderRentVehicleReceivedStatistics);
//总违约金 //订单量
BigDecimal totalLateFeeAmount = BigDecimal.ZERO; Integer totalQuantity = stateGroupMap == null ?
//订单退款总金额 0 : stateGroupMap.get(Boolean.TRUE) == null ?
BigDecimal totalOrderRefundAmount = BigDecimal.ZERO; 0 : stateGroupMap.get(Boolean.TRUE).get(orderKey) == null ?
//订单押金退款总金额 0 : stateGroupMap.get(Boolean.TRUE).get(orderKey).size();
BigDecimal totalDepositRefundAmount = BigDecimal.ZERO;
//订单违章总金额
BigDecimal totalBreakRulesRegulationAmount = BigDecimal.ZERO;
//订单定损金总金额
BigDecimal totalLossSpecifiedAmount = BigDecimal.ZERO;
//不计免赔金额
BigDecimal damageSafeAmount = BigDecimal.ZERO;
//不计免赔金额退款
BigDecimal refundDamageSafeAmount = BigDecimal.ZERO;
//其它费用
BigDecimal totalExtendAmount = BigDecimal.ZERO;
for (OrderAccountBo orderAccountBo : orderAccountBos) {
OrderAccountDetail accountDetailEntity = orderAccountBo.getAccountDetailEntity();
if (orderAccountBo.getAccountType() == PAY_ORDER) {
totalOrderAmount = totalOrderAmount.add(accountDetailEntity.getOrderAmount());
totalDepositAmount = totalDepositAmount.add(accountDetailEntity.getDepositAmount());
if (Objects.nonNull(orderAccountBo.getDamageSafe()) && (orderAccountBo.getDamageSafe() == StatisticsStatusEnum.DAMAGE_SAFE)) {
JSONObject data = orderAccountBo.getData();
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);
damageSafeAmount = damageSafeAmount.add(safeAmount);
}
}
} else {
totalOrderRefundAmount = totalOrderRefundAmount.add(accountDetailEntity.getOrderAmount());
totalDepositRefundAmount = totalDepositRefundAmount.add(accountDetailEntity.getDepositAmount());
List<OrderAccountDeduction> deductions = accountDetailEntity.getDeductions();
for (OrderAccountDeduction deduction : deductions) {
if (DeductionTypeEnum.lateFeeCode.contains(deduction.getType())) {
totalLateFeeAmount = totalLateFeeAmount.add(deduction.getAmount());
if (deduction.getType().equals(DeductionTypeEnum.VIOLATE_CANCEL.getCode())) {
if (Objects.nonNull(orderAccountBo.getDamageSafe()) && (orderAccountBo.getDamageSafe() == StatisticsStatusEnum.DAMAGE_SAFE)) {
JSONObject data = orderAccountBo.getData();
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);
refundDamageSafeAmount = refundDamageSafeAmount.add(safeAmount);
}
}
}
}
if (DeductionTypeEnum.breakRulesRegulationCode.contains(deduction.getType())) {
totalBreakRulesRegulationAmount = totalBreakRulesRegulationAmount.add(deduction.getAmount());
}
if (DeductionTypeEnum.lossSpecifiedCode.contains(deduction.getType())) {
totalLossSpecifiedAmount = totalLossSpecifiedAmount.add(deduction.getAmount());
}
if (DeductionTypeEnum.consumerCode.contains(deduction.getType())) {
BigDecimal extendAmount = deduction.getAmount().subtract(accountDetailEntity.getOriginOrderAmount());
totalExtendAmount = totalExtendAmount.add(extendAmount);
}
}
}
}
orderRentVehicleReceivedStatistics.setNoDeductibleRefundAmount(refundDamageSafeAmount);
orderRentVehicleReceivedStatistics.setNoDeductibleAmount(damageSafeAmount);
orderRentVehicleReceivedStatistics.setTotalAmount(totalOrderAmount);
orderRentVehicleReceivedStatistics.setDepositAmount(totalDepositAmount);
orderRentVehicleReceivedStatistics.setLateFeeAmount(totalLateFeeAmount);
orderRentVehicleReceivedStatistics.setOrderRefundAmount(totalOrderRefundAmount);
orderRentVehicleReceivedStatistics.setDepositRefundAmount(totalDepositRefundAmount);
orderRentVehicleReceivedStatistics.setBreakRulesRegulationAmount(totalBreakRulesRegulationAmount);
orderRentVehicleReceivedStatistics.setLossSpecifiedAmount(totalLossSpecifiedAmount);
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); orderRentVehicleReceivedStatistics.setTotalQuantity(totalQuantity);
orderRentVehicleReceivedStatisticsList.add(orderRentVehicleReceivedStatistics); 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); 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); List<OrderRentVehicleReceivedStatistics> noPayOrderRentVehicleStatisticsList = createNoPayOrderRentVehicleStatisticsList(startDate, noPayOrderRentvehicleMap, companyMap);
orderRentVehicleReceivedStatisticsList.addAll(noPayOrderRentVehicleStatisticsList); orderRentVehicleReceivedStatisticsList.addAll(noPayOrderRentVehicleStatisticsList);
//创建剩余状态组合的租车统计对象 //创建剩余状态组合的租车统计对象
List<OrderRentVehicleReceivedStatistics> otherStatisticsStateGroupList = createOtherStatisticsStateGroupList(startDate, stisticsActiveState, companyMap); List<OrderRentVehicleReceivedStatistics> otherStatisticsStateGroupList = createOtherStatisticsStateGroupList(startDate, stisticsActiveState, companyMap);
orderRentVehicleReceivedStatisticsList.addAll(otherStatisticsStateGroupList); orderRentVehicleReceivedStatisticsList.addAll(otherStatisticsStateGroupList);
//保存 //保存
insertMemberReceivedStatisticsBatch(orderRentVehicleReceivedStatisticsList); StatisticsStatusEnum.insertReceivedStatisticsBatch(orderRentVehicleReceivedStatisticsList,mapper);
return orderRentVehicleReceivedStatisticsList; return orderRentVehicleReceivedStatisticsList;
} }
/** /**
* @param startDate 时间 * @param startDate 时间
* @param noPayOrdersMap 未支付单map * @param noPayOrdersMap 未支付单map
* @param companyMap 公司map
* @return * @return
*/ */
private List<OrderRentVehicleReceivedStatistics> createNoPayOrderRentVehicleStatisticsList(Date startDate, Map<String, List<OrderDTO>> noPayOrdersMap, Map<Integer, String> companyMap) { private List<OrderRentVehicleReceivedStatistics> createNoPayOrderRentVehicleStatisticsList(Date startDate, Map<String, List<OrderDTO>> noPayOrdersMap, Map<Integer, String> companyMap) {
...@@ -199,35 +114,41 @@ public class OrderRentVehicleReceivedStatisticsBiz extends BaseBiz<OrderRentVehi ...@@ -199,35 +114,41 @@ public class OrderRentVehicleReceivedStatisticsBiz extends BaseBiz<OrderRentVehi
return orderRentVehicleReceivedStatisticsList; return orderRentVehicleReceivedStatisticsList;
} }
Set<Map.Entry<String, List<OrderDTO>>> noPayOrderSet = noPayOrdersMap.entrySet(); Set<Map.Entry<String, List<OrderDTO>>> noPayOrderSet = noPayOrdersMap.entrySet();
//遍历未支付单map
for (Map.Entry<String, List<OrderDTO>> noPayOrderEntry : noPayOrderSet) { for (Map.Entry<String, List<OrderDTO>> noPayOrderEntry : noPayOrderSet) {
String noPayOrderStateGroup = noPayOrderEntry.getKey(); //某种状态组合的租车单
List<OrderDTO> noPayOrders = noPayOrderEntry.getValue(); List<OrderDTO> noPayOrders = noPayOrderEntry.getValue();
List<BigDecimal> damageSafeAmountList = new ArrayList<>(); //创建默认的租车订单统计对象
BigDecimal totalNoPayAmount = noPayOrders.stream().peek(x -> { 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) {
//免赔 //免赔
if (Objects.nonNull(x.getDamageSafe()) && (x.getDamageSafe() == StatisticsStatusEnum.DAMAGE_SAFE)) { boolean hasDamageSafe = Objects.nonNull(noPayOrder.getDamageSafe()) && (noPayOrder.getDamageSafe() == StatisticsStatusEnum.DAMAGE_SAFE);
JSONObject data = x.getData(); if (hasDamageSafe) {
if (!data.isEmpty()) { damageSafeAmount = damageSafeAmount.add(StatisticsStatusEnum.getDameSafeAmount(noPayOrder.getData()));
Object paramJson = data.get(StatisticsStatusEnum.PARMAM_JSON);
JSONObject jsonObject = JSONUtil.parseObj(paramJson);
BigDecimal safeAmount = jsonObject.get(StatisticsStatusEnum.NO_DEDUCTIBLE_AMOUNT, BigDecimal.class);
damageSafeAmountList.add(safeAmount);
}
} }
}).map(OrderDTO::getRealAmount).reduce(BigDecimal.ZERO, (x, y) -> x.add(y)); totalAmount = totalAmount.add(noPayOrder.getRealAmount());
depositAmount = depositAmount.add(noPayOrder.getDeposit());
}
OrderRentVehicleReceivedStatistics orderRentVehicleReceivedStatistics = StatisticsStatusEnum.wrapStatisticsObject(startDate, noPayOrderStateGroup, companyMap, new OrderRentVehicleReceivedStatistics());
BigDecimal damageSafeAmount = damageSafeAmountList.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
orderRentVehicleReceivedStatistics.setNoDeductibleAmount(damageSafeAmount); orderRentVehicleReceivedStatistics.setNoDeductibleAmount(damageSafeAmount);
BigDecimal depositAmount = noPayOrders.stream().map(OrderDTO::getDeposit).reduce(BigDecimal.ZERO, BigDecimal::add);
//押金
orderRentVehicleReceivedStatistics.setDepositAmount(depositAmount); orderRentVehicleReceivedStatistics.setDepositAmount(depositAmount);
orderRentVehicleReceivedStatistics.setNoDeductibleRefundAmount(BigDecimal.ZERO); BigDecimal totalNoPayAmount = orderDtoStreamSupplier.get().map(OrderDTO::getRealAmount).reduce(BigDecimal.ZERO,BigDecimal::add);
orderRentVehicleReceivedStatistics.setDepositRefundAmount(BigDecimal.ZERO);
orderRentVehicleReceivedStatistics.setLossSpecifiedAmount(BigDecimal.ZERO);
orderRentVehicleReceivedStatistics.setBreakRulesRegulationAmount(BigDecimal.ZERO);
orderRentVehicleReceivedStatistics.setTotalAmount(totalNoPayAmount.subtract(depositAmount)); orderRentVehicleReceivedStatistics.setTotalAmount(totalNoPayAmount.subtract(depositAmount));
//总订单总量
orderRentVehicleReceivedStatistics.setTotalQuantity(noPayOrders.size()); orderRentVehicleReceivedStatistics.setTotalQuantity(noPayOrders.size());
orderRentVehicleReceivedStatisticsList.add(orderRentVehicleReceivedStatistics); orderRentVehicleReceivedStatisticsList.add(orderRentVehicleReceivedStatistics);
} }
return orderRentVehicleReceivedStatisticsList; return orderRentVehicleReceivedStatisticsList;
...@@ -250,42 +171,29 @@ public class OrderRentVehicleReceivedStatisticsBiz extends BaseBiz<OrderRentVehi ...@@ -250,42 +171,29 @@ public class OrderRentVehicleReceivedStatisticsBiz extends BaseBiz<OrderRentVehi
List<Integer> companyIds = Objects.isNull(companyMap) ? Collections.EMPTY_LIST : Lists.newArrayList(companyMap.keySet()); List<Integer> companyIds = Objects.isNull(companyMap) ? Collections.EMPTY_LIST : Lists.newArrayList(companyMap.keySet());
List<String> otherStatisticsStateGroup = StatisticsStatusEnum.getOtherStatisticsStateGroup(companyIds, statisticsStateGroups); List<String> otherStatisticsStateGroup = StatisticsStatusEnum.getOtherStatisticsStateGroup(companyIds, statisticsStateGroups);
//创建租车统计克隆对象 //创建租车统计克隆对象
OrderRentVehicleReceivedStatistics orderRentVehicleReceivedStatistics = new OrderRentVehicleReceivedStatistics(); OrderRentVehicleReceivedStatistics orderRentVehicleReceivedStatistics = createDefaultOrderMemberReceivedStatistics();
//统计对象的生成 //统计对象的生成
otherStatisticsStateGroup.stream().map(stateGroup -> { otherStatisticsStateGroup.stream().map(stateGroup -> {
OrderRentVehicleReceivedStatistics orderRentVehicleReceivedStatisticsClone = StatisticsStatusEnum.wrapStatisticsObject(startDate, stateGroup, companyMap, ObjectUtil.cloneByStream(orderRentVehicleReceivedStatistics)); OrderRentVehicleReceivedStatistics orderRentVehicleReceivedStatisticsClone = StatisticsStatusEnum.wrapStatisticsObject(startDate, stateGroup, companyMap, ObjectUtil.cloneByStream(orderRentVehicleReceivedStatistics));
orderRentVehicleReceivedStatisticsClone.setDepositAmount(BigDecimal.ZERO);
orderRentVehicleReceivedStatisticsClone.setDepositRefundAmount(BigDecimal.ZERO);
orderRentVehicleReceivedStatisticsClone.setNoDeductibleAmount(BigDecimal.ZERO);
orderRentVehicleReceivedStatisticsClone.setNoDeductibleRefundAmount(BigDecimal.ZERO);
orderRentVehicleReceivedStatisticsClone.setLossSpecifiedAmount(BigDecimal.ZERO);
orderRentVehicleReceivedStatisticsClone.setBreakRulesRegulationAmount(BigDecimal.ZERO);
orderRentVehicleReceivedStatisticsClone.setTotalAmount(BigDecimal.ZERO);
orderRentVehicleReceivedStatisticsClone.setTotalQuantity(0);
orderRentVehicleReceivedStatisticsList.add(orderRentVehicleReceivedStatisticsClone); orderRentVehicleReceivedStatisticsList.add(orderRentVehicleReceivedStatisticsClone);
return orderRentVehicleReceivedStatisticsClone; return orderRentVehicleReceivedStatisticsClone;
}).count(); }).count();
return orderRentVehicleReceivedStatisticsList; return orderRentVehicleReceivedStatisticsList;
} }
/** /**
* 批量插入数据 mysql sql语句默认不能超过4M * 创建默认的租车订单统计对象
* *
* @param orderRentVehicleReceivedStatistics * @return
*/ */
public void insertMemberReceivedStatisticsBatch(List<OrderRentVehicleReceivedStatistics> orderRentVehicleReceivedStatistics) { private OrderRentVehicleReceivedStatistics createDefaultOrderMemberReceivedStatistics() {
orderRentVehicleReceivedStatistics.sort(Comparator.comparing(OrderRentVehicleReceivedStatistics::getCompanyId)); OrderRentVehicleReceivedStatistics orderRentVehicleReceivedStatistics = new OrderRentVehicleReceivedStatistics();
int orderSize = orderRentVehicleReceivedStatistics.size(); orderRentVehicleReceivedStatistics.setDepositAmount(BigDecimal.ZERO);
int sqlAdq = orderSize / StatisticsStatusEnum.DEFAULT_SQL_SIZE; orderRentVehicleReceivedStatistics.setDepositRefundAmount(BigDecimal.ZERO);
int sqlMod = orderSize % StatisticsStatusEnum.DEFAULT_SQL_SIZE; orderRentVehicleReceivedStatistics.setNoDeductibleAmount(BigDecimal.ZERO);
sqlAdq = sqlMod == 0 ? sqlAdq : sqlAdq + 1; orderRentVehicleReceivedStatistics.setNoDeductibleRefundAmount(BigDecimal.ZERO);
for (int i = 0; i < sqlAdq; i++) { orderRentVehicleReceivedStatistics.setLossSpecifiedAmount(BigDecimal.ZERO);
int fromIndex = StatisticsStatusEnum.DEFAULT_SQL_SIZE * i; orderRentVehicleReceivedStatistics.setBreakRulesRegulationAmount(BigDecimal.ZERO);
int toIndex = StatisticsStatusEnum.DEFAULT_SQL_SIZE * (i + 1); return orderRentVehicleReceivedStatistics;
toIndex = toIndex > orderSize ? orderSize : toIndex;
List<OrderRentVehicleReceivedStatistics> orderRentVehicleReceivedStatisticsList = orderRentVehicleReceivedStatistics.subList(fromIndex, toIndex);
mapper.insertList(orderRentVehicleReceivedStatisticsList);
}
} }
} }
\ No newline at end of file
...@@ -2,44 +2,34 @@ package com.xxfc.platform.order.biz; ...@@ -2,44 +2,34 @@ package com.xxfc.platform.order.biz;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.github.wxiaoqi.security.common.biz.BaseBiz; import com.github.wxiaoqi.security.common.biz.BaseBiz;
import com.github.wxiaoqi.security.common.util.CollectorsUtil;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.xxfc.platform.order.contant.enumerate.DeductionTypeEnum; import com.xxfc.platform.order.bo.FeeTypeBo;
import com.xxfc.platform.order.contant.enumerate.StatisticsStatusEnum; import com.xxfc.platform.order.contant.enumerate.StatisticsStatusEnum;
import com.xxfc.platform.order.entity.OrderTourReceivedStatistics; import com.xxfc.platform.order.entity.OrderTourReceivedStatistics;
import com.xxfc.platform.order.mapper.OrderTourReceivedStatisticsMapper; import com.xxfc.platform.order.mapper.OrderTourReceivedStatisticsMapper;
import com.xxfc.platform.order.pojo.account.OrderAccountBo; 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 com.xxfc.platform.order.pojo.dto.OrderDTO;
import com.xxfc.platform.order.pojo.dto.OrderReceivedStatisticsFindDTO; import com.xxfc.platform.order.pojo.dto.OrderReceivedStatisticsFindDTO;
import com.xxfc.platform.order.pojo.order.CompanyAmountBo;
import com.xxfc.platform.vehicle.feign.VehicleFeign;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T; import org.springframework.beans.BeanUtils;
import org.beetl.core.parser.BeetlParser;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.*; import java.util.*;
import java.util.function.Supplier; /**
import java.util.stream.Collectors; * @author libin
* @version 1.0 旅游统计
* @description
* @data 2019/11/28 9:57
*/
@Service @Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired)) @RequiredArgsConstructor(onConstructor = @__(@Autowired))
@Slf4j @Slf4j
public class OrderTourReceivedStatisticsBiz extends BaseBiz<OrderTourReceivedStatisticsMapper, OrderTourReceivedStatistics> { public class OrderTourReceivedStatisticsBiz extends BaseBiz<OrderTourReceivedStatisticsMapper, OrderTourReceivedStatistics> {
private final VehicleFeign vehicleFeign;
private final BaseOrderBiz baseOrderBiz; private final BaseOrderBiz baseOrderBiz;
private final OrderAccountBiz orderAccountBiz; private final OrderAccountBiz orderAccountBiz;
private final int FINISH = 6;
private final int CANCEL = 2;
private final int UNFINISH = 3;
private final int PAY_ORDER = 101;
//提前取消违约金
private final int VIOLATE_CANCEL = 101;
public List<OrderTourReceivedStatistics> selectOrderReceivedStatistics(OrderReceivedStatisticsFindDTO orderReceivedStatisticsFindDTO) { public List<OrderTourReceivedStatistics> selectOrderReceivedStatistics(OrderReceivedStatisticsFindDTO orderReceivedStatisticsFindDTO) {
return mapper.selectOrderTourReceivedStatistics(orderReceivedStatisticsFindDTO); return mapper.selectOrderTourReceivedStatistics(orderReceivedStatisticsFindDTO);
...@@ -56,83 +46,59 @@ public class OrderTourReceivedStatisticsBiz extends BaseBiz<OrderTourReceivedSta ...@@ -56,83 +46,59 @@ public class OrderTourReceivedStatisticsBiz extends BaseBiz<OrderTourReceivedSta
public List<OrderTourReceivedStatistics> orderTourInsertStatisticsNew(Date startDate, Date endDate, Map<Integer, String> companyMap) { public List<OrderTourReceivedStatistics> orderTourInsertStatisticsNew(Date startDate, Date endDate, Map<Integer, String> companyMap) {
List<OrderTourReceivedStatistics> orderTourReceivedStatisticsList = new ArrayList(); List<OrderTourReceivedStatistics> orderTourReceivedStatisticsList = new ArrayList();
List<String> stisticsActiveState = new ArrayList<>(); List<String> stisticsActiveState = new ArrayList<>();
//公司的收入与支出 ---》无状态
List<CompanyAmountBo> companyAmoutList = new ArrayList<>();
//根据旅游类型 时间查询 //根据旅游类型 时间查询
List<OrderDTO> orderDTOS = baseOrderBiz.selectOrdersByTypeAndTime(Arrays.asList(StatisticsStatusEnum.ORDER_TOUR_TYPE), startDate, endDate); List<OrderDTO> orderDTOS = baseOrderBiz.selectOrdersByTypeAndTime(Arrays.asList(StatisticsStatusEnum.ORDER_TOUR_TYPE), startDate, endDate);
//数据处理 状态组合 按支付状态分组 而后按组合状态 //数据处理 状态组合 按支付状态分组 而后按组合状态
Map<Boolean, Map<String, List<OrderDTO>>> stateGroupMap = orderDTOS.stream().peek(x -> { Map<Boolean, Map<String, List<OrderDTO>>> stateGroupMap = StatisticsStatusEnum.processOrdersWithState(stisticsActiveState, orderDTOS);
x.setStateGroup(String.format("%d-%d-%d-%d", x.getCompanyId(), x.getOrderOrigin(), x.getPayWay() == null ? StatisticsStatusEnum.NO_PAY_WAY : x.getPayWay(), x.getHasPay()));
stisticsActiveState.add(x.getStateGroup());
}).collect(Collectors.partitioningBy(x -> Objects.nonNull(x.getPayWay()), Collectors.groupingBy(OrderDTO::getStateGroup, Collectors.toList())));
//订单账目信息 //订单账目信息
List<OrderAccountBo> orderAccountBoList = orderAccountBiz.selectByTypeAndDate(StatisticsStatusEnum.ORDER_TOUR_TYPE, startDate, endDate); List<OrderAccountBo> orderAccountBoList = orderAccountBiz.selectByTypeAndDate(StatisticsStatusEnum.ORDER_TOUR_TYPE, startDate, endDate);
//账目数据整理 状态组合 //账目数据整理 状态组合
Map<String, List<OrderAccountBo>> orderMap = orderAccountBoList.stream().peek(x -> { Map<String, List<OrderAccountBo>> orderMap = StatisticsStatusEnum.processOrderAccountsWithState(stisticsActiveState,orderAccountBoList);
x.setStateGroup(String.format("%d-%d-%d-%d", x.getCompanyId(), x.getOrderOrigin(), x.getPayWay() == null ? StatisticsStatusEnum.NO_PAY_WAY : x.getPayWay(), x.getHasPay()));
}).collect(Collectors.groupingBy(OrderAccountBo::getStateGroup, Collectors.toList())); //已经支付订单
//已经支付订单 状态101
Set<Map.Entry<String, List<OrderAccountBo>>> orderSet = orderMap.entrySet(); Set<Map.Entry<String, List<OrderAccountBo>>> orderSet = orderMap.entrySet();
for (Map.Entry<String, List<OrderAccountBo>> orderEntry : orderSet) { for (Map.Entry<String, List<OrderAccountBo>> orderEntry : orderSet) {
String orderKey = orderEntry.getKey(); String orderKey = orderEntry.getKey();
List<OrderAccountBo> orderAccountBos = orderEntry.getValue(); List<OrderAccountBo> orderAccountBos = orderEntry.getValue();
BigDecimal totalAmount = BigDecimal.ZERO; //创建并设置旅游统计对象默认值
BigDecimal refundAmount = BigDecimal.ZERO;
OrderTourReceivedStatistics orderTourReceivedStatistics = StatisticsStatusEnum.wrapStatisticsObject(startDate, orderKey, companyMap, new OrderTourReceivedStatistics()); OrderTourReceivedStatistics orderTourReceivedStatistics = StatisticsStatusEnum.wrapStatisticsObject(startDate, orderKey, companyMap, new OrderTourReceivedStatistics());
//总违约金 //账目处理
BigDecimal totalLateFeeAmount = BigDecimal.ZERO; FeeTypeBo feeTypeBo = StatisticsStatusEnum.getFeeTyBoByOrderAccounts(orderAccountBos);
//订单退款总金额 //旅游订单量
BigDecimal totalOrderRefundAmount = BigDecimal.ZERO; Integer totalQuantity = stateGroupMap == null ?
//其它费用 0 : stateGroupMap.get(Boolean.TRUE) == null ?
BigDecimal totalExtendAmount = BigDecimal.ZERO; 0 : stateGroupMap.get(Boolean.TRUE).get(orderKey) == null ?
for (OrderAccountBo orderAccountBo : orderAccountBos) { 0 : stateGroupMap.get(Boolean.TRUE).get(orderKey).size();
OrderAccountDetail accountDetailEntity = orderAccountBo.getAccountDetailEntity();
if (orderAccountBo.getAccountType() == PAY_ORDER) {
totalAmount = totalAmount.add(accountDetailEntity.getOrderAmount());
} else {
totalOrderRefundAmount = totalOrderRefundAmount.add(accountDetailEntity.getOrderAmount());
List<OrderAccountDeduction> deductions = accountDetailEntity.getDeductions();
for (OrderAccountDeduction deduction : deductions) {
//目前旅游项目只有违约金,暂无定损、违章金等
if (deduction.getType().equals(VIOLATE_CANCEL)) {
totalLateFeeAmount = totalLateFeeAmount.add(deduction.getAmount());
}
if (DeductionTypeEnum.consumerCode.contains(deduction.getType())) {
BigDecimal extendAmount = deduction.getAmount().subtract(accountDetailEntity.getOriginOrderAmount());
totalExtendAmount = totalExtendAmount.add(extendAmount);
}
}
}
}
//插入共用字段
orderTourReceivedStatistics.setTotalAmount(totalAmount.subtract(refundAmount));
orderTourReceivedStatistics.setLateFeeAmount(totalLateFeeAmount);
orderTourReceivedStatistics.setOrderRefundAmount(totalOrderRefundAmount);
orderTourReceivedStatistics.setExtraAmount(totalExtendAmount);
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); orderTourReceivedStatistics.setTotalQuantity(totalQuantity);
//复制对应的金额(订单支付金额、退款金额、违约金)
BeanUtils.copyProperties(feeTypeBo,orderTourReceivedStatistics);
orderTourReceivedStatisticsList.add(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); 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); List<OrderTourReceivedStatistics> noPayOrderTourReceivedStatisticsList = createNoPayOrderTourReceivedStatisticsListList(startDate, noPayOrderRentvehicleMap, companyMap);
orderTourReceivedStatisticsList.addAll(noPayOrderTourReceivedStatisticsList); orderTourReceivedStatisticsList.addAll(noPayOrderTourReceivedStatisticsList);
//创建剩余状态组合旅游统计对象 //创建剩余状态组合旅游统计对象
List<OrderTourReceivedStatistics> otherStatisticsStateGroupList = createOtherStatisticsStateGroupList(startDate, stisticsActiveState, companyMap); List<OrderTourReceivedStatistics> otherStatisticsStateGroupList = createOtherStatisticsStateGroupList(startDate, stisticsActiveState, companyMap);
orderTourReceivedStatisticsList.addAll(otherStatisticsStateGroupList); orderTourReceivedStatisticsList.addAll(otherStatisticsStateGroupList);
//保存 //保存
insertMemberReceivedStatisticsBatch(orderTourReceivedStatisticsList); StatisticsStatusEnum.insertReceivedStatisticsBatch(orderTourReceivedStatisticsList,mapper);
return orderTourReceivedStatisticsList; 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) { private List<OrderTourReceivedStatistics> createNoPayOrderTourReceivedStatisticsListList(Date startDate, Map<String, List<OrderDTO>> noPayOrdersMap, Map<Integer, String> companyMap) {
...@@ -140,46 +106,22 @@ public class OrderTourReceivedStatisticsBiz extends BaseBiz<OrderTourReceivedSta ...@@ -140,46 +106,22 @@ public class OrderTourReceivedStatisticsBiz extends BaseBiz<OrderTourReceivedSta
if (noPayOrdersMap == null || noPayOrdersMap.isEmpty()) { if (noPayOrdersMap == null || noPayOrdersMap.isEmpty()) {
return orderTourReceivedStatisticsList; return orderTourReceivedStatisticsList;
} }
//遍历未支付单
Set<Map.Entry<String, List<OrderDTO>>> noPayOrderSet = noPayOrdersMap.entrySet(); Set<Map.Entry<String, List<OrderDTO>>> noPayOrderSet = noPayOrdersMap.entrySet();
for (Map.Entry<String, List<OrderDTO>> noPayOrderEntry : noPayOrderSet) { for (Map.Entry<String, List<OrderDTO>> noPayOrderEntry : noPayOrderSet) {
String noPayOrderStateGroup = noPayOrderEntry.getKey(); String noPayOrderStateGroup = noPayOrderEntry.getKey();
List<OrderDTO> noPayOrders = noPayOrderEntry.getValue(); List<OrderDTO> noPayOrders = noPayOrderEntry.getValue();
List<BigDecimal> damageSafeAmountList = new ArrayList<>(); //创建旅游统计对象并设置默认值
BigDecimal totalNoPayAmount = noPayOrders.stream().map(OrderDTO::getRealAmount).reduce(BigDecimal.ZERO, (x, y) -> x.add(y));
OrderTourReceivedStatistics orderTourReceivedStatistics = StatisticsStatusEnum.wrapStatisticsObject(startDate, noPayOrderStateGroup, companyMap, new OrderTourReceivedStatistics()); OrderTourReceivedStatistics orderTourReceivedStatistics = StatisticsStatusEnum.wrapStatisticsObject(startDate, noPayOrderStateGroup, companyMap, new OrderTourReceivedStatistics());
BigDecimal depositAmount = noPayOrders.stream().map(OrderDTO::getDeposit).reduce(BigDecimal.ZERO, BigDecimal::add); //订单总金额
BigDecimal totalNoPayAmount = noPayOrders.stream().map(OrderDTO::getRealAmount).reduce(BigDecimal.ZERO,BigDecimal::add);
orderTourReceivedStatistics.setTotalQuantity(noPayOrders.size()); orderTourReceivedStatistics.setTotalQuantity(noPayOrders.size());
orderTourReceivedStatistics.setTotalAmount(totalNoPayAmount.subtract(depositAmount)); orderTourReceivedStatistics.setTotalAmount(totalNoPayAmount);
orderTourReceivedStatisticsList.add(orderTourReceivedStatistics); orderTourReceivedStatisticsList.add(orderTourReceivedStatistics);
} }
return orderTourReceivedStatisticsList; return orderTourReceivedStatisticsList;
} }
/**
* @param startDate 时间
* @param noPayOrdersMap 未支付单map
* @return
*/
private List<OrderTourReceivedStatistics> createOtherStatisticsStateGroupList(Date startDate, Map<String, List<OrderDTO>> noPayOrdersMap) {
List<OrderTourReceivedStatistics> orderOrderTourReceivedStatisticsList = new ArrayList<>();
if (noPayOrdersMap == null || noPayOrdersMap.isEmpty()) {
return orderOrderTourReceivedStatisticsList;
}
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();
BigDecimal totalNoPayAmount = noPayOrders.stream().map(OrderDTO::getRealAmount).reduce(BigDecimal.ZERO, (x, y) -> x.add(y));
OrderTourReceivedStatistics orderTourReceivedStatistics = new OrderTourReceivedStatistics();
orderTourReceivedStatistics.setTotalQuantity(noPayOrders.size());
orderTourReceivedStatistics.setTotalAmount(totalNoPayAmount);
orderOrderTourReceivedStatisticsList.add(orderTourReceivedStatistics);
}
return orderOrderTourReceivedStatisticsList;
}
/** /**
* 创建剩余状态数据 * 创建剩余状态数据
* *
...@@ -198,38 +140,10 @@ public class OrderTourReceivedStatisticsBiz extends BaseBiz<OrderTourReceivedSta ...@@ -198,38 +140,10 @@ public class OrderTourReceivedStatisticsBiz extends BaseBiz<OrderTourReceivedSta
//创建租车统计克隆对象 //创建租车统计克隆对象
OrderTourReceivedStatistics orderTourReceivedStatistics = new OrderTourReceivedStatistics(); OrderTourReceivedStatistics orderTourReceivedStatistics = new OrderTourReceivedStatistics();
//统计对象的生成 //统计对象的生成
otherStatisticsStateGroup.parallelStream().map(stateGroup -> { otherStatisticsStateGroup.stream().peek(stateGroup -> {
OrderTourReceivedStatistics orderTourReceivedStatisticsClone = StatisticsStatusEnum.wrapStatisticsObject(startDate, stateGroup, companyMap, ObjectUtil.cloneByStream(orderTourReceivedStatistics)); OrderTourReceivedStatistics orderTourReceivedStatisticsClone = StatisticsStatusEnum.wrapStatisticsObject(startDate, stateGroup, companyMap, ObjectUtil.cloneByStream(orderTourReceivedStatistics));
orderTourReceivedStatisticsClone.setTotalAmount(BigDecimal.ZERO);
orderTourReceivedStatisticsClone.setTotalQuantity(0);
orderTourReceivedStatisticsClone.setLateFeeAmount(BigDecimal.ZERO);
orderTourReceivedStatisticsClone.setExtraAmount(BigDecimal.ZERO);
orderTourReceivedStatisticsClone.setOrderRefundAmount(BigDecimal.ZERO);
orderTourReceivedStatisticsList.add(orderTourReceivedStatisticsClone); orderTourReceivedStatisticsList.add(orderTourReceivedStatisticsClone);
return orderTourReceivedStatisticsClone;
}).count(); }).count();
return orderTourReceivedStatisticsList; return orderTourReceivedStatisticsList;
} }
/**
* 批量插入数据 mysql sql语句默认不能超过4M
*
* @param orderTourReceivedStatistics
*/
public void insertMemberReceivedStatisticsBatch(List<OrderTourReceivedStatistics> orderTourReceivedStatistics) {
int orderSize = orderTourReceivedStatistics.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<OrderTourReceivedStatistics> orderTourReceivedStatisticsList = orderTourReceivedStatistics.subList(fromIndex, toIndex);
mapper.insertList(orderTourReceivedStatisticsList);
}
}
} }
\ No newline at end of file
...@@ -13,12 +13,12 @@ import com.xxfc.platform.vehicle.feign.VehicleFeign; ...@@ -13,12 +13,12 @@ import com.xxfc.platform.vehicle.feign.VehicleFeign;
import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler; import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.JobHandler; import com.xxl.job.core.handler.annotation.JobHandler;
import com.xxl.job.core.log.XxlJobLogger;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -44,7 +44,12 @@ public class OrderReceivedStatisticsJobHandler extends IJobHandler { ...@@ -44,7 +44,12 @@ public class OrderReceivedStatisticsJobHandler extends IJobHandler {
public ReturnT<String> execute(String arg) throws Exception { public ReturnT<String> execute(String arg) throws Exception {
DateTime yesterday = DateUtil.yesterday(); DateTime yesterday = DateUtil.yesterday();
if (StringUtils.hasText(arg)){ if (StringUtils.hasText(arg)){
yesterday = DateUtil.parse(arg,"yyyy-MM-dd"); try {
yesterday = DateUtil.parse(arg, "yyyy-MM-dd");
}catch (Exception ex){
XxlJobLogger.log(ex);
yesterday = DateUtil.yesterday();
}
} }
Date startDate = DateUtil.beginOfDay(yesterday).toJdkDate(); Date startDate = DateUtil.beginOfDay(yesterday).toJdkDate();
...@@ -52,7 +57,7 @@ public class OrderReceivedStatisticsJobHandler extends IJobHandler { ...@@ -52,7 +57,7 @@ public class OrderReceivedStatisticsJobHandler extends IJobHandler {
Map<Integer, String> companyMap = vehicleFeign.findCompanyMap(); Map<Integer, String> companyMap = vehicleFeign.findCompanyMap();
//旅游订单 //旅游订单
List<OrderTourReceivedStatistics> orderTourReceivedStatisticsList = Collections.EMPTY_LIST; List<OrderTourReceivedStatistics> orderTourReceivedStatisticsList = orderTourReceivedStatisticsBiz.orderTourInsertStatisticsNew(startDate,endDate,companyMap);
//租车订单 //租车订单
List<OrderRentVehicleReceivedStatistics> orderRentVehicleReceivedStatisticsList = orderRentVehicleReceivedStatisticsBiz.orderRentVehicleReceivedStatistics(startDate, endDate, companyMap); List<OrderRentVehicleReceivedStatistics> orderRentVehicleReceivedStatisticsList = orderRentVehicleReceivedStatisticsBiz.orderRentVehicleReceivedStatistics(startDate, endDate, companyMap);
//会员订单 //会员订单
......
...@@ -5,19 +5,28 @@ import com.github.wxiaoqi.security.common.vo.PageDataVO; ...@@ -5,19 +5,28 @@ import com.github.wxiaoqi.security.common.vo.PageDataVO;
import com.xxfc.platform.order.biz.CompanyPerformanceBiz; import com.xxfc.platform.order.biz.CompanyPerformanceBiz;
import com.xxfc.platform.order.pojo.dto.CompanyPerformanceFindDTO; import com.xxfc.platform.order.pojo.dto.CompanyPerformanceFindDTO;
import com.xxfc.platform.order.bo.CompanyPerformanceBo; import com.xxfc.platform.order.bo.CompanyPerformanceBo;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor; 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.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; 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 * @author libin
* @version 1.0 * @version 1.0
* @description 公司业绩查询 * @description 公司业绩查询
* @data 2019/11/23 14:32 * @data 2019/11/23 14:32
*/ */
@Slf4j
@RestController @RestController
@RequestMapping("/statistics") @RequestMapping("/statistics")
@RequiredArgsConstructor(onConstructor = @__(@Autowired)) @RequiredArgsConstructor(onConstructor = @__(@Autowired))
...@@ -30,4 +39,22 @@ public class CompanyOrderReceivedStatiscsAdminController { ...@@ -30,4 +39,22 @@ public class CompanyOrderReceivedStatiscsAdminController {
PageDataVO<CompanyPerformanceBo> dataVO = companyPerformanceBiz.selectCompanyPerformancePage(companyPerformanceFindDTO); PageDataVO<CompanyPerformanceBo> dataVO = companyPerformanceBiz.selectCompanyPerformancePage(companyPerformanceFindDTO);
return ObjectRestResponse.succ(dataVO); 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("导出数据失败");
}
}
} }
...@@ -354,9 +354,9 @@ ...@@ -354,9 +354,9 @@
</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.*,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 select bo.*,omd.memberLevel,IFNULL(IFNULL(orvd.start_company_id,otd.start_company_id),bo.`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
`realAmount`,`order_origin` AS `orderOrigin`, `has_pay` AS `hasPay`, `realAmount`,`order_origin` AS `orderOrigin`, `has_pay` AS `hasPay`,
`pay_way` AS `payWay` `pay_way` AS `payWay`,`parent_user_company_id`
from `base_order` where (`crt_time` between #{startDate} and #{endDate} or `pay_time` between #{startDate} and #{endDate} ) and `type` IN <foreach collection="types" from `base_order` where (`crt_time` between #{startDate} and #{endDate} or `pay_time` between #{startDate} and #{endDate} ) and `type` IN <foreach collection="types"
item="type" item="type"
open="(" close=")" open="(" close=")"
......
...@@ -62,7 +62,7 @@ ...@@ -62,7 +62,7 @@
bo.order_origin, bo.order_origin,
bo.pay_way, bo.pay_way,
bo.has_pay, bo.has_pay,
brvd.start_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`
...@@ -71,7 +71,8 @@ ...@@ -71,7 +71,8 @@
`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_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>
</mapper> </mapper>
\ No newline at end of file
...@@ -62,9 +62,9 @@ ...@@ -62,9 +62,9 @@
<select id="selectCompanyPerformanceWithDay" resultType="com.xxfc.platform.order.bo.CompanyPerformanceBo"> <select id="selectCompanyPerformanceWithDay" resultType="com.xxfc.platform.order.bo.CompanyPerformanceBo">
SELECT SELECT
ors.*, ors.*,
IFNULL(ovss.departureNum,0), IFNULL(ovss.departureNum,0) as `departureNum`,
IFNULL(ovss.rentDays,0), IFNULL(ovss.rentDays,0) as `departureNum`,
IFNULL(ovss.arrivalNum,0) IFNULL(ovss.arrivalNum,0) as `arrivalNum`
FROM FROM
( (
SELECT SELECT
...@@ -75,12 +75,13 @@ ...@@ -75,12 +75,13 @@
SUM(`travel_amount` ) AS `travelAmount`, SUM(`travel_amount` ) AS `travelAmount`,
SUM(`rent_vehicle_amount` ) AS `rentVehilceAmount` SUM(`rent_vehicle_amount` ) AS `rentVehilceAmount`
FROM FROM
`order_received_statistics` `order_received_statistics` WHERE `has_pay`=1
WHERE 1=1
<if test="companyName!=null and companyName!=''"> <if test="companyName!=null and companyName!=''">
AND `company_name` LIKE CONCAT('%',#{companyName},'%') AND `company_name` LIKE CONCAT('%',#{companyName},'%')
</if> </if>
<if test="companyId!=null">
AND `company_id`=#{companyId}
</if>
<if test="startDate!=null and endDate!=null"> <if test="startDate!=null and endDate!=null">
AND `date` BETWEEN #{startDate} AND #{endDate} AND `date` BETWEEN #{startDate} AND #{endDate}
</if> </if>
...@@ -109,8 +110,10 @@ ...@@ -109,8 +110,10 @@
IFNULL(SUM( `arrival_num` ),0) AS `arrivalNum`, IFNULL(SUM( `arrival_num` ),0) AS `arrivalNum`,
IFNULL(SUM( `rent_num` ),0) AS `rentDays` IFNULL(SUM( `rent_num` ),0) AS `rentDays`
FROM FROM
`order_vehicle_service_statistics` `order_vehicle_service_statistics` WHERE 1=1
WHERE 1=1 <if test="companyId!=null">
AND `company_id`=#{companyId}
</if>
<if test="startDate!=null and endDate!=null"> <if test="startDate!=null and endDate!=null">
AND `count_date` BETWEEN #{startDate} AND #{endDate} AND `count_date` BETWEEN #{startDate} AND #{endDate}
</if> </if>
...@@ -138,9 +141,9 @@ ...@@ -138,9 +141,9 @@
resultType="com.xxfc.platform.order.bo.CompanyPerformanceBo"> resultType="com.xxfc.platform.order.bo.CompanyPerformanceBo">
SELECT SELECT
ors.*, ors.*,
IFNULL(ovss.departureNum,0), IFNULL(ovss.departureNum,0) as `departureNum`,
IFNULL(ovss.rentDays,0), IFNULL(ovss.rentDays,0) as `rentDays`,
IFNULL(ovss.arrivalNum,0) IFNULL(ovss.arrivalNum,0) as `arrivalNum`
FROM FROM
( (
SELECT SELECT
...@@ -151,12 +154,13 @@ ...@@ -151,12 +154,13 @@
COALESCE(SUM(`travel_amount` ),0) AS `travelAmount`, COALESCE(SUM(`travel_amount` ),0) AS `travelAmount`,
COALESCE(SUM(`rent_vehicle_amount` ),0) AS `rentVehilceAmount` COALESCE(SUM(`rent_vehicle_amount` ),0) AS `rentVehilceAmount`
FROM FROM
`order_received_statistics` `order_received_statistics` WHERE `has_pay`=1
WHERE 1=1
<if test="companyName!=null and companyName!=''"> <if test="companyName!=null and companyName!=''">
AND `company_name` LIKE CONCAT('%',#{companyName},'%') AND `company_name` LIKE CONCAT('%',#{companyName},'%')
</if> </if>
<if test="companyId!=null">
AND `company_id`=#{companyId}
</if>
<if test="startDate!=null and endDate!=null"> <if test="startDate!=null and endDate!=null">
AND `date` BETWEEN #{startDate} AND #{endDate} AND `date` BETWEEN #{startDate} AND #{endDate}
</if> </if>
...@@ -185,8 +189,10 @@ ...@@ -185,8 +189,10 @@
COALESCE(SUM( `arrival_num` ),0) AS `arrivalNum`, COALESCE(SUM( `arrival_num` ),0) AS `arrivalNum`,
COALESCE(SUM( `rent_num` ),0) AS `rentDays` COALESCE(SUM( `rent_num` ),0) AS `rentDays`
FROM FROM
`order_vehicle_service_statistics` `order_vehicle_service_statistics` WHERE 1=1
WHERE 1=1 <if test="companyId!=null">
AND `company_id`=#{companyId}
</if>
<if test="startDate!=null and endDate!=null"> <if test="startDate!=null and endDate!=null">
AND `count_date` BETWEEN #{startDate} AND #{endDate} AND `count_date` BETWEEN #{startDate} AND #{endDate}
</if> </if>
...@@ -213,9 +219,9 @@ ...@@ -213,9 +219,9 @@
<select id="selectCompanyPerformanceWithWeek" resultType="com.xxfc.platform.order.bo.CompanyPerformanceBo"> <select id="selectCompanyPerformanceWithWeek" resultType="com.xxfc.platform.order.bo.CompanyPerformanceBo">
SELECT SELECT
ors.*, ors.*,
IFNULL(ovss.departureNum,0), IFNULL(ovss.departureNum,0) as `departureNum`,
IFNULL(ovss.rentDays,0), IFNULL(ovss.rentDays,0) as `rentDays`,
IFNULL(ovss.arrivalNum,0) IFNULL(ovss.arrivalNum,0) as `arrivalNum`
FROM FROM
( (
SELECT SELECT
...@@ -226,12 +232,13 @@ ...@@ -226,12 +232,13 @@
COALESCE(SUM(`travel_amount` ),0) AS `travelAmount`, COALESCE(SUM(`travel_amount` ),0) AS `travelAmount`,
COALESCE(SUM(`rent_vehicle_amount` ),0) AS `rentVehilceAmount` COALESCE(SUM(`rent_vehicle_amount` ),0) AS `rentVehilceAmount`
FROM FROM
`order_received_statistics` `order_received_statistics` WHERE `has_pay`=1
WHERE 1=1
<if test="companyName!=null and companyName!=''"> <if test="companyName!=null and companyName!=''">
AND `company_name` LIKE CONCAT('%',#{companyName},'%') AND `company_name` LIKE CONCAT('%',#{companyName},'%')
</if> </if>
<if test="companyId!=null">
AND `company_id`=#{companyId}
</if>
<if test="startDate!=null and endDate!=null"> <if test="startDate!=null and endDate!=null">
AND `date` BETWEEN #{startDate} AND #{endDate} AND `date` BETWEEN #{startDate} AND #{endDate}
</if> </if>
...@@ -262,6 +269,9 @@ ...@@ -262,6 +269,9 @@
FROM FROM
`order_vehicle_service_statistics` `order_vehicle_service_statistics`
WHERE 1=1 WHERE 1=1
<if test="companyId!=null">
AND `company_id`=#{companyId}
</if>
<if test="startDate!=null and endDate!=null"> <if test="startDate!=null and endDate!=null">
AND `count_date` BETWEEN #{startDate} AND #{endDate} AND `count_date` BETWEEN #{startDate} AND #{endDate}
</if> </if>
......
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.OrderMemberReceivedStatisticsBiz;
import com.xxfc.platform.order.biz.OrderRentVehicleReceivedStatisticsBiz;
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.OrderReceivedStatisticsJobHandler; 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 com.xxfc.platform.vehicle.feign.VehicleFeign;
import lombok.SneakyThrows;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
...@@ -17,6 +16,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; ...@@ -17,6 +16,7 @@ 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.util.Date; import java.util.Date;
import java.util.Map;
/** /**
* @author libin * @author libin
...@@ -46,6 +46,8 @@ public class ServiceTest { ...@@ -46,6 +46,8 @@ public class ServiceTest {
@Autowired @Autowired
private OrderReceivedStatisticsJobHandler orderReceivedStatisticsJobHandler; private OrderReceivedStatisticsJobHandler orderReceivedStatisticsJobHandler;
@Autowired @Autowired
private OrderTourReceivedStatisticsBiz orderTourReceivedStatisticsBiz;
@Autowired
private VehicleFeign vehicleFeign; private VehicleFeign vehicleFeign;
@Test @Test
public void testSchedu(){ public void testSchedu(){
...@@ -91,5 +93,36 @@ public class ServiceTest { ...@@ -91,5 +93,36 @@ public class ServiceTest {
handler.execute("2019-09-29"); handler.execute("2019-09-29");
} }
@Test
public void testMemberStatistics(){
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();
orderMemberReceivedStatisticsBiz.orderMemberReceivedStatistics(startDate,endDate,companyMap);
}
@Test
public void testRentVehicleStatistics(){
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();
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(){
orderReceivedStatisticsJobHandler.execute("");
}
} }
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