Commit 9abc88ff authored by hanfeng's avatar hanfeng

Merge branch 'master-order-statistics'

# Conflicts:
#	xx-vehicle/xx-vehicle-api/src/main/java/com/xxfc/platform/vehicle/feign/VehicleFeign.java
parents a7991708 6e58a35d
package com.xxfc.platform.order.contant.enumerate;
/**
* 查询时间段最小细分(时间段内又划分的片段)
*/
public enum TimeMinimumSubdivisionEnum {
nothing(0,"无细分"),day(1,"最小细分到天")
;
private int code;
private String msg;
public String getMsg() {
return msg;
}
TimeMinimumSubdivisionEnum(int code, String msg) {
this.code=code;
this.msg=msg;
}
public Integer getCode() {
return code;
}
}
......@@ -40,7 +40,7 @@ public class DailyOrderStatistics implements Serializable {
* 成交总金额
*/
@Column(name = "gmv")
private BigDecimal gmv;
private BigDecimal gmv=BigDecimal.ZERO;
/**
......
......@@ -18,10 +18,10 @@ public class DailyTravelOrderStatistics extends DailyOrderStatistics {
* 违约总额
*/
@Column(name = "default_money ")
private BigDecimal defaultMoney ;
private BigDecimal defaultMoney=BigDecimal.ZERO;
/**
* 退还订单金额
*/
@Column(name = "return_gmv")
private BigDecimal returnGmv;
private BigDecimal returnGmv=BigDecimal.ZERO;
}
......@@ -29,43 +29,44 @@ public class DailyVehicleOrderStatistics extends DailyOrderStatistics {
* 预交押金总额
*/
@Column(name = "security_deposit")
private BigDecimal securityDeposit;
private BigDecimal securityDeposit=BigDecimal.ZERO;
/**
* 退还押金总额
*/
@Column(name = "refund_security_deposit")
private BigDecimal refundSecurityDeposit;
private BigDecimal refundSecurityDeposit=BigDecimal.ZERO;
/**
* 损坏赔偿总额
*/
@Column(name = "compensation")
private BigDecimal compensation;
private BigDecimal compensation=BigDecimal.ZERO;
/**
* 违章总额
*/
@Column(name = "forfeit")
private BigDecimal violationMoney;
private BigDecimal forfeit=BigDecimal.ZERO;
/**
* 退还订单金额
*/
@Column(name = "return_gmv")
private BigDecimal returnGmv;
private BigDecimal returnGmv=BigDecimal.ZERO;
/**
* 违约总额
*/
@Column(name = "default_money ")
private BigDecimal defaultMoney ;
private BigDecimal defaultMoney=BigDecimal.ZERO;
/**
* 消费金总额
* 订单补偿
*/
@Column(name = "total_expenditure")
private BigDecimal totalExpenditure;
@Column(name = "order_compensation")
private BigDecimal orderCompensation=BigDecimal.ZERO;
}
......@@ -22,48 +22,62 @@ public class OrderStatistics {
* 历史交总金额
*/
@ApiModelProperty(value = "历史交易总金额")
private BigDecimal totalGmv;
private BigDecimal totalGmv=BigDecimal.ZERO;
/**
* 历史押金总额
*/
@ApiModelProperty(value = "历史押金总额")
private BigDecimal totalSecurityDeposit;
private BigDecimal totalSecurityDeposit=BigDecimal.ZERO;
/**
* 历史退还押金总额
*/
@ApiModelProperty(value = "历史退还押金总额")
private BigDecimal totalRefundSecurityDeposit;
private BigDecimal totalRefundSecurityDeposit=BigDecimal.ZERO;
/**
* 历史赔偿总额
*/
@ApiModelProperty(value = "历史赔偿总额")
private BigDecimal totalCompensation;
private BigDecimal totalCompensation=BigDecimal.ZERO;
/**
* 历史违章总额
*/
@ApiModelProperty(value = "历史违章总额")
private BigDecimal totalForfeit;
private BigDecimal totalForfeit=BigDecimal.ZERO;
/**
* 历史订单退款
*/
@ApiModelProperty(value = "历史订单退款")
private BigDecimal totalReturnGmv;
private BigDecimal totalReturnGmv=BigDecimal.ZERO;
/**
* 历史延期扣款总额
*/
@ApiModelProperty(value = "历史延期扣款总额")
private BigDecimal totalDefaultMoney;
private BigDecimal totalDefaultMoney=BigDecimal.ZERO;
/**
* 历史实际消费总额
* 订单补偿总额
*/
@ApiModelProperty(value = "历史实际消费总额")
private BigDecimal totalExpenditure;
@ApiModelProperty(value = "历史订单补偿总额")
private BigDecimal totalOrderCompensation=BigDecimal.ZERO;
@Override
public String toString() {
return "OrderStatistics{" +
"totalGmv=" + totalGmv +
", totalSecurityDeposit=" + totalSecurityDeposit +
", totalRefundSecurityDeposit=" + totalRefundSecurityDeposit +
", totalCompensation=" + totalCompensation +
", totalForfeit=" + totalForfeit +
", totalReturnGmv=" + totalReturnGmv +
", totalDefaultMoney=" + totalDefaultMoney +
", totalOrderCompensation=" + totalOrderCompensation +
'}';
}
}
......@@ -9,15 +9,15 @@ public class HomePageOrderData {
/**
* 订单总额
*/
private BigDecimal totalOrders;
private BigDecimal totalOrders=BigDecimal.ZERO;
/**
* 为退还押金总额
*/
private BigDecimal totalOutstandingDeposit;
private BigDecimal totalOutstandingDeposit=BigDecimal.ZERO;
/**
* 额外赔款
*/
private BigDecimal additionalIndemnity;
private BigDecimal additionalIndemnity=BigDecimal.ZERO;
}
package com.xxfc.platform.order.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Term {
/**
* 订单类型
*/
private Integer orderType;
/**
* 几天前(用于判断计算几天前的数据) subdivide=2的实际存在
*/
private Integer day;
/**
* 时间最小细分类型(最小细分到天,无细分)
*/
private int subdivide;
/**
* 开始时间
*/
private Long startTime;
/**
* 结束时间
*/
private Long endTime;
/**
* 分公司id 数组
*/
private List<Integer> companyIds;
}
......@@ -2,17 +2,134 @@ package com.xxfc.platform.order.pojo.account;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.xxfc.platform.order.entity.OrderAccount;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @author Administrator
*/
@Data
public class OrderAccountDTO extends OrderAccount {
public class OrderAccountDTO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@Id
@GeneratedValue(generator = "JDBC")
@ApiModelProperty("主键")
private Integer id;
/**
* 订单id
*/
@Column(name = "order_id")
@ApiModelProperty(value = "订单id")
private Integer orderId;
/**
* 账款对应的流水号
*/
@Column(name = "trade_no")
@ApiModelProperty(value = "账款对应的流水号")
private String tradeNo;
/**
* 记账时间
*/
@Column(name = "account_time")
@ApiModelProperty(value = "记账时间")
private Long accountTime;
/**
* 记帐类型 101--订单支付;201--取消订单退款;202--全部押金退款;203--部分押金退款;204--剩余押金退款
*/
@Column(name = "account_type")
@ApiModelProperty(value = "记帐类型 101--订单支付;201--取消订单退款;202--全部押金退款;203--部分押金退款;204--剩余押金退款")
private Integer accountType;
/**
* 账款状态 1--成功;2--失败
*/
@Column(name = "account_status")
@ApiModelProperty(value = "账款状态 1--成功;2--失败")
private Integer accountStatus;
/**
* 账款金额
*/
@Column(name = "account_amount")
@ApiModelProperty(value = "账款金额")
private BigDecimal accountAmount;
/**
* 账款说明
*/
@Column(name = "account_desc")
@ApiModelProperty(value = "账款说明")
private String accountDesc;
/**
* 账款详情
*/
@Column(name = "account_detail")
@ApiModelProperty(value = "账款详情")
private String accountDetail;
/**
* 创建时间
*/
@Column(name = "crt_time")
@ApiModelProperty(value = "创建时间", hidden = true )
private Long crtTime;
/**
* 原金额
*/
@Column(name = "original_amount")
@ApiModelProperty(value = "原金额")
private BigDecimal originalAmount;
/**
* 扣除金额
*/
@Column(name = "deduct_amount")
@ApiModelProperty(value = "扣除金额")
private BigDecimal deductAmount;
@Column(name = "companyId")
private Integer companyId;
@Column(name = "oneDay")
private String oneDay;
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("OrderAccountDTO{");
sb.append("id=").append(id);
sb.append(", orderId=").append(orderId);
sb.append(", tradeNo='").append(tradeNo).append('\'');
sb.append(", accountTime=").append(accountTime);
sb.append(", accountType=").append(accountType);
sb.append(", accountStatus=").append(accountStatus);
sb.append(", accountAmount=").append(accountAmount);
sb.append(", accountDesc='").append(accountDesc).append('\'');
sb.append(", accountDetail='").append(accountDetail).append('\'');
sb.append(", crtTime=").append(crtTime);
sb.append(", originalAmount=").append(originalAmount);
sb.append(", deductAmount=").append(deductAmount);
sb.append(", companyId=").append(companyId);
sb.append(", oneDay='").append(oneDay).append('\'');
sb.append('}');
return sb.toString();
}
}
......@@ -10,8 +10,10 @@ 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.Term;
import com.xxfc.platform.order.pojo.account.OrderAccountDTO;
import com.xxfc.platform.order.pojo.account.OrderAccountDetail;
import javassist.expr.NewArray;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
......@@ -24,9 +26,7 @@ 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.*;
/**
* 每日购买会员订单统计
......@@ -39,32 +39,32 @@ public class DailyMembersOrderStatisticsBiz extends BaseBiz<DailyMembersOrderSta
private final Integer headOfficeId = 1;
@Value("${order.day}")
private Integer day;
/**
* 总公司id默认为1
*/
private final Integer OMPANY_ID=1;
private final Integer OMPANY_ID = 1;
@Autowired
private OrderAccountBiz accountBiz;
@Transactional(rollbackFor = Exception.class)
public boolean saveDailyMembersOrderRecord() {
public boolean dailyMembersOrderRecord(Integer day) {
try {
List<OrderAccountDTO> accountList = accountBiz.getOrderAccountByOrderType(OrderTypeEnum.MEMBER.getCode(), day);
DailyMembersOrderStatistics orderStatistics = statistics(new Term(OrderTypeEnum.MEMBER.getCode(), day, 1, null, null, null));
log.info("Members:统计完成");
save(orderStatistics);
log.info("Members:保存成功");
return true;
} catch (Exception e) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
log.error("Members:" + e.getMessage());
if (CollectionUtils.isNotEmpty(accountList)) {
DailyMembersOrderStatistics orderStatistics = new DailyMembersOrderStatistics();
ArrayList<OrderAccountDetail> orderAccountDetails = getOrderAccountDetail(accountList);
if (CollectionUtils.isNotEmpty(orderAccountDetails)) {
//获取订单总额
BigDecimal gmv = getOrderAmountTotal(orderAccountDetails);
orderStatistics.setGmv(gmv);
orderStatistics.setBranchCompanyId(OMPANY_ID);
orderStatistics.setOneDay(accountList.get(0).getOneDay());
return false;
}
log.info("Members:统计完成");
}
public void save(DailyMembersOrderStatistics orderStatistics) {
if (orderStatistics != null) {
if (JudgmentOfExistence(orderStatistics)) {
insertSelectiveRe(orderStatistics);
} else {
......@@ -73,22 +73,34 @@ public class DailyMembersOrderStatisticsBiz extends BaseBiz<DailyMembersOrderSta
.andEqualTo(DailyMembersOrderStatistics::getOneDay, orderStatistics.getOneDay())
.andEqualTo(DailyMembersOrderStatistics::getBranchCompanyId, orderStatistics.getBranchCompanyId()))
.build());
}
log.info("Members:保存成功");
}
}
return true;
} catch (Exception e) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
log.error("Members:"+ e.getMessage());
public DailyMembersOrderStatistics statistics(Term term) {
List<OrderAccountDTO> accountList = accountBiz.getOrderAccountByOrderType(term);
return false;
log.error("Members:accountList:"+accountList);
if (CollectionUtils.isNotEmpty(accountList)) {
DailyMembersOrderStatistics orderStatistics = new DailyMembersOrderStatistics();
ArrayList<OrderAccountDetail> orderAccountDetails = getOrderAccountDetail(accountList);
log.error("Members:orderAccountDetails:"+orderAccountDetails);
if (CollectionUtils.isNotEmpty(orderAccountDetails)) {
//获取订单总额
BigDecimal gmv = getOrderAmountTotal(orderAccountDetails);
orderStatistics.setGmv(gmv);
orderStatistics.setBranchCompanyId(OMPANY_ID);
orderStatistics.setOneDay(accountList.get(0).getOneDay());
}
return orderStatistics;
}
return null;
}
/**
* 添加前查询是否存在这条数据
*
* @param orderStatistic
* @return
*/
......@@ -103,6 +115,7 @@ public class DailyMembersOrderStatisticsBiz extends BaseBiz<DailyMembersOrderSta
}
return true;
}
/**
* 获取押金和
*
......@@ -123,15 +136,15 @@ public class DailyMembersOrderStatisticsBiz extends BaseBiz<DailyMembersOrderSta
*/
private ArrayList<OrderAccountDetail> getOrderAccountDetail(List<OrderAccountDTO> orderAccountDTOS) {
ArrayList<OrderAccountDetail> arrayList = Lists.newArrayList();
List<OrderAccountDetail> oad = Collections.synchronizedList(arrayList);
orderAccountDTOS.parallelStream()
.map(OrderAccount::getAccountDetail)
.map(OrderAccountDTO::getAccountDetail)
.forEach(detail -> {
if (StringUtils.isNotBlank(detail)) {
arrayList.add(JSONUtil.toBean(detail, OrderAccountDetail.class));
oad.add(JSONUtil.toBean(detail, OrderAccountDetail.class));
}
});
return arrayList;
return new ArrayList<OrderAccountDetail>(oad);
}
@Override
......@@ -145,12 +158,13 @@ public class DailyMembersOrderStatisticsBiz extends BaseBiz<DailyMembersOrderSta
return mapper.insertSelective(entity);
}
public OrderStatistics findAll(Integer companyId) {
return mapper.monthOrderTotal(companyId);
public OrderStatistics findAll(List<Integer> companyIds) {
return mapper.monthOrderTotal(companyIds);
}
/**
* 根据时间按年月日分组
*
* @param query
* @return
*/
......
......@@ -25,11 +25,10 @@ public class DailyOrderStatisticsBiz extends BaseBiz<DailyOrderStatisticsMapper,
@Autowired
private DailyMembersOrderStatisticsBiz membersStatisticsBiz;
@Scheduled(cron = "0 0 2 * * ?")
public boolean statisticalOrder(){
boolean vehicleFlag = vehicleStatisticsBiz.saveDailyVehicleOrderRecord();
boolean travelFlag = travelStatisticsBiz.saveDailyTravelOrderRecord();
boolean membersFlag= membersStatisticsBiz.saveDailyMembersOrderRecord();
public boolean statisticalOrder(Integer day){
boolean vehicleFlag = vehicleStatisticsBiz.dailyVehicleOrderRecord(day);
boolean travelFlag = travelStatisticsBiz.dailyTravelOrderRecord(day);
boolean membersFlag= membersStatisticsBiz.dailyMembersOrderRecord(day);
if (vehicleFlag&&travelFlag&&membersFlag){
log.info("----statisticalOrder:成功-----");
......
......@@ -12,6 +12,7 @@ import com.xxfc.platform.order.contant.enumerate.DeductionTypeEnum;
import com.xxfc.platform.order.contant.enumerate.OrderTypeEnum;
import com.xxfc.platform.order.entity.*;
import com.xxfc.platform.order.mapper.DailyTravelOrderStatisticsMapper;
import com.xxfc.platform.order.pojo.Term;
import com.xxfc.platform.order.pojo.account.OrderAccountDTO;
import com.xxfc.platform.order.pojo.account.OrderAccountDeduction;
import com.xxfc.platform.order.pojo.account.OrderAccountDetail;
......@@ -39,80 +40,32 @@ import java.util.stream.Collectors;
@Service
@Slf4j
public class DailyTravelOrderStatisticsBiz extends BaseBiz<DailyTravelOrderStatisticsMapper, DailyTravelOrderStatistics> {
@Value("${order.day}")
private Integer day;
@Autowired
private OrderAccountBiz accountBiz;
// @Transactional(rollbackFor = Exception.class)
// public boolean StatisticsOfTravelOrders() {
// try {
//
// ArrayList<DailyTravelOrderStatistics> objects = new ArrayList<>();
// List<DailyTravelOrderStatistics> travelGmv = mapper.getTravelGmv(day);
// objects.addAll(travelGmv);
// List<DailyTravelOrderStatistics> travelPenalSum = mapper.getTravelPenalSum(day);
// objects.addAll(travelPenalSum);
// insertByList(objects);
//
// return true;
// } catch (Exception e) {
// e.printStackTrace();
// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
// return false;
// }
// }
//
// private void insertByList(ArrayList<DailyTravelOrderStatistics> objects) throws Exception {
//
// if (CollectionUtils.isNotEmpty(objects)) {
// HashMap<Integer, DailyTravelOrderStatistics> map = new HashMap<>();
// for (DailyTravelOrderStatistics object : objects) {
//
// DailyTravelOrderStatistics statistics = map.get(object.getBranchCompanyId());
// if (statistics == null) {
// statistics = new DailyTravelOrderStatistics();
// map.put(object.getBranchCompanyId(), statistics);
// }
//
// BeanUtil.copyProperties(object, statistics, CopyOptions.create().setIgnoreNullValue(true).setIgnoreError(true));
//
// }
// String oneDay = map.entrySet().parallelStream().map(Map.Entry::getValue).collect(Collectors.toList()).get(0).getOneDay();
//
// if (StringUtils.isBlank(oneDay)) {
// throw new BaseException();
// }
// Example exa= new Example(DailyTravelOrderStatistics.class);
// exa.createCriteria().andEqualTo("oneDay",oneDay);
// List<DailyTravelOrderStatistics> statistics= selectByExample(exa);
// if (CollectionUtils.isEmpty(statistics)){
// for (Map.Entry<Integer, DailyTravelOrderStatistics> entry : map.entrySet()) {
// insertSelectiveRe(entry.getValue());
// }
// }else {
// log.error("今日已统计车辆订单,请不要重复统计!");
// }
//
////
//// for (Map.Entry<Integer, DailyTravelOrderStatistics> e : map.entrySet()) {
//// insertSelectiveRe(e.getValue());
//// }
// }
// }
/******************************************************************************************************************************/
/**
* 统计订单并保存到数据库当中
* @return
*/
@Transactional(rollbackFor = Exception.class)
public boolean saveDailyTravelOrderRecord() {
public boolean dailyTravelOrderRecord(Integer day) {
try {
//获取每日订单统计
List<DailyTravelOrderStatistics> orderStatistics = getDailyTravelOrderStatistics();
List<DailyTravelOrderStatistics> orderStatistics = getDailyTravelOrderStatistics(new Term(OrderTypeEnum.TOUR.getCode(),day,1,null,null,null));
log.info("Travel:统计完成");
seve(orderStatistics);
log.info("Travel:保存成功");
return true;
} catch (Exception e) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
log.error("Travel:"+e.getMessage());
return false;
}
}
public void seve(List<DailyTravelOrderStatistics> orderStatistics) {
if (CollectionUtils.isNotEmpty(orderStatistics)) {
for (DailyTravelOrderStatistics orderStatistic : orderStatistics) {
if (JudgmentOfExistence(orderStatistic)) {
......@@ -124,17 +77,9 @@ public class DailyTravelOrderStatisticsBiz extends BaseBiz<DailyTravelOrderStati
.andEqualTo(DailyTravelOrderStatistics::getOneDay, orderStatistic.getOneDay())
.andEqualTo(DailyTravelOrderStatistics::getBranchCompanyId, orderStatistic.getBranchCompanyId()))
.build());
}
}
}
log.info("Travel:保存成功");
return true;
} catch (Exception e) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
log.error("Travel:"+e.getMessage());
return false;
}
}
/**
......@@ -153,9 +98,10 @@ public class DailyTravelOrderStatisticsBiz extends BaseBiz<DailyTravelOrderStati
}
return true;
}
private List<DailyTravelOrderStatistics> getDailyTravelOrderStatistics() {
public List<DailyTravelOrderStatistics> getDailyTravelOrderStatistics(Term term) {
//获取当天所有订单账目
List<OrderAccountDTO> accountList = accountBiz.getOrderAccountByOrderType(OrderTypeEnum.TOUR.getCode(), day);
List<OrderAccountDTO> accountList = accountBiz.getOrderAccountByOrderType(term);
log.error("accountList:"+accountList);
if (CollectionUtils.isEmpty(accountList)) {
return null;
}
......@@ -227,21 +173,29 @@ public class DailyTravelOrderStatisticsBiz extends BaseBiz<DailyTravelOrderStati
}
if (CollectionUtils.isNotEmpty(arrayList)) {
ArrayList<OrderAccountDetail> orderAccountDetail = getOrderAccountDetail(arrayList);
if (CollectionUtils.isNotEmpty(orderAccountDetail)) {
//订单退还总额
BigDecimal depositAmountTotal = getOrderAmountTotal(orderAccountDetail);
orderStatistics.setReturnGmv(depositAmountTotal);
List<OrderAccountDeduction> OrderAccountDeductions = gettDeductions(orderAccountDetail);
//获取违约总额
BigDecimal bigDecimal = get(OrderAccountDeductions, new ArrayList<Integer>() {{
add(DeductionTypeEnum.VIOLATE_CANCEL.getCode());
add(DeductionTypeEnum.VIOLATE_ADVANCE.getCode());
add(DeductionTypeEnum.VIOLATE_DELAY.getCode());
}});
orderStatistics.setDefaultMoney(bigDecimal);
//订单退还总额
orderStatistics.setReturnGmv(orderStatistics.getGmv().subtract(bigDecimal));
}
}
}
private DailyTravelOrderStatistics getGmvAndSecurityDeposit(Map<Integer, List<OrderAccountDTO>> map) {
DailyTravelOrderStatistics orderStatistics = new DailyTravelOrderStatistics();
List<OrderAccountDTO> orderAccountDTOS = map.get(AccountTypeEnum.IN_ORDER_PAY.getCode());
......@@ -258,6 +212,7 @@ public class DailyTravelOrderStatisticsBiz extends BaseBiz<DailyTravelOrderStati
return orderStatistics;
}
/**
* 获取金额详情
*
......@@ -266,8 +221,8 @@ public class DailyTravelOrderStatisticsBiz extends BaseBiz<DailyTravelOrderStati
*/
private ArrayList<OrderAccountDetail> getOrderAccountDetail(List<OrderAccountDTO> orderAccountDTOS) {
ArrayList<OrderAccountDetail> arrayList = Lists.newArrayList();
orderAccountDTOS.parallelStream()
.map(OrderAccount::getAccountDetail)
orderAccountDTOS.stream()
.map(OrderAccountDTO::getAccountDetail)
.forEach(detail -> {
if (StringUtils.isNotBlank(detail)) {
arrayList.add(JSONUtil.toBean(detail, OrderAccountDetail.class));
......@@ -298,7 +253,7 @@ public class DailyTravelOrderStatisticsBiz extends BaseBiz<DailyTravelOrderStati
*/
private List<OrderAccountDeduction> gettDeductions(ArrayList<OrderAccountDetail> orderAccountDetails) {
ArrayList<OrderAccountDeduction> arrayList = Lists.newArrayList();
orderAccountDetails.parallelStream().map(OrderAccountDetail::getDeductions).forEach(e->arrayList.addAll(e));
orderAccountDetails.stream().map(OrderAccountDetail::getDeductions).forEach(e->arrayList.addAll(e));
return arrayList;
}
......@@ -324,7 +279,7 @@ public class DailyTravelOrderStatisticsBiz extends BaseBiz<DailyTravelOrderStati
return mapper.insertSelective(entity);
}
public OrderStatistics findAll(Integer branchCompanyId) {
return mapper.monthOrderTotal(branchCompanyId);
public OrderStatistics findAll(List<Integer> companyIds) {
return mapper.monthOrderTotal(companyIds);
}
}
......@@ -18,6 +18,7 @@ import com.xxfc.platform.order.contant.enumerate.*;
import com.xxfc.platform.order.entity.*;
import com.xxfc.platform.order.mapper.OrderAccountMapper;
import com.xxfc.platform.order.pojo.DedDetailDTO;
import com.xxfc.platform.order.pojo.Term;
import com.xxfc.platform.order.pojo.account.OrderAccountDTO;
import com.xxfc.platform.order.pojo.account.OrderAccountDeduction;
import com.xxfc.platform.order.pojo.account.OrderAccountDetail;
......@@ -513,14 +514,11 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> {
/**
* 获取每日订单账目,用于统计
* @param code
* @param day
* @param term
* @return
*/
public List<OrderAccountDTO> getOrderAccountByOrderType(Integer code, Integer day) {
return mapper.getOrderAccountByOrderType(code,day);
public List<OrderAccountDTO> getOrderAccountByOrderType(Term term) {
return mapper.getOrderAccountByOrderType(term);
}
......
package com.xxfc.platform.order.jobhandler;
import com.xxfc.platform.order.biz.BaseOrderBiz;
import com.github.wxiaoqi.security.common.exception.BaseException;
import com.google.common.collect.Lists;
import com.xxfc.platform.order.biz.DailyOrderStatisticsBiz;
import com.xxfc.platform.order.biz.DailyVehicleOrderStatisticsBiz;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.JobHandler;
import com.xxl.job.core.log.XxlJobLogger;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.formula.functions.T;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 每天2定时统计前一天的数据
* 每天2点定时统计前一天的数据
*
* @author Administrator
*/
@JobHandler(value = "baseOrderStatisticsHandler")
......@@ -22,26 +34,100 @@ public class BaseOrderStatisticsJobHandler extends IJobHandler {
@Autowired
private DailyOrderStatisticsBiz statisticsBiz;
@Value("${order.day:1}")
private Integer day;
/**
* 每日定时执行订单统计
*
* @param date 重新统计起止日期.可以为:起止时间(yyyy-MM-dd),开始时间/结束时间(yyyy-MM-dd/yyyy-MM-dd)
* @return
*/
@Override
public ReturnT<String> execute(String s){
public ReturnT<String> execute(String date) {
try {
log.info("-----定时器进入---baseOrderStatisticsHandler---" + date);
XxlJobLogger.log("-----定时器进入---baseOrderStatisticsHandler---" + date);
ArrayList<Integer> arrayList = Lists.newArrayList();
if (StringUtils.isBlank(date)) {
arrayList.add(day);
} else {
arrayList = dateDifferenceSet(date);
}
log.info("获取到当前需要执行的日期,距离当前时间的天数集合" + arrayList);
XxlJobLogger.log("获取到当前需要执行的日期,距离当前时间的天数集合" + arrayList);
DateTime now = DateTime.now();
XxlJobLogger.log("-----定时器进入---baseOrderStatisticsHandler---");
log.info("-----定时器进入---baseOrderStatisticsHandler---");
// boolean flag = statisticsBiz.statisticalOrder();
// if (flag) {
return ReturnT.SUCCESS;
// }
// else {
// returnT.setCode(500);
// returnT.setMsg("失败");
// return returnT;
// }
for (Integer day : arrayList) {
boolean flag = statisticsBiz.statisticalOrder(day);
DateTime dateTime = now.plusDays(-day);
log.info("执行状态:" + dateTime.toString("yyyy-MM-dd")+"="+flag);
XxlJobLogger.log("执行状态:" + dateTime.toString("yyyy-MM-dd")+"="+flag);
}
return new ReturnT<>(ReturnT.SUCCESS_CODE,"执行成功");
} catch (Exception e) {
XxlJobLogger.log(e);
return FAIL;
} finally {
log.error(e.getMessage());
return new ReturnT<>(ReturnT.FAIL_CODE,"执行失败");
}
}
private ArrayList<Integer> dateDifferenceSet(String date) throws ParseException {
Long maxDate;
Long minDate;
Long currentTime= System.currentTimeMillis();
if (date.contains("/")) {
String[] dates = date.split("/");
Long date1 = getDateByString(dates[0]);
Long date2 = getDateByString(dates[1]);
if (date1<date2) {
maxDate=date2;
minDate=date1;
}else{
maxDate=date1;
minDate=date2;
}
if (minDate<currentTime&&maxDate>currentTime){
maxDate=currentTime;
}else if (minDate>currentTime){
throw new BaseException("设置的日期,大于当前日期!");
}
}else {
Long dt = getDateByString(date);
if (dt>currentTime) {
throw new BaseException("设置的日期,大于当前日期!");
}
minDate=dt;
maxDate=currentTime;
}
//距离今天的最大天数差
int maxDay = (int) ((currentTime-minDate)/(24*60*60*1000));
//距离今天的最小天数差
int minDay = (int) ((currentTime-maxDate)/(24*60*60*1000));
return getListByMinDayAndMaxDay(minDay,maxDay);
}
private Long getDateByString(String date) throws ParseException {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
return dateFormat.parse(date).getTime();
}
private ArrayList<Integer> getListByMinDayAndMaxDay(int minDay,int maxDay){
ArrayList<Integer> arrayList = Lists.newArrayList();
for (int day=maxDay;day>=minDay;day--){
arrayList.add(day);
}
return arrayList;
}
}
......@@ -18,7 +18,7 @@ public interface DailyMembersOrderStatisticsMapper extends Mapper<DailyMembersOr
Map<String, Object> getTravelGmv(@Param("day") Integer day);
OrderStatistics monthOrderTotal(@Param("companyId") Integer companyId);
OrderStatistics monthOrderTotal(List<Integer> companyIds);
......
......@@ -19,5 +19,5 @@ public interface DailyTravelOrderStatisticsMapper extends Mapper<DailyTravelOrde
List<DailyTravelOrderStatistics> getTravelPenalSum(@Param("day") Integer day);
OrderStatistics monthOrderTotal(@Param("companyId")Integer companyId);
OrderStatistics monthOrderTotal(List<Integer> companyIds);
}
......@@ -25,5 +25,5 @@ public interface DailyVehicleOrderStatisticsMapper extends Mapper<DailyVehicleOr
List<DailyVehicleOrderStatistics> getViolationMoney(@Param("day") Integer day);
OrderStatistics monthOrderTotal(@Param("companyId")Integer companyId);
OrderStatistics monthOrderTotal(List<Integer> companyIds);
}
package com.xxfc.platform.order.mapper;
import com.xxfc.platform.order.entity.OrderAccount;
import com.xxfc.platform.order.pojo.Term;
import com.xxfc.platform.order.pojo.account.OrderAccountDTO;
import org.apache.ibatis.annotations.Param;
import tk.mybatis.mapper.common.Mapper;
......@@ -17,5 +18,5 @@ import java.util.List;
*/
public interface OrderAccountMapper extends Mapper<OrderAccount> {
List<OrderAccountDTO> getOrderAccountByOrderType(@Param("type") Integer type, @Param("day") Integer day);
List<OrderAccountDTO> getOrderAccountByOrderType(Term term);
}
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.admin.feign.rest.UserRestInterface;
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;
......@@ -22,23 +20,18 @@ 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 com.xxfc.platform.vehicle.common.RestResponse;
import com.xxfc.platform.vehicle.feign.VehicleFeign;
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.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
......@@ -90,64 +83,41 @@ public class OrderStatisticsController extends BaseController<OrderStatisticsBiz
@Autowired
private DailyMembersOrderStatisticsBiz membersBiz;
@Autowired
private VehicleFeign vehicleFeign;
@ApiOperation("获取订单统计数据")
@GetMapping("/findAll/{type}")
public ObjectRestResponse findAll(@PathVariable Integer type) {
try {
ObjectRestResponse<UserDTO> userDTOObjectRestResponse
= userFeign.userinfoByToken(userAuthConfig.getToken(getRequest()));
if (userDTOObjectRestResponse == null || userDTOObjectRestResponse.getData() == null) {
throw new BaseException("请登录!");
throw new BaseException("token失效!");
}
UserDTO user = userDTOObjectRestResponse.getData();
Integer companyId = user.getCompanyId();
if (DATA_AUTHORITY.equals(user.getDataAll())) {
companyId = null;
List<Integer> companyIds = null;
if (!DATA_AUTHORITY.equals(user.getDataAll())) {
companyIds = vehicleFeign.getCompanyIds().getData();
}
//只统计租车订单
if (TYPE_VEHICLE.equals(type)) {
OrderStatistics vehicle = vehicleBiz.findAll(companyId);
return ObjectRestResponse.succ(new HomePageOrderData() {{
setTotalOrders(vehicle.getTotalGmv().subtract(vehicle.getTotalReturnGmv()));
setAdditionalIndemnity(vehicle.getTotalCompensation()
.add(vehicle.getTotalForfeit())
.add(vehicle.getTotalDefaultMoney())
.add(vehicle.getTotalExpenditure().subtract(vehicle.getTotalGmv().subtract(vehicle.getTotalReturnGmv())))
);
setTotalOutstandingDeposit(vehicle.getTotalSecurityDeposit()
.subtract(vehicle.getTotalRefundSecurityDeposit())
.subtract(getAdditionalIndemnity()));
}});
return ObjectRestResponse.succ(baseBiz.getVehicleHomePageOrderData(companyIds));
}
//只统计会租车订单
//只统计旅游订单
if (TYPE_TOUR.equals(type)) {
OrderStatistics tour = TravelBiz.findAll(companyId);
return ObjectRestResponse.succ(new HomePageOrderData() {{
setTotalOrders(tour.getTotalGmv().subtract(tour.getTotalReturnGmv()));
setAdditionalIndemnity(tour.getTotalDefaultMoney());
}});
return ObjectRestResponse.succ(baseBiz.getTourHomePageOrderData(companyIds));
}
//只统计会员定案
//只统计会员订单
if (TYPE_MEMBER.equals(type)) {
OrderStatistics member = membersBiz.findAll(companyId);
return ObjectRestResponse.succ(new HomePageOrderData() {{
setTotalOrders(member.getTotalGmv());
}});
return ObjectRestResponse.succ(baseBiz.getMemberHomePageOrderData(companyIds));
}
//所有订单
if (TYPE_TOTAL.equals(type)) {
return ObjectRestResponse.succ(baseBiz.getTotalOrder(companyId));
return ObjectRestResponse.succ(baseBiz.getTotalOrder(companyIds));
}
return ObjectRestResponse.createFailedResult(ResultCode.FAILED_CODE, "参数错误!");
} catch (Exception e) {
e.printStackTrace();
......@@ -155,12 +125,11 @@ public class OrderStatisticsController extends BaseController<OrderStatisticsBiz
}
}
@PostMapping("/order")
@ApiOperation(value = "会员统计")
public ObjectRestResponse<List<MembersOrderDto>> getMemberOrderStatisticsData(@RequestBody OrderQuery query) throws ParseException {
if (query.getEndTime()!=null) {
query.setEndTime(query.getEndTime()+(24*60*60*1000));
if (query.getEndTime() != null) {
query.setEndTime(query.getEndTime() + (24 * 60 * 60 * 1000));
}
//获取会员等级信息
List<BaseUserMemberLevel> memberLevels = userFeign.levels();
......@@ -172,8 +141,8 @@ public class OrderStatisticsController extends BaseController<OrderStatisticsBiz
@PostMapping("/excel")
@ApiOperation(value = "下载excel表")
public void downloadExcel(@RequestBody OrderQuery query) throws Exception {
if (query.getEndTime()!=null) {
query.setEndTime(query.getEndTime()+(24*60*60*1000));
if (query.getEndTime() != null) {
query.setEndTime(query.getEndTime() + (24 * 60 * 60 * 1000));
}
// 通过工具类创建writer,默认创建xls格式
ExcelWriter writer = ExcelUtil.getWriter(true);
......
......@@ -22,10 +22,12 @@
daily_members_order_statistics
WHERE
1=1
<if test="companyId != null">
and branch_company_id = #{companyId}
<if test="companyIds != null and companyIds.size()!=0">
and branch_company_id in
<foreach collection="companyIds" index="index" item="companyId" open="(" separator="," close=")" >
#{companyId}
</foreach>
</if>
</select>
<!-- <select id="updateByExampleSelective">-->
<!-- SELECT-->
......
......@@ -58,8 +58,11 @@
daily_travel_order_statistics
WHERE
1=1
<if test="companyId != null">
and branch_company_id = #{companyId}
<if test="companyIds != null and companyIds.size()!=0">
and branch_company_id in
<foreach collection="companyIds" index="index" item="companyId" open="(" separator="," close=")" >
#{companyId}
</foreach>
</if>
</select>
......
......@@ -89,13 +89,16 @@
IFNULL( sum( compensation ), 0 ) AS totalCompensation,
IFNULL( sum( return_gmv ), 0 ) AS totalReturnGmv,
IFNULL( sum( default_money ), 0 ) AS totalDefaultMoney,
IFNULL( sum( total_expenditure ), 0 ) AS totalExpenditure
IFNULL( sum( order_compensation ), 0 ) AS totalOrderCompensation
FROM
daily_vehicle_order_statistics
WHERE
1=1
<if test="companyId != null">
and branch_company_id = #{companyId}
<if test="companyIds != null and companyIds.size()!=0">
and branch_company_id in
<foreach collection="companyIds" index="index" item="companyId" open="(" separator="," close=")" >
#{companyId}
</foreach>
</if>
</select>
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxfc.platform.order.mapper.OrderAccountMapper">
<select id="getOrderAccountByOrderType" resultType="com.xxfc.platform.order.pojo.account.OrderAccountDTO">
<select id="getOrderAccountByOrderType" parameterType="com.xxfc.platform.order.pojo.Term" resultType="com.xxfc.platform.order.pojo.account.OrderAccountDTO">
SELECT
date(DATE_SUB(now(),interval #{day} day)) as oneDay,
<if test="subdivide !=null and subdivide ==1">
date( FROM_UNIXTIME( a.crt_time / 1000 ) ) as oneDay,
</if>
a.*
<if test="type != null and type == 1">
<if test="orderType != null and orderType == 1">
, v.start_company_id as companyId
</if>
<if test="type != null and type == 2">
<if test="orderType != null and orderType == 2">
, t.start_company_id as companyId
</if>
FROM
order_account a
LEFT JOIN base_order b ON a.order_id = b.id
<if test="type != null and type==1">
<if test="orderType != null and orderType==1">
LEFT JOIN order_rent_vehicle_detail v ON b.id = v.order_id
</if>
<if test="type != null and type==2">
<if test="orderType != null and orderType==2">
LEFT JOIN order_tour_detail t ON b.id = t.order_id
</if>
WHERE
a.account_status=1
AND
b.type = #{type}
b.type = #{orderType}
<if test="startTime != null">
AND a.crt_time <![CDATA[>= ]]> #{startTime}
</if>
<if test="endTime != null">
AND a.crt_time &gt; endTime
</if>
<if test="companyIds != null and companyIds.size() != 0 ">
<if test="orderType != null and orderType == 1">
AND v.start_company_id in
<foreach collection="companyIds" index="index" item="companyId" open="(" separator="," close=")">
#{companyId}
</foreach>
</if>
<if test="orderType != null and orderType == 2">
AND t.start_company_id in
<foreach collection="companyIds" index="index" item="companyId" open="(" separator="," close=")">
#{companyId}
</foreach>
</if>
</if>
<if test="subdivide !=null and subdivide ==1">
AND date( FROM_UNIXTIME( a.crt_time / 1000 ) ) = date( DATE_SUB( now( ), INTERVAL #{day} DAY ) )
</if>
</select>
</mapper>
\ No newline at end of file
import com.xxfc.platform.order.OrderApplication;
import com.xxfc.platform.order.biz.DailyOrderStatisticsBiz;
import com.xxfc.platform.order.jobhandler.BaseOrderStatisticsJobHandler;
import org.joda.time.DateTime;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author libin
* @version 1.0
......@@ -19,11 +25,46 @@ public class ServiceTest {
@Autowired
private DailyOrderStatisticsBiz dailyOrderStatisticsBiz;
@Autowired
private BaseOrderStatisticsJobHandler handler;
@Test
public void testSchedu(){
dailyOrderStatisticsBiz.statisticalOrder();
dailyOrderStatisticsBiz.statisticalOrder(1);
}
@Test
public void test() throws ParseException {
String d="2019-09-01";
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date parse = dateFormat.parse(d);
System.out.println(parse);
}
@Test
public void test2() {
DateTime dateTime = DateTime.parse("2019-10-10");
System.out.println(dateTime);
}
@Test
public void test3() {
DateTime dateTime = DateTime.parse("2019-10-10");
Date date = dateTime.toDate();
DateTime dateTime1 = DateTime.parse("2019-12-10");
Date date1 = dateTime1.toDate();
System.out.println(date);
System.out.println(date1);
System.out.println(date.before(date1));
System.out.println(date.after(date1));
}
@Test
public void handlerTeset() {
handler.execute("2019-09-29");
}
}
......@@ -67,6 +67,7 @@ public class XCFQAuthentication implements UserAuthentication {
/**
* 状态码: 200 正常;400 URL无效;401 appCode错误; 403 次数用完; 500 API网管错误
*/
log.info("外部接口响应状态码:"+statusCode);
//获取response的body
if (statusCode == 200) {
String result = EntityUtils.toString(response.getEntity());
......
......@@ -10,7 +10,6 @@ import com.xxfc.platform.vehicle.pojo.dto.BranchCompanyFindDTO;
import com.xxfc.platform.vehicle.pojo.vo.AccompanyingItemVo;
import com.xxfc.platform.vehicle.pojo.vo.BranComanyLeaderVo;
import com.xxfc.platform.vehicle.pojo.vo.BranchCompanyListVO;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
......@@ -172,4 +171,6 @@ public interface VehicleFeign {
@RequestMapping(value = "/vehicleInfo/bookRecord/update", method = RequestMethod.POST)
public ObjectRestResponse update(@RequestBody BookRecordUpdateLog bookRecordUpdateLog);
@RequestMapping(value ="/branchCompany/app/unauth/getCompanyIds",method = RequestMethod.GET)
RestResponse<List<Integer>> getCompanyIds();
}
......@@ -411,4 +411,8 @@ public class BranchCompanyBiz extends BaseBiz<BranchCompanyMapper, BranchCompany
return ObjectRestResponse.succ(list);
}
public List<Integer> getCompanyIds() {
UserDTO userDTO = getAdminUserInfo();
return vehicleBiz.dataCompany(userDTO.getDataZone(), userDTO.getDataCompany());
}
}
......@@ -25,7 +25,9 @@ import com.xxfc.platform.vehicle.pojo.vo.BranchCompanyListVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
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.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
......@@ -35,6 +37,7 @@ import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@RestController
@RequestMapping("/branchCompany")
......@@ -217,4 +220,11 @@ public class BranchCompanyController extends BaseController<BranchCompanyBiz> {
public ObjectRestResponse<List<BranchCompany>> companys() {
return baseBiz.branchCompans();
}
@RequestMapping(value ="/app/unauth/getCompanyIds",method = RequestMethod.GET)
public RestResponse<List<Integer>> getCompanyIds() {
return RestResponse.suc(baseBiz.getCompanyIds());
}
}
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