Browse Source

添加释放费用、重新打开核销

mssql
Yen 3 years ago
parent
commit
8745fc6266
  1. 2
      src/main/java/com/qs/serve/common/model/consts/SysConfigKey.java
  2. 2
      src/main/java/com/qs/serve/modules/sys/service/SysConfigService.java
  3. 8
      src/main/java/com/qs/serve/modules/sys/service/impl/SysConfigServiceImpl.java
  4. 22
      src/main/java/com/qs/serve/modules/tbs/common/TbsCostApplyState.java
  5. 17
      src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController.java
  6. 9
      src/main/java/com/qs/serve/modules/tbs/controller/TbsCostApplyController.java
  7. 28
      src/main/java/com/qs/serve/modules/tbs/entity/TbsActivity.java
  8. 27
      src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenterGoods.java
  9. 16
      src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityReopenBo.java
  10. 31
      src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityServiceImpl.java
  11. 8
      src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationService.java
  12. 5
      src/main/java/com/qs/serve/modules/vtb/service/impl/VtbFundFlowServiceImpl.java
  13. 81
      src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java

2
src/main/java/com/qs/serve/common/model/consts/SysConfigKey.java

@ -12,4 +12,6 @@ public interface SysConfigKey {
*/
String TbsBudgetOverspend = "budget-overspend";
String ActivityPreCheckDays = "ActivityPreCheckDays";
}

2
src/main/java/com/qs/serve/modules/sys/service/SysConfigService.java

@ -10,5 +10,7 @@ import com.qs.serve.modules.sys.entity.SysConfig;
*/
public interface SysConfigService extends IService<SysConfig> {
SysConfig getByKey(String key);
}

8
src/main/java/com/qs/serve/modules/sys/service/impl/SysConfigServiceImpl.java

@ -1,5 +1,6 @@
package com.qs.serve.modules.sys.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -18,5 +19,12 @@ import com.qs.serve.modules.sys.mapper.SysConfigMapper;
@AllArgsConstructor
public class SysConfigServiceImpl extends ServiceImpl<SysConfigMapper,SysConfig> implements SysConfigService {
@Override
public SysConfig getByKey(String key) {
LambdaQueryWrapper<SysConfig> lqw = new LambdaQueryWrapper<>();
lqw.eq(SysConfig::getConfigKey,key);
SysConfig sysConfig = this.getOne(lqw);
return sysConfig;
}
}

22
src/main/java/com/qs/serve/modules/tbs/common/TbsCostApplyState.java

@ -0,0 +1,22 @@
package com.qs.serve.modules.tbs.common;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author YenHex
* @since 2022/11/28
*/
@Getter
@AllArgsConstructor
public enum TbsCostApplyState {
//状态:0=未发布;1=审批中;2=待执行;3=完成;4-被驳回
State_0_unPublish(0),
State_1_apply(1),
State_2_actioning(2),
State_3_finished(3);
private Integer code;
}

17
src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController.java

@ -12,6 +12,7 @@ import com.qs.serve.common.util.PageUtil;
import com.qs.serve.modules.bms.service.BmsSupplierService;
import com.qs.serve.modules.tbs.common.TbsGoodsType;
import com.qs.serve.modules.tbs.entity.*;
import com.qs.serve.modules.tbs.entity.bo.TbsActivityReopenBo;
import com.qs.serve.modules.tbs.entity.vo.TbsActivityCenterGoodsVo;
import com.qs.serve.modules.tbs.service.*;
import lombok.AllArgsConstructor;
@ -213,6 +214,22 @@ public class TbsActivityController {
return R.ok();
}
/**
* 重新打开核销
* @param param
* @return
*/
@PostMapping("/reopen")
@SysLog(module = SystemModule.Budget, title = "费用活动", biz = BizType.UPDATE)
@PreAuthorize("hasRole('tbs:activity:update')")
public R<?> reopen(@RequestBody @Valid TbsActivityReopenBo param){
TbsActivity activity = new TbsActivity();
activity.setId(param.getActivityId());
activity.setReopenFlag(param.getState().equals(1)?1:0);
tbsActivityService.updateById(activity);
return R.ok();
}
/**
* 新增
* @param param

9
src/main/java/com/qs/serve/modules/tbs/controller/TbsCostApplyController.java

@ -14,6 +14,7 @@ import com.qs.serve.modules.bms.entity.BmsSupplier;
import com.qs.serve.modules.bms.service.BmsSupplierService;
import com.qs.serve.modules.sys.entity.SysUser;
import com.qs.serve.modules.sys.service.SysUserService;
import com.qs.serve.modules.tbs.common.TbsCostApplyState;
import com.qs.serve.modules.tbs.common.TbsSeeYonConst;
import com.qs.serve.modules.tbs.entity.TbsActivity;
import com.qs.serve.modules.tbs.service.TbsActivityService;
@ -102,6 +103,14 @@ public class TbsCostApplyController {
@SysLog(module = SystemModule.Budget, title = "费用申请", biz = BizType.UPDATE)
@PreAuthorize("hasRole('tbs:costApply:update')")
public R<?> updateState(@PathVariable("id") String id){
if(1==1){
//todo 测试
TbsCostApply costApply = new TbsCostApply();
costApply.setId(Long.parseLong(id));
costApply.setChargeState(TbsCostApplyState.State_2_actioning.getCode());
tbsCostApplyService.updateById(costApply);
return R.ok();
}
if(!seeYonProperties.getEnable()){
return R.error("远程服务未开启");
}

28
src/main/java/com/qs/serve/modules/tbs/entity/TbsActivity.java

@ -119,12 +119,35 @@ public class TbsActivity implements Serializable {
@JsonProperty
private String delFlag;
/** 释放标识 */
private Integer finishedFlag;
/** 合计金额 */
private BigDecimal totalAmount;
/** 使用金额 */
private BigDecimal usedAmount;
/** 释放人员id */
private String releaseUserId;
/** 释放人员 */
private String releaseUserName;
/** 释放标识 */
private Integer releaseFlag;
/** 重新打开标识(可重新打开过期活动进行核销) */
private Integer reopenFlag;
/** 释放金额 */
private BigDecimal releaseAmount;
/** 释放时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@TableField(fill = FieldFill.UPDATE)
private LocalDateTime releaseTime;
/** 产品类型 */
@TableField(exist = false)
private String goodsType;
@ -152,5 +175,10 @@ public class TbsActivity implements Serializable {
/** 科目与成本中心 */
@TableField(exist = false)
private List<TbsActivitySubject> subjectCenterList;
/** 显示释放费用按钮 */
@TableField(exist = false)
private Integer showReleaseButton;
}

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

@ -154,6 +154,33 @@ public class TbsActivityCenterGoods implements Serializable {
@JsonProperty
private String delFlag;
/** 活动开始时间 */
@NotNull(message = "活动开始时间不能为空")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
private LocalDate actStartDate;
/** 活动结束时间 */
@NotNull(message = "活动结束时间不能为空")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
private LocalDate actEndDate;
/** 预算开始时间 */
@NotNull(message = "活动开始时间不能为空")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate preStartDate;
/** 预算结束时间 */
@NotNull(message = "活动结束时间不能为空")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate preEndDate;
/** 预计核销时间 */
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
private LocalDate preCheckDate;
@TableField(exist = false)
private String spuName;

16
src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityReopenBo.java

@ -0,0 +1,16 @@
package com.qs.serve.modules.tbs.entity.bo;
import lombok.Data;
/**
* @author YenHex
* @since 2022/11/28
*/
@Data
public class TbsActivityReopenBo {
private Long activityId;
private Integer state;
}

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

@ -2,10 +2,8 @@ package com.qs.serve.modules.tbs.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qs.serve.common.util.Assert;
import com.qs.serve.common.util.CollectionUtil;
import com.qs.serve.common.util.CopierUtil;
import com.qs.serve.common.util.StringUtils;
import com.qs.serve.common.model.consts.SysConfigKey;
import com.qs.serve.common.util.*;
import com.qs.serve.modules.bms.entity.*;
import com.qs.serve.modules.bms.service.*;
import com.qs.serve.modules.goods.entity.GoodsCategory;
@ -15,6 +13,10 @@ import com.qs.serve.modules.goods.entity.dto.TbsCenterDto;
import com.qs.serve.modules.goods.service.GoodsCategoryService;
import com.qs.serve.modules.goods.service.GoodsSkuService;
import com.qs.serve.modules.goods.service.GoodsSpuService;
import com.qs.serve.modules.sys.entity.SysConfig;
import com.qs.serve.modules.sys.entity.SysUser;
import com.qs.serve.modules.sys.service.SysConfigService;
import com.qs.serve.modules.sys.service.SysUserService;
import com.qs.serve.modules.tbs.common.TbsCenterType;
import com.qs.serve.modules.tbs.common.TbsGoodsType;
import com.qs.serve.modules.tbs.entity.*;
@ -29,6 +31,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
@ -60,6 +63,9 @@ public class TbsActivityServiceImpl extends ServiceImpl<TbsActivityMapper,TbsAct
private final GoodsSpuService goodsSpuService;
private final GoodsCategoryService goodsCategoryService;
private final SysConfigService configService;
@Override
@Transactional(rollbackFor = Exception.class)
@ -74,7 +80,8 @@ public class TbsActivityServiceImpl extends ServiceImpl<TbsActivityMapper,TbsAct
}
}else {
activity = CopierUtil.copy(activityBo,new TbsActivity());
activity.setActivityCode("G"+ StringUtils.genShortId() + new Random().nextInt(9));
String random = String.format("%03d",new Random().nextInt(999));
activity.setActivityCode("G"+ StringUtils.genShortId() + random);
}
activity.setSupplierId(Long.parseLong(supplier.getId()));
activity.setSupplierCode(supplier.getCode());
@ -85,6 +92,10 @@ public class TbsActivityServiceImpl extends ServiceImpl<TbsActivityMapper,TbsAct
totalAmount = totalAmount.add(centerGoodsBo.getCenterGoodsAmount());
}
activity.setTotalAmount(totalAmount);
SysConfig sysConfig = configService.getByKey(SysConfigKey.ActivityPreCheckDays);
Integer days = Integer.parseInt(sysConfig.getConfigValue());
LocalDate preDay = DateUtils.beSetDate(activity.getActEndDate(),days);
activity.setPreCheckDate(preDay);
this.saveOrUpdate(activity);
if(isUpdate){
//删除旧数据
@ -119,14 +130,14 @@ public class TbsActivityServiceImpl extends ServiceImpl<TbsActivityMapper,TbsAct
}
BigDecimal tmp = rate.divide(new BigDecimal(100));
if(tmp.compareTo(new BigDecimal(tmp.longValue()))!=0){
Assert.throwEx("成本与商品分配比例有误");
Assert.throwEx("成本中心与商品分配比例有误");
}
}
for (TbsActivityCenter activityCenter : activityCenterList) {
String key = activityCenter.getSubjectId()+":"+activityCenter.getCenterType()+":"+activityCenter.getCenterId();
BigDecimal amount = checkAmountMap.get(key);
if(amount==null||amount.compareTo(activityCenter.getCenterAmount())!=0){
Assert.throwEx("成本与商品分配的金额有误");
Assert.throwEx("成本中心与商品分配的金额有误");
}
}
//客户详情
@ -219,6 +230,12 @@ public class TbsActivityServiceImpl extends ServiceImpl<TbsActivityMapper,TbsAct
centerGoods.setSubjectName(subject.getSubjectName());
centerGoods.setCenterGoodsAmount(centerGoodsBo.getCenterGoodsAmount());
centerGoods.setCenterGoodsRate(centerGoodsBo.getCenterGoodsRate());
//设置活动时间
centerGoods.setActEndDate(activity.getActEndDate());
centerGoods.setActStartDate(activity.getActStartDate());
centerGoods.setPreEndDate(activity.getPreEndDate());
centerGoods.setPreStartDate(activity.getPreStartDate());
centerGoods.setPreCheckDate(activity.getPreCheckDate());
//统计
String key4Count = subject.getId()+":"+key;
BigDecimal checkAmount = checkAmountMap.get(key4Count);

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

@ -11,6 +11,14 @@ import com.qs.serve.modules.vtb.entity.bo.VtbVerificationBo;
*/
public interface VtbVerificationService extends IService<VtbVerification> {
/**
* 释放活动费用
* @param activityId
*/
void release(Long activityId);
/**
* 提交审批
* @param vtbVerificationBo

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

@ -59,6 +59,8 @@ public class VtbFundFlowServiceImpl extends ServiceImpl<VtbFundFlowMapper,VtbFun
@Override
public void flushActivityAmount(Long activityId) {
log.info("刷新活动金额,ActId:{}",activityId);
TbsActivity orgActivity = activityService.getById(activityId);
List<VtbFundFlow> allFunFlow = this.listByActivity(activityId);
List<TbsActivitySubject> activitySubjectList = activitySubjectService.listByActivityId(activityId);
List<TbsActivityCenter> activityCenterList = activityCenterService.listByActivity(activityId);
@ -71,6 +73,9 @@ public class VtbFundFlowServiceImpl extends ServiceImpl<VtbFundFlowMapper,VtbFun
TbsActivity activity = new TbsActivity();
activity.setId(activityId);
activity.setUsedAmount(activityUsedAmount);
boolean finished = orgActivity.getUsedAmount().compareTo(activityUsedAmount)==0;
log.info("活动完成状态:{},ActId:{}",finished,activityId);
activity.setFinishedFlag(finished?1:0);
activityService.updateById(activity);
//更新其它明细
Map<Long,List<VtbFundFlow>> fundFlowMapBySubject = allFunFlow.stream().collect(Collectors.groupingBy(VtbFundFlow::getSubjectId));

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

@ -3,10 +3,13 @@ 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.Assert;
import com.qs.serve.common.util.AuthContextUtils;
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.service.BmsSubjectService;
import com.qs.serve.modules.sys.entity.SysUser;
import com.qs.serve.modules.sys.service.SysUserService;
import com.qs.serve.modules.tbs.entity.*;
import com.qs.serve.modules.tbs.service.*;
import com.qs.serve.modules.vtb.common.VtbFundFlowType;
@ -27,6 +30,8 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
@ -53,20 +58,41 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe
private final VtbVerificationSubjectService verificationSubjectService;
private final VtbFundFlowService fundFlowService;
private final SysUserService sysUserService;
@Override
@Transactional(rollbackFor = Exception.class)
public void release(Long activityId) {
SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId());
TbsActivity activity = activityService.getById(activityId);
BigDecimal releaseAmount = validActivity(activity,false);
TbsActivity param = new TbsActivity();
param.setId(activityId);
param.setReleaseUserId(sysUser.getId());
param.setReleaseUserName(sysUser.getName());
param.setReleaseFlag(1);
param.setReleaseTime(LocalDateTime.now());
param.setReleaseAmount(releaseAmount);
param.setFinishedFlag(1);
activityService.updateById(param);
VtbFundFlow fundFlow = new VtbFundFlow();
fundFlow.setFundType(VtbFundFlowType.Release);
fundFlow.setVerificationId(0L);
fundFlow.setCenterGoodsCode(activity.getActivityCode()+"_0");
fundFlow.setCostApplyId(activity.getCostApplyId());
fundFlow.setActivityId(activity.getId());
fundFlow.setUsedAmount(releaseAmount);
fundFlowService.save(fundFlow);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void commit(VtbVerificationBo verificationBo) {
TbsActivity activity = activityService.getById(verificationBo.getActivityId());
TbsCostApply costApply = costApplyService.getById(activity.getCostApplyId());
//todo 结束的活动不支持核销
boolean hasRelease = fundFlowService.hasRelease(activity.getId());
if(hasRelease){
Assert.throwEx("费用已释放");
}
boolean isCommitting = this.checkCommitting(activity.getId());
if(isCommitting){
Assert.throwEx("该活动核销中");
}
validActivity(activity,true);
VtbVerification verification = new VtbVerification();
verification.setId(verificationBo.getId());
verification.setActivityId(verificationBo.getActivityId());
@ -93,6 +119,42 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe
verificationSubjectService.saveBatch(verificationSubjects);
}
/**
* 校验活动
* @param activity
* @param filterActTime 释放拦截活动结束
* @return
*/
private BigDecimal validActivity(TbsActivity activity,boolean filterActTime){
LocalDate nowDate = LocalDate.now();
if(activity.getReopenFlag().equals(0)
&& filterActTime
&& nowDate.isAfter(activity.getActEndDate())){
Assert.throwEx("活动已结束");
}
if(activity.getReleaseFlag().equals(1)){
Assert.throwEx("费用已释放");
}
if(activity.getFinishedFlag().equals(1)){
Assert.throwEx("活动已完成");
}
boolean isCommitting = this.checkCommitting(activity.getId());
if(isCommitting){
Assert.throwEx("该活动核销中,操作失败");
}
List<VtbFundFlow> fundFlowList = fundFlowService.listByActivity(activity.getId(),VtbFundFlowType.Verification);
BigDecimal totalFunFlow = BigDecimal.ZERO;
for (VtbFundFlow fundFlow : fundFlowList) {
totalFunFlow = totalFunFlow.add(fundFlow.getUsedAmount());
}
BigDecimal allowAmount = activity.getTotalAmount().subtract(totalFunFlow);
if(allowAmount.compareTo(BigDecimal.ZERO)<1){
Assert.throwEx("无可用费用");
}
return allowAmount;
}
/**
* 校验和生成核销费用
* @param verificationBo
@ -163,7 +225,6 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe
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;

Loading…
Cancel
Save