|
|
@ -512,12 +512,12 @@ public class TbsCostApplyOperationServiceImpl implements SeeYonOperationService |
|
|
|
List<TbsActivity> activityList = tbsActivityMapper.selectList(comm_qw); |
|
|
|
List<TbsActivitySubject> activitySubjectList = activitySubjectMapper.selectList(comm_qw); |
|
|
|
//判断subjectId是否匹配
|
|
|
|
Set<Long> subjectIds = new HashSet<>(param.getAffairSubjectLines().stream() |
|
|
|
Set<Long> activitySubjectIds = new HashSet<>(param.getAffairSubjectLines().stream() |
|
|
|
.map(TbsAffairCommitBo.AffairSubjectLine::getSubjectId).collect(Collectors.toList())); |
|
|
|
for (TbsActivitySubject activitySubject : activitySubjectList) { |
|
|
|
subjectIds.add(activitySubject.getId()); |
|
|
|
activitySubjectIds.add(activitySubject.getId()); |
|
|
|
} |
|
|
|
if(subjectIds.size()>activitySubjectList.size()){ |
|
|
|
if(activitySubjectIds.size()>activitySubjectList.size()){ |
|
|
|
Assert.throwEx("请求有错误的参数"); |
|
|
|
} |
|
|
|
List<TbsActivityCenter> activityCenterList = activityCenterMapper.selectList(comm_qw); |
|
|
@ -526,32 +526,32 @@ public class TbsCostApplyOperationServiceImpl implements SeeYonOperationService |
|
|
|
//初始化重新计算
|
|
|
|
activityList.forEach(a->a.setTotalAmount(BigDecimal.ZERO)); |
|
|
|
//先计算科目的费用
|
|
|
|
for (TbsActivitySubject subject : activitySubjectList) { |
|
|
|
for (TbsActivitySubject activitySubject : activitySubjectList) { |
|
|
|
for (TbsAffairCommitBo.AffairSubjectLine subjectLine : param.getAffairSubjectLines()) { |
|
|
|
if(subjectLine.getSubjectId().equals(subject.getId())){ |
|
|
|
if(subjectLine.getSubjectId().equals(activitySubject.getId())){ |
|
|
|
BigDecimal subjectAmount = subjectLine.getAmount(); |
|
|
|
//重新计算活动金额
|
|
|
|
TbsActivity currActivity = new TbsActivity(); |
|
|
|
for (TbsActivity activity : activityList) { |
|
|
|
if(subject.getActivityId().equals(activity.getId())){ |
|
|
|
if(activitySubject.getActivityId().equals(activity.getId())){ |
|
|
|
activity.setTotalAmount(activity.getTotalAmount().add(subjectAmount)); |
|
|
|
currActivity = activity; |
|
|
|
} |
|
|
|
} |
|
|
|
//保持流程记录
|
|
|
|
TbsActivitySubjectYarn subjectYarn = this.createActivitySubjectYarn(param, sysUser, costApply, subject, subjectLine, currActivity); |
|
|
|
TbsActivitySubjectYarn subjectYarn = this.createActivitySubjectYarn(param, sysUser, costApply, activitySubject, subjectLine, currActivity); |
|
|
|
tbsActivitySubjectYarnMapper.insert(subjectYarn); |
|
|
|
if(noChanged){ |
|
|
|
//审批期间,只对第一次审批赋值
|
|
|
|
subject.setOrgAmount(subject.getAmount()); |
|
|
|
activitySubject.setOrgAmount(activitySubject.getAmount()); |
|
|
|
} |
|
|
|
subject.setAmount(subjectAmount); |
|
|
|
subject.setCountPerson(subjectLine.getCountPerson()); |
|
|
|
subject.setCountSession(subjectLine.getCountSession()); |
|
|
|
activitySubject.setAmount(subjectAmount); |
|
|
|
activitySubject.setCountPerson(subjectLine.getCountPerson()); |
|
|
|
activitySubject.setCountSession(subjectLine.getCountSession()); |
|
|
|
//更新科目
|
|
|
|
activitySubjectMapper.updateById(subject); |
|
|
|
activitySubjectMapper.updateById(activitySubject); |
|
|
|
//计算科目下的成本中心
|
|
|
|
this.changeActivityCenterGoodsAmt(noChanged, activityCenterList, activityCenterGoodsList, subject, subjectAmount); |
|
|
|
this.changeActivityCenterGoodsAmt(noChanged, activityCenterList, activityCenterGoodsList, activitySubject, subjectAmount); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
@ -605,7 +605,7 @@ public class TbsCostApplyOperationServiceImpl implements SeeYonOperationService |
|
|
|
* @param subject |
|
|
|
* @param subjectAmount |
|
|
|
*/ |
|
|
|
private void changeActivityCenterGoodsAmt(boolean noChanged, |
|
|
|
public void changeActivityCenterGoodsAmt(boolean noChanged, |
|
|
|
List<TbsActivityCenter> activityCenterList, |
|
|
|
List<TbsActivityCenterGoods> activityCenterGoodsList, |
|
|
|
TbsActivitySubject subject, |
|
|
@ -614,18 +614,85 @@ public class TbsCostApplyOperationServiceImpl implements SeeYonOperationService |
|
|
|
|
|
|
|
BigDecimal subjectAmountSpuir = subjectAmount; |
|
|
|
|
|
|
|
for (int ii = 0; ii < activityCenterList.size(); ii++) { |
|
|
|
List<TbsActivityCenter> currentActivityCenterList = activityCenterList.stream().filter(center-> |
|
|
|
center.getActivityId().equals(subject.getActivityId())&¢er.getSubjectId().equals(subject.getSubjectId()) |
|
|
|
).collect(Collectors.toList()); |
|
|
|
|
|
|
|
List<TbsActivityCenterGoods> currentActivityCenterGoodsList = activityCenterGoodsList.stream().filter(cg-> |
|
|
|
cg.getActivityId().equals(subject.getActivityId())&&cg.getSubjectId().equals(subject.getSubjectId()) |
|
|
|
).collect(Collectors.toList()); |
|
|
|
|
|
|
|
//校验获得成本中心下的商品金额比例确保100%
|
|
|
|
for (TbsActivityCenter activityCenter : currentActivityCenterList) { |
|
|
|
List<TbsActivityCenterGoods> activityCenterGoodsTmpList = this.getTbsActivityCenterGoodsByActCenter(currentActivityCenterGoodsList, activityCenter); |
|
|
|
|
|
|
|
BigDecimal goodsRateTotal = BigDecimal.ZERO; |
|
|
|
for (TbsActivityCenterGoods centerGoods : activityCenterGoodsTmpList) { |
|
|
|
goodsRateTotal = goodsRateTotal.add(centerGoods.getCenterGoodsRate()); |
|
|
|
} |
|
|
|
if(goodsRateTotal.compareTo(n100)!=0){ |
|
|
|
log.error("活动ID:{} 的商品比例错误:{} ,即将重新分配活动成本中心比例",subject.getActivityId(),goodsRateTotal); |
|
|
|
} |
|
|
|
BigDecimal centerRateSurplus = n100; |
|
|
|
BigDecimal itemRate = n100.divide(new BigDecimal(activityCenterGoodsTmpList.size()),1,RoundingMode.DOWN); |
|
|
|
for (int i = 0; i < activityCenterGoodsTmpList.size(); i++) { |
|
|
|
TbsActivityCenterGoods activityCenterGoods = activityCenterGoodsTmpList.get(i); |
|
|
|
if( i+1 == activityCenterGoodsTmpList.size()){ |
|
|
|
activityCenterGoods.setCenterGoodsRate(centerRateSurplus); |
|
|
|
}else { |
|
|
|
activityCenterGoods.setCenterGoodsRate(itemRate); |
|
|
|
centerRateSurplus = centerRateSurplus.subtract(itemRate); |
|
|
|
} |
|
|
|
activityCenterGoodsMapper.updateById(activityCenterGoods); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
BigDecimal centerRateTotal = BigDecimal.ZERO; |
|
|
|
for (TbsActivityCenter center : currentActivityCenterList) { |
|
|
|
centerRateTotal = centerRateTotal.add(center.getCenterRate()); |
|
|
|
} |
|
|
|
|
|
|
|
//确保科目的百分比正确
|
|
|
|
if(centerRateTotal.compareTo(n100)!=0){ |
|
|
|
log.error("活动ID:{} 的比例错误:{} ,即将重新分配活动成本中心比例",subject.getActivityId(),centerRateTotal); |
|
|
|
BigDecimal centerRateSurplus = n100; |
|
|
|
BigDecimal itemRate = centerRateSurplus.divide(new BigDecimal(currentActivityCenterList.size()),1,RoundingMode.DOWN); |
|
|
|
for (int i = 0; i < currentActivityCenterList.size(); i++) { |
|
|
|
TbsActivityCenter center = currentActivityCenterList.get(i); |
|
|
|
if( i+1 == currentActivityCenterList.size() ){ |
|
|
|
center.setCenterRate(centerRateSurplus); |
|
|
|
}else { |
|
|
|
center.setCenterRate(itemRate); |
|
|
|
centerRateSurplus = centerRateSurplus.subtract(itemRate); |
|
|
|
} |
|
|
|
for (TbsActivityCenterGoods centerGoods : currentActivityCenterGoodsList) { |
|
|
|
boolean b1 = centerGoods.getSubjectId().equals(center.getSubjectId()); |
|
|
|
boolean b2 = centerGoods.getCenterType().equals(center.getCenterType()); |
|
|
|
boolean b3 = centerGoods.getCenterId().equals(center.getCenterId()); |
|
|
|
if(b1&&b2&&b3){ |
|
|
|
centerGoods.setCenterRate(center.getCenterRate()); |
|
|
|
activityCenterGoodsMapper.updateById(centerGoods); |
|
|
|
} |
|
|
|
} |
|
|
|
activityCenterMapper.updateById(center); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for (int ii = 0; ii < currentActivityCenterList.size(); ii++) { |
|
|
|
TbsActivityCenter activityCenter = activityCenterList.get(ii); |
|
|
|
boolean eqActivity = activityCenter.getActivityId().equals(subject.getActivityId()); |
|
|
|
boolean eqSubject = activityCenter.getSubjectId().equals(subject.getSubjectId()); |
|
|
|
if(eqActivity&&eqSubject){ |
|
|
|
// 根据比例重新计算
|
|
|
|
BigDecimal centerAmt = activityCenter.getCenterRate() |
|
|
|
.multiply(subjectAmount).divide(n100,2, RoundingMode.HALF_UP); |
|
|
|
if (noChanged){ |
|
|
|
//只对第一次赋值
|
|
|
|
// 只对第一次赋值
|
|
|
|
activityCenter.setOrgCenterAmount(activityCenter.getCenterAmount()); |
|
|
|
} |
|
|
|
if(ii+1 == activityCenterList.size()){ |
|
|
|
// 最后一项
|
|
|
|
activityCenter.setCenterAmount(subjectAmountSpuir); |
|
|
|
}else { |
|
|
|
subjectAmountSpuir = subjectAmountSpuir.subtract(centerAmt); |
|
|
@ -635,13 +702,7 @@ public class TbsCostApplyOperationServiceImpl implements SeeYonOperationService |
|
|
|
//计算成本中心下的商品
|
|
|
|
BigDecimal tmpCenterAmt = activityCenter.getCenterAmount(); |
|
|
|
|
|
|
|
List<TbsActivityCenterGoods> activityCenterGoodsTmpList = activityCenterGoodsList.stream().filter(centerGoods->{ |
|
|
|
boolean eqActivity4Goods = centerGoods.getActivityId().equals(activityCenter.getActivityId()); |
|
|
|
boolean eqCenter4Goods = centerGoods.getCenterType().equals(activityCenter.getCenterType()) |
|
|
|
&¢erGoods.getCenterId().equals(activityCenter.getCenterId()); |
|
|
|
boolean eqSubject4Goods = centerGoods.getSubjectId().equals(activityCenter.getSubjectId()); |
|
|
|
return eqActivity4Goods&&eqCenter4Goods&&eqSubject4Goods; |
|
|
|
}).collect(Collectors.toList()); |
|
|
|
List<TbsActivityCenterGoods> activityCenterGoodsTmpList = this.getTbsActivityCenterGoodsByActCenter(currentActivityCenterGoodsList, activityCenter); |
|
|
|
|
|
|
|
for (int i = 0; i < activityCenterGoodsTmpList.size(); i++) { |
|
|
|
TbsActivityCenterGoods centerGoods = activityCenterGoodsTmpList.get(i); |
|
|
@ -659,9 +720,25 @@ public class TbsCostApplyOperationServiceImpl implements SeeYonOperationService |
|
|
|
tmpCenterAmt = tmpCenterAmt.subtract(centerGoodAmt); |
|
|
|
} |
|
|
|
centerGoods.setCenterGoodsAmount(centerGoodAmt); |
|
|
|
activityCenterGoodsMapper.updateById(centerGoods); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@NotNull |
|
|
|
private List<TbsActivityCenterGoods> getTbsActivityCenterGoodsByActCenter(List<TbsActivityCenterGoods> currentActivityCenterGoodsList, TbsActivityCenter activityCenter) { |
|
|
|
return currentActivityCenterGoodsList.stream().filter(centerGoods -> { |
|
|
|
boolean eqActivity4Goods = centerGoods.getActivityId().equals(activityCenter.getActivityId()); |
|
|
|
boolean eqCenter4Goods = centerGoods.getCenterType().equals(activityCenter.getCenterType()) |
|
|
|
&& centerGoods.getCenterId().equals(activityCenter.getCenterId()); |
|
|
|
boolean eqSubject4Goods = centerGoods.getSubjectId().equals(activityCenter.getSubjectId()); |
|
|
|
return eqActivity4Goods && eqCenter4Goods && eqSubject4Goods; |
|
|
|
}).collect(Collectors.toList()); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|