Commit 803ba30a authored by hanfeng's avatar hanfeng

Merge branch 'master-order-statistics'

parents e0c75d35 0c4aba12
package com.xxfc.platform.order.Utils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class OrderDateUtils {
public static String getFirstDayOfMonth(int year, int month) {
String monthStr = String.valueOf(month);
return year + "-" + monthStr + "-" + "01";
}
/**
* get the last date of given month and year
* @param year
* @param month
* @return
*     
*/
public static String getLastDayOfMonth(int year, int month) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month - 1);
calendar.set(Calendar.DATE, 1);
calendar.add(Calendar.MONTH, 1);
calendar.add(Calendar.DAY_OF_YEAR, -1);
return calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-" +
calendar.get(Calendar.DAY_OF_MONTH);
}
/**
* get Calendar of given year
* @param year
* @return
*     
*/
private static Calendar getCalendarFormYear(int year) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
cal.set(Calendar.YEAR, year);
return cal;
}
/**
* get start date of given week no of a year
* @param year
* @param weekNo
* @return
*     
*/
public static String getStartDayOfWeekNo(int year, int weekNo) {
Calendar cal = getCalendarFormYear(year);
cal.set(Calendar.WEEK_OF_YEAR, weekNo);
return cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH) + 1) + "-" +
cal.get(Calendar.DAY_OF_MONTH);
}
/**
* get the end day of given week no of a year.
* @param year
* @param weekNo
* @return
*     
*/
public static String getEndDayOfWeekNo(int year, int weekNo) {
Calendar cal = getCalendarFormYear(year);
cal.set(Calendar.WEEK_OF_YEAR, weekNo);
cal.add(Calendar.DAY_OF_WEEK, 6);
return cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH) + 1) + "-" +
cal.get(Calendar.DAY_OF_MONTH);
}
public static String timeStampConversionToString(Long time) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date(time);
return simpleDateFormat.format(date);
}
public static Long ConvertingStringsToTimestamps(String time) throws ParseException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
return simpleDateFormat.parse(time).getTime();
}
public static Integer getTodayOfWeek() {
Calendar cal = Calendar.getInstance();
cal.setFirstDayOfWeek(Calendar.MONDAY);
cal.setTimeInMillis(System.currentTimeMillis());
return cal.get(Calendar.WEEK_OF_YEAR);
}
public static Integer getTodayOfMonth() {
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis());
return cal.get(Calendar.MONTH)+1;
}
public static Integer getThisYear() {
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis());
return cal.get(Calendar.YEAR);
}
}
package com.xxfc.platform.order.contant.enumerate;
import lombok.NoArgsConstructor;
@NoArgsConstructor
public enum OrderInquiryType {
DAY(1,"按天分类"),WEEK(2,"按周分类"),MONTH(3,"按月分类");
/**
* 编码
*/
private Integer code;
/**
* 类型描述
*/
private String desc;
OrderInquiryType(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
public Integer getCode() {
return code;
}
public String getDesc() {
return desc;
}
}
package com.xxfc.platform.order.entity;
import com.xxfc.platform.order.pojo.Member;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* @author Administrator
*/
@Data
public class MembersOrder {
/**
* 时间段按日(yyyy-MM-dd)/周(yyyy-ww) /月(yyyy-MM)
*/
private String period;
List<Member> members;
}
......@@ -21,7 +21,7 @@ public class OrderStatistics {
/**
* 历史交总金额
*/
@ApiModelProperty(value = "历史交总金额")
@ApiModelProperty(value = "历史交总金额")
private BigDecimal totalGmv;
/**
......
package com.xxfc.platform.order.pojo;
import lombok.Data;
import java.math.BigDecimal;
/**
* 每日、每周或每月不同会员的总数据
* @author Administrator
*/
@Data
public class Member {
/**
* 金额
*/
private BigDecimal amount;
/**
* 会员等级
*/
private Integer level;
/**
* 购买次数
*/
private Integer number;
/**
* 会员名
*/
private String memberName;
}
package com.xxfc.platform.order.pojo;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* 每日、每周、每月会员购买数据
* @author Administrator
*/
@Data
public class MembersOrderDto {
/**
* 时间段
*/
private String timeSlot;
/**
* 时间段总数据
*
*/
private BigDecimal totalPayment;
/**
* 时间段内不同会员数据
*/
private List<Member> members;
}
package com.xxfc.platform.order.pojo;
import lombok.Data;
/**
* 会员订单统计条件
* @author Administrator
*/
@Data
public class OrderQuery {
private Integer page=1;
private Integer limit=10;
/**
* 查询开始时间
*/
private Long startTime;
/**
* 查询结束时间
*/
private Long endTime;
/**
* 1.按每日统计,2.按每周统计,3.按每月统计
*/
private Integer type=1;
}
......@@ -2,17 +2,17 @@ package com.xxfc.platform.order.biz;
import cn.hutool.json.JSONUtil;
import com.github.wxiaoqi.security.common.biz.BaseBiz;
import com.github.wxiaoqi.security.common.exception.BaseException;
import com.google.common.collect.Lists;
import com.xxfc.platform.order.contant.enumerate.OrderTypeEnum;
import com.xxfc.platform.order.entity.DailyMembersOrderStatistics;
import com.xxfc.platform.order.entity.MembersOrder;
import com.xxfc.platform.order.entity.OrderAccount;
import com.xxfc.platform.order.entity.OrderStatistics;
import com.xxfc.platform.order.mapper.DailyMembersOrderStatisticsMapper;
import com.xxfc.platform.order.pojo.OrderQuery;
import com.xxfc.platform.order.pojo.account.OrderAccountDTO;
import com.xxfc.platform.order.pojo.account.OrderAccountDetail;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -21,12 +21,12 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import tk.mybatis.mapper.entity.Example;
import tk.mybatis.mapper.weekend.WeekendSqls;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 每日购买会员订单统计
......@@ -64,17 +64,45 @@ public class DailyMembersOrderStatisticsBiz extends BaseBiz<DailyMembersOrderSta
orderStatistics.setBranchCompanyId(OMPANY_ID);
orderStatistics.setOneDay(accountList.get(0).getOneDay());
}
log.info("Members:统计完成");
if (JudgmentOfExistence(orderStatistics)) {
insertSelectiveRe(orderStatistics);
} else {
mapper.updateByExampleSelective(orderStatistics, Example.builder(DailyMembersOrderStatistics.class)
.where(WeekendSqls.<DailyMembersOrderStatistics>custom()
.andEqualTo(DailyMembersOrderStatistics::getOneDay, orderStatistics.getOneDay())
.andEqualTo(DailyMembersOrderStatistics::getBranchCompanyId, orderStatistics.getBranchCompanyId()))
.build());
}
log.info("Members:保存成功");
}
return true;
} catch (Exception e) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
e.printStackTrace();
log.error("Members:"+ e.getMessage());
return false;
}
}
/**
* 添加前查询是否存在这条数据
* @param orderStatistic
* @return
*/
private boolean JudgmentOfExistence(DailyMembersOrderStatistics orderStatistic) {
List<DailyMembersOrderStatistics> statistics = selectByExample(Example.builder(DailyMembersOrderStatistics.class)
.where(WeekendSqls.<DailyMembersOrderStatistics>custom()
.andEqualTo(DailyMembersOrderStatistics::getOneDay, orderStatistic.getOneDay())
.andEqualTo(DailyMembersOrderStatistics::getBranchCompanyId, orderStatistic.getBranchCompanyId()))
.build());
if (CollectionUtils.isNotEmpty(statistics)) {
return false;
}
return true;
}
/**
* 获取押金和
*
......@@ -120,4 +148,13 @@ public class DailyMembersOrderStatisticsBiz extends BaseBiz<DailyMembersOrderSta
public OrderStatistics findAll(Integer companyId) {
return mapper.monthOrderTotal(companyId);
}
/**
* 根据时间按年月日分组
* @param query
* @return
*/
public List<MembersOrder> getMemberOrderStatistics(OrderQuery query) {
return mapper.getMemberOrderStatistics(query);
}
}
......@@ -25,16 +25,17 @@ public class DailyOrderStatisticsBiz extends BaseBiz<DailyOrderStatisticsMapper,
@Autowired
private DailyMembersOrderStatisticsBiz membersStatisticsBiz;
@Scheduled(cron = "0 0 2 * * ?")
@Scheduled(cron = "0 0 0/1 * * ?")
public boolean statisticalOrder(){
boolean vehicleFlag = vehicleStatisticsBiz.saveDailyVehicleOrderRecord();
boolean travelFlag = travelStatisticsBiz.saveDailyTravelOrderRecord();
boolean membersFlag= membersStatisticsBiz.saveDailyMembersOrderRecord();
if (vehicleFlag&&travelFlag&&membersFlag){
log.info("----statisticalOrder:成功-----");
return true;
}
log.info("----statisticalOrder:失败-----");
log.info("statisticalOrder:失败!(vehicleFlag="+vehicleFlag+"/travelFlag="+travelFlag+"membersFlag="+membersFlag+")");
return false;
}
......
......@@ -7,12 +7,10 @@ import com.github.wxiaoqi.security.common.biz.BaseBiz;
import com.github.wxiaoqi.security.common.exception.BaseException;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.xxfc.platform.order.contant.enumerate.AccountTypeEnum;
import com.xxfc.platform.order.contant.enumerate.DeductionTypeEnum;
import com.xxfc.platform.order.contant.enumerate.OrderTypeEnum;
import com.xxfc.platform.order.contant.enumerate.RefundTypeEnum;
import com.xxfc.platform.order.entity.DailyTravelOrderStatistics;
import com.xxfc.platform.order.entity.OrderAccount;
import com.xxfc.platform.order.entity.OrderStatistics;
import com.xxfc.platform.order.entity.*;
import com.xxfc.platform.order.mapper.DailyTravelOrderStatisticsMapper;
import com.xxfc.platform.order.pojo.account.OrderAccountDTO;
import com.xxfc.platform.order.pojo.account.OrderAccountDeduction;
......@@ -27,6 +25,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import tk.mybatis.mapper.entity.Example;
import tk.mybatis.mapper.weekend.WeekendSqls;
import java.math.BigDecimal;
import java.util.*;
......@@ -113,19 +112,47 @@ public class DailyTravelOrderStatisticsBiz extends BaseBiz<DailyTravelOrderStati
try {
//获取每日订单统计
List<DailyTravelOrderStatistics> orderStatistics = getDailyTravelOrderStatistics();
log.info("Travel:统计完成");
if (CollectionUtils.isNotEmpty(orderStatistics)) {
for (DailyTravelOrderStatistics orderStatistic : orderStatistics) {
//保存统计
insertSelectiveRe(orderStatistic);
if (JudgmentOfExistence(orderStatistic)) {
insertSelectiveRe(orderStatistic);
} else {
mapper.updateByExampleSelective(orderStatistic, Example.builder(DailyTravelOrderStatistics.class)
.where(WeekendSqls.<DailyTravelOrderStatistics>custom()
.andEqualTo(DailyTravelOrderStatistics::getOneDay, orderStatistic.getOneDay())
.andEqualTo(DailyTravelOrderStatistics::getBranchCompanyId, orderStatistic.getBranchCompanyId()))
.build());
}
}
}
log.info("Travel:保存成功");
return true;
} catch (Exception e) {
log.error(e.getMessage());
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
log.error("Travel:"+e.getMessage());
return false;
}
}
/**
* 添加前查询是否存在这条数据
* @param orderStatistic
* @return
*/
private boolean JudgmentOfExistence(DailyTravelOrderStatistics orderStatistic) {
List<DailyTravelOrderStatistics> statistics = selectByExample(Example.builder(DailyTravelOrderStatistics.class)
.where(WeekendSqls.<DailyTravelOrderStatistics>custom()
.andEqualTo(DailyTravelOrderStatistics::getOneDay, orderStatistic.getOneDay())
.andEqualTo(DailyTravelOrderStatistics::getBranchCompanyId, orderStatistic.getBranchCompanyId()))
.build());
if (CollectionUtils.isNotEmpty(statistics)) {
return false;
}
return true;
}
private List<DailyTravelOrderStatistics> getDailyTravelOrderStatistics() {
//获取当天所有订单账目
List<OrderAccountDTO> accountList = accountBiz.getOrderAccountByOrderType(OrderTypeEnum.TOUR.getCode(), day);
......@@ -154,7 +181,7 @@ public class DailyTravelOrderStatisticsBiz extends BaseBiz<DailyTravelOrderStati
List<OrderAccountDTO> list = typeMap.get(orderAccountDTO.getAccountType());
if (list == null) {
list = new ArrayList<>();
companyIdmap.put(orderAccountDTO.getAccountType(), list);
typeMap.put(orderAccountDTO.getAccountType(), list);
}
list.add(orderAccountDTO);
}
......@@ -194,7 +221,7 @@ public class DailyTravelOrderStatisticsBiz extends BaseBiz<DailyTravelOrderStati
private void refundAndDeductions(Map<Integer, List<OrderAccountDTO>> map, DailyTravelOrderStatistics orderStatistics) {
ArrayList<OrderAccountDTO> arrayList = Lists.newArrayList();
for (Integer key : map.keySet()) {
if (!key.equals(RefundTypeEnum.ORDER_FUND.getCode())) {
if (!key.equals(AccountTypeEnum.IN_ORDER_PAY.getCode())) {
arrayList.addAll(map.get(key));
}
}
......@@ -207,10 +234,8 @@ public class DailyTravelOrderStatisticsBiz extends BaseBiz<DailyTravelOrderStati
add(DeductionTypeEnum.VIOLATE_CANCEL.getCode());
}});
orderStatistics.setDefaultMoney(bigDecimal);
//订单退还总额
orderStatistics.setReturnGmv(orderStatistics.getGmv().subtract(bigDecimal));
}
}
}
......@@ -219,7 +244,7 @@ public class DailyTravelOrderStatisticsBiz extends BaseBiz<DailyTravelOrderStati
private DailyTravelOrderStatistics getGmvAndSecurityDeposit(Map<Integer, List<OrderAccountDTO>> map) {
DailyTravelOrderStatistics orderStatistics = new DailyTravelOrderStatistics();
List<OrderAccountDTO> orderAccountDTOS = map.get(RefundTypeEnum.ORDER_FUND.getCode());
List<OrderAccountDTO> orderAccountDTOS = map.get(AccountTypeEnum.IN_ORDER_PAY.getCode());
if (CollectionUtils.isNotEmpty(orderAccountDTOS)) {
ArrayList<OrderAccountDetail> orderAccountDetails = getOrderAccountDetail(orderAccountDTOS);
......@@ -273,9 +298,7 @@ public class DailyTravelOrderStatisticsBiz extends BaseBiz<DailyTravelOrderStati
*/
private List<OrderAccountDeduction> gettDeductions(ArrayList<OrderAccountDetail> orderAccountDetails) {
ArrayList<OrderAccountDeduction> arrayList = Lists.newArrayList();
for (OrderAccountDetail orderAccountDetail : orderAccountDetails) {
arrayList.addAll(orderAccountDetail.getDeductions());
}
orderAccountDetails.parallelStream().map(OrderAccountDetail::getDeductions).forEach(e->arrayList.addAll(e));
return arrayList;
}
......@@ -283,14 +306,14 @@ public class DailyTravelOrderStatisticsBiz extends BaseBiz<DailyTravelOrderStati
/**
* 根据type获取对应的金额总和
*
* @param OrderAccountDeduction
* @param list
* @param type 金额类型
* @return
*/
private BigDecimal get(List<OrderAccountDeduction> OrderAccountDeduction, List<Integer> type) {
return OrderAccountDeduction.parallelStream()
.filter(el -> el.getType().equals(type))
.map(com.xxfc.platform.order.pojo.account.OrderAccountDeduction::getAmount)
private BigDecimal get(List<OrderAccountDeduction> list, List<Integer> type) {
return list.parallelStream()
.filter(el ->type.contains(el.getType()))
.map(OrderAccountDeduction::getAmount)
.reduce(BigDecimal.ZERO,BigDecimal::add);
}
......
......@@ -4,9 +4,10 @@ import cn.hutool.json.JSONUtil;
import com.github.wxiaoqi.security.common.biz.BaseBiz;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.xxfc.platform.order.contant.enumerate.AccountTypeEnum;
import com.xxfc.platform.order.contant.enumerate.DeductionTypeEnum;
import com.xxfc.platform.order.contant.enumerate.OrderTypeEnum;
import com.xxfc.platform.order.contant.enumerate.RefundTypeEnum;
import com.xxfc.platform.order.entity.DailyOrderStatistics;
import com.xxfc.platform.order.entity.DailyVehicleOrderStatistics;
import com.xxfc.platform.order.entity.OrderAccount;
import com.xxfc.platform.order.entity.OrderStatistics;
......@@ -22,6 +23,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import tk.mybatis.mapper.common.example.UpdateByExampleSelectiveMapper;
import tk.mybatis.mapper.entity.Example;
import tk.mybatis.mapper.weekend.WeekendSqls;
import java.math.BigDecimal;
import java.util.*;
......@@ -207,15 +212,15 @@ public class DailyVehicleOrderStatisticsBiz extends BaseBiz<DailyVehicleOrderSta
/**
* 根据type获取对应的金额总和
*
* @param OrderAccountDeduction
* @param types 金额类型
* @param list
* @param types 金额类型
* @return
*/
private BigDecimal get(List<OrderAccountDeduction> OrderAccountDeduction, List<Integer> types) {
return OrderAccountDeduction.parallelStream()
.filter(el -> types.contains(el))
.map(com.xxfc.platform.order.pojo.account.OrderAccountDeduction::getAmount)
.reduce(BigDecimal.ZERO,BigDecimal::add);
private BigDecimal get(List<OrderAccountDeduction> list, List<Integer> types) {
return list.parallelStream()
.filter(el -> types.contains(el.getType()))
.map(OrderAccountDeduction::getAmount)
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
......@@ -237,30 +242,55 @@ public class DailyVehicleOrderStatisticsBiz extends BaseBiz<DailyVehicleOrderSta
/**
* 统计订单并保存到数据库当中
*
* @return
*/
@Transactional(rollbackFor = Exception.class)
public boolean saveDailyVehicleOrderRecord() {
try {
//获取每日订单统计
List<DailyVehicleOrderStatistics> orderStatistics = getDailyVehicleOrderRecord();
log.info("Vehicle:统计完成");
if (CollectionUtils.isNotEmpty(orderStatistics)) {
for (DailyVehicleOrderStatistics orderStatistic : orderStatistics) {
//保存统计
insertSelectiveRe(orderStatistic);
if (JudgmentOfExistence(orderStatistic)) {
insertSelectiveRe(orderStatistic);
} else {
mapper.updateByExampleSelective(orderStatistic, Example.builder(DailyVehicleOrderStatistics.class)
.where(WeekendSqls.<DailyVehicleOrderStatistics>custom()
.andEqualTo(DailyVehicleOrderStatistics::getOneDay, orderStatistic.getOneDay())
.andEqualTo(DailyVehicleOrderStatistics::getBranchCompanyId, orderStatistic.getBranchCompanyId()))
.build());
}
}
}
log.info("Vehicle:保存成功");
return true;
} catch (Exception e) {
log.error(e.getMessage());
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
log.error("Vehicle:" + e.getMessage());
return false;
}
}
private boolean JudgmentOfExistence(DailyVehicleOrderStatistics orderStatistic) {
List<DailyVehicleOrderStatistics> statistics = selectByExample(Example.builder(DailyVehicleOrderStatistics.class)
.where(WeekendSqls.<DailyVehicleOrderStatistics>custom()
.andEqualTo(DailyVehicleOrderStatistics::getOneDay, orderStatistic.getOneDay())
.andEqualTo(DailyVehicleOrderStatistics::getBranchCompanyId, orderStatistic.getBranchCompanyId()))
.build());
if (CollectionUtils.isNotEmpty(statistics)) {
return false;
}
return true;
}
/**
* 获取所有分公司每日统计记录
*
* @return
*/
private List<DailyVehicleOrderStatistics> getDailyVehicleOrderRecord() {
......@@ -292,7 +322,7 @@ public class DailyVehicleOrderStatisticsBiz extends BaseBiz<DailyVehicleOrderSta
List<OrderAccountDTO> list = typeMap.get(orderAccountDTO.getAccountType());
if (list == null) {
list = new ArrayList<>();
companyIdmap.put(orderAccountDTO.getAccountType(), list);
typeMap.put(orderAccountDTO.getAccountType(), list);
}
list.add(orderAccountDTO);
......@@ -318,6 +348,7 @@ public class DailyVehicleOrderStatisticsBiz extends BaseBiz<DailyVehicleOrderSta
/**
* 获取该分公司的统计数据
*
* @param map
* @return
*/
......@@ -339,7 +370,7 @@ public class DailyVehicleOrderStatisticsBiz extends BaseBiz<DailyVehicleOrderSta
private void refundAndDeductions(Map<Integer, List<OrderAccountDTO>> map, DailyVehicleOrderStatistics orderStatistics) {
ArrayList<OrderAccountDTO> arrayList = Lists.newArrayList();
for (Integer key : map.keySet()) {
if (!key.equals(RefundTypeEnum.ORDER_FUND.getCode())) {
if (!key.equals(AccountTypeEnum.IN_ORDER_PAY.getCode())) {
arrayList.addAll(map.get(key));
}
}
......@@ -354,22 +385,22 @@ public class DailyVehicleOrderStatisticsBiz extends BaseBiz<DailyVehicleOrderSta
orderStatistics.setRefundSecurityDeposit(refundSecurityDeposit);
List<OrderAccountDeduction> OrderAccountDeductions = gettDeductions(orderAccountDetail);
//获取违章总额
orderStatistics.setViolationMoney(get(OrderAccountDeductions, new ArrayList<Integer>(){{
orderStatistics.setViolationMoney(get(OrderAccountDeductions, new ArrayList<Integer>() {{
add(DeductionTypeEnum.VIOLATE_TRAFFIC_DEDUCT.getCode());
}}));
//获取损坏赔偿总额
orderStatistics.setCompensation(get(OrderAccountDeductions,new ArrayList<Integer>(){{
orderStatistics.setCompensation(get(OrderAccountDeductions, new ArrayList<Integer>() {{
add(DeductionTypeEnum.DAMAGES.getCode());
}} ));
}}));
//获取违约总额
ArrayList<Integer> types = Lists.newArrayList();
types.add(DeductionTypeEnum.VIOLATE_ADVANCE.getCode());
types.add(DeductionTypeEnum.VIOLATE_CANCEL.getCode());
types.add(DeductionTypeEnum.VIOLATE_DELAY.getCode());
orderStatistics.setDefaultMoney(get(OrderAccountDeductions,types));
orderStatistics.setDefaultMoney(get(OrderAccountDeductions, types));
//消费金额
orderStatistics.setTotalExpenditure(get(OrderAccountDeductions,new ArrayList<Integer>(){{
orderStatistics.setTotalExpenditure(get(OrderAccountDeductions, new ArrayList<Integer>() {{
add(DeductionTypeEnum.CONSUME.getCode());
}}));
}
......@@ -384,7 +415,7 @@ public class DailyVehicleOrderStatisticsBiz extends BaseBiz<DailyVehicleOrderSta
*/
private DailyVehicleOrderStatistics getGmvAndSecurityDeposit(Map<Integer, List<OrderAccountDTO>> map) {
DailyVehicleOrderStatistics orderStatistics = new DailyVehicleOrderStatistics();
List<OrderAccountDTO> orderAccountDTOS = map.get(RefundTypeEnum.ORDER_FUND.getCode());
List<OrderAccountDTO> orderAccountDTOS = map.get(AccountTypeEnum.IN_ORDER_PAY.getCode());
if (CollectionUtils.isNotEmpty(orderAccountDTOS)) {
ArrayList<OrderAccountDetail> orderAccountDetails = getOrderAccountDetail(orderAccountDTOS);
......@@ -434,9 +465,7 @@ public class DailyVehicleOrderStatisticsBiz extends BaseBiz<DailyVehicleOrderSta
*/
private List<OrderAccountDeduction> gettDeductions(ArrayList<OrderAccountDetail> orderAccountDetails) {
ArrayList<OrderAccountDeduction> arrayList = Lists.newArrayList();
for (OrderAccountDetail orderAccountDetail : orderAccountDetails) {
arrayList.addAll(orderAccountDetail.getDeductions());
}
orderAccountDetails.parallelStream().map(OrderAccountDetail::getDeductions).forEach(e -> arrayList.addAll(e));
return arrayList;
}
......
package com.xxfc.platform.order.biz;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.db.PageResult;
import com.github.wxiaoqi.security.admin.entity.BaseUserMemberLevel;
import com.github.wxiaoqi.security.common.biz.BaseBiz;
import com.github.wxiaoqi.security.common.msg.ObjectRestResponse;
import com.github.wxiaoqi.security.common.exception.BaseException;
import com.google.common.collect.Maps;
import com.xxfc.platform.order.Utils.OrderDateUtils;
import com.xxfc.platform.order.contant.enumerate.OrderInquiryType;
import com.xxfc.platform.order.entity.MembersOrder;
import com.xxfc.platform.order.entity.OrderStatistics;
import com.xxfc.platform.order.mapper.OrderStatisticsMapper;
import com.xxfc.platform.order.pojo.HomePageOrderData;
import com.xxfc.platform.order.pojo.Member;
import com.xxfc.platform.order.pojo.MembersOrderDto;
import com.xxfc.platform.order.pojo.OrderQuery;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.assertj.core.util.Lists;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Objects;
import java.text.ParseException;
import java.util.*;
import java.util.stream.Collectors;
/**
......@@ -39,7 +53,7 @@ public class OrderStatisticsBiz extends BaseBiz<OrderStatisticsMapper, OrderStat
setAdditionalIndemnity(vehicle.getTotalCompensation()
.add(vehicle.getTotalForfeit())
.add(vehicle.getTotalDefaultMoney())
.add(vehicle.getTotalExpenditure().subtract(vehicle.getTotalGmv().subtract(vehicle.getTotalReturnGmv())))
.add(vehicle.getTotalExpenditure().subtract(vehicle.getTotalGmv()).add(vehicle.getTotalReturnGmv()))
);
}};
orderStatistics.add(data);
......@@ -63,15 +77,165 @@ public class OrderStatisticsBiz extends BaseBiz<OrderStatisticsMapper, OrderStat
}
result.setTotalOrders(orderStatistics.stream().map(HomePageOrderData::getTotalOrders).filter(o -> Objects.nonNull(o)).reduce(BigDecimal.ZERO, BigDecimal::add));
result.setTotalOutstandingDeposit(orderStatistics.stream().map(HomePageOrderData::getTotalOutstandingDeposit).filter(o -> Objects.nonNull(o)).reduce(BigDecimal.ZERO, BigDecimal::add));
result.setTotalOrders(orderStatistics.stream().map(HomePageOrderData::getTotalOrders).filter(o-> Objects.nonNull(o)).reduce(BigDecimal.ZERO, BigDecimal::add));
result.setAdditionalIndemnity(orderStatistics.stream().map(HomePageOrderData::getAdditionalIndemnity).filter(o -> Objects.nonNull(o)).reduce(BigDecimal.ZERO, BigDecimal::add));
result.setTotalOutstandingDeposit(orderStatistics.stream().map(HomePageOrderData::getTotalOutstandingDeposit).filter(o-> Objects.nonNull(o)).reduce(BigDecimal.ZERO, BigDecimal::add));
return result;
}
result.setAdditionalIndemnity(orderStatistics.stream().map(HomePageOrderData::getAdditionalIndemnity).filter(o-> Objects.nonNull(o)).reduce(BigDecimal.ZERO, BigDecimal::add));
public List<MembersOrderDto> getMemberOrderStatistics(List<BaseUserMemberLevel> memberLevels, OrderQuery query) throws ParseException {
List<MembersOrder> membersOrderList = membersBiz.getMemberOrderStatistics(query);
//按每天分类
if (CollectionUtil.isEmpty(membersOrderList)) {
return null;
}
//按每天分类
if (CollectionUtil.isEmpty(memberLevels)) {
throw new BaseException("获取不到会员信息");
}
//获取会员等级对应的名称
HashMap<Integer, String> map = Maps.newHashMap();
for (BaseUserMemberLevel memberLevel : memberLevels) {
map.put(memberLevel.getLevel(), memberLevel.getName());
}
//按查询条件获取统计信息
ArrayList<MembersOrderDto> arrayList = Lists.newArrayList();
if (OrderInquiryType.DAY.getCode().equals(query.getType())) {
for (MembersOrder mb : membersOrderList) {
MembersOrderDto mbdto = new MembersOrderDto();
//设置时间段
mbdto.setTimeSlot(mb.getPeriod());
TotalPaymentAndMemberName(map, mb, mbdto);
arrayList.add(mbdto);
}
} else {
for (int i = 0; i < membersOrderList.size(); i++) {
MembersOrder mb = membersOrderList.get(i);
String period = mb.getPeriod();
if (StringUtils.isBlank(period)) {
continue;
}
MembersOrderDto mbdto = new MembersOrderDto();
String[] periods = mb.getPeriod().split("-");
String startDay = null;
String endDay = null;
Integer time = null;
if (OrderInquiryType.WEEK.getCode().equals(query.getType())) {
startDay = OrderDateUtils.getStartDayOfWeekNo(Integer.parseInt(periods[0]), Integer.parseInt(periods[1]));
endDay = OrderDateUtils.getEndDayOfWeekNo(Integer.parseInt(periods[0]), Integer.parseInt(periods[1]));
//获取今天是今年的第几周
time = OrderDateUtils.getTodayOfWeek();
}
Integer thisYear = OrderDateUtils.getThisYear();
if (OrderInquiryType.MONTH.getCode().equals(query.getType())) {
startDay = OrderDateUtils.getFirstDayOfMonth(Integer.parseInt(periods[0]), Integer.parseInt(periods[1]));
endDay = OrderDateUtils.getLastDayOfMonth(Integer.parseInt(periods[0]), Integer.parseInt(periods[1]));
//获取今天是今年的第几个月
time = OrderDateUtils.getTodayOfMonth();
}
if (i == 0 && query.getStartTime() != null) {
startDay = OrderDateUtils.timeStampConversionToString(query.getStartTime());
}
//获取当前的年.周(年.月)小数
double today = Double.parseDouble(thisYear + "." + time);
if (i == (membersOrderList.size() - 1)) {
//查询到的最后一条数据年.周(年.月)小数
double date = Double.parseDouble(Integer.parseInt(periods[0]) + "." + Integer.parseInt(periods[1]));
if (date == today) {
endDay = OrderDateUtils.timeStampConversionToString(System.currentTimeMillis());
} else if (date < today) {
//获取最后一条数据,周末日期
Long end = OrderDateUtils.ConvertingStringsToTimestamps(endDay);
//查询的结束日期
Long endTime = query.getEndTime();
if (endTime != null && end > endTime) {
endDay = OrderDateUtils.timeStampConversionToString(query.getEndTime());
}
}
}
if (StringUtils.isNotBlank(startDay) && StringUtils.isNotBlank(endDay)) {
mbdto.setTimeSlot(startDay + "~" + endDay);
} else {
mbdto.setTimeSlot("");
}
TotalPaymentAndMemberName(map, mb, mbdto);
arrayList.add(mbdto);
}
}
//进行分页处理
return arrayList;
// return pagingProcessing(query, arrayList);
return result;
}
private PageResult pagingProcessing(OrderQuery query, ArrayList<MembersOrderDto> arrayList) {
PageResult pageResult = (PageResult) arrayList;
pageResult.setPage(query.getPage());
pageResult.setPageSize(query.getLimit());
return pageResult;
}
private void TotalPaymentAndMemberName(HashMap<Integer, String> map, MembersOrder mb, MembersOrderDto mbdto) {
BigDecimal totalPayment = BigDecimal.ZERO;
List<Member> members = mb.getMembers();
//设置时间段购买会员总金额和不同的会员名称
if (CollectionUtil.isNotEmpty(members)) {
mbdto.setMembers(members);
for (Member member : members) {
member.setMemberName(map.get(member.getLevel()));
totalPayment = totalPayment.add(member.getAmount() == null ? BigDecimal.ZERO : member.getAmount());
}
}
mbdto.setTotalPayment(totalPayment);
}
public Object downloadExcel() {
return null;
}
public List<HashMap<Object, Object>> getRows(List<MembersOrderDto> list, List<BaseUserMemberLevel> memberLevels) {
ArrayList<HashMap<Object, Object>> rows = Lists.newArrayList();
for (MembersOrderDto membersOrderDto : list) {
if (CollectionUtils.isEmpty(membersOrderDto.getMembers())) {
continue;
}
HashMap<Object, Object> map = Maps.newLinkedHashMap();
map.put("时间", membersOrderDto.getTimeSlot());
for (BaseUserMemberLevel memberLevel : memberLevels) {
setMap(membersOrderDto, map, memberLevel);
}
map.put("总支付金额", membersOrderDto.getTotalPayment());
rows.add(map);
}
return rows;
}
private void setMap(MembersOrderDto membersOrderDto, HashMap<Object, Object> map, BaseUserMemberLevel memberLevel) {
List<Member> collect = membersOrderDto.getMembers().parallelStream().filter(el -> el.getLevel().equals(memberLevel.getLevel())).collect(Collectors.toList());
int number = 0;
BigDecimal amount = BigDecimal.ZERO;
if (CollectionUtils.isNotEmpty(collect)) {
number = collect.get(0).getNumber();
amount = collect.get(0).getAmount();
}
map.put(memberLevel.getName() + "购买量", number);
map.put("支付金额(" + memberLevel.getName() + ")",amount);
}
}
package com.xxfc.platform.order.mapper;
import com.xxfc.platform.order.entity.DailyMembersOrderStatistics;
import com.xxfc.platform.order.entity.MembersOrder;
import com.xxfc.platform.order.entity.OrderStatistics;
import com.xxfc.platform.order.pojo.OrderQuery;
import org.apache.ibatis.annotations.Param;
import tk.mybatis.mapper.common.Mapper;
......@@ -18,4 +20,7 @@ public interface DailyMembersOrderStatisticsMapper extends Mapper<DailyMembersOr
OrderStatistics monthOrderTotal(@Param("companyId") Integer companyId);
List<MembersOrder> getMemberOrderStatistics(OrderQuery query);
}
package com.xxfc.platform.order.rest.background;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.github.wxiaoqi.security.admin.entity.BaseUserMemberLevel;
import com.github.wxiaoqi.security.admin.feign.UserFeign;
import com.github.wxiaoqi.security.admin.feign.dto.UserDTO;
import com.github.wxiaoqi.security.auth.client.config.UserAuthConfig;
import com.github.wxiaoqi.security.common.exception.BaseException;
import com.github.wxiaoqi.security.common.msg.ObjectRestResponse;
import com.github.wxiaoqi.security.common.rest.BaseController;
import com.github.wxiaoqi.security.common.util.Query;
import com.github.wxiaoqi.security.common.util.process.ResultCode;
import com.google.common.collect.Lists;
import com.xxfc.platform.order.biz.DailyMembersOrderStatisticsBiz;
import com.xxfc.platform.order.biz.DailyTravelOrderStatisticsBiz;
import com.xxfc.platform.order.biz.DailyVehicleOrderStatisticsBiz;
import com.xxfc.platform.order.biz.OrderStatisticsBiz;
import com.xxfc.platform.order.entity.OrderStatistics;
import com.xxfc.platform.order.pojo.HomePageOrderData;
import com.xxfc.platform.order.pojo.MembersOrderDto;
import com.xxfc.platform.order.pojo.OrderQuery;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Array;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author Administrator
......@@ -33,13 +52,16 @@ public class OrderStatisticsController extends BaseController<OrderStatisticsBiz
@Autowired
private UserAuthConfig userAuthConfig;
@Autowired
private HttpServletResponse response;
/**
* 租车订单
*/
private final Integer TYPE_VEHICLE = 1;
/**
* 旅游订单
* 旅游订单
*/
private final Integer TYPE_TOUR = 2;
......@@ -56,7 +78,7 @@ public class OrderStatisticsController extends BaseController<OrderStatisticsBiz
/**
* 数据权限
*/
private final Integer DATA_AUTHORITY=1;
private final Integer DATA_AUTHORITY = 1;
@Autowired
private DailyVehicleOrderStatisticsBiz vehicleBiz;
......@@ -68,6 +90,7 @@ public class OrderStatisticsController extends BaseController<OrderStatisticsBiz
@Autowired
private DailyMembersOrderStatisticsBiz membersBiz;
@ApiOperation("获取订单统计数据")
@GetMapping("/findAll/{type}")
public ObjectRestResponse findAll(@PathVariable Integer type) {
......@@ -83,13 +106,13 @@ public class OrderStatisticsController extends BaseController<OrderStatisticsBiz
UserDTO user = userDTOObjectRestResponse.getData();
Integer companyId = user.getCompanyId();
if (DATA_AUTHORITY.equals(user.getDataAll())){
companyId=null;
if (DATA_AUTHORITY.equals(user.getDataAll())) {
companyId = null;
}
if (TYPE_VEHICLE.equals(type)) {
OrderStatistics vehicle = vehicleBiz.findAll(companyId);
return ObjectRestResponse.succ(new HomePageOrderData(){{
return ObjectRestResponse.succ(new HomePageOrderData() {{
setTotalOrders(vehicle.getTotalGmv().subtract(vehicle.getTotalReturnGmv()));
setAdditionalIndemnity(vehicle.getTotalCompensation()
.add(vehicle.getTotalForfeit())
......@@ -100,14 +123,14 @@ public class OrderStatisticsController extends BaseController<OrderStatisticsBiz
}
if (TYPE_TOUR.equals(type)) {
OrderStatistics tour = TravelBiz.findAll(companyId);
return ObjectRestResponse.succ(new HomePageOrderData(){{
return ObjectRestResponse.succ(new HomePageOrderData() {{
setTotalOrders(tour.getTotalGmv().subtract(tour.getTotalReturnGmv()));
setAdditionalIndemnity(tour.getTotalDefaultMoney());
}});
}
if (TYPE_MEMBER.equals(type)) {
OrderStatistics member = membersBiz.findAll(companyId);
return ObjectRestResponse.succ(new HomePageOrderData(){{
return ObjectRestResponse.succ(new HomePageOrderData() {{
setTotalOrders(member.getTotalGmv());
}});
......@@ -125,5 +148,43 @@ public class OrderStatisticsController extends BaseController<OrderStatisticsBiz
}
@PostMapping("/order")
@ApiOperation(value = "会员统计")
public ObjectRestResponse<List<MembersOrderDto>> getMemberOrderStatisticsData(@RequestBody OrderQuery query) throws ParseException {
//获取会员等级信息
List<BaseUserMemberLevel> memberLevels = userFeign.levels();
//获取会员订单统计信息
return ObjectRestResponse.succ(baseBiz.getMemberOrderStatistics(memberLevels, query));
}
@PostMapping("/excel")
@ApiOperation(value = "下载excel表")
public void downloadExcel(@RequestBody OrderQuery query) throws Exception {
// 通过工具类创建writer,默认创建xls格式
ExcelWriter writer = ExcelUtil.getWriter(true);
List<BaseUserMemberLevel> memberLevels = userFeign.levels();
List<MembersOrderDto> list = baseBiz.getMemberOrderStatistics(memberLevels, query);
List<HashMap<Object, Object>> rows =baseBiz.getRows(list,memberLevels);
// 一次性写出内容,使用默认样式,强制输出标题
writer.write(rows, true);
//out为OutputStream,需要写出到的目标流
//response为HttpServletResponse对象
response.setContentType("application/vnd.ms-excel;charset=utf-8");
//test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
response.setHeader("Content-Disposition", "attachment;filename=hwddtj.xls");
ServletOutputStream out = response.getOutputStream();
writer.flush(out, true);
// 关闭writer,释放内存
writer.close();
//此处记得关闭输出Servlet流
IoUtil.close(out);
}
}
......@@ -38,4 +38,55 @@
<!-- DATE_FORMAT(one_day,'%Y-%c')=DATE_FORMAT(DATE_SUB(NOW(),interval 1 day),'%Y-%c')-->
<!-- </select>-->
<select id="getMemberOrderStatistics" parameterType="com.xxfc.platform.order.pojo.OrderQuery"
resultMap="order">
SELECT
<if test="type==2">
DATE_FORMAT(date( FROM_UNIXTIME( a.account_time / 1000 ) ),'%x-%v') AS period,
</if>
<if test="type==3">
DATE_FORMAT(date( FROM_UNIXTIME( a.account_time / 1000 ) ),'%Y-%m') AS period,
</if>
<if test="type==1">
date( FROM_UNIXTIME( a.account_time / 1000 ) ) AS period,
</if>
count( a.id ) AS number,
SUM( a.account_amount ) AS amount,
d.member_level AS level
FROM
order_account a
LEFT JOIN base_order b ON a.order_id = b.id
LEFT JOIN order_member_detail d ON d.order_id = b.id
WHERE
a.account_status = 1
AND a.account_type = 101
AND b.type = 3
<if test="startTime != null">
AND a.crt_time &gt;= #{startTime}
</if>
<if test="endTime != null">
AND a.crt_time &lt;= #{endTime}
</if>
GROUP BY
<if test="type==2">
DATE_FORMAT(date( FROM_UNIXTIME( a.account_time / 1000 ) ),'%x-%v'),
</if>
<if test="type==3">
DATE_FORMAT(date( FROM_UNIXTIME( a.account_time / 1000 ) ),'%Y-%m'),
</if>
<if test="type==1">
date( FROM_UNIXTIME( a.account_time / 1000 ) ),
</if>
d.member_level
</select>
<resultMap id="order" type="com.xxfc.platform.order.entity.MembersOrder">
<result column="period" property="period"></result>
<collection property="members" ofType="com.xxfc.platform.order.pojo.Member">
<result column="number" property="number"></result>
<result column="amount" property="amount"></result>
<result column="level" property="level"></result>
</collection>
</resultMap>
</mapper>
\ No newline at end of file
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