|
|
@ -1,5 +1,6 @@ |
|
|
|
package com.qs.serve.modules.tbs.service.impl; |
|
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
|
|
|
import com.qs.serve.common.util.Assert; |
|
|
|
import com.qs.serve.common.util.CollectionUtil; |
|
|
@ -53,6 +54,9 @@ public class TbsActivityServiceImpl extends ServiceImpl<TbsActivityMapper,TbsAct |
|
|
|
private final TbsActivityGoodsService activityGoodsService; |
|
|
|
private final TbsActivitySubjectService activitySubjectService; |
|
|
|
private final TbsActivityCenterService activityCenterService; |
|
|
|
private final TbsActivityCenterGoodsService activityCenterGoodsService; |
|
|
|
private final TbsActivityChannelService activityChannelService; |
|
|
|
private final TbsActivityChannelPointService activityChannelPointService; |
|
|
|
private final TbsCostApplyService costApplyService; |
|
|
|
|
|
|
|
private final BmsCostCenterService costCenterService; |
|
|
@ -65,15 +69,11 @@ public class TbsActivityServiceImpl extends ServiceImpl<TbsActivityMapper,TbsAct |
|
|
|
private final GoodsSpuService goodsSpuService; |
|
|
|
private final GoodsCategoryService goodsCategoryService; |
|
|
|
|
|
|
|
private final SysDeptService deptService; |
|
|
|
private final SysUserService userService; |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Transactional(rollbackFor = Exception.class) |
|
|
|
public void modify(TbsActivityBo activityBo) { |
|
|
|
final BigDecimal oneHundred = new BigDecimal(100); |
|
|
|
TbsCostApply costApply = costApplyService.getById(activityBo.getId()); |
|
|
|
TbsCostApply costApply = costApplyService.getById(activityBo.getCostApplyId()); |
|
|
|
BmsSupplier supplier = supplierService.getById(costApply.getSupplierId()); |
|
|
|
TbsActivity activity; |
|
|
|
if(activityBo.getId()!=null){ |
|
|
@ -89,9 +89,17 @@ public class TbsActivityServiceImpl extends ServiceImpl<TbsActivityMapper,TbsAct |
|
|
|
activity.setSupplierCode(supplier.getCode()); |
|
|
|
activity.setSupplierName(supplier.getName()); |
|
|
|
boolean isUpdate = activity.getId()!=null; |
|
|
|
this.saveOrUpdate(activity); |
|
|
|
if(isUpdate){ |
|
|
|
this.save(activity); |
|
|
|
//todo 删除旧数据
|
|
|
|
//删除旧数据
|
|
|
|
QueryWrapper qw = new QueryWrapper<>(); |
|
|
|
qw.eq("activity_id",activity.getId()); |
|
|
|
activityCenterService.remove(qw); |
|
|
|
activityCenterGoodsService.remove(qw); |
|
|
|
activityChannelService.remove(qw); |
|
|
|
activityChannelPointService.remove(qw); |
|
|
|
activityGoodsService.remove(qw); |
|
|
|
activitySubjectService.remove(qw); |
|
|
|
} |
|
|
|
//产品详情
|
|
|
|
List<TbsActivityGoods> activityGoodsList = this.buildActGoodsList(activityBo,costApply,activity); |
|
|
@ -100,62 +108,65 @@ public class TbsActivityServiceImpl extends ServiceImpl<TbsActivityMapper,TbsAct |
|
|
|
List<TbsActivitySubject> activitySubjects = new ArrayList<>(); |
|
|
|
List<TbsActivityCenter> activityCenterList = new ArrayList<>(); |
|
|
|
Map<String,TbsCenterDto> centerDtoMap = new HashMap<>(); |
|
|
|
for (TbsActivitySubjectBo subjectBo : activityBo.getActivitySubjectList()) { |
|
|
|
BmsSubject subject = subjectService.getById(subjectBo.getSubjectId()); |
|
|
|
subjectMap.put(subject.getId(),subject); |
|
|
|
TbsActivitySubject activitySubject = new TbsActivitySubject(); |
|
|
|
activitySubject.setCostApplyId(costApply.getId()); |
|
|
|
activitySubject.setActivityId(activity.getId()); |
|
|
|
activitySubject.setSubjectId(subject.getId()); |
|
|
|
activitySubject.setSubjectCode(subject.getSubjectCode()); |
|
|
|
activitySubject.setSubjectName(subject.getSubjectName()); |
|
|
|
activitySubject.setAmount(subjectBo.getAmount()); |
|
|
|
activitySubject.setCountSession(subjectBo.getCountSession()); |
|
|
|
activitySubject.setCountPerson(subjectBo.getCountPerson()); |
|
|
|
activitySubject.setRemark(subjectBo.getRemark()); |
|
|
|
activitySubjects.add(activitySubject); |
|
|
|
BigDecimal totalAmount = BigDecimal.ZERO; |
|
|
|
BigDecimal totalRate = BigDecimal.ZERO; |
|
|
|
for (TbsActivitySubjectBo.ActivityCenterBo centerBo : subjectBo.getCenterList()) { |
|
|
|
totalAmount = totalAmount.add(centerBo.getCenterAmount()); |
|
|
|
totalRate = totalRate.add(centerBo.getCenterRate()); |
|
|
|
String centerType = centerBo.getCenterType(); |
|
|
|
String centerId = centerBo.getCenterId(); |
|
|
|
String key = centerType+":"+centerId; |
|
|
|
TbsCenterDto tbsCenterDto = centerDtoMap.get(key); |
|
|
|
if(tbsCenterDto==null){ |
|
|
|
tbsCenterDto = getCenterDto(centerType,centerId); |
|
|
|
centerDtoMap.put(key,tbsCenterDto); |
|
|
|
} |
|
|
|
TbsActivityCenter activityCenter = new TbsActivityCenter(); |
|
|
|
activityCenter.setCostApplyId(costApply.getId()); |
|
|
|
activityCenter.setActivityId(activity.getId()); |
|
|
|
activityCenter.setSubjectId(subjectBo.getSubjectId()); |
|
|
|
activityCenter.setCenterRate(centerBo.getCenterRate()); |
|
|
|
activityCenter.setCenterAmount(centerBo.getCenterAmount()); |
|
|
|
activityCenter.setCenterType(centerBo.getCenterType()); |
|
|
|
activityCenter.setCenterId(centerBo.getCenterId()); |
|
|
|
activityCenter.setCenterName(tbsCenterDto.getCenterName()); |
|
|
|
activityCenter.setCenterCode(tbsCenterDto.getCenterCode()); |
|
|
|
activityCenterList.add(activityCenter); |
|
|
|
this.initSubjectAndCenter(activityBo,subjectMap,centerDtoMap,activitySubjects,activityCenterList,costApply,activity); |
|
|
|
//产品成本配占比
|
|
|
|
Map<String,BigDecimal> checkAmountMap = new HashMap<>(); |
|
|
|
List<TbsActivityCenterGoods> activityCenterGoodsList = new ArrayList<>(); |
|
|
|
this.initCenterGoods(activityBo,subjectMap,centerDtoMap,checkAmountMap,activityGoodsList,activityCenterGoodsList,costApply,activity); |
|
|
|
//校验金额和比率
|
|
|
|
Map<Long,List<TbsActivityCenterGoods>> actCenterGoodsMap = activityCenterGoodsList.stream().collect(Collectors.groupingBy(TbsActivityCenterGoods::getSubjectId)); |
|
|
|
for (Long subjectId : actCenterGoodsMap.keySet()) { |
|
|
|
List<TbsActivityCenterGoods> actCenterGoodsList = actCenterGoodsMap.get(subjectId); |
|
|
|
BigDecimal rate = BigDecimal.ZERO; |
|
|
|
for (TbsActivityCenterGoods centerGoods : actCenterGoodsList) { |
|
|
|
rate = rate.add(centerGoods.getCenterGoodsRate()); |
|
|
|
} |
|
|
|
//判断是否允许超预算
|
|
|
|
if(activitySubject.getAmount().compareTo(totalAmount)!=0){ |
|
|
|
Assert.throwEx("成本中心费用入参有误"); |
|
|
|
if(rate.compareTo(new BigDecimal(100))!=0){ |
|
|
|
Assert.throwEx("成本与商品分配比例有误"); |
|
|
|
} |
|
|
|
if(totalRate.compareTo(oneHundred)!=0){ |
|
|
|
Assert.throwEx("成本中心费用配比有误"); |
|
|
|
} |
|
|
|
for (TbsActivityCenter activityCenter : activityCenterList) { |
|
|
|
String key = activityCenter.getSubjectId()+":"+activityCenter.getCenterType()+":"+activityCenter.getCenterId(); |
|
|
|
BigDecimal amount = checkAmountMap.get(key); |
|
|
|
if(amount==null||amount.compareTo(activityCenter.getCenterAmount())!=0){ |
|
|
|
Assert.throwEx("成本与商品分配的金额有误"); |
|
|
|
} |
|
|
|
} |
|
|
|
//产品成本配占比
|
|
|
|
Map<String,BigDecimal> checkAmountMap = new HashMap<>(); |
|
|
|
Map<String,BigDecimal> checkRateMap = new HashMap<>(); |
|
|
|
//todo 客户详情
|
|
|
|
|
|
|
|
//保存
|
|
|
|
activityGoodsService.saveBatch(activityGoodsList); |
|
|
|
activitySubjectService.saveBatch(activitySubjects); |
|
|
|
activityCenterService.saveBatch(activityCenterList); |
|
|
|
activityCenterGoodsService.saveBatch(activityCenterGoodsList); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 初始化产品成本配占比 |
|
|
|
* @param activityBo |
|
|
|
* @param subjectMap |
|
|
|
* @param centerDtoMap |
|
|
|
* @param checkAmountMap |
|
|
|
* @param activityGoodsList |
|
|
|
* @param activityCenterGoodsList |
|
|
|
* @param costApply |
|
|
|
* @param activity |
|
|
|
*/ |
|
|
|
private void initCenterGoods(TbsActivityBo activityBo, |
|
|
|
Map<Long,BmsSubject> subjectMap, |
|
|
|
Map<String,TbsCenterDto> centerDtoMap, |
|
|
|
Map<String,BigDecimal> checkAmountMap, |
|
|
|
List<TbsActivityGoods> activityGoodsList, |
|
|
|
List<TbsActivityCenterGoods> activityCenterGoodsList, |
|
|
|
TbsCostApply costApply,TbsActivity activity){ |
|
|
|
for (TbsActivityCenterGoodsBo centerGoodsBo : activityBo.getActivityCenterGoodsList()) { |
|
|
|
BmsSubject subject = subjectMap.get(centerGoodsBo.getSubjectId()); |
|
|
|
TbsActivityCenterGoods centerGoods = new TbsActivityCenterGoods(); |
|
|
|
//设置成本中心
|
|
|
|
String key = centerGoodsBo.getCenterType()+":"+centerGoodsBo.getCenterId(); |
|
|
|
TbsCenterDto tbsCenterDto = centerDtoMap.get(key); |
|
|
|
centerGoods.setActivityId(activity.getId()); |
|
|
|
centerGoods.setCostApplyId(costApply.getId()); |
|
|
|
centerGoods.setCenterId(centerGoodsBo.getCenterId()); |
|
|
|
centerGoods.setCenterCode(tbsCenterDto.getCenterCode()); |
|
|
|
centerGoods.setCenterName(tbsCenterDto.getCenterName()); |
|
|
@ -173,16 +184,9 @@ public class TbsActivityServiceImpl extends ServiceImpl<TbsActivityMapper,TbsAct |
|
|
|
if(checkAmount==null){ |
|
|
|
checkAmount = BigDecimal.ZERO; |
|
|
|
} |
|
|
|
checkAmount.add(centerGoods.getCenterGoodsAmount()); |
|
|
|
checkAmount = checkAmount.add(centerGoods.getCenterGoodsAmount()); |
|
|
|
checkAmountMap.put(key4Count,checkAmount); |
|
|
|
|
|
|
|
BigDecimal checkRate = checkRateMap.get(key4Count); |
|
|
|
if(checkRate==null){ |
|
|
|
checkRate = BigDecimal.ZERO; |
|
|
|
} |
|
|
|
checkRate.add(centerGoods.getCenterGoodsRate()); |
|
|
|
checkRateMap.put(key4Count,checkRate); |
|
|
|
|
|
|
|
//设置商品
|
|
|
|
Long cenTarId = centerGoodsBo.getTargetId(); |
|
|
|
String cenTarType = centerGoodsBo.getTargetType(); |
|
|
@ -200,26 +204,73 @@ public class TbsActivityServiceImpl extends ServiceImpl<TbsActivityMapper,TbsAct |
|
|
|
if(StringUtils.hasEmpty(centerGoods.getTargetLevelPathIds())){ |
|
|
|
Assert.throwEx("商品数据无法匹配"); |
|
|
|
} |
|
|
|
activityCenterGoodsList.add(centerGoods); |
|
|
|
} |
|
|
|
//校验金额和比率
|
|
|
|
for (String key : checkRateMap.keySet()) { |
|
|
|
if(checkRateMap.get(key).compareTo(oneHundred)!=0){ |
|
|
|
Assert.throwEx("成本与商品分配比例有误"); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 初始化科目和成本中心 |
|
|
|
* @param activityBo |
|
|
|
* @param subjectMap |
|
|
|
* @param centerDtoMap |
|
|
|
* @param activitySubjects |
|
|
|
* @param activityCenterList |
|
|
|
* @param costApply |
|
|
|
* @param activity |
|
|
|
*/ |
|
|
|
private void initSubjectAndCenter(TbsActivityBo activityBo, |
|
|
|
Map<Long,BmsSubject> subjectMap, |
|
|
|
Map<String,TbsCenterDto> centerDtoMap, |
|
|
|
List<TbsActivitySubject> activitySubjects, |
|
|
|
List<TbsActivityCenter> activityCenterList, |
|
|
|
TbsCostApply costApply,TbsActivity activity){ |
|
|
|
for (TbsActivitySubjectBo subjectBo : activityBo.getActivitySubjectList()) { |
|
|
|
BmsSubject subject = subjectService.getById(subjectBo.getSubjectId()); |
|
|
|
subjectMap.put(subject.getId(),subject); |
|
|
|
TbsActivitySubject activitySubject = new TbsActivitySubject(); |
|
|
|
activitySubject.setCostApplyId(costApply.getId()); |
|
|
|
activitySubject.setActivityId(activity.getId()); |
|
|
|
activitySubject.setSubjectId(subject.getId()); |
|
|
|
activitySubject.setSubjectCode(subject.getSubjectCode()); |
|
|
|
activitySubject.setSubjectName(subject.getSubjectName()); |
|
|
|
activitySubject.setAmount(subjectBo.getAmount()); |
|
|
|
activitySubject.setCountSession(subjectBo.getCountSession()); |
|
|
|
activitySubject.setCountPerson(subjectBo.getCountPerson()); |
|
|
|
activitySubject.setRemark(subjectBo.getRemark()); |
|
|
|
activitySubjects.add(activitySubject); |
|
|
|
BigDecimal totalAmount = BigDecimal.ZERO; |
|
|
|
BigDecimal totalRate = BigDecimal.ZERO; |
|
|
|
for (TbsActivitySubjectBo.ActivityCenterBo centerBo : subjectBo.getCenterList()) { |
|
|
|
totalAmount = totalAmount.add(centerBo.getCenterAmount()); |
|
|
|
totalRate = totalRate.add(centerBo.getCenterRate()); |
|
|
|
String centerType = centerBo.getCenterType(); |
|
|
|
String centerId = centerBo.getCenterId(); |
|
|
|
String key = centerType+":"+centerId; |
|
|
|
TbsCenterDto tbsCenterDto = centerDtoMap.get(key); |
|
|
|
if(tbsCenterDto==null){ |
|
|
|
tbsCenterDto = getCenterDto(centerType,centerId); |
|
|
|
centerDtoMap.put(key,tbsCenterDto); |
|
|
|
} |
|
|
|
TbsActivityCenter activityCenter = new TbsActivityCenter(); |
|
|
|
activityCenter.setCostApplyId(costApply.getId()); |
|
|
|
activityCenter.setActivityId(activity.getId()); |
|
|
|
activityCenter.setSubjectId(subjectBo.getSubjectId()); |
|
|
|
activityCenter.setCenterRate(centerBo.getCenterRate()); |
|
|
|
activityCenter.setCenterAmount(centerBo.getCenterAmount()); |
|
|
|
activityCenter.setCenterType(centerBo.getCenterType()); |
|
|
|
activityCenter.setCenterId(centerBo.getCenterId()); |
|
|
|
activityCenter.setCenterName(tbsCenterDto.getCenterName()); |
|
|
|
activityCenter.setCenterCode(tbsCenterDto.getCenterCode()); |
|
|
|
activityCenterList.add(activityCenter); |
|
|
|
} |
|
|
|
} |
|
|
|
for (TbsActivityCenter activityCenter : activityCenterList) { |
|
|
|
String key = activityCenter.getSubjectId()+":"+activityCenter.getCenterType()+":"+activityCenter.getCenterId(); |
|
|
|
BigDecimal amount = checkAmountMap.get(key); |
|
|
|
if(amount==null||amount.compareTo(activityCenter.getCenterAmount())!=0){ |
|
|
|
Assert.throwEx("成本与商品分配的金额有误"); |
|
|
|
//判断是否允许超预算
|
|
|
|
if(activitySubject.getAmount().compareTo(totalAmount)!=0){ |
|
|
|
Assert.throwEx("成本中心费用入参有误"); |
|
|
|
} |
|
|
|
if(totalRate.compareTo(new BigDecimal(100))!=0){ |
|
|
|
Assert.throwEx("成本中心费用配比有误"); |
|
|
|
} |
|
|
|
} |
|
|
|
//todo 客户详情
|
|
|
|
|
|
|
|
//保存
|
|
|
|
activityGoodsService.saveBatch(activityGoodsList); |
|
|
|
activitySubjectService.saveBatch(activitySubjects); |
|
|
|
activityCenterService.saveBatch(activityCenterList); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
@ -296,28 +347,21 @@ public class TbsActivityServiceImpl extends ServiceImpl<TbsActivityMapper,TbsAct |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
public TbsCenterDto getCenterDto(String centerType,String centerId){ |
|
|
|
TbsCenterDto centerDto = null; |
|
|
|
if(centerType.equals(TbsCenterType.center.name())){ |
|
|
|
BmsCostCenter costCenter = costCenterService.getById(centerId); |
|
|
|
|
|
|
|
return new TbsCenterDto(costCenter.getCode(),costCenter.getName()); |
|
|
|
}else if (centerType.equals(TbsCenterType.customer.name())){ |
|
|
|
BmsSupplier supplier4Center = supplierService.getById(centerId); |
|
|
|
}else if(centerType.equals(TbsCenterType.dept.name())){ |
|
|
|
SysDept dept = deptService.getById(centerId); |
|
|
|
|
|
|
|
return new TbsCenterDto(supplier4Center.getCode(),supplier4Center.getName()); |
|
|
|
}else if(centerType.equals(TbsCenterType.saleRegion.name())){ |
|
|
|
BmsRegion saleRegion = saleRegionService.getById(centerId); |
|
|
|
|
|
|
|
return new TbsCenterDto(saleRegion.getCode(),saleRegion.getName()); |
|
|
|
}else if (centerType.equals(TbsCenterType.bizRegion.name())){ |
|
|
|
BmsRegion2 bizRegion = bizRegionService.getById(centerId); |
|
|
|
|
|
|
|
}else if (centerType.equals(TbsCenterType.saleman.name())){ |
|
|
|
SysUser sysUser = userService.getById(centerId); |
|
|
|
|
|
|
|
}else { |
|
|
|
Assert.throwEx("无法匹配成本中心类型:"+centerType); |
|
|
|
return new TbsCenterDto(bizRegion.getCode(),bizRegion.getName()); |
|
|
|
} |
|
|
|
return centerDto; |
|
|
|
Assert.throwEx("无法匹配成本中心类型:"+centerType); |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|