Browse Source

feat(rebate): 自动返利规则

master
Yen 2 months ago
parent
commit
37e2fa0430
  1. 15
      cms-common/src/main/java/com/qs/serve/common/exception/UnifiedExceptionHandler.java
  2. 72
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController2.java
  3. 5
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsCostApply.java
  4. 6
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityMapper.java
  5. 5
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityService.java
  6. 14
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplication4CostServiceImpl.java
  7. 7
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/controller/VtbVerificationController.java
  8. 4
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationBatch.java
  9. 29
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/event/VtbRebateAutoEvent.java
  10. 29
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/listener/VtbRebateAutoEventListener.java
  11. 2
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationService.java
  12. 4
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java
  13. 19
      cms-modules/cms-system/src/main/resources/mapper/bir/TbsActivityMapper.xml

15
cms-common/src/main/java/com/qs/serve/common/exception/UnifiedExceptionHandler.java

@ -41,19 +41,8 @@ public class UnifiedExceptionHandler {
return new R(e.getCode(),e.getMessage()); return new R(e.getCode(),e.getMessage());
} }
@ExceptionHandler(value = NullPointerException.class)
@ResponseBody
public R handleBindException(NullPointerException e,HttpServletRequest request) {
StringBuilder stringBuilder = new StringBuilder();
for (StackTraceElement element : e.getStackTrace()) {
if (element.getClassName().contains("qs")){
stringBuilder.append(element.getClassName()+":"+element.getLineNumber()+"\n");
}
}
log.error("\n空指针:{} \n{}",request.getRequestURI(),stringBuilder);
e.printStackTrace();
return R.error("数据不存在或被移除");
}
// @ExceptionHandler({ // @ExceptionHandler({
// AccessDeniedException.class // AccessDeniedException.class

72
cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController2.java

@ -14,12 +14,20 @@ import com.qs.serve.modules.erp.entity.vo.ErpDispatchSumPmsVo;
import com.qs.serve.modules.erp.entity.vo.SubjectDispatchSumVo; import com.qs.serve.modules.erp.entity.vo.SubjectDispatchSumVo;
import com.qs.serve.modules.erp.mapper.ErpDispatchDataMapper; import com.qs.serve.modules.erp.mapper.ErpDispatchDataMapper;
import com.qs.serve.modules.tbs.entity.*; import com.qs.serve.modules.tbs.entity.*;
import com.qs.serve.modules.tbs.mapper.TbsActivityMapper;
import com.qs.serve.modules.tbs.service.*; import com.qs.serve.modules.tbs.service.*;
import com.qs.serve.modules.tzc.entity.TzcRebatePeriod; import com.qs.serve.modules.tzc.entity.TzcRebatePeriod;
import com.qs.serve.modules.tzc.entity.dto.TzcRebateCalculateDTO;
import com.qs.serve.modules.tzc.service.TzcRebateApplication4VerificationService;
import com.qs.serve.modules.tzc.service.TzcRebatePeriodService; import com.qs.serve.modules.tzc.service.TzcRebatePeriodService;
import com.qs.serve.modules.vtb.entity.bo.VtbVerificationBo;
import com.qs.serve.modules.vtb.entity.bo.VtbVerificationSubjectBo;
import com.qs.serve.modules.vtb.entity.bo.VtbVerificationSubjectCommitBo;
import com.qs.serve.modules.vtb.event.VtbRebateAutoEvent;
import com.qs.serve.modules.vtb.service.VtbFundFlowService; import com.qs.serve.modules.vtb.service.VtbFundFlowService;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -49,6 +57,70 @@ public class TbsActivityController2 {
private final TbsActivitySubjectService tbsActivitySubjectService; private final TbsActivitySubjectService tbsActivitySubjectService;
private final ErpDispatchDataMapper erpDispatchDataMapper; private final ErpDispatchDataMapper erpDispatchDataMapper;
private final TzcRebatePeriodService tzcRebatePeriodService; private final TzcRebatePeriodService tzcRebatePeriodService;
private final TbsActivityMapper tbsActivityMapper;
private final TzcRebateApplication4VerificationService tzcRebateApplication4VerificationService;
private final ApplicationEventPublisher eventPublisher;
public void createAutoEvent(){
List<Long> rebateAutoActIds = tbsActivityMapper.listRebateAutoActIds();
for (Long actId : rebateAutoActIds) {
createAutoEvent(actId);
}
}
/**
* 创建返利自动核销事件
* @param activityId
*/
@GetMapping("/createRebateAutoEvent/{actId}")
public void createAutoEvent(@PathVariable("actId") Long activityId){
TbsActivity activity = tbsActivityService.getById(activityId);
TbsCostApply costApply = tbsCostApplyService.getById(activity.getCostApplyId());
// 通过周期查询发货金额
ErpDispatchSumPmsVo erpDispatchSumPmsVo = tbsActivityService.getDispatchSumByActivity(activity);
BigDecimal dispatchAmount = erpDispatchSumPmsVo.getTotalAmount();
// 此次核销金额
TzcRebateCalculateDTO calculateDTO = tzcRebateApplication4VerificationService.getActivityRebateAmount(activityId,dispatchAmount);
BigDecimal vtbAmt = calculateDTO.getTotalReturnAmt();
if (vtbAmt.compareTo(BigDecimal.ZERO)==0){
// 没有返利金额
return;
}
// 计算返利金额
VtbVerificationBo commitBo = new VtbVerificationBo();
commitBo.setActivityId(activityId);
commitBo.setAttachIds(null);
commitBo.setRemark("返利核销自动:"+calculateDTO.getDebugMsg());
commitBo.setChannelList(null);
commitBo.setPointList(null);
List<TbsActivitySubject> activitySubjects = tbsActivitySubjectService.listByActivityId(activityId);
List<VtbVerificationSubjectBo> subjectBoList = new ArrayList<>();
// 平均每个科目金额
BigDecimal avgAmt = vtbAmt.divide(BigDecimal.valueOf(activitySubjects.size()), 2,RoundingMode.DOWN);
// 剩余金额,计算最后一项金额
BigDecimal surplusAmt = vtbAmt;
for (int i = 0; i < activitySubjects.size(); i++) {
VtbVerificationSubjectBo subjectBo = new VtbVerificationSubjectBo();
subjectBo.setSubjectId(activitySubjects.get(i).getSubjectId());
subjectBo.setCountSession(0);
subjectBo.setCountPerson(0);
if (i==activitySubjects.size()-1){
subjectBo.setAmount(surplusAmt);
}else {
subjectBo.setAmount(avgAmt);
surplusAmt = surplusAmt.subtract(avgAmt);
}
}
commitBo.setSubjectList(subjectBoList);
commitBo.setPayConditionId(0L);
commitBo.setPayWayId(0L);
// 不释放
commitBo.setInputReleaseFlag(0);
eventPublisher.publishEvent(new VtbRebateAutoEvent(this, commitBo, costApply.getUserId()));
}
/** /**
* 获取返利年度的活动ID * 获取返利年度的活动ID

5
cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsCostApply.java

@ -246,6 +246,11 @@ public class TbsCostApply implements Serializable {
private Integer tmpState; private Integer tmpState;
/**
* 自动核销状态:0-无需自动核销1-需自动核销2-已自动核销
*/
private Integer autoCheckState;
@TableField(exist = false) @TableField(exist = false)
private String affairId; private String affairId;

6
cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityMapper.java

@ -16,6 +16,12 @@ import java.util.Map;
*/ */
public interface TbsActivityMapper extends BaseMapper<TbsActivity> { public interface TbsActivityMapper extends BaseMapper<TbsActivity> {
/**
* 获取所有返利自动核销的活动id
* @return
*/
List<Long> listRebateAutoActIds();
/** /**
* 获取系统配置的活动预计核销日期以活动结束时间后的第几天为预计核销日期 * 获取系统配置的活动预计核销日期以活动结束时间后的第几天为预计核销日期
* @return * @return

5
cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityService.java

@ -15,6 +15,11 @@ import java.util.List;
*/ */
public interface TbsActivityService extends IService<TbsActivity> { public interface TbsActivityService extends IService<TbsActivity> {
/**
* 获取客户的发货金额通过活动期间和平类加载
* @param activity
* @return
*/
ErpDispatchSumPmsVo getDispatchSumByActivity(TbsActivity activity); ErpDispatchSumPmsVo getDispatchSumByActivity(TbsActivity activity);
/** /**

14
cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplication4CostServiceImpl.java

@ -97,8 +97,18 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio
tbsActivitySubjectService.remove(delQw); tbsActivitySubjectService.remove(delQw);
} }
// 转化为费用申请 // 转化为费用申请
TbsCostApply costApply = new TbsCostApply(); TbsCostApply costApply = new TbsCostApply();
boolean needComp = false;
for (TzcRebatePeriod period : periodList) {
if (period.getCompensationFlag().equals(1)){
needComp = true;
break;
}
}
costApply.setAutoCheckState(needComp?rebate.getCheckModel():0);
costApply.setRebateId(rebateId); costApply.setRebateId(rebateId);
costApply.setCode(rebate.getRebateCode()); costApply.setCode(rebate.getRebateCode());
costApply.setTemplateId(rebate.getTemplateId()); costApply.setTemplateId(rebate.getTemplateId());
@ -523,7 +533,7 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio
if (currentArgument.getSumAddFlag().equals(0)){ if (currentArgument.getSumAddFlag().equals(0)){
BigDecimal rs = dispatchAmt.multiply(currentArgument.getReturnRate()) BigDecimal rs = dispatchAmt.multiply(currentArgument.getReturnRate())
.divide(BigDecimal.valueOf(100),2,RoundingMode.HALF_UP); .divide(BigDecimal.valueOf(100),2,RoundingMode.HALF_UP);
if (rs.compareTo(currentArgument.getMaxReturn())>0){ if (currentArgument.getMaxReturn()!=null && rs.compareTo(currentArgument.getMaxReturn())>0){
rs = currentArgument.getMaxReturn(); rs = currentArgument.getMaxReturn();
} }
rebateLevelsDTO.setReturnAmt(rs); rebateLevelsDTO.setReturnAmt(rs);
@ -536,7 +546,7 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio
if (rs.compareTo(BigDecimal.ZERO)>0){ if (rs.compareTo(BigDecimal.ZERO)>0){
rebateLevelsDTO.setDebugMsg("基于增量("+rs+") " + rebateLevelsDTO.setDebugMsg("基于增量("+rs+") " +
"= (发货金额["+dispatchAmt+"] - 同比发货金额["+sameDispatchAmt+"]) * 返利比例["+currentArgument.getReturnRate()+"%];最高返利"+currentArgument.getMaxReturn()); "= (发货金额["+dispatchAmt+"] - 同比发货金额["+sameDispatchAmt+"]) * 返利比例["+currentArgument.getReturnRate()+"%];最高返利"+currentArgument.getMaxReturn());
if (rs.compareTo(currentArgument.getMaxReturn())>0){ if (currentArgument.getMaxReturn()!=null && rs.compareTo(currentArgument.getMaxReturn())>0){
rs = currentArgument.getMaxReturn(); rs = currentArgument.getMaxReturn();
} }
rebateLevelsDTO.setReturnAmt(rs); rebateLevelsDTO.setReturnAmt(rs);

7
cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/controller/VtbVerificationController.java

@ -27,6 +27,7 @@ import com.qs.serve.modules.tbs.common.TbsSeeYonConst;
import com.qs.serve.modules.tbs.entity.*; import com.qs.serve.modules.tbs.entity.*;
import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo;
import com.qs.serve.modules.tbs.entity.vo.CtpAffairVo; import com.qs.serve.modules.tbs.entity.vo.CtpAffairVo;
import com.qs.serve.modules.tbs.mapper.TbsActivityMapper;
import com.qs.serve.modules.tbs.service.*; import com.qs.serve.modules.tbs.service.*;
import com.qs.serve.modules.vtb.common.VtbVerificationState; import com.qs.serve.modules.vtb.common.VtbVerificationState;
import com.qs.serve.modules.vtb.entity.*; import com.qs.serve.modules.vtb.entity.*;
@ -76,6 +77,7 @@ public class VtbVerificationController {
private VtbVerificationYardItemService vtbVerificationYardItemService; private VtbVerificationYardItemService vtbVerificationYardItemService;
private VtbVerificationOperationServiceImpl vtbVerificationOperationService; private VtbVerificationOperationServiceImpl vtbVerificationOperationService;
private VtbVerificationApplication2 vtbVerificationApplication2; private VtbVerificationApplication2 vtbVerificationApplication2;
private TbsActivityMapper tbsActivityMapper;
@GetMapping("/tryToAccessOa") @GetMapping("/tryToAccessOa")
public R<?> tryToAccessOa() { public R<?> tryToAccessOa() {
@ -250,7 +252,7 @@ public class VtbVerificationController {
public R<?> commit(@RequestBody @Valid VtbVerificationSubjectCommitBo commitBo){ public R<?> commit(@RequestBody @Valid VtbVerificationSubjectCommitBo commitBo){
seeYonService.testConnection(); seeYonService.testConnection();
VtbVerificationBo param = CopierUtil.copy(commitBo,new VtbVerificationBo()); VtbVerificationBo param = CopierUtil.copy(commitBo,new VtbVerificationBo());
vtbVerificationService.commit(param); vtbVerificationService.commit(param,AuthContextUtils.getSysUserId());
return R.ok(); return R.ok();
} }
@ -265,7 +267,7 @@ public class VtbVerificationController {
public R<?> commit(@RequestBody @Valid VtbVerificationCenterCommitBo commitBo){ public R<?> commit(@RequestBody @Valid VtbVerificationCenterCommitBo commitBo){
//seeYonService.testConnection(); //seeYonService.testConnection();
VtbVerificationBo param = CopierUtil.copy(commitBo,new VtbVerificationBo()); VtbVerificationBo param = CopierUtil.copy(commitBo,new VtbVerificationBo());
vtbVerificationService.commit(param); vtbVerificationService.commit(param,AuthContextUtils.getSysUserId());
return R.ok(); return R.ok();
} }
@ -525,5 +527,6 @@ public class VtbVerificationController {
return R.ok(); return R.ok();
} }
} }

4
cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationBatch.java

@ -158,6 +158,10 @@ public class VtbVerificationBatch implements Serializable {
private String wayTitle; private String wayTitle;
/**
* 自动核销状态:0-无需自动核销1-需自动核销
*/
private Integer autoCheckState;
/** 核销明细列表 */ /** 核销明细列表 */
@TableField(exist = false) @TableField(exist = false)

29
cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/event/VtbRebateAutoEvent.java

@ -0,0 +1,29 @@
package com.qs.serve.modules.vtb.event;
import com.qs.serve.modules.vtb.entity.bo.VtbVerificationBo;
import org.springframework.context.ApplicationEvent;
/**
* @author YenHex
* @since 2025/5/26
*/
public class VtbRebateAutoEvent extends ApplicationEvent {
private VtbVerificationBo verificationBo;
private String userId;
public VtbRebateAutoEvent(Object source, VtbVerificationBo verificationBo, String userId) {
super(source);
this.userId = userId;
this.verificationBo = verificationBo;
}
public VtbVerificationBo getVerificationBo() {
return verificationBo;
}
public String getUserId() {
return userId;
}
}

29
cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/listener/VtbRebateAutoEventListener.java

@ -0,0 +1,29 @@
package com.qs.serve.modules.vtb.listener;
import com.qs.serve.modules.sys.common.AuthContextUtils;
import com.qs.serve.modules.vtb.entity.bo.VtbVerificationBo;
import com.qs.serve.modules.vtb.event.VtbRebateAutoEvent;
import com.qs.serve.modules.vtb.service.VtbVerificationService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
/**
* @author YenHex
* @since 2025/5/26
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class VtbRebateAutoEventListener {
private final VtbVerificationService vtbVerificationService;
@EventListener
public void handleVtbRebateAutoEvent(VtbRebateAutoEvent event) {
VtbVerificationBo verificationBo = event.getVerificationBo();
vtbVerificationService.commit(verificationBo,event.getUserId());
}
}

2
cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationService.java

@ -70,7 +70,7 @@ public interface VtbVerificationService extends IService<VtbVerification> {
* 提交审批 * 提交审批
* @param vtbVerificationBo * @param vtbVerificationBo
*/ */
void commit(VtbVerificationBo vtbVerificationBo); void commit(VtbVerificationBo vtbVerificationBo,String userId);
/** /**

4
cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java

@ -731,10 +731,10 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void commit(VtbVerificationBo verificationBo) { public void commit(VtbVerificationBo verificationBo,String userId) {
TbsActivity activity = activityService.getById(verificationBo.getActivityId()); TbsActivity activity = activityService.getById(verificationBo.getActivityId());
TbsCostApply costApply = costApplyService.getById(activity.getCostApplyId()); TbsCostApply costApply = costApplyService.getById(activity.getCostApplyId());
SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); SysUser sysUser = sysUserService.getById(userId);
BmsSupplier supplier = bmsSupplierService.getById(activity.getSupplierId()); BmsSupplier supplier = bmsSupplierService.getById(activity.getSupplierId());
if(!costApply.getCreateBy().equals(sysUser.getId()) if(!costApply.getCreateBy().equals(sysUser.getId())
&&costApply.getExtUserId()!=null &&costApply.getExtUserId()!=null

19
cms-modules/cms-system/src/main/resources/mapper/bir/TbsActivityMapper.xml

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qs.serve.modules.tbs.mapper.TbsActivityMapper">
<select id="listRebateAutoActIds" resultType="java.lang.String">
select t1.id
from tbs_activity t1
left join tbs_cost_apply t2 on t2.id = t1.cost_apply_id
where
and t1.rebate_period_id is not null
and t1.rebate_period_id != 0
and t1.del_flag = 0
and t2.del_flag = 0
and t2.charge_state = 2
</select>
</mapper>
Loading…
Cancel
Save