diff --git a/src/main/java/com/qs/serve/modules/tbs/common/util/TbsBudgetCostUtil.java b/src/main/java/com/qs/serve/modules/tbs/common/util/TbsBudgetCostUtil.java index 386b4328..65320f3e 100644 --- a/src/main/java/com/qs/serve/modules/tbs/common/util/TbsBudgetCostUtil.java +++ b/src/main/java/com/qs/serve/modules/tbs/common/util/TbsBudgetCostUtil.java @@ -27,7 +27,7 @@ public class TbsBudgetCostUtil { BigDecimal total = BigDecimal.ZERO; if(CollectionUtil.isNotEmpty(budgetCostItems)){ for (TbsBudgetCostItem item : budgetCostItems) { - total = total.add(item.getMonthAmount()); + total = total.add(item.getCenterGoodsAmount()); } } return total; @@ -94,9 +94,11 @@ public class TbsBudgetCostUtil { 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); diff --git a/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostApplyController.java b/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostApplyController.java index 7362f58f..8647a128 100644 --- a/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostApplyController.java +++ b/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostApplyController.java @@ -25,6 +25,7 @@ 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.TbsCostApplyBo; +import com.qs.serve.modules.tbs.entity.dto.TbsBudgetCostResult; import com.qs.serve.modules.tbs.entity.vo.TbsCostApplyVo; import com.qs.serve.modules.tbs.service.*; import lombok.AllArgsConstructor; @@ -50,23 +51,22 @@ import java.util.stream.Collectors; @RequestMapping("tbs/costApply") public class TbsCostApplyController { - private TbsBudgetApplicationService tbsBudgetApplicationService; - private TbsCostApplyService tbsCostApplyService; private TbsActivityService tbsActivityService; - private TbsActivityCenterGoodsService tbsActivityCenterGoodsService; - - private TbsBudgetService tbsBudgetService; - private TbsBudgetConditionService tbsBudgetConditionService; - private TbsBudgetCostItemService tbsBudgetCostItemService; - private BmsSupplierService bmsSupplierService; - private SysUserService sysUserService; - private SysConfigService configService; - private SeeYonService seeYonService; + private TbsBudgetApplicationService budgetApplicationService; + + @GetMapping("test") + public R test(Long id,Integer ex,Integer tb){ + Boolean throwEx = ex == 1; + Boolean buildTableFlag = tb == 1; + TbsBudgetCostResult result = budgetApplicationService.buildBudgetCostResult(id,throwEx,buildTableFlag); + return R.ok(result); + } + /** * 列表 * @param param diff --git a/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenterGoods.java b/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenterGoods.java index 55ad7ef1..f2b8b4f8 100644 --- a/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenterGoods.java +++ b/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenterGoods.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.common.util.CopierUtil; import lombok.Data; import org.hibernate.validator.constraints.Length; import org.springframework.format.annotation.DateTimeFormat; @@ -206,5 +207,13 @@ public class TbsActivityCenterGoods implements Serializable { @TableField(exist = false) private Long scheduleItemBudgetId; + + public TbsBudgetCostItem toBudgetCostItem(){ + TbsBudgetCostItem budgetCostItem = CopierUtil.copy(this,new TbsBudgetCostItem()); + budgetCostItem.setId(null); + budgetCostItem.setCenterGoodItemId(this.getId()); + return budgetCostItem; + } + } diff --git a/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetCostItem.java b/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetCostItem.java index aee9001a..8c5e1a79 100644 --- a/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetCostItem.java +++ b/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetCostItem.java @@ -183,22 +183,6 @@ public class TbsBudgetCostItem implements Serializable { @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; diff --git a/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetAmountResult.java b/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetCostResult.java similarity index 53% rename from src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetAmountResult.java rename to src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetCostResult.java index e75259df..9f9ce2d9 100644 --- a/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetAmountResult.java +++ b/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetCostResult.java @@ -3,6 +3,8 @@ 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 com.qs.serve.modules.tbs.entity.TbsBudgetCostItem; +import com.qs.serve.modules.tbs.entity.vo.TbsBudgetTableVo; import lombok.Data; import org.hibernate.validator.constraints.Length; import org.springframework.format.annotation.DateTimeFormat; @@ -11,36 +13,22 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.List; /** * @author YenHex * @since 2022/12/5 */ @Data -public class TbsBudgetAmountResult { +public class TbsBudgetCostResult { - /** id */ - private Long scheduleItemBudgetId; + /** 匹配费用占用 */ + private List budgetMatchList; - /** 考核id */ - private Long scheduleId; + /** 超支预算 */ + private List budgetUnMatchList; - /** 考核项id */ - private Long scheduleItemId; - - /** 考核编码 */ - private String itemName; - - /** 开始时间 */ - private LocalDateTime startDate; - - /** 结束时间 */ - private LocalDateTime endDate; - - /** 预算id */ - private Long budgetId; - - /** 预算金额 */ - private BigDecimal budgetAmount; + /** 表数据封装 */ + private TbsBudgetTableVo tableData; } diff --git a/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsBudgetTableVo.java b/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsBudgetTableVo.java new file mode 100644 index 00000000..32eab276 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsBudgetTableVo.java @@ -0,0 +1,41 @@ +package com.qs.serve.modules.tbs.entity.vo; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + * @author YenHex + * @since 2022/12/6 + */ +@Data +public class TbsBudgetTableVo { + + private List topTheadHeaderList; + + private List leftTheadHeaderList; + + private List tableValueList; + + @Data + public static class LeftTheadHeader{ + private String id; + private String label; + } + + @Data + public static class TopTheadHeader{ + private String id; + private String label; + private BigDecimal budgetAmount; + } + + @Data + public static class TableValue{ + private String topId; + private String leftId; + private BigDecimal value; + } + +} diff --git a/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityService.java b/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityService.java index afe8e894..4732d55a 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityService.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityService.java @@ -18,7 +18,7 @@ public interface TbsActivityService extends IService { * @param id * @return */ - List listByCostApplyIdAndTodoState(Long id); + List listByCostApplyId(Long id); /** * 修改 diff --git a/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetApplicationService.java b/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetApplicationService.java index 3fc727d7..220ccc3a 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetApplicationService.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetApplicationService.java @@ -9,6 +9,8 @@ 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 com.qs.serve.modules.tbs.entity.dto.TbsBudgetCostResult; +import com.qs.serve.modules.tbs.entity.vo.TbsBudgetTableVo; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; @@ -49,12 +51,19 @@ public class TbsBudgetApplicationService { * * @param costApplyId * @param throwEx 是否需要抛出异常 + * @param buildTableFlag 创建表VO */ - public void commit(Long costApplyId,Boolean throwEx){ + public TbsBudgetCostResult buildBudgetCostResult(Long costApplyId,Boolean throwEx,Boolean buildTableFlag){ //允许超出预算标识 boolean overspend = configService.getByKey(SysConfigKey.TbsBudgetOverspend).getConfigValue().equals("1"); - //加载待核销活动 - List activityList = tbsActivityService.listByCostApplyIdAndTodoState(costApplyId); + //加载活动 + List activityList = tbsActivityService.listByCostApplyId(costApplyId); + if(activityList.size()<1){ + if(throwEx){ + Assert.throwEx("当前费用未设置活动"); + } + return null; + } //考核期有关的预算id,判断逻辑为活动需要允许在 List budgetIds = new ArrayList<>(); //没有预算的活动 @@ -69,7 +78,7 @@ public class TbsBudgetApplicationService { // 构建预算费用占用明细 List centerGoodsList = tbsActivityCenterGoodsService.listByCostApplyId(costApplyId); // 加载所有条件 - List budgetList = tbsBudgetService.listByIds(budgetIds); + List budgetList = budgetIds.size()>0?tbsBudgetService.listByIds(budgetIds):new ArrayList<>(); List noConditionBudgetList = new ArrayList<>(); boolean budgetNoCondition = this.loadConditionByBudgetsAndMatch(budgetList, noConditionBudgetList); //活动拦截 @@ -80,10 +89,108 @@ public class TbsBudgetApplicationService { final List actMatchList = new ArrayList<>(); final List actUnMatchList = new ArrayList<>(); for (TbsActivityCenterGoods activityCostItem : centerGoodsList) { - this.matchActivityMain(activityCostItem,throwEx, overspend, activityList, hisCostGroupByItemBudget, budgetList, noConditionBudgetList, counterMap, actMatchList, actUnMatchList); + this.matchActivityMain(activityCostItem,throwEx, overspend, activityList, hisCostGroupByItemBudget, budgetList, + noConditionBudgetList, counterMap, actMatchList, actUnMatchList); + } + List budgetMatchList = actMatchList.stream() + .map(TbsActivityCenterGoods::toBudgetCostItem).collect(Collectors.toList()); + List budgetUnMatchList = actUnMatchList.stream() + .map(TbsActivityCenterGoods::toBudgetCostItem).collect(Collectors.toList()); + TbsBudgetTableVo tableVo = null; + if(buildTableFlag){ + //构建tableDTO + tableVo = this.buildBudgetTableVo(activityList, scheduleItemList, hisCostGroupByItemBudget, budgetList, budgetMatchList, budgetUnMatchList); + } + TbsBudgetCostResult result = new TbsBudgetCostResult(); + result.setBudgetMatchList(budgetMatchList); + result.setBudgetUnMatchList(budgetUnMatchList); + result.setTableData(tableVo); + return result; + } + + /** + * 建立费用预算表 + * @param activityList + * @param scheduleItemList + * @param hisCostGroupByItemBudget + * @param budgetList + * @param budgetMatchList + * @param budgetUnMatchList + * @return + */ + private TbsBudgetTableVo buildBudgetTableVo(List activityList, + List scheduleItemList, + Map> hisCostGroupByItemBudget, + List budgetList, + List budgetMatchList, + List budgetUnMatchList) { + List allBudgetItem = new ArrayList<>(); + allBudgetItem.addAll(budgetMatchList); + allBudgetItem.addAll(budgetUnMatchList); + + TbsBudgetTableVo tableVo = new TbsBudgetTableVo(); + List topTheadHeaders = new ArrayList<>(); + Map> tmpMap = allBudgetItem.stream().collect(Collectors.groupingBy(TbsBudgetCostItem::getScheduleItemBudgetId)); + for (Long scheduleItemBudgetId : tmpMap.keySet()) { + TbsBudgetCostItem itemBudget = tmpMap.get(scheduleItemBudgetId).get(0); + String budgetCode = null; + for (TbsBudget budget : budgetList) { + if(budget.getId().equals(itemBudget.getBudgetId())){ + budgetCode = budget.getBudgetCode(); + break; + } + } + BigDecimal budgetAmount = BigDecimal.ZERO; + String scheduleItemName = null; + for (TbsScheduleItemBudget scheduleItemBudget : scheduleItemList) { + if(scheduleItemBudget.getId().equals(scheduleItemBudgetId)){ + budgetAmount = scheduleItemBudget.getBudgetAmount(); + scheduleItemName = scheduleItemBudget.getItemName(); + break; + } + } + + TbsBudgetTableVo.TopTheadHeader theadHeader = new TbsBudgetTableVo.TopTheadHeader(); + theadHeader.setId(scheduleItemBudgetId+""); + theadHeader.setLabel(budgetCode+"("+scheduleItemName+")"); + BigDecimal totalUsed = TbsBudgetCostUtil.totalHisCost(hisCostGroupByItemBudget.get(itemBudget.getId())); + theadHeader.setBudgetAmount(budgetAmount.subtract(totalUsed)); + topTheadHeaders.add(theadHeader); + } + //自定义超额预算 + TbsBudgetTableVo.TopTheadHeader overTopHeader = new TbsBudgetTableVo.TopTheadHeader(); + overTopHeader.setId("0"); + overTopHeader.setLabel("超额预算"); + overTopHeader.setBudgetAmount(BigDecimal.ZERO); + topTheadHeaders.add(overTopHeader); + + List leftTheadHeaders = new ArrayList<>(); + for (TbsBudgetCostItem centerGoods : allBudgetItem) { + TbsActivity activity = null; + for (TbsActivity obj : activityList) { + if(obj.getId().equals(centerGoods.getActivityId())){ + activity = obj; + } + } + TbsBudgetTableVo.LeftTheadHeader theadHeader = new TbsBudgetTableVo.LeftTheadHeader(); + theadHeader.setId(centerGoods.getCenterGoodItemId()+""); + String label = (activity==null?centerGoods.getActivityId():activity.getActivityCode())+"-"+centerGoods.getCenterName()+"-" + +centerGoods.getSubjectName()+"-"+centerGoods.getTargetName(); + theadHeader.setLabel(label); + leftTheadHeaders.add(theadHeader); + } + List tableValueList = new ArrayList<>(); + for (TbsBudgetCostItem costItem : allBudgetItem) { + TbsBudgetTableVo.TableValue tableValue = new TbsBudgetTableVo.TableValue(); + tableValue.setTopId(costItem.getScheduleItemBudgetId()+""); + tableValue.setLeftId(costItem.getCenterGoodItemId()+""); + tableValue.setValue(costItem.getCenterGoodsAmount()); + tableValueList.add(tableValue); } - List budgetCostItems1 = TbsBudgetCostUtil.createBudgetCostItems(actMatchList); - List budgetCostItems2 = TbsBudgetCostUtil.createBudgetCostItems(actUnMatchList); + tableVo.setTableValueList(tableValueList); + tableVo.setTopTheadHeaderList(topTheadHeaders); + tableVo.setLeftTheadHeaderList(leftTheadHeaders); + return tableVo; } /** @@ -178,6 +285,10 @@ public class TbsBudgetApplicationService { } if(overspend){ //添加到预算超支表 + activityCostItem.setBudgetId(0L); + activityCostItem.setScheduleId(0L); + activityCostItem.setScheduleItemId(0L); + activityCostItem.setScheduleItemBudgetId(0L); actUnMatchList.add(activityCostItem); } } @@ -246,7 +357,8 @@ public class TbsBudgetApplicationService { * @param noBudgetActivityIds 没有预算的活动id * @param budgetNoCondition 标识,没有条件的预算 */ - private void handleNoBudgetActivity(Boolean throwEx, boolean overspend, List activityList, List noBudgetActivityIds, boolean budgetNoCondition) { + private void handleNoBudgetActivity(Boolean throwEx, boolean overspend, List activityList, + List noBudgetActivityIds, boolean budgetNoCondition) { if(!overspend && !budgetNoCondition && throwEx && noBudgetActivityIds.size()>0){ for (Long activityId : noBudgetActivityIds) { for (TbsActivity activity : activityList) { @@ -267,7 +379,8 @@ public class TbsBudgetApplicationService { * @param budgetIds * @param noBudgetActivityIds */ - public List loadScheduleBudgetAndSetting(List activityList, List budgetIds, List noBudgetActivityIds) { + public List loadScheduleBudgetAndSetting(List activityList, + List budgetIds, List noBudgetActivityIds) { List scheduleItemList = new ArrayList<>(); Set budgetIdsSet = new HashSet<>(); Map allAllowScheduleItemTempMap = new HashMap<>(); diff --git a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityServiceImpl.java b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityServiceImpl.java index f800b7c0..fa2142dd 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityServiceImpl.java @@ -69,10 +69,10 @@ public class TbsActivityServiceImpl extends ServiceImpl listByCostApplyIdAndTodoState(Long id) { + public List listByCostApplyId(Long id) { LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); lqw.eq(TbsActivity::getCostApplyId,id); - lqw.eq(TbsActivity::getActivityState, TbsActivityState.STATE_0_Todo); + //lqw.eq(TbsActivity::getActivityState, TbsActivityState.STATE_0_Todo); return this.list(lqw); } diff --git a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetCostItemServiceImpl.java b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetCostItemServiceImpl.java index 1d4e0af4..243bee9d 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetCostItemServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetCostItemServiceImpl.java @@ -2,6 +2,7 @@ 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.qs.serve.common.util.CollectionUtil; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -9,6 +10,7 @@ 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.ArrayList; import java.util.List; /** @@ -23,9 +25,12 @@ public class TbsBudgetCostItemServiceImpl extends ServiceImpl listByScheduleItemBudgetIds(List ids) { - LambdaQueryWrapper costLqw = new LambdaQueryWrapper<>(); - costLqw.in(TbsBudgetCostItem::getScheduleItemBudgetId,ids); - return this.list(costLqw); + if(CollectionUtil.isNotEmpty(ids)){ + LambdaQueryWrapper costLqw = new LambdaQueryWrapper<>(); + costLqw.in(TbsBudgetCostItem::getScheduleItemBudgetId,ids); + return this.list(costLqw); + } + return new ArrayList<>(); } } diff --git a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsScheduleItemBudgetServiceImpl.java b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsScheduleItemBudgetServiceImpl.java index 12f04d9a..82f2d324 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsScheduleItemBudgetServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsScheduleItemBudgetServiceImpl.java @@ -25,8 +25,8 @@ public class TbsScheduleItemBudgetServiceImpl extends ServiceImpl betweenDateList(LocalDate startDate, LocalDate endDate) { LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); - lqw.ge(TbsScheduleItemBudget::getStartDate,startDate); - lqw.le(TbsScheduleItemBudget::getEndDate,endDate); + lqw.le(TbsScheduleItemBudget::getStartDate,startDate); + lqw.ge(TbsScheduleItemBudget::getEndDate,endDate); return this.list(lqw); }