平台端经营分析
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user