|
|
@ -2,11 +2,14 @@ package com.qniao.dam.application.handler.revenuereward; |
|
|
|
|
|
|
|
|
import com.google.common.eventbus.Subscribe; |
|
|
import com.google.common.eventbus.Subscribe; |
|
|
import com.qniao.dam.application.service.revenuereward.RevenueRewardApplicationService; |
|
|
import com.qniao.dam.application.service.revenuereward.RevenueRewardApplicationService; |
|
|
|
|
|
import com.qniao.dam.domain.aggregate.ffpm.FranchiseFeeProfitManagementAggregate; |
|
|
|
|
|
import com.qniao.dam.domain.aggregate.ffpm.entity.FranchiseFeeProfitManagement; |
|
|
import com.qniao.dam.domain.aggregate.revenuereward.RevenueRewardAggregate; |
|
|
import com.qniao.dam.domain.aggregate.revenuereward.RevenueRewardAggregate; |
|
|
import com.qniao.dam.domain.aggregate.revenuereward.entity.RevenueReward; |
|
|
import com.qniao.dam.domain.aggregate.revenuereward.entity.RevenueReward; |
|
|
import com.qniao.dam.domain.aggregate.revenuereward.valueobj.RevenueRewardRecord; |
|
|
import com.qniao.dam.domain.aggregate.revenuereward.valueobj.RevenueRewardRecord; |
|
|
import com.qniao.dam.domain.aggregate.revenuereward.valueobj.RevenueRewardRecoveredRecord; |
|
|
import com.qniao.dam.domain.aggregate.revenuereward.valueobj.RevenueRewardRecoveredRecord; |
|
|
import com.qniao.dam.domain.aggregate.rewardconfig.entity.RewardConfig; |
|
|
import com.qniao.dam.domain.aggregate.rewardconfig.entity.RewardConfig; |
|
|
|
|
|
import com.qniao.dam.domian.aggregate.revenuereward.event.RevenueRewardRecoveryRequirementFilledEvent; |
|
|
import com.qniao.dam.domian.aggregate.revenuereward.event.RevenueRewardUpdatedEvent; |
|
|
import com.qniao.dam.domian.aggregate.revenuereward.event.RevenueRewardUpdatedEvent; |
|
|
import com.qniao.dam.domian.aggregate.rewardconfig.constant.RewardTypeEnum; |
|
|
import com.qniao.dam.domian.aggregate.rewardconfig.constant.RewardTypeEnum; |
|
|
import com.qniao.dam.domian.aggregate.walletaccount.constant.IdentityTypeEnum; |
|
|
import com.qniao.dam.domian.aggregate.walletaccount.constant.IdentityTypeEnum; |
|
|
@ -17,6 +20,7 @@ import com.qniao.dam.infrastructure.constant.MqQueue; |
|
|
import com.qniao.dam.infrastructure.persistent.dao.domain.RevenueRewardDao; |
|
|
import com.qniao.dam.infrastructure.persistent.dao.domain.RevenueRewardDao; |
|
|
import com.qniao.dam.infrastructure.persistent.dao.domain.RevenueRewardRecoveredRecordDao; |
|
|
import com.qniao.dam.infrastructure.persistent.dao.domain.RevenueRewardRecoveredRecordDao; |
|
|
import com.qniao.dam.infrastructure.persistent.dao.org.OrganizationDao; |
|
|
import com.qniao.dam.infrastructure.persistent.dao.org.OrganizationDao; |
|
|
|
|
|
import com.qniao.dam.query.ffpm.FranchiseFeeProfitManagementQueryService; |
|
|
import com.qniao.dam.query.operationcenter.OperationCenterQueryService; |
|
|
import com.qniao.dam.query.operationcenter.OperationCenterQueryService; |
|
|
import com.qniao.dam.query.revenuereward.RevenueRewardQueryService; |
|
|
import com.qniao.dam.query.revenuereward.RevenueRewardQueryService; |
|
|
import com.qniao.dam.query.rewardconfig.RewardConfigQueryService; |
|
|
import com.qniao.dam.query.rewardconfig.RewardConfigQueryService; |
|
|
@ -63,6 +67,10 @@ public class RevenueRewardEventHandler extends BaseApplicationService { |
|
|
private StoreQueryService storeQueryService; |
|
|
private StoreQueryService storeQueryService; |
|
|
@Resource |
|
|
@Resource |
|
|
private OperationCenterQueryService operationCenterQueryService; |
|
|
private OperationCenterQueryService operationCenterQueryService; |
|
|
|
|
|
@Resource |
|
|
|
|
|
private FranchiseFeeProfitManagementAggregate franchiseFeeProfitManagementAggregate; |
|
|
|
|
|
@Resource |
|
|
|
|
|
private FranchiseFeeProfitManagementQueryService franchiseFeeProfitManagementQueryService; |
|
|
|
|
|
|
|
|
@RabbitListener(bindings = @QueueBinding(value = @Queue(MqQueue.STORE_CREATED), |
|
|
@RabbitListener(bindings = @QueueBinding(value = @Queue(MqQueue.STORE_CREATED), |
|
|
exchange = @Exchange(value = MqExchange.STORE_CREATED, |
|
|
exchange = @Exchange(value = MqExchange.STORE_CREATED, |
|
|
@ -74,31 +82,22 @@ public class RevenueRewardEventHandler extends BaseApplicationService { |
|
|
//经营性质推荐 |
|
|
//经营性质推荐 |
|
|
//推荐服务商回本前 100%获得 |
|
|
//推荐服务商回本前 100%获得 |
|
|
//推荐服务商回本后 先提取50%,剩余20需要被推荐服务商回本50%后才能提取 |
|
|
//推荐服务商回本后 先提取50%,剩余20需要被推荐服务商回本50%后才能提取 |
|
|
} else { |
|
|
|
|
|
//非经营性质推荐 |
|
|
|
|
|
RevenueReward revenueReward = revenueRewardQueryService.queryByOrgId(mq.getRecommendServiceProviderOrgId()); |
|
|
RevenueReward revenueReward = revenueRewardQueryService.queryByOrgId(mq.getRecommendServiceProviderOrgId()); |
|
|
//推荐服务商直接拿取20%,被推荐服务商回本后获得1%管道收益 |
|
|
|
|
|
RewardConfig rewardConfig = rewardConfigQueryService.queryByRewardType(RewardTypeEnum.NON_OPERATING_RECOMMEND); |
|
|
|
|
|
//营收额 20%推荐费 |
|
|
|
|
|
BigDecimal revenue = RewardConfig.calculatePct(mq.getFranchiseFee(), new BigDecimal(rewardConfig.getValue())); |
|
|
|
|
|
//线下收益 |
|
|
|
|
|
RevenueRewardRecord revenueRewardRecord = RevenueRewardRecord.build(TradeTypeEnum.SERVICE_PROVIDER_RECOMMEND_FEE, TradeSceneEnum.OFFLINE, |
|
|
|
|
|
revenue, new BigDecimal(rewardConfig.getValue()), BigDecimal.ZERO, revenue, mq.getFranchiseFee()); |
|
|
|
|
|
revenueRewardRecord.handleContent(Collections.singletonList(mq.getStoreName())); |
|
|
|
|
|
revenueReward.setRecordList(Collections.singletonList(revenueRewardRecord)); |
|
|
|
|
|
//计算本次回本金额 |
|
|
|
|
|
revenueReward.handleRevenueReward(revenue); |
|
|
|
|
|
revenueRewardAggregate.save(revenueReward); |
|
|
|
|
|
//配置回本数据 |
|
|
|
|
|
RevenueRewardRecoveredRecord recoveredRecord = RevenueRewardRecoveredRecord.build(revenueReward.getId(), revenueRewardRecord.getId()); |
|
|
|
|
|
revenueRewardRecoveredRecordDao.insert(recoveredRecord); |
|
|
|
|
|
//补充管道收益 PIPELINE_REVENUE |
|
|
|
|
|
if (revenueReward.getRecoveryRequirement()) { |
|
|
|
|
|
revenueRewardApplicationService.pipeLineRevenue(mq.getRecommendServiceProviderOrgId(), revenueRewardRecord, TradeSceneEnum.OFFLINE); |
|
|
|
|
|
|
|
|
if (!revenueReward.getAllRecoveryRequirement()) { |
|
|
|
|
|
//推荐服务商回本前 100%获得 |
|
|
|
|
|
handleServiceProviderManagementFee(mq.getRecommendServiceProviderOrgId(), mq.getStoreName(), mq.getFranchiseFee(), RewardTypeEnum.OPERATING_RECOMMEND_100); |
|
|
|
|
|
} else { |
|
|
|
|
|
//推荐服务商回本后 先提取50%,剩余20需要被推荐服务商回本50%后才能提取 |
|
|
|
|
|
handleServiceProviderManagementFee(mq.getRecommendServiceProviderOrgId(), mq.getStoreName(), mq.getFranchiseFee(), RewardTypeEnum.OPERATING_RECOMMEND_50); |
|
|
|
|
|
//补充 入驻费分佣管理 |
|
|
|
|
|
FranchiseFeeProfitManagement franchiseFeeProfitManagement = FranchiseFeeProfitManagement.initOrg(mq.getOrgId(), null); |
|
|
|
|
|
franchiseFeeProfitManagementAggregate.create(franchiseFeeProfitManagement); |
|
|
} |
|
|
} |
|
|
//发送事件 检查是否满足回本要求 |
|
|
|
|
|
RevenueRewardUpdatedEvent event = new RevenueRewardUpdatedEvent(revenueReward.getId()); |
|
|
|
|
|
this.sendEvent(event); |
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
//非经营性质推荐 |
|
|
|
|
|
handleServiceProviderManagementFee(mq.getRecommendServiceProviderOrgId(), mq.getStoreName(), mq.getFranchiseFee(), RewardTypeEnum.NON_OPERATING_RECOMMEND); |
|
|
|
|
|
//运营中心收益处理 |
|
|
|
|
|
handleServiceProviderManagementFee(mq.getOperationCenterOrgId(), mq.getStoreName(), mq.getFranchiseFee(), RewardTypeEnum.SERVICE_PROVIDER_MANAGEMENT_FEE); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} catch (Exception e) { |
|
|
} catch (Exception e) { |
|
|
@ -106,12 +105,40 @@ public class RevenueRewardEventHandler extends BaseApplicationService { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void handleServiceProviderManagementFee(Long orgId, |
|
|
|
|
|
String serviceProviderName, |
|
|
|
|
|
BigDecimal franchiseFee, |
|
|
|
|
|
RewardTypeEnum rewardType) { |
|
|
|
|
|
//服务商管理费 |
|
|
|
|
|
RewardConfig rewardConfig = rewardConfigQueryService.queryByRewardType(rewardType); |
|
|
|
|
|
RevenueReward revenueReward = revenueRewardQueryService.queryByOrgId(orgId); |
|
|
|
|
|
BigDecimal revenue = RewardConfig.calculatePct(franchiseFee, new BigDecimal(rewardConfig.getValue())); |
|
|
|
|
|
//线下收益 |
|
|
|
|
|
RevenueRewardRecord revenueRewardRecord = RevenueRewardRecord.build(TradeTypeEnum.SERVICE_PROVIDER_RECOMMEND_FEE, TradeSceneEnum.OFFLINE, |
|
|
|
|
|
revenue, new BigDecimal(rewardConfig.getValue()), BigDecimal.ZERO, revenue, franchiseFee); |
|
|
|
|
|
revenueRewardRecord.handleContent(Collections.singletonList(serviceProviderName)); |
|
|
|
|
|
revenueReward.setRecordList(Collections.singletonList(revenueRewardRecord)); |
|
|
|
|
|
//计算本次回本金额 |
|
|
|
|
|
revenueReward.handleRevenueReward(revenue); |
|
|
|
|
|
revenueRewardAggregate.save(revenueReward); |
|
|
|
|
|
//配置回本数据 |
|
|
|
|
|
RevenueRewardRecoveredRecord recoveredRecord = RevenueRewardRecoveredRecord.build(revenueReward.getId(), revenueRewardRecord.getId()); |
|
|
|
|
|
revenueRewardRecoveredRecordDao.insert(recoveredRecord); |
|
|
|
|
|
//补充管道收益 PIPELINE_REVENUE 全回本后才有管道收益 |
|
|
|
|
|
if (revenueReward.getAllRecoveryRequirement()) { |
|
|
|
|
|
revenueRewardApplicationService.pipeLineRevenue(orgId, revenueRewardRecord, TradeSceneEnum.OFFLINE); |
|
|
|
|
|
} |
|
|
|
|
|
//发送事件 检查是否满足回本要求 |
|
|
|
|
|
RevenueRewardUpdatedEvent reEvent = new RevenueRewardUpdatedEvent(revenueReward.getId()); |
|
|
|
|
|
this.sendEvent(reEvent); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
@Subscribe |
|
|
@Subscribe |
|
|
private void handle(RevenueRewardUpdatedEvent event) { |
|
|
private void handle(RevenueRewardUpdatedEvent event) { |
|
|
try { |
|
|
try { |
|
|
RevenueReward revenueReward = revenueRewardDao.selectById(event.getId()); |
|
|
RevenueReward revenueReward = revenueRewardDao.selectById(event.getId()); |
|
|
//满足回本条件处理 服务商 |
|
|
//满足回本条件处理 服务商 |
|
|
if (IdentityTypeEnum.ORGANIZATION.equals(revenueReward.getIdentityType()) && !revenueReward.getRecoveryRequirement()) { |
|
|
|
|
|
|
|
|
if (IdentityTypeEnum.ORGANIZATION.equals(revenueReward.getIdentityType()) && (!revenueReward.getHalfRecoveryRequirement() || !revenueReward.getAllRecoveryRequirement())) { |
|
|
BigDecimal franchiseFee = null; |
|
|
BigDecimal franchiseFee = null; |
|
|
Organization organization = organizationDao.selectById(revenueReward.getOrgId()); |
|
|
Organization organization = organizationDao.selectById(revenueReward.getOrgId()); |
|
|
if (OrganizationTypeEnum.OPERATION_CENTER.equals(organization.getType())) { |
|
|
if (OrganizationTypeEnum.OPERATION_CENTER.equals(organization.getType())) { |
|
|
@ -122,13 +149,24 @@ public class RevenueRewardEventHandler extends BaseApplicationService { |
|
|
franchiseFee = store.getFranchiseFee(); |
|
|
franchiseFee = store.getFranchiseFee(); |
|
|
} |
|
|
} |
|
|
if (Objects.nonNull(franchiseFee)) { |
|
|
if (Objects.nonNull(franchiseFee)) { |
|
|
RewardConfig rewardConfig = rewardConfigQueryService.queryByRewardType(RewardTypeEnum.SERVICE_PROVIDER_RECOVERY_PCT); |
|
|
|
|
|
BigDecimal recoveredAmount = rewardConfig.calculateReward(franchiseFee); |
|
|
|
|
|
if (Objects.nonNull(revenueReward.getRecoveredAmount()) && revenueReward.getRecoveredAmount().compareTo(recoveredAmount) > 0) { |
|
|
|
|
|
//达到回本条件 |
|
|
|
|
|
revenueReward.setRecoveryRequirement(true); |
|
|
|
|
|
BaseDomainEvent filledEvent = revenueRewardAggregate.fillRecoveryRequirement(revenueReward); |
|
|
|
|
|
this.sendEvent(filledEvent); |
|
|
|
|
|
|
|
|
if (!revenueReward.getHalfRecoveryRequirement()) { |
|
|
|
|
|
RewardConfig rewardConfig = rewardConfigQueryService.queryByRewardType(RewardTypeEnum.SERVICE_PROVIDER_RECOVERY_HALF_PCT); |
|
|
|
|
|
BigDecimal recoveredAmount = rewardConfig.calculateReward(franchiseFee); |
|
|
|
|
|
if (Objects.nonNull(revenueReward.getRecoveredAmount()) && revenueReward.getRecoveredAmount().compareTo(recoveredAmount) > 0) { |
|
|
|
|
|
//达到回本一半条件 |
|
|
|
|
|
revenueReward.setHalfRecoveryRequirement(true); |
|
|
|
|
|
BaseDomainEvent filledEvent = revenueRewardAggregate.fillRecoveryRequirement(revenueReward); |
|
|
|
|
|
this.sendEvent(filledEvent); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
if (!revenueReward.getAllRecoveryRequirement()) { |
|
|
|
|
|
RewardConfig rewardConfig = rewardConfigQueryService.queryByRewardType(RewardTypeEnum.SERVICE_PROVIDER_RECOVERY_ALL_PCT); |
|
|
|
|
|
BigDecimal recoveredAmount = rewardConfig.calculateReward(franchiseFee); |
|
|
|
|
|
if (Objects.nonNull(revenueReward.getRecoveredAmount()) && revenueReward.getRecoveredAmount().compareTo(recoveredAmount) > 0) { |
|
|
|
|
|
//达到全回本条件 |
|
|
|
|
|
revenueReward.setAllRecoveryRequirement(true); |
|
|
|
|
|
revenueRewardAggregate.fillRecoveryRequirement(revenueReward); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
@ -136,4 +174,30 @@ public class RevenueRewardEventHandler extends BaseApplicationService { |
|
|
log.error("收益信息更新事件处理异常", e); |
|
|
log.error("收益信息更新事件处理异常", e); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Subscribe |
|
|
|
|
|
private void handle(RevenueRewardRecoveryRequirementFilledEvent event) { |
|
|
|
|
|
try { |
|
|
|
|
|
//回本一半后,直推推荐的区域服务商可以拿到剩余20%的入驻费 |
|
|
|
|
|
RevenueReward revenueReward = revenueRewardDao.selectById(event.getId()); |
|
|
|
|
|
FranchiseFeeProfitManagement franchiseFeeProfitManagement = franchiseFeeProfitManagementQueryService.queryByOrg(revenueReward.getOrgId()); |
|
|
|
|
|
if (Objects.nonNull(franchiseFeeProfitManagement) && !franchiseFeeProfitManagement.getIsFinish()) { |
|
|
|
|
|
Organization organization = organizationDao.selectById(revenueReward.getOrgId()); |
|
|
|
|
|
Long recommendServiceProviderOrgId = null; |
|
|
|
|
|
BigDecimal franchiseFee = null; |
|
|
|
|
|
if (OrganizationTypeEnum.OPERATION_CENTER.equals(organization.getType())) { |
|
|
|
|
|
OperationCenter operationCenter = operationCenterQueryService.queryByOrg(revenueReward.getOrgId()); |
|
|
|
|
|
franchiseFee = operationCenter.getFranchiseFee(); |
|
|
|
|
|
recommendServiceProviderOrgId = operationCenter.getRecommendServiceProviderOrgId(); |
|
|
|
|
|
} else if (OrganizationTypeEnum.STORE.equals(organization.getType())) { |
|
|
|
|
|
Store store = storeQueryService.queryByOrg(revenueReward.getOrgId()); |
|
|
|
|
|
franchiseFee = store.getFranchiseFee(); |
|
|
|
|
|
recommendServiceProviderOrgId = store.getRecommendServiceProviderOrgId(); |
|
|
|
|
|
} |
|
|
|
|
|
handleServiceProviderManagementFee(recommendServiceProviderOrgId, organization.getFullName(), franchiseFee, RewardTypeEnum.OPERATING_RECOMMEND_20); |
|
|
|
|
|
} |
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
|
log.error("服务商回本事件处理异常"); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
} |