|
@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.yiqi.app.domain.AppUserBillMstr;
|
|
|
import com.yiqi.app.service.IAppUserBillMstrService;
|
|
|
import com.yiqi.common.enums.*;
|
|
|
+import com.yiqi.common.utils.CurrencyUtil;
|
|
|
import com.yiqi.common.utils.DateUtils;
|
|
|
import com.yiqi.core.domain.SettlementManageFactory;
|
|
|
import com.yiqi.core.domain.SettlementManageStore;
|
|
@@ -23,6 +24,8 @@ import com.yiqi.order.service.IOrderClothService;
|
|
|
import com.yiqi.order.service.IOrderGoodsService;
|
|
|
import com.yiqi.recharge.domain.RechargePasswordCard;
|
|
|
import com.yiqi.recharge.service.IRechargePasswordCardService;
|
|
|
+import com.yiqi.settlement.domain.SettlementFactoryRate;
|
|
|
+import com.yiqi.settlement.service.ISettlementFactoryRateService;
|
|
|
import com.yiqi.system.domain.ManageFactory;
|
|
|
import com.yiqi.system.domain.SysSettlementRate;
|
|
|
import com.yiqi.system.domain.SysStore;
|
|
@@ -45,7 +48,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
* @date 2024-02-15
|
|
|
*/
|
|
|
@Service
|
|
|
-public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManageBillMapper,SettlementManageBill> implements ISettlementManageBillService {
|
|
|
+public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManageBillMapper, SettlementManageBill> implements ISettlementManageBillService {
|
|
|
@Autowired
|
|
|
private ISettlementManageFactoryService settlementManageFactoryService;
|
|
|
@Autowired
|
|
@@ -70,6 +73,8 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
private IOrderClothService orderClothService;
|
|
|
@Autowired
|
|
|
private IOrderGoodsService orderGoodsService;
|
|
|
+ @Autowired
|
|
|
+ private ISettlementFactoryRateService settlementFactoryRateService;
|
|
|
|
|
|
@Override
|
|
|
public void insertSettlementManageBill(SettlementBillAddDTO settlementBillAddDTO) {
|
|
@@ -82,8 +87,8 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
}
|
|
|
|
|
|
private SettlementManageBill buildSettlementManageBill(SettlementBillAddDTO settlementBillAddDTO) {
|
|
|
- Date beginTime = DateUtils.strToDate(settlementBillAddDTO.getMonth()+"-01");
|
|
|
- Date endTime = DateUtils.addDays(DateUtils.addMonths(beginTime,1), -1);
|
|
|
+ Date beginTime = DateUtils.strToDate(settlementBillAddDTO.getMonth() + "-01");
|
|
|
+ Date endTime = DateUtils.addDays(DateUtils.addMonths(beginTime, 1), -1);
|
|
|
SettlementManageBill settlementManageBill = new SettlementManageBill();
|
|
|
settlementManageBill.setBeginTime(beginTime);
|
|
|
settlementManageBill.setEndTime(endTime);
|
|
@@ -97,6 +102,7 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
|
|
|
/**
|
|
|
* 工厂结算
|
|
|
+ *
|
|
|
* @param settlementManageBill
|
|
|
* @return
|
|
|
*/
|
|
@@ -104,36 +110,43 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
List<ManageFactory> factoryList = factoryService.list(new QueryWrapper<ManageFactory>().lambda()
|
|
|
.eq(ManageFactory::getStatus, StatusType.OK.getCode())
|
|
|
.eq(ManageFactory::getDelFlag, StatusType.OK.getCode()));
|
|
|
- // 查询衣服订单
|
|
|
- List<OrderClothItem> orderClothItemList = orderClothItemService.list(new QueryWrapper<OrderClothItem>().lambda()
|
|
|
- .ne(OrderClothItem::getFlowStatus, ClothOrderFlowStatus.refund.getCode())
|
|
|
- .ge(OrderClothItem::getCreateTime, settlementManageBill.getBeginTime())
|
|
|
- .lt(OrderClothItem::getCreateTime, DateUtils.addDays(settlementManageBill.getEndTime(), 1)));
|
|
|
-
|
|
|
- if (CollUtil.isEmpty(factoryList)){
|
|
|
+ if (CollUtil.isEmpty(factoryList)) {
|
|
|
return;
|
|
|
}
|
|
|
+
|
|
|
+ for (ManageFactory factory : factoryList) {
|
|
|
+ //查询衣服订单,入场时间在上个月的,切没有撤销的衣服
|
|
|
+ List<OrderClothItem> orderClothItemList = orderClothItemService.list(new QueryWrapper<OrderClothItem>().lambda()
|
|
|
+ .ne(OrderClothItem::getFlowStatus, ClothOrderFlowStatus.refund.getCode())
|
|
|
+ .eq(OrderClothItem::getFactoryId, factory.getId())
|
|
|
+ .ge(OrderClothItem::getCreateTime, settlementManageBill.getBeginTime())
|
|
|
+ .ge(OrderClothItem::getInFactoryTime, settlementManageBill.getBeginTime())
|
|
|
+ .lt(OrderClothItem::getInFactoryTime, DateUtils.addDays(settlementManageBill.getEndTime(), 1)));
|
|
|
+ this.buildFactorySettlement(settlementManageBill, factory, orderClothItemList);
|
|
|
+ }
|
|
|
// 计算工厂结算明细
|
|
|
- threadPoolTaskExecutor.execute(() -> this.buildFactorySettlement(settlementManageBill, factoryList, orderClothItemList));
|
|
|
+// threadPoolTaskExecutor.execute(() -> this.buildFactorySettlement(settlementManageBill, factoryList, orderClothItemList));
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 门店结算
|
|
|
+ *
|
|
|
* @param settlementManageBill
|
|
|
*/
|
|
|
private void handleCountStoreSettlement(SettlementManageBill settlementManageBill) {
|
|
|
List<SysStore> storeList = storeService.list(new QueryWrapper<SysStore>().lambda()
|
|
|
.eq(SysStore::getStatus, StatusType.OK.getCode())
|
|
|
.eq(SysStore::getDelFlag, StatusType.OK.getCode()));
|
|
|
- if (CollUtil.isEmpty(storeList)){
|
|
|
+ if (CollUtil.isEmpty(storeList)) {
|
|
|
return;
|
|
|
}
|
|
|
// 计算门店结算明细
|
|
|
- threadPoolTaskExecutor.execute(() -> this.buildStoreSettlement(settlementManageBill, storeList));
|
|
|
+ threadPoolTaskExecutor.execute(() -> this.buildStoreSettlement(settlementManageBill, storeList));
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 门店结算处理
|
|
|
+ *
|
|
|
* @param settlementManageBill
|
|
|
* @return
|
|
|
*/
|
|
@@ -245,13 +258,12 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
BigDecimal totalCrossSend = crossSendBillMstrList.stream().map(AppUserBillMstr::getOtherStoreAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
|
|
|
|
|
|
-
|
|
|
// 设置 会员剩余金额 = 充值余额总和+福利金余额总和+赠送余额总和
|
|
|
BigDecimal addMemberBalance = totalRechargeBalance.add(totalWelfareBalance).add(totalGiveBalance);
|
|
|
settlementManageStore.setMemberBalance(addMemberBalance);
|
|
|
//`welfare_amount` '福利金额',
|
|
|
settlementManageStore.setWelfareAmount(totalWelfareBalance);
|
|
|
- // `unopened_card_password_amount` '未开卡卡密金额',
|
|
|
+ // `unopened_card_password_amount` '未开卡卡密金额',
|
|
|
settlementManageStore.setUnopenedCardPasswordAmount(totalUnopenedCard);
|
|
|
|
|
|
List<SysSettlementRate> sysSettlementRates = storeRateMap.get(sysStore.getId());
|
|
@@ -284,12 +296,12 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
BigDecimal decimalSystem = new BigDecimal(configService.selectConfigByKey(SysConfigKey.StoreSettlementManageRate.getCode()));
|
|
|
// // 洗衣费率
|
|
|
BigDecimal decimalWashCloth = new BigDecimal(configService.selectConfigByKey(SysConfigKey.StoreSettlementFactoryRate.getCode()));
|
|
|
- if (CollUtil.isEmpty(sysSettlementRates)){
|
|
|
+ if (CollUtil.isEmpty(sysSettlementRates)) {
|
|
|
payableDeposit = addMemberBalance.multiply(decimalDeposit);
|
|
|
welfareDeposit = totalWelfareBalance.multiply(decimalDeposit);
|
|
|
cardPasswordDeposit = totalUnopenedCard.multiply(decimalDeposit);
|
|
|
- wechatAmount = totalWechat.multiply( (new BigDecimal("1").subtract(decimalWechat)) );
|
|
|
- alipayAmount = totalAlipay.multiply( (new BigDecimal("1").subtract(decimalAlipay)) );
|
|
|
+ wechatAmount = totalWechat.multiply((new BigDecimal("1").subtract(decimalWechat)));
|
|
|
+ alipayAmount = totalAlipay.multiply((new BigDecimal("1").subtract(decimalAlipay)));
|
|
|
materialAmount = totalMaterialAmount.multiply(decimalMaterial);
|
|
|
systemMaintenanceAmount = (totalMaterialAmount.add(totalSystemAmount)).multiply(decimalSystem);
|
|
|
washClothAmount = totalWashAmount.multiply(decimalWashCloth);
|
|
@@ -301,7 +313,7 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
settlementManageStore.setMaterialRate(decimalMaterial);
|
|
|
settlementManageStore.setWxPayRate(decimalWechat);
|
|
|
settlementManageStore.setAliPayRate(decimalAlipay);
|
|
|
- }else {
|
|
|
+ } else {
|
|
|
SysSettlementRate rate = sysSettlementRates.get(0);
|
|
|
payableDeposit = addMemberBalance.multiply(rate.getDepositRate() == null ? decimalDeposit : rate.getDepositRate());
|
|
|
welfareDeposit = totalWelfareBalance.multiply(rate.getDepositRate() == null ? decimalDeposit : rate.getDepositRate());
|
|
@@ -347,14 +359,14 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
.eq(SettlementManageStore::getOrgId, sysStore.getId())
|
|
|
.eq(SettlementManageStore::getBeginTime, DateUtils.addMonths(settlementManageStore.getBeginTime(), -1)));
|
|
|
|
|
|
- if (CollUtil.isEmpty(settlementManageStoreLastList)){
|
|
|
+ if (CollUtil.isEmpty(settlementManageStoreLastList)) {
|
|
|
// `paid_deposit` '已付押金', = 上个月的应付押金
|
|
|
settlementManageStore.setPaidDeposit(BigDecimal.ZERO);
|
|
|
// `paid_welfare_deposit` '已付福利押金',= 上个月的应付福利押金
|
|
|
settlementManageStore.setPaidWelfareDeposit(BigDecimal.ZERO);
|
|
|
// `paid_card_password_deposit`'已付卡密押金',
|
|
|
settlementManageStore.setPaidCardPasswordDeposit(BigDecimal.ZERO);
|
|
|
- }else {
|
|
|
+ } else {
|
|
|
SettlementManageStore settlementManageStoreLast = settlementManageStoreLastList.get(0);
|
|
|
settlementManageStore.setPaidDeposit(settlementManageStoreLast.getPayableDeposit());
|
|
|
settlementManageStore.setPaidWelfareDeposit(settlementManageStoreLast.getWelfareDeposit());
|
|
@@ -424,31 +436,74 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
|
|
|
/**
|
|
|
* 工厂结算处理
|
|
|
+ *
|
|
|
* @param settlementManageBill
|
|
|
* @return
|
|
|
*/
|
|
|
- private void buildFactorySettlement(SettlementManageBill settlementManageBill, List<ManageFactory> factoryList, List<OrderClothItem> orderClothItemList) {
|
|
|
- if (CollUtil.isEmpty(orderClothItemList)){
|
|
|
- this.handle0ClothAllFactorySettlement(settlementManageBill, factoryList);
|
|
|
- settlementManageBill.setStatus(SettlementBillStatusType.WAITING.getCode());
|
|
|
- // 设置账单洗衣费
|
|
|
- settlementManageBill.setWashClothAmount(BigDecimal.ZERO);
|
|
|
- this.updateById(settlementManageBill);
|
|
|
- return;
|
|
|
+ private void buildFactorySettlement(SettlementManageBill settlementManageBill, ManageFactory factory, List<OrderClothItem> orderClothItemList) {
|
|
|
+ SettlementFactoryRate settlementFactoryRate = settlementFactoryRateService.getByFactoryId(factory.getId(), settlementManageBill.getBeginTime());
|
|
|
+ if (settlementFactoryRate == null) {
|
|
|
+ SettlementManageFactory settlementManageFactory = new SettlementManageFactory();
|
|
|
+ this.buildFactorySettlementInfo(settlementManageFactory, settlementManageBill, factory);
|
|
|
+ this.build0ClothFactory(settlementManageFactory);
|
|
|
+ settlementManageFactory.setStatus(SettlementStatusType.FAIL.getCode());
|
|
|
+ settlementManageFactory.setRemark("结算费率无效,结算失败");
|
|
|
+ settlementManageFactoryService.save(settlementManageFactory);
|
|
|
}
|
|
|
- Map<Long, List<OrderClothItem>> map = orderClothItemList.stream().collect(Collectors.groupingBy(OrderClothItem::getFactoryId));
|
|
|
- for (ManageFactory factory : factoryList) {
|
|
|
+ if (CollUtil.isEmpty(orderClothItemList)) {
|
|
|
SettlementManageFactory settlementManageFactory = new SettlementManageFactory();
|
|
|
this.buildFactorySettlementInfo(settlementManageFactory, settlementManageBill, factory);
|
|
|
- if (map.containsKey(factory.getId())){
|
|
|
- // 本工厂有订单衣服,进行计算
|
|
|
- this.buildHasClothFactory(settlementManageFactory, map.get(factory.getId()));
|
|
|
- }else {
|
|
|
- // 本工厂没有订单衣服,设置为0
|
|
|
- this.build0ClothFactory(settlementManageFactory);
|
|
|
- }
|
|
|
+ this.build0ClothFactory(settlementManageFactory);
|
|
|
settlementManageFactoryService.save(settlementManageFactory);
|
|
|
+ return;
|
|
|
}
|
|
|
+ SettlementManageFactory settlementManageFactory = new SettlementManageFactory();
|
|
|
+ this.buildFactorySettlementInfo(settlementManageFactory, settlementManageBill, factory);
|
|
|
+
|
|
|
+ settlementManageFactory.setTotalTransactionNum(orderClothItemList.size());
|
|
|
+ //计算衣服总价格
|
|
|
+ BigDecimal orderClothItemTotalPrice = orderClothItemList.stream().map(OrderClothItem::getTotalPrice).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ // 总交易金额
|
|
|
+ settlementManageFactory.setTotalTransactionAmount(orderClothItemTotalPrice);
|
|
|
+ //材料结算金额总和
|
|
|
+ BigDecimal materialAmount = CurrencyUtil.mul(settlementFactoryRate.getMaterialRate(), orderClothItemTotalPrice);
|
|
|
+ settlementManageFactory.setMaterialAmount(materialAmount);
|
|
|
+ //管理费
|
|
|
+ BigDecimal managetAmount = CurrencyUtil.mul(settlementFactoryRate.getManagementRate(), orderClothItemTotalPrice);
|
|
|
+ settlementManageFactory.setManageAmount(managetAmount);
|
|
|
+ //工厂结算金额总和
|
|
|
+ BigDecimal factorySettlementAmount = CurrencyUtil.mul(settlementFactoryRate.getDepositRate(), orderClothItemTotalPrice);
|
|
|
+ settlementManageFactory.setFactorySettlementAmount(managetAmount);
|
|
|
+
|
|
|
+ // 工厂结算金额总和
|
|
|
+ settlementManageFactory.setFactorySettlementAmount(
|
|
|
+ orderClothItemList.stream().map(OrderClothItem::getFactorySettlementAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
+ // 材料结算金额总和
|
|
|
+ settlementManageFactory.setMaterialAmount(
|
|
|
+ orderClothItemList.stream().map(OrderClothItem::getMaterialAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
+ // 管理结算金额总和
|
|
|
+ settlementManageFactory.setManageAmount(
|
|
|
+ orderClothItemList.stream().map(OrderClothItem::getManageAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
+ // 总交易金额
|
|
|
+ settlementManageFactory.setTotalTransactionAmount(
|
|
|
+ orderClothItemList.stream().map(OrderClothItem::getTotalPrice).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
+ // 总交易件数
|
|
|
+ settlementManageFactory.setTotalTransactionNum(orderClothItemList.size());
|
|
|
+
|
|
|
+ // 工厂消费 = 材料费+ 管理费
|
|
|
+ BigDecimal payMoney = settlementManageFactory.getManageAmount().add(settlementManageFactory.getMaterialAmount());
|
|
|
+ // 工厂实际收入 = 工厂结算金额总和 - 工厂消费
|
|
|
+ settlementManageFactory.setRealIncomeAmount(settlementManageFactory.getFactorySettlementAmount().subtract(payMoney));
|
|
|
+
|
|
|
+
|
|
|
+ if (map.containsKey(factory.getId())) {
|
|
|
+ // 本工厂有订单衣服,进行计算
|
|
|
+ this.buildHasClothFactory(settlementManageFactory, map.get(factory.getId()));
|
|
|
+ } else {
|
|
|
+ // 本工厂没有订单衣服,设置为0
|
|
|
+ this.build0ClothFactory(settlementManageFactory);
|
|
|
+ }
|
|
|
+ settlementManageFactoryService.save(settlementManageFactory);
|
|
|
|
|
|
// 设置账单洗衣费
|
|
|
settlementManageBill.setWashClothAmount(
|
|
@@ -460,11 +515,12 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
|
|
|
/**
|
|
|
* 本月订单全部为空时,默认所有工厂都是设置为0
|
|
|
+ *
|
|
|
* @param settlementManageBill
|
|
|
* @param factoryList
|
|
|
*/
|
|
|
private void handle0ClothAllFactorySettlement(SettlementManageBill settlementManageBill, List<ManageFactory> factoryList) {
|
|
|
- if (CollUtil.isEmpty(factoryList)){
|
|
|
+ if (CollUtil.isEmpty(factoryList)) {
|
|
|
return;
|
|
|
}
|
|
|
for (ManageFactory factory : factoryList) {
|
|
@@ -477,9 +533,10 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
|
|
|
/**
|
|
|
* 工厂本月没有衣服时,设置默认为0
|
|
|
+ *
|
|
|
* @param settlementManageFactory
|
|
|
*/
|
|
|
- private void build0ClothFactory(SettlementManageFactory settlementManageFactory){
|
|
|
+ private void build0ClothFactory(SettlementManageFactory settlementManageFactory) {
|
|
|
// 工厂结算金额总和
|
|
|
settlementManageFactory.setFactorySettlementAmount(BigDecimal.ZERO);
|
|
|
// 材料结算金额总和
|
|
@@ -492,14 +549,16 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
settlementManageFactory.setTotalTransactionNum(0);
|
|
|
// 工厂实际收入
|
|
|
settlementManageFactory.setRealIncomeAmount(BigDecimal.ZERO);
|
|
|
+ //
|
|
|
+ settlementManageFactory.setRemark("无入厂洗衣订单");
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 工厂本月有衣服时,计算数量
|
|
|
+ *
|
|
|
* @param settlementManageFactory
|
|
|
-
|
|
|
*/
|
|
|
- private void buildHasClothFactory(SettlementManageFactory settlementManageFactory, List<OrderClothItem> orderClothItemList){
|
|
|
+ private void buildHasClothFactory(SettlementManageFactory settlementManageFactory, List<OrderClothItem> orderClothItemList) {
|
|
|
// 工厂结算金额总和
|
|
|
settlementManageFactory.setFactorySettlementAmount(
|
|
|
orderClothItemList.stream().map(OrderClothItem::getFactorySettlementAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
@@ -524,11 +583,12 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
|
|
|
|
|
|
/**
|
|
|
* 构建工厂账单基础数据
|
|
|
+ *
|
|
|
* @param settlementManageFactory
|
|
|
* @param settlementManageBill
|
|
|
* @param factory
|
|
|
*/
|
|
|
- private void buildFactorySettlementInfo(SettlementManageFactory settlementManageFactory, SettlementManageBill settlementManageBill, ManageFactory factory){
|
|
|
+ private void buildFactorySettlementInfo(SettlementManageFactory settlementManageFactory, SettlementManageBill settlementManageBill, ManageFactory factory) {
|
|
|
settlementManageFactory.setBillId(settlementManageBill.getId());
|
|
|
settlementManageFactory.setSourceType(SourceType.FACTORY.getCode());
|
|
|
settlementManageFactory.setOrgId(factory.getId());
|