Browse Source

预算费用占用

mssql
Yen 3 years ago
parent
commit
25d9170707
  1. 7
      src/main/java/com/qs/serve/common/model/consts/SysConfigKey.java
  2. 5
      src/main/java/com/qs/serve/modules/bms/controller/BmsRegionUserController.java
  3. 20
      src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierController.java
  4. 33
      src/main/java/com/qs/serve/modules/bms/entity/BmsSupplier.java
  5. 17
      src/main/java/com/qs/serve/modules/tbs/common/TbsActivityState.java
  6. 108
      src/main/java/com/qs/serve/modules/tbs/common/util/TbsBudgetCostUtil.java
  7. 11
      src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController.java
  8. 75
      src/main/java/com/qs/serve/modules/tbs/controller/TbsCostApplyController.java
  9. 1
      src/main/java/com/qs/serve/modules/tbs/controller/TbsScheduleController.java
  10. 9
      src/main/java/com/qs/serve/modules/tbs/entity/TbsActivity.java
  11. 16
      src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenterGoods.java
  12. 7
      src/main/java/com/qs/serve/modules/tbs/entity/TbsBudget.java
  13. 227
      src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetCostItem.java
  14. 3
      src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityReopenBo.java
  15. 46
      src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetAmountResult.java
  16. 14
      src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetCostItemMapper.java
  17. 2
      src/main/java/com/qs/serve/modules/tbs/service/TbsActivityCenterGoodsService.java
  18. 9
      src/main/java/com/qs/serve/modules/tbs/service/TbsActivityService.java
  19. 293
      src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetApplicationService.java
  20. 4
      src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetConditionService.java
  21. 19
      src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetCostItemService.java
  22. 5
      src/main/java/com/qs/serve/modules/tbs/service/TbsScheduleItemBudgetService.java
  23. 8
      src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityCenterGoodsServiceImpl.java
  24. 33
      src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityServiceImpl.java
  25. 9
      src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetConditionServiceImpl.java
  26. 32
      src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetCostItemServiceImpl.java
  27. 10
      src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetServiceImpl.java
  28. 12
      src/main/java/com/qs/serve/modules/tbs/service/impl/TbsScheduleItemBudgetServiceImpl.java
  29. 40
      src/main/java/com/qs/serve/modules/vtb/controller/VtbVerificationController.java
  30. 13
      src/main/java/com/qs/serve/modules/vtb/entity/VtbVerification.java
  31. 3
      src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java

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

@ -7,11 +7,10 @@ package com.qs.serve.common.model.consts;
*/ */
public interface SysConfigKey { public interface SysConfigKey {
/** /** 费用超支 */
* 费用超支 String TbsBudgetOverspend = "TbsBudgetOverspend";
*/
String TbsBudgetOverspend = "budget-overspend";
/** 活动预计核销日期 */
String ActivityPreCheckDays = "ActivityPreCheckDays"; String ActivityPreCheckDays = "ActivityPreCheckDays";
} }

5
src/main/java/com/qs/serve/modules/bms/controller/BmsRegionUserController.java

@ -48,6 +48,11 @@ public class BmsRegionUserController {
private BmsRegionService bmsRegionService; private BmsRegionService bmsRegionService;
private SysUserService sysUserService; private SysUserService sysUserService;
public R<?> commentRegionList(){
return R.ok();
}
/** /**
* 列表 * 列表
* @param param * @param param

20
src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierController.java

@ -329,7 +329,7 @@ public class BmsSupplierController {
@GetMapping("/getById/{id}") @GetMapping("/getById/{id}")
@SysLog(module = SystemModule.BASE, title = "供应商", biz = BizType.QUERY) @SysLog(module = SystemModule.BASE, title = "供应商", biz = BizType.QUERY)
@PreAuthorize("hasRole('bms:supplier:query')") @PreAuthorize("hasRole('bms:supplier:query')")
public R<BmsSupplier> getById(@PathVariable("id") String id){ public R<BmsSupplier> getById(@PathVariable("id") String id,Integer loadRegionInfo){
BmsSupplier bmsSupplier = bmsSupplierService.getById(id); BmsSupplier bmsSupplier = bmsSupplierService.getById(id);
if(StringUtils.hasText(bmsSupplier.getPid())&&!bmsSupplier.getPid().equals("0")){ if(StringUtils.hasText(bmsSupplier.getPid())&&!bmsSupplier.getPid().equals("0")){
BmsSupplier parentInfo = bmsSupplierService.getById(bmsSupplier.getPid()); BmsSupplier parentInfo = bmsSupplierService.getById(bmsSupplier.getPid());
@ -361,6 +361,24 @@ public class BmsSupplierController {
}).collect(Collectors.toList()); }).collect(Collectors.toList());
userVos.addAll(userVos2); userVos.addAll(userVos2);
} }
if(loadRegionInfo!=null&&loadRegionInfo.equals(1)){
BmsRegion obj1 = bmsRegionService.getById(bmsSupplier.getRegionFirst());
BmsRegion obj2 = bmsRegionService.getById(bmsSupplier.getRegionSecond());
BmsRegion obj3 = bmsRegionService.getById(bmsSupplier.getRegionThird());
BmsRegion obj4 = bmsRegionService.getById(bmsSupplier.getRegionFourthly());
bmsSupplier.setRegionFirstInfo(obj1);
bmsSupplier.setRegionSecondInfo(obj2);
bmsSupplier.setRegionThirdInfo(obj3);
bmsSupplier.setRegionFourthlyInfo(obj4);
BmsRegion2 obj11 = bmsRegion2Service.getById(bmsSupplier.getRegion2First());
BmsRegion2 obj22 = bmsRegion2Service.getById(bmsSupplier.getRegion2Second());
BmsRegion2 obj33 = bmsRegion2Service.getById(bmsSupplier.getRegion2Third());
BmsRegion2 obj44 = bmsRegion2Service.getById(bmsSupplier.getRegion2Fourthly());
bmsSupplier.setRegion2FirstInfo(obj11);
bmsSupplier.setRegion2SecondInfo(obj22);
bmsSupplier.setRegion2ThirdInfo(obj33);
bmsSupplier.setRegion2FourthlyInfo(obj44);
}
bmsSupplier.setUserVos(userVos); bmsSupplier.setUserVos(userVos);
return R.ok(bmsSupplier); return R.ok(bmsSupplier);
} }

33
src/main/java/com/qs/serve/modules/bms/entity/BmsSupplier.java

@ -184,6 +184,39 @@ public class BmsSupplier implements Serializable {
@TableField(exist = false) @TableField(exist = false)
private Integer loadByCurrent; private Integer loadByCurrent;
/** 一级区域 */
@TableField(exist = false)
private Object regionFirstInfo;
/** 二级区域 */
@TableField(exist = false)
private Object regionSecondInfo;
/** 三级区域 */
@TableField(exist = false)
private Object regionThirdInfo;
/** 四级区域 */
@TableField(exist = false)
private Object regionFourthlyInfo;
/** 行政一级区域 */
@TableField(exist = false)
private Object region2FirstInfo;
/** 行政二级区域 */
@TableField(exist = false)
private Object region2SecondInfo;
/** 行政三级区域 */
@TableField(exist = false)
private Object region2ThirdInfo;
/** 行政四级区域 */
@TableField(exist = false)
private Object region2FourthlyInfo;
public HisUserSupplier toHisUserSupplier(String userId,Integer type){ public HisUserSupplier toHisUserSupplier(String userId,Integer type){
HisUserSupplier userSupplier = new HisUserSupplier(); HisUserSupplier userSupplier = new HisUserSupplier();
userSupplier.setUserId(userId); userSupplier.setUserId(userId);

17
src/main/java/com/qs/serve/modules/tbs/common/TbsActivityState.java

@ -0,0 +1,17 @@
package com.qs.serve.modules.tbs.common;
/**
* @author YenHex
* @since 2022/12/6
*/
public interface TbsActivityState {
/**
* 活动状态0-待核销1-审批中2-完成3-冻结
*/
Integer STATE_0_Todo = 0;
Integer STATE_1_Checking = 1;
Integer STATE_1_Finished = 2;
Integer STATE_1_Baning = 3;
}

108
src/main/java/com/qs/serve/modules/tbs/common/util/TbsBudgetCostUtil.java

@ -0,0 +1,108 @@
package com.qs.serve.modules.tbs.common.util;
import com.qs.serve.common.util.CollectionUtil;
import com.qs.serve.common.util.CopierUtil;
import com.qs.serve.modules.tbs.entity.TbsActivityCenterGoods;
import com.qs.serve.modules.tbs.entity.TbsBudgetCostItem;
import org.jetbrains.annotations.NotNull;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
/**
* @author YenHex
* @since 2022/12/5
*/
public class TbsBudgetCostUtil {
/**
* 统计费用占用历史
* @param budgetCostItems
* @return
*/
public static BigDecimal totalHisCost(List<TbsBudgetCostItem> budgetCostItems){
BigDecimal total = BigDecimal.ZERO;
if(CollectionUtil.isNotEmpty(budgetCostItems)){
for (TbsBudgetCostItem item : budgetCostItems) {
total = total.add(item.getMonthAmount());
}
}
return total;
}
/**
* 拆分条件
* @param path
* @param paths
*/
public static void buildPaths(String path, Set<String> paths){
if(path.contains("_")){
String subPath = path.substring(0,path.lastIndexOf("_"));
paths.add(subPath);
buildPaths(subPath,paths);
}
}
public static void main(String[] args) {
String aa = "1_9_3_4_5_6";
Set<String> stringSet = new LinkedHashSet<>();
buildPaths(aa,stringSet);
stringSet.forEach(System.out::println);
}
/**
* 按月份创建预算占用明细
* @param centerGoodsList
* @return
*/
@NotNull
public static List<TbsBudgetCostItem> createBudgetCostItems(List<TbsActivityCenterGoods> centerGoodsList) {
List<TbsBudgetCostItem> budgetCostItems = new ArrayList<>();
for (TbsActivityCenterGoods centerGoods : centerGoodsList) {
//按月份拆分
LocalDate actStartDate = centerGoods.getActStartDate();
LocalDate itemStartDate = centerGoods.getActStartDate();
LocalDate actEndDate = centerGoods.getActEndDate();
int days = actEndDate.getDayOfYear() - actStartDate.getDayOfYear() + 1;
int count = Math.max(days / 28, 2);
BigDecimal totalAmount = centerGoods.getCenterGoodsAmount();
BigDecimal balance = centerGoods.getCenterGoodsAmount();
for (int i = 0; i < count ; i++) {
if(itemStartDate.getDayOfYear() > actEndDate.getDayOfYear()){
break;
}
LocalDate itemLastDay = itemStartDate.with(TemporalAdjusters.lastDayOfMonth());
boolean isEnd = false;
if(itemLastDay.getDayOfYear() >= actEndDate.getDayOfYear()){
itemLastDay = actEndDate;
isEnd = true;
}
int daysOfMonth = itemStartDate.getDayOfYear()-itemLastDay.getDayOfYear()+1;
BigDecimal currentItemAmount;
if(isEnd){
currentItemAmount = balance;
}else {
currentItemAmount = BigDecimal.valueOf(daysOfMonth)
.divide(BigDecimal.valueOf(days), RoundingMode.HALF_UP)
.multiply(totalAmount);
balance = balance.subtract(currentItemAmount);
}
//构建明细项
TbsBudgetCostItem budgetCostItem = CopierUtil.copy(centerGoods,new TbsBudgetCostItem());
budgetCostItem.setId(null);
budgetCostItem.setCenterGoodItemId(centerGoods.getId());
budgetCostItem.setItemStartDate(itemStartDate);
budgetCostItem.setItemEndDate(itemLastDay);
budgetCostItem.setMonthAmount(currentItemAmount);
budgetCostItems.add(budgetCostItem);
//跨月份重新赋值
itemStartDate = itemLastDay.plusDays(1);
}
}
return budgetCostItems;
}
}

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

@ -10,6 +10,7 @@ import com.qs.serve.common.model.enums.SystemModule;
import com.qs.serve.common.util.CopierUtil; import com.qs.serve.common.util.CopierUtil;
import com.qs.serve.common.util.PageUtil; import com.qs.serve.common.util.PageUtil;
import com.qs.serve.modules.bms.service.BmsSupplierService; import com.qs.serve.modules.bms.service.BmsSupplierService;
import com.qs.serve.modules.tbs.common.TbsActivityState;
import com.qs.serve.modules.tbs.common.TbsGoodsType; import com.qs.serve.modules.tbs.common.TbsGoodsType;
import com.qs.serve.modules.tbs.entity.*; import com.qs.serve.modules.tbs.entity.*;
import com.qs.serve.modules.tbs.entity.bo.TbsActivityReopenBo; import com.qs.serve.modules.tbs.entity.bo.TbsActivityReopenBo;
@ -25,6 +26,8 @@ import com.qs.serve.modules.tbs.entity.vo.TbsActivityVo;
import com.qs.serve.modules.tbs.entity.bo.TbsActivityBo; import com.qs.serve.modules.tbs.entity.bo.TbsActivityBo;
import javax.validation.Valid; import javax.validation.Valid;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -65,6 +68,7 @@ public class TbsActivityController {
LambdaQueryWrapper<TbsActivity> lqw = new LambdaQueryWrapper<>(entity); LambdaQueryWrapper<TbsActivity> lqw = new LambdaQueryWrapper<>(entity);
List<TbsActivity> list = tbsActivityService.list(lqw); List<TbsActivity> list = tbsActivityService.list(lqw);
for (TbsActivity activity : list) { for (TbsActivity activity : list) {
//todo 核销状态
QueryWrapper qw = new QueryWrapper<>(); QueryWrapper qw = new QueryWrapper<>();
qw.eq("activity_id",activity.getId()); qw.eq("activity_id",activity.getId());
List<TbsActivityGoods> goodsList = activityGoodsService.list(qw); List<TbsActivityGoods> goodsList = activityGoodsService.list(qw);
@ -229,6 +233,13 @@ public class TbsActivityController {
TbsActivity activity = new TbsActivity(); TbsActivity activity = new TbsActivity();
activity.setId(param.getActivityId()); activity.setId(param.getActivityId());
activity.setReopenFlag(param.getState().equals(1)?1:0); activity.setReopenFlag(param.getState().equals(1)?1:0);
if(activity.getReopenFlag().equals(1)){
TbsActivity dbAct = tbsActivityService.getById(param.getActivityId());
if(dbAct.getPreEndDate().isBefore(LocalDate.now())){
//todo 每日执行更新是否过期,过期则进行冻结
//activity.setActivityState(TbsActivityState.STATE_1_Baning);
}
}
tbsActivityService.updateById(activity); tbsActivityService.updateById(activity);
return R.ok(); return R.ok();
} }

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

@ -2,6 +2,7 @@ package com.qs.serve.modules.tbs.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.qs.serve.common.model.annotation.SysLog; import com.qs.serve.common.model.annotation.SysLog;
import com.qs.serve.common.model.consts.SysConfigKey;
import com.qs.serve.common.model.dto.PageVo; import com.qs.serve.common.model.dto.PageVo;
import com.qs.serve.common.model.dto.R; import com.qs.serve.common.model.dto.R;
import com.qs.serve.common.model.enums.BizType; import com.qs.serve.common.model.enums.BizType;
@ -16,27 +17,26 @@ import com.qs.serve.modules.seeyon.entity.CtpAffairCommit;
import com.qs.serve.modules.seeyon.entity.CtpAffairQo; import com.qs.serve.modules.seeyon.entity.CtpAffairQo;
import com.qs.serve.modules.seeyon.service.SeeYonService; import com.qs.serve.modules.seeyon.service.SeeYonService;
import com.qs.serve.modules.sys.entity.SysUser; 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.sys.service.SysUserService;
import com.qs.serve.modules.tbs.common.TbsCostApplyState; import com.qs.serve.modules.tbs.common.TbsCostApplyState;
import com.qs.serve.modules.tbs.common.TbsSeeYonConst; import com.qs.serve.modules.tbs.common.TbsSeeYonConst;
import com.qs.serve.modules.tbs.entity.TbsActivity; import com.qs.serve.modules.tbs.common.util.TbsBudgetCostUtil;
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.service.TbsActivityService; import com.qs.serve.modules.tbs.entity.bo.TbsCostApplyBo;
import com.qs.serve.modules.tbs.entity.vo.TbsCostApplyVo;
import com.qs.serve.modules.tbs.service.*;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import com.qs.serve.modules.tbs.entity.vo.TbsCostApplyVo;
import com.qs.serve.modules.tbs.entity.bo.TbsCostApplyBo;
import com.qs.serve.modules.tbs.entity.TbsCostApply;
import com.qs.serve.modules.tbs.service.TbsCostApplyService;
import javax.validation.Valid; import javax.validation.Valid;
import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.HashMap; import java.time.temporal.ChronoField;
import java.util.List; import java.util.*;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -50,10 +50,21 @@ import java.util.stream.Collectors;
@RequestMapping("tbs/costApply") @RequestMapping("tbs/costApply")
public class TbsCostApplyController { public class TbsCostApplyController {
private TbsBudgetApplicationService tbsBudgetApplicationService;
private TbsCostApplyService tbsCostApplyService; private TbsCostApplyService tbsCostApplyService;
private TbsActivityService tbsActivityService;
private TbsActivityCenterGoodsService tbsActivityCenterGoodsService;
private TbsBudgetService tbsBudgetService;
private TbsBudgetConditionService tbsBudgetConditionService;
private TbsBudgetCostItemService tbsBudgetCostItemService;
private BmsSupplierService bmsSupplierService; private BmsSupplierService bmsSupplierService;
private SysUserService sysUserService; private SysUserService sysUserService;
private TbsActivityService tbsActivityService; private SysConfigService configService;
private SeeYonService seeYonService; private SeeYonService seeYonService;
/** /**
@ -107,17 +118,35 @@ public class TbsCostApplyController {
@PostMapping("/commit/{id}") @PostMapping("/commit/{id}")
@SysLog(module = SystemModule.Budget, title = "费用申请", biz = BizType.UPDATE) @SysLog(module = SystemModule.Budget, title = "费用申请", biz = BizType.UPDATE)
@PreAuthorize("hasRole('tbs:costApply:update')") @PreAuthorize("hasRole('tbs:costApply:update')")
public R<?> updateState(@PathVariable("id") String id){ public R<?> commit(@PathVariable("id") String id){
if(1==1){ TbsCostApply tbsCostApply = tbsCostApplyService.getById(id);
//todo 测试 if(!tbsCostApply.getChargeState().equals(TbsCostApplyState.State_0_unPublish.getCode())
TbsCostApply costApply = new TbsCostApply(); ||!tbsCostApply.getChargeState().equals(TbsCostApplyState.State_4_refused.getCode())){
costApply.setId(Long.parseLong(id)); return R.error("操作失败,申请费用状态不支持");
costApply.setChargeState(TbsCostApplyState.State_2_actioning.getCode());
tbsCostApplyService.updateById(costApply);
return R.ok();
} }
// //统计预算dto
// for (TbsBudgetCostItem costItem : budgetCostItems) {
// List<TbsScheduleItemBudget> budgetItemList = costItem.getTempScheduleItemDtoList();
// //无可用预算拦截
// if(budgetItemList.size()<1){
//
// }else {
// for (TbsScheduleItemBudget itemBudget : budgetItemList) {
//
// }
// }
// //加载已用预算
// List<Long> budgetIdsByItem = budgetItemList.stream()
// .map(TbsScheduleItemBudget::getBudgetId).distinct().collect(Collectors.toList());
// List<TbsBudget> budgetListByItem = budgetList.stream()
// .filter(budget-> budgetIdsByItem.contains(budget.getId())).collect(Collectors.toList());
//
// }
SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId());
TbsCostApply tbsCostApply = tbsCostApplyService.getById(id);
if(tbsCostApply.getChargeState().equals(TbsCostApplyState.State_0_unPublish.getCode())){ if(tbsCostApply.getChargeState().equals(TbsCostApplyState.State_0_unPublish.getCode())){
Map<String, Object> data = new HashMap<>(10); Map<String, Object> data = new HashMap<>(10);
data.put("empId",sysUser.getCode()); data.put("empId",sysUser.getCode());
@ -145,7 +174,7 @@ public class TbsCostApplyController {
costApply.setSyFlowId(flowId); costApply.setSyFlowId(flowId);
costApply.setSyFormId(formId); costApply.setSyFormId(formId);
tbsCostApplyService.updateById(costApply); tbsCostApplyService.updateById(costApply);
//todo 扣除预算 //todo 更新并占用预算
return R.ok(); return R.ok();
}else if (tbsCostApply.getChargeState().equals(TbsCostApplyState.State_4_refused.getCode())){ }else if (tbsCostApply.getChargeState().equals(TbsCostApplyState.State_4_refused.getCode())){
//todo 驳回重新申请 //todo 驳回重新申请
@ -213,7 +242,7 @@ public class TbsCostApplyController {
} }
/** /**
* 申请审批表(翻页) * 审批节点列(翻页)
* @param state 状态0-未完成与已完成1-未完成2已完成其它-加载所有 * @param state 状态0-未完成与已完成1-未完成2已完成其它-加载所有
* @param pageNum * @param pageNum
* @param pageSize * @param pageSize
@ -257,7 +286,7 @@ public class TbsCostApplyController {
} }
/** /**
* 审批节点 * 提交审批节点
* @return * @return
*/ */
@PostMapping("/commitAffair") @PostMapping("/commitAffair")

1
src/main/java/com/qs/serve/modules/tbs/controller/TbsScheduleController.java

@ -13,6 +13,7 @@ import com.qs.serve.modules.bms.entity.BmsSubject;
import com.qs.serve.modules.tbs.entity.TbsBudget; import com.qs.serve.modules.tbs.entity.TbsBudget;
import com.qs.serve.modules.tbs.entity.TbsScheduleItem; import com.qs.serve.modules.tbs.entity.TbsScheduleItem;
import com.qs.serve.modules.tbs.service.TbsBudgetService; import com.qs.serve.modules.tbs.service.TbsBudgetService;
import com.qs.serve.modules.tbs.service.TbsScheduleItemBudgetService;
import com.qs.serve.modules.tbs.service.TbsScheduleItemService; import com.qs.serve.modules.tbs.service.TbsScheduleItemService;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;

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

@ -35,6 +35,9 @@ public class TbsActivity implements Serializable {
/** 编码 */ /** 编码 */
private String activityCode; private String activityCode;
/** 活动状态:0-待核销;1-审批中;2-完成;3-冻结 */
private Integer activityState;
/** 费用申请id */ /** 费用申请id */
@NotNull(message = "费用申请id不能为空") @NotNull(message = "费用申请id不能为空")
private Long costApplyId; private Long costApplyId;
@ -119,7 +122,7 @@ public class TbsActivity implements Serializable {
@JsonProperty @JsonProperty
private String delFlag; private String delFlag;
/** 释放标识 */ /** 完成标识 */
private Integer finishedFlag; private Integer finishedFlag;
/** 合计金额 */ /** 合计金额 */
@ -179,9 +182,9 @@ public class TbsActivity implements Serializable {
@TableField(exist = false) @TableField(exist = false)
private List<TbsActivitySubject> subjectCenterList; private List<TbsActivitySubject> subjectCenterList;
/** 显示释放费用按钮 */ /** 后端参数,预算考核期 */
@TableField(exist = false) @TableField(exist = false)
private Integer showReleaseButton; List<TbsScheduleItemBudget> scheduleItemBudgetList;
} }

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

@ -190,5 +190,21 @@ public class TbsActivityCenterGoods implements Serializable {
@TableField(exist = false) @TableField(exist = false)
private String skuName; private String skuName;
/** 后台参数:预算id */
@TableField(exist = false)
private Long budgetId;
/** 后台参数:考核id */
@TableField(exist = false)
private Long scheduleId;
/** 后台参数:考核期项id */
@TableField(exist = false)
private Long scheduleItemId;
/** 后台参数:费用考核期项id */
@TableField(exist = false)
private Long scheduleItemBudgetId;
} }

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

@ -4,6 +4,7 @@ import java.time.LocalDate;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List;
import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
@ -86,6 +87,9 @@ public class TbsBudget implements Serializable {
@Length(max = 255,message = "备注长度不能超过255字") @Length(max = 255,message = "备注长度不能超过255字")
private String remark; private String remark;
/** 条件标识 */
private Integer conditionFlag;
/** 创建时间 */ /** 创建时间 */
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@ -116,6 +120,9 @@ public class TbsBudget implements Serializable {
@JsonProperty @JsonProperty
private String delFlag; private String delFlag;
/** 后端传输dto */
@TableField(exist = false)
private List<TbsBudgetCondition> budgetConditionList;
} }

227
src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetCostItem.java

@ -0,0 +1,227 @@
package com.qs.serve.modules.tbs.entity;
import java.time.LocalDate;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
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;
/**
* 预算费用明细 实体类
* @author YenHex
* @since 2022-12-02
*/
@Data
@TableName("tbs_budget_cost_item")
public class TbsBudgetCostItem implements Serializable {
private static final long serialVersionUID = 1L;
/** id */
@TableId(type = IdType.AUTO)
private Long id;
/** 成本明细编码 */
@Length(max = 30,message = "成本明细编码长度不能超过30字")
private String centerGoodsCode;
/** 费用申请id */
@NotNull(message = "费用申请id不能为空")
private Long costApplyId;
/** 活动id */
@NotNull(message = "活动id不能为空")
private Long activityId;
/** 科目id */
@NotNull(message = "科目id不能为空")
private Long subjectId;
/** 科目编码 */
@NotBlank(message = "科目编码不能为空")
@Length(max = 50,message = "科目编码长度不能超过50字")
private String subjectCode;
/** 科目名称 */
@NotBlank(message = "科目名称不能为空")
@Length(max = 50,message = "科目名称长度不能超过50字")
private String subjectName;
/** 成本中心类型 */
@NotBlank(message = "成本中心类型不能为空")
@Length(max = 50,message = "成本中心类型长度不能超过50字")
private String centerType;
/** 成本中心id */
@NotBlank(message = "成本中心id不能为空")
@Length(max = 32,message = "成本中心id长度不能超过32字")
private String centerId;
/** 成本中心编码 */
@NotBlank(message = "成本中心编码不能为空")
@Length(max = 50,message = "成本中心编码长度不能超过50字")
private String centerCode;
/** 成本中心名称 */
@NotBlank(message = "成本中心名称不能为空")
@Length(max = 50,message = "成本中心名称长度不能超过50字")
private String centerName;
/** 成本中心金额 */
@NotNull(message = "成本中心金额不能为空")
private BigDecimal centerAmount;
/** 成本中心占比 */
@NotNull(message = "成本中心占比不能为空")
private BigDecimal centerRate;
/** 费用额度 */
@NotNull(message = "费用额度不能为空")
private BigDecimal centerGoodsAmount;
/** 费用占比 */
@NotNull(message = "费用占比不能为空")
private BigDecimal centerGoodsRate;
/** 目标类型(brand、category、series、spu、sku) */
@NotBlank(message = "目标类型(brand、category、series、spu、sku)不能为空")
@Length(max = 30,message = "目标类型(brand、category、series、spu、sku)长度不能超过30字")
private String targetType;
/** 目标id */
@NotNull(message = "目标id不能为空")
private Long targetId;
/** 目标编码 */
@NotBlank(message = "目标编码不能为空")
@Length(max = 30,message = "目标编码长度不能超过30字")
private String targetCode;
/** 目标名称 */
@NotBlank(message = "目标名称不能为空")
@Length(max = 30,message = "目标名称长度不能超过30字")
private String targetName;
/** 目标等级路径 */
@Length(max = 600,message = "目标等级路径长度不能超过600字")
private String targetLevelPathIds;
/** 目标等级路径 */
@Length(max = 600,message = "目标等级路径长度不能超过600字")
private String targetLevelPathNames;
/** 备注 */
@Length(max = 255,message = "备注长度不能超过255字")
private String remark;
/** 创建时间 */
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/** 最后更新时间 */
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@TableField(fill = FieldFill.UPDATE)
private LocalDateTime updateTime;
/** 所属租户 */
@JsonIgnore
@JsonProperty
private String tenantId;
/** 创建人 */
@TableField(fill = FieldFill.INSERT)
private String createBy;
/** 更新人 */
@TableField(fill = FieldFill.UPDATE)
private String updateBy;
/** 逻辑删除标记(0:显示;1:隐藏) */
@JsonIgnore
@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")
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
private LocalDate preStartDate;
/** 预算结束时间 */
@NotNull(message = "预算结束时间不能为空")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
private LocalDate preEndDate;
/** 预计核销时间 */
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
private LocalDate preCheckDate;
/** 预算开始时间 */
@NotNull(message = "预算开始时间不能为空")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
private LocalDate itemStartDate;
/** 预算结束时间 */
@NotNull(message = "预算结束时间不能为空")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
private LocalDate itemEndDate;
/** 月份占用金额 */
@NotNull(message = "月份占用金额不能为空")
private BigDecimal monthAmount;
/** 预算id */
@NotNull(message = "预算id不能为空")
private Long budgetId;
/** 考核id */
@NotNull(message = "考核id不能为空")
private Long scheduleId;
/** 考核期项id */
@NotNull(message = "考核期项id不能为空")
private Long scheduleItemId;
/** 费用考核期项id */
@NotNull(message = "费用考核期项id不能为空")
private Long scheduleItemBudgetId;
/** TbsActivityCenterGoods的id */
private Long centerGoodItemId;
/** 请忽略,后端传输参数 */
@TableField(exist = false)
private List<TbsScheduleItemBudget> tempScheduleItemDtoList;
}

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

@ -11,6 +11,9 @@ public class TbsActivityReopenBo {
private Long activityId; private Long activityId;
/**
* 0-关闭1-打开
*/
private Integer state; private Integer state;
} }

46
src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetAmountResult.java

@ -0,0 +1,46 @@
package com.qs.serve.modules.tbs.entity.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* @author YenHex
* @since 2022/12/5
*/
@Data
public class TbsBudgetAmountResult {
/** id */
private Long scheduleItemBudgetId;
/** 考核id */
private Long scheduleId;
/** 考核项id */
private Long scheduleItemId;
/** 考核编码 */
private String itemName;
/** 开始时间 */
private LocalDateTime startDate;
/** 结束时间 */
private LocalDateTime endDate;
/** 预算id */
private Long budgetId;
/** 预算金额 */
private BigDecimal budgetAmount;
}

14
src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetCostItemMapper.java

@ -0,0 +1,14 @@
package com.qs.serve.modules.tbs.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qs.serve.modules.tbs.entity.TbsBudgetCostItem;
/**
* 预算费用明细 Mapper
* @author YenHex
* @date 2022-12-02
*/
public interface TbsBudgetCostItemMapper extends BaseMapper<TbsBudgetCostItem> {
}

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

@ -13,5 +13,7 @@ public interface TbsActivityCenterGoodsService extends IService<TbsActivityCente
List<TbsActivityCenterGoods> listByActivityId(Long activityId); List<TbsActivityCenterGoods> listByActivityId(Long activityId);
List<TbsActivityCenterGoods> listByCostApplyId(Long costApplyId);
} }

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

@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.qs.serve.modules.tbs.entity.TbsActivity; import com.qs.serve.modules.tbs.entity.TbsActivity;
import com.qs.serve.modules.tbs.entity.bo.TbsActivityBo; import com.qs.serve.modules.tbs.entity.bo.TbsActivityBo;
import java.util.List;
/** /**
* 费用活动 服务接口 * 费用活动 服务接口
* @author YenHex * @author YenHex
@ -11,6 +13,13 @@ import com.qs.serve.modules.tbs.entity.bo.TbsActivityBo;
*/ */
public interface TbsActivityService extends IService<TbsActivity> { public interface TbsActivityService extends IService<TbsActivity> {
/**
* 申请活动加载列表
* @param id
* @return
*/
List<TbsActivity> listByCostApplyIdAndTodoState(Long id);
/** /**
* 修改 * 修改
* @param activityBo * @param activityBo

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

@ -0,0 +1,293 @@
package com.qs.serve.modules.tbs.service;
import com.qs.serve.common.model.consts.SysConfigKey;
import com.qs.serve.common.util.Assert;
import com.qs.serve.common.util.CollectionUtil;
import com.qs.serve.modules.bms.service.BmsSupplierService;
import com.qs.serve.modules.seeyon.service.SeeYonService;
import com.qs.serve.modules.sys.service.SysConfigService;
import com.qs.serve.modules.sys.service.SysUserService;
import com.qs.serve.modules.tbs.common.util.TbsBudgetCostUtil;
import com.qs.serve.modules.tbs.entity.*;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.temporal.ChronoField;
import java.util.*;
import java.util.stream.Collectors;
/**
* 预算应用层服务
* @author YenHex
* @since 2022/12/6
*/
@Slf4j
@Service
@AllArgsConstructor
public class TbsBudgetApplicationService {
private TbsCostApplyService tbsCostApplyService;
private TbsActivityService tbsActivityService;
private TbsActivityCenterGoodsService tbsActivityCenterGoodsService;
private TbsScheduleItemBudgetService tbsScheduleItemBudgetService;
private TbsBudgetService tbsBudgetService;
private TbsBudgetConditionService tbsBudgetConditionService;
private TbsBudgetCostItemService tbsBudgetCostItemService;
private BmsSupplierService bmsSupplierService;
private SysUserService sysUserService;
private SysConfigService configService;
private SeeYonService seeYonService;
/**
*
* @param costApplyId
* @param throwEx 是否需要抛出异常
*/
public void commit(Long costApplyId,Boolean throwEx){
//允许超出预算标识
boolean overspend = configService.getByKey(SysConfigKey.TbsBudgetOverspend).getConfigValue().equals("1");
//加载待核销活动
List<TbsActivity> activityList = tbsActivityService.listByCostApplyIdAndTodoState(costApplyId);
//考核期有关的预算id,判断逻辑为活动需要允许在
List<Long> budgetIds = new ArrayList<>();
//没有预算的活动
List<Long> noBudgetActivityIds = new ArrayList<>();
//所有满足条件的考核期,用于加载历史核销费用
List<TbsScheduleItemBudget> scheduleItemList = this.loadScheduleBudgetAndSetting(activityList, budgetIds, noBudgetActivityIds);
//加载预算占用历史
List<Long> scheduleItemBudgetIds = scheduleItemList.stream().map(TbsScheduleItemBudget::getId).collect(Collectors.toList());
List<TbsBudgetCostItem> hisBudgetCostItemList = tbsBudgetCostItemService.listByScheduleItemBudgetIds(scheduleItemBudgetIds);
Map<Long,List<TbsBudgetCostItem>> hisCostGroupByItemBudget = hisBudgetCostItemList.stream()
.collect(Collectors.groupingBy(TbsBudgetCostItem::getScheduleItemBudgetId));
// 构建预算费用占用明细
List<TbsActivityCenterGoods> centerGoodsList = tbsActivityCenterGoodsService.listByCostApplyId(costApplyId);
// 加载所有条件
List<TbsBudget> budgetList = tbsBudgetService.listByIds(budgetIds);
List<TbsBudget> noConditionBudgetList = new ArrayList<>();
boolean budgetNoCondition = this.loadConditionByBudgetsAndMatch(budgetList, noConditionBudgetList);
//活动拦截
this.handleNoBudgetActivity(throwEx, overspend, activityList, noBudgetActivityIds, budgetNoCondition);
//统计当前活动前置项占用预算
Map<Long,BigDecimal> counterMap = new HashMap<>();
//匹配预算主要方法
final List<TbsActivityCenterGoods> actMatchList = new ArrayList<>();
final List<TbsActivityCenterGoods> actUnMatchList = new ArrayList<>();
for (TbsActivityCenterGoods activityCostItem : centerGoodsList) {
this.matchActivityMain(activityCostItem,throwEx, overspend, activityList, hisCostGroupByItemBudget, budgetList, noConditionBudgetList, counterMap, actMatchList, actUnMatchList);
}
List<TbsBudgetCostItem> budgetCostItems1 = TbsBudgetCostUtil.createBudgetCostItems(actMatchList);
List<TbsBudgetCostItem> budgetCostItems2 = TbsBudgetCostUtil.createBudgetCostItems(actUnMatchList);
}
/**
* 匹配的主要方法
* @param activityCostItem
* @param throwEx
* @param overspend
* @param activityList
* @param hisCostGroupByItemBudget 历史费用组
* @param budgetList
* @param noConditionBudgetList
* @param counterMap
* @param actMatchList
* @param actUnMatchList
*/
private void matchActivityMain(TbsActivityCenterGoods activityCostItem,
Boolean throwEx,
boolean overspend,
List<TbsActivity> activityList,
Map<Long, List<TbsBudgetCostItem>> hisCostGroupByItemBudget,
List<TbsBudget> budgetList,
List<TbsBudget> noConditionBudgetList,
Map<Long, BigDecimal> counterMap,
final List<TbsActivityCenterGoods> actMatchList,
final List<TbsActivityCenterGoods> actUnMatchList) {
//PS:排序规则:优先匹配品牌条件,其次为时间条件
//按品类条件,提取可用预算(列表已按小维度到大维度排列)
List<TbsBudget> currentItemBudgetList = this.filterMatchGoodsCondition(budgetList, activityCostItem);
//关联无条件预算
currentItemBudgetList.addAll(noConditionBudgetList);
//提取可用预算的考核期
List<TbsScheduleItemBudget> currentScheduleItemBudgets = new ArrayList<>();
for (TbsActivity activity : activityList) {
for (TbsBudget budget : currentItemBudgetList) {
List<TbsScheduleItemBudget> scheduleItemBudgets = activity.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 = TbsBudgetCostUtil.totalHisCost(hisCostGroupByItemBudget.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());
isMatch = true;
//记录当前费用使用考核期费用
lastAmount = lastAmount.add(goodsAmount);
counterMap.put(itemBudget.getId(),lastAmount);
break;
}
}
//无匹配的预算
if(!isMatch){
if(overspend){
TbsScheduleItemBudget itemBudget = currentScheduleItemBudgets.get(0);
activityCostItem.setBudgetId(itemBudget.getBudgetId());
activityCostItem.setScheduleId(itemBudget.getScheduleId());
activityCostItem.setScheduleItemId(itemBudget.getScheduleItemId());
activityCostItem.setScheduleItemBudgetId(itemBudget.getId());
//记录当前费用使用考核期费用
BigDecimal lastAmount = counterMap.get(itemBudget.getId());
if(lastAmount==null){
lastAmount = BigDecimal.ZERO;
}
lastAmount = lastAmount.add(goodsAmount);
counterMap.put(itemBudget.getId(),lastAmount);
}else if (throwEx){
Assert.throwEx("品类["+ activityCostItem.getTargetName()+"]预算不足");
}
}
actMatchList.add(activityCostItem);
}else {
if(throwEx){
Assert.throwEx("品类["+ activityCostItem.getTargetName()+"]无可用预算");
}
if(overspend){
//添加到预算超支表
actUnMatchList.add(activityCostItem);
}
}
}
/**
* 按品类条件,提取可用预算
* @param budgetList
* @param activityCostItem
* @return
*/
@NotNull
private List<TbsBudget> filterMatchGoodsCondition(List<TbsBudget> budgetList,TbsActivityCenterGoods activityCostItem) {
String levelPath = activityCostItem.getTargetLevelPathIds();
Set<String> levelPathSet = new LinkedHashSet<>();
levelPathSet.add(levelPath);
TbsBudgetCostUtil.buildPaths(levelPath,levelPathSet);
List<TbsBudget> currentItemBudgetList = new ArrayList<>();
for (TbsBudget budget : budgetList) {
if(budget.getConditionFlag().equals(1)){
List<TbsBudgetCondition> budgetConditionListByBudget = budget.getBudgetConditionList();
boolean unMatch = true;
for (String conditionString : levelPathSet) {
if(unMatch){
for (TbsBudgetCondition budgetCondition : budgetConditionListByBudget) {
if(budgetCondition.getTargetLevelPathIds().contains(conditionString)){
currentItemBudgetList.add(budget);
unMatch = false;
break;
}
}
}
}
}
}
return currentItemBudgetList;
}
/**
* 1.加载所有的条件
* 2.匹配初无条件预算
* 3.预算条件关联到预算对象中
* @param budgetList
* @param noConditionBudgetList
* @return 含有无条件预算标识
*/
private boolean loadConditionByBudgetsAndMatch( List<TbsBudget> budgetList, List<TbsBudget> noConditionBudgetList) {
boolean budgetNoCondition = false;
for (TbsBudget budget : budgetList) {
if(budget.getConditionFlag().equals(1)){
List<TbsBudgetCondition> budgetConditionListByBudgetId = tbsBudgetConditionService.getByBudgetId(budget.getId());
budget.setBudgetConditionList(budgetConditionListByBudgetId);
}else {
budgetNoCondition = true;
noConditionBudgetList.add(budget);
}
}
return budgetNoCondition;
}
/**
* 拦截没有预算的活动
* @param throwEx 抛出异常
* @param overspend 超支
* @param activityList 活动列表
* @param noBudgetActivityIds 没有预算的活动id
* @param budgetNoCondition 标识没有条件的预算
*/
private void handleNoBudgetActivity(Boolean throwEx, boolean overspend, List<TbsActivity> activityList, List<Long> noBudgetActivityIds, boolean budgetNoCondition) {
if(!overspend && !budgetNoCondition && throwEx && noBudgetActivityIds.size()>0){
for (Long activityId : noBudgetActivityIds) {
for (TbsActivity activity : activityList) {
if(activity.getId().equals(activityId)){
Assert.throwEx("活动["+activity.getActivityCode()+"]无可用预算");
}
}
}
Assert.throwEx("活动无可用预算");
}
}
/**
* 1.通过活动加载所有满足条件的考核期(用于加载历史核销费用),
* 2.设置没有可用预算的活动id
* 3.设置匹配的考核期列表到活动中
* @param activityList
* @param budgetIds
* @param noBudgetActivityIds
*/
public List<TbsScheduleItemBudget> loadScheduleBudgetAndSetting(List<TbsActivity> activityList, List<Long> budgetIds, List<Long> noBudgetActivityIds) {
List<TbsScheduleItemBudget> scheduleItemList = new ArrayList<>();
Set<Long> budgetIdsSet = new HashSet<>();
Map<Long,TbsScheduleItemBudget> allAllowScheduleItemTempMap = new HashMap<>();
for (TbsActivity activity : activityList) {
List<TbsScheduleItemBudget> budgetItemList = tbsScheduleItemBudgetService
.betweenDateList(activity.getPreStartDate(),activity.getPreEndDate());
activity.setScheduleItemBudgetList(budgetItemList);
if(CollectionUtil.isNotEmpty(budgetItemList)){
for (TbsScheduleItemBudget item : budgetItemList) {
budgetIdsSet.add(item.getBudgetId());
allAllowScheduleItemTempMap.put(item.getId(),item);
}
}else {
noBudgetActivityIds.add(activity.getId());
}
}
for (Long tmpId : allAllowScheduleItemTempMap.keySet()) {
scheduleItemList.add(allAllowScheduleItemTempMap.get(tmpId));
}
budgetIds.addAll(budgetIdsSet);
return scheduleItemList;
}
}

4
src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetConditionService.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.TbsBudgetCondition; import com.qs.serve.modules.tbs.entity.TbsBudgetCondition;
import java.util.List;
/** /**
* 预算条件 服务接口 * 预算条件 服务接口
* @author YenHex * @author YenHex
@ -10,5 +10,7 @@ import com.qs.serve.modules.tbs.entity.TbsBudgetCondition;
*/ */
public interface TbsBudgetConditionService extends IService<TbsBudgetCondition> { public interface TbsBudgetConditionService extends IService<TbsBudgetCondition> {
List<TbsBudgetCondition> getByBudgetId(Long budgetId);
} }

19
src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetCostItemService.java

@ -0,0 +1,19 @@
package com.qs.serve.modules.tbs.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qs.serve.modules.tbs.entity.TbsBudgetCostItem;
import java.util.List;
/**
* 预算费用明细 服务接口
* @author YenHex
* @date 2022-12-02
*/
public interface TbsBudgetCostItemService extends IService<TbsBudgetCostItem> {
List<TbsBudgetCostItem> listByScheduleItemBudgetIds(List<Long> ids);
}

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

@ -1,8 +1,12 @@
package com.qs.serve.modules.tbs.service; package com.qs.serve.modules.tbs.service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget; import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget;
import java.time.LocalDate;
import java.util.List;
/** /**
* 预算考核期项 服务接口 * 预算考核期项 服务接口
* @author YenHex * @author YenHex
@ -10,5 +14,6 @@ import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget;
*/ */
public interface TbsScheduleItemBudgetService extends IService<TbsScheduleItemBudget> { public interface TbsScheduleItemBudgetService extends IService<TbsScheduleItemBudget> {
List<TbsScheduleItemBudget> betweenDateList(LocalDate startDate,LocalDate endDate);
} }

8
src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityCenterGoodsServiceImpl.java

@ -27,5 +27,13 @@ public class TbsActivityCenterGoodsServiceImpl extends ServiceImpl<TbsActivityCe
lqw.eq(TbsActivityCenterGoods::getActivityId,activityId); lqw.eq(TbsActivityCenterGoods::getActivityId,activityId);
return this.list(lqw); return this.list(lqw);
} }
@Override
public List<TbsActivityCenterGoods> listByCostApplyId(Long costApplyId) {
LambdaQueryWrapper<TbsActivityCenterGoods> lqw = new LambdaQueryWrapper<>();
lqw.eq(TbsActivityCenterGoods::getCostApplyId,costApplyId);
return this.list(lqw);
}
} }

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

@ -1,5 +1,6 @@
package com.qs.serve.modules.tbs.service.impl; package com.qs.serve.modules.tbs.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qs.serve.common.model.consts.SysConfigKey; import com.qs.serve.common.model.consts.SysConfigKey;
@ -17,6 +18,7 @@ import com.qs.serve.modules.sys.entity.SysConfig;
import com.qs.serve.modules.sys.entity.SysUser; import com.qs.serve.modules.sys.entity.SysUser;
import com.qs.serve.modules.sys.service.SysConfigService; import com.qs.serve.modules.sys.service.SysConfigService;
import com.qs.serve.modules.sys.service.SysUserService; import com.qs.serve.modules.sys.service.SysUserService;
import com.qs.serve.modules.tbs.common.TbsActivityState;
import com.qs.serve.modules.tbs.common.TbsCenterType; import com.qs.serve.modules.tbs.common.TbsCenterType;
import com.qs.serve.modules.tbs.common.TbsGoodsType; import com.qs.serve.modules.tbs.common.TbsGoodsType;
import com.qs.serve.modules.tbs.entity.*; import com.qs.serve.modules.tbs.entity.*;
@ -66,6 +68,13 @@ public class TbsActivityServiceImpl extends ServiceImpl<TbsActivityMapper,TbsAct
private final SysConfigService configService; private final SysConfigService configService;
@Override
public List<TbsActivity> listByCostApplyIdAndTodoState(Long id) {
LambdaQueryWrapper<TbsActivity> lqw = new LambdaQueryWrapper<>();
lqw.eq(TbsActivity::getCostApplyId,id);
lqw.eq(TbsActivity::getActivityState, TbsActivityState.STATE_0_Todo);
return this.list(lqw);
}
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@ -222,6 +231,9 @@ public class TbsActivityServiceImpl extends ServiceImpl<TbsActivityMapper,TbsAct
centerGoods.setCostApplyId(costApply.getId()); centerGoods.setCostApplyId(costApply.getId());
centerGoods.setCenterType(centerGoodsBo.getCenterType()); centerGoods.setCenterType(centerGoodsBo.getCenterType());
centerGoods.setCenterId(centerGoodsBo.getCenterId()); centerGoods.setCenterId(centerGoodsBo.getCenterId());
if(tbsCenterDto==null){
Assert.throwEx("部分成本中心不存在或被移除");
}
centerGoods.setCenterCode(tbsCenterDto.getCenterCode()); centerGoods.setCenterCode(tbsCenterDto.getCenterCode());
centerGoods.setCenterName(tbsCenterDto.getCenterName()); centerGoods.setCenterName(tbsCenterDto.getCenterName());
centerGoods.setCenterRate(tbsCenterDto.getCenterRate()); centerGoods.setCenterRate(tbsCenterDto.getCenterRate());
@ -358,9 +370,8 @@ public class TbsActivityServiceImpl extends ServiceImpl<TbsActivityMapper,TbsAct
List<TbsActivityGoods> activityGoodsList = new ArrayList<>(); List<TbsActivityGoods> activityGoodsList = new ArrayList<>();
String goodsType = activityBo.getActivityGoodsType(); String goodsType = activityBo.getActivityGoodsType();
if(goodsType.equals(TbsGoodsType.spu.name())){ if(goodsType.equals(TbsGoodsType.spu.name())){
List<Long> spuIds = activityBo.getActivityGoodsList().stream().map(TbsActivityGoodsBo::getGoodsId).collect(Collectors.toList()); for (TbsActivityGoodsBo goodsBo : activityBo.getActivityGoodsList()) {
List<GoodsSpu> spuList = goodsSpuService.listByIds(spuIds); GoodsSpu goodsSpu = goodsSpuService.getById(goodsBo.getGoodsId());
for (GoodsSpu goodsSpu : spuList) {
GoodsCategory category1 = goodsCategoryService.getById(goodsSpu.getCategoryFirst()); GoodsCategory category1 = goodsCategoryService.getById(goodsSpu.getCategoryFirst());
GoodsCategory category2 = goodsCategoryService.getById(goodsSpu.getCategorySecond()); GoodsCategory category2 = goodsCategoryService.getById(goodsSpu.getCategorySecond());
GoodsCategory category3 = goodsCategoryService.getById(goodsSpu.getCategoryThird()); GoodsCategory category3 = goodsCategoryService.getById(goodsSpu.getCategoryThird());
@ -373,12 +384,13 @@ public class TbsActivityServiceImpl extends ServiceImpl<TbsActivityMapper,TbsAct
activityGoods.setTargetName(goodsSpu.getName()); activityGoods.setTargetName(goodsSpu.getName());
activityGoods.setTargetLevelPathIds(category1.getId()+"_"+category2.getId()+"_"+category3.getId()+"_"+goodsSpu.getId()); activityGoods.setTargetLevelPathIds(category1.getId()+"_"+category2.getId()+"_"+category3.getId()+"_"+goodsSpu.getId());
activityGoods.setTargetLevelPathNames(category1.getName()+"_"+category2.getName()+"_"+category3.getName()+"_"+goodsSpu.getName()); activityGoods.setTargetLevelPathNames(category1.getName()+"_"+category2.getName()+"_"+category3.getName()+"_"+goodsSpu.getName());
activityGoods.setTmpUk(goodsBo.getTmpUk());
activityGoods.setRemark(goodsBo.getRemark());
activityGoodsList.add(activityGoods); activityGoodsList.add(activityGoods);
} }
}else if (goodsType.equals(TbsGoodsType.sku.name())){ }else if (goodsType.equals(TbsGoodsType.sku.name())){
List<Long> skuIds = activityBo.getActivityGoodsList().stream().map(TbsActivityGoodsBo::getGoodsId).collect(Collectors.toList()); for (TbsActivityGoodsBo goodsBo : activityBo.getActivityGoodsList()) {
List<GoodsSku> skuList = goodsSkuService.listByIds(skuIds); GoodsSku sku = goodsSkuService.getById(goodsBo.getGoodsId());
for (GoodsSku sku : skuList) {
GoodsSpu goodsSpu = goodsSpuService.getById(sku.getSpuId()); GoodsSpu goodsSpu = goodsSpuService.getById(sku.getSpuId());
GoodsCategory category1 = goodsCategoryService.getById(goodsSpu.getCategoryFirst()); GoodsCategory category1 = goodsCategoryService.getById(goodsSpu.getCategoryFirst());
GoodsCategory category2 = goodsCategoryService.getById(goodsSpu.getCategorySecond()); GoodsCategory category2 = goodsCategoryService.getById(goodsSpu.getCategorySecond());
@ -393,13 +405,14 @@ public class TbsActivityServiceImpl extends ServiceImpl<TbsActivityMapper,TbsAct
activityGoods.setTargetName(sku.getSpecInfos()); activityGoods.setTargetName(sku.getSpecInfos());
activityGoods.setTargetLevelPathIds(category1.getId()+"_"+category2.getId()+"_"+category3.getId()+"_"+goodsSpu.getId()+"_"+sku.getId()); activityGoods.setTargetLevelPathIds(category1.getId()+"_"+category2.getId()+"_"+category3.getId()+"_"+goodsSpu.getId()+"_"+sku.getId());
activityGoods.setTargetLevelPathNames(category1.getName()+"_"+category2.getName()+"_"+category3.getName()+"_"+goodsSpu.getName()+"_"+sku.getSpecInfos()); activityGoods.setTargetLevelPathNames(category1.getName()+"_"+category2.getName()+"_"+category3.getName()+"_"+goodsSpu.getName()+"_"+sku.getSpecInfos());
activityGoods.setTmpUk(goodsBo.getTmpUk());
activityGoods.setRemark(goodsBo.getRemark());
activityGoodsList.add(activityGoods); activityGoodsList.add(activityGoods);
} }
}else { }else {
//品牌、品类、系列 //品牌、品类、系列
List<Long> categoryIds = activityBo.getActivityGoodsList().stream().map(TbsActivityGoodsBo::getGoodsId).collect(Collectors.toList()); for (TbsActivityGoodsBo goodsBo : activityBo.getActivityGoodsList()) {
List<GoodsCategory> categoryList = goodsCategoryService.listByIds(categoryIds); GoodsCategory category = goodsCategoryService.getById(goodsBo.getGoodsId());
for (GoodsCategory category : categoryList) {
TbsActivityGoods activityGoods = new TbsActivityGoods(); TbsActivityGoods activityGoods = new TbsActivityGoods();
activityGoods.setCostApplyId(costApply.getId()); activityGoods.setCostApplyId(costApply.getId());
activityGoods.setActivityId(activity.getId()); activityGoods.setActivityId(activity.getId());
@ -409,6 +422,8 @@ public class TbsActivityServiceImpl extends ServiceImpl<TbsActivityMapper,TbsAct
activityGoods.setTargetName(category.getName()); activityGoods.setTargetName(category.getName());
activityGoods.setTargetLevelPathIds(category.getLevelPath()); activityGoods.setTargetLevelPathIds(category.getLevelPath());
activityGoods.setTargetLevelPathNames(category.getLevelPathNames()); activityGoods.setTargetLevelPathNames(category.getLevelPathNames());
activityGoods.setTmpUk(goodsBo.getTmpUk());
activityGoods.setRemark(goodsBo.getRemark());
activityGoodsList.add(activityGoods); activityGoodsList.add(activityGoods);
} }
} }

9
src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetConditionServiceImpl.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.TbsBudgetCondition;
import com.qs.serve.modules.tbs.service.TbsBudgetConditionService; import com.qs.serve.modules.tbs.service.TbsBudgetConditionService;
import com.qs.serve.modules.tbs.mapper.TbsBudgetConditionMapper; import com.qs.serve.modules.tbs.mapper.TbsBudgetConditionMapper;
import java.util.List;
/** /**
* 预算条件 服务实现类 * 预算条件 服务实现类
* @author YenHex * @author YenHex
@ -18,5 +21,11 @@ import com.qs.serve.modules.tbs.mapper.TbsBudgetConditionMapper;
@AllArgsConstructor @AllArgsConstructor
public class TbsBudgetConditionServiceImpl extends ServiceImpl<TbsBudgetConditionMapper,TbsBudgetCondition> implements TbsBudgetConditionService { public class TbsBudgetConditionServiceImpl extends ServiceImpl<TbsBudgetConditionMapper,TbsBudgetCondition> implements TbsBudgetConditionService {
@Override
public List<TbsBudgetCondition> getByBudgetId(Long budgetId) {
LambdaQueryWrapper<TbsBudgetCondition> lqw = new LambdaQueryWrapper<>();
lqw.le(TbsBudgetCondition::getBudgetId,budgetId);
return this.list(lqw);
}
} }

32
src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetCostItemServiceImpl.java

@ -0,0 +1,32 @@
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 lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import com.qs.serve.modules.tbs.entity.TbsBudgetCostItem;
import com.qs.serve.modules.tbs.service.TbsBudgetCostItemService;
import com.qs.serve.modules.tbs.mapper.TbsBudgetCostItemMapper;
import java.util.List;
/**
* 预算费用明细 服务实现类
* @author YenHex
* @since 2022-12-02
*/
@Slf4j
@Service
@AllArgsConstructor
public class TbsBudgetCostItemServiceImpl extends ServiceImpl<TbsBudgetCostItemMapper,TbsBudgetCostItem> implements TbsBudgetCostItemService {
@Override
public List<TbsBudgetCostItem> listByScheduleItemBudgetIds(List<Long> ids) {
LambdaQueryWrapper<TbsBudgetCostItem> costLqw = new LambdaQueryWrapper<>();
costLqw.in(TbsBudgetCostItem::getScheduleItemBudgetId,ids);
return this.list(costLqw);
}
}

10
src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetServiceImpl.java

@ -501,7 +501,15 @@ public class TbsBudgetServiceImpl extends ServiceImpl<TbsBudgetMapper,TbsBudget>
budgetConditions.addAll(buildCategoryCondition(budgetId, seriesIds, TbsGoodsType.series.name())); budgetConditions.addAll(buildCategoryCondition(budgetId, seriesIds, TbsGoodsType.series.name()));
budgetConditions.addAll(buildCategoryCondition(budgetId, categoryIds, TbsGoodsType.category.name())); budgetConditions.addAll(buildCategoryCondition(budgetId, categoryIds, TbsGoodsType.category.name()));
budgetConditions.addAll(buildCategoryCondition(budgetId, brandIds, TbsGoodsType.brand.name())); budgetConditions.addAll(buildCategoryCondition(budgetId, brandIds, TbsGoodsType.brand.name()));
budgetConditionService.saveBatch(budgetConditions); TbsBudget tbsBudget = new TbsBudget();
tbsBudget.setId(budgetId);
if(CollectionUtil.isNotEmpty(budgetConditions)){
budgetConditionService.saveBatch(budgetConditions);
tbsBudget.setConditionFlag(1);
}else {
tbsBudget.setConditionFlag(0);
}
this.updateById(tbsBudget);
} }
} }

12
src/main/java/com/qs/serve/modules/tbs/service/impl/TbsScheduleItemBudgetServiceImpl.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,9 @@ import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget;
import com.qs.serve.modules.tbs.service.TbsScheduleItemBudgetService; import com.qs.serve.modules.tbs.service.TbsScheduleItemBudgetService;
import com.qs.serve.modules.tbs.mapper.TbsScheduleItemBudgetMapper; import com.qs.serve.modules.tbs.mapper.TbsScheduleItemBudgetMapper;
import java.time.LocalDate;
import java.util.List;
/** /**
* 预算考核期项 服务实现类 * 预算考核期项 服务实现类
* @author YenHex * @author YenHex
@ -18,5 +22,13 @@ import com.qs.serve.modules.tbs.mapper.TbsScheduleItemBudgetMapper;
@AllArgsConstructor @AllArgsConstructor
public class TbsScheduleItemBudgetServiceImpl extends ServiceImpl<TbsScheduleItemBudgetMapper,TbsScheduleItemBudget> implements TbsScheduleItemBudgetService { public class TbsScheduleItemBudgetServiceImpl extends ServiceImpl<TbsScheduleItemBudgetMapper,TbsScheduleItemBudget> implements TbsScheduleItemBudgetService {
@Override
public List<TbsScheduleItemBudget> betweenDateList(LocalDate startDate, LocalDate endDate) {
LambdaQueryWrapper<TbsScheduleItemBudget> lqw = new LambdaQueryWrapper<>();
lqw.ge(TbsScheduleItemBudget::getStartDate,startDate);
lqw.le(TbsScheduleItemBudget::getEndDate,endDate);
return this.list(lqw);
}
} }

40
src/main/java/com/qs/serve/modules/vtb/controller/VtbVerificationController.java

@ -9,6 +9,15 @@ import com.qs.serve.common.model.enums.SystemModule;
import com.qs.serve.common.util.PageUtil; import com.qs.serve.common.util.PageUtil;
import com.qs.serve.common.util.CopierUtil; import com.qs.serve.common.util.CopierUtil;
import com.qs.serve.common.util.StringUtils; import com.qs.serve.common.util.StringUtils;
import com.qs.serve.modules.sys.entity.SysAttach;
import com.qs.serve.modules.sys.service.SysAttachService;
import com.qs.serve.modules.vtb.entity.VtbVerificationChannel;
import com.qs.serve.modules.vtb.entity.VtbVerificationChannelPoint;
import com.qs.serve.modules.vtb.entity.VtbVerificationSubject;
import com.qs.serve.modules.vtb.entity.so.VtbVerificationSubjectSo;
import com.qs.serve.modules.vtb.service.VtbVerificationChannelPointService;
import com.qs.serve.modules.vtb.service.VtbVerificationChannelService;
import com.qs.serve.modules.vtb.service.VtbVerificationSubjectService;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
@ -20,6 +29,7 @@ import com.qs.serve.modules.vtb.entity.VtbVerification;
import com.qs.serve.modules.vtb.service.VtbVerificationService; import com.qs.serve.modules.vtb.service.VtbVerificationService;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.Arrays;
import java.util.List; import java.util.List;
/** /**
@ -34,6 +44,17 @@ import java.util.List;
public class VtbVerificationController { public class VtbVerificationController {
private VtbVerificationService vtbVerificationService; private VtbVerificationService vtbVerificationService;
private VtbVerificationChannelService vtbVerificationChannelService;
private VtbVerificationChannelPointService vtbVerificationChannelPointService;
private VtbVerificationSubjectService vtbVerificationSubjectService;
private SysAttachService attachService;
@GetMapping("/oktest")
public R<?> test(Long id){
vtbVerificationService.successCommit(id);
return R.ok();
}
/** /**
* 列表 * 列表
@ -75,6 +96,23 @@ public class VtbVerificationController {
@PreAuthorize("hasRole('vtb:verification:query')") @PreAuthorize("hasRole('vtb:verification:query')")
public R<VtbVerification> getById(@PathVariable("id") String id){ public R<VtbVerification> getById(@PathVariable("id") String id){
VtbVerification vtbVerification = vtbVerificationService.getById(id); VtbVerification vtbVerification = vtbVerificationService.getById(id);
List<String> attachIds = Arrays.asList(vtbVerification.getAttachIds());
if(attachIds.size()>0){
List<SysAttach> attachList = attachService.listByIds(attachIds);
vtbVerification.setAttachList(attachList);
}
LambdaQueryWrapper<VtbVerificationChannel> channelLqw = new LambdaQueryWrapper<>();
channelLqw.eq(VtbVerificationChannel::getVerificationId,id);
List<VtbVerificationChannel> verificationChannelList = vtbVerificationChannelService.list(channelLqw);
vtbVerification.setChannelList(verificationChannelList);
LambdaQueryWrapper<VtbVerificationChannelPoint> channelPointLqw = new LambdaQueryWrapper<>();
channelPointLqw.eq(VtbVerificationChannelPoint::getVerificationId,id);
List<VtbVerificationChannelPoint> verificationChannelPointList = vtbVerificationChannelPointService.list(channelPointLqw);
vtbVerification.setPointList(verificationChannelPointList);
LambdaQueryWrapper<VtbVerificationSubject> subjectLqw = new LambdaQueryWrapper<>();
subjectLqw.eq(VtbVerificationSubject::getVerificationId,id);
List<VtbVerificationSubject> subjectList = vtbVerificationSubjectService.list(subjectLqw);
vtbVerification.setSubjectList(subjectList);
return R.ok(vtbVerification); return R.ok(vtbVerification);
} }
@ -87,7 +125,7 @@ public class VtbVerificationController {
*/ */
@PostMapping("/commit") @PostMapping("/commit")
@SysLog(module = SystemModule.Verification, title = "核销", biz = BizType.UPDATE) @SysLog(module = SystemModule.Verification, title = "核销", biz = BizType.UPDATE)
@PreAuthorize("hasRole('vtb:verification:update')") @PreAuthorize("hasRole('vtb:verification:commit')")
public R<?> updateById(@RequestBody @Valid VtbVerificationBo param){ public R<?> updateById(@RequestBody @Valid VtbVerificationBo param){
vtbVerificationService.commit(param); vtbVerificationService.commit(param);
return R.ok(); return R.ok();

13
src/main/java/com/qs/serve/modules/vtb/entity/VtbVerification.java

@ -4,12 +4,14 @@ import java.time.LocalDate;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List;
import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler;
import com.qs.serve.modules.sys.entity.SysAttach;
import lombok.Data; import lombok.Data;
import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.JdbcType;
import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.Length;
@ -77,5 +79,16 @@ public class VtbVerification implements Serializable {
@JsonProperty @JsonProperty
private String delFlag; private String delFlag;
@TableField(exist = false)
private List<?> attachList;
@TableField(exist = false)
List<?> channelList;
@TableField(exist = false)
List<?> pointList;
@TableField(exist = false)
List<?> subjectList;
} }

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

@ -241,7 +241,7 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe
currentTimeAmount = usedAmount.multiply(centerGoods.getCenterGoodsRate()) currentTimeAmount = usedAmount.multiply(centerGoods.getCenterGoodsRate())
.multiply(centerGoods.getCenterRate()) .multiply(centerGoods.getCenterRate())
//四舍五入保留两位小数 //四舍五入保留两位小数
.divide(new BigDecimal(10000), RoundingMode.HALF_UP).setScale(2); .divide(new BigDecimal(10000), RoundingMode.HALF_UP);
//防止费率为0情况 //防止费率为0情况
if(currentTimeAmount.compareTo(BigDecimal.ZERO)==0){ if(currentTimeAmount.compareTo(BigDecimal.ZERO)==0){
continue; continue;
@ -301,6 +301,7 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe
fundFlowService.saveBatch(addFundFlowList); fundFlowService.saveBatch(addFundFlowList);
//更新已用费用记录 //更新已用费用记录
fundFlowService.flushActivityAmount(verification.getActivityId()); fundFlowService.flushActivityAmount(verification.getActivityId());
//todo 远程调用第三方接口
} }

Loading…
Cancel
Save