Browse Source

fix:添加费用商品比例拦截,并重置金额分配

checkBack
Yen 1 year ago
parent
commit
f0fa0cc440
  1. 13
      src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController.java
  2. 2
      src/main/java/com/qs/serve/modules/tbs/service/TbsActivityService.java
  3. 6
      src/main/java/com/qs/serve/modules/tbs/service/TbsCostApplyPart1Service.java
  4. 123
      src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyOperationServiceImpl.java
  5. 33
      src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyPart1ServiceImpl.java

13
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

2
src/main/java/com/qs/serve/modules/tbs/service/TbsActivityService.java

@ -32,5 +32,7 @@ public interface TbsActivityService extends IService<TbsActivity> {
*/
void checkCenterGoods(boolean updateBudgetLog);
}

6
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);
}

123
src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyOperationServiceImpl.java

@ -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())&&center.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())
&&centerGoods.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

33
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<TbsActivitySubject> activitySubjectList = tbsActivitySubjectService.listByActivityId(activityId);
List<TbsActivityCenter> activityCenterList = tbsActivityCenterService.listByActivity(activityId);
List<TbsActivityCenterGoods> 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<TbsBudgetCostItem>()
.eq(TbsBudgetCostItem::getCenterGoodItemId,centerGoods.getId()));
}
}
}

Loading…
Cancel
Save