fix-经营分析

This commit is contained in:
xl
2024-07-31 11:21:08 +08:00
parent b3fb225fe3
commit 2191ece65c
3 changed files with 82 additions and 22 deletions

View File

@@ -330,12 +330,38 @@ public class CarReservationInfoServiceImpl extends ServiceImpl<CarReservationInf
item.in(ReservationOrderCashDeskItem::getCashDeskSn, deskSn); item.in(ReservationOrderCashDeskItem::getCashDeskSn, deskSn);
List<ReservationOrderCashDeskItem> items = reservationOrderCashDeskItemService.list(item); List<ReservationOrderCashDeskItem> items = reservationOrderCashDeskItemService.list(item);
List<Integer> orderIds = items.stream().map(ReservationOrderCashDeskItem::getOrderId).distinct().collect(Collectors.toList()); 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_price IS NOT NULL AND new_accessory_price <> 0 THEN new_accessory_price ELSE accessory_price END " + Map<Integer, Accessory> accList = accessoryService.getListAll(null, merId);
"),0) as new_accessory_price"); if (CollUtil.isEmpty(accList)) {
qw.in("car_reservation_order_id", orderIds); return BigDecimal.ZERO;
CarReservationInfo info = getOne(qw); }
return info.getNewAccessoryPrice(); BigDecimal price = BigDecimal.ZERO;
//套餐材料
List<CarReservationProjectPackageItemAccessory> packageList = carReservationProjectPackageItemAccessoryService.getByOrderIds(orderIds, accList.keySet());
for (CarReservationProjectPackageItemAccessory itemAcc : packageList) {
Accessory accessory = accList.get(itemAcc.getAccessoryId());
if (ObjectUtil.isNull(accessory)) {
continue;
}
//套餐材料无法更换,且一次性领完
price = price.add(accessory.getProcurePrice().multiply(new BigDecimal(itemAcc.getNum())));
}
//非套餐材料
List<CarReservationInfoProjectAccessory> projectList = carReservationInfoProjectAccessoryService.getByOrderIds(orderIds, accList.keySet());
for (CarReservationInfoProjectAccessory itemAcc : projectList) {
Integer accId = itemAcc.getAccessoryId();
Integer num = itemAcc.getNum();
if (itemAcc.getAccessoryPickId() != 0 && !itemAcc.getAccessoryPickId().equals(itemAcc.getAccessoryId())) {
accId = itemAcc.getAccessoryPickId();
num = itemAcc.getPickingNum();
}
Accessory accessory = accList.get(accId);
if (ObjectUtil.isNull(accessory)) {
continue;
}
price = price.add(accessory.getProcurePrice().multiply(new BigDecimal(num)));
}
return price;
} }
private BigDecimal getTotalCost(String dateLimit, Integer merId, String type) { private BigDecimal getTotalCost(String dateLimit, Integer merId, String type) {

View File

@@ -3599,7 +3599,7 @@ public class CarReservationOrderServiceImpl extends ServiceImpl<CarReservationOr
//同比 //同比
vo.setYearOnYear(LxkUtil.getRateBig(current.get(), year.get())); vo.setYearOnYear(LxkUtil.getRateBig(current.get(), year.get()));
//环比 //环比
vo.setLinkRelativeRatio(LxkUtil.getRateBig(current.get(), year.get())); vo.setLinkRelativeRatio(LxkUtil.getRateBig(current.get(), lastMonth.get()));
vo.setCurrentData(current.get()); vo.setCurrentData(current.get());
} catch (InterruptedException | ExecutionException e) { } catch (InterruptedException | ExecutionException e) {
e.printStackTrace(); e.printStackTrace();

View File

@@ -15,11 +15,9 @@ import com.zbkj.common.constants.CarRepairOrderConstants;
import com.zbkj.common.constants.DateConstants; import com.zbkj.common.constants.DateConstants;
import com.zbkj.common.constants.OrderConstants; import com.zbkj.common.constants.OrderConstants;
import com.zbkj.common.exception.LxkException; import com.zbkj.common.exception.LxkException;
import com.zbkj.common.model.accessory.Accessory;
import com.zbkj.common.model.admin.SystemAdmin; import com.zbkj.common.model.admin.SystemAdmin;
import com.zbkj.common.model.car.CarReservationInfo; import com.zbkj.common.model.car.*;
import com.zbkj.common.model.car.CarReservationOrder;
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.dealer.CarDealerRatio;
import com.zbkj.common.model.user.UserBrokerageRecord; import com.zbkj.common.model.user.UserBrokerageRecord;
import com.zbkj.common.request.BusinessAnalysisRequest; import com.zbkj.common.request.BusinessAnalysisRequest;
@@ -82,6 +80,12 @@ public class ReservationOrderCashDeskServiceImpl extends ServiceImpl<Reservation
private CarDealerRatioService carDealerRatioService; private CarDealerRatioService carDealerRatioService;
@Autowired @Autowired
private ExecutorService service; private ExecutorService service;
@Autowired
private AccessoryService accessoryService;
@Autowired
private CarReservationProjectPackageItemAccessoryService carReservationProjectPackageItemAccessoryService;
@Autowired
private CarReservationInfoProjectAccessoryService carReservationInfoProjectAccessoryService;
@Override @Override
public Boolean add(ReservationOrderCashDeskRequest request) { public Boolean add(ReservationOrderCashDeskRequest request) {
@@ -316,7 +320,7 @@ public class ReservationOrderCashDeskServiceImpl extends ServiceImpl<Reservation
//同比 //同比
vo.setYearOnYear(LxkUtil.getRateBig(current.get(), year.get())); vo.setYearOnYear(LxkUtil.getRateBig(current.get(), year.get()));
//环比 //环比
vo.setLinkRelativeRatio(LxkUtil.getRateBig(current.get(), year.get())); vo.setLinkRelativeRatio(LxkUtil.getRateBig(current.get(), lastMonth.get()));
vo.setCurrentData(current.get()); vo.setCurrentData(current.get());
} catch (InterruptedException | ExecutionException e) { } catch (InterruptedException | ExecutionException e) {
e.printStackTrace(); e.printStackTrace();
@@ -334,18 +338,18 @@ public class ReservationOrderCashDeskServiceImpl extends ServiceImpl<Reservation
BusinessAnalysisVo vo = new BusinessAnalysisVo(); BusinessAnalysisVo vo = new BusinessAnalysisVo();
//统计当前数据 //统计当前数据
CompletableFuture<BigDecimal> current = calculatePrice(request, null); CompletableFuture<BigDecimal> current = profitTask(request, null);
//统计上年数据 //统计上年数据
CompletableFuture<BigDecimal> year = calculatePrice(request, DateConstants.SEARCH_DATE_PRE_YEAR); CompletableFuture<BigDecimal> year = profitTask(request, DateConstants.SEARCH_DATE_PRE_YEAR);
//统计上个月的数据 //统计上个月的数据
CompletableFuture<BigDecimal> lastMonth = calculatePrice(request, DateConstants.SEARCH_DATE_PRE_MONTH); CompletableFuture<BigDecimal> lastMonth = profitTask(request, DateConstants.SEARCH_DATE_PRE_MONTH);
try { try {
CompletableFuture.allOf(current, year, lastMonth).join(); CompletableFuture.allOf(current, year, lastMonth).join();
//同比 //同比
vo.setYearOnYear(LxkUtil.getRateBig(current.get(), year.get())); vo.setYearOnYear(LxkUtil.getRateBig(current.get(), year.get()));
//环比 //环比
vo.setLinkRelativeRatio(LxkUtil.getRateBig(current.get(), year.get())); vo.setLinkRelativeRatio(LxkUtil.getRateBig(current.get(), lastMonth.get()));
vo.setCurrentData(current.get()); vo.setCurrentData(current.get());
} catch (InterruptedException | ExecutionException e) { } catch (InterruptedException | ExecutionException e) {
e.printStackTrace(); e.printStackTrace();
@@ -354,6 +358,10 @@ public class ReservationOrderCashDeskServiceImpl extends ServiceImpl<Reservation
return vo; return vo;
} }
private CompletableFuture<BigDecimal> profitTask(BusinessAnalysisRequest request, String dateOffset) {
return CompletableFuture.supplyAsync(() -> getTurnover(request.getDateLimit(), request.getMerId(), dateOffset), service);
}
private BigDecimal getTurnover(String dateLimit, Integer merId, String type) { private BigDecimal getTurnover(String dateLimit, Integer merId, String type) {
//总营业额 //总营业额
LambdaQueryWrapper<ReservationOrderCashDesk> lqw = new LambdaQueryWrapper<>(); LambdaQueryWrapper<ReservationOrderCashDesk> lqw = new LambdaQueryWrapper<>();
@@ -383,13 +391,39 @@ public class ReservationOrderCashDeskServiceImpl extends ServiceImpl<Reservation
item.in(ReservationOrderCashDeskItem::getCashDeskSn, deskSn); item.in(ReservationOrderCashDeskItem::getCashDeskSn, deskSn);
List<ReservationOrderCashDeskItem> items = reservationOrderCashDeskItemService.list(item); List<ReservationOrderCashDeskItem> items = reservationOrderCashDeskItemService.list(item);
List<Integer> orderIds = items.stream().map(ReservationOrderCashDeskItem::getOrderId).distinct().collect(Collectors.toList()); 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_price IS NOT NULL AND new_accessory_price <> 0 THEN new_accessory_price ELSE accessory_price END " +
"),0) as new_accessory_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); BigDecimal total = list.stream().map(ReservationOrderCashDesk::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
return total.subtract(info.getNewAccessoryPrice()); //全部配件
Map<Integer, Accessory> accList = accessoryService.getListAll(null, merId);
if (CollUtil.isEmpty(accList)) {
return BigDecimal.ZERO;
}
BigDecimal price = BigDecimal.ZERO;
//套餐材料
List<CarReservationProjectPackageItemAccessory> packageList = carReservationProjectPackageItemAccessoryService.getByOrderIds(orderIds, accList.keySet());
for (CarReservationProjectPackageItemAccessory itemAcc : packageList) {
Accessory accessory = accList.get(itemAcc.getAccessoryId());
if (ObjectUtil.isNull(accessory)) {
continue;
}
//套餐材料无法更换,且一次性领完
price = price.add(accessory.getProcurePrice().multiply(new BigDecimal(itemAcc.getNum())));
}
//非套餐材料
List<CarReservationInfoProjectAccessory> projectList = carReservationInfoProjectAccessoryService.getByOrderIds(orderIds, accList.keySet());
for (CarReservationInfoProjectAccessory itemAcc : projectList) {
Integer accId = itemAcc.getAccessoryId();
Integer num = itemAcc.getNum();
if (itemAcc.getAccessoryPickId() != 0 && !itemAcc.getAccessoryPickId().equals(itemAcc.getAccessoryId())) {
accId = itemAcc.getAccessoryPickId();
num = itemAcc.getPickingNum();
}
Accessory accessory = accList.get(accId);
if (ObjectUtil.isNull(accessory)) {
continue;
}
price = price.add(accessory.getProcurePrice().multiply(new BigDecimal(num)));
}
return total.subtract(price);
} }
private BigDecimal getPrice(String dateLimit, Integer merId, String type) { private BigDecimal getPrice(String dateLimit, Integer merId, String type) {