平台端经营分析

This commit is contained in:
xl
2024-07-23 11:56:29 +08:00
parent 4b40ef3b6b
commit ce2a07fb98
12 changed files with 463 additions and 8 deletions

View File

@@ -0,0 +1,32 @@
package com.zbkj.admin.controller.platform;
import com.zbkj.admin.service.HomeService;
import com.zbkj.common.request.BusinessAnalysisRequest;
import com.zbkj.common.response.BusinessAnalysisResponse;
import com.zbkj.common.result.CommonResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping("api/admin/platform/business/analysis")
@Api(tags = "汽车-平台端-经营分析控制器")
public class PlatformBusinessAnalysisController {
@Autowired
private HomeService homeService;
@PreAuthorize("hasAuthority('platform:business:analysis:lattice')")
@ApiOperation(value = "经营分析各个成本数据")
@RequestMapping(value = "/lattice", method = RequestMethod.POST)
public CommonResult<BusinessAnalysisResponse> indexDate(@RequestBody BusinessAnalysisRequest request) {
//SystemAdmin systemAdmin = SecurityUtil.getLoginUserVo().getUser();
return CommonResult.success(homeService.getBusiness(request));
}
}

View File

@@ -1,7 +1,7 @@
package com.zbkj.admin.service;
import com.zbkj.common.request.BusinessAnalysisRequest;
import com.zbkj.common.response.*;
import com.zbkj.common.vo.MyRecord;
import java.util.List;
@@ -63,4 +63,6 @@ public interface HomeService {
List<BrokenLineResponse> brokenLine(Integer merId);
HomePendingDataResponse getOperatingData(Integer merId);
BusinessAnalysisResponse getBusiness(BusinessAnalysisRequest request);
}

View File

@@ -3,8 +3,6 @@ package com.zbkj.admin.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.PageInfo;
import com.zbkj.admin.service.HomeService;
import com.zbkj.admin.service.UserStatisticsService;
@@ -12,14 +10,15 @@ import com.zbkj.common.constants.AccessoryConstants;
import com.zbkj.common.constants.DateConstants;
import com.zbkj.common.constants.SysConfigConstants;
import com.zbkj.common.model.admin.SystemAdmin;
import com.zbkj.common.model.car.CarReservationOrder;
import com.zbkj.common.model.merchant.Merchant;
import com.zbkj.common.model.product.Product;
import com.zbkj.common.model.record.ProductDayRecord;
import com.zbkj.common.model.user.User;
import com.zbkj.common.request.BusinessAnalysisRequest;
import com.zbkj.common.request.ProductRankingRequest;
import com.zbkj.common.response.*;
import com.zbkj.common.utils.SecurityUtil;
import com.zbkj.common.vo.BusinessAnalysisVo;
import com.zbkj.service.service.*;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -27,6 +26,9 @@ import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
/**
@@ -80,6 +82,10 @@ public class HomeServiceImpl implements HomeService {
private AccessoryStorageService accessoryStorageService;
@Autowired
private AccessorySupplierService accessorySupplierService;
@Autowired
private ReservationOrderCashDeskService reservationOrderCashDeskService;
@Autowired
private CarReservationInfoService carReservationInfoService;
/**
* 首页数据
@@ -175,6 +181,48 @@ public class HomeServiceImpl implements HomeService {
return response;
}
@Override
public BusinessAnalysisResponse getBusiness(BusinessAnalysisRequest request) {
ExecutorService service = Executors.newFixedThreadPool(4);
BusinessAnalysisResponse response = new BusinessAnalysisResponse();
//收银
CompletableFuture<BusinessAnalysisVo> cashierTask = CompletableFuture.supplyAsync(() -> {
BusinessAnalysisVo cashierVo = reservationOrderCashDeskService.getStatistic(request);
return cashierVo;
}, service);
//配件使用成本
CompletableFuture<BusinessAnalysisVo> accTask = CompletableFuture.supplyAsync(() -> {
BusinessAnalysisVo accessoryCostVo = carReservationInfoService.getStatistic(request);
return accessoryCostVo;
}, service);
//营业额
CompletableFuture<BusinessAnalysisVo> costTask = CompletableFuture.supplyAsync(() -> {
//配件使用成本
BusinessAnalysisVo costVo = reservationOrderCashDeskService.getCost(request);
return costVo;
}, service);
CompletableFuture<BusinessAnalysisVo> orderTask = CompletableFuture.supplyAsync(() -> {
//工单数量
BusinessAnalysisVo countNum = carReservationOrderService.getCountNum(request);
return countNum;
}, service);
CompletableFuture.allOf(cashierTask, accTask, costTask, orderTask).join();
try {
response.setCashierVo(cashierTask.get());
response.setAccessoryCostVo(accTask.get());
response.setTurnoverVo(costTask.get());
response.setSingleQuantityVo(orderTask.get());
} catch (Exception e) {
e.printStackTrace();
} finally {
service.shutdown();
}
return response;
}
public BrokenLineResponse boardInfo(String dateLat, Integer merId) {
//工单数据
Integer totalRepairOrderNum = carReservationOrderService.getTotalRepairOrderNum(dateLat, merId);

View File

@@ -0,0 +1,24 @@
package com.zbkj.common.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value = "BusinessAnalysisRequest", description = "经营分析请求对象")
public class BusinessAnalysisRequest implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "时间区间")
private String dateLimit;
@ApiModelProperty(value = "维修店id")
private Integer merId;
}

View File

@@ -0,0 +1,30 @@
package com.zbkj.common.response;
import com.zbkj.common.vo.BusinessAnalysisVo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value = "BusinessAnalysisResponse", description = "BusinessAnalysisResponse")
public class BusinessAnalysisResponse implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "收银结算")
private BusinessAnalysisVo cashierVo;
@ApiModelProperty(value = "配件使用成本")
private BusinessAnalysisVo accessoryCostVo;
@ApiModelProperty(value = "营业额")
private BusinessAnalysisVo turnoverVo;
@ApiModelProperty(value = "工单数量")
private BusinessAnalysisVo singleQuantityVo;
}

View File

@@ -0,0 +1,22 @@
package com.zbkj.common.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
public class BusinessAnalysisVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "当前数据")
private BigDecimal currentData;
@ApiModelProperty(value = "同比")
private BigDecimal yearOnYear;
@ApiModelProperty(value = "环比")
private BigDecimal linkRelativeRatio;
}

View File

@@ -2,6 +2,8 @@ package com.zbkj.service.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zbkj.common.model.car.CarReservationInfo;
import com.zbkj.common.request.BusinessAnalysisRequest;
import com.zbkj.common.vo.BusinessAnalysisVo;
import java.util.List;
import java.util.Map;
@@ -19,4 +21,6 @@ public interface CarReservationInfoService extends IService<CarReservationInfo>
CarReservationInfo getTotalPrices(Integer carDealerId);
Map<Integer, CarReservationInfo> getByOrderSnMap(List<Integer> orderIdList);
BusinessAnalysisVo getStatistic(BusinessAnalysisRequest request);
}

View File

@@ -3,12 +3,12 @@ package com.zbkj.service.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.github.pagehelper.PageInfo;
import com.zbkj.common.model.car.CarReservationOrder;
import com.zbkj.common.page.CommonPage;
import com.zbkj.common.request.BusinessAnalysisRequest;
import com.zbkj.common.request.PageParamRequest;
import com.zbkj.common.request.accessory.OrderReceiveRequest;
import com.zbkj.common.request.car.*;
import com.zbkj.common.response.car.*;
import com.zbkj.common.vo.MyRecord;
import com.zbkj.common.vo.BusinessAnalysisVo;
import java.util.List;
import java.util.Map;
@@ -384,4 +384,6 @@ public interface CarReservationOrderService extends IService<CarReservationOrder
Map<String, CarReservationOrderResponse> getOrderBySn(List<String> orderNoList, Boolean b);
Boolean modifyPrice(CarReservationInfoRequest request);
BusinessAnalysisVo getCountNum(BusinessAnalysisRequest request);
}

View File

@@ -2,9 +2,10 @@ package com.zbkj.service.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zbkj.common.model.car.ReservationOrderCashDesk;
import com.zbkj.common.request.BusinessAnalysisRequest;
import com.zbkj.common.request.car.ReservationOrderCashDeskRequest;
import com.zbkj.common.response.car.ReservationOrderCashDeskResponse;
import com.zbkj.common.vo.MyRecord;
import com.zbkj.common.vo.BusinessAnalysisVo;
import java.util.List;
import java.util.Map;
@@ -23,4 +24,8 @@ public interface ReservationOrderCashDeskService extends IService<ReservationOrd
Map<Integer, ReservationOrderCashDeskResponse> getByOrderIdList(List<Integer> idList);
List<Integer> getByAdminList(List<Integer> adminIdList);
BusinessAnalysisVo getStatistic(BusinessAnalysisRequest request);
BusinessAnalysisVo getCost(BusinessAnalysisRequest request);
}

View File

@@ -1,16 +1,31 @@
package com.zbkj.service.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zbkj.common.constants.DateConstants;
import com.zbkj.common.model.car.CarReservationInfo;
import com.zbkj.common.request.BusinessAnalysisRequest;
import com.zbkj.common.utils.LxkDateUtil;
import com.zbkj.common.vo.BusinessAnalysisVo;
import com.zbkj.common.vo.DateLimitUtilVo;
import com.zbkj.service.dao.car.CarReservationInfoDao;
import com.zbkj.service.service.CarReservationInfoService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
/**
@@ -46,5 +61,63 @@ public class CarReservationInfoServiceImpl extends ServiceImpl<CarReservationInf
}
return selectList.stream().collect(Collectors.toMap(CarReservationInfo::getCarReservationOrderId, info -> info));
}
@Override
public BusinessAnalysisVo getStatistic(BusinessAnalysisRequest request) {
BusinessAnalysisVo vo = new BusinessAnalysisVo();
ExecutorService service = Executors.newFixedThreadPool(3);
//当前
CompletableFuture<BigDecimal> current = CompletableFuture.supplyAsync(() -> {
BigDecimal sumPrice = getSumPrice(request.getDateLimit(), request.getMerId(), null);
return sumPrice;
}, service);
//上一年
CompletableFuture<BigDecimal> year = CompletableFuture.supplyAsync(() -> {
BigDecimal sumPrice = getSumPrice(request.getDateLimit(), request.getMerId(), DateConstants.SEARCH_DATE_PRE_YEAR);
return sumPrice;
}, service);
//上一月
CompletableFuture<BigDecimal> month = CompletableFuture.supplyAsync(() -> {
BigDecimal sumPrice = getSumPrice(request.getDateLimit(), request.getMerId(), DateConstants.SEARCH_DATE_PRE_MONTH);
return sumPrice;
}, service);
CompletableFuture.allOf(current, year, month).join();
try {
vo.setCurrentData(current.get());
vo.setYearOnYear(year.get());
vo.setLinkRelativeRatio(month.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
vo = null;
} finally {
service.shutdown();
}
return vo;
}
private BigDecimal getSumPrice(String dateLimit, Integer merId, String type) {
QueryWrapper<CarReservationInfo> lqw = new QueryWrapper<>();
lqw.select("IFNULL(SUM( CASE WHEN new_accessory_over_price IS NOT NULL AND new_accessory_over_price <> 0 THEN new_accessory_over_price ELSE accessory_over_price END " +
"),0) as new_accessory_over_price");
if (merId != null) {
lqw.eq("mer_id", merId);
}
if (StrUtil.isNotBlank(dateLimit)) {
DateLimitUtilVo dateLimitUtilVo = LxkDateUtil.getDateLimit(dateLimit);
DateTime start = DateUtil.parseDateTime(dateLimitUtilVo.getStartTime());
DateTime end = DateUtil.parseDateTime(dateLimitUtilVo.getEndTime());
if (StrUtil.isNotBlank(type) && type.equals(DateConstants.SEARCH_DATE_PRE_MONTH)) {
//前一个月
lqw.between("create_time", DateUtil.offsetMonth(start, -1), DateUtil.offsetMonth(end, -1));
} else if (StrUtil.isNotBlank(type) && type.equals(DateConstants.SEARCH_DATE_PRE_YEAR)) {
//前一年
lqw.between("create_time", DateUtil.offset(start, DateField.YEAR, -1), DateUtil.offset(end, DateField.YEAR, -1));
} else {
lqw.between("create_time", dateLimitUtilVo.getStartTime(), dateLimitUtilVo.getEndTime());
}
}
return getOne(lqw).getNewAccessoryOverPrice();
}
}

View File

@@ -1,6 +1,8 @@
package com.zbkj.service.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.*;
import com.alibaba.fastjson.JSON;
@@ -28,6 +30,7 @@ import com.zbkj.common.model.insurance.InsuranceCompany;
import com.zbkj.common.model.merchant.Merchant;
import com.zbkj.common.model.user.User;
import com.zbkj.common.page.CommonPage;
import com.zbkj.common.request.BusinessAnalysisRequest;
import com.zbkj.common.request.OrderMessageResponse;
import com.zbkj.common.request.PageParamRequest;
import com.zbkj.common.request.TemplateCardMessageRequest;
@@ -43,6 +46,7 @@ import com.zbkj.common.utils.LxkDateUtil;
import com.zbkj.common.utils.LxkUtil;
import com.zbkj.common.utils.JsonUtils;
import com.zbkj.common.utils.RedisUtil;
import com.zbkj.common.vo.BusinessAnalysisVo;
import com.zbkj.common.vo.DateLimitUtilVo;
import com.zbkj.service.dao.car.CarDao;
import com.zbkj.service.dao.car.CarReservationOrderDao;
@@ -58,7 +62,7 @@ import org.springframework.transaction.support.TransactionTemplate;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.*;
import java.util.stream.Collectors;
/**
@@ -3566,6 +3570,68 @@ public class CarReservationOrderServiceImpl extends ServiceImpl<CarReservationOr
return carReservationInfoService.updateById(up);
}
@Override
public BusinessAnalysisVo getCountNum(BusinessAnalysisRequest request) {
ExecutorService service = Executors.newFixedThreadPool(3);
BusinessAnalysisVo vo = new BusinessAnalysisVo();
//统计当前数据
CompletableFuture<BigDecimal> current = CompletableFuture.supplyAsync(() -> {
BigDecimal price = getCount(request.getDateLimit(), request.getMerId(), null);
return price;
}, service);
//统计上年数据
CompletableFuture<BigDecimal> year = CompletableFuture.supplyAsync(() -> {
BigDecimal price = getCount(request.getDateLimit(), request.getMerId(), DateConstants.SEARCH_DATE_PRE_YEAR);
return price;
}, service);
//统计上个月的数据
CompletableFuture<BigDecimal> lastMonth = CompletableFuture.supplyAsync(() -> {
BigDecimal price = getCount(request.getDateLimit(), request.getMerId(), DateConstants.SEARCH_DATE_PRE_MONTH);
return price;
}, service);
try {
CompletableFuture.allOf(current, year, lastMonth).join();
//同比
vo.setYearOnYear(LxkUtil.getRateBig(current.get(), year.get()));
//环比
vo.setLinkRelativeRatio(LxkUtil.getRateBig(current.get(), year.get()));
vo.setCurrentData(current.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
vo = null;
} finally {
service.shutdown();
}
return vo;
}
public BigDecimal getCount(String dateLimit, Integer merId, String type) {
LambdaQueryWrapper<CarReservationOrder> lqw = new LambdaQueryWrapper<>();
if (StrUtil.isNotBlank(dateLimit)) {
DateLimitUtilVo dateLimitUtilVo = LxkDateUtil.getDateLimit(dateLimit);
DateTime start = DateUtil.parseDateTime(dateLimitUtilVo.getStartTime());
DateTime end = DateUtil.parseDateTime(dateLimitUtilVo.getEndTime());
if (StrUtil.isNotBlank(type) && type.equals(DateConstants.SEARCH_DATE_PRE_MONTH)) {
//前一个月
lqw.between(CarReservationOrder::getCreateTime, DateUtil.offsetMonth(start, -1), DateUtil.offsetMonth(end, -1));
} else if (StrUtil.isNotBlank(type) && type.equals(DateConstants.SEARCH_DATE_PRE_YEAR)) {
//前一年
lqw.between(CarReservationOrder::getCreateTime, DateUtil.offset(start, DateField.YEAR, -1), DateUtil.offset(end, DateField.YEAR, -1));
} else {
lqw.between(CarReservationOrder::getCreateTime, dateLimitUtilVo.getStartTime(), dateLimitUtilVo.getEndTime());
}
}
if (merId != null) {
lqw.eq(CarReservationOrder::getMerId, merId);
}
lqw.ne(CarReservationOrder::getAuditStatus, CarConstants.APPLY_STATUS_2);
return new BigDecimal(count(lqw));
}
@Override
public Boolean revisePickingStatus(Integer id) {
if (ObjectUtil.isNull(id)) {

View File

@@ -1,9 +1,13 @@
package com.zbkj.service.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zbkj.common.constants.*;
@@ -15,11 +19,14 @@ import com.zbkj.common.model.car.ReservationOrderCashDesk;
import com.zbkj.common.model.car.ReservationOrderCashDeskItem;
import com.zbkj.common.model.dealer.CarDealerRatio;
import com.zbkj.common.model.user.UserBrokerageRecord;
import com.zbkj.common.request.BusinessAnalysisRequest;
import com.zbkj.common.request.car.ReservationOrderCashDeskRequest;
import com.zbkj.common.response.car.CarReservationOrderResponse;
import com.zbkj.common.response.car.ReservationOrderCashDeskResponse;
import com.zbkj.common.utils.LxkDateUtil;
import com.zbkj.common.utils.LxkUtil;
import com.zbkj.common.vo.BusinessAnalysisVo;
import com.zbkj.common.vo.DateLimitUtilVo;
import com.zbkj.service.dao.car.ReservationOrderCashDeskDao;
import com.zbkj.service.service.*;
import org.springframework.beans.BeanUtils;
@@ -30,6 +37,10 @@ import org.springframework.transaction.support.TransactionTemplate;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
/**
@@ -281,6 +292,142 @@ public class ReservationOrderCashDeskServiceImpl extends ServiceImpl<Reservation
}
return itemList.stream().map(ReservationOrderCashDeskItem::getOrderId).distinct().collect(Collectors.toList());
}
@Override
public BusinessAnalysisVo getStatistic(BusinessAnalysisRequest request) {
ExecutorService service = Executors.newFixedThreadPool(3);
BusinessAnalysisVo vo = new BusinessAnalysisVo();
//统计当前数据
CompletableFuture<BigDecimal> current = CompletableFuture.supplyAsync(() -> {
BigDecimal price = getPrice(request.getDateLimit(), request.getMerId(), null);
return price;
}, service);
//统计上年数据
CompletableFuture<BigDecimal> year = CompletableFuture.supplyAsync(() -> {
BigDecimal price = getPrice(request.getDateLimit(), request.getMerId(), DateConstants.SEARCH_DATE_PRE_YEAR);
return price;
}, service);
//统计上个月的数据
CompletableFuture<BigDecimal> lastMonth = CompletableFuture.supplyAsync(() -> {
BigDecimal price = getPrice(request.getDateLimit(), request.getMerId(), DateConstants.SEARCH_DATE_PRE_MONTH);
return price;
}, service);
CompletableFuture.allOf(current, year, lastMonth).join();
try {
//同比
vo.setYearOnYear(LxkUtil.getRateBig(current.get(), year.get()));
//环比
vo.setLinkRelativeRatio(LxkUtil.getRateBig(current.get(), year.get()));
vo.setCurrentData(current.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
vo = null;
} finally {
service.shutdown();
}
return vo;
}
@Override
public BusinessAnalysisVo getCost(BusinessAnalysisRequest request) {
ExecutorService service = Executors.newFixedThreadPool(3);
BusinessAnalysisVo vo = new BusinessAnalysisVo();
//统计当前数据
CompletableFuture<BigDecimal> current = CompletableFuture.supplyAsync(() -> {
BigDecimal price = getTurnover(request.getDateLimit(), request.getMerId(), null);
return price;
}, service);
//统计上年数据
CompletableFuture<BigDecimal> year = CompletableFuture.supplyAsync(() -> {
BigDecimal price = getTurnover(request.getDateLimit(), request.getMerId(), DateConstants.SEARCH_DATE_PRE_YEAR);
return price;
}, service);
//统计上个月的数据
CompletableFuture<BigDecimal> lastMonth = CompletableFuture.supplyAsync(() -> {
BigDecimal price = getTurnover(request.getDateLimit(), request.getMerId(), DateConstants.SEARCH_DATE_PRE_MONTH);
return price;
}, service);
try {
CompletableFuture.allOf(current, year, lastMonth).join();
//同比
vo.setYearOnYear(LxkUtil.getRateBig(current.get(), year.get()));
//环比
vo.setLinkRelativeRatio(LxkUtil.getRateBig(current.get(), year.get()));
vo.setCurrentData(current.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
vo = null;
} finally {
service.shutdown();
}
return vo;
}
private BigDecimal getTurnover(String dateLimit, Integer merId, String type) {
//总营业额
LambdaQueryWrapper<ReservationOrderCashDesk> lqw = new LambdaQueryWrapper<>();
if (merId != null) {
lqw.eq(ReservationOrderCashDesk::getMerId, merId);
}
if (StrUtil.isNotBlank(dateLimit)) {
DateLimitUtilVo dateLimitUtilVo = LxkDateUtil.getDateLimit(dateLimit);
DateTime start = DateUtil.parseDateTime(dateLimitUtilVo.getStartTime());
DateTime end = DateUtil.parseDateTime(dateLimitUtilVo.getEndTime());
if (StrUtil.isNotBlank(type) && type.equals(DateConstants.SEARCH_DATE_PRE_MONTH)) {
//前一个月
lqw.between(ReservationOrderCashDesk::getCreateTime, DateUtil.offsetMonth(start, -1), DateUtil.offsetMonth(end, -1));
} else if (StrUtil.isNotBlank(type) && type.equals(DateConstants.SEARCH_DATE_PRE_YEAR)) {
//前一年
lqw.between(ReservationOrderCashDesk::getCreateTime, DateUtil.offset(start, DateField.YEAR, -1), DateUtil.offset(end, DateField.YEAR, -1));
} else {
lqw.between(ReservationOrderCashDesk::getCreateTime, dateLimitUtilVo.getStartTime(), dateLimitUtilVo.getEndTime());
}
}
List<ReservationOrderCashDesk> list = list(lqw);
if (CollUtil.isEmpty(list)) {
return BigDecimal.ZERO;
}
List<String> deskSn = list.stream().map(ReservationOrderCashDesk::getCashDeskSn).collect(Collectors.toList());
LambdaQueryWrapper<ReservationOrderCashDeskItem> item = new LambdaQueryWrapper<>();
item.eq(ReservationOrderCashDeskItem::getCashDeskSn, deskSn);
List<ReservationOrderCashDeskItem> items = reservationOrderCashDeskItemService.list(item);
List<Integer> orderIds = items.stream().map(ReservationOrderCashDeskItem::getOrderId).distinct().collect(Collectors.toList());
QueryWrapper<CarReservationInfo> qw = new QueryWrapper<>();
qw.select("IFNULL(SUM( CASE WHEN new_accessory_over_price IS NOT NULL AND new_accessory_over_price <> 0 THEN new_accessory_over_price ELSE accessory_over_price END " +
"),0) as new_accessory_over_price");
qw.in("car_reservation_order_id", orderIds);
CarReservationInfo info = carReservationInfoService.getOne(qw);
BigDecimal total = list.stream().map(ReservationOrderCashDesk::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
return total.subtract(info.getNewAccessoryOverPrice());
}
private BigDecimal getPrice(String dateLimit, Integer merId, String type) {
QueryWrapper<ReservationOrderCashDesk> lqw = new QueryWrapper<>();
lqw.select("IFNULL(sum(price),0) as price");
if (merId != null) {
lqw.eq("mer_id", merId);
}
if (StrUtil.isNotBlank(dateLimit)) {
DateLimitUtilVo dateLimitUtilVo = LxkDateUtil.getDateLimit(dateLimit);
DateTime start = DateUtil.parseDateTime(dateLimitUtilVo.getStartTime());
DateTime end = DateUtil.parseDateTime(dateLimitUtilVo.getEndTime());
if (StrUtil.isNotBlank(type) && type.equals(DateConstants.SEARCH_DATE_PRE_MONTH)) {
//前一个月
lqw.between("create_time", DateUtil.offsetMonth(start, -1), DateUtil.offsetMonth(end, -1));
} else if (StrUtil.isNotBlank(type) && type.equals(DateConstants.SEARCH_DATE_PRE_YEAR)) {
//前一年
lqw.between("create_time", DateUtil.offset(start, DateField.YEAR, -1), DateUtil.offset(end, DateField.YEAR, -1));
} else {
lqw.between("create_time", dateLimitUtilVo.getStartTime(), dateLimitUtilVo.getEndTime());
}
}
return getOne(lqw).getPrice();
}
}