diff --git a/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController.java b/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController.java index c5d64b07..ae6d6060 100644 --- a/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController.java +++ b/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController.java @@ -96,6 +96,7 @@ public class TbsActivityController { private final TbsBudgetService tbsBudgetService; private final TbsBudgetConditionService tbsBudgetConditionService; private final TbsScheduleItemBudgetMapper tbsScheduleItemBudgetMapper; + private final TbsCostApplyPart1Service tbsCostApplyPart1Service; private SysAttachService attachService; @@ -468,6 +469,18 @@ public class TbsActivityController { return R.ok(); } + /** + * 刷新活动相关金额 + * @param id + * @return + */ + @GetMapping("/flushAmount2/{id}") + @SysLog(module = SystemModule.Budget, title = "费用活动", biz = BizType.DELETE) + public R flushActivityAmount2(@PathVariable("id") Long id){ + tbsCostApplyPart1Service.updateAmtAndRateByActSubject(id); + return R.ok(); + } + /** * 获取默认的成本中心 * @param defaultCenterBo diff --git a/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityService.java b/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityService.java index 43ab2c65..2b703597 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityService.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityService.java @@ -32,5 +32,7 @@ public interface TbsActivityService extends IService { */ void checkCenterGoods(boolean updateBudgetLog); + + } diff --git a/src/main/java/com/qs/serve/modules/tbs/service/TbsCostApplyPart1Service.java b/src/main/java/com/qs/serve/modules/tbs/service/TbsCostApplyPart1Service.java index f4059e9e..6e1ce5df 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/TbsCostApplyPart1Service.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/TbsCostApplyPart1Service.java @@ -30,4 +30,10 @@ public interface TbsCostApplyPart1Service { */ void cancelSetChanged(Long costId,boolean checkThrow); + + /** + * 通过活动科目的金额重新分配,包含更新预算占用金额 + * @param activityId + */ + void updateAmtAndRateByActSubject(Long activityId); } diff --git a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyOperationServiceImpl.java b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyOperationServiceImpl.java index f8194deb..e41cc67c 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyOperationServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyOperationServiceImpl.java @@ -512,12 +512,12 @@ public class TbsCostApplyOperationServiceImpl implements SeeYonOperationService List activityList = tbsActivityMapper.selectList(comm_qw); List activitySubjectList = activitySubjectMapper.selectList(comm_qw); //判断subjectId是否匹配 - Set subjectIds = new HashSet<>(param.getAffairSubjectLines().stream() + Set 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 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 activityCenterList, List activityCenterGoodsList, TbsActivitySubject subject, @@ -614,18 +614,85 @@ public class TbsCostApplyOperationServiceImpl implements SeeYonOperationService BigDecimal subjectAmountSpuir = subjectAmount; - for (int ii = 0; ii < activityCenterList.size(); ii++) { + List currentActivityCenterList = activityCenterList.stream().filter(center-> + center.getActivityId().equals(subject.getActivityId())&¢er.getSubjectId().equals(subject.getSubjectId()) + ).collect(Collectors.toList()); + + List currentActivityCenterGoodsList = activityCenterGoodsList.stream().filter(cg-> + cg.getActivityId().equals(subject.getActivityId())&&cg.getSubjectId().equals(subject.getSubjectId()) + ).collect(Collectors.toList()); + + //校验获得成本中心下的商品金额比例确保100% + for (TbsActivityCenter activityCenter : currentActivityCenterList) { + List 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 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 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 getTbsActivityCenterGoodsByActCenter(List 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 diff --git a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyPart1ServiceImpl.java b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyPart1ServiceImpl.java index 82bee3cb..10b018f5 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyPart1ServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyPart1ServiceImpl.java @@ -4,10 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.qs.serve.common.config.properties.ProjectProperties; import com.qs.serve.common.model.dto.R; -import com.qs.serve.common.util.Assert; -import com.qs.serve.common.util.AuthContextUtils; -import com.qs.serve.common.util.CodeGenUtil; -import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.*; import com.qs.serve.modules.bir.consts.BirActivityCenterGoodsUtil; import com.qs.serve.modules.bir.service.BirCenterRateService; import com.qs.serve.modules.bir.service.BirRoiRateService; @@ -61,6 +58,7 @@ public class TbsCostApplyPart1ServiceImpl implements TbsCostApplyPart1Service { private TbsCostContractMapper costContractMapper; private VtbVerificationMapper verificationMapper; private TbsBudgetLogMapper tbsBudgetLogMapper; + private TbsBudgetCostItemMapper tbsBudgetCostItemMapper; private SysUserMapper sysUserMapper; @Override @@ -340,4 +338,31 @@ public class TbsCostApplyPart1ServiceImpl implements TbsCostApplyPart1Service { } } + + @Override + public void updateAmtAndRateByActSubject(Long activityId) { + final TbsCostApplyOperationServiceImpl costApplyOperationService = SpringUtils.getBean(TbsCostApplyOperationServiceImpl.class); + List activitySubjectList = tbsActivitySubjectService.listByActivityId(activityId); + List activityCenterList = tbsActivityCenterService.listByActivity(activityId); + List activityCenterGoodsList = tbsActivityCenterGoodsService.listByActivityId(activityId); + for (TbsActivitySubject activitySubject : activitySubjectList) { + // 更新 TbsActivityCenter 和 TbsActivityCenterGoods的金额 + costApplyOperationService.changeActivityCenterGoodsAmt(false, + activityCenterList,activityCenterGoodsList,activitySubject,activitySubject.getAmount()); + } + //重新加载 + activityCenterGoodsList = tbsActivityCenterGoodsService.listByActivityId(activityId); + + // 更新 tbs_budget_cost_item + for (TbsActivityCenterGoods centerGoods : activityCenterGoodsList) { + TbsBudgetCostItem costItem = new TbsBudgetCostItem(); + costItem.setCenterGoodsAmount(centerGoods.getCenterGoodsAmount()); + tbsBudgetCostItemMapper.update(costItem, + new LambdaQueryWrapper() + .eq(TbsBudgetCostItem::getCenterGoodItemId,centerGoods.getId())); + } + + } + + }