Browse Source

活动添加流程调整,添加核销流水流程

mssql
Yen 3 years ago
parent
commit
e5e0fdc0fa
  1. 18
      src/main/java/com/qs/serve/modules/goods/entity/dto/TbsCenterDto.java
  2. 2
      src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenter.java
  3. 7
      src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenterGoods.java
  4. 3
      src/main/java/com/qs/serve/modules/tbs/entity/TbsActivitySubject.java
  5. 5
      src/main/java/com/qs/serve/modules/tbs/service/TbsActivityCenterGoodsService.java
  6. 4
      src/main/java/com/qs/serve/modules/tbs/service/TbsActivityCenterService.java
  7. 9
      src/main/java/com/qs/serve/modules/tbs/service/TbsActivitySubjectService.java
  8. 9
      src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityCenterGoodsServiceImpl.java
  9. 9
      src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityCenterServiceImpl.java
  10. 18
      src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityServiceImpl.java
  11. 9
      src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivitySubjectServiceImpl.java
  12. 19
      src/main/java/com/qs/serve/modules/vtb/common/VtbFundFlowType.java
  13. 31
      src/main/java/com/qs/serve/modules/vtb/entity/VtbFundFlow.java
  14. 4
      src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationSubject.java
  15. 19
      src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbFundFlowBo.java
  16. 8
      src/main/java/com/qs/serve/modules/vtb/entity/so/VtbFundFlowSo.java
  17. 14
      src/main/java/com/qs/serve/modules/vtb/mapper/VtbFundFlowMapper.java
  18. 14
      src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationCenterGoodsMapper.java
  19. 37
      src/main/java/com/qs/serve/modules/vtb/service/VtbFundFlowService.java
  20. 14
      src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationCenterGoodsService.java
  21. 2
      src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationChannelPointService.java
  22. 2
      src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationChannelService.java
  23. 13
      src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationService.java
  24. 6
      src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationSubjectService.java
  25. 139
      src/main/java/com/qs/serve/modules/vtb/service/impl/VtbFundFlowServiceImpl.java
  26. 22
      src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationCenterGoodsServiceImpl.java
  27. 10
      src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationChannelPointServiceImpl.java
  28. 8
      src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationChannelServiceImpl.java
  29. 209
      src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java
  30. 17
      src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationSubjectServiceImpl.java

18
src/main/java/com/qs/serve/modules/goods/entity/dto/TbsCenterDto.java

@ -3,12 +3,14 @@ package com.qs.serve.modules.goods.entity.dto;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
/** /**
* @author YenHex * @author YenHex
* @since 2022/11/10 * @since 2022/11/10
*/ */
@Data @Data
@AllArgsConstructor
public class TbsCenterDto { public class TbsCenterDto {
String id; String id;
@ -19,4 +21,18 @@ public class TbsCenterDto {
String centerType; String centerType;
/** 费用占比率,单位百分位(该成本中心在费用中占比) */
@NotNull(message = "费用占比率不能为空")
private BigDecimal centerRate;
/** 费用占比金额(该成本中心在费用金额) */
@NotNull(message = "费用占比率不能为空")
private BigDecimal centerAmount;
public TbsCenterDto(String id, String centerCode, String centerName, String centerType) {
this.id = id;
this.centerCode = centerCode;
this.centerName = centerName;
this.centerType = centerType;
}
} }

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

@ -51,6 +51,8 @@ public class TbsActivityCenter implements Serializable {
@NotNull(message = "费用额度不能为空") @NotNull(message = "费用额度不能为空")
private BigDecimal centerAmount; private BigDecimal centerAmount;
private BigDecimal usedAmount;
/** 成本中心类型 /** 成本中心类型
center, center,
customer, customer,

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

@ -85,6 +85,13 @@ public class TbsActivityCenterGoods implements Serializable {
@Length(max = 50,message = "成本中心名称长度不能超过50字") @Length(max = 50,message = "成本中心名称长度不能超过50字")
private String centerName; private String centerName;
/** 费用额度 */
@NotNull(message = "费用额度不能为空")
private BigDecimal centerAmount;
/** 费用占比 */
@NotNull(message = "费用占比不能为空")
private BigDecimal centerRate;
/** 目标类型(brand、category、series、spu、sku) */ /** 目标类型(brand、category、series、spu、sku) */
@NotBlank(message = "目标类型(brand、category、series、spu、sku)不能为空") @NotBlank(message = "目标类型(brand、category、series、spu、sku)不能为空")

3
src/main/java/com/qs/serve/modules/tbs/entity/TbsActivitySubject.java

@ -58,6 +58,9 @@ public class TbsActivitySubject implements Serializable {
@NotNull(message = "费用额度不能为空") @NotNull(message = "费用额度不能为空")
private BigDecimal amount; private BigDecimal amount;
/** 费用额度 */
private BigDecimal usedAmount;
/** 场次 */ /** 场次 */
@NotNull(message = "场次不能为空") @NotNull(message = "场次不能为空")
private Integer countSession; private Integer countSession;

5
src/main/java/com/qs/serve/modules/tbs/service/TbsActivityCenterGoodsService.java

@ -2,7 +2,7 @@ package com.qs.serve.modules.tbs.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.qs.serve.modules.tbs.entity.TbsActivityCenterGoods; import com.qs.serve.modules.tbs.entity.TbsActivityCenterGoods;
import java.util.List;
/** /**
* 活动成本中心配比项 服务接口 * 活动成本中心配比项 服务接口
* @author YenHex * @author YenHex
@ -10,5 +10,8 @@ import com.qs.serve.modules.tbs.entity.TbsActivityCenterGoods;
*/ */
public interface TbsActivityCenterGoodsService extends IService<TbsActivityCenterGoods> { public interface TbsActivityCenterGoodsService extends IService<TbsActivityCenterGoods> {
List<TbsActivityCenterGoods> listByActivityId(Long activityId);
} }

4
src/main/java/com/qs/serve/modules/tbs/service/TbsActivityCenterService.java

@ -3,6 +3,8 @@ package com.qs.serve.modules.tbs.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.qs.serve.modules.tbs.entity.TbsActivityCenter; import com.qs.serve.modules.tbs.entity.TbsActivityCenter;
import java.util.List;
/** /**
* 活动成本中心项 服务接口 * 活动成本中心项 服务接口
* @author YenHex * @author YenHex
@ -10,5 +12,7 @@ import com.qs.serve.modules.tbs.entity.TbsActivityCenter;
*/ */
public interface TbsActivityCenterService extends IService<TbsActivityCenter> { public interface TbsActivityCenterService extends IService<TbsActivityCenter> {
List<TbsActivityCenter> listByActivity(Long activityId);
} }

9
src/main/java/com/qs/serve/modules/tbs/service/TbsActivitySubjectService.java

@ -3,6 +3,8 @@ package com.qs.serve.modules.tbs.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.qs.serve.modules.tbs.entity.TbsActivitySubject; import com.qs.serve.modules.tbs.entity.TbsActivitySubject;
import java.util.List;
/** /**
* 活动科目项 服务接口 * 活动科目项 服务接口
* @author YenHex * @author YenHex
@ -10,5 +12,12 @@ import com.qs.serve.modules.tbs.entity.TbsActivitySubject;
*/ */
public interface TbsActivitySubjectService extends IService<TbsActivitySubject> { public interface TbsActivitySubjectService extends IService<TbsActivitySubject> {
/**
* 通过活动id获取列表
* @param activityId
* @return
*/
List<TbsActivitySubject> listByActivityId(Long activityId);
} }

9
src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityCenterGoodsServiceImpl.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.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -8,6 +9,8 @@ import com.qs.serve.modules.tbs.entity.TbsActivityCenterGoods;
import com.qs.serve.modules.tbs.service.TbsActivityCenterGoodsService; import com.qs.serve.modules.tbs.service.TbsActivityCenterGoodsService;
import com.qs.serve.modules.tbs.mapper.TbsActivityCenterGoodsMapper; import com.qs.serve.modules.tbs.mapper.TbsActivityCenterGoodsMapper;
import java.util.List;
/** /**
* 活动成本中心配比项 服务实现类 * 活动成本中心配比项 服务实现类
* @author YenHex * @author YenHex
@ -18,5 +21,11 @@ import com.qs.serve.modules.tbs.mapper.TbsActivityCenterGoodsMapper;
@AllArgsConstructor @AllArgsConstructor
public class TbsActivityCenterGoodsServiceImpl extends ServiceImpl<TbsActivityCenterGoodsMapper,TbsActivityCenterGoods> implements TbsActivityCenterGoodsService { public class TbsActivityCenterGoodsServiceImpl extends ServiceImpl<TbsActivityCenterGoodsMapper,TbsActivityCenterGoods> implements TbsActivityCenterGoodsService {
@Override
public List<TbsActivityCenterGoods> listByActivityId(Long activityId) {
LambdaQueryWrapper<TbsActivityCenterGoods> lqw = new LambdaQueryWrapper<>();
lqw.eq(TbsActivityCenterGoods::getActivityId,activityId);
return this.list(lqw);
}
} }

9
src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityCenterServiceImpl.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.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -8,6 +9,8 @@ import com.qs.serve.modules.tbs.entity.TbsActivityCenter;
import com.qs.serve.modules.tbs.service.TbsActivityCenterService; import com.qs.serve.modules.tbs.service.TbsActivityCenterService;
import com.qs.serve.modules.tbs.mapper.TbsActivityCenterMapper; import com.qs.serve.modules.tbs.mapper.TbsActivityCenterMapper;
import java.util.List;
/** /**
* 活动成本中心项 服务实现类 * 活动成本中心项 服务实现类
* @author YenHex * @author YenHex
@ -18,5 +21,11 @@ import com.qs.serve.modules.tbs.mapper.TbsActivityCenterMapper;
@AllArgsConstructor @AllArgsConstructor
public class TbsActivityCenterServiceImpl extends ServiceImpl<TbsActivityCenterMapper,TbsActivityCenter> implements TbsActivityCenterService { public class TbsActivityCenterServiceImpl extends ServiceImpl<TbsActivityCenterMapper,TbsActivityCenter> implements TbsActivityCenterService {
@Override
public List<TbsActivityCenter> listByActivity(Long activityId) {
LambdaQueryWrapper<TbsActivityCenter> lqw = new LambdaQueryWrapper<>();
lqw.eq(TbsActivityCenter::getActivityId,activityId);
return this.list(lqw);
}
} }

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

@ -29,11 +29,9 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.List;
/** /**
* 费用活动 服务实现类 * 费用活动 服务实现类
* @author YenHex * @author YenHex
@ -76,7 +74,7 @@ public class TbsActivityServiceImpl extends ServiceImpl<TbsActivityMapper,TbsAct
} }
}else { }else {
activity = CopierUtil.copy(activityBo,new TbsActivity()); activity = CopierUtil.copy(activityBo,new TbsActivity());
activity.setActivityCode("G"+ StringUtils.genShortId()); activity.setActivityCode("G"+ StringUtils.genShortId() + new Random().nextInt(9));
} }
activity.setSupplierId(Long.parseLong(supplier.getId())); activity.setSupplierId(Long.parseLong(supplier.getId()));
activity.setSupplierCode(supplier.getCode()); activity.setSupplierCode(supplier.getCode());
@ -119,7 +117,8 @@ public class TbsActivityServiceImpl extends ServiceImpl<TbsActivityMapper,TbsAct
for (TbsActivityCenterGoods centerGoods : actCenterGoodsList) { for (TbsActivityCenterGoods centerGoods : actCenterGoodsList) {
rate = rate.add(centerGoods.getCenterGoodsRate()); rate = rate.add(centerGoods.getCenterGoodsRate());
} }
if(rate.compareTo(new BigDecimal(100))!=0){ BigDecimal tmp = rate.divide(new BigDecimal(100));
if(tmp.compareTo(new BigDecimal(tmp.longValue()))!=0){
Assert.throwEx("成本与商品分配比例有误"); Assert.throwEx("成本与商品分配比例有误");
} }
} }
@ -206,9 +205,12 @@ public class TbsActivityServiceImpl extends ServiceImpl<TbsActivityMapper,TbsAct
TbsCenterDto tbsCenterDto = centerDtoMap.get(key); TbsCenterDto tbsCenterDto = centerDtoMap.get(key);
centerGoods.setActivityId(activity.getId()); centerGoods.setActivityId(activity.getId());
centerGoods.setCostApplyId(costApply.getId()); centerGoods.setCostApplyId(costApply.getId());
centerGoods.setCenterType(centerGoodsBo.getCenterType());
centerGoods.setCenterId(centerGoodsBo.getCenterId()); centerGoods.setCenterId(centerGoodsBo.getCenterId());
centerGoods.setCenterCode(tbsCenterDto.getCenterCode()); centerGoods.setCenterCode(tbsCenterDto.getCenterCode());
centerGoods.setCenterName(tbsCenterDto.getCenterName()); centerGoods.setCenterName(tbsCenterDto.getCenterName());
centerGoods.setCenterRate(tbsCenterDto.getCenterRate());
centerGoods.setCenterAmount(tbsCenterDto.getCenterAmount());
//设置科目 //设置科目
centerGoods.setCostApplyId(costApply.getId()); centerGoods.setCostApplyId(costApply.getId());
centerGoods.setActivityId(activity.getId()); centerGoods.setActivityId(activity.getId());
@ -233,6 +235,8 @@ public class TbsActivityServiceImpl extends ServiceImpl<TbsActivityMapper,TbsAct
Long actTarId = activityGoods.getTargetId(); Long actTarId = activityGoods.getTargetId();
String actTarType = activityGoods.getTargetType(); String actTarType = activityGoods.getTargetType();
if(actTarId.equals(cenTarId)&&cenTarType.equals(actTarType)){ if(actTarId.equals(cenTarId)&&cenTarType.equals(actTarType)){
centerGoods.setTargetId(activityGoods.getTargetId());
centerGoods.setTargetType(activityGoods.getTargetType());
centerGoods.setTargetCode(activityGoods.getTargetCode()); centerGoods.setTargetCode(activityGoods.getTargetCode());
centerGoods.setTargetName(activityGoods.getTargetName()); centerGoods.setTargetName(activityGoods.getTargetName());
centerGoods.setTargetLevelPathIds(activityGoods.getTargetLevelPathIds()); centerGoods.setTargetLevelPathIds(activityGoods.getTargetLevelPathIds());
@ -288,6 +292,8 @@ public class TbsActivityServiceImpl extends ServiceImpl<TbsActivityMapper,TbsAct
TbsCenterDto tbsCenterDto = centerDtoMap.get(key); TbsCenterDto tbsCenterDto = centerDtoMap.get(key);
if(tbsCenterDto==null){ if(tbsCenterDto==null){
tbsCenterDto = tbsCenterDtoService.getCenterDto(centerType,centerId); tbsCenterDto = tbsCenterDtoService.getCenterDto(centerType,centerId);
tbsCenterDto.setCenterRate(centerBo.getCenterRate());
tbsCenterDto.setCenterAmount(centerBo.getCenterAmount());
centerDtoMap.put(key,tbsCenterDto); centerDtoMap.put(key,tbsCenterDto);
} }
TbsActivityCenter activityCenter = new TbsActivityCenter(); TbsActivityCenter activityCenter = new TbsActivityCenter();

9
src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivitySubjectServiceImpl.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.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -8,6 +9,8 @@ import com.qs.serve.modules.tbs.entity.TbsActivitySubject;
import com.qs.serve.modules.tbs.service.TbsActivitySubjectService; import com.qs.serve.modules.tbs.service.TbsActivitySubjectService;
import com.qs.serve.modules.tbs.mapper.TbsActivitySubjectMapper; import com.qs.serve.modules.tbs.mapper.TbsActivitySubjectMapper;
import java.util.List;
/** /**
* 活动科目项 服务实现类 * 活动科目项 服务实现类
* @author YenHex * @author YenHex
@ -18,5 +21,11 @@ import com.qs.serve.modules.tbs.mapper.TbsActivitySubjectMapper;
@AllArgsConstructor @AllArgsConstructor
public class TbsActivitySubjectServiceImpl extends ServiceImpl<TbsActivitySubjectMapper,TbsActivitySubject> implements TbsActivitySubjectService { public class TbsActivitySubjectServiceImpl extends ServiceImpl<TbsActivitySubjectMapper,TbsActivitySubject> implements TbsActivitySubjectService {
@Override
public List<TbsActivitySubject> listByActivityId(Long activityId) {
LambdaQueryWrapper<TbsActivitySubject> lqw = new LambdaQueryWrapper<>();
lqw.eq(TbsActivitySubject::getActivityId,activityId);
return this.list(lqw);
}
} }

19
src/main/java/com/qs/serve/modules/vtb/common/VtbFundFlowType.java

@ -0,0 +1,19 @@
package com.qs.serve.modules.vtb.common;
/**
* @author YenHex
* @since 2022/11/25
*/
public interface VtbFundFlowType {
/**
* 核销
*/
String Verification = "verification";
/**
* 释放费用
*/
String Release = "release";
}

31
src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationCenterGoods.java → src/main/java/com/qs/serve/modules/vtb/entity/VtbFundFlow.java

@ -17,13 +17,13 @@ import javax.validation.constraints.NotNull;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
/** /**
* 核销费用项 实体类 * 核销流水 实体类
* @author YenHex * @author YenHex
* @since 2022-11-24 * @since 2022-11-25
*/ */
@Data @Data
@TableName("vtb_verification_center_goods") @TableName("vtb_fund_flow")
public class VtbVerificationCenterGoods implements Serializable { public class VtbFundFlow implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ -31,14 +31,13 @@ public class VtbVerificationCenterGoods implements Serializable {
@TableId(type = IdType.AUTO) @TableId(type = IdType.AUTO)
private Long id; private Long id;
/** 核销类型 */
private String fundType;
/** 核销id */ /** 核销id */
@NotNull(message = "核销id不能为空") @NotNull(message = "核销id不能为空")
private Long verificationId; private Long verificationId;
/** 核销状态 */
@NotNull(message = "核销状态不能为空")
private Integer verification_state;
/** 成本明细编码 */ /** 成本明细编码 */
@NotBlank(message = "成本明细编码不能为空") @NotBlank(message = "成本明细编码不能为空")
@Length(max = 30,message = "成本明细编码长度不能超过30字") @Length(max = 30,message = "成本明细编码长度不能超过30字")
@ -53,59 +52,47 @@ public class VtbVerificationCenterGoods implements Serializable {
private Long activityId; private Long activityId;
/** 科目id */ /** 科目id */
@NotNull(message = "科目id不能为空")
private Long subjectId; private Long subjectId;
/** 科目编码 */ /** 科目编码 */
@NotBlank(message = "科目编码不能为空")
@Length(max = 50,message = "科目编码长度不能超过50字") @Length(max = 50,message = "科目编码长度不能超过50字")
private String subjectCode; private String subjectCode;
/** 科目名称 */ /** 科目名称 */
@NotBlank(message = "科目名称不能为空")
@Length(max = 50,message = "科目名称长度不能超过50字") @Length(max = 50,message = "科目名称长度不能超过50字")
private String subjectName; private String subjectName;
/** 成本中心类型 */ /** 成本中心类型 */
@NotBlank(message = "成本中心类型不能为空")
@Length(max = 50,message = "成本中心类型长度不能超过50字") @Length(max = 50,message = "成本中心类型长度不能超过50字")
private String centerType; private String centerType;
/** 成本中心id */ /** 成本中心id */
@NotBlank(message = "成本中心id不能为空")
@Length(max = 32,message = "成本中心id长度不能超过32字") @Length(max = 32,message = "成本中心id长度不能超过32字")
private String centerId; private String centerId;
/** 成本中心编码 */ /** 成本中心编码 */
@NotBlank(message = "成本中心编码不能为空")
@Length(max = 50,message = "成本中心编码长度不能超过50字") @Length(max = 50,message = "成本中心编码长度不能超过50字")
private String centerCode; private String centerCode;
/** 成本中心名称 */ /** 成本中心名称 */
@NotBlank(message = "成本中心名称不能为空")
@Length(max = 50,message = "成本中心名称长度不能超过50字") @Length(max = 50,message = "成本中心名称长度不能超过50字")
private String centerName; private String centerName;
/** 已用费用 */ /** 已用费用 */
@NotNull(message = "已用费用不能为空")
private BigDecimal usedAmount; private BigDecimal usedAmount;
/** 目标类型(brand、category、series、spu、sku) */ /** 目标类型(brand、category、series、spu、sku) */
@NotBlank(message = "目标类型(brand、category、series、spu、sku)不能为空")
@Length(max = 30,message = "目标类型(brand、category、series、spu、sku)长度不能超过30字") @Length(max = 30,message = "目标类型(brand、category、series、spu、sku)长度不能超过30字")
private String targetType; private String targetType;
/** 目标id */ /** 目标id */
@NotNull(message = "目标id不能为空")
private Long targetId; private Long targetId;
/** 目标编码 */ /** 目标编码 */
@NotBlank(message = "目标编码不能为空")
@Length(max = 30,message = "目标编码长度不能超过30字") @Length(max = 30,message = "目标编码长度不能超过30字")
private String targetCode; private String targetCode;
/** 目标名称 */ /** 目标名称 */
@NotBlank(message = "目标名称不能为空")
@Length(max = 30,message = "目标名称长度不能超过30字") @Length(max = 30,message = "目标名称长度不能超过30字")
private String targetName; private String targetName;
@ -151,5 +138,9 @@ public class VtbVerificationCenterGoods implements Serializable {
@JsonProperty @JsonProperty
private String delFlag; private String delFlag;
/** 临时金额,统计该项可传入金额 */
@TableField(exist = false)
private BigDecimal tempBalance;
} }

4
src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationSubject.java

@ -35,6 +35,10 @@ public class VtbVerificationSubject implements Serializable {
@NotNull(message = "核算id不能为空") @NotNull(message = "核算id不能为空")
private Long verificationId; private Long verificationId;
/** 核销状态 */
@NotNull(message = "核销状态不能为空")
private Integer verificationState;
/** 费用申请id */ /** 费用申请id */
@NotNull(message = "费用申请id不能为空") @NotNull(message = "费用申请id不能为空")
private Long costApplyId; private Long costApplyId;

19
src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationCenterGoodsBo.java → src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbFundFlowBo.java

@ -16,12 +16,12 @@ import javax.validation.constraints.NotNull;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
/** /**
* 核销费用项 Bo * 核销流水 Bo
* @author YenHex * @author YenHex
* @since 2022-11-24 * @since 2022-11-25
*/ */
@Data @Data
public class VtbVerificationCenterGoodsBo implements Serializable { public class VtbFundFlowBo implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ -33,6 +33,7 @@ public class VtbVerificationCenterGoodsBo implements Serializable {
private Long verificationId; private Long verificationId;
/** 核销状态 */ /** 核销状态 */
@NotNull(message = "核销状态不能为空")
private Integer verificationState; private Integer verificationState;
/** 成本明细编码 */ /** 成本明细编码 */
@ -49,59 +50,47 @@ public class VtbVerificationCenterGoodsBo implements Serializable {
private Long activityId; private Long activityId;
/** 科目id */ /** 科目id */
@NotNull(message = "科目id不能为空")
private Long subjectId; private Long subjectId;
/** 科目编码 */ /** 科目编码 */
@NotBlank(message = "科目编码不能为空")
@Length(max = 50,message = "科目编码长度不能超过50字") @Length(max = 50,message = "科目编码长度不能超过50字")
private String subjectCode; private String subjectCode;
/** 科目名称 */ /** 科目名称 */
@NotBlank(message = "科目名称不能为空")
@Length(max = 50,message = "科目名称长度不能超过50字") @Length(max = 50,message = "科目名称长度不能超过50字")
private String subjectName; private String subjectName;
/** 成本中心类型 */ /** 成本中心类型 */
@NotBlank(message = "成本中心类型不能为空")
@Length(max = 50,message = "成本中心类型长度不能超过50字") @Length(max = 50,message = "成本中心类型长度不能超过50字")
private String centerType; private String centerType;
/** 成本中心id */ /** 成本中心id */
@NotBlank(message = "成本中心id不能为空")
@Length(max = 32,message = "成本中心id长度不能超过32字") @Length(max = 32,message = "成本中心id长度不能超过32字")
private String centerId; private String centerId;
/** 成本中心编码 */ /** 成本中心编码 */
@NotBlank(message = "成本中心编码不能为空")
@Length(max = 50,message = "成本中心编码长度不能超过50字") @Length(max = 50,message = "成本中心编码长度不能超过50字")
private String centerCode; private String centerCode;
/** 成本中心名称 */ /** 成本中心名称 */
@NotBlank(message = "成本中心名称不能为空")
@Length(max = 50,message = "成本中心名称长度不能超过50字") @Length(max = 50,message = "成本中心名称长度不能超过50字")
private String centerName; private String centerName;
/** 已用费用 */ /** 已用费用 */
@NotNull(message = "已用费用不能为空")
private BigDecimal usedAmount; private BigDecimal usedAmount;
/** 目标类型(brand、category、series、spu、sku) */ /** 目标类型(brand、category、series、spu、sku) */
@NotBlank(message = "目标类型(brand、category、series、spu、sku)不能为空")
@Length(max = 30,message = "目标类型(brand、category、series、spu、sku)长度不能超过30字") @Length(max = 30,message = "目标类型(brand、category、series、spu、sku)长度不能超过30字")
private String targetType; private String targetType;
/** 目标id */ /** 目标id */
@NotNull(message = "目标id不能为空")
private Long targetId; private Long targetId;
/** 目标编码 */ /** 目标编码 */
@NotBlank(message = "目标编码不能为空")
@Length(max = 30,message = "目标编码长度不能超过30字") @Length(max = 30,message = "目标编码长度不能超过30字")
private String targetCode; private String targetCode;
/** 目标名称 */ /** 目标名称 */
@NotBlank(message = "目标名称不能为空")
@Length(max = 30,message = "目标名称长度不能超过30字") @Length(max = 30,message = "目标名称长度不能超过30字")
private String targetName; private String targetName;

8
src/main/java/com/qs/serve/modules/vtb/entity/so/VtbVerificationCenterGoodsSo.java → src/main/java/com/qs/serve/modules/vtb/entity/so/VtbFundFlowSo.java

@ -16,12 +16,12 @@ import javax.validation.constraints.NotNull;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
/** /**
* 核销费用项 查询参数 * 核销流水 查询参数
* @author YenHex * @author YenHex
* @since 2022-11-24 * @since 2022-11-25
*/ */
@Data @Data
public class VtbVerificationCenterGoodsSo implements Serializable { public class VtbFundFlowSo implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ -32,7 +32,7 @@ public class VtbVerificationCenterGoodsSo implements Serializable {
private Long verificationId; private Long verificationId;
/** 核销状态 */ /** 核销状态 */
private Integer verficarionState; private Integer verificationState;
/** 成本明细编码 */ /** 成本明细编码 */
private String centerGoodsCode; private String centerGoodsCode;

14
src/main/java/com/qs/serve/modules/vtb/mapper/VtbFundFlowMapper.java

@ -0,0 +1,14 @@
package com.qs.serve.modules.vtb.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qs.serve.modules.vtb.entity.VtbFundFlow;
/**
* 核销流水 Mapper
* @author YenHex
* @date 2022-11-25
*/
public interface VtbFundFlowMapper extends BaseMapper<VtbFundFlow> {
}

14
src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationCenterGoodsMapper.java

@ -1,14 +0,0 @@
package com.qs.serve.modules.vtb.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qs.serve.modules.vtb.entity.VtbVerificationCenterGoods;
/**
* 核销费用项 Mapper
* @author YenHex
* @date 2022-11-24
*/
public interface VtbVerificationCenterGoodsMapper extends BaseMapper<VtbVerificationCenterGoods> {
}

37
src/main/java/com/qs/serve/modules/vtb/service/VtbFundFlowService.java

@ -0,0 +1,37 @@
package com.qs.serve.modules.vtb.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qs.serve.modules.vtb.entity.VtbFundFlow;
import java.util.List;
/**
* 核销流水 服务接口
* @author YenHex
* @date 2022-11-25
*/
public interface VtbFundFlowService extends IService<VtbFundFlow> {
/**
* 获取相关活动列表
* @param activityId 不能空
* @param fundTypes 可空
* @return
*/
List<VtbFundFlow> listByActivity(Long activityId,String... fundTypes);
/**
* 判断释放
* @param activityId
* @return
*/
boolean hasRelease(Long activityId);
/**
* 刷新活动金额
* @param activityId
*/
void flushActivityAmount(Long activityId);
}

14
src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationCenterGoodsService.java

@ -1,14 +0,0 @@
package com.qs.serve.modules.vtb.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qs.serve.modules.vtb.entity.VtbVerificationCenterGoods;
/**
* 核销费用项 服务接口
* @author YenHex
* @date 2022-11-24
*/
public interface VtbVerificationCenterGoodsService extends IService<VtbVerificationCenterGoods> {
}

2
src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationChannelPointService.java

@ -9,6 +9,6 @@ import com.qs.serve.modules.vtb.entity.VtbVerificationChannelPoint;
* @date 2022-11-24 * @date 2022-11-24
*/ */
public interface VtbVerificationChannelPointService extends IService<VtbVerificationChannelPoint> { public interface VtbVerificationChannelPointService extends IService<VtbVerificationChannelPoint> {
void removeByVerificationId(Long verificationId);
} }

2
src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationChannelService.java

@ -9,6 +9,6 @@ import com.qs.serve.modules.vtb.entity.VtbVerificationChannel;
* @date 2022-11-24 * @date 2022-11-24
*/ */
public interface VtbVerificationChannelService extends IService<VtbVerificationChannel> { public interface VtbVerificationChannelService extends IService<VtbVerificationChannel> {
void removeByVerificationId(Long verificationId);
} }

13
src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationService.java

@ -17,5 +17,18 @@ public interface VtbVerificationService extends IService<VtbVerification> {
*/ */
void commit(VtbVerificationBo vtbVerificationBo); void commit(VtbVerificationBo vtbVerificationBo);
/**
* 审核通过回调
* @param verificationId
*/
void successCommit(Long verificationId);
/**
* 检测释放正在核销
* @param activityId
* @return
*/
boolean checkCommitting(Long activityId);
} }

6
src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationSubjectService.java

@ -3,6 +3,8 @@ package com.qs.serve.modules.vtb.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.qs.serve.modules.vtb.entity.VtbVerificationSubject; import com.qs.serve.modules.vtb.entity.VtbVerificationSubject;
import java.util.List;
/** /**
* 核销科目费用 服务接口 * 核销科目费用 服务接口
* @author YenHex * @author YenHex
@ -10,5 +12,9 @@ import com.qs.serve.modules.vtb.entity.VtbVerificationSubject;
*/ */
public interface VtbVerificationSubjectService extends IService<VtbVerificationSubject> { public interface VtbVerificationSubjectService extends IService<VtbVerificationSubject> {
List<VtbVerificationSubject> listByVerificationId(Long verificationId);
void removeByVerificationId(Long verificationId);
} }

139
src/main/java/com/qs/serve/modules/vtb/service/impl/VtbFundFlowServiceImpl.java

@ -0,0 +1,139 @@
package com.qs.serve.modules.vtb.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qs.serve.common.util.CollectionUtil;
import com.qs.serve.modules.tbs.entity.TbsActivity;
import com.qs.serve.modules.tbs.entity.TbsActivityCenter;
import com.qs.serve.modules.tbs.entity.TbsActivityCenterGoods;
import com.qs.serve.modules.tbs.entity.TbsActivitySubject;
import com.qs.serve.modules.tbs.service.*;
import com.qs.serve.modules.vtb.common.VtbFundFlowType;
import com.qs.serve.modules.vtb.entity.VtbVerificationSubject;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import com.qs.serve.modules.vtb.entity.VtbFundFlow;
import com.qs.serve.modules.vtb.service.VtbFundFlowService;
import com.qs.serve.modules.vtb.mapper.VtbFundFlowMapper;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 核销流水 服务实现类
* @author YenHex
* @since 2022-11-25
*/
@Slf4j
@Service
@AllArgsConstructor
public class VtbFundFlowServiceImpl extends ServiceImpl<VtbFundFlowMapper,VtbFundFlow> implements VtbFundFlowService {
private final TbsActivityService activityService;
private final TbsActivitySubjectService activitySubjectService;
private final TbsActivityCenterService activityCenterService;
private final TbsActivityCenterGoodsService activityCenterGoodsService;
@Override
public List<VtbFundFlow> listByActivity(Long activityId,String... fundTypes) {
LambdaQueryWrapper<VtbFundFlow> lqw = new LambdaQueryWrapper<>();
lqw.eq(VtbFundFlow::getActivityId,activityId);
if(CollectionUtil.isNotEmpty(fundTypes)){
lqw.in(VtbFundFlow::getFundType, Arrays.asList(fundTypes));
}
return this.list(lqw);
}
@Override
public boolean hasRelease(Long activityId) {
LambdaQueryWrapper<VtbFundFlow> lqw = new LambdaQueryWrapper<>();
lqw.eq(VtbFundFlow::getActivityId,activityId);
lqw.eq(VtbFundFlow::getFundType, VtbFundFlowType.Release);
return this.count(lqw)>0L;
}
@Override
public void flushActivityAmount(Long activityId) {
List<VtbFundFlow> allFunFlow = this.listByActivity(activityId);
List<TbsActivitySubject> activitySubjectList = activitySubjectService.listByActivityId(activityId);
List<TbsActivityCenter> activityCenterList = activityCenterService.listByActivity(activityId);
List<TbsActivityCenterGoods> activityCenterGoodsList = activityCenterGoodsService.listByActivityId(activityId);
//总使用额
BigDecimal activityUsedAmount = BigDecimal.ZERO;
for (VtbFundFlow fundFlow : allFunFlow) {
activityUsedAmount = activityUsedAmount.add(fundFlow.getUsedAmount());
}
TbsActivity activity = new TbsActivity();
activity.setId(activityId);
activity.setUsedAmount(activityUsedAmount);
activityService.updateById(activity);
//更新其它明细
Map<Long,List<VtbFundFlow>> fundFlowMapBySubject = allFunFlow.stream().collect(Collectors.groupingBy(VtbFundFlow::getSubjectId));
for (Long subjectId : fundFlowMapBySubject.keySet()) {
List<VtbFundFlow> fundFlowList = fundFlowMapBySubject.get(subjectId);
if(fundFlowList != null){
//更新科目
BigDecimal subjectTotal = BigDecimal.ZERO;
for (VtbFundFlow fundFlow : fundFlowList) {
subjectTotal = subjectTotal.add(fundFlow.getUsedAmount());
}
TbsActivitySubject currActivitySubject = null;
for (TbsActivitySubject activitySubject : activitySubjectList) {
if(activitySubject.getSubjectId().equals(subjectId)){
currActivitySubject = activitySubject;
}
}
TbsActivitySubject activitySubject = new TbsActivitySubject();
activitySubject.setId(currActivitySubject.getId());
activitySubject.setUsedAmount(subjectTotal);
this.activitySubjectService.updateById(activitySubject);
//更新成本中心
Map<String,List<VtbFundFlow>> fundFlowMapByCenter = fundFlowList.stream().collect(Collectors.groupingBy(VtbFundFlow::getCenterId));
for (String centerId : fundFlowMapByCenter.keySet()) {
List<VtbFundFlow> centerFundFlowList = fundFlowMapByCenter.get(centerId);
if(centerFundFlowList==null){
continue;
}
BigDecimal totalCenterAmount = BigDecimal.ZERO;
for (VtbFundFlow fundFlow : centerFundFlowList) {
totalCenterAmount = totalCenterAmount.add(fundFlow.getUsedAmount());
}
for (TbsActivityCenter activityCenter : activityCenterList) {
if(activityCenter.getSubjectId().equals(subjectId)&&activityCenter.getCenterId().equals(centerId)){
TbsActivityCenter centerParam = new TbsActivityCenter();
centerParam.setId(activityCenter.getId());
centerParam.setUsedAmount(totalCenterAmount);
this.activityCenterService.updateById(centerParam);
}
}
//更新成本中心的商品项
List<TbsActivityCenterGoods> updateCenterGoodsList = new ArrayList<>();
for (TbsActivityCenterGoods centerGoods : activityCenterGoodsList) {
BigDecimal goodsAmount = BigDecimal.ZERO;
for (VtbFundFlow fundFlow : centerFundFlowList) {
if(fundFlow.getTargetType().equals(centerGoods.getTargetType())&&fundFlow.getTargetId().equals(centerGoods.getTargetId())){
goodsAmount = goodsAmount.add(fundFlow.getUsedAmount());
}
}
if(goodsAmount.compareTo(BigDecimal.ZERO)>0){
TbsActivityCenterGoods centerGoodsParam = new TbsActivityCenterGoods();
centerGoodsParam.setId(centerGoods.getId());
centerGoodsParam.setUsedAmount(goodsAmount);
updateCenterGoodsList.add(centerGoodsParam);
}
}
if(CollectionUtil.isNotEmpty(updateCenterGoodsList)){
activityCenterGoodsService.updateBatchById(updateCenterGoodsList);
}
}
}
}
}
}

22
src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationCenterGoodsServiceImpl.java

@ -1,22 +0,0 @@
package com.qs.serve.modules.vtb.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import com.qs.serve.modules.vtb.entity.VtbVerificationCenterGoods;
import com.qs.serve.modules.vtb.service.VtbVerificationCenterGoodsService;
import com.qs.serve.modules.vtb.mapper.VtbVerificationCenterGoodsMapper;
/**
* 核销费用项 服务实现类
* @author YenHex
* @since 2022-11-24
*/
@Slf4j
@Service
@AllArgsConstructor
public class VtbVerificationCenterGoodsServiceImpl extends ServiceImpl<VtbVerificationCenterGoodsMapper,VtbVerificationCenterGoods> implements VtbVerificationCenterGoodsService {
}

10
src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationChannelPointServiceImpl.java

@ -1,6 +1,9 @@
package com.qs.serve.modules.vtb.service.impl; package com.qs.serve.modules.vtb.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qs.serve.modules.vtb.entity.VtbVerificationChannel;
import com.qs.serve.modules.vtb.entity.VtbVerificationSubject;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -17,6 +20,11 @@ import com.qs.serve.modules.vtb.mapper.VtbVerificationChannelPointMapper;
@Service @Service
@AllArgsConstructor @AllArgsConstructor
public class VtbVerificationChannelPointServiceImpl extends ServiceImpl<VtbVerificationChannelPointMapper,VtbVerificationChannelPoint> implements VtbVerificationChannelPointService { public class VtbVerificationChannelPointServiceImpl extends ServiceImpl<VtbVerificationChannelPointMapper,VtbVerificationChannelPoint> implements VtbVerificationChannelPointService {
@Override
public void removeByVerificationId(Long verificationId) {
LambdaQueryWrapper<VtbVerificationChannelPoint> lqw = new LambdaQueryWrapper<>();
lqw.eq(VtbVerificationChannelPoint::getVerificationId,verificationId);
this.remove(lqw);
}
} }

8
src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationChannelServiceImpl.java

@ -1,6 +1,8 @@
package com.qs.serve.modules.vtb.service.impl; package com.qs.serve.modules.vtb.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qs.serve.modules.vtb.entity.VtbVerificationSubject;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -18,5 +20,11 @@ import com.qs.serve.modules.vtb.mapper.VtbVerificationChannelMapper;
@AllArgsConstructor @AllArgsConstructor
public class VtbVerificationChannelServiceImpl extends ServiceImpl<VtbVerificationChannelMapper,VtbVerificationChannel> implements VtbVerificationChannelService { public class VtbVerificationChannelServiceImpl extends ServiceImpl<VtbVerificationChannelMapper,VtbVerificationChannel> implements VtbVerificationChannelService {
@Override
public void removeByVerificationId(Long verificationId) {
LambdaQueryWrapper<VtbVerificationChannel> lqw = new LambdaQueryWrapper<>();
lqw.eq(VtbVerificationChannel::getVerificationId,verificationId);
this.remove(lqw);
}
} }

209
src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java

@ -1,26 +1,34 @@
package com.qs.serve.modules.vtb.service.impl; package com.qs.serve.modules.vtb.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.CollectionUtil;
import com.qs.serve.common.util.CopierUtil;
import com.qs.serve.modules.bms.entity.BmsSubject; import com.qs.serve.modules.bms.entity.BmsSubject;
import com.qs.serve.modules.bms.service.BmsSubjectService; import com.qs.serve.modules.bms.service.BmsSubjectService;
import com.qs.serve.modules.tbs.entity.TbsActivity; import com.qs.serve.modules.tbs.entity.*;
import com.qs.serve.modules.tbs.entity.TbsCostApply; import com.qs.serve.modules.tbs.service.*;
import com.qs.serve.modules.tbs.service.TbsActivityService; import com.qs.serve.modules.vtb.common.VtbFundFlowType;
import com.qs.serve.modules.tbs.service.TbsCostApplyService; import com.qs.serve.modules.vtb.common.VtbVerificationState;
import com.qs.serve.modules.vtb.entity.VtbFundFlow;
import com.qs.serve.modules.vtb.entity.VtbVerification;
import com.qs.serve.modules.vtb.entity.VtbVerificationSubject; import com.qs.serve.modules.vtb.entity.VtbVerificationSubject;
import com.qs.serve.modules.vtb.entity.bo.VtbVerificationBo; import com.qs.serve.modules.vtb.entity.bo.VtbVerificationBo;
import com.qs.serve.modules.vtb.entity.bo.VtbVerificationChannelBo; import com.qs.serve.modules.vtb.entity.bo.VtbVerificationChannelBo;
import com.qs.serve.modules.vtb.entity.bo.VtbVerificationChannelPointBo; import com.qs.serve.modules.vtb.entity.bo.VtbVerificationChannelPointBo;
import com.qs.serve.modules.vtb.entity.bo.VtbVerificationSubjectBo; import com.qs.serve.modules.vtb.entity.bo.VtbVerificationSubjectBo;
import com.qs.serve.modules.vtb.mapper.VtbVerificationMapper;
import com.qs.serve.modules.vtb.service.*;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.qs.serve.modules.vtb.entity.VtbVerification; import org.springframework.transaction.annotation.Transactional;
import com.qs.serve.modules.vtb.service.VtbVerificationService;
import com.qs.serve.modules.vtb.mapper.VtbVerificationMapper;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List; import java.math.RoundingMode;
import java.util.*;
import java.util.stream.Collectors;
/** /**
* 核销 服务实现类 * 核销 服务实现类
@ -32,36 +40,100 @@ import java.util.List;
@AllArgsConstructor @AllArgsConstructor
public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMapper,VtbVerification> implements VtbVerificationService { public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMapper,VtbVerification> implements VtbVerificationService {
private final TbsActivityService activityService;
private final TbsCostApplyService costApplyService; private final TbsCostApplyService costApplyService;
private final TbsActivityService activityService;
private final TbsActivitySubjectService activitySubjectService;
private final TbsActivityCenterService activityCenterService;
private final TbsActivityCenterGoodsService activityCenterGoodsService;
private final BmsSubjectService subjectService; private final BmsSubjectService subjectService;
private final VtbVerificationChannelService verificationChannelService;
private final VtbVerificationChannelPointService verificationChannelPointService;
private final VtbVerificationSubjectService verificationSubjectService;
private final VtbFundFlowService fundFlowService;
@Override @Override
@Transactional(rollbackFor = Exception.class)
public void commit(VtbVerificationBo verificationBo) { public void commit(VtbVerificationBo verificationBo) {
TbsActivity activity = activityService.getById(verificationBo.getActivityId()); TbsActivity activity = activityService.getById(verificationBo.getActivityId());
TbsCostApply costApply = costApplyService.getById(activity.getCostApplyId()); TbsCostApply costApply = costApplyService.getById(activity.getCostApplyId());
//todo 检测是否有拦截 //todo 结束的活动不支持核销
boolean hasRelease = fundFlowService.hasRelease(activity.getId());
if(hasRelease){
Assert.throwEx("费用已释放");
}
boolean isCommitting = this.checkCommitting(activity.getId());
if(isCommitting){
Assert.throwEx("该活动核销中");
}
VtbVerification verification = new VtbVerification(); VtbVerification verification = new VtbVerification();
verification.setId(verification.getId()); verification.setId(verificationBo.getId());
verification.setActivityId(verificationBo.getActivityId()); verification.setActivityId(verificationBo.getActivityId());
verification.setAttachIds(verificationBo.getAttachIds()); verification.setAttachIds(verificationBo.getAttachIds());
verification.setRemark(verificationBo.getRemark()); verification.setRemark(verificationBo.getRemark());
this.saveOrUpdate(verification);
List<VtbVerificationChannelBo> channelBoList = verificationBo.getChannelList(); List<VtbVerificationChannelBo> channelBoList = verificationBo.getChannelList();
List<VtbVerificationChannelPointBo> pointBoList = verificationBo.getPointList(); List<VtbVerificationChannelPointBo> pointBoList = verificationBo.getPointList();
if(CollectionUtil.isNotEmpty(channelBoList)){
}else if (CollectionUtil.isNotEmpty(pointBoList)){
}
List<VtbVerificationSubject> verificationSubjects = validCreateVeriSubject(verificationBo, activity, costApply);
//保存
this.saveOrUpdate(verification);
//移除历史提交记录
if(verificationBo.getId()!=null){
verificationChannelService.removeByVerificationId(verificationBo.getId());
verificationChannelPointService.removeByVerificationId(verificationBo.getId());
verificationSubjectService.removeByVerificationId(verificationBo.getId());
}
//保存科目费用
verificationSubjects.forEach(obj->obj.setVerificationId(verification.getId()));
verificationSubjectService.saveBatch(verificationSubjects);
}
/**
* 校验和生成核销费用
* @param verificationBo
* @param activity
* @param costApply
* @return
*/
private List<VtbVerificationSubject> validCreateVeriSubject(VtbVerificationBo verificationBo, TbsActivity activity, TbsCostApply costApply) {
List<VtbVerificationSubject> verificationSubjects = new ArrayList<>();
List<TbsActivitySubject> activitySubjects = activitySubjectService.listByActivityId(activity.getId());
List<VtbFundFlow> existFundFlowList = fundFlowService.listByActivity(activity.getId(), VtbFundFlowType.Verification);
//校验余额
Map<Long,List<VtbFundFlow>> funFlowListMap = existFundFlowList.stream().collect(Collectors.groupingBy(VtbFundFlow::getSubjectId));
List<VtbVerificationSubjectBo> subjectBoList = verificationBo.getSubjectList(); List<VtbVerificationSubjectBo> subjectBoList = verificationBo.getSubjectList();
for (VtbVerificationSubjectBo subjectBo : subjectBoList) { for (VtbVerificationSubjectBo subjectBo : subjectBoList) {
//忽略金额为0的数据 //忽略金额为0的数据
if(subjectBo.getAmount()==null||subjectBo.getAmount().compareTo(BigDecimal.ZERO)<1){ if (subjectBo.getAmount() == null || subjectBo.getAmount().compareTo(BigDecimal.ZERO) < 1) {
continue; continue;
} }
BmsSubject subject = subjectService.getById(subjectBo.getSubjectId()); BmsSubject subject = subjectService.getById(subjectBo.getSubjectId());
//判断是否超额
TbsActivitySubject currentActivitySubject = null;
for (TbsActivitySubject activitySubject : activitySubjects) {
if (activitySubject.getSubjectId().equals(subject.getId())) {
currentActivitySubject = activitySubject;
break;
}
}
List<VtbFundFlow> subjectFundFlowItems = funFlowListMap.get(subject.getId());
BigDecimal totalSubjectUsedAmount = BigDecimal.ZERO;
if (CollectionUtil.isNotEmpty(subjectFundFlowItems)) {
for (VtbFundFlow subjectFundFlowItem : subjectFundFlowItems) {
totalSubjectUsedAmount = totalSubjectUsedAmount.add(subjectFundFlowItem.getUsedAmount());
}
}
totalSubjectUsedAmount = totalSubjectUsedAmount.add(subjectBo.getAmount());
if (totalSubjectUsedAmount.compareTo(currentActivitySubject.getAmount()) > 0) {
Assert.throwEx("费用类型[" + subject.getSubjectName() + "]超额");
}
//保存费用结果
VtbVerificationSubject verificationSubject = new VtbVerificationSubject(); VtbVerificationSubject verificationSubject = new VtbVerificationSubject();
verificationSubject.setVerificationId(verification.getId());
verificationSubject.setCostApplyId(costApply.getId()); verificationSubject.setCostApplyId(costApply.getId());
verificationSubject.setActivityId(activity.getId()); verificationSubject.setActivityId(activity.getId());
verificationSubject.setSubjectId(subject.getId()); verificationSubject.setSubjectId(subject.getId());
@ -71,11 +143,110 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe
verificationSubject.setCountPerson(subjectBo.getCountPerson()); verificationSubject.setCountPerson(subjectBo.getCountPerson());
verificationSubject.setCountSession(subjectBo.getCountSession()); verificationSubject.setCountSession(subjectBo.getCountSession());
verificationSubject.setRemark(subjectBo.getRemark()); verificationSubject.setRemark(subjectBo.getRemark());
verificationSubjects.add(verificationSubject);
}
return verificationSubjects;
}
// @Override
@Transactional(rollbackFor = Exception.class)
public void successCommit(Long verificationId) {
log.info("活动核销提交成功。verificationId:{}",verificationId);
VtbVerification verification = this.getById(verificationId);
List<VtbVerificationSubject> verificationSubjects = verificationSubjectService.listByVerificationId(verification.getId());
List<TbsActivityCenterGoods> activityCenterGoodsAllList = activityCenterGoodsService.listByActivityId(verification.getActivityId());
List<VtbFundFlow> addFundFlowList = new ArrayList<>();
//生成费用流水记录
Map<Long,List<TbsActivityCenterGoods>> centerGoodsMapBySubject = activityCenterGoodsAllList.stream()
.collect(Collectors.groupingBy(TbsActivityCenterGoods::getSubjectId));
for (VtbVerificationSubject verificationSubject : verificationSubjects) {
List<VtbFundFlow> addFundFlowListOfSubject = new ArrayList<>();
Long subjectId = verificationSubject.getSubjectId();
BigDecimal usedAmount = verificationSubject.getUsedAmount();
BigDecimal subtractAmount = verificationSubject.getUsedAmount();
List<TbsActivityCenterGoods> activityCenterGoodsOfSubject = centerGoodsMapBySubject.get(subjectId);
//统计前面项合计金额
BigDecimal totalPrefixAmount = BigDecimal.ZERO;
//统计不匹配金额
BigDecimal unMatchAmount = BigDecimal.ZERO;
for (int i = 0; i < activityCenterGoodsOfSubject.size(); i++) {
TbsActivityCenterGoods centerGoods = activityCenterGoodsOfSubject.get(i);
BigDecimal currentTimeAmount;
if(i==activityCenterGoodsOfSubject.size()-1){
currentTimeAmount = usedAmount.subtract(totalPrefixAmount);
}else {
currentTimeAmount = usedAmount.multiply(centerGoods.getCenterGoodsRate())
.multiply(centerGoods.getCenterRate())
//四舍五入保留两位小数
.divide(new BigDecimal(10000), RoundingMode.HALF_UP).setScale(2);
//防止费率为0情况
if(currentTimeAmount.compareTo(BigDecimal.ZERO)==0){
continue;
}
}
//可用金额
BigDecimal allowBalance = centerGoods.getCenterGoodsAmount().subtract(centerGoods.getUsedAmount());
if(allowBalance.compareTo(BigDecimal.ZERO)==0){
log.debug("统计不匹配金额allowBalance:{},currentTimeAmount:{}",allowBalance.doubleValue(),currentTimeAmount.doubleValue());
unMatchAmount.add(currentTimeAmount);
continue;
}
BigDecimal tempBalance = BigDecimal.ZERO;
//如果不够减
if(allowBalance.compareTo(currentTimeAmount)<1){
//统计不匹配金额
unMatchAmount = unMatchAmount.add(currentTimeAmount.subtract(allowBalance));
log.debug("统计不匹配金额allowBalance:{},currentTimeAmount:{}",allowBalance.doubleValue(),currentTimeAmount.doubleValue());
currentTimeAmount = allowBalance;
}else {
tempBalance = allowBalance.subtract(currentTimeAmount);
}
VtbFundFlow fundFlow = CopierUtil.copy(centerGoods,new VtbFundFlow());
fundFlow.setId(null);
fundFlow.setUsedAmount(currentTimeAmount);
fundFlow.setFundType(VtbFundFlowType.Release);
fundFlow.setVerificationId(verificationId);
fundFlow.setTempBalance(tempBalance);
addFundFlowListOfSubject.add(fundFlow);
}
//todo 1400元 44次 33行
//打乱顺序,保存前平摊费用
Collections.shuffle(addFundFlowListOfSubject);
for (VtbFundFlow fundFlow : addFundFlowListOfSubject) {
if(unMatchAmount.compareTo(BigDecimal.ZERO)>0){
BigDecimal tmpBalance = fundFlow.getTempBalance();
if(tmpBalance.compareTo(BigDecimal.ZERO)>0){
if(tmpBalance.compareTo(unMatchAmount)>0){
BigDecimal resultBalance = fundFlow.getUsedAmount().add(unMatchAmount);
fundFlow.setUsedAmount(resultBalance);
break;
}else {
unMatchAmount = unMatchAmount.subtract(fundFlow.getTempBalance());
BigDecimal resultBalance = fundFlow.getUsedAmount().add(tmpBalance);
fundFlow.setUsedAmount(resultBalance);
}
}
}else {
break;
}
}
if(unMatchAmount.compareTo(BigDecimal.ZERO)>0){
log.error("异常数据,费用核销[{}]超额:{}",verificationId,unMatchAmount.doubleValue());
}
addFundFlowList.addAll(addFundFlowListOfSubject);
} }
fundFlowService.saveBatch(addFundFlowList);
//更新已用费用记录
fundFlowService.flushActivityAmount(verification.getActivityId());
} }
@Override
public boolean checkCommitting(Long activityId) {
LambdaQueryWrapper<VtbVerification> lqw = new LambdaQueryWrapper<>();
lqw.eq(VtbVerification::getActivityId,activityId);
lqw.eq(VtbVerification::getVerificationState, VtbVerificationState.Commit.getCode());
return this.count(lqw)>0;
}
} }

17
src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationSubjectServiceImpl.java

@ -1,5 +1,6 @@
package com.qs.serve.modules.vtb.service.impl; package com.qs.serve.modules.vtb.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -8,6 +9,8 @@ import com.qs.serve.modules.vtb.entity.VtbVerificationSubject;
import com.qs.serve.modules.vtb.service.VtbVerificationSubjectService; import com.qs.serve.modules.vtb.service.VtbVerificationSubjectService;
import com.qs.serve.modules.vtb.mapper.VtbVerificationSubjectMapper; import com.qs.serve.modules.vtb.mapper.VtbVerificationSubjectMapper;
import java.util.List;
/** /**
* 核销科目费用 服务实现类 * 核销科目费用 服务实现类
* @author YenHex * @author YenHex
@ -18,5 +21,19 @@ import com.qs.serve.modules.vtb.mapper.VtbVerificationSubjectMapper;
@AllArgsConstructor @AllArgsConstructor
public class VtbVerificationSubjectServiceImpl extends ServiceImpl<VtbVerificationSubjectMapper,VtbVerificationSubject> implements VtbVerificationSubjectService { public class VtbVerificationSubjectServiceImpl extends ServiceImpl<VtbVerificationSubjectMapper,VtbVerificationSubject> implements VtbVerificationSubjectService {
@Override
public List<VtbVerificationSubject> listByVerificationId(Long verificationId) {
LambdaQueryWrapper<VtbVerificationSubject> lqw = new LambdaQueryWrapper<>();
lqw.eq(VtbVerificationSubject::getVerificationId,verificationId);
return this.list(lqw);
}
@Override
public void removeByVerificationId(Long verificationId) {
LambdaQueryWrapper<VtbVerificationSubject> lqw = new LambdaQueryWrapper<>();
lqw.eq(VtbVerificationSubject::getVerificationId,verificationId);
this.remove(lqw);
}
} }

Loading…
Cancel
Save