From 614f3dc6ec6f6159bd2b1de569b5a7a5cf0c2d57 Mon Sep 17 00:00:00 2001 From: xl <2132997227@qq.com> Date: Mon, 29 Jul 2024 19:09:13 +0800 Subject: [PATCH] =?UTF-8?q?fix-=E7=BB=B4=E4=BF=AE=E6=9C=88=E5=BA=A6?= =?UTF-8?q?=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MerchantMonthlyMaintenanceAnalysis.java | 56 + .../PlatformMonthlyMaintenanceAnalysis.java | 61 + .../com/zbkj/admin/service/HomeService.java | 10 + .../admin/service/impl/HomeServiceImpl.java | 60 +- ...MonthlyMaintenanceAnalysisAvgResponse.java | 5 +- ...onthlyMaintenanceAnalysisCostResponse.java | 28 + ...thlyMaintenanceAnalysisProfitResponse.java | 28 + .../zbkj/common/vo/BusinessAnalysisVo.java | 6 + .../service/CarReservationOrderService.java | 26 +- .../impl/CarReservationOrderServiceImpl.java | 1175 ++++++++++++++++- 10 files changed, 1426 insertions(+), 29 deletions(-) create mode 100644 lxk-common/src/main/java/com/zbkj/common/response/MonthlyMaintenanceAnalysisCostResponse.java create mode 100644 lxk-common/src/main/java/com/zbkj/common/response/MonthlyMaintenanceAnalysisProfitResponse.java diff --git a/lxk-admin/src/main/java/com/zbkj/admin/controller/merchant/MerchantMonthlyMaintenanceAnalysis.java b/lxk-admin/src/main/java/com/zbkj/admin/controller/merchant/MerchantMonthlyMaintenanceAnalysis.java index 451b7236..c41ee83e 100644 --- a/lxk-admin/src/main/java/com/zbkj/admin/controller/merchant/MerchantMonthlyMaintenanceAnalysis.java +++ b/lxk-admin/src/main/java/com/zbkj/admin/controller/merchant/MerchantMonthlyMaintenanceAnalysis.java @@ -113,4 +113,60 @@ public class MerchantMonthlyMaintenanceAnalysis { } return CommonResult.success(homeService.getMonthlyMaintenanceCostModelAndCompany(request)); } + + @ApiOperation(value = "维保单车成本格子图") + @RequestMapping(value = "/cost/lattice", method = RequestMethod.POST) + public CommonResult indexDateCost(@RequestBody MonthlyMaintenanceAnalysis request) { + SystemAdmin systemAdmin = SecurityUtil.getLoginUserVo().getUser(); + request.setMerId(systemAdmin.getMerId()); + if (StrUtil.isBlank(request.getDateLimit())) { + request.setDateLimit("preMonth"); + } + return CommonResult.success(homeService.getMonthlyMaintenanceAnalysisCostLattice(request)); + } + + @ApiOperation(value = "维保成本top5和维保成本top公司柱状图") + @RequestMapping(value = "/cost/modelandcompany/histogram", method = RequestMethod.POST) + public CommonResult costModelAndCompanyHistogram(@RequestBody MonthlyMaintenanceAnalysis request) { + SystemAdmin systemAdmin = SecurityUtil.getLoginUserVo().getUser(); + request.setMerId(systemAdmin.getMerId()); + if (StrUtil.isBlank(request.getDateLimit())) { + request.setDateLimit("preMonth"); + } + return CommonResult.success(homeService.getModelAndCompanyHistogram(request)); + } + + @ApiOperation(value = "维修利润按车型和公司饼图") + @RequestMapping(value = "/profit/modelandcompany", method = RequestMethod.POST) + public CommonResult profitModelAndCompany(@RequestBody MonthlyMaintenanceAnalysis request) { + SystemAdmin systemAdmin = SecurityUtil.getLoginUserVo().getUser(); + request.setMerId(systemAdmin.getMerId()); + if (StrUtil.isBlank(request.getDateLimit())) { + request.setDateLimit("preMonth"); + } + return CommonResult.success(homeService.getMonthlyMaintenanceProfitModelAndCompany(request)); + } + + + @ApiOperation(value = "维保单车利润格子图") + @RequestMapping(value = "/profit/lattice", method = RequestMethod.POST) + public CommonResult indexDateProfit(@RequestBody MonthlyMaintenanceAnalysis request) { + SystemAdmin systemAdmin = SecurityUtil.getLoginUserVo().getUser(); + request.setMerId(systemAdmin.getMerId()); + if (StrUtil.isBlank(request.getDateLimit())) { + request.setDateLimit("preMonth"); + } + return CommonResult.success(homeService.getMonthlyMaintenanceAnalysisProfitLattice(request)); + } + + @ApiOperation(value = "维保利润top5车型和维保利润top5公司") + @RequestMapping(value = "/profit/modelandcompany/histogram", method = RequestMethod.POST) + public CommonResult profitModelAndCompanyHistogram(@RequestBody MonthlyMaintenanceAnalysis request) { + SystemAdmin systemAdmin = SecurityUtil.getLoginUserVo().getUser(); + request.setMerId(systemAdmin.getMerId()); + if (StrUtil.isBlank(request.getDateLimit())) { + request.setDateLimit("preMonth"); + } + return CommonResult.success(homeService.getProfitModelAndCompanyHistogram(request)); + } } diff --git a/lxk-admin/src/main/java/com/zbkj/admin/controller/platform/PlatformMonthlyMaintenanceAnalysis.java b/lxk-admin/src/main/java/com/zbkj/admin/controller/platform/PlatformMonthlyMaintenanceAnalysis.java index 2a9bed73..af960759 100644 --- a/lxk-admin/src/main/java/com/zbkj/admin/controller/platform/PlatformMonthlyMaintenanceAnalysis.java +++ b/lxk-admin/src/main/java/com/zbkj/admin/controller/platform/PlatformMonthlyMaintenanceAnalysis.java @@ -120,4 +120,65 @@ public class PlatformMonthlyMaintenanceAnalysis { } return CommonResult.success(homeService.getMonthlyMaintenanceCostModelAndCompany(request)); } + + @ApiOperation(value = "维保单车成本格子图") + @RequestMapping(value = "/cost/lattice", method = RequestMethod.POST) + public CommonResult indexDateCost(@RequestBody MonthlyMaintenanceAnalysis request) { + if (request.getMerId() == null) { + return CommonResult.success(new MonthlyMaintenanceAnalysisCostResponse()); + } + if (StrUtil.isBlank(request.getDateLimit())) { + request.setDateLimit("preMonth"); + } + return CommonResult.success(homeService.getMonthlyMaintenanceAnalysisCostLattice(request)); + } + + @ApiOperation(value = "维保成本top5和维保成本top公司柱状图") + @RequestMapping(value = "/cost/modelandcompany/histogram", method = RequestMethod.POST) + public CommonResult costModelAndCompanyHistogram(@RequestBody MonthlyMaintenanceAnalysis request) { + if (request.getMerId() == null) { + return CommonResult.success(new TopChartResponse()); + } + if (StrUtil.isBlank(request.getDateLimit())) { + request.setDateLimit("preMonth"); + } + return CommonResult.success(homeService.getModelAndCompanyHistogram(request)); + } + + @ApiOperation(value = "维修利润按车型和公司饼图") + @RequestMapping(value = "/profit/modelandcompany", method = RequestMethod.POST) + public CommonResult profitModelAndCompany(@RequestBody MonthlyMaintenanceAnalysis request) { + if (request.getMerId() == null) { + return CommonResult.success(new ModelAndCompanyPieResponse()); + } + if (StrUtil.isBlank(request.getDateLimit())) { + request.setDateLimit("preMonth"); + } + return CommonResult.success(homeService.getMonthlyMaintenanceProfitModelAndCompany(request)); + } + + + @ApiOperation(value = "维保单车成本格子图") + @RequestMapping(value = "/profit/lattice", method = RequestMethod.POST) + public CommonResult indexDateProfit(@RequestBody MonthlyMaintenanceAnalysis request) { + if (request.getMerId() == null) { + return CommonResult.success(new MonthlyMaintenanceAnalysisProfitResponse()); + } + if (StrUtil.isBlank(request.getDateLimit())) { + request.setDateLimit("preMonth"); + } + return CommonResult.success(homeService.getMonthlyMaintenanceAnalysisProfitLattice(request)); + } + + @ApiOperation(value = "维保利润top5车型和维保利润top5公司") + @RequestMapping(value = "/profit/modelandcompany/histogram", method = RequestMethod.POST) + public CommonResult profitModelAndCompanyHistogram(@RequestBody MonthlyMaintenanceAnalysis request) { + if (request.getMerId() == null) { + return CommonResult.success(new TopChartResponse()); + } + if (StrUtil.isBlank(request.getDateLimit())) { + request.setDateLimit("preMonth"); + } + return CommonResult.success(homeService.getProfitModelAndCompanyHistogram(request)); + } } diff --git a/lxk-admin/src/main/java/com/zbkj/admin/service/HomeService.java b/lxk-admin/src/main/java/com/zbkj/admin/service/HomeService.java index 3092e088..b906028d 100644 --- a/lxk-admin/src/main/java/com/zbkj/admin/service/HomeService.java +++ b/lxk-admin/src/main/java/com/zbkj/admin/service/HomeService.java @@ -92,4 +92,14 @@ public interface HomeService { TopChartResponse getMonthlyMaintenanceModelAndCompany(MonthlyMaintenanceAnalysis request); ModelAndCompanyPieResponse getMonthlyMaintenanceCostModelAndCompany(MonthlyMaintenanceAnalysis request); + + MonthlyMaintenanceAnalysisCostResponse getMonthlyMaintenanceAnalysisCostLattice(MonthlyMaintenanceAnalysis request); + + TopChartResponse getModelAndCompanyHistogram(MonthlyMaintenanceAnalysis request); + + ModelAndCompanyPieResponse getMonthlyMaintenanceProfitModelAndCompany(MonthlyMaintenanceAnalysis request); + + TopChartResponse getProfitModelAndCompanyHistogram(MonthlyMaintenanceAnalysis request); + + MonthlyMaintenanceAnalysisProfitResponse getMonthlyMaintenanceAnalysisProfitLattice(MonthlyMaintenanceAnalysis request); } diff --git a/lxk-admin/src/main/java/com/zbkj/admin/service/impl/HomeServiceImpl.java b/lxk-admin/src/main/java/com/zbkj/admin/service/impl/HomeServiceImpl.java index dadfe450..5c82ca65 100644 --- a/lxk-admin/src/main/java/com/zbkj/admin/service/impl/HomeServiceImpl.java +++ b/lxk-admin/src/main/java/com/zbkj/admin/service/impl/HomeServiceImpl.java @@ -211,7 +211,7 @@ public class HomeServiceImpl implements HomeService { @Override public LinkedHashMap getLineChart(BusinessAnalysisRequest request) { QueryWrapper qw = new QueryWrapper<>(); - qw.select("date_sn,DATE_FORMAT(date_sn, '%m') AS date_key,IFNULL(SUM(total_turnover),0) as total_turnover,IFNULL(SUM(costs),0) as costs,IFNULL(SUM(profit),0) as profit,mer_id"); + qw.select("DATE_FORMAT(date_sn, '%m') AS date_key,IFNULL(SUM(total_turnover),0) as total_turnover,IFNULL(SUM(costs),0) as costs,IFNULL(SUM(profit),0) as profit,mer_id"); qw.between("date_sn", DateUtil.beginOfYear(new Date()), DateUtil.endOfYear(new Date())); if (request.getMerId() != null) { qw.eq("mer_id", request.getMerId()); @@ -330,10 +330,9 @@ public class HomeServiceImpl implements HomeService { //维保单车产值 BusinessAnalysisVo avg = carReservationOrderService.getAverage(request); //维保单车产值按车型 - BusinessAnalysisVo avgModel = carReservationOrderService.getAverageModel(request); + List avgModel = carReservationOrderService.getAverageModel(request); //维保单车产值按公司 - BusinessAnalysisVo avgCompany = carReservationOrderService.getAverageCompany(request); - + List avgCompany = carReservationOrderService.getAverageCompany(request); response.setAverage(avg); response.setAverageModel(avgModel); @@ -351,6 +350,59 @@ public class HomeServiceImpl implements HomeService { return carReservationOrderService.queryCostModelAndCompany(request); } + @Override + public MonthlyMaintenanceAnalysisCostResponse getMonthlyMaintenanceAnalysisCostLattice(MonthlyMaintenanceAnalysis request) { + if (request.getType() == null || request.getType() < 1 || request.getType() > 3) { + throw new LxkException("维修类型不能为空"); + } + MonthlyMaintenanceAnalysisCostResponse response = new MonthlyMaintenanceAnalysisCostResponse(); + //维保单车产值 + BusinessAnalysisVo avg = carReservationOrderService.getCostAverage(request); + //维保单车产值按车型 + List avgModel = carReservationOrderService.getCostAverageModel(request); + //维保单车产值按公司 + List avgCompany = carReservationOrderService.getCostAverageCompany(request); + + response.setAverage(avg); + response.setAverageModel(avgModel); + response.setAverageModel(avgCompany); + return response; + } + + @Override + public TopChartResponse getModelAndCompanyHistogram(MonthlyMaintenanceAnalysis request) { + return carReservationOrderService.getModelAndCompanyHistogram(request); + } + + @Override + public ModelAndCompanyPieResponse getMonthlyMaintenanceProfitModelAndCompany(MonthlyMaintenanceAnalysis request) { + return carReservationOrderService.getProfitModelAndCompany(request); + } + + @Override + public TopChartResponse getProfitModelAndCompanyHistogram(MonthlyMaintenanceAnalysis request) { + return carReservationOrderService.queryProfitModelAndCompanyHistogram(request); + } + + @Override + public MonthlyMaintenanceAnalysisProfitResponse getMonthlyMaintenanceAnalysisProfitLattice(MonthlyMaintenanceAnalysis request) { + if (request.getType() == null || request.getType() < 1 || request.getType() > 3) { + throw new LxkException("维修类型不能为空"); + } + MonthlyMaintenanceAnalysisProfitResponse response = new MonthlyMaintenanceAnalysisProfitResponse(); + //维保单车产值 + BusinessAnalysisVo avg = carReservationOrderService.getProfitAverage(request); + //维保单车产值按车型 + List avgModel = carReservationOrderService.getProfitAverageModel(request); + //维保单车产值按公司 + List avgCompany = carReservationOrderService.getProfitAverageCompany(request); + + response.setAverage(avg); + response.setModel(avgModel); + response.setCompany(avgCompany); + return response; + } + public BrokenLineResponse boardInfo(String dateLat, Integer merId) { //工单数据 Integer totalRepairOrderNum = carReservationOrderService.getTotalRepairOrderNum(dateLat, merId); diff --git a/lxk-common/src/main/java/com/zbkj/common/response/MonthlyMaintenanceAnalysisAvgResponse.java b/lxk-common/src/main/java/com/zbkj/common/response/MonthlyMaintenanceAnalysisAvgResponse.java index 0e47e84d..f75dbc74 100644 --- a/lxk-common/src/main/java/com/zbkj/common/response/MonthlyMaintenanceAnalysisAvgResponse.java +++ b/lxk-common/src/main/java/com/zbkj/common/response/MonthlyMaintenanceAnalysisAvgResponse.java @@ -8,6 +8,7 @@ import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; +import java.util.List; @Data @EqualsAndHashCode(callSuper = false) @@ -20,8 +21,8 @@ public class MonthlyMaintenanceAnalysisAvgResponse implements Serializable { private BusinessAnalysisVo average; @ApiModelProperty(value = "按照车型") - private BusinessAnalysisVo averageModel; + private List averageModel; @ApiModelProperty(value = "按照所属公司") - private BusinessAnalysisVo averageCompany; + private List averageCompany; } diff --git a/lxk-common/src/main/java/com/zbkj/common/response/MonthlyMaintenanceAnalysisCostResponse.java b/lxk-common/src/main/java/com/zbkj/common/response/MonthlyMaintenanceAnalysisCostResponse.java new file mode 100644 index 00000000..25df35ab --- /dev/null +++ b/lxk-common/src/main/java/com/zbkj/common/response/MonthlyMaintenanceAnalysisCostResponse.java @@ -0,0 +1,28 @@ +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; +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "MonthlyMaintenanceAnalysisCostResponse", description = "MonthlyMaintenanceAnalysisCostResponse") +public class MonthlyMaintenanceAnalysisCostResponse implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "平均单车") + private BusinessAnalysisVo average; + + @ApiModelProperty(value = "按照车型分") + private List averageModel; + + @ApiModelProperty(value = "按照所属公司分") + private List averageCompany; +} diff --git a/lxk-common/src/main/java/com/zbkj/common/response/MonthlyMaintenanceAnalysisProfitResponse.java b/lxk-common/src/main/java/com/zbkj/common/response/MonthlyMaintenanceAnalysisProfitResponse.java new file mode 100644 index 00000000..d07926f6 --- /dev/null +++ b/lxk-common/src/main/java/com/zbkj/common/response/MonthlyMaintenanceAnalysisProfitResponse.java @@ -0,0 +1,28 @@ +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; +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "MonthlyMaintenanceAnalysisProfitResponse", description = "MonthlyMaintenanceAnalysisProfitResponse") +public class MonthlyMaintenanceAnalysisProfitResponse implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "平均单车利润") + private BusinessAnalysisVo average; + + @ApiModelProperty(value = "按照车型分") + private List model; + + @ApiModelProperty(value = "按照所属公司分") + private List company; +} diff --git a/lxk-common/src/main/java/com/zbkj/common/vo/BusinessAnalysisVo.java b/lxk-common/src/main/java/com/zbkj/common/vo/BusinessAnalysisVo.java index adf6f3d0..0576c4e8 100644 --- a/lxk-common/src/main/java/com/zbkj/common/vo/BusinessAnalysisVo.java +++ b/lxk-common/src/main/java/com/zbkj/common/vo/BusinessAnalysisVo.java @@ -19,4 +19,10 @@ public class BusinessAnalysisVo implements Serializable { @ApiModelProperty(value = "环比") private BigDecimal linkRelativeRatio; + @ApiModelProperty(value = "按车型分为车型id,按公司分为车商id") + private Integer id; + + @ApiModelProperty(value = "名称") + private String name; + } diff --git a/lxk-service/src/main/java/com/zbkj/service/service/CarReservationOrderService.java b/lxk-service/src/main/java/com/zbkj/service/service/CarReservationOrderService.java index 253db9f5..f454a057 100644 --- a/lxk-service/src/main/java/com/zbkj/service/service/CarReservationOrderService.java +++ b/lxk-service/src/main/java/com/zbkj/service/service/CarReservationOrderService.java @@ -8,9 +8,7 @@ import com.zbkj.common.request.MonthlyMaintenanceAnalysis; import com.zbkj.common.request.PageParamRequest; import com.zbkj.common.request.accessory.OrderReceiveRequest; import com.zbkj.common.request.car.*; -import com.zbkj.common.response.ModelAndCompanyPieResponse; -import com.zbkj.common.response.PieChartResponse; -import com.zbkj.common.response.TopChartResponse; +import com.zbkj.common.response.*; import com.zbkj.common.response.car.*; import com.zbkj.common.vo.BusinessAnalysisVo; @@ -411,11 +409,29 @@ public interface CarReservationOrderService extends IService getAverageModel(MonthlyMaintenanceAnalysis request); - BusinessAnalysisVo getAverageCompany(MonthlyMaintenanceAnalysis request); + List getAverageCompany(MonthlyMaintenanceAnalysis request); TopChartResponse queryModelAndCompany(MonthlyMaintenanceAnalysis request); ModelAndCompanyPieResponse queryCostModelAndCompany(MonthlyMaintenanceAnalysis request); + + TopChartResponse getModelAndCompanyHistogram(MonthlyMaintenanceAnalysis request); + + ModelAndCompanyPieResponse getProfitModelAndCompany(MonthlyMaintenanceAnalysis request); + + TopChartResponse queryProfitModelAndCompanyHistogram(MonthlyMaintenanceAnalysis request); + + BusinessAnalysisVo getProfitAverage(MonthlyMaintenanceAnalysis request); + + List getProfitAverageCompany(MonthlyMaintenanceAnalysis request); + + List getProfitAverageModel(MonthlyMaintenanceAnalysis request); + + BusinessAnalysisVo getCostAverage(MonthlyMaintenanceAnalysis request); + + List getCostAverageModel(MonthlyMaintenanceAnalysis request); + + List getCostAverageCompany(MonthlyMaintenanceAnalysis request); } diff --git a/lxk-service/src/main/java/com/zbkj/service/service/impl/CarReservationOrderServiceImpl.java b/lxk-service/src/main/java/com/zbkj/service/service/impl/CarReservationOrderServiceImpl.java index 8ed2cb7b..005c5ac3 100644 --- a/lxk-service/src/main/java/com/zbkj/service/service/impl/CarReservationOrderServiceImpl.java +++ b/lxk-service/src/main/java/com/zbkj/service/service/impl/CarReservationOrderServiceImpl.java @@ -40,10 +40,7 @@ import com.zbkj.common.request.accessory.AccessorySubStockRequest; import com.zbkj.common.request.accessory.OrderReceiveRequest; import com.zbkj.common.request.accessory.ProjectReceiveRequest; import com.zbkj.common.request.car.*; -import com.zbkj.common.response.ModelAndCompanyPieResponse; -import com.zbkj.common.response.PieChartResponse; -import com.zbkj.common.response.SeriesResponse; -import com.zbkj.common.response.TopChartResponse; +import com.zbkj.common.response.*; import com.zbkj.common.response.accessory.AccessoryStorageInResponse; import com.zbkj.common.response.car.*; import com.zbkj.common.result.CommonResultCode; @@ -3912,17 +3909,242 @@ public class CarReservationOrderServiceImpl extends ServiceImpl current = averageTask(request, null); + //上一年 + CompletableFuture year = averageTask(request, DateConstants.SEARCH_DATE_PRE_YEAR); + //上一月 + CompletableFuture month = averageTask(request, DateConstants.SEARCH_DATE_PRE_MONTH); + + CompletableFuture.allOf(current, year, month).join(); + try { + //当前数据 + vo.setCurrentData(current.get()); + vo.setYearOnYear(LxkUtil.getRateBig(current.get(), year.get())); + vo.setLinkRelativeRatio(LxkUtil.getRateBig(current.get(), month.get())); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + vo = null; + } + return vo; + } + + private CompletableFuture averageTask(MonthlyMaintenanceAnalysis request, String dateOffset) { + return CompletableFuture.supplyAsync(() -> average(request.getDateLimit(), request.getMerId(), dateOffset, request.getType()), service); } @Override - public BusinessAnalysisVo getAverageModel(MonthlyMaintenanceAnalysis request) { - return null; + public List getAverageModel(MonthlyMaintenanceAnalysis request) { + List vo = new ArrayList<>(); + //当前 + CompletableFuture> current = averageModelTask(request, null); + //上一年 + CompletableFuture> year = averageModelTask(request, DateConstants.SEARCH_DATE_PRE_YEAR); + //上一月 + CompletableFuture> month = averageModelTask(request, DateConstants.SEARCH_DATE_PRE_MONTH); + + CompletableFuture.allOf(current, year, month).join(); + + try { + Map currentMap = Optional.ofNullable(current.get()).orElse(CollUtil.newHashMap()); + Map yearMap = Optional.ofNullable(year.get()).orElse(CollUtil.newHashMap()); + Map monthMap = Optional.ofNullable(month.get()).orElse(CollUtil.newHashMap()); + + for (Integer item : currentMap.keySet()) { + BusinessAnalysisVo currenVo = currentMap.get(item); + if (currenVo.getCurrentData() == null) { + currenVo.setCurrentData(BigDecimal.ZERO); + } + BusinessAnalysisVo yearVo = yearMap.get(item); + BusinessAnalysisVo monthVo = monthMap.get(item); + currenVo.setYearOnYear(LxkUtil.getRateBig(currenVo.getCurrentData(), Optional.ofNullable(yearVo).map(BusinessAnalysisVo::getCurrentData).orElse(BigDecimal.ZERO))); + currenVo.setLinkRelativeRatio(LxkUtil.getRateBig(currenVo.getCurrentData(), Optional.ofNullable(monthVo).map(BusinessAnalysisVo::getCurrentData).orElse(BigDecimal.ZERO))); + vo.add(currenVo); + } + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + vo = null; + } + return vo; + } + + private CompletableFuture> averageModelTask(MonthlyMaintenanceAnalysis request, String dateOffset) { + return CompletableFuture.supplyAsync(() -> averageModel(request.getDateLimit(), request.getMerId(), dateOffset, request.getType()), service); + } + + private Map averageModel(String dateLimit, Integer merId, String dateOffset, Integer type) { + Map resp = new HashMap<>(); + List orderList = queryOrderByMerIdAndType(dateLimit, merId, dateOffset, type); + if (CollUtil.isEmpty(orderList)) { + return resp; + } + + List orderIdList = orderList.stream().map(CarReservationOrder::getId).collect(Collectors.toList()); + QueryWrapper qw = new QueryWrapper<>(); + qw.select("SUM(CASE WHEN new_total_over_price IS NOT NULL AND new_total_over_price <> 0 THEN new_total_over_price ELSE total_over_price END) total_over_price"); + qw.in("car_reservation_order_id", orderIdList); + qw.groupBy("car_reservation_order_id"); + List infoList = carReservationInfoService.list(qw); + if (CollUtil.isEmpty(infoList)) { + return resp; + } + Map infoMap = infoList.stream().collect(Collectors.toMap(CarReservationInfo::getCarReservationOrderId, CarReservationInfo::getTotalOverPrice)); + for (CarReservationOrder order : orderList) { + BigDecimal price = infoMap.get(order.getId()); + if (price != null) { + order.setTotalPrice(price); + } else { + order.setTotalPrice(BigDecimal.ZERO); + } + } + + Map carNoNum = orderList.stream().collect(Collectors.toMap(CarReservationOrder::getCarNo, el -> 1l, Long::sum)); + Map carNoJoinProfit = orderList.stream().collect(Collectors.groupingBy(CarReservationOrder::getCarNo, Collectors.mapping(CarReservationOrder::getTotalPrice, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)))); + + Map carMap = carService.queryCarMapByCarNo(carNoJoinProfit.keySet()); + Map modelMap = new HashMap<>(); + Map modelNumMap = new HashMap<>(); + for (String carNo : carNoJoinProfit.keySet()) { + Car car = carMap.get(carNo); + BigDecimal price = carNoJoinProfit.get(carNo); + Long num = carNoNum.get(carNo); + if (car != null && car.getVehicleModelId() != null) { + modelMap.merge(car.getVehicleModelId(), price, BigDecimal::add); + modelNumMap.merge(car.getVehicleModelId(), new BigDecimal(num), BigDecimal::add); + } else { + modelMap.merge(-1, price, BigDecimal::add); + modelNumMap.merge(-1, new BigDecimal(num), BigDecimal::add); + } + } + + List vehicleModelList = vehicleModelService.listByIds(carNoJoinProfit.keySet()); + for (VehicleModel model : vehicleModelList) { + BusinessAnalysisVo vo = new BusinessAnalysisVo(); + vo.setId(model.getId()); + vo.setName(model.getName()); + BigDecimal price = modelMap.get(model.getId()); + BigDecimal num = modelNumMap.get(model.getId()); + if (price == null || num == null || num.compareTo(BigDecimal.ZERO) == 0) { + vo.setCurrentData(BigDecimal.ZERO); + } else { + vo.setCurrentData(price.divide(num).setScale(2, BigDecimal.ROUND_DOWN)); + } + resp.put(model.getId(), vo); + } + return resp; } @Override - public BusinessAnalysisVo getAverageCompany(MonthlyMaintenanceAnalysis request) { - return null; + public List getAverageCompany(MonthlyMaintenanceAnalysis request) { + List vo = new ArrayList<>(); + //当前 + CompletableFuture> current = averageCompanyTask(request, null); + //上一年 + CompletableFuture> year = averageModelTask(request, DateConstants.SEARCH_DATE_PRE_YEAR); + //上一月 + CompletableFuture> month = averageModelTask(request, DateConstants.SEARCH_DATE_PRE_MONTH); + + CompletableFuture.allOf(current, year, month).join(); + + try { + Map currentMap = Optional.ofNullable(current.get()).orElse(CollUtil.newHashMap()); + Map yearMap = Optional.ofNullable(year.get()).orElse(CollUtil.newHashMap()); + Map monthMap = Optional.ofNullable(month.get()).orElse(CollUtil.newHashMap()); + + for (Integer item : currentMap.keySet()) { + BusinessAnalysisVo currenVo = currentMap.get(item); + if (currenVo.getCurrentData() == null) { + currenVo.setCurrentData(BigDecimal.ZERO); + } + BusinessAnalysisVo yearVo = yearMap.get(item); + BusinessAnalysisVo monthVo = monthMap.get(item); + currenVo.setYearOnYear(LxkUtil.getRateBig(currenVo.getCurrentData(), Optional.ofNullable(yearVo).map(BusinessAnalysisVo::getCurrentData).orElse(BigDecimal.ZERO))); + currenVo.setLinkRelativeRatio(LxkUtil.getRateBig(currenVo.getCurrentData(), Optional.ofNullable(monthVo).map(BusinessAnalysisVo::getCurrentData).orElse(BigDecimal.ZERO))); + vo.add(currenVo); + } + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + vo = null; + } + return vo; + } + + private CompletableFuture> averageCompanyTask(MonthlyMaintenanceAnalysis request, String dateOffset) { + return CompletableFuture.supplyAsync(() -> averageCompany(request.getDateLimit(), request.getMerId(), dateOffset, request.getType()), service); + } + + private Map averageCompany(String dateLimit, Integer merId, String dateOffset, Integer type) { + Map resp = new HashMap<>(); + List orderList = queryOrderByMerIdAndType(dateLimit, merId, dateOffset, type); + if (CollUtil.isEmpty(orderList)) { + return resp; + } + + List orderIdList = orderList.stream().map(CarReservationOrder::getId).collect(Collectors.toList()); + QueryWrapper qw = new QueryWrapper<>(); + qw.select("SUM(CASE WHEN new_total_over_price IS NOT NULL AND new_total_over_price <> 0 THEN new_total_over_price ELSE total_over_price END) total_over_price"); + qw.in("car_reservation_order_id", orderIdList); + qw.groupBy("car_reservation_order_id"); + List infoList = carReservationInfoService.list(qw); + if (CollUtil.isEmpty(infoList)) { + return resp; + } + Map infoMap = infoList.stream().collect(Collectors.toMap(CarReservationInfo::getCarReservationOrderId, CarReservationInfo::getTotalOverPrice)); + for (CarReservationOrder order : orderList) { + BigDecimal price = infoMap.get(order.getId()); + if (price != null) { + order.setTotalPrice(price); + } else { + order.setTotalPrice(BigDecimal.ZERO); + } + } + + Map carNoNum = orderList.stream().collect(Collectors.toMap(CarReservationOrder::getCarNo, el -> 1l, Long::sum)); + Map carNoJoinProfit = orderList.stream().collect(Collectors.groupingBy(CarReservationOrder::getCarNo, Collectors.mapping(CarReservationOrder::getTotalPrice, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)))); + + Map carMap = carService.queryCarMapByCarNo(carNoJoinProfit.keySet()); + Map carDealerMap = new HashMap<>(); + Map carDealerNumMap = new HashMap<>(); + for (String carNo : carNoJoinProfit.keySet()) { + Car car = carMap.get(carNo); + BigDecimal price = carNoJoinProfit.get(carNo); + Long num = carNoNum.get(carNo); + if (car != null && car.getCarDealerId() != null) { + carDealerMap.merge(car.getCarDealerId(), price, BigDecimal::add); + carDealerNumMap.merge(car.getCarDealerId(), new BigDecimal(num), BigDecimal::add); + } else { + carDealerMap.merge(-1, price, BigDecimal::add); + carDealerNumMap.merge(-1, new BigDecimal(num), BigDecimal::add); + } + } + + List carDealerList = carDealerService.listByIds(carNoJoinProfit.keySet()); + for (CarDealer dealer : carDealerList) { + BusinessAnalysisVo vo = new BusinessAnalysisVo(); + vo.setId(dealer.getId()); + vo.setName(dealer.getName()); + BigDecimal price = carDealerMap.get(dealer.getId()); + BigDecimal num = carDealerNumMap.get(dealer.getId()); + if (price == null || num == null || num.compareTo(BigDecimal.ZERO) == 0) { + vo.setCurrentData(BigDecimal.ZERO); + } else { + vo.setCurrentData(price.divide(num).setScale(2, BigDecimal.ROUND_DOWN)); + } + resp.put(dealer.getId(), vo); + } + BusinessAnalysisVo vo = new BusinessAnalysisVo(); + vo.setId(-1); + vo.setName("私家车"); + BigDecimal price = carDealerMap.get(-1); + BigDecimal num = carDealerNumMap.get(-1); + if (price == null || num == null || num.compareTo(BigDecimal.ZERO) == 0) { + vo.setCurrentData(BigDecimal.ZERO); + } else { + vo.setCurrentData(price.divide(num).setScale(2, BigDecimal.ROUND_DOWN)); + } + resp.put(-1, vo); + return resp; } @Override @@ -3953,9 +4175,17 @@ public class CarReservationOrderServiceImpl extends ServiceImpl modelPie = new ArrayList<>(); @@ -4060,6 +4298,898 @@ public class CarReservationOrderServiceImpl extends ServiceImpl orderList = queryOrderByMerIdAndType(request.getDateLimit(), request.getMerId(), null, request.getType()); + if (CollUtil.isEmpty(orderList)) { + return resp; + } + Map orderTemp = orderList.stream().collect(Collectors.toMap(CarReservationOrder::getId, CarReservationOrder::getCarNo)); + //全部配件 + Map accList = accessoryService.getListAll(null, request.getMerId()); + if (CollUtil.isEmpty(accList)) { + return resp; + } + Map accIdJoinCost = new HashMap<>(); + Map accIdJoinNum = new HashMap<>(); + //套餐材料 + List packageList = carReservationProjectPackageItemAccessoryService.getByOrderIds(orderTemp.keySet(), accList.keySet()); + for (CarReservationProjectPackageItemAccessory item : packageList) { + Accessory accessory = accList.get(item.getAccessoryId()); + if (ObjectUtil.isNull(accessory)) { + continue; + } + //套餐材料无法更换,且一次性领完 + accIdJoinCost.merge(accessory.getId(), accessory.getProcurePrice().multiply(new BigDecimal(item.getNum())), BigDecimal::add); + accIdJoinNum.merge(accessory.getId(), new BigDecimal(item.getNum()), BigDecimal::add); + + } + //非套餐材料 + List projectList = carReservationInfoProjectAccessoryService.getByOrderIds(orderTemp.keySet(), accList.keySet()); + for (CarReservationInfoProjectAccessory item : projectList) { + Integer accId = item.getAccessoryId(); + Integer num = item.getNum(); + if (item.getAccessoryPickId() != 0 && !item.getAccessoryPickId().equals(item.getAccessoryId())) { + accId = item.getAccessoryPickId(); + num = item.getPickingNum(); + } + Accessory accessory = accList.get(accId); + if (ObjectUtil.isNull(accessory)) { + continue; + } + accIdJoinCost.merge(accessory.getId(), accessory.getProcurePrice().multiply(new BigDecimal(num)), BigDecimal::add); + accIdJoinNum.merge(accessory.getId(), new BigDecimal(num), BigDecimal::add); + } + Map topCost = LxkUtil.sortByValue(accIdJoinCost, Boolean.TRUE, 10); + Map topNum = LxkUtil.sortByValue(accIdJoinCost, Boolean.TRUE, 10); + SeriesResponse costResp = new SeriesResponse(); + SeriesResponse accNumResp = new SeriesResponse(); + for (Integer accId : topCost.keySet()) { + BigDecimal cost = topCost.get(accId); + BigDecimal num = topNum.get(accId); + Accessory accessory = accList.get(accId); + if (accessory != null) { + if (cost != null) { + costResp.addData(accessory.getName(), cost); + } else if (num != null) { + accNumResp.addData(accessory.getName(), num); + } + } + } + + resp.setTopOne(costResp); + resp.setTopOne(accNumResp); + return resp; + } + + @Override + public ModelAndCompanyPieResponse getProfitModelAndCompany(MonthlyMaintenanceAnalysis request) { + ModelAndCompanyPieResponse resp = new ModelAndCompanyPieResponse(); + List orderList = queryOrderByMerIdAndType(request.getDateLimit(), request.getMerId(), null, request.getType()); + if (CollUtil.isEmpty(orderList)) { + return resp; + } + Map orderTemp = orderList.stream().collect(Collectors.toMap(CarReservationOrder::getId, CarReservationOrder::getCarNo)); + //全部配件 + Map accList = accessoryService.getListAll(null, request.getMerId()); + if (CollUtil.isEmpty(accList)) { + return resp; + } + Map carNoJoinCost = new HashMap<>(); + //套餐材料 + List packageList = carReservationProjectPackageItemAccessoryService.getByOrderIds(orderTemp.keySet(), accList.keySet()); + for (CarReservationProjectPackageItemAccessory item : packageList) { + Accessory accessory = accList.get(item.getAccessoryId()); + if (ObjectUtil.isNull(accessory)) { + continue; + } + //套餐材料无法更换,且一次性领完 + String carNo = orderTemp.get(item.getCarReservationOrderId()); + if (StrUtil.isNotBlank(carNo)) { + BigDecimal cost = accessory.getProcurePrice().multiply(new BigDecimal(item.getNum())); + BigDecimal price = accessory.getPrice().multiply(new BigDecimal(item.getNum())); + carNoJoinCost.merge(carNo, price.subtract(cost), BigDecimal::add); + } + } + //非套餐材料 + List projectList = carReservationInfoProjectAccessoryService.getByOrderIds(orderTemp.keySet(), accList.keySet()); + for (CarReservationInfoProjectAccessory item : projectList) { + Integer accId = item.getAccessoryId(); + Integer num = item.getNum(); + if (item.getAccessoryPickId() != 0 && !item.getAccessoryPickId().equals(item.getAccessoryId())) { + accId = item.getAccessoryPickId(); + num = item.getPickingNum(); + } + Accessory accessory = accList.get(accId); + if (ObjectUtil.isNull(accessory)) { + continue; + } + String carNo = orderTemp.get(item.getCarReservationOrderId()); + if (StrUtil.isNotBlank(carNo)) { + BigDecimal cost = accessory.getProcurePrice().multiply(new BigDecimal(num)); + BigDecimal price = accessory.getPrice().multiply(new BigDecimal(num)); + carNoJoinCost.merge(carNo, price.subtract(cost), BigDecimal::add); + } + } + Map carMap = carService.queryCarMapByCarNo(carNoJoinCost.keySet()); + Map modelMap = new HashMap<>(); + Map carDealerMap = new HashMap<>(); + for (String carNo : carNoJoinCost.keySet()) { + Car car = carMap.get(carNo); + BigDecimal price = carNoJoinCost.get(carNo); + if (car != null) { + if (car.getVehicleModelId() != null) { + modelMap.merge(car.getVehicleModelId(), price, BigDecimal::add); + } else { + modelMap.merge(-1, price, BigDecimal::add); + } + if (car.getCarDealerId() != null) { + carDealerMap.merge(car.getCarDealerId(), price, BigDecimal::add); + } else { + carDealerMap.merge(-1, price, BigDecimal::add); + } + } else { + modelMap.merge(-1, price, BigDecimal::add); + carDealerMap.merge(-1, price, BigDecimal::add); + } + } + ArrayList modelPie = new ArrayList<>(); + List modelList = vehicleModelService.listByIds(modelMap.keySet()); + for (VehicleModel model : modelList) { + PieChartResponse pie = new PieChartResponse(); + pie.addData(model.getName(), modelMap.get(model.getId())); + modelPie.add(pie); + } + ArrayList companyPie = new ArrayList<>(); + List carDealerList = carDealerService.listByIds(carNoJoinCost.keySet()); + for (CarDealer dealer : carDealerList) { + PieChartResponse pie = new PieChartResponse(); + pie.addData(dealer.getName(), carDealerMap.get(dealer.getId())); + companyPie.add(pie); + } + resp.setModelPie(modelPie); + resp.setCompanyPie(companyPie); + return resp; + } + + @Override + public TopChartResponse queryProfitModelAndCompanyHistogram(MonthlyMaintenanceAnalysis request) { + TopChartResponse resp = new TopChartResponse(); + List orderList = queryOrderByMerIdAndType(request.getDateLimit(), request.getMerId(), null, request.getType()); + if (CollUtil.isEmpty(orderList)) { + return resp; + } + Map orderTemp = orderList.stream().collect(Collectors.toMap(CarReservationOrder::getId, CarReservationOrder::getCarNo)); + //全部配件 + Map accList = accessoryService.getListAll(null, request.getMerId()); + if (CollUtil.isEmpty(accList)) { + return resp; + } + Map carNoJoinCost = new HashMap<>(); + //套餐材料 + List packageList = carReservationProjectPackageItemAccessoryService.getByOrderIds(orderTemp.keySet(), accList.keySet()); + for (CarReservationProjectPackageItemAccessory item : packageList) { + Accessory accessory = accList.get(item.getAccessoryId()); + if (ObjectUtil.isNull(accessory)) { + continue; + } + //套餐材料无法更换,且一次性领完 + String carNo = orderTemp.get(item.getCarReservationOrderId()); + if (StrUtil.isNotBlank(carNo)) { + BigDecimal cost = accessory.getProcurePrice().multiply(new BigDecimal(item.getNum())); + BigDecimal price = accessory.getPrice().multiply(new BigDecimal(item.getNum())); + carNoJoinCost.merge(carNo, price.subtract(cost), BigDecimal::add); + } + } + //非套餐材料 + List projectList = carReservationInfoProjectAccessoryService.getByOrderIds(orderTemp.keySet(), accList.keySet()); + for (CarReservationInfoProjectAccessory item : projectList) { + Integer accId = item.getAccessoryId(); + Integer num = item.getNum(); + if (item.getAccessoryPickId() != 0 && !item.getAccessoryPickId().equals(item.getAccessoryId())) { + accId = item.getAccessoryPickId(); + num = item.getPickingNum(); + } + Accessory accessory = accList.get(accId); + if (ObjectUtil.isNull(accessory)) { + continue; + } + String carNo = orderTemp.get(item.getCarReservationOrderId()); + if (StrUtil.isNotBlank(carNo)) { + BigDecimal cost = accessory.getProcurePrice().multiply(new BigDecimal(num)); + BigDecimal price = accessory.getPrice().multiply(new BigDecimal(num)); + carNoJoinCost.merge(carNo, price.subtract(cost), BigDecimal::add); + } + } + Map carMap = carService.queryCarMapByCarNo(carNoJoinCost.keySet()); + Map modelMap = new HashMap<>(); + Map carDealerMap = new HashMap<>(); + for (String carNo : carNoJoinCost.keySet()) { + Car car = carMap.get(carNo); + BigDecimal price = carNoJoinCost.get(carNo); + if (car != null) { + if (car.getVehicleModelId() != null) { + modelMap.merge(car.getVehicleModelId(), price, BigDecimal::add); + } else { + modelMap.merge(-1, price, BigDecimal::add); + } + if (car.getCarDealerId() != null) { + carDealerMap.merge(car.getCarDealerId(), price, BigDecimal::add); + } else { + carDealerMap.merge(car.getCarDealerId(), price, BigDecimal::add); + } + } else { + modelMap.merge(-1, price, BigDecimal::add); + carDealerMap.merge(-1, price, BigDecimal::add); + } + } + Map topModelMap = LxkUtil.sortByValue(modelMap, Boolean.TRUE, 5); + Map topDealerMap = LxkUtil.sortByValue(carDealerMap, Boolean.TRUE, 5); + List modelList = vehicleModelService.listByIds(topModelMap.keySet()); + SeriesResponse topModel = new SeriesResponse(); + for (VehicleModel model : modelList) { + topModel.addData(model.getName(), topModelMap.get(model.getId())); + } + + List carDealerList = carDealerService.listByIds(topDealerMap.keySet()); + SeriesResponse topDealer = new SeriesResponse(); + for (CarDealer dealer : carDealerList) { + topDealer.addData(dealer.getName(), topDealerMap.get(dealer.getId())); + } + resp.setTopOne(topModel); + resp.setTopTwo(topDealer); + return resp; + } + + @Override + public BusinessAnalysisVo getProfitAverage(MonthlyMaintenanceAnalysis request) { + BusinessAnalysisVo vo = new BusinessAnalysisVo(); + //当前 + CompletableFuture current = averageProfitTask(request, null); + //上一年 + CompletableFuture year = averageProfitTask(request, DateConstants.SEARCH_DATE_PRE_YEAR); + //上一月 + CompletableFuture month = averageProfitTask(request, DateConstants.SEARCH_DATE_PRE_MONTH); + + CompletableFuture.allOf(current, year, month).join(); + try { + //当前数据 + vo.setCurrentData(current.get()); + vo.setYearOnYear(LxkUtil.getRateBig(current.get(), year.get())); + vo.setLinkRelativeRatio(LxkUtil.getRateBig(current.get(), month.get())); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + vo = null; + } + return vo; + } + + private CompletableFuture averageProfitTask(MonthlyMaintenanceAnalysis request, String dateOffset) { + return CompletableFuture.supplyAsync(() -> averageProfit(request.getDateLimit(), request.getMerId(), dateOffset, request.getType()), service); + } + + private BigDecimal averageProfit(String dateLimit, Integer merId, String dateOffset, Integer type) { + BigDecimal profit = BigDecimal.ZERO; + List orderList = queryOrderByMerIdAndType(dateLimit, merId, null, type); + if (CollUtil.isEmpty(orderList)) { + return profit; + } + Map orderTemp = orderList.stream().collect(Collectors.toMap(CarReservationOrder::getId, CarReservationOrder::getCarNo)); + //全部配件 + Map accList = accessoryService.getListAll(null, merId); + if (CollUtil.isEmpty(accList)) { + return profit; + } + //套餐材料 + List packageList = carReservationProjectPackageItemAccessoryService.getByOrderIds(orderTemp.keySet(), accList.keySet()); + for (CarReservationProjectPackageItemAccessory item : packageList) { + Accessory accessory = accList.get(item.getAccessoryId()); + if (ObjectUtil.isNull(accessory)) { + continue; + } + //套餐材料无法更换,且一次性领完 + BigDecimal cost = accessory.getProcurePrice().multiply(new BigDecimal(item.getNum())); + BigDecimal price = accessory.getPrice().multiply(new BigDecimal(item.getNum())); + profit = profit.add(price.subtract(cost)); + } + //非套餐材料 + List projectList = carReservationInfoProjectAccessoryService.getByOrderIds(orderTemp.keySet(), accList.keySet()); + for (CarReservationInfoProjectAccessory item : projectList) { + Integer accId = item.getAccessoryId(); + Integer num = item.getNum(); + if (item.getAccessoryPickId() != 0 && !item.getAccessoryPickId().equals(item.getAccessoryId())) { + accId = item.getAccessoryPickId(); + num = item.getPickingNum(); + } + Accessory accessory = accList.get(accId); + if (ObjectUtil.isNull(accessory)) { + continue; + } + BigDecimal cost = accessory.getProcurePrice().multiply(new BigDecimal(num)); + BigDecimal price = accessory.getPrice().multiply(new BigDecimal(num)); + profit = profit.add(price.subtract(cost)); + } + + if (profit == null) { + return BigDecimal.ZERO; + } + return profit.divide(new BigDecimal(orderList.size())).setScale(2, BigDecimal.ROUND_DOWN); + } + + @Override + public List getProfitAverageCompany(MonthlyMaintenanceAnalysis request) { + List vo = new ArrayList<>(); + //当前 + CompletableFuture> current = profitAverageCompanyTask(request, null); + //上一年 + CompletableFuture> year = profitAverageCompanyTask(request, DateConstants.SEARCH_DATE_PRE_YEAR); + //上一月 + CompletableFuture> month = profitAverageCompanyTask(request, DateConstants.SEARCH_DATE_PRE_MONTH); + + CompletableFuture.allOf(current, year, month).join(); + + try { + Map currentMap = Optional.ofNullable(current.get()).orElse(CollUtil.newHashMap()); + Map yearMap = Optional.ofNullable(year.get()).orElse(CollUtil.newHashMap()); + Map monthMap = Optional.ofNullable(month.get()).orElse(CollUtil.newHashMap()); + + for (Integer item : currentMap.keySet()) { + BusinessAnalysisVo currenVo = currentMap.get(item); + if (currenVo.getCurrentData() == null) { + currenVo.setCurrentData(BigDecimal.ZERO); + } + BusinessAnalysisVo yearVo = yearMap.get(item); + BusinessAnalysisVo monthVo = monthMap.get(item); + currenVo.setYearOnYear(LxkUtil.getRateBig(currenVo.getCurrentData(), Optional.ofNullable(yearVo).map(BusinessAnalysisVo::getCurrentData).orElse(BigDecimal.ZERO))); + currenVo.setLinkRelativeRatio(LxkUtil.getRateBig(currenVo.getCurrentData(), Optional.ofNullable(monthVo).map(BusinessAnalysisVo::getCurrentData).orElse(BigDecimal.ZERO))); + vo.add(currenVo); + } + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + vo = null; + } + return vo; + } + + private CompletableFuture> profitAverageCompanyTask(MonthlyMaintenanceAnalysis request, String dateOffset) { + return CompletableFuture.supplyAsync(() -> profitAverageCompany(request.getDateLimit(), request.getMerId(), dateOffset, request.getType()), service); + } + + private Map profitAverageCompany(String dateLimit, Integer merId, String dateOffset, Integer type) { + Map resp = new HashMap<>(); + List orderList = queryOrderByMerIdAndType(dateLimit, merId, null, type); + if (CollUtil.isEmpty(orderList)) { + return resp; + } + Map orderTemp = orderList.stream().collect(Collectors.toMap(CarReservationOrder::getId, CarReservationOrder::getCarNo)); + Map carNoNum = orderList.stream().collect(Collectors.toMap(CarReservationOrder::getCarNo, el -> 1l, Long::sum)); + Map carNoJoinProfit = new HashMap<>(); + //全部配件 + Map accList = accessoryService.getListAll(null, merId); + if (CollUtil.isEmpty(accList)) { + return resp; + } + //套餐材料 + List packageList = carReservationProjectPackageItemAccessoryService.getByOrderIds(orderTemp.keySet(), accList.keySet()); + for (CarReservationProjectPackageItemAccessory item : packageList) { + Accessory accessory = accList.get(item.getAccessoryId()); + if (ObjectUtil.isNull(accessory)) { + continue; + } + //套餐材料无法更换,且一次性领完 + String carNo = orderTemp.get(item.getCarReservationOrderId()); + if (StrUtil.isNotBlank(carNo)) { + BigDecimal cost = accessory.getProcurePrice().multiply(new BigDecimal(item.getNum())); + BigDecimal price = accessory.getPrice().multiply(new BigDecimal(item.getNum())); + carNoJoinProfit.merge(carNo, price.subtract(cost), BigDecimal::add); + } + } + //非套餐材料 + List projectList = carReservationInfoProjectAccessoryService.getByOrderIds(orderTemp.keySet(), accList.keySet()); + for (CarReservationInfoProjectAccessory item : projectList) { + Integer accId = item.getAccessoryId(); + Integer num = item.getNum(); + if (item.getAccessoryPickId() != 0 && !item.getAccessoryPickId().equals(item.getAccessoryId())) { + accId = item.getAccessoryPickId(); + num = item.getPickingNum(); + } + Accessory accessory = accList.get(accId); + if (ObjectUtil.isNull(accessory)) { + continue; + } + String carNo = orderTemp.get(item.getCarReservationOrderId()); + if (StrUtil.isNotBlank(carNo)) { + BigDecimal cost = accessory.getProcurePrice().multiply(new BigDecimal(num)); + BigDecimal price = accessory.getPrice().multiply(new BigDecimal(num)); + carNoJoinProfit.merge(carNo, price.subtract(cost), BigDecimal::add); + } + } + Map carMap = carService.queryCarMapByCarNo(carNoJoinProfit.keySet()); + Map carDealerMap = new HashMap<>(); + Map carDealerNumMap = new HashMap<>(); + for (String carNo : carNoJoinProfit.keySet()) { + Car car = carMap.get(carNo); + BigDecimal price = carNoJoinProfit.get(carNo); + Long num = carNoNum.get(carNo); + if (car != null && car.getCarDealerId() != null) { + carDealerMap.merge(car.getCarDealerId(), price, BigDecimal::add); + carDealerNumMap.merge(car.getCarDealerId(), new BigDecimal(num), BigDecimal::add); + } else { + carDealerMap.merge(-1, price, BigDecimal::add); + carDealerNumMap.merge(-1, new BigDecimal(num), BigDecimal::add); + } + } + + List carDealerList = carDealerService.listByIds(carNoJoinProfit.keySet()); + for (CarDealer dealer : carDealerList) { + BusinessAnalysisVo vo = new BusinessAnalysisVo(); + vo.setId(dealer.getId()); + vo.setName(dealer.getName()); + BigDecimal price = carDealerMap.get(dealer.getId()); + BigDecimal num = carDealerNumMap.get(dealer.getId()); + if (price == null || num == null || num.compareTo(BigDecimal.ZERO) == 0) { + vo.setCurrentData(BigDecimal.ZERO); + } else { + vo.setCurrentData(price.divide(num).setScale(2, BigDecimal.ROUND_DOWN)); + } + resp.put(dealer.getId(), vo); + } + BusinessAnalysisVo vo = new BusinessAnalysisVo(); + vo.setId(-1); + vo.setName("私家车"); + BigDecimal price = Optional.ofNullable(carDealerMap.get(-1)).orElse(BigDecimal.ZERO); + BigDecimal num = Optional.ofNullable(carDealerNumMap.get(-1)).orElse(BigDecimal.ZERO); + if (num.compareTo(BigDecimal.ZERO) == 0) { + vo.setCurrentData(BigDecimal.ZERO); + } else { + vo.setCurrentData(price.divide(num).setScale(2, BigDecimal.ROUND_DOWN)); + } + resp.put(-1, vo); + return resp; + } + + @Override + public List getProfitAverageModel(MonthlyMaintenanceAnalysis request) { + List vo = new ArrayList<>(); + //当前 + CompletableFuture> current = profitAverageModelTask(request, null); + //上一年 + CompletableFuture> year = profitAverageModelTask(request, DateConstants.SEARCH_DATE_PRE_YEAR); + //上一月 + CompletableFuture> month = profitAverageModelTask(request, DateConstants.SEARCH_DATE_PRE_MONTH); + + CompletableFuture.allOf(current, year, month).join(); + + try { + Map currentMap = Optional.ofNullable(current.get()).orElse(CollUtil.newHashMap()); + Map yearMap = Optional.ofNullable(year.get()).orElse(CollUtil.newHashMap()); + Map monthMap = Optional.ofNullable(month.get()).orElse(CollUtil.newHashMap()); + + for (Integer item : currentMap.keySet()) { + BusinessAnalysisVo currenVo = currentMap.get(item); + if (currenVo.getCurrentData() == null) { + currenVo.setCurrentData(BigDecimal.ZERO); + } + BusinessAnalysisVo yearVo = yearMap.get(item); + BusinessAnalysisVo monthVo = monthMap.get(item); + currenVo.setYearOnYear(LxkUtil.getRateBig(currenVo.getCurrentData(), Optional.ofNullable(yearVo).map(BusinessAnalysisVo::getCurrentData).orElse(BigDecimal.ZERO))); + currenVo.setLinkRelativeRatio(LxkUtil.getRateBig(currenVo.getCurrentData(), Optional.ofNullable(monthVo).map(BusinessAnalysisVo::getCurrentData).orElse(BigDecimal.ZERO))); + vo.add(currenVo); + } + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + vo = null; + } + return vo; + } + + @Override + public BusinessAnalysisVo getCostAverage(MonthlyMaintenanceAnalysis request) { + BusinessAnalysisVo vo = new BusinessAnalysisVo(); + //当前 + CompletableFuture current = averageCostTask(request, null); + //上一年 + CompletableFuture year = averageProfitTask(request, DateConstants.SEARCH_DATE_PRE_YEAR); + //上一月 + CompletableFuture month = averageProfitTask(request, DateConstants.SEARCH_DATE_PRE_MONTH); + + CompletableFuture.allOf(current, year, month).join(); + try { + //当前数据 + vo.setCurrentData(current.get()); + vo.setYearOnYear(LxkUtil.getRateBig(current.get(), year.get())); + vo.setLinkRelativeRatio(LxkUtil.getRateBig(current.get(), month.get())); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + vo = null; + } + return vo; + } + + @Override + public List getCostAverageModel(MonthlyMaintenanceAnalysis request) { + List vo = new ArrayList<>(); + //当前 + CompletableFuture> current = costAverageModelTask(request, null); + //上一年 + CompletableFuture> year = costAverageModelTask(request, DateConstants.SEARCH_DATE_PRE_YEAR); + //上一月 + CompletableFuture> month = costAverageModelTask(request, DateConstants.SEARCH_DATE_PRE_MONTH); + + CompletableFuture.allOf(current, year, month).join(); + + try { + Map currentMap = Optional.ofNullable(current.get()).orElse(CollUtil.newHashMap()); + Map yearMap = Optional.ofNullable(year.get()).orElse(CollUtil.newHashMap()); + Map monthMap = Optional.ofNullable(month.get()).orElse(CollUtil.newHashMap()); + + for (Integer item : currentMap.keySet()) { + BusinessAnalysisVo currenVo = currentMap.get(item); + if (currenVo.getCurrentData() == null) { + currenVo.setCurrentData(BigDecimal.ZERO); + } + BusinessAnalysisVo yearVo = yearMap.get(item); + BusinessAnalysisVo monthVo = monthMap.get(item); + currenVo.setYearOnYear(LxkUtil.getRateBig(currenVo.getCurrentData(), Optional.ofNullable(yearVo).map(BusinessAnalysisVo::getCurrentData).orElse(BigDecimal.ZERO))); + currenVo.setLinkRelativeRatio(LxkUtil.getRateBig(currenVo.getCurrentData(), Optional.ofNullable(monthVo).map(BusinessAnalysisVo::getCurrentData).orElse(BigDecimal.ZERO))); + vo.add(currenVo); + } + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + vo = null; + } + return vo; + } + + @Override + public List getCostAverageCompany(MonthlyMaintenanceAnalysis request) { + List vo = new ArrayList<>(); + //当前 + CompletableFuture> current = costAverageCompanyTask(request, null); + //上一年 + CompletableFuture> year = costAverageCompanyTask(request, DateConstants.SEARCH_DATE_PRE_YEAR); + //上一月 + CompletableFuture> month = costAverageCompanyTask(request, DateConstants.SEARCH_DATE_PRE_MONTH); + + CompletableFuture.allOf(current, year, month).join(); + + try { + Map currentMap = Optional.ofNullable(current.get()).orElse(CollUtil.newHashMap()); + Map yearMap = Optional.ofNullable(year.get()).orElse(CollUtil.newHashMap()); + Map monthMap = Optional.ofNullable(month.get()).orElse(CollUtil.newHashMap()); + + for (Integer item : currentMap.keySet()) { + BusinessAnalysisVo currenVo = currentMap.get(item); + if (currenVo.getCurrentData() == null) { + currenVo.setCurrentData(BigDecimal.ZERO); + } + BusinessAnalysisVo yearVo = yearMap.get(item); + BusinessAnalysisVo monthVo = monthMap.get(item); + currenVo.setYearOnYear(LxkUtil.getRateBig(currenVo.getCurrentData(), Optional.ofNullable(yearVo).map(BusinessAnalysisVo::getCurrentData).orElse(BigDecimal.ZERO))); + currenVo.setLinkRelativeRatio(LxkUtil.getRateBig(currenVo.getCurrentData(), Optional.ofNullable(monthVo).map(BusinessAnalysisVo::getCurrentData).orElse(BigDecimal.ZERO))); + vo.add(currenVo); + } + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + vo = null; + } + return vo; + } + + private CompletableFuture> costAverageCompanyTask(MonthlyMaintenanceAnalysis request, String dateOffset) { + return CompletableFuture.supplyAsync(() -> costAverageCompany(request.getDateLimit(), request.getMerId(), dateOffset, request.getType()), service); + } + + private Map costAverageCompany(String dateLimit, Integer merId, String dateOffset, Integer type) { + Map resp = new HashMap<>(); + List orderList = queryOrderByMerIdAndType(dateLimit, merId, null, type); + if (CollUtil.isEmpty(orderList)) { + return resp; + } + Map orderTemp = orderList.stream().collect(Collectors.toMap(CarReservationOrder::getId, CarReservationOrder::getCarNo)); + Map carNoNum = orderList.stream().collect(Collectors.toMap(CarReservationOrder::getCarNo, el -> 1l, Long::sum)); + Map carNoJoinProfit = new HashMap<>(); + //全部配件 + Map accList = accessoryService.getListAll(null, merId); + if (CollUtil.isEmpty(accList)) { + return resp; + } + //套餐材料 + List packageList = carReservationProjectPackageItemAccessoryService.getByOrderIds(orderTemp.keySet(), accList.keySet()); + for (CarReservationProjectPackageItemAccessory item : packageList) { + Accessory accessory = accList.get(item.getAccessoryId()); + if (ObjectUtil.isNull(accessory)) { + continue; + } + //套餐材料无法更换,且一次性领完 + String carNo = orderTemp.get(item.getCarReservationOrderId()); + if (StrUtil.isNotBlank(carNo)) { + BigDecimal cost = accessory.getProcurePrice().multiply(new BigDecimal(item.getNum())); + carNoJoinProfit.merge(carNo, cost, BigDecimal::add); + } + } + //非套餐材料 + List projectList = carReservationInfoProjectAccessoryService.getByOrderIds(orderTemp.keySet(), accList.keySet()); + for (CarReservationInfoProjectAccessory item : projectList) { + Integer accId = item.getAccessoryId(); + Integer num = item.getNum(); + if (item.getAccessoryPickId() != 0 && !item.getAccessoryPickId().equals(item.getAccessoryId())) { + accId = item.getAccessoryPickId(); + num = item.getPickingNum(); + } + Accessory accessory = accList.get(accId); + if (ObjectUtil.isNull(accessory)) { + continue; + } + String carNo = orderTemp.get(item.getCarReservationOrderId()); + if (StrUtil.isNotBlank(carNo)) { + BigDecimal cost = accessory.getProcurePrice().multiply(new BigDecimal(num)); + carNoJoinProfit.merge(carNo, cost, BigDecimal::add); + } + } + Map carMap = carService.queryCarMapByCarNo(carNoJoinProfit.keySet()); + Map carDealerMap = new HashMap<>(); + Map carDealerNumMap = new HashMap<>(); + for (String carNo : carNoJoinProfit.keySet()) { + Car car = carMap.get(carNo); + BigDecimal price = carNoJoinProfit.get(carNo); + Long num = carNoNum.get(carNo); + if (car != null && car.getCarDealerId() != null) { + carDealerMap.merge(car.getCarDealerId(), price, BigDecimal::add); + carDealerNumMap.merge(car.getCarDealerId(), new BigDecimal(num), BigDecimal::add); + } else { + carDealerMap.merge(-1, price, BigDecimal::add); + carDealerNumMap.merge(-1, new BigDecimal(num), BigDecimal::add); + } + } + + List carDealerList = carDealerService.listByIds(carNoJoinProfit.keySet()); + for (CarDealer dealer : carDealerList) { + BusinessAnalysisVo vo = new BusinessAnalysisVo(); + vo.setId(dealer.getId()); + vo.setName(dealer.getName()); + BigDecimal price = carDealerMap.get(dealer.getId()); + BigDecimal num = carDealerNumMap.get(dealer.getId()); + if (price == null || num == null || num.compareTo(BigDecimal.ZERO) == 0) { + vo.setCurrentData(BigDecimal.ZERO); + } else { + vo.setCurrentData(price.divide(num).setScale(2, BigDecimal.ROUND_DOWN)); + } + resp.put(dealer.getId(), vo); + } + BusinessAnalysisVo vo = new BusinessAnalysisVo(); + vo.setId(-1); + vo.setName("私家车"); + BigDecimal price = Optional.ofNullable(carDealerMap.get(-1)).orElse(BigDecimal.ZERO); + BigDecimal num = Optional.ofNullable(carDealerNumMap.get(-1)).orElse(BigDecimal.ZERO); + if (num.compareTo(BigDecimal.ZERO) == 0) { + vo.setCurrentData(BigDecimal.ZERO); + } else { + vo.setCurrentData(price.divide(num).setScale(2, BigDecimal.ROUND_DOWN)); + } + resp.put(-1, vo); + return resp; + } + + private CompletableFuture> costAverageModelTask(MonthlyMaintenanceAnalysis request, String dateOffset) { + return CompletableFuture.supplyAsync(() -> costAverageModel(request.getDateLimit(), request.getMerId(), dateOffset, request.getType()), service); + } + + private Map costAverageModel(String dateLimit, Integer merId, String dateOffset, Integer type) { + Map resp = new HashMap<>(); + List orderList = queryOrderByMerIdAndType(dateLimit, merId, dateOffset, type); + if (CollUtil.isEmpty(orderList)) { + return resp; + } + Map orderTemp = orderList.stream().collect(Collectors.toMap(CarReservationOrder::getId, CarReservationOrder::getCarNo)); + Map carNoNum = orderList.stream().collect(Collectors.toMap(CarReservationOrder::getCarNo, el -> 1l, Long::sum)); + Map carNoJoinProfit = new HashMap<>(); + //全部配件 + Map accList = accessoryService.getListAll(null, merId); + if (CollUtil.isEmpty(accList)) { + return resp; + } + //套餐材料 + List packageList = carReservationProjectPackageItemAccessoryService.getByOrderIds(orderTemp.keySet(), accList.keySet()); + for (CarReservationProjectPackageItemAccessory item : packageList) { + Accessory accessory = accList.get(item.getAccessoryId()); + if (ObjectUtil.isNull(accessory)) { + continue; + } + //套餐材料无法更换,且一次性领完 + String carNo = orderTemp.get(item.getCarReservationOrderId()); + if (StrUtil.isNotBlank(carNo)) { + BigDecimal cost = accessory.getProcurePrice().multiply(new BigDecimal(item.getNum())); + carNoJoinProfit.merge(carNo, cost, BigDecimal::add); + } + } + //非套餐材料 + List projectList = carReservationInfoProjectAccessoryService.getByOrderIds(orderTemp.keySet(), accList.keySet()); + for (CarReservationInfoProjectAccessory item : projectList) { + Integer accId = item.getAccessoryId(); + Integer num = item.getNum(); + if (item.getAccessoryPickId() != 0 && !item.getAccessoryPickId().equals(item.getAccessoryId())) { + accId = item.getAccessoryPickId(); + num = item.getPickingNum(); + } + Accessory accessory = accList.get(accId); + if (ObjectUtil.isNull(accessory)) { + continue; + } + String carNo = orderTemp.get(item.getCarReservationOrderId()); + if (StrUtil.isNotBlank(carNo)) { + BigDecimal cost = accessory.getProcurePrice().multiply(new BigDecimal(num)); + carNoJoinProfit.merge(carNo, cost, BigDecimal::add); + } + } + Map carMap = carService.queryCarMapByCarNo(carNoJoinProfit.keySet()); + Map modelMap = new HashMap<>(); + Map modelNumMap = new HashMap<>(); + for (String carNo : carNoJoinProfit.keySet()) { + Car car = carMap.get(carNo); + BigDecimal price = carNoJoinProfit.get(carNo); + Long num = carNoNum.get(carNo); + if (car != null && car.getVehicleModelId() != null) { + modelMap.merge(car.getVehicleModelId(), price, BigDecimal::add); + modelNumMap.merge(car.getVehicleModelId(), new BigDecimal(num), BigDecimal::add); + } else { + modelMap.merge(-1, price, BigDecimal::add); + modelNumMap.merge(-1, new BigDecimal(num), BigDecimal::add); + } + } + + List vehicleModelList = vehicleModelService.listByIds(carNoJoinProfit.keySet()); + for (VehicleModel model : vehicleModelList) { + BusinessAnalysisVo vo = new BusinessAnalysisVo(); + vo.setId(model.getId()); + vo.setName(model.getName()); + BigDecimal price = modelMap.get(model.getId()); + BigDecimal num = modelNumMap.get(model.getId()); + if (price == null || num == null || num.compareTo(BigDecimal.ZERO) == 0) { + vo.setCurrentData(BigDecimal.ZERO); + } else { + vo.setCurrentData(price.divide(num).setScale(2, BigDecimal.ROUND_DOWN)); + } + resp.put(model.getId(), vo); + } + return resp; + } + + private CompletableFuture averageCostTask(MonthlyMaintenanceAnalysis request, String dateOffset) { + return CompletableFuture.supplyAsync(() -> averageCost(request.getDateLimit(), request.getMerId(), dateOffset, request.getType()), service); + } + + private BigDecimal averageCost(String dateLimit, Integer merId, String dateOffset, Integer type) { + BigDecimal cost = BigDecimal.ZERO; + List orderList = queryOrderByMerIdAndType(dateLimit, merId, dateOffset, type); + if (CollUtil.isEmpty(orderList)) { + return cost; + } + Map orderTemp = orderList.stream().collect(Collectors.toMap(CarReservationOrder::getId, CarReservationOrder::getCarNo)); + //全部配件 + Map accList = accessoryService.getListAll(null, merId); + if (CollUtil.isEmpty(accList)) { + return cost; + } + //套餐材料 + List packageList = carReservationProjectPackageItemAccessoryService.getByOrderIds(orderTemp.keySet(), accList.keySet()); + for (CarReservationProjectPackageItemAccessory item : packageList) { + Accessory accessory = accList.get(item.getAccessoryId()); + if (ObjectUtil.isNull(accessory)) { + continue; + } + //套餐材料无法更换,且一次性领完 + cost = cost.add(accessory.getProcurePrice().multiply(new BigDecimal(item.getNum()))); + } + //非套餐材料 + List projectList = carReservationInfoProjectAccessoryService.getByOrderIds(orderTemp.keySet(), accList.keySet()); + for (CarReservationInfoProjectAccessory item : projectList) { + Integer accId = item.getAccessoryId(); + Integer num = item.getNum(); + if (item.getAccessoryPickId() != 0 && !item.getAccessoryPickId().equals(item.getAccessoryId())) { + accId = item.getAccessoryPickId(); + num = item.getPickingNum(); + } + Accessory accessory = accList.get(accId); + if (ObjectUtil.isNull(accessory)) { + continue; + } + cost = cost.add(accessory.getProcurePrice().multiply(new BigDecimal(num))); + } + + if (cost == null) { + return BigDecimal.ZERO; + } + return cost.divide(new BigDecimal(orderList.size())).setScale(2, BigDecimal.ROUND_DOWN); + } + + private CompletableFuture> profitAverageModelTask(MonthlyMaintenanceAnalysis request, String dateOffset) { + return CompletableFuture.supplyAsync(() -> profitAverageModel(request.getDateLimit(), request.getMerId(), dateOffset, request.getType()), service); + } + + private Map profitAverageModel(String dateLimit, Integer merId, String dateOffset, Integer type) { + Map resp = new HashMap<>(); + List orderList = queryOrderByMerIdAndType(dateLimit, merId, dateOffset, type); + if (CollUtil.isEmpty(orderList)) { + return resp; + } + Map orderTemp = orderList.stream().collect(Collectors.toMap(CarReservationOrder::getId, CarReservationOrder::getCarNo)); + Map carNoNum = orderList.stream().collect(Collectors.toMap(CarReservationOrder::getCarNo, el -> 1l, Long::sum)); + Map carNoJoinProfit = new HashMap<>(); + //全部配件 + Map accList = accessoryService.getListAll(null, merId); + if (CollUtil.isEmpty(accList)) { + return resp; + } + //套餐材料 + List packageList = carReservationProjectPackageItemAccessoryService.getByOrderIds(orderTemp.keySet(), accList.keySet()); + for (CarReservationProjectPackageItemAccessory item : packageList) { + Accessory accessory = accList.get(item.getAccessoryId()); + if (ObjectUtil.isNull(accessory)) { + continue; + } + //套餐材料无法更换,且一次性领完 + String carNo = orderTemp.get(item.getCarReservationOrderId()); + if (StrUtil.isNotBlank(carNo)) { + BigDecimal cost = accessory.getProcurePrice().multiply(new BigDecimal(item.getNum())); + BigDecimal price = accessory.getPrice().multiply(new BigDecimal(item.getNum())); + carNoJoinProfit.merge(carNo, price.subtract(cost), BigDecimal::add); + } + } + //非套餐材料 + List projectList = carReservationInfoProjectAccessoryService.getByOrderIds(orderTemp.keySet(), accList.keySet()); + for (CarReservationInfoProjectAccessory item : projectList) { + Integer accId = item.getAccessoryId(); + Integer num = item.getNum(); + if (item.getAccessoryPickId() != 0 && !item.getAccessoryPickId().equals(item.getAccessoryId())) { + accId = item.getAccessoryPickId(); + num = item.getPickingNum(); + } + Accessory accessory = accList.get(accId); + if (ObjectUtil.isNull(accessory)) { + continue; + } + String carNo = orderTemp.get(item.getCarReservationOrderId()); + if (StrUtil.isNotBlank(carNo)) { + BigDecimal cost = accessory.getProcurePrice().multiply(new BigDecimal(num)); + BigDecimal price = accessory.getPrice().multiply(new BigDecimal(num)); + carNoJoinProfit.merge(carNo, price.subtract(cost), BigDecimal::add); + } + } + Map carMap = carService.queryCarMapByCarNo(carNoJoinProfit.keySet()); + Map modelMap = new HashMap<>(); + Map modelNumMap = new HashMap<>(); + for (String carNo : carNoJoinProfit.keySet()) { + Car car = carMap.get(carNo); + BigDecimal price = carNoJoinProfit.get(carNo); + Long num = carNoNum.get(carNo); + if (car != null && car.getVehicleModelId() != null) { + modelMap.merge(car.getVehicleModelId(), price, BigDecimal::add); + modelNumMap.merge(car.getVehicleModelId(), new BigDecimal(num), BigDecimal::add); + } else { + modelMap.merge(-1, price, BigDecimal::add); + modelNumMap.merge(-1, new BigDecimal(num), BigDecimal::add); + } + } + + List vehicleModelList = vehicleModelService.listByIds(carNoJoinProfit.keySet()); + for (VehicleModel model : vehicleModelList) { + BusinessAnalysisVo vo = new BusinessAnalysisVo(); + vo.setId(model.getId()); + vo.setName(model.getName()); + BigDecimal price = modelMap.get(model.getId()); + BigDecimal num = modelNumMap.get(model.getId()); + if (price == null || num == null || num.compareTo(BigDecimal.ZERO) == 0) { + vo.setCurrentData(BigDecimal.ZERO); + } else { + vo.setCurrentData(price.divide(num).setScale(2, BigDecimal.ROUND_DOWN)); + } + resp.put(model.getId(), vo); + } + return resp; + } + private CompletableFuture profitTask(MonthlyMaintenanceAnalysis request, String dateOffset) { return CompletableFuture.supplyAsync(() -> profit(request.getDateLimit(), request.getMerId(), dateOffset, request.getType()), service); } @@ -4070,7 +5200,16 @@ public class CarReservationOrderServiceImpl extends ServiceImpl accessoryTask(MonthlyMaintenanceAnalysis request, String dateOffset) {