|
|
@ -57,6 +57,7 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe |
|
|
|
private final TbsActivityService activityService; |
|
|
|
private final TbsActivitySubjectService activitySubjectService; |
|
|
|
private final TbsActivityCenterGoodsService activityCenterGoodsService; |
|
|
|
private final TbsActivityCenterService activityCenterService; |
|
|
|
|
|
|
|
private final BmsSubjectService subjectService; |
|
|
|
private final BmsChannelService channelService; |
|
|
@ -81,6 +82,7 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe |
|
|
|
BigDecimal releaseAmount = validActivity(activity,false); |
|
|
|
TbsActivity param = new TbsActivity(); |
|
|
|
param.setId(activityId); |
|
|
|
param.setActivityState(TbsActivityState.STATE_4_Release); |
|
|
|
param.setReleaseUserId(sysUser.getId()); |
|
|
|
param.setReleaseUserName(sysUser.getName()); |
|
|
|
param.setReleaseFlag(1); |
|
|
@ -148,8 +150,9 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe |
|
|
|
verification.setRemark(verificationBo.getRemark()); |
|
|
|
List<VtbVerificationChannelBo> channelBoList = verificationBo.getChannelList(); |
|
|
|
List<VtbVerificationChannelPointBo> pointBoList = verificationBo.getPointList(); |
|
|
|
List<VtbVerificationChannel> vtbVerificationChannelList = new ArrayList<>(); |
|
|
|
List<VtbVerificationChannelPoint> verificationChannelPointList = new ArrayList<>(); |
|
|
|
if(CollectionUtil.isNotEmpty(channelBoList)){ |
|
|
|
List<VtbVerificationChannel> vtbVerificationChannelList = new ArrayList<>(); |
|
|
|
for (VtbVerificationChannelBo channelBo : channelBoList) { |
|
|
|
BmsChannel channel = channelService.getById(channelBo.getChannelId()); |
|
|
|
VtbVerificationChannel verificationChannel = new VtbVerificationChannel(); |
|
|
@ -163,9 +166,7 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe |
|
|
|
verificationChannel.setRemark(channelBo.getRemark()); |
|
|
|
vtbVerificationChannelList.add(verificationChannel); |
|
|
|
} |
|
|
|
verificationChannelService.saveBatch(vtbVerificationChannelList); |
|
|
|
}else if (CollectionUtil.isNotEmpty(pointBoList)){ |
|
|
|
List<VtbVerificationChannelPoint> activityChannelPointList = new ArrayList<>(); |
|
|
|
for (VtbVerificationChannelPointBo channelPointBo : pointBoList) { |
|
|
|
BmsChannelPoint channelPoint = channelPointService.getById(channelPointBo.getPointId()); |
|
|
|
BmsChannel channel = channelService.getById(channelPoint.getChannelId()); |
|
|
@ -180,11 +181,16 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe |
|
|
|
channelPoint1.setPointName(channelPoint.getPointName()); |
|
|
|
channelPoint1.setPointRate(channelPointBo.getPointRate()); |
|
|
|
channelPoint1.setRemark(channelPointBo.getRemark()); |
|
|
|
activityChannelPointList.add(channelPoint1); |
|
|
|
verificationChannelPointList.add(channelPoint1); |
|
|
|
} |
|
|
|
verificationChannelPointService.saveBatch(activityChannelPointList); |
|
|
|
} |
|
|
|
List<VtbVerificationSubject> verificationSubjects = validCreateVeriSubject(verificationBo, activity, costApply); |
|
|
|
//设置总金额
|
|
|
|
BigDecimal totalAmount = BigDecimal.ZERO; |
|
|
|
for (VtbVerificationSubject verificationSubject : verificationSubjects) { |
|
|
|
totalAmount = totalAmount.add(verificationSubject.getUsedAmount()); |
|
|
|
} |
|
|
|
verification.setAmount(totalAmount); |
|
|
|
//保存
|
|
|
|
this.saveOrUpdate(verification); |
|
|
|
//移除历史提交记录
|
|
|
@ -193,6 +199,14 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe |
|
|
|
verificationChannelPointService.removeByVerificationId(verificationBo.getId()); |
|
|
|
verificationSubjectService.removeByVerificationId(verificationBo.getId()); |
|
|
|
} |
|
|
|
if(CollectionUtil.isNotEmpty(vtbVerificationChannelList)){ |
|
|
|
vtbVerificationChannelList.forEach(obj->obj.setVerificationId(verification.getId())); |
|
|
|
verificationChannelService.saveBatch(vtbVerificationChannelList); |
|
|
|
} |
|
|
|
if(CollectionUtil.isNotEmpty(verificationChannelPointList)){ |
|
|
|
verificationChannelPointList.forEach(obj->obj.setVerificationId(verification.getId())); |
|
|
|
verificationChannelPointService.saveBatch(verificationChannelPointList); |
|
|
|
} |
|
|
|
//保存科目费用
|
|
|
|
verificationSubjects.forEach(obj->obj.setVerificationId(verification.getId())); |
|
|
|
verificationSubjectService.saveBatch(verificationSubjects); |
|
|
@ -200,13 +214,14 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe |
|
|
|
activityParam.setId(activity.getId()); |
|
|
|
activityParam.setActivityState(TbsActivityState.STATE_1_Checking); |
|
|
|
activityService.updateById(activityParam); |
|
|
|
//todo 提交到OA
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* 校验活动 |
|
|
|
* @param activity |
|
|
|
* @param filterActTime 释放拦截活动结束 |
|
|
|
* @param filterActTime 拦截活动结束 |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
private BigDecimal validActivity(TbsActivity activity,boolean filterActTime){ |
|
|
@ -219,7 +234,7 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe |
|
|
|
if(activity.getActivityState().equals(TbsActivityState.STATE_1_Baning)){ |
|
|
|
Assert.throwEx("活动冻结中"); |
|
|
|
} |
|
|
|
if(activity.getReleaseFlag().equals(1)){ |
|
|
|
if(activity.getReleaseFlag().equals(1)||activity.getActivityState().equals(TbsActivityState.STATE_4_Release)){ |
|
|
|
Assert.throwEx("费用已释放"); |
|
|
|
} |
|
|
|
if(activity.getFinishedFlag().equals(1)){ |
|
|
@ -301,86 +316,45 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe |
|
|
|
public void successCommit(Long verificationId) { |
|
|
|
log.info("活动核销提交成功。verificationId:{}",verificationId); |
|
|
|
VtbVerification verification = this.getById(verificationId); |
|
|
|
//移除历史数据
|
|
|
|
LambdaQueryWrapper<VtbFundFlow> lqw = new LambdaQueryWrapper<>(); |
|
|
|
lqw.eq(VtbFundFlow::getVerificationId,verificationId); |
|
|
|
fundFlowService.remove(lqw); |
|
|
|
List<VtbVerificationSubject> verificationSubjects = verificationSubjectService.listByVerificationId(verification.getId()); |
|
|
|
List<TbsActivityCenterGoods> activityCenterGoodsAllList = activityCenterGoodsService.listByActivityId(verification.getActivityId()); |
|
|
|
List<VtbFundFlow> addFundFlowList = new ArrayList<>(); |
|
|
|
List<TbsActivityCenter> activityCenterList = activityCenterService.listByActivity(verification.getActivityId()); |
|
|
|
//生成费用流水记录
|
|
|
|
Map<Long,List<TbsActivityCenterGoods>> centerGoodsMapBySubject = activityCenterGoodsAllList.stream() |
|
|
|
.collect(Collectors.groupingBy(TbsActivityCenterGoods::getSubjectId)); |
|
|
|
Map<Long,List<TbsActivityCenter>> centerMapBySubject = activityCenterList.stream() |
|
|
|
.collect(Collectors.groupingBy(TbsActivityCenter::getSubjectId)); |
|
|
|
List<VtbFundFlow> addFundFlowList = new ArrayList<>(); |
|
|
|
for (VtbVerificationSubject verificationSubject : verificationSubjects) { |
|
|
|
List<VtbFundFlow> addFundFlowListOfSubject = new ArrayList<>(); |
|
|
|
Long subjectId = verificationSubject.getSubjectId(); |
|
|
|
BigDecimal usedAmount = verificationSubject.getUsedAmount(); |
|
|
|
List<TbsActivityCenterGoods> activityCenterGoodsOfSubject = centerGoodsMapBySubject.get(subjectId); |
|
|
|
//统计前面项合计金额
|
|
|
|
BigDecimal totalPrefixAmount = BigDecimal.ZERO; |
|
|
|
//统计不匹配金额
|
|
|
|
BigDecimal unMatchAmount = BigDecimal.ZERO; |
|
|
|
for (int i = 0; i < activityCenterGoodsOfSubject.size(); i++) { |
|
|
|
TbsActivityCenterGoods centerGoods = activityCenterGoodsOfSubject.get(i); |
|
|
|
BigDecimal currentTimeAmount; |
|
|
|
if(i==activityCenterGoodsOfSubject.size()-1){ |
|
|
|
currentTimeAmount = usedAmount.subtract(totalPrefixAmount); |
|
|
|
}else { |
|
|
|
currentTimeAmount = usedAmount.multiply(centerGoods.getCenterGoodsRate()) |
|
|
|
.multiply(centerGoods.getCenterRate()) |
|
|
|
//四舍五入保留两位小数
|
|
|
|
.divide(new BigDecimal(10000), RoundingMode.HALF_UP); |
|
|
|
//防止费率为0情况
|
|
|
|
if(currentTimeAmount.compareTo(BigDecimal.ZERO)==0){ |
|
|
|
continue; |
|
|
|
} |
|
|
|
} |
|
|
|
//可用金额
|
|
|
|
BigDecimal allowBalance = centerGoods.getCenterGoodsAmount().subtract(centerGoods.getUsedAmount()); |
|
|
|
if(allowBalance.compareTo(BigDecimal.ZERO)==0){ |
|
|
|
log.debug("统计不匹配金额allowBalance:{},currentTimeAmount:{}",allowBalance.doubleValue(),currentTimeAmount.doubleValue()); |
|
|
|
unMatchAmount.add(currentTimeAmount); |
|
|
|
continue; |
|
|
|
} |
|
|
|
BigDecimal tempBalance = BigDecimal.ZERO; |
|
|
|
//如果不够减
|
|
|
|
if(allowBalance.compareTo(currentTimeAmount)<1){ |
|
|
|
//统计不匹配金额
|
|
|
|
unMatchAmount = unMatchAmount.add(currentTimeAmount.subtract(allowBalance)); |
|
|
|
log.debug("统计不匹配金额allowBalance:{},currentTimeAmount:{}",allowBalance.doubleValue(),currentTimeAmount.doubleValue()); |
|
|
|
currentTimeAmount = allowBalance; |
|
|
|
}else { |
|
|
|
tempBalance = allowBalance.subtract(currentTimeAmount); |
|
|
|
} |
|
|
|
VtbFundFlow fundFlow = CopierUtil.copy(centerGoods,new VtbFundFlow()); |
|
|
|
fundFlow.setId(null); |
|
|
|
fundFlow.setUsedAmount(currentTimeAmount); |
|
|
|
fundFlow.setFundType(VtbFundFlowType.Release); |
|
|
|
fundFlow.setVerificationId(verificationId); |
|
|
|
fundFlow.setTempBalance(tempBalance); |
|
|
|
addFundFlowListOfSubject.add(fundFlow); |
|
|
|
} |
|
|
|
//todo 1400元 44次 33行
|
|
|
|
//打乱顺序,保存前平摊费用
|
|
|
|
Collections.shuffle(addFundFlowListOfSubject); |
|
|
|
for (VtbFundFlow fundFlow : addFundFlowListOfSubject) { |
|
|
|
if(unMatchAmount.compareTo(BigDecimal.ZERO)>0){ |
|
|
|
BigDecimal tmpBalance = fundFlow.getTempBalance(); |
|
|
|
if(tmpBalance.compareTo(BigDecimal.ZERO)>0){ |
|
|
|
if(tmpBalance.compareTo(unMatchAmount)>0){ |
|
|
|
BigDecimal resultBalance = fundFlow.getUsedAmount().add(unMatchAmount); |
|
|
|
fundFlow.setUsedAmount(resultBalance); |
|
|
|
break; |
|
|
|
}else { |
|
|
|
unMatchAmount = unMatchAmount.subtract(fundFlow.getTempBalance()); |
|
|
|
BigDecimal resultBalance = fundFlow.getUsedAmount().add(tmpBalance); |
|
|
|
fundFlow.setUsedAmount(resultBalance); |
|
|
|
} |
|
|
|
} |
|
|
|
Map<String,List<TbsActivityCenterGoods>> activityGoodsOfSubjectCenter = activityCenterGoodsOfSubject.stream() |
|
|
|
.collect(Collectors.groupingBy(obj->obj.getCenterType()+":"+obj.getCenterId())); |
|
|
|
|
|
|
|
List<TbsActivityCenter> activityCenters = centerMapBySubject.get(subjectId); |
|
|
|
//统计最后一项为减法
|
|
|
|
BigDecimal preCenterAmount = BigDecimal.ZERO; |
|
|
|
for (int i = 0; i < activityCenters.size(); i++) { |
|
|
|
TbsActivityCenter activityCenter = activityCenters.get(i); |
|
|
|
String subjectCenterKey = activityCenter.getCenterType()+":"+activityCenter.getCenterId(); |
|
|
|
List<TbsActivityCenterGoods> activityGoodsListOfSubjectCenter = activityGoodsOfSubjectCenter.get(subjectCenterKey); |
|
|
|
//当前成本中心分配金额
|
|
|
|
BigDecimal currentCenterAmount; |
|
|
|
if(i == activityCenters.size()-1){ |
|
|
|
currentCenterAmount = usedAmount.subtract(preCenterAmount); |
|
|
|
}else { |
|
|
|
break; |
|
|
|
currentCenterAmount = usedAmount.multiply(activityCenter.getCenterRate()) |
|
|
|
.divide(new BigDecimal("100"), RoundingMode.HALF_DOWN) |
|
|
|
.setScale(2, RoundingMode.DOWN); |
|
|
|
preCenterAmount = preCenterAmount.add(currentCenterAmount); |
|
|
|
} |
|
|
|
buildFundFlows(verificationId, addFundFlowList, activityGoodsListOfSubjectCenter,currentCenterAmount); |
|
|
|
} |
|
|
|
if(unMatchAmount.compareTo(BigDecimal.ZERO)>0){ |
|
|
|
log.error("异常数据,费用核销[{}]超额:{}",verificationId,unMatchAmount.doubleValue()); |
|
|
|
} |
|
|
|
addFundFlowList.addAll(addFundFlowListOfSubject); |
|
|
|
} |
|
|
|
fundFlowService.saveBatch(addFundFlowList); |
|
|
|
//更新已用费用记录
|
|
|
@ -388,6 +362,92 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe |
|
|
|
//todo 远程调用第三方接口
|
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 建立流水列表 |
|
|
|
* @param verificationId |
|
|
|
* @param addFundFlowList |
|
|
|
* @param activityCenterGoodsOfSubject |
|
|
|
* @param usedAmount |
|
|
|
*/ |
|
|
|
private void buildFundFlows(Long verificationId, |
|
|
|
List<VtbFundFlow> addFundFlowList, |
|
|
|
List<TbsActivityCenterGoods> activityCenterGoodsOfSubject, |
|
|
|
BigDecimal usedAmount) { |
|
|
|
List<VtbFundFlow> addFundFlowListOfSubject = new ArrayList<>(); |
|
|
|
//统计不匹配金额
|
|
|
|
BigDecimal unMatchAmount = BigDecimal.ZERO; |
|
|
|
for (int i = 0; i < activityCenterGoodsOfSubject.size(); i++) { |
|
|
|
TbsActivityCenterGoods centerGoods = activityCenterGoodsOfSubject.get(i); |
|
|
|
BigDecimal currentTimeAmount; |
|
|
|
if(i==activityCenterGoodsOfSubject.size()-1){ |
|
|
|
BigDecimal totalPrefixAmount = BigDecimal.ZERO; |
|
|
|
for (VtbFundFlow fundFlow : addFundFlowListOfSubject) { |
|
|
|
totalPrefixAmount = totalPrefixAmount.add(fundFlow.getUsedAmount()); |
|
|
|
} |
|
|
|
currentTimeAmount = usedAmount.subtract(totalPrefixAmount); |
|
|
|
}else { |
|
|
|
currentTimeAmount = usedAmount.multiply(centerGoods.getCenterGoodsRate()) |
|
|
|
.multiply(centerGoods.getCenterRate()) |
|
|
|
//四舍五入保留两位小数
|
|
|
|
.divide(new BigDecimal("10000"), RoundingMode.HALF_DOWN) |
|
|
|
.setScale(2, RoundingMode.DOWN);; |
|
|
|
} |
|
|
|
//可用金额
|
|
|
|
BigDecimal allowBalance = centerGoods.getCenterGoodsAmount().subtract(centerGoods.getUsedAmount()); |
|
|
|
if(allowBalance.compareTo(BigDecimal.ZERO)==0){ |
|
|
|
log.debug("统计不匹配金额allowBalance:{},currentTimeAmount:{}",allowBalance.doubleValue(),currentTimeAmount.doubleValue()); |
|
|
|
unMatchAmount.add(currentTimeAmount); |
|
|
|
continue; |
|
|
|
} |
|
|
|
BigDecimal tempBalance = BigDecimal.ZERO; |
|
|
|
//如果不够减
|
|
|
|
if(allowBalance.compareTo(currentTimeAmount)<1){ |
|
|
|
//统计不匹配金额
|
|
|
|
unMatchAmount = unMatchAmount.add(currentTimeAmount.subtract(allowBalance)); |
|
|
|
log.debug("统计不匹配金额allowBalance:{},currentTimeAmount:{}",allowBalance.doubleValue(),currentTimeAmount.doubleValue()); |
|
|
|
currentTimeAmount = allowBalance; |
|
|
|
}else { |
|
|
|
tempBalance = allowBalance.subtract(currentTimeAmount); |
|
|
|
} |
|
|
|
VtbFundFlow fundFlow = CopierUtil.copy(centerGoods,new VtbFundFlow()); |
|
|
|
fundFlow.setId(null); |
|
|
|
fundFlow.setUsedAmount(currentTimeAmount); |
|
|
|
fundFlow.setFundType(VtbFundFlowType.Verification); |
|
|
|
fundFlow.setVerificationId(verificationId); |
|
|
|
fundFlow.setTempBalance(tempBalance); |
|
|
|
fundFlow.setCenterGoodItemId(centerGoods.getId()); |
|
|
|
addFundFlowListOfSubject.add(fundFlow); |
|
|
|
} |
|
|
|
//打乱顺序,保存前平摊费用
|
|
|
|
Collections.shuffle(addFundFlowListOfSubject); |
|
|
|
for (VtbFundFlow fundFlow : addFundFlowListOfSubject) { |
|
|
|
fundFlow.setCreateTime(null); |
|
|
|
fundFlow.setUpdateTime(null); |
|
|
|
fundFlow.setCreateBy(null); |
|
|
|
fundFlow.setUpdateBy(null); |
|
|
|
if(unMatchAmount.compareTo(BigDecimal.ZERO)>0){ |
|
|
|
BigDecimal tmpBalance = fundFlow.getTempBalance(); |
|
|
|
if(tmpBalance.compareTo(BigDecimal.ZERO)>0){ |
|
|
|
if(tmpBalance.compareTo(unMatchAmount)>0){ |
|
|
|
BigDecimal resultBalance = fundFlow.getUsedAmount().add(unMatchAmount); |
|
|
|
fundFlow.setUsedAmount(resultBalance); |
|
|
|
break; |
|
|
|
}else { |
|
|
|
unMatchAmount = unMatchAmount.subtract(fundFlow.getTempBalance()); |
|
|
|
BigDecimal resultBalance = fundFlow.getUsedAmount().add(tmpBalance); |
|
|
|
fundFlow.setUsedAmount(resultBalance); |
|
|
|
} |
|
|
|
} |
|
|
|
}else { |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
if(unMatchAmount.compareTo(BigDecimal.ZERO)>0){ |
|
|
|
log.error("异常数据,费用核销[{}]超额:{}", verificationId,unMatchAmount.doubleValue()); |
|
|
|
} |
|
|
|
addFundFlowList.addAll(addFundFlowListOfSubject); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
public boolean checkCommitting(Long activityId) { |
|
|
|