Browse Source

查询周期使用情况

v1.0
Yen 2 years ago
parent
commit
cb1fcfdeb5
  1. 5
      doc/update.sql
  2. 73
      src/main/java/com/qs/serve/modules/bir/controller/BirBudgetScheduleController.java
  3. 3
      src/main/java/com/qs/serve/modules/goods/service/GoodsApplicationService.java
  4. 1
      src/main/java/com/qs/serve/modules/tbs/common/TbsSeeYonConst.java
  5. 18
      src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsScheduleItemBudgetIdDto.java
  6. 63
      src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsScheduleItemWithAmount.java
  7. 54
      src/main/java/com/qs/serve/modules/tbs/entity/so/TbsScheduleItemSearch.java
  8. 72
      src/main/java/com/qs/serve/modules/tbs/mapper/TbsScheduleItemBudget2Mapper.java
  9. 9
      src/main/java/com/qs/serve/modules/tbs/service/TbsScheduleItemBudgetService.java
  10. 81
      src/main/java/com/qs/serve/modules/tbs/service/impl/TbsScheduleItemBudgetServiceImpl.java
  11. 8
      src/main/java/com/qs/serve/task/GoodsTask.java
  12. 118
      src/main/resources/mapper/tbs/TbsScheduleItemBudget2Mapper.xml

5
doc/update.sql

@ -0,0 +1,5 @@
update tbs_budget_condition set brand_id = SUBSTRING_INDEX(target_level_path_ids,'_',1)
update tbs_budget set center_combo = concat(center_type,'_',center_id)

73
src/main/java/com/qs/serve/modules/bir/controller/BirBudgetScheduleController.java

@ -0,0 +1,73 @@
package com.qs.serve.modules.bir.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qs.serve.common.model.dto.R;
import com.qs.serve.common.util.CollectionUtil;
import com.qs.serve.modules.tbs.entity.TbsSchedule;
import com.qs.serve.modules.tbs.entity.TbsScheduleItem;
import com.qs.serve.modules.tbs.entity.dto.TbsScheduleItemBudgetIdDto;
import com.qs.serve.modules.tbs.entity.dto.TbsScheduleItemWithAmount;
import com.qs.serve.modules.tbs.entity.so.TbsScheduleItemSearch;
import com.qs.serve.modules.tbs.mapper.TbsScheduleItemBudget2Mapper;
import com.qs.serve.modules.tbs.mapper.TbsScheduleItemMapper;
import com.qs.serve.modules.tbs.mapper.TbsScheduleMapper;
import com.qs.serve.modules.tbs.service.TbsScheduleItemBudgetService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author YenHex
* @since 2023/12/27
*/
@Slf4j
@AllArgsConstructor
@RestController
@RequestMapping("bir/budget")
public class BirBudgetScheduleController {
private final TbsScheduleItemBudgetService scheduleItemBudgetService;
private final TbsScheduleItemBudget2Mapper scheduleItemBudget2Mapper;
private final TbsScheduleItemMapper tbsScheduleItemMapper;
private final TbsScheduleMapper tbsScheduleMapper;
/**
* 查询周期使用情况
* @param query
* @return
*/
@GetMapping("/budgetItemUsedList")
public R<List<TbsScheduleItemWithAmount>> queryBudgetItemUsed(TbsScheduleItemSearch query){
query.initCenterCombo();
List<TbsScheduleItemBudgetIdDto> scheduleItemBudgetIdDtoList = scheduleItemBudget2Mapper.listItemBudgetIds(query);
List<Long> scheduleItemIds = scheduleItemBudgetIdDtoList.stream().map(TbsScheduleItemBudgetIdDto::getScheduleItemId).collect(Collectors.toList());
if(CollectionUtil.isEmpty(scheduleItemIds)){
return R.ok();
}
List<TbsScheduleItem> scheduleItemList = tbsScheduleItemMapper.selectBatchIds(scheduleItemIds);
List<TbsSchedule> scheduleList = tbsScheduleMapper.selectList(new QueryWrapper<>());
List<TbsScheduleItemWithAmount> scheduleItemWithAmounts = scheduleItemBudgetService.listScheduleItemAmountByIds(scheduleItemBudgetIdDtoList);
for (TbsScheduleItemWithAmount itemWithAmount : scheduleItemWithAmounts) {
for (TbsScheduleItem scheduleItem : scheduleItemList) {
if(itemWithAmount.getScheduleItemId().equals(scheduleItem.getId())){
itemWithAmount.setScheduleItemName(scheduleItem.getItemName());
for (TbsSchedule schedule : scheduleList) {
if(schedule.getId().equals(scheduleItem.getScheduleId())){
itemWithAmount.setScheduleName(schedule.getName());
break;
}
}
break;
}
}
}
return R.ok(scheduleItemWithAmounts);
}
}

3
src/main/java/com/qs/serve/modules/goods/service/GoodsApplicationService.java

@ -43,6 +43,9 @@ public class GoodsApplicationService {
private final SeeYonRequestBaseService seeYonRequestBaseService;
private final GoodsCrmSkuMapper goodsCrmSkuMapper;
public void syncSkuPrice(){
R<String> result = seeYonRequestBaseService.getBase(TbsSeeYonConst.ERP_CUS_INV_SYNC_PRICE,"");
}
public void syncStandGoods(boolean isFullUpdate){
//兼容任务调度

1
src/main/java/com/qs/serve/modules/tbs/common/TbsSeeYonConst.java

@ -90,6 +90,7 @@ public interface TbsSeeYonConst {
String ERP_CUS_AMOUNT = "/erp/customer/amount";
String ERP_CUS_INV_PRICE = "/erp/inventory/invPrices";
String ERP_CUS_INV_STAND = "/erp/inventory/standList";
String ERP_CUS_INV_SYNC_PRICE = "/erp/inventory/syncPrice";
String ERP_CUS_INV_SPECIAL = "/erp/inventory/specialSyncCrm";
String ERP_CUS_INV_SHELF = "/erp/inventory/shelfSyncCrm";
String ERP_ORDER_CREATE = "/erp/order/create";

18
src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsScheduleItemBudgetIdDto.java

@ -0,0 +1,18 @@
package com.qs.serve.modules.tbs.entity.dto;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author YenHex
* @since 2023/6/29
*/
@Data
public class TbsScheduleItemBudgetIdDto {
Long scheduleItemId;
Long scheduleItemBudgetId;
}

63
src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsScheduleItemWithAmount.java

@ -0,0 +1,63 @@
package com.qs.serve.modules.tbs.entity.dto;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author YenHex
* @since 2023/6/29
*/
@Data
public class TbsScheduleItemWithAmount {
/**
* 周期项ID
*/
Long scheduleItemId;
String scheduleName;
String scheduleItemName;
/**
* 预算总额
*/
BigDecimal finalAmt = BigDecimal.ZERO;
/**
* 当前占用中的预算
*/
BigDecimal allUsingAmt = BigDecimal.ZERO;
/**
* 申请中的预算占用
*/
BigDecimal allCheckingAmt = BigDecimal.ZERO;
/**
* 费用申请-申请中的预算
*/
BigDecimal costUsingAmt = BigDecimal.ZERO;
/**
* 费用申请-申请中的预算
*/
BigDecimal costCheckingAmt = BigDecimal.ZERO;
/**
* 政策-申请中的预算
*/
BigDecimal policyUsingAmt = BigDecimal.ZERO;
/**
* 政策-申请中的预算
*/
BigDecimal policyCheckingAmt = BigDecimal.ZERO;
/**
* 剩余预算(预算总额-当前占用的预算)
*/
BigDecimal surplusAmt = BigDecimal.ZERO;
}

54
src/main/java/com/qs/serve/modules/tbs/entity/so/TbsScheduleItemSearch.java

@ -0,0 +1,54 @@
package com.qs.serve.modules.tbs.entity.so;
import com.qs.serve.common.util.CollectionUtil;
import lombok.Data;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author YenHex
* @since 2023/12/27
*/
@Data
public class TbsScheduleItemSearch {
/**
* 成本中心组合值列表格式centerType_centerId
*/
private List<String> centerCombos;
/**
* 周期ID
*/
private List<String> scheduleItemIds;
/**
* 品牌ID
*/
private List<Long> brandIds;
/**
* 成本中心列表
*/
private List<CenterItem> centerList;
@Data
public static class CenterItem{
private String centerType;
private String centerId;
}
/**
* 调整数据结构
*/
public void initCenterCombo(){
if(CollectionUtil.isNotEmpty(centerList)){
this.centerCombos = centerList.stream().map(a-> a.getCenterType()+"_"+a.getCenterId()).collect(Collectors.toList());
}
}
}

72
src/main/java/com/qs/serve/modules/tbs/mapper/TbsScheduleItemBudget2Mapper.java

@ -0,0 +1,72 @@
package com.qs.serve.modules.tbs.mapper;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget;
import com.qs.serve.modules.tbs.entity.dto.TbsBudgetLogPreAmount;
import com.qs.serve.modules.tbs.entity.dto.TbsBudgetLogWithAmount;
import com.qs.serve.modules.tbs.entity.dto.TbsScheduleItemBudgetAmount;
import com.qs.serve.modules.tbs.entity.dto.TbsScheduleItemBudgetIdDto;
import com.qs.serve.modules.tbs.entity.so.TbsScheduleItemSearch;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.math.BigDecimal;
import java.util.List;
/**
* 预算考核期项 Mapper
* @author YenHex
* @date 2022-11-08
*/
public interface TbsScheduleItemBudget2Mapper extends BaseMapper<TbsScheduleItemBudget> {
/**
* 查询TbsScheduleItemBudget.id
* @param query
* @return
*/
List<TbsScheduleItemBudgetIdDto> listItemBudgetIds(@Param("query") TbsScheduleItemSearch query);
/**
* 统计Schedule金额
* @param ids scheduleItemIds
* @param optNumbers 包含
* @return
*/
@InterceptorIgnore(tenantLine = "true")
List<TbsBudgetLogWithAmount> getSumAmtInList(@Param("selectIds") List<Long> ids,@Param("optNumbers")List<Integer> optNumbers);
/**
* 统计Schedule金额
* @param ids scheduleItemIds
* @param optNumbers 不包含
* @return
*/
@InterceptorIgnore(tenantLine = "true")
List<TbsBudgetLogWithAmount> getSumAmtNotInList(@Param("selectIds") List<Long> ids,@Param("optNumbers")List<Integer> optNumbers);
/**
* 统计审批中的政策占用多少的预算
* @param ids
* @param optNumbers
* @return
*/
@InterceptorIgnore(tenantLine = "true")
List<TbsBudgetLogWithAmount> getPolicyCheckingList(@Param("selectIds") List<Long> ids,@Param("optNumbers")List<Integer> optNumbers);
/**
* 统计审批中的费用占用多少的预算
* @param ids
* @param optNumbers
* @return
*/
@InterceptorIgnore(tenantLine = "true")
List<TbsBudgetLogWithAmount> getCostCheckingList(@Param("selectIds") List<Long> ids,@Param("optNumbers")List<Integer> optNumbers);
}

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

@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget;
import com.qs.serve.modules.tbs.entity.dto.TbsBudgetScheduleWithAmount;
import com.qs.serve.modules.tbs.entity.dto.TbsScheduleItemBudgetIdDto;
import com.qs.serve.modules.tbs.entity.dto.TbsScheduleItemWithAmount;
import java.time.LocalDate;
import java.util.List;
@ -28,5 +30,12 @@ public interface TbsScheduleItemBudgetService extends IService<TbsScheduleItemBu
*/
List<TbsBudgetScheduleWithAmount> listScheduleAmountByIds(List<Long> scheduleItemBudgetIds);
/**
* 统计预算周期使用情况
* @param budgetIdDtoList
* @return
*/
List<TbsScheduleItemWithAmount> listScheduleItemAmountByIds(List<TbsScheduleItemBudgetIdDto> budgetIdDtoList);
}

81
src/main/java/com/qs/serve/modules/tbs/service/impl/TbsScheduleItemBudgetServiceImpl.java

@ -5,6 +5,9 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qs.serve.common.model.enums.BudgetLogOptFlag;
import com.qs.serve.modules.tbs.entity.dto.TbsBudgetLogWithAmount;
import com.qs.serve.modules.tbs.entity.dto.TbsBudgetScheduleWithAmount;
import com.qs.serve.modules.tbs.entity.dto.TbsScheduleItemBudgetIdDto;
import com.qs.serve.modules.tbs.entity.dto.TbsScheduleItemWithAmount;
import com.qs.serve.modules.tbs.mapper.TbsScheduleItemBudget2Mapper;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@ -28,6 +31,8 @@ import java.util.stream.Collectors;
@AllArgsConstructor
public class TbsScheduleItemBudgetServiceImpl extends ServiceImpl<TbsScheduleItemBudgetMapper,TbsScheduleItemBudget> implements TbsScheduleItemBudgetService {
private final TbsScheduleItemBudget2Mapper scheduleItemBudget2Mapper;
@Override
public List<TbsScheduleItemBudget> betweenDateList(LocalDate startDate, LocalDate endDate) {
LambdaQueryWrapper<TbsScheduleItemBudget> lqw = new LambdaQueryWrapper<>();
@ -125,5 +130,81 @@ public class TbsScheduleItemBudgetServiceImpl extends ServiceImpl<TbsScheduleIte
}
return result;
}
@Override
public List<TbsScheduleItemWithAmount> listScheduleItemAmountByIds(List<TbsScheduleItemBudgetIdDto> scheduleItemBudgetIdDtoList) {
List<Long> scheduleItemBudgetIds = scheduleItemBudgetIdDtoList.stream().map(TbsScheduleItemBudgetIdDto::getScheduleItemBudgetId).collect(Collectors.toList());
List<Long> scheduleItemIds = scheduleItemBudgetIdDtoList.stream().map(TbsScheduleItemBudgetIdDto::getScheduleItemId).collect(Collectors.toList());
// 预算金额
List<TbsBudgetLogWithAmount> finalList = scheduleItemBudget2Mapper.getSumAmtInList(scheduleItemBudgetIds, BudgetLogOptFlag.getFinalBudgetOptFlag());
// 被占用金额
List<TbsBudgetLogWithAmount> usedList = scheduleItemBudget2Mapper.getSumAmtNotInList(scheduleItemBudgetIds, BudgetLogOptFlag.getFinalBudgetOptFlag());
// 费用使用金额
List<TbsBudgetLogWithAmount> costUsedList = scheduleItemBudget2Mapper.getSumAmtInList(scheduleItemBudgetIds, BudgetLogOptFlag.finalCostOptFlag);
// 政策使用金额
List<TbsBudgetLogWithAmount> policyUsedList = scheduleItemBudget2Mapper.getSumAmtInList(scheduleItemBudgetIds, BudgetLogOptFlag.finalPolicyOptFlag);
List<TbsBudgetLogWithAmount> policyCheckingList = scheduleItemBudget2Mapper.getPolicyCheckingList(scheduleItemBudgetIds, BudgetLogOptFlag.finalPolicyOptFlag);
List<TbsBudgetLogWithAmount> costCheckingList = scheduleItemBudget2Mapper.getCostCheckingList(scheduleItemBudgetIds, BudgetLogOptFlag.finalCostOptFlag);
List<TbsScheduleItemWithAmount> result = new ArrayList<>();
for (Long scheduleItemId : scheduleItemIds) {
TbsScheduleItemWithAmount withAmount = new TbsScheduleItemWithAmount();
withAmount.setScheduleItemId(scheduleItemId);
for (TbsBudgetLogWithAmount obj : finalList) {
if(scheduleItemId.equals(obj.getId())){
withAmount.setFinalAmt(obj.getAmt());
break;
}
}
for (TbsBudgetLogWithAmount obj : usedList) {
if(scheduleItemId.equals(obj.getId())){
withAmount.setAllUsingAmt(obj.getAmt());
break;
}
}
for (TbsBudgetLogWithAmount obj : costUsedList) {
if(scheduleItemId.equals(obj.getId())){
withAmount.setCostUsingAmt(obj.getAmt());
break;
}
}
for (TbsBudgetLogWithAmount obj : policyUsedList) {
if(scheduleItemId.equals(obj.getId())){
withAmount.setPolicyUsingAmt(obj.getAmt());
break;
}
}
for (TbsBudgetLogWithAmount obj : costCheckingList) {
if(scheduleItemId.equals(obj.getId())){
withAmount.setCostCheckingAmt(obj.getAmt());
break;
}
}
for (TbsBudgetLogWithAmount obj : policyCheckingList) {
if(scheduleItemId.equals(obj.getId())){
withAmount.setPolicyCheckingAmt(obj.getAmt());
break;
}
}
//因为log统计为负数,需要把数值取正
withAmount.setAllUsingAmt(withAmount.getAllUsingAmt().negate());
withAmount.setCostUsingAmt(withAmount.getCostUsingAmt().negate());
withAmount.setCostCheckingAmt(withAmount.getCostCheckingAmt().negate());
withAmount.setPolicyUsingAmt(withAmount.getPolicyUsingAmt().negate());
withAmount.setPolicyCheckingAmt(withAmount.getPolicyCheckingAmt().negate());
//计算剩余及审批合计
withAmount.setAllCheckingAmt(withAmount.getCostCheckingAmt().add(withAmount.getPolicyCheckingAmt()));
withAmount.setSurplusAmt(withAmount.getFinalAmt().subtract(withAmount.getAllUsingAmt()));
result.add(withAmount);
}
return result;
}
}

8
src/main/java/com/qs/serve/task/GoodsTask.java

@ -34,4 +34,12 @@ public class GoodsTask {
goodsApplicationService.syncStandGoods(false);
}
/**
* 同步价格
*/
@Scheduled(cron="0 0 1 * * ?")
public void syncInvPrice(){
goodsApplicationService.syncSkuPrice();
}
}

118
src/main/resources/mapper/tbs/TbsScheduleItemBudget2Mapper.xml

@ -0,0 +1,118 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qs.serve.modules.tbs.mapper.TbsScheduleItemBudget2Mapper">
<select id="listItemBudgetIds" resultType="com.qs.serve.modules.tbs.entity.dto.TbsScheduleItemBudgetIdDto">
SELECT
tbs_schedule_item_budget.id as schedule_item_budget_id,
tbs_schedule_item_budget.schedule_item_id
FROM `tbs_schedule_item_budget`
LEFT JOIN tbs_budget on tbs_schedule_item_budget.budget_id = tbs_budget.id
LEFT JOIN tbs_budget_condition on tbs_budget_condition.budget_id = tbs_budget.id
where
tbs_schedule_item_budget.del_flag = 0
and tbs_budget.del_flag = 0
and tbs_budget.budget_state = 1
<if test="query.centerCombos != null and query.centerCombos.size > 0">
and tbs_budget.center_combo in
<foreach collection="query.centerCombos" item ="selectId" index="i" open="(" close=")" separator=",">
#{selectId}
</foreach>
</if>
<if test="query.centerCombos != null and query.centerCombos.size > 0">
and
(
tbs_budget.condition_flag = 0 or tbs_budget_condition.brand_id in
<foreach collection="query.brandIds" item ="selectId" index="i" open="(" close=")" separator=",">
#{selectId}
</foreach>
)
</if>
and tbs_schedule_item_budget.schedule_item_id in
<foreach collection="query.scheduleItemIds" item ="selectId" index="i" open="(" close=")" separator=",">
#{selectId}
</foreach>
group by tbs_schedule_item_budget.id
</select>
<select id="getSumAmtInList" resultType="com.qs.serve.modules.tbs.entity.dto.TbsBudgetLogWithAmount">
select
schedule_item_id as id,
sum(amount) as amt
from tbs_budget_log
where
del_flag = 0 and opt_type in
<foreach collection="optNumbers" item ="selectId" index="i" open="(" close=")" separator=",">
#{selectId}
</foreach>
AND schedule_item_budget_id in
<foreach collection="selectIds" item ="selectId" index="i" open="(" close=")" separator=",">
#{selectId}
</foreach>
group by schedule_item_id
</select>
<select id="getSumAmtNotInList" resultType="com.qs.serve.modules.tbs.entity.dto.TbsBudgetLogWithAmount">
select
schedule_item_id as id,
sum(amount) as amt
from tbs_budget_log
where
del_flag = 0 and opt_type not in
<foreach collection="optNumbers" item ="selectId" index="i" open="(" close=")" separator=",">
#{selectId}
</foreach>
AND schedule_item_budeget_id in
<foreach collection="selectIds" item ="selectId" index="i" open="(" close=")" separator=",">
#{selectId}
</foreach>
group by schedule_item_id
</select>
<select id="getPolicyCheckingList" resultType="com.qs.serve.modules.tbs.entity.dto.TbsBudgetLogWithAmount">
select
schedule_item_id as id,
sum(amount) as amt
from tbs_budget_log
left join tzc_policy on tbs_budget_log.policy_id = tzc_policy.id
where
tbs_budget_log.policy_id is not null
and tzc_policy.policy_status = 1
and tbs_budget_log.del_flag = 0
and tzc_policy.del_flag = 0
and opt_type in
<foreach collection="optNumbers" item ="selectId" index="i" open="(" close=")" separator=",">
#{selectId}
</foreach>
AND schedule_item_budeget_id in
<foreach collection="selectIds" item ="selectId" index="i" open="(" close=")" separator=",">
#{selectId}
</foreach>
group by schedule_item_id
</select>
<select id="getCostCheckingList" resultType="com.qs.serve.modules.tbs.entity.dto.TbsBudgetLogWithAmount">
select
schedule_item_id as id,
sum(amount) as amt
from tbs_budget_log
left join tbs_cost_apply on tbs_budget_log.cost_apply_id = tbs_cost_apply.id
where
tbs_budget_log.cost_apply_id is not null
and tbs_cost_apply.charge_state = 1
and tbs_budget_log.del_flag = 0
and tbs_cost_apply.del_flag = 0
and opt_type in
<foreach collection="optNumbers" item ="selectId" index="i" open="(" close=")" separator=",">
#{selectId}
</foreach>
AND schedule_item_budeget_id in
<foreach collection="selectIds" item ="selectId" index="i" open="(" close=")" separator=",">
#{selectId}
</foreach>
group by schedule_item_id
</select>
</mapper>
Loading…
Cancel
Save