Browse Source

产品成本配占比校验

mssql
Yen 3 years ago
parent
commit
0f4da50132
  1. 13
      src/main/java/com/qs/serve/modules/goods/controller/GoodsSkuController.java
  2. 2
      src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenterGoods.java
  3. 2
      src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityCenterGoodsBo.java
  4. 2
      src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivitySubjectBo.java
  5. 224
      src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityServiceImpl.java
  6. 0
      src/main/resources/mapper/goods/GoodsSpuMapper.xml

13
src/main/java/com/qs/serve/modules/goods/controller/GoodsSkuController.java

@ -53,6 +53,19 @@ public class GoodsSkuController {
return R.ok(list);
}
/**
* 翻页
* @param param
* @return
*/
@GetMapping("/page")
@PreAuthorize("hasRole('goods:sku:query')")
public R<PageVo<GoodSkuVo>> getPage(GoodsSku param){
PageUtil.startPage();
List<GoodSkuVo> list = goodsSkuService.selectSkuVo(param);
return R.byPageHelperList(list);
}
/**
* 根据ID查询
* @param id

2
src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenterGoods.java

@ -68,7 +68,7 @@ public class TbsActivityCenterGoods implements Serializable {
/** 成本中心id */
@NotNull(message = "成本中心id不能为空")
private Long centerId;
private String centerId;
/** 成本中心编码 */
@NotBlank(message = "成本中心编码不能为空")

2
src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityCenterGoodsBo.java

@ -40,7 +40,7 @@ public class TbsActivityCenterGoodsBo implements Serializable {
/** 成本中心id */
@NotNull(message = "成本中心id不能为空")
private Long centerId;
private String centerId;
/** 费用额度 */
@NotNull(message = "费用额度不能为空")

2
src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivitySubjectBo.java

@ -52,10 +52,8 @@ public class TbsActivitySubjectBo implements Serializable {
/** 成本中心类型
center,
customer,
dept,
bizRegion,
saleRegion,
saleman
*/
@NotBlank(message = "成本中心类型不能为空")
private String centerType;

224
src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityServiceImpl.java

@ -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;
}
}

0
src/main/resources/mapper/bms/GoodsSpuMapper.xml → src/main/resources/mapper/goods/GoodsSpuMapper.xml

Loading…
Cancel
Save