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. 220
      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); 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查询 * 根据ID查询
* @param 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 */ /** 成本中心id */
@NotNull(message = "成本中心id不能为空") @NotNull(message = "成本中心id不能为空")
private Long centerId; private String centerId;
/** 成本中心编码 */ /** 成本中心编码 */
@NotBlank(message = "成本中心编码不能为空") @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 */ /** 成本中心id */
@NotNull(message = "成本中心id不能为空") @NotNull(message = "成本中心id不能为空")
private Long centerId; private String centerId;
/** 费用额度 */ /** 费用额度 */
@NotNull(message = "费用额度不能为空") @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, center,
customer, customer,
dept,
bizRegion, bizRegion,
saleRegion, saleRegion,
saleman
*/ */
@NotBlank(message = "成本中心类型不能为空") @NotBlank(message = "成本中心类型不能为空")
private String centerType; private String centerType;

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

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