diff --git a/src/main/java/com/qs/serve/common/model/consts/SysConfigKey.java b/src/main/java/com/qs/serve/common/model/consts/SysConfigKey.java index 01af48e2..cc1dad62 100644 --- a/src/main/java/com/qs/serve/common/model/consts/SysConfigKey.java +++ b/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 { - /** - * 费用超支 - */ - String TbsBudgetOverspend = "budget-overspend"; + /** 费用超支 */ + String TbsBudgetOverspend = "TbsBudgetOverspend"; + /** 活动预计核销日期 */ String ActivityPreCheckDays = "ActivityPreCheckDays"; } diff --git a/src/main/java/com/qs/serve/modules/bms/controller/BmsRegionUserController.java b/src/main/java/com/qs/serve/modules/bms/controller/BmsRegionUserController.java index b8aead8b..7ac96081 100644 --- a/src/main/java/com/qs/serve/modules/bms/controller/BmsRegionUserController.java +++ b/src/main/java/com/qs/serve/modules/bms/controller/BmsRegionUserController.java @@ -48,6 +48,11 @@ public class BmsRegionUserController { private BmsRegionService bmsRegionService; private SysUserService sysUserService; + public R commentRegionList(){ + + return R.ok(); + } + /** * 列表 * @param param diff --git a/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierController.java b/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierController.java index 52cd0c88..9deeedc0 100644 --- a/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierController.java +++ b/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierController.java @@ -329,7 +329,7 @@ public class BmsSupplierController { @GetMapping("/getById/{id}") @SysLog(module = SystemModule.BASE, title = "供应商", biz = BizType.QUERY) @PreAuthorize("hasRole('bms:supplier:query')") - public R getById(@PathVariable("id") String id){ + public R getById(@PathVariable("id") String id,Integer loadRegionInfo){ BmsSupplier bmsSupplier = bmsSupplierService.getById(id); if(StringUtils.hasText(bmsSupplier.getPid())&&!bmsSupplier.getPid().equals("0")){ BmsSupplier parentInfo = bmsSupplierService.getById(bmsSupplier.getPid()); @@ -361,6 +361,24 @@ public class BmsSupplierController { }).collect(Collectors.toList()); 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); return R.ok(bmsSupplier); } diff --git a/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplier.java b/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplier.java index ba4743cd..2a1140a7 100644 --- a/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplier.java +++ b/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplier.java @@ -184,6 +184,39 @@ public class BmsSupplier implements Serializable { @TableField(exist = false) 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){ HisUserSupplier userSupplier = new HisUserSupplier(); userSupplier.setUserId(userId); diff --git a/src/main/java/com/qs/serve/modules/tbs/common/TbsActivityState.java b/src/main/java/com/qs/serve/modules/tbs/common/TbsActivityState.java new file mode 100644 index 00000000..639499e1 --- /dev/null +++ b/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; + +} 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 new file mode 100644 index 00000000..386b4328 --- /dev/null +++ b/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 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 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 stringSet = new LinkedHashSet<>(); + buildPaths(aa,stringSet); + stringSet.forEach(System.out::println); + } + + /** + * 按月份创建预算占用明细 + * @param centerGoodsList + * @return + */ + @NotNull + public static List createBudgetCostItems(List centerGoodsList) { + List 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; + } + +} diff --git a/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController.java b/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController.java index d3db8ac5..93e25bcb 100644 --- a/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController.java +++ b/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.PageUtil; 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.entity.*; 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 javax.validation.Valid; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -65,6 +68,7 @@ public class TbsActivityController { LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); List list = tbsActivityService.list(lqw); for (TbsActivity activity : list) { + //todo 核销状态 QueryWrapper qw = new QueryWrapper<>(); qw.eq("activity_id",activity.getId()); List goodsList = activityGoodsService.list(qw); @@ -229,6 +233,13 @@ public class TbsActivityController { TbsActivity activity = new TbsActivity(); activity.setId(param.getActivityId()); 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); return R.ok(); } 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 7f663876..7362f58f 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 @@ -2,6 +2,7 @@ package com.qs.serve.modules.tbs.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.R; 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.service.SeeYonService; 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.TbsCostApplyState; 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.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.extern.slf4j.Slf4j; import org.springframework.security.access.prepost.PreAuthorize; 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 java.math.BigDecimal; import java.time.LocalDateTime; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.time.temporal.ChronoField; +import java.util.*; import java.util.stream.Collectors; /** @@ -50,10 +50,21 @@ 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 TbsActivityService tbsActivityService; + private SysConfigService configService; + private SeeYonService seeYonService; /** @@ -107,17 +118,35 @@ public class TbsCostApplyController { @PostMapping("/commit/{id}") @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(); + public R commit(@PathVariable("id") String id){ + TbsCostApply tbsCostApply = tbsCostApplyService.getById(id); + if(!tbsCostApply.getChargeState().equals(TbsCostApplyState.State_0_unPublish.getCode()) + ||!tbsCostApply.getChargeState().equals(TbsCostApplyState.State_4_refused.getCode())){ + return R.error("操作失败,申请费用状态不支持"); } + + +// //统计预算dto +// for (TbsBudgetCostItem costItem : budgetCostItems) { +// List budgetItemList = costItem.getTempScheduleItemDtoList(); +// //无可用预算拦截 +// if(budgetItemList.size()<1){ +// +// }else { +// for (TbsScheduleItemBudget itemBudget : budgetItemList) { +// +// } +// } +// //加载已用预算 +// List budgetIdsByItem = budgetItemList.stream() +// .map(TbsScheduleItemBudget::getBudgetId).distinct().collect(Collectors.toList()); +// List budgetListByItem = budgetList.stream() +// .filter(budget-> budgetIdsByItem.contains(budget.getId())).collect(Collectors.toList()); +// +// } + + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); - TbsCostApply tbsCostApply = tbsCostApplyService.getById(id); if(tbsCostApply.getChargeState().equals(TbsCostApplyState.State_0_unPublish.getCode())){ Map data = new HashMap<>(10); data.put("empId",sysUser.getCode()); @@ -145,7 +174,7 @@ public class TbsCostApplyController { costApply.setSyFlowId(flowId); costApply.setSyFormId(formId); tbsCostApplyService.updateById(costApply); - //todo 扣除预算 + //todo 更新并占用预算 return R.ok(); }else if (tbsCostApply.getChargeState().equals(TbsCostApplyState.State_4_refused.getCode())){ //todo 驳回重新申请 @@ -213,7 +242,7 @@ public class TbsCostApplyController { } /** - * 申请审批表单(翻页) + * 审批节点列表(翻页) * @param state 状态:0-未完成与已完成;1-未完成;2已完成;其它-加载所有 * @param pageNum * @param pageSize @@ -257,7 +286,7 @@ public class TbsCostApplyController { } /** - * 审批节点 + * 提交审批节点 * @return */ @PostMapping("/commitAffair") diff --git a/src/main/java/com/qs/serve/modules/tbs/controller/TbsScheduleController.java b/src/main/java/com/qs/serve/modules/tbs/controller/TbsScheduleController.java index 98c5c9e5..97b87051 100644 --- a/src/main/java/com/qs/serve/modules/tbs/controller/TbsScheduleController.java +++ b/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.TbsScheduleItem; 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 lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivity.java b/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivity.java index e21a58cf..1e230d32 100644 --- a/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivity.java +++ b/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivity.java @@ -35,6 +35,9 @@ public class TbsActivity implements Serializable { /** 编码 */ private String activityCode; + /** 活动状态:0-待核销;1-审批中;2-完成;3-冻结 */ + private Integer activityState; + /** 费用申请id */ @NotNull(message = "费用申请id不能为空") private Long costApplyId; @@ -119,7 +122,7 @@ public class TbsActivity implements Serializable { @JsonProperty private String delFlag; - /** 释放标识 */ + /** 完成标识 */ private Integer finishedFlag; /** 合计金额 */ @@ -179,9 +182,9 @@ public class TbsActivity implements Serializable { @TableField(exist = false) private List subjectCenterList; - /** 显示释放费用按钮 */ + /** 后端参数,预算考核期 */ @TableField(exist = false) - private Integer showReleaseButton; + List scheduleItemBudgetList; } 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 5418a42d..55ad7ef1 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 @@ -190,5 +190,21 @@ public class TbsActivityCenterGoods implements Serializable { @TableField(exist = false) 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; + } diff --git a/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudget.java b/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudget.java index 650270fc..d3a50a98 100644 --- a/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudget.java +++ b/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.math.BigDecimal; import java.time.LocalDateTime; +import java.util.List; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; @@ -86,6 +87,9 @@ public class TbsBudget implements Serializable { @Length(max = 255,message = "备注长度不能超过255字") private String remark; + /** 条件标识 */ + private Integer conditionFlag; + /** 创建时间 */ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") @@ -116,6 +120,9 @@ public class TbsBudget implements Serializable { @JsonProperty private String delFlag; + /** 后端传输dto */ + @TableField(exist = false) + private List budgetConditionList; } 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 new file mode 100644 index 00000000..aee9001a --- /dev/null +++ b/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 tempScheduleItemDtoList; + +} + diff --git a/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityReopenBo.java b/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityReopenBo.java index 27eacc18..10bc0759 100644 --- a/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityReopenBo.java +++ b/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityReopenBo.java @@ -11,6 +11,9 @@ public class TbsActivityReopenBo { private Long activityId; + /** + * 0-关闭;1-打开 + */ private Integer state; } 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/TbsBudgetAmountResult.java new file mode 100644 index 00000000..e75259df --- /dev/null +++ b/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; + +} diff --git a/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetCostItemMapper.java b/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetCostItemMapper.java new file mode 100644 index 00000000..912199d8 --- /dev/null +++ b/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 { + +} + diff --git a/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityCenterGoodsService.java b/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityCenterGoodsService.java index 9d15d099..0809b704 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityCenterGoodsService.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityCenterGoodsService.java @@ -13,5 +13,7 @@ public interface TbsActivityCenterGoodsService extends IService listByActivityId(Long activityId); + List listByCostApplyId(Long costApplyId); + } 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 1eb332af..afe8e894 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 @@ -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.bo.TbsActivityBo; +import java.util.List; + /** * 费用活动 服务接口 * @author YenHex @@ -11,6 +13,13 @@ import com.qs.serve.modules.tbs.entity.bo.TbsActivityBo; */ public interface TbsActivityService extends IService { + /** + * 申请活动加载列表 + * @param id + * @return + */ + List listByCostApplyIdAndTodoState(Long id); + /** * 修改 * @param activityBo 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 new file mode 100644 index 00000000..3fc727d7 --- /dev/null +++ b/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 activityList = tbsActivityService.listByCostApplyIdAndTodoState(costApplyId); + //考核期有关的预算id,判断逻辑为活动需要允许在 + List budgetIds = new ArrayList<>(); + //没有预算的活动 + List noBudgetActivityIds = new ArrayList<>(); + //所有满足条件的考核期,用于加载历史核销费用 + List scheduleItemList = this.loadScheduleBudgetAndSetting(activityList, budgetIds, noBudgetActivityIds); + //加载预算占用历史 + List scheduleItemBudgetIds = scheduleItemList.stream().map(TbsScheduleItemBudget::getId).collect(Collectors.toList()); + List hisBudgetCostItemList = tbsBudgetCostItemService.listByScheduleItemBudgetIds(scheduleItemBudgetIds); + Map> hisCostGroupByItemBudget = hisBudgetCostItemList.stream() + .collect(Collectors.groupingBy(TbsBudgetCostItem::getScheduleItemBudgetId)); + // 构建预算费用占用明细 + List centerGoodsList = tbsActivityCenterGoodsService.listByCostApplyId(costApplyId); + // 加载所有条件 + List budgetList = tbsBudgetService.listByIds(budgetIds); + List noConditionBudgetList = new ArrayList<>(); + boolean budgetNoCondition = this.loadConditionByBudgetsAndMatch(budgetList, noConditionBudgetList); + //活动拦截 + this.handleNoBudgetActivity(throwEx, overspend, activityList, noBudgetActivityIds, budgetNoCondition); + //统计当前活动前置项占用预算 + Map counterMap = new HashMap<>(); + //匹配预算主要方法 + 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); + } + List budgetCostItems1 = TbsBudgetCostUtil.createBudgetCostItems(actMatchList); + List 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 activityList, + Map> hisCostGroupByItemBudget, + List budgetList, + List noConditionBudgetList, + Map counterMap, + final List actMatchList, + final List actUnMatchList) { + //PS:排序规则:优先匹配品牌条件,其次为时间条件 + //按品类条件,提取可用预算(列表已按小维度到大维度排列) + List currentItemBudgetList = this.filterMatchGoodsCondition(budgetList, activityCostItem); + //关联无条件预算 + currentItemBudgetList.addAll(noConditionBudgetList); + //提取可用预算的考核期 + List currentScheduleItemBudgets = new ArrayList<>(); + for (TbsActivity activity : activityList) { + for (TbsBudget budget : currentItemBudgetList) { + List 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 filterMatchGoodsCondition(List budgetList,TbsActivityCenterGoods activityCostItem) { + String levelPath = activityCostItem.getTargetLevelPathIds(); + Set levelPathSet = new LinkedHashSet<>(); + levelPathSet.add(levelPath); + TbsBudgetCostUtil.buildPaths(levelPath,levelPathSet); + List currentItemBudgetList = new ArrayList<>(); + for (TbsBudget budget : budgetList) { + if(budget.getConditionFlag().equals(1)){ + List 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 budgetList, List noConditionBudgetList) { + boolean budgetNoCondition = false; + for (TbsBudget budget : budgetList) { + if(budget.getConditionFlag().equals(1)){ + List 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 activityList, List 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 loadScheduleBudgetAndSetting(List activityList, List budgetIds, List noBudgetActivityIds) { + List scheduleItemList = new ArrayList<>(); + Set budgetIdsSet = new HashSet<>(); + Map allAllowScheduleItemTempMap = new HashMap<>(); + for (TbsActivity activity : activityList) { + List 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; + } +} diff --git a/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetConditionService.java b/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetConditionService.java index 9d41f517..20ba2195 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetConditionService.java +++ b/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.qs.serve.modules.tbs.entity.TbsBudgetCondition; - +import java.util.List; /** * 预算条件 服务接口 * @author YenHex @@ -10,5 +10,7 @@ import com.qs.serve.modules.tbs.entity.TbsBudgetCondition; */ public interface TbsBudgetConditionService extends IService { + List getByBudgetId(Long budgetId); + } diff --git a/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetCostItemService.java b/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetCostItemService.java new file mode 100644 index 00000000..e33db5a8 --- /dev/null +++ b/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 { + + + + List listByScheduleItemBudgetIds(List ids); +} + diff --git a/src/main/java/com/qs/serve/modules/tbs/service/TbsScheduleItemBudgetService.java b/src/main/java/com/qs/serve/modules/tbs/service/TbsScheduleItemBudgetService.java index b8ee923c..e434159c 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/TbsScheduleItemBudgetService.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/TbsScheduleItemBudgetService.java @@ -1,8 +1,12 @@ package com.qs.serve.modules.tbs.service; +import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.extension.service.IService; import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget; +import java.time.LocalDate; +import java.util.List; + /** * 预算考核期项 服务接口 * @author YenHex @@ -10,5 +14,6 @@ import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget; */ public interface TbsScheduleItemBudgetService extends IService { + List betweenDateList(LocalDate startDate,LocalDate endDate); } diff --git a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityCenterGoodsServiceImpl.java b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityCenterGoodsServiceImpl.java index 2d690fe3..04e4da5e 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityCenterGoodsServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityCenterGoodsServiceImpl.java @@ -27,5 +27,13 @@ public class TbsActivityCenterGoodsServiceImpl extends ServiceImpl listByCostApplyId(Long costApplyId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsActivityCenterGoods::getCostApplyId,costApplyId); + return this.list(lqw); + } + } 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 a883ceb3..f800b7c0 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 @@ -1,5 +1,6 @@ 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.extension.service.impl.ServiceImpl; 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.service.SysConfigService; 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.TbsGoodsType; import com.qs.serve.modules.tbs.entity.*; @@ -66,6 +68,13 @@ public class TbsActivityServiceImpl extends ServiceImpl listByCostApplyIdAndTodoState(Long id) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsActivity::getCostApplyId,id); + lqw.eq(TbsActivity::getActivityState, TbsActivityState.STATE_0_Todo); + return this.list(lqw); + } @Override @Transactional(rollbackFor = Exception.class) @@ -222,6 +231,9 @@ public class TbsActivityServiceImpl extends ServiceImpl activityGoodsList = new ArrayList<>(); String goodsType = activityBo.getActivityGoodsType(); if(goodsType.equals(TbsGoodsType.spu.name())){ - List spuIds = activityBo.getActivityGoodsList().stream().map(TbsActivityGoodsBo::getGoodsId).collect(Collectors.toList()); - List spuList = goodsSpuService.listByIds(spuIds); - for (GoodsSpu goodsSpu : spuList) { + for (TbsActivityGoodsBo goodsBo : activityBo.getActivityGoodsList()) { + GoodsSpu goodsSpu = goodsSpuService.getById(goodsBo.getGoodsId()); GoodsCategory category1 = goodsCategoryService.getById(goodsSpu.getCategoryFirst()); GoodsCategory category2 = goodsCategoryService.getById(goodsSpu.getCategorySecond()); GoodsCategory category3 = goodsCategoryService.getById(goodsSpu.getCategoryThird()); @@ -373,12 +384,13 @@ public class TbsActivityServiceImpl extends ServiceImpl skuIds = activityBo.getActivityGoodsList().stream().map(TbsActivityGoodsBo::getGoodsId).collect(Collectors.toList()); - List skuList = goodsSkuService.listByIds(skuIds); - for (GoodsSku sku : skuList) { + for (TbsActivityGoodsBo goodsBo : activityBo.getActivityGoodsList()) { + GoodsSku sku = goodsSkuService.getById(goodsBo.getGoodsId()); GoodsSpu goodsSpu = goodsSpuService.getById(sku.getSpuId()); GoodsCategory category1 = goodsCategoryService.getById(goodsSpu.getCategoryFirst()); GoodsCategory category2 = goodsCategoryService.getById(goodsSpu.getCategorySecond()); @@ -393,13 +405,14 @@ public class TbsActivityServiceImpl extends ServiceImpl categoryIds = activityBo.getActivityGoodsList().stream().map(TbsActivityGoodsBo::getGoodsId).collect(Collectors.toList()); - List categoryList = goodsCategoryService.listByIds(categoryIds); - for (GoodsCategory category : categoryList) { + for (TbsActivityGoodsBo goodsBo : activityBo.getActivityGoodsList()) { + GoodsCategory category = goodsCategoryService.getById(goodsBo.getGoodsId()); TbsActivityGoods activityGoods = new TbsActivityGoods(); activityGoods.setCostApplyId(costApply.getId()); activityGoods.setActivityId(activity.getId()); @@ -409,6 +422,8 @@ public class TbsActivityServiceImpl extends ServiceImpl implements TbsBudgetConditionService { + @Override + public List getByBudgetId(Long budgetId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.le(TbsBudgetCondition::getBudgetId,budgetId); + 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 new file mode 100644 index 00000000..1d4e0af4 --- /dev/null +++ b/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 implements TbsBudgetCostItemService { + + @Override + public List listByScheduleItemBudgetIds(List ids) { + LambdaQueryWrapper costLqw = new LambdaQueryWrapper<>(); + costLqw.in(TbsBudgetCostItem::getScheduleItemBudgetId,ids); + return this.list(costLqw); + } + +} + diff --git a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetServiceImpl.java b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetServiceImpl.java index 2e7a8851..4dffe97e 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetServiceImpl.java @@ -501,7 +501,15 @@ public class TbsBudgetServiceImpl extends ServiceImpl budgetConditions.addAll(buildCategoryCondition(budgetId, seriesIds, TbsGoodsType.series.name())); budgetConditions.addAll(buildCategoryCondition(budgetId, categoryIds, TbsGoodsType.category.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); } } 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 2c163a2f..12f04d9a 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 @@ -1,5 +1,6 @@ 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; @@ -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.mapper.TbsScheduleItemBudgetMapper; +import java.time.LocalDate; +import java.util.List; + /** * 预算考核期项 服务实现类 * @author YenHex @@ -18,5 +22,13 @@ import com.qs.serve.modules.tbs.mapper.TbsScheduleItemBudgetMapper; @AllArgsConstructor public class TbsScheduleItemBudgetServiceImpl extends ServiceImpl implements TbsScheduleItemBudgetService { + @Override + public List betweenDateList(LocalDate startDate, LocalDate endDate) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.ge(TbsScheduleItemBudget::getStartDate,startDate); + lqw.le(TbsScheduleItemBudget::getEndDate,endDate); + return this.list(lqw); + } + } diff --git a/src/main/java/com/qs/serve/modules/vtb/controller/VtbVerificationController.java b/src/main/java/com/qs/serve/modules/vtb/controller/VtbVerificationController.java index aaa84570..b5c51cb1 100644 --- a/src/main/java/com/qs/serve/modules/vtb/controller/VtbVerificationController.java +++ b/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.CopierUtil; 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.extern.slf4j.Slf4j; 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 javax.validation.Valid; +import java.util.Arrays; import java.util.List; /** @@ -34,6 +44,17 @@ import java.util.List; public class VtbVerificationController { 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')") public R getById(@PathVariable("id") String id){ VtbVerification vtbVerification = vtbVerificationService.getById(id); + List attachIds = Arrays.asList(vtbVerification.getAttachIds()); + if(attachIds.size()>0){ + List attachList = attachService.listByIds(attachIds); + vtbVerification.setAttachList(attachList); + } + LambdaQueryWrapper channelLqw = new LambdaQueryWrapper<>(); + channelLqw.eq(VtbVerificationChannel::getVerificationId,id); + List verificationChannelList = vtbVerificationChannelService.list(channelLqw); + vtbVerification.setChannelList(verificationChannelList); + LambdaQueryWrapper channelPointLqw = new LambdaQueryWrapper<>(); + channelPointLqw.eq(VtbVerificationChannelPoint::getVerificationId,id); + List verificationChannelPointList = vtbVerificationChannelPointService.list(channelPointLqw); + vtbVerification.setPointList(verificationChannelPointList); + LambdaQueryWrapper subjectLqw = new LambdaQueryWrapper<>(); + subjectLqw.eq(VtbVerificationSubject::getVerificationId,id); + List subjectList = vtbVerificationSubjectService.list(subjectLqw); + vtbVerification.setSubjectList(subjectList); return R.ok(vtbVerification); } @@ -87,7 +125,7 @@ public class VtbVerificationController { */ @PostMapping("/commit") @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){ vtbVerificationService.commit(param); return R.ok(); diff --git a/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerification.java b/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerification.java index a40cdace..a93a8d09 100644 --- a/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerification.java +++ b/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.math.BigDecimal; import java.time.LocalDateTime; +import java.util.List; 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.framework.mybatis.handler.meta.SplitStringTypeHandler; +import com.qs.serve.modules.sys.entity.SysAttach; import lombok.Data; import org.apache.ibatis.type.JdbcType; import org.hibernate.validator.constraints.Length; @@ -77,5 +79,16 @@ public class VtbVerification implements Serializable { @JsonProperty private String delFlag; + @TableField(exist = false) + private List attachList; + + @TableField(exist = false) + List channelList; + + @TableField(exist = false) + List pointList; + + @TableField(exist = false) + List subjectList; } diff --git a/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java b/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java index 8e150f5f..f1c79ab1 100644 --- a/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java @@ -241,7 +241,7 @@ public class VtbVerificationServiceImpl extends ServiceImpl