Browse Source

政策发布,政策预览

contract
Yen 2 years ago
parent
commit
39ae80ef28
  1. 13
      src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetApplicationService.java
  2. 16
      src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyController.java
  3. 5
      src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyItemController.java
  4. 9
      src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicy.java
  5. 20
      src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyGoods.java
  6. 12
      src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyItem.java
  7. 1
      src/main/java/com/qs/serve/modules/tzc/entity/bo/TzcPolicyBo.java
  8. 8
      src/main/java/com/qs/serve/modules/tzc/entity/bo/TzcPolicyItemBo.java
  9. 382
      src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyApplication.java
  10. 3
      src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyGoodsService.java
  11. 8
      src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyGoodsServiceImpl.java
  12. 36
      src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyItemServiceImpl.java
  13. 18
      src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyServiceImpl.java

13
src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetApplicationService.java

@ -207,6 +207,7 @@ public class TbsBudgetApplicationService {
budgetList = new ArrayList<>();
}
List<TbsBudget> noConditionBudgetList = new ArrayList<>();
//加载预算条件和关联预算匹配,返回是否由无条件预算
boolean budgetNoCondition = this.loadConditionByBudgetsAndMatch(budgetList, noConditionBudgetList);
//预算条件需包含活动条件, Map结构:活动id->满足的预算id列表
Map<Long,List<Long>> activityAllowBudgetIdMap = this.buildActivityBudgetMap(activityList, budgetList, noConditionBudgetList);
@ -439,7 +440,7 @@ public class TbsBudgetApplicationService {
List<TbsBudget> budgetList = allBudgetList.stream().filter(obj->allowBudgetIds.contains(obj.getId())).collect(Collectors.toList());
//PS:排序规则:优先为时间条件,其次匹配品牌条件
//按品类条件,提取可用预算(列表已按小维度到大维度排列)
List<TbsBudget> currentItemBudgetList = this.filterMatchGoodsCondition(budgetList, activityCostItem);
List<TbsBudget> currentItemBudgetList = this.filterMatchGoodsCondition(budgetList, activityCostItem.getTargetLevelPathIds());
//关联无条件预算
currentItemBudgetList.addAll(noConditionBudgetList);
//提取可用预算的考核期
@ -551,12 +552,12 @@ public class TbsBudgetApplicationService {
/**
* 按品类条件,提取可用预算
* @param budgetList
* @param activityCostItem
* @param targetLevelPathIds
* @return
*/
@NotNull
private List<TbsBudget> filterMatchGoodsCondition(List<TbsBudget> budgetList,TbsActivityCenterGoods activityCostItem) {
String levelPath = activityCostItem.getTargetLevelPathIds();
public List<TbsBudget> filterMatchGoodsCondition(List<TbsBudget> budgetList,String targetLevelPathIds) {
String levelPath = targetLevelPathIds;
Set<String> levelPathSet = new LinkedHashSet<>();
levelPathSet.add(levelPath);
TbsBudgetCostUtil.buildPaths(levelPath,levelPathSet);
@ -582,6 +583,7 @@ public class TbsBudgetApplicationService {
}
/**
* 加载预算条件和关联预算匹配,返回是否由无条件预算
* 1.加载所有的条件
* 2.匹配初无条件预算
* 3.预算条件关联到预算对象中
@ -589,7 +591,7 @@ public class TbsBudgetApplicationService {
* @param noConditionBudgetList
* @return 含有无条件预算标识
*/
private boolean loadConditionByBudgetsAndMatch( List<TbsBudget> budgetList, List<TbsBudget> noConditionBudgetList) {
public boolean loadConditionByBudgetsAndMatch( List<TbsBudget> budgetList, List<TbsBudget> noConditionBudgetList) {
boolean budgetNoCondition = false;
for (TbsBudget budget : budgetList) {
if(budget.getConditionFlag().equals(1)){
@ -647,6 +649,7 @@ public class TbsBudgetApplicationService {
for (TbsActivity activity : activityList) {
List<TbsScheduleItemBudget> budgetItemList = tbsScheduleItemBudgetService
.betweenDateList(activity.getPreStartDate(),activity.getPreEndDate());
//设置关联用于后面条件过滤
activity.setScheduleItemBudgetList(budgetItemList);
if(CollectionUtil.isNotEmpty(budgetItemList)){
for (TbsScheduleItemBudget item : budgetItemList) {

16
src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyController.java

@ -6,6 +6,7 @@ import com.qs.serve.common.model.dto.PageVo;
import com.qs.serve.common.model.dto.R;
import com.qs.serve.common.model.enums.BizType;
import com.qs.serve.common.model.enums.SystemModule;
import com.qs.serve.common.util.AuthContextUtils;
import com.qs.serve.common.util.PageUtil;
import com.qs.serve.common.util.CopierUtil;
import com.qs.serve.common.util.StringUtils;
@ -38,6 +39,21 @@ public class TzcPolicyController {
private TzcPolicyService tzcPolicyService;
private TzcPolicyItemService tzcPolicyItemService;
/**
* 翻页
* @param param
* @return
*/
@GetMapping("/pageMy")
public R<PageVo<TzcPolicy>> getPageMy(TzcPolicy param){
String userId = AuthContextUtils.getSysUserId();
LambdaQueryWrapper<TzcPolicy> lqw = new LambdaQueryWrapper<>(param);
param.setUserId(userId);
PageUtil.startPage();
List<TzcPolicy> list = tzcPolicyService.list(lqw);
return R.byPageHelperList(list);
}
/**
* 翻页
* @param param

5
src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyItemController.java

@ -91,6 +91,9 @@ public class TzcPolicyItemController {
@SysLog(module = SystemModule.Policy, title = "政策项", biz = BizType.QUERY)
public R<TzcPolicyItem> getById(@PathVariable("id") String id){
TzcPolicyItem tzcPolicyItem = tzcPolicyItemService.getById(id);
List<TzcPolicyGoods> goodsList = tzcPolicyGoodsService.listByItemId(tzcPolicyItem.getId());
goodsList.forEach(TzcPolicyGoods::initSpuSkuName);
tzcPolicyItem.setPolicyGoodsList(goodsList);
return R.ok(tzcPolicyItem);
}
@ -102,7 +105,6 @@ public class TzcPolicyItemController {
*/
@PostMapping("/updateById")
@SysLog(module = SystemModule.Policy, title = "政策项", biz = BizType.UPDATE)
@PreAuthorize("hasRole('tzc:policy:insert')")
public R<?> updateById(@RequestBody @Valid TzcPolicyItemBo param){
if(param.getId()==null){
return R.error();
@ -117,7 +119,6 @@ public class TzcPolicyItemController {
*/
@PostMapping("/save")
@SysLog(module = SystemModule.Policy, title = "政策项", biz = BizType.INSERT)
@PreAuthorize("hasRole('tzc:policyItem:insert')")
public R<?> save(@RequestBody @Valid TzcPolicyItemBo param){
param.setId(null);
return tzcPolicyItemService.modify(param);

9
src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicy.java

@ -54,6 +54,15 @@ public class TzcPolicy implements Serializable {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private LocalDateTime passTime;
/** 政策项数量 */
private Integer totalItems;
/** 政策项总金额 */
private BigDecimal totalItemAmount;
/** 政策项总使用金额 */
private BigDecimal totalItemUsedAmount;
/** 客户id */
@NotNull(message = "客户id不能为空")
private Long supplierId;

20
src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyGoods.java

@ -9,7 +9,9 @@ import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.qs.serve.modules.tbs.common.TbsGoodsType;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;
@ -21,6 +23,7 @@ import javax.validation.constraints.NotBlank;
* @author YenHex
* @since 2023-02-20
*/
@Slf4j
@Data
@TableName("tzc_policy_goods")
public class TzcPolicyGoods implements Serializable {
@ -105,5 +108,22 @@ public class TzcPolicyGoods implements Serializable {
@JsonProperty
private String delFlag;
@TableField(exist = false)
private String spuName;
@TableField(exist = false)
private String skuName;
public void initSpuSkuName(){
if(this.getTargetType().equals(TbsGoodsType.sku.name())){
try {
String[] names = this.getTargetLevelPathNames().split("_");
this.setSkuName(names[names.length-1]);
this.setSpuName(names[names.length-2]);
} catch (Exception e) {
log.error("格式错误:{}",this.getTargetLevelPathNames());
}
}
}
}

12
src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyItem.java

@ -9,12 +9,14 @@ import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.NotBlank;
import java.util.List;
/**
* 政策项 实体类
@ -69,6 +71,9 @@ public class TzcPolicyItem implements Serializable {
@NotNull(message = "返点百分比不能为空")
private BigDecimal discountRate;
/** 优惠上限 */
private BigDecimal discountMax;
/** 已用金额 */
@NotNull(message = "已用金额不能为空")
private BigDecimal usedAmount;
@ -170,6 +175,13 @@ public class TzcPolicyItem implements Serializable {
@JsonProperty
private String delFlag;
@TableField(exist = false)
private List<?> policyGoodsList;
/** 后端参数,预算考核期 */
@TableField(exist = false)
List<TbsScheduleItemBudget> scheduleItemBudgetList;
public void initSetNull(){
this.setId(null);
this.setCreateBy(null);

1
src/main/java/com/qs/serve/modules/tzc/entity/bo/TzcPolicyBo.java

@ -35,7 +35,6 @@ public class TzcPolicyBo implements Serializable {
private String title;
/** 客户id */
@NotNull(message = "客户id不能为空")
private Long supplierId;
/** 备注 */

8
src/main/java/com/qs/serve/modules/tzc/entity/bo/TzcPolicyItemBo.java

@ -43,7 +43,7 @@ public class TzcPolicyItemBo implements Serializable {
private String centerId;
/** 科目id */
@NotNull(message = "科目id不能为空")
//@NotNull(message = "科目id不能为空")
private Long subjectId;
/** 开始时间 */
@ -60,13 +60,13 @@ public class TzcPolicyItemBo implements Serializable {
@NotNull(message = "满减金额不能为空")
private BigDecimal discountAmount;
/** 优惠上限 */
private BigDecimal discountMax;
/** 返点百分比 */
@NotNull(message = "返点百分比不能为空")
private BigDecimal discountRate;
/** 已用金额 */
@NotNull(message = "已用金额不能为空")
private BigDecimal usedAmount;
@NotNull(message = "商品列表参数不能为空")
List<TzcPolicyGoodsBo> policyGoodsList;

382
src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyApplication.java

@ -0,0 +1,382 @@
package com.qs.serve.modules.tzc.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.qs.serve.common.util.Assert;
import com.qs.serve.common.util.CollectionUtil;
import com.qs.serve.modules.sys.service.SysConfigService;
import com.qs.serve.modules.tbs.entity.*;
import com.qs.serve.modules.tbs.entity.dto.TbsBudgetCostResult;
import com.qs.serve.modules.tbs.mapper.TbsBudgetMapper;
import com.qs.serve.modules.tbs.mapper.TbsScheduleItemBudgetMapper;
import com.qs.serve.modules.tbs.service.TbsBudgetApplicationService;
import com.qs.serve.modules.tbs.service.TbsBudgetConditionService;
import com.qs.serve.modules.tbs.service.TbsBudgetCostItemService;
import com.qs.serve.modules.tbs.service.TbsScheduleItemBudgetService;
import com.qs.serve.modules.tzc.entity.TzcPolicy;
import com.qs.serve.modules.tzc.entity.TzcPolicyGoods;
import com.qs.serve.modules.tzc.entity.TzcPolicyItem;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author YenHex
* @since 2023/2/20
*/
@Service
@Slf4j
@AllArgsConstructor
public class TzcPolicyApplication {
private TzcPolicyService tzcPolicyService;
private TzcPolicyGoodsService tzcPolicyGoodsService;
private TbsBudgetApplicationService budgetApplicationService;
private TbsScheduleItemBudgetService tbsScheduleItemBudgetService;
private TbsBudgetMapper tbsBudgetMapper;
private TbsScheduleItemBudgetMapper tbsScheduleItemBudgetMapper;
private TbsBudgetConditionService tbsBudgetConditionService;
private TbsBudgetCostItemService tbsBudgetCostItemService;
private SysConfigService configService;
/**
*
* @param policyId
*/
public void commitPolicy(Long policyId){
//
}
/**
* 创建费用占用结果
* @param costApplyId 用于加载历史预算时排除当前费用占比
* @param policyList 政策列表
* @param policyItemList 政策项列表
* @param policyGoodsList 政策商品
* @param overspend 是否支持超出预算
* @param throwEx 是否需要抛出异常
* @param buildTableFlag 创建表VO
* @return
*/
public TbsBudgetCostResult buildBudgetCostResult(Long costApplyId,
List<TzcPolicy> policyList,
List<TzcPolicyItem> policyItemList,
List<TzcPolicyGoods> policyGoodsList,
Boolean overspend,
Boolean throwEx,
Boolean buildTableFlag){
//考核期有关的预算id,判断逻辑为活动需要允许在
List<Long> budgetIds = new ArrayList<>();
//没有预算的活动
Set<Long> noBudgetPolicyIds = new HashSet<>();
//所有满足条件的考核期,用于加载历史核销费用
List<TbsScheduleItemBudget> scheduleItemList = this.loadScheduleBudgetAndSetting(policyItemList, budgetIds, noBudgetPolicyIds);
List<String> centerIds = policyItemList.stream().map(TzcPolicyItem::getCenterId).collect(Collectors.toList());
List<Long> subjectIds = policyItemList.stream().map(TzcPolicyItem::getSubjectId).distinct().collect(Collectors.toList());
List<TbsBudget> budgetList;
if(budgetIds.size()>0){
LambdaQueryWrapper<TbsBudget> budgetLqw = new LambdaQueryWrapper<>();
budgetLqw.in(TbsBudget::getId,budgetIds);
budgetLqw.and(qw->qw.eq(TbsBudget::getSubjectId,0).or(qw2->qw2.in(TbsBudget::getSubjectId,subjectIds)));
budgetLqw.in(TbsBudget::getCenterId,centerIds);
budgetLqw.eq(TbsBudget::getBudgetState,1);
budgetList = tbsBudgetMapper.selectList(budgetLqw);
}else {
budgetList = new ArrayList<>();
}
List<TbsBudget> noConditionBudgetList = new ArrayList<>();
//加载预算条件和关联预算匹配,返回是否由无条件预算
boolean budgetNoCondition = budgetApplicationService.loadConditionByBudgetsAndMatch(budgetList, noConditionBudgetList);
//预算条件需包含活动条件, Map结构:活动id->满足的预算id列表
Map<Long,List<Long>> policyAllowBudgetIdMap = this.buildPolicyBudgetMap(policyItemList, budgetList, noConditionBudgetList);
//活动拦截
if(!budgetNoCondition){
this.handleNoBudgetPolicy(throwEx, overspend, policyItemList,noBudgetPolicyIds,policyAllowBudgetIdMap);
}
//统计所有占用预算金额
Map<Long, BigDecimal> budgetItemAmountMap = new HashMap<>(scheduleItemList.size());
//统计费用申请占用金额
Map<Long,BigDecimal> budgetItemApplyAmountMap = new HashMap<>(scheduleItemList.size());
for (TbsScheduleItemBudget itemBudget : scheduleItemList) {
BigDecimal budgetItemApplyAmount = tbsScheduleItemBudgetMapper.totalApplyAmount(itemBudget.getId(),costApplyId);
budgetItemApplyAmountMap.put(itemBudget.getId(),budgetItemApplyAmount);
BigDecimal budgetItemAmount = tbsScheduleItemBudgetMapper.totalCostAmount(itemBudget.getBudgetId(),itemBudget.getScheduleItemId(),costApplyId);
//因为结果为负数,需去相反数
budgetItemAmount = budgetItemAmount==null?BigDecimal.ZERO:budgetItemAmount.negate();
budgetItemAmountMap.put(itemBudget.getId(),budgetItemAmount);
}
//统计当前活动前置项占用预算
Map<Long,BigDecimal> counterMap = new HashMap<>();
//匹配预算主要方法
final List<TbsActivityCenterGoods> actMatchList = new ArrayList<>();
final List<TbsActivityCenterGoods> actUnMatchList = new ArrayList<>();
for (TzcPolicyGoods policyGoods : policyGoodsList) {
// this.matchPolicyMain(policyGoods,throwEx, overspend, activityList, budgetItemAmountMap, budgetList,
// noConditionBudgetList, counterMap, actMatchList, actUnMatchList,policyAllowBudgetIdMap,budgetItemApplyAmountMap);
}
return null;
}
/**
* 匹配的主要方法
* @param policyGoods 政策商品
* @param throwEx 预算不够时抛出异常
* @param overspend 超值标识
* @param policyItemList 所有政策项
* @param budgetItemAmountMap 统计所有占用预算金额
* @param allBudgetList 所有预算
* @param noConditionBudgetList 没有条件的预算列表
* @param counterMap 历史预算占用
* @param actMatchList 匹配预算占用的费用(含超支预算)
* @param actUnMatchList 没有匹配预算的费用
* @param activityAllowBudgetIdMap 满足当前活动项的费用idMap
* @param budgetItemApplyAmountMap 统计费用申请占用金额
*/
private void matchPolicyMain(TzcPolicyGoods policyGoods,
Boolean throwEx,
boolean overspend,
List<TzcPolicyItem> policyItemList,
Map<Long,BigDecimal> budgetItemAmountMap,
final List<TbsBudget> allBudgetList,
List<TbsBudget> noConditionBudgetList,
Map<Long, BigDecimal> counterMap,
final List<TzcPolicyGoods> actMatchList,
final List<TzcPolicyGoods> actUnMatchList,
final Map<Long,List<Long>> activityAllowBudgetIdMap,
Map<Long,BigDecimal> budgetItemApplyAmountMap) {
//过滤满全条件的预算
List<Long> allowBudgetIds = activityAllowBudgetIdMap.get(policyGoods.getPolicyItemId());
List<TbsBudget> budgetList = allBudgetList.stream().filter(obj->allowBudgetIds.contains(obj.getId())).collect(Collectors.toList());
//PS:排序规则:优先为时间条件,其次匹配品牌条件
//按品类条件,提取可用预算(列表已按小维度到大维度排列)
List<TbsBudget> currentItemBudgetList = budgetApplicationService.filterMatchGoodsCondition(budgetList, policyGoods.getTargetLevelPathIds());
//关联无条件预算
currentItemBudgetList.addAll(noConditionBudgetList);
//提取可用预算的考核期
List<TbsScheduleItemBudget> currentScheduleItemBudgets = new ArrayList<>();
for (TzcPolicyItem policyItem : policyItemList) {
//忽略重叠情况
if(!policyGoods.getPolicyItemId().equals(policyItem.getId())){
continue;
}
//当前科目
Long subjectId = policyItem.getSubjectId();
//拦截非当前成本中心
String centerId = policyItem.getCenterId();
String centerType = policyItem.getCenterType();
for (TbsBudget budget : currentItemBudgetList) {
if(!budget.getCenterId().equals(centerId) ||
!budget.getCenterType().equals(centerType) ){
continue;
}
if(!subjectId.equals(budget.getSubjectId())&&!budget.getSubjectId().equals(0L)){
continue;
}
List<TbsScheduleItemBudget> scheduleItemBudgets = policyItem.getScheduleItemBudgetList();
for (TbsScheduleItemBudget scheduleItemBudget : scheduleItemBudgets) {
if(scheduleItemBudget.getBudgetId().equals(budget.getId())){
currentScheduleItemBudgets.add(scheduleItemBudget);
}
}
}
}
//检测是否有是否足够预算
// BigDecimal goodsAmount = activityCostItem.getCenterGoodsAmount();
// if(CollectionUtil.isNotEmpty(currentScheduleItemBudgets)){
// boolean isMatch = false;
// for (TbsScheduleItemBudget itemBudget : currentScheduleItemBudgets) {
// //历史费用(含申请占用金额)
// BigDecimal totalUsed = budgetItemAmountMap.get(itemBudget.getId());
// //当前项费用
// BigDecimal budgetAmount = itemBudget.getBudgetAmount();
// //前置费用
// BigDecimal lastAmount = counterMap.get(itemBudget.getId());
// if(lastAmount==null){
// lastAmount = BigDecimal.ZERO;
// }
// //判断是否够用
// if(budgetAmount.subtract(lastAmount).subtract(totalUsed).compareTo(goodsAmount)>0){
// activityCostItem.setBudgetId(itemBudget.getBudgetId());
// activityCostItem.setScheduleId(itemBudget.getScheduleId());
// activityCostItem.setScheduleItemId(itemBudget.getScheduleItemId());
// activityCostItem.setScheduleItemBudgetId(itemBudget.getId());
// activityCostItem.setScheduleItemName(itemBudget.getItemName());
// //绑定录入时可用预算
// activityCostItem.setScheduleItemAmount(budgetAmount);
// //剩余的可用预算
// activityCostItem.setScheduleItemAmountUsed(totalUsed);
// activityCostItem.setScheduleItemAmountApply(budgetItemApplyAmountMap.get(itemBudget.getId()));
// isMatch = true;
// //记录当前费用使用考核期费用
// lastAmount = lastAmount.add(goodsAmount);
// counterMap.put(itemBudget.getId(),lastAmount);
// actMatchList.add(activityCostItem);
// break;
// }
// }
// //无匹配的预算
// if(!isMatch){
// if (throwEx){
// Assert.throwEx("品类["+ activityCostItem.getTargetName()+"]预算不足");
// }
// if(overspend){
// TbsScheduleItemBudget itemBudget = currentScheduleItemBudgets.get(0);
// activityCostItem.setBudgetId(itemBudget.getBudgetId());
// activityCostItem.setScheduleId(itemBudget.getScheduleId());
// activityCostItem.setScheduleItemId(itemBudget.getScheduleItemId());
// activityCostItem.setScheduleItemBudgetId(itemBudget.getId());
// activityCostItem.setScheduleItemName(itemBudget.getItemName());
// //记录当前费用使用考核期费用
// BigDecimal lastAmount = counterMap.get(itemBudget.getId());
// if(lastAmount==null){
// lastAmount = BigDecimal.ZERO;
// }
// lastAmount = lastAmount.add(goodsAmount);
// counterMap.put(itemBudget.getId(),lastAmount);
// actMatchList.add(activityCostItem);
// }else{
// activityCostItem.setBudgetId(0L);
// activityCostItem.setScheduleId(0L);
// activityCostItem.setScheduleItemId(0L);
// activityCostItem.setScheduleItemBudgetId(0L);
// activityCostItem.setScheduleItemName("无");
// actUnMatchList.add(activityCostItem);
// }
// }
// }else {
// if(throwEx){
// Assert.throwEx("品类["+ activityCostItem.getTargetName()+"]无可用预算");
// }
// //添加到预算超支表
// activityCostItem.setBudgetId(0L);
// activityCostItem.setScheduleId(0L);
// activityCostItem.setScheduleItemId(0L);
// activityCostItem.setScheduleItemBudgetId(0L);
// activityCostItem.setScheduleItemName("无");
// actUnMatchList.add(activityCostItem);
// }
}
/**
* 拦截没有预算的活动
* @param throwEx 抛出异常
* @param overspend 超支
* @param policyItemList 活动列表
* @param noBudgetPolicyIds 没有预算的活动id
* @param activityAllowBudgetIdMap 预算条件需包含活动条件 Map结构活动id->满足的预算id列表
*/
private void handleNoBudgetPolicy(Boolean throwEx, boolean overspend, List<TzcPolicyItem> policyItemList,
Set<Long> noBudgetPolicyIds,
Map<Long,List<Long>> activityAllowBudgetIdMap) {
if(!overspend && throwEx && noBudgetPolicyIds.size()>0){
for (TzcPolicyItem policyItem : policyItemList) {
for (Long policyId : noBudgetPolicyIds) {
if(policyItem.getId().equals(policyId)){
Assert.throwEx("["+policyItem.getPolicyItemCode()+"]无可用预算");
}
}
List<Long> budgetIds = activityAllowBudgetIdMap.get(policyItem.getId());
if(CollectionUtil.isEmpty(budgetIds)){
Assert.throwEx("["+policyItem.getPolicyItemCode()+"]无可用预算");
}
}
Assert.throwEx("无可用预算");
}
}
/**
* 预算条件需包含活动条件 Map结构活动id->满足的预算id列表
* @param policyItemList
* @param budgetList
* @param noConditionBudgetList
* @return
*/
private Map<Long, List<Long>> buildPolicyBudgetMap(List<TzcPolicyItem> policyItemList,
List<TbsBudget> budgetList,
List<TbsBudget> noConditionBudgetList) {
Map<Long, List<Long>> activityAllowBudgetIdMap = new HashMap<>();
for (TzcPolicyItem policyItem : policyItemList) {
Long policyItemId = policyItem.getId();
List<Long> budgetIdsOfActivity = new ArrayList<>();
if(CollectionUtil.isEmpty(noConditionBudgetList)){
budgetIdsOfActivity.addAll(noConditionBudgetList.stream().map(TbsBudget::getId).collect(Collectors.toList()));
}
List<TzcPolicyGoods> policyGoodsList = tzcPolicyGoodsService.listByItemId(policyItemId);
for (TbsBudget budget : budgetList) {
if(budget.getConditionFlag().equals(1)){
List<TbsBudgetCondition> budgetConditionList = budget.getBudgetConditionList();
boolean hasNoMatch = false;
for (TzcPolicyGoods policyGoods : policyGoodsList) {
boolean matchGoods = false;
for (TbsBudgetCondition budgetCondition : budgetConditionList) {
if(policyGoods.getTargetLevelPathIds().contains(budgetCondition.getTargetLevelPathIds())){
matchGoods = true;
break;
}
}
if(!matchGoods){
hasNoMatch = true;
break;
}
}
if(!hasNoMatch){
List<Long> budgetIds = activityAllowBudgetIdMap.get(policyItemId);
if(budgetIds==null){
budgetIds = new ArrayList<>();
}
budgetIds.add(budget.getId());
budgetIds.addAll(budgetIdsOfActivity);
activityAllowBudgetIdMap.put(policyItemId,budgetIds);
}
}else {
List<Long> budgetIds = activityAllowBudgetIdMap.get(policyItemId);
if(budgetIds==null){
budgetIds = new ArrayList<>();
}
budgetIds.add(budget.getId());
budgetIds.addAll(budgetIdsOfActivity);
activityAllowBudgetIdMap.put(policyItemId,budgetIds);
}
}
}
return activityAllowBudgetIdMap;
}
/**
* 1.通过活动加载所有满足条件的考核期(用于加载历史核销费用),
* 2.设置没有可用预算的活动id
* 3.设置匹配的考核期列表到活动中
* @param policyItemList -> item设置满足条件的考核期列表
* @param budgetIds
* @param noBudgetPolicyItemIds 没有预算的政策项ID
* @return scheduleItemList 命中的考核期列表
*/
public List<TbsScheduleItemBudget> loadScheduleBudgetAndSetting(List<TzcPolicyItem> policyItemList,
List<Long> budgetIds, Set<Long> noBudgetPolicyItemIds) {
List<TbsScheduleItemBudget> scheduleItemList = new ArrayList<>();
Set<Long> budgetIdsSet = new HashSet<>();
Map<Long,TbsScheduleItemBudget> allAllowScheduleItemTempMap = new HashMap<>();
for (TzcPolicyItem policyItem : policyItemList) {
List<TbsScheduleItemBudget> budgetItemList = tbsScheduleItemBudgetService
.betweenDateList(policyItem.getPolicyStartDate(),policyItem.getPolicyEndDate());
//设置关联用于后面条件过滤
policyItem.setScheduleItemBudgetList(budgetItemList);
if(CollectionUtil.isNotEmpty(budgetItemList)){
for (TbsScheduleItemBudget item : budgetItemList) {
budgetIdsSet.add(item.getBudgetId());
allAllowScheduleItemTempMap.put(item.getId(),item);
}
}else {
noBudgetPolicyItemIds.add(policyItem.getId());
}
}
for (Long tmpId : allAllowScheduleItemTempMap.keySet()) {
scheduleItemList.add(allAllowScheduleItemTempMap.get(tmpId));
}
budgetIds.addAll(budgetIdsSet);
return scheduleItemList;
}
}

3
src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyGoodsService.java

@ -3,6 +3,7 @@ package com.qs.serve.modules.tzc.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qs.serve.modules.tzc.entity.TzcPolicyGoods;
import com.qs.serve.modules.tzc.entity.bo.TzcPolicyGoodsBo;
import java.util.List;
/**
* 政策商品 服务接口
@ -11,5 +12,7 @@ import com.qs.serve.modules.tzc.entity.bo.TzcPolicyGoodsBo;
*/
public interface TzcPolicyGoodsService extends IService<TzcPolicyGoods> {
List<TzcPolicyGoods> listByItemId(Long itemId);
}

8
src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyGoodsServiceImpl.java

@ -18,6 +18,8 @@ import com.qs.serve.modules.tzc.entity.TzcPolicyGoods;
import com.qs.serve.modules.tzc.service.TzcPolicyGoodsService;
import com.qs.serve.modules.tzc.mapper.TzcPolicyGoodsMapper;
import java.util.List;
/**
* 政策商品 服务实现类
* @author YenHex
@ -28,5 +30,11 @@ import com.qs.serve.modules.tzc.mapper.TzcPolicyGoodsMapper;
@AllArgsConstructor
public class TzcPolicyGoodsServiceImpl extends ServiceImpl<TzcPolicyGoodsMapper,TzcPolicyGoods> implements TzcPolicyGoodsService {
@Override
public List<TzcPolicyGoods> listByItemId(Long itemId) {
LambdaQueryWrapper<TzcPolicyGoods> lqw = new LambdaQueryWrapper<>();
lqw.eq(TzcPolicyGoods::getPolicyItemId,itemId);
return this.list(lqw);
}
}

36
src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyItemServiceImpl.java

@ -26,6 +26,7 @@ import com.qs.serve.modules.tzc.service.TzcPolicyItemService;
import com.qs.serve.modules.tzc.mapper.TzcPolicyItemMapper;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@ -62,23 +63,27 @@ public class TzcPolicyItemServiceImpl extends ServiceImpl<TzcPolicyItemMapper,Tz
if(!tzcPolicy.allowEditFlag()){
return R.error("当前状态不支持编辑");
}
TzcPolicyItem tzcPolicyItem = new TzcPolicyItem();
if(param.getId()!=null){
TzcPolicyItem item = this.getById(param.getId());
if(!item.getPolicyId().equals(tzcPolicy.getId())){
return R.error("数据错误");
}
tzcPolicyItem.setId(param.getId());
tzcPolicyItem.setPolicyItemCode(item.getPolicyItemCode());
}else {
List<TzcPolicyItem> policyItemList = this.listByPolicyId(tzcPolicy.getId());
tzcPolicyItem.setPolicyItemCode(tzcPolicy.getPolicyCode()+"_"+(policyItemList.size()+1));
}
List<TzcPolicyItem> policyItemList = this.listByPolicyId(tzcPolicy.getId());
BmsSubject bmsSubject = bmsSubjectService.getById(param.getSubjectId());
BmsSubject bmsSubject = bmsSubjectService.getByCode("FYMC05");
TbsCenterDto centerDto = tbsCenterDtoService.getCenterDto(param.getCenterType(),param.getCenterId());
TzcPolicyItem tzcPolicyItem = new TzcPolicyItem();
tzcPolicyItem.setId(param.getId());
tzcPolicyItem.setPolicyId(param.getPolicyId());
tzcPolicyItem.setPolicyStartDate(param.getPolicyStartDate());
tzcPolicyItem.setPolicyEndDate(param.getPolicyEndDate());
tzcPolicyItem.setDiscountAmount(param.getDiscountAmount());
tzcPolicyItem.setDiscountRate(param.getDiscountRate());
tzcPolicyItem.setUsedAmount(param.getUsedAmount());
tzcPolicyItem.setDiscountMax(param.getDiscountMax());
//tzcPolicyItem.setUsedAmount(param.getUsedAmount());
tzcPolicyItem.setCenterType(centerDto.getCenterType());
tzcPolicyItem.setCenterId(centerDto.getId());
tzcPolicyItem.setCenterCode(centerDto.getCenterCode());
@ -86,7 +91,6 @@ public class TzcPolicyItemServiceImpl extends ServiceImpl<TzcPolicyItemMapper,Tz
tzcPolicyItem.setSubjectId(bmsSubject.getId());
tzcPolicyItem.setSubjectCode(bmsSubject.getSubjectCode());
tzcPolicyItem.setSubjectName(bmsSubject.getSubjectName());
tzcPolicyItem.setPolicyItemCode(tzcPolicy.getPolicyCode()+"_"+(policyItemList.size()+1));
tzcPolicyItem.setTitle(tzcPolicy.getTitle());
tzcPolicyItem.setSupplierId(tzcPolicy.getSupplierId());
tzcPolicyItem.setSupplierName(tzcPolicy.getSupplierName());
@ -121,8 +125,26 @@ public class TzcPolicyItemServiceImpl extends ServiceImpl<TzcPolicyItemMapper,Tz
}
this.saveOrUpdate(tzcPolicyItem);
Long itemId = tzcPolicyItem.getId();
tzcPolicyGoodsList.forEach(a->a.setPolicyItemId(itemId));
tzcPolicyGoodsList.forEach(a->{
a.setPolicyItemId(itemId);
a.setPolicyItemCode(tzcPolicyItem.getPolicyItemCode());
});
tzcPolicyGoodsService.saveBatch(tzcPolicyGoodsList);
//更新政策数量
List<TzcPolicyItem> policyItemList = this.listByPolicyId(tzcPolicy.getId());
BigDecimal totalAmount = BigDecimal.ZERO;
BigDecimal totalUsedAmount = BigDecimal.ZERO;
for (TzcPolicyItem policyItem : policyItemList) {
totalAmount = totalAmount.add(policyItem.getDiscountMax());
totalUsedAmount = totalUsedAmount.add(policyItem.getUsedAmount());
}
TzcPolicy policyParam = new TzcPolicy();
policyParam.setTotalItemAmount(totalAmount);
policyParam.setTotalItemUsedAmount(totalUsedAmount);
policyParam.setTotalItems(policyItemList.size());
LambdaQueryWrapper<TzcPolicy> lqw = new LambdaQueryWrapper<>();
lqw.eq(TzcPolicy::getId,param.getPolicyId());
tzcPolicyMapper.update(policyParam,lqw);
return R.ok(tzcPolicyItem);
}

18
src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyServiceImpl.java

@ -52,17 +52,17 @@ public class TzcPolicyServiceImpl extends ServiceImpl<TzcPolicyMapper,TzcPolicy>
}
}else {
tzcPolicy = new TzcPolicy();
tzcPolicy.setPolicyCode(IdUtil.getSnowflake()+"");
tzcPolicy.setPolicyCode(IdUtil.dateTimeStampId()+"");
SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId());
tzcPolicy.setUserId(sysUser.getId());
tzcPolicy.setUserCode(sysUser.getCode());
tzcPolicy.setUserName(sysUser.getName());
BmsSupplier supplier = bmsSupplierService.getById(policyParam.getSupplierId());
tzcPolicy.setSupplierId(policyParam.getSupplierId());
tzcPolicy.setSupplierCode(supplier.getCode());
tzcPolicy.setSupplierName(supplier.getName());
}
BmsSupplier supplier = bmsSupplierService.getById(policyParam.getSupplierId());
SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId());
tzcPolicy.setTitle(policyParam.getTitle());
tzcPolicy.setSupplierId(policyParam.getSupplierId());
tzcPolicy.setSupplierCode(supplier.getCode());
tzcPolicy.setSupplierName(supplier.getName());
tzcPolicy.setUserId(sysUser.getId());
tzcPolicy.setUserCode(sysUser.getCode());
tzcPolicy.setUserName(sysUser.getName());
tzcPolicy.setRemark(policyParam.getRemark());
this.saveOrUpdate(tzcPolicy);
return R.ok(tzcPolicy);

Loading…
Cancel
Save