|
@@ -2,12 +2,12 @@ package com.yiqi.core.service.impl;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
import java.util.*;
|
|
|
+import java.util.concurrent.atomic.AtomicReference;
|
|
|
import java.util.stream.Collectors;
|
|
|
import java.util.concurrent.CompletableFuture;
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
-import com.wechat.pay.java.service.billdownload.model.BillType;
|
|
|
import com.yiqi.app.domain.AppUserBillMstr;
|
|
|
import com.yiqi.app.service.IAppUserBillMstrService;
|
|
|
import com.yiqi.common.enums.*;
|
|
@@ -17,6 +17,7 @@ import com.yiqi.common.utils.DateUtils;
|
|
|
import com.yiqi.core.domain.SettlementManageFactory;
|
|
|
import com.yiqi.core.domain.SettlementManageStore;
|
|
|
import com.yiqi.core.domain.dto.SettlementBillAddDTO;
|
|
|
+import com.yiqi.core.mapper.SettlementManageStoreMapper;
|
|
|
import com.yiqi.core.service.ISettlementManageFactoryService;
|
|
|
import com.yiqi.core.service.ISettlementManageStoreService;
|
|
|
import com.yiqi.order.domain.*;
|
|
@@ -32,11 +33,8 @@ import com.yiqi.settlement.domain.dto.StoreSettlementData;
|
|
|
import com.yiqi.settlement.service.ISettlementFactoryRateService;
|
|
|
import com.yiqi.settlement.service.ISettlementStoreRateService;
|
|
|
import com.yiqi.system.domain.ManageFactory;
|
|
|
-import com.yiqi.system.domain.SysSettlementRate;
|
|
|
import com.yiqi.system.domain.SysStore;
|
|
|
import com.yiqi.system.service.IManageFactoryService;
|
|
|
-import com.yiqi.system.service.ISysConfigService;
|
|
|
-import com.yiqi.system.service.ISysSettlementRateService;
|
|
|
import com.yiqi.system.service.ISysStoreService;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
|
@@ -45,7 +43,7 @@ import com.yiqi.core.mapper.SettlementManageBillMapper;
|
|
|
import com.yiqi.core.domain.SettlementManageBill;
|
|
|
import com.yiqi.core.service.ISettlementManageBillService;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
-import lombok.Data;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
/**
|
|
|
* 结算管理Service业务层处理
|
|
@@ -60,6 +58,8 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
@Autowired
|
|
|
private ISettlementManageStoreService settlementManageStoreService;
|
|
|
@Autowired
|
|
|
+ private SettlementManageStoreMapper settlementManageStoreMapper;
|
|
|
+ @Autowired
|
|
|
private IOrderClothItemService orderClothItemService;
|
|
|
@Autowired
|
|
|
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
|
|
@@ -78,10 +78,6 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
@Autowired
|
|
|
private IOrderRefundInfoService orderRefundInfoService;
|
|
|
@Autowired
|
|
|
- private ISysSettlementRateService sysSettlementRateService;
|
|
|
- @Autowired
|
|
|
- private ISysConfigService configService;
|
|
|
- @Autowired
|
|
|
private IOrderClothService orderClothService;
|
|
|
@Autowired
|
|
|
private IOrderClothRefundService orderClothRefundService;
|
|
@@ -95,13 +91,22 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
private ISettlementFactoryRateService settlementFactoryRateService;
|
|
|
|
|
|
@Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
public void insertSettlementManageBill(SettlementBillAddDTO settlementBillAddDTO) {
|
|
|
SettlementManageBill settlementManageBill = this.buildSettlementManageBill(settlementBillAddDTO);
|
|
|
- // 工厂结算
|
|
|
- this.handleCountFactorySettlement(settlementManageBill);
|
|
|
-
|
|
|
// 门店结算
|
|
|
this.handleCountStoreSettlement(settlementManageBill);
|
|
|
+ // 工厂结算
|
|
|
+ this.handleCountFactorySettlement(settlementManageBill);
|
|
|
+ //更新结算单
|
|
|
+
|
|
|
+ SettlementManageStore settlementManageStore = settlementManageStoreMapper.statisticsByBillId(settlementManageBill.getId());
|
|
|
+ settlementManageBill.setStoreNum(settlementManageStore.getStoreNum());
|
|
|
+ settlementManageBill.setMaterialImprestAmount(settlementManageStore.getMaterialImprestAmount());
|
|
|
+ settlementManageBill.setSettlementAmount(settlementManageStore.getSettlementAmount());
|
|
|
+ settlementManageBill.setSystemMaintenanceAmount(settlementManageStore.getSystemMaintenanceAmount());
|
|
|
+ settlementManageBill.setWashClothAmount(settlementManageStore.getWashClothAmount());
|
|
|
+ this.updateById(settlementManageBill);
|
|
|
}
|
|
|
|
|
|
private SettlementManageBill buildSettlementManageBill(SettlementBillAddDTO settlementBillAddDTO) {
|
|
@@ -259,7 +264,6 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
// 2. 订单金额统计
|
|
|
BigDecimal totalAmount = orderList.stream()
|
|
|
.map(OrderCloth::getPayAmount)
|
|
|
- .filter(Objects::nonNull)
|
|
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
stats.setTotalAmount(totalAmount);
|
|
|
|
|
@@ -310,6 +314,7 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
.count());
|
|
|
stats.setGoodsCount(
|
|
|
orderList.stream()
|
|
|
+ .filter(order -> PayStatus.HAS_PAY.getCode().equals(order.getPayStatus()))
|
|
|
.map(OrderGoods::getGoodsCount)
|
|
|
.filter(Objects::nonNull)
|
|
|
.reduce(0, Integer::sum)
|
|
@@ -358,6 +363,9 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
* 计算洗衣订单支付方式金额
|
|
|
*/
|
|
|
private Map<String, BigDecimal> calculateClothPayTypeAmounts(List<OrderCloth> orderList) {
|
|
|
+ if (orderList == null || orderList.size() == 0) {
|
|
|
+ return new HashMap<>();
|
|
|
+ }
|
|
|
return orderList.stream()
|
|
|
.filter(order -> PayStatus.HAS_PAY.getCode().equals(order.getPayStatus()))
|
|
|
.collect(Collectors.groupingBy(
|
|
@@ -374,6 +382,9 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
* 计算商品订单支付方式金额
|
|
|
*/
|
|
|
private Map<String, BigDecimal> calculateGoodsPayTypeAmounts(List<OrderGoods> orderList) {
|
|
|
+ if (orderList == null || orderList.size() == 0) {
|
|
|
+ return new HashMap<>();
|
|
|
+ }
|
|
|
return orderList.stream()
|
|
|
.filter(order -> PayStatus.HAS_PAY.getCode().equals(order.getPayStatus()))
|
|
|
.collect(Collectors.groupingBy(
|
|
@@ -391,7 +402,11 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
* 计算洗衣订单支付方式金额
|
|
|
*/
|
|
|
private Map<String, BigDecimal> calculateClothRefundTypeAmounts(List<OrderClothRefund> orderList) {
|
|
|
+ if (orderList == null || orderList.size() == 0) {
|
|
|
+ return new HashMap<>();
|
|
|
+ }
|
|
|
return orderList.stream()
|
|
|
+ .filter(order -> OrderRefundStatus.REFUND_SUCCESS.getCode().equals(order.getRefundStatus()))
|
|
|
.collect(Collectors.groupingBy(
|
|
|
OrderClothRefund::getPayType,
|
|
|
Collectors.reducing(
|
|
@@ -406,7 +421,11 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
* 计算商品订单支付方式金额
|
|
|
*/
|
|
|
private Map<String, BigDecimal> calculateGoodsRefundTypeAmounts(List<OrderGoodsRefund> orderList) {
|
|
|
+ if (orderList == null || orderList.size() == 0) {
|
|
|
+ return new HashMap<>();
|
|
|
+ }
|
|
|
return orderList.stream()
|
|
|
+ .filter(order -> OrderRefundStatus.REFUND_SUCCESS.getCode().equals(order.getRefundStatus()))
|
|
|
.collect(Collectors.groupingBy(
|
|
|
OrderGoodsRefund::getPayType,
|
|
|
Collectors.reducing(
|
|
@@ -444,15 +463,16 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
*
|
|
|
* @param settlementManageBill
|
|
|
*/
|
|
|
- private void handleCountStoreSettlement(SettlementManageBill settlementManageBill) {
|
|
|
+ private Integer handleCountStoreSettlement(SettlementManageBill settlementManageBill) {
|
|
|
List<SysStore> storeList = storeService.list(new QueryWrapper<SysStore>().lambda()
|
|
|
.eq(SysStore::getDelFlag, StatusType.OK.getCode()));
|
|
|
if (CollUtil.isEmpty(storeList)) {
|
|
|
- return;
|
|
|
+ return 0;
|
|
|
}
|
|
|
for (SysStore store : storeList) {
|
|
|
this.buildStoreSettlement(settlementManageBill, store);
|
|
|
}
|
|
|
+ return storeList.size();
|
|
|
}
|
|
|
|
|
|
|
|
@@ -492,6 +512,26 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
.gt("order_status", purchaseGoodsStatusType.CONFIRM_PAY.getCode())
|
|
|
.between("pay_time", startTime, endTime)));
|
|
|
}),
|
|
|
+ //加载退款数据
|
|
|
+ CompletableFuture.runAsync(() -> {
|
|
|
+
|
|
|
+ // 3. 查询衣服退款记录
|
|
|
+ List<OrderClothRefund> clothRefundList = orderClothRefundService.list(new QueryWrapper<OrderClothRefund>().lambda()
|
|
|
+ .eq(OrderClothRefund::getSourceType, SourceType.STORE.getCode())
|
|
|
+ .eq(OrderClothRefund::getOrgId, storeId)
|
|
|
+ .eq(OrderClothRefund::getRefundStatus, OrderRefundStatus.REFUND_SUCCESS.getCode())
|
|
|
+ .between(OrderClothRefund::getRefundTime, startTime, endTime));
|
|
|
+
|
|
|
+ // 4. 查询商品退款记录
|
|
|
+ List<OrderGoodsRefund> goodsRefundList = orderGoodsRefundService.list(new QueryWrapper<OrderGoodsRefund>().lambda()
|
|
|
+ .eq(OrderGoodsRefund::getOrgId, storeId)
|
|
|
+ .eq(OrderGoodsRefund::getSourceType, SourceType.STORE.getCode())
|
|
|
+ .eq(OrderGoodsRefund::getRefundStatus, OrderRefundStatus.REFUND_SUCCESS.getCode())
|
|
|
+ .between(OrderGoodsRefund::getRefundTime, startTime, endTime));
|
|
|
+
|
|
|
+ data.setClothRefunds(clothRefundList);
|
|
|
+ data.setGoodsRefunds(goodsRefundList);
|
|
|
+ }),
|
|
|
|
|
|
// 加载支付数据
|
|
|
CompletableFuture.runAsync(() -> {
|
|
@@ -516,6 +556,7 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
CompletableFuture.runAsync(() -> {
|
|
|
data.setCrossStoreBills(appUserBillMstrService.list(new QueryWrapper<AppUserBillMstr>()
|
|
|
.eq("org_id", storeId)
|
|
|
+ .ne("order_type", '4')
|
|
|
.or().eq("card_store_id", storeId)
|
|
|
.between("create_time", startTime, endTime)));
|
|
|
}),
|
|
@@ -567,6 +608,9 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
//计算跨店结算金
|
|
|
calculateCrossStoreAmount(settlement, data);
|
|
|
|
|
|
+ //计算快递费
|
|
|
+ calculateExpressAmount(settlement, data);
|
|
|
+
|
|
|
// 6. 计算最终结算金额
|
|
|
calculateFinalSettlement(settlement);
|
|
|
|
|
@@ -575,6 +619,12 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
settlementManageStoreService.save(settlement);
|
|
|
}
|
|
|
|
|
|
+ private void calculateExpressAmount(SettlementManageStore settlement, StoreSettlementData data) {
|
|
|
+ // 1. 统计快递订单数据
|
|
|
+ settlement.setExpressAmount(BigDecimal.ZERO);
|
|
|
+ settlement.setExpressCount(0);
|
|
|
+ }
|
|
|
+
|
|
|
private void calculateClothAndGoodsOrderStats(SettlementManageStore settlement, StoreSettlementData data) {
|
|
|
// 1. 统计洗衣订单数据
|
|
|
OrderStatisticsVO clothStats = calculateClothOrderStats(data.getClothOrders(), data.getClothRefunds());
|
|
@@ -708,6 +758,9 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
Long currentStoreId = settlement.getOrgId();
|
|
|
|
|
|
for (AppUserBillMstr appUserBillMstr : data.getCrossStoreBills()) {
|
|
|
+ if (appUserBillMstr.getSourceType() == null) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
if (appUserBillMstr.getIsRefund().equals(SysBoolType.NO.getCode())) {
|
|
|
|
|
|
if (appUserBillMstr.getSourceType().equals(SourceType.MANAGER.getCode())) {
|
|
@@ -861,7 +914,6 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
settlementManageStore.setSettlementAmount(BigDecimal.ZERO); // 结算金额
|
|
|
|
|
|
// 7. 设置备注信息
|
|
|
- settlementManageStore.setRemark("本期无交易数据");
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -883,6 +935,7 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
this.build0ClothFactory(settlementManageFactory);
|
|
|
settlementManageFactory.setRemark("工厂暂无可用费率");
|
|
|
settlementManageFactoryService.save(settlementManageFactory);
|
|
|
+ return;
|
|
|
}
|
|
|
//查询衣服订单,入场时间在上个月的,切没有撤销或者推单的衣服
|
|
|
List<OrderClothItem> orderClothItemList = orderClothItemService.list(new QueryWrapper<OrderClothItem>().lambda()
|
|
@@ -902,6 +955,22 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
BigDecimal orderClothItemTotalPrice = orderClothItemList.stream().map(OrderClothItem::getTotalPrice).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
// 总交易金额
|
|
|
settlementManageFactory.setTotalTransactionAmount(orderClothItemTotalPrice);
|
|
|
+ //按照门店进行统计,计算每个门店的总金额
|
|
|
+ Map<Long, BigDecimal> storeTotalPriceMap = orderClothItemList.stream().collect(Collectors.groupingBy(OrderClothItem::getOrgId, Collectors.mapping(OrderClothItem::getTotalPrice, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
|
|
|
+ AtomicReference<BigDecimal> factorySettlementAmount = new AtomicReference<>(BigDecimal.ZERO);
|
|
|
+ storeTotalPriceMap.forEach((k, v) -> {
|
|
|
+ //获取门店的费率
|
|
|
+ SettlementStoreRate settlementStoreRate = settlementStoreRateService.getByStoreId(k, settlementManageBill.getBeginTime());
|
|
|
+ if (settlementStoreRate == null || settlementStoreRate.getFactoryRate() == null) {
|
|
|
+ settlementManageFactory.setRemark("工厂结算部分门店费率暂未设置");
|
|
|
+ settlementManageFactoryService.save(settlementManageFactory);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ BigDecimal amount = CurrencyUtil.mul(v, settlementStoreRate.getFactoryRate());
|
|
|
+ factorySettlementAmount.set(CurrencyUtil.add(factorySettlementAmount.get(), amount));
|
|
|
+ });
|
|
|
+ //(所有门店入厂洗衣件数对应的订单总金额-入厂后未洗退单总金额)*对应门店工厂结算费率
|
|
|
+ settlementManageFactory.setFactorySettlementAmount(factorySettlementAmount.get());
|
|
|
//材料结算金额总和
|
|
|
BigDecimal materialAmount = CurrencyUtil.mul(settlementFactoryRate.getMaterialRate(), orderClothItemTotalPrice);
|
|
|
settlementManageFactory.setMaterialAmount(materialAmount);
|
|
@@ -913,8 +982,6 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
// 工厂实际收入 = 工厂结算金额总和 - 工厂消费
|
|
|
settlementManageFactory.setRealIncomeAmount(settlementManageFactory.getFactorySettlementAmount().subtract(payMoney));
|
|
|
settlementManageFactoryService.save(settlementManageFactory);
|
|
|
-// settlementManageBill.setStatus(SettlementBillStatusType.WAITING.getCode());
|
|
|
-// this.updateById(settlementManageBill);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -999,7 +1066,11 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
*/
|
|
|
private Map<String, BigDecimal> calculateClothRefundAmounts(List<OrderClothRefund> refundList) {
|
|
|
Map<String, BigDecimal> result = new HashMap<>();
|
|
|
-
|
|
|
+ if (refundList == null || refundList.size() == 0) {
|
|
|
+ result.put("count", BigDecimal.ZERO);
|
|
|
+ result.put("amount", BigDecimal.ZERO);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
// 统计退款笔数
|
|
|
result.put("count", BigDecimal.valueOf(refundList.size()));
|
|
|
|
|
@@ -1018,6 +1089,11 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
*/
|
|
|
private Map<String, BigDecimal> calculateGoodsRefundAmounts(List<OrderGoodsRefund> refundList) {
|
|
|
Map<String, BigDecimal> result = new HashMap<>();
|
|
|
+ if (refundList == null || refundList.size() == 0) {
|
|
|
+ result.put("count", BigDecimal.ZERO);
|
|
|
+ result.put("amount", BigDecimal.ZERO);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
|
|
|
// 统计退款笔数
|
|
|
result.put("count", BigDecimal.valueOf(refundList.size()));
|