Browse Source

匹配查询优化

v1.0
Yen 2 years ago
parent
commit
287e7b85f4
  1. 18
      src/main/java/com/qs/serve/common/model/AmountDTO.java
  2. 5
      src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenterGoods.java
  3. 9
      src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetMatchMapper.java
  4. 56
      src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetMatchApplication.java
  5. 60
      src/main/resources/mapper/tbs/TbsBudgetMatchMapper.xml

18
src/main/java/com/qs/serve/common/model/AmountDTO.java

@ -0,0 +1,18 @@
package com.qs.serve.common.model;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author YenHex
* @since 2023/7/31
*/
@Data
public class AmountDTO {
private String id;
private BigDecimal amount;
}

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

@ -255,6 +255,11 @@ public class TbsActivityCenterGoods implements Serializable {
@TableField(exist = false) @TableField(exist = false)
private List<TbsCenterGoodsGroupDTO> queryGoodsGroups; private List<TbsCenterGoodsGroupDTO> queryGoodsGroups;
/** */
@JsonIgnore
@TableField(exist = false)
private List<TbsScheduleItemBudget> match2ScheduleItemBudgetList ;
public TbsBudgetCostItem toBudgetCostItem(){ public TbsBudgetCostItem toBudgetCostItem(){
TbsBudgetCostItem budgetCostItem = CopierUtil.copy(this,new TbsBudgetCostItem()); TbsBudgetCostItem budgetCostItem = CopierUtil.copy(this,new TbsBudgetCostItem());
budgetCostItem.setId(null); budgetCostItem.setId(null);

9
src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetMatchMapper.java

@ -1,10 +1,12 @@
package com.qs.serve.modules.tbs.mapper; package com.qs.serve.modules.tbs.mapper;
import com.qs.serve.common.model.AmountDTO;
import com.qs.serve.modules.tbs.entity.TbsActivityCenterGoods; import com.qs.serve.modules.tbs.entity.TbsActivityCenterGoods;
import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget; import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
import java.util.Set;
/** /**
* @author YenHex * @author YenHex
@ -19,4 +21,11 @@ public interface TbsBudgetMatchMapper {
*/ */
List<TbsScheduleItemBudget> getTbsScheduleItemsByCenterGoods(@Param("query") TbsActivityCenterGoods centerGoods); List<TbsScheduleItemBudget> getTbsScheduleItemsByCenterGoods(@Param("query") TbsActivityCenterGoods centerGoods);
List<AmountDTO> getBudgetUsedAmount(@Param("ids") Set<Long> ids);
List<AmountDTO> getBudgetNotUsedAmount(@Param("ids") Set<Long> ids);
List<AmountDTO> getBudgetFinalUsedAmount(@Param("ids") Set<Long> ids);
} }

56
src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetMatchApplication.java

@ -1,5 +1,7 @@
package com.qs.serve.modules.tbs.service; package com.qs.serve.modules.tbs.service;
import com.qs.serve.common.model.AmountDTO;
import com.qs.serve.common.util.CollectionUtil;
import com.qs.serve.modules.tbs.common.TbsGoodsType; import com.qs.serve.modules.tbs.common.TbsGoodsType;
import com.qs.serve.modules.tbs.common.util.CostSort2WrapperUtil; import com.qs.serve.modules.tbs.common.util.CostSort2WrapperUtil;
import com.qs.serve.modules.tbs.entity.TbsActivity; import com.qs.serve.modules.tbs.entity.TbsActivity;
@ -16,6 +18,7 @@ import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
/** /**
* 匹配规则2 * 匹配规则2
@ -42,11 +45,24 @@ public class TbsBudgetMatchApplication {
Map<Long, BigDecimal> usableAmountMap = new HashMap<>(); Map<Long, BigDecimal> usableAmountMap = new HashMap<>();
// 提取命中的预算 // 提取命中的预算
Map<Long,TbsScheduleItemBudget> matchItemBudgetsMap = new HashMap<>(); Map<Long,TbsScheduleItemBudget> matchItemBudgetsMap = new HashMap<>();
Set<Long> scheduleItemBudgetIds = new HashSet<>();
for (TbsActivityCenterGoods centerGoods : activityCenterGoodsList) { for (TbsActivityCenterGoods centerGoods : activityCenterGoodsList) {
// 通过TbsActivityCenterGoods获取匹配条件的预算 // 通过TbsActivityCenterGoods获取匹配条件的预算
List<TbsScheduleItemBudget> scheduleItemBudgetList = this.centerGoodsMatchTbsScheduleItemBudget(centerGoods); List<TbsScheduleItemBudget> scheduleItemBudgetList = this.centerGoodsMatchTbsScheduleItemBudget(centerGoods);
// 优先级 // 优先级
scheduleItemBudgetList = CostSort2WrapperUtil.sort(scheduleItemBudgetList); scheduleItemBudgetList = CostSort2WrapperUtil.sort(scheduleItemBudgetList);
if(scheduleItemBudgetList.size()>0){
List<Long> sids = scheduleItemBudgetList.stream().map(TbsScheduleItemBudget::getId).collect(Collectors.toList());
scheduleItemBudgetIds.addAll(sids);
}
centerGoods.setMatch2ScheduleItemBudgetList(scheduleItemBudgetList);
}
//加载金额统计
this.batchInitScheduleAmount(activityCenterGoodsList, scheduleItemBudgetIds);
// 金额匹配
for (TbsActivityCenterGoods centerGoods : activityCenterGoodsList) {
// 通过TbsActivityCenterGoods获取匹配条件的预算
List<TbsScheduleItemBudget> scheduleItemBudgetList = centerGoods.getMatch2ScheduleItemBudgetList();
// 判断金额是否够扣 // 判断金额是否够扣
for (TbsScheduleItemBudget itemBudget : scheduleItemBudgetList) { for (TbsScheduleItemBudget itemBudget : scheduleItemBudgetList) {
Long scheduleItemBudgetId = itemBudget.getId(); Long scheduleItemBudgetId = itemBudget.getId();
@ -65,6 +81,7 @@ public class TbsBudgetMatchApplication {
} }
} }
} }
TbsBudgetTableResultVo resultVo = new TbsBudgetTableResultVo(); TbsBudgetTableResultVo resultVo = new TbsBudgetTableResultVo();
resultVo.setActivityCenterGoodsList(activityCenterGoodsList); resultVo.setActivityCenterGoodsList(activityCenterGoodsList);
resultVo.setMatchItemBudgetsMap(matchItemBudgetsMap); resultVo.setMatchItemBudgetsMap(matchItemBudgetsMap);
@ -76,6 +93,45 @@ public class TbsBudgetMatchApplication {
return resultVo; return resultVo;
} }
/**
* 初始化金额
* @param activityCenterGoodsList
* @param scheduleItemBudgetIds
*/
private void batchInitScheduleAmount(List<TbsActivityCenterGoods> activityCenterGoodsList, Set<Long> scheduleItemBudgetIds) {
if(scheduleItemBudgetIds.size()>0){
List<AmountDTO> notUsedAmountList = budgetMatchMapper.getBudgetNotUsedAmount(scheduleItemBudgetIds);
List<AmountDTO> usedAmountList = budgetMatchMapper.getBudgetUsedAmount(scheduleItemBudgetIds);
List<AmountDTO> finalAmountList = budgetMatchMapper.getBudgetFinalUsedAmount(scheduleItemBudgetIds);
for (TbsActivityCenterGoods centerGoods : activityCenterGoodsList) {
List<TbsScheduleItemBudget> scheduleItemBudgetList = centerGoods.getMatch2ScheduleItemBudgetList();
if(CollectionUtil.isNotEmpty(scheduleItemBudgetList)){
for (TbsScheduleItemBudget itemBudget : scheduleItemBudgetList) {
String itemBudgetId = itemBudget.getId().toString();
for (AmountDTO dto : notUsedAmountList) {
if(dto.getId().equals(itemBudgetId)){
itemBudget.setUnUsedBudgetAmount(dto.getAmount());
break;
}
}
for (AmountDTO dto : usedAmountList) {
if(dto.getId().equals(itemBudgetId)){
itemBudget.setUsedBudgetAmount(dto.getAmount());
break;
}
}
for (AmountDTO dto : finalAmountList) {
if(dto.getId().equals(itemBudgetId)){
itemBudget.setFinalBudgetAmount(dto.getAmount());
break;
}
}
}
}
}
}
}
@NotNull @NotNull
private TbsBudgetTableVo buildTbsBudgetTableVo(Map<Long, TbsActivity> activityMap, List<TbsActivityCenterGoods> activityCenterGoodsList, Map<Long, TbsScheduleItemBudget> matchItemBudgetsMap) { private TbsBudgetTableVo buildTbsBudgetTableVo(Map<Long, TbsActivity> activityMap, List<TbsActivityCenterGoods> activityCenterGoodsList, Map<Long, TbsScheduleItemBudget> matchItemBudgetsMap) {
List<TbsBudgetTableVo.TopTheadHeader> topTheadHeaderList = new ArrayList<>(); List<TbsBudgetTableVo.TopTheadHeader> topTheadHeaderList = new ArrayList<>();

60
src/main/resources/mapper/tbs/TbsBudgetMatchMapper.xml

@ -30,9 +30,9 @@
resultType="com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget"> resultType="com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget">
select select
tsib.*, tsib.*,
temp_tbg1.amt un_used_budget_amount, -- temp_tbg1.amt un_used_budget_amount,
temp_tbg2.amt final_budget_amount, -- temp_tbg2.amt final_budget_amount,
temp_tbg3.amt used_budget_amount, -- temp_tbg3.amt used_budget_amount,
tb.condition_flag budget_condition_flag, tb.condition_flag budget_condition_flag,
tb.subject_id subject_id, tb.subject_id subject_id,
tb.budget_code budget_name, tb.budget_code budget_name,
@ -41,15 +41,15 @@
from tbs_schedule_item_budget tsib from tbs_schedule_item_budget tsib
left join tbs_budget tb on tsib.budget_id = tb.id left join tbs_budget tb on tsib.budget_id = tb.id
left join tbs_budget_condition tbc on tbc.budget_id = tb.id left join tbs_budget_condition tbc on tbc.budget_id = tb.id
left join -- left join
(select sum(tbg.amount) amt,tbg.schedule_item_budget_id from tbs_budget_log tbg where tbg.del_flag = 0 GROUP BY tbg.schedule_item_budget_id) temp_tbg1 -- (select sum(tbg.amount) amt,tbg.schedule_item_budget_id from tbs_budget_log tbg where tbg.del_flag = 0 GROUP BY tbg.schedule_item_budget_id) temp_tbg1
on temp_tbg1.schedule_item_budget_id = tsib.id -- on temp_tbg1.schedule_item_budget_id = tsib.id
left join -- left join
(select sum(tbg2.amount) amt,tbg2.schedule_item_budget_id from tbs_budget_log tbg2 where tbg2.opt_type in(0,2,3) and tbg2.del_flag = 0 GROUP BY tbg2.schedule_item_budget_id) temp_tbg2 -- (select sum(tbg2.amount) amt,tbg2.schedule_item_budget_id from tbs_budget_log tbg2 where tbg2.opt_type in(0,2,3) and tbg2.del_flag = 0 GROUP BY tbg2.schedule_item_budget_id) temp_tbg2
on temp_tbg2.schedule_item_budget_id = tsib.id -- on temp_tbg2.schedule_item_budget_id = tsib.id
left join -- left join
(select sum(tbg3.amount) amt,tbg3.schedule_item_budget_id from tbs_budget_log tbg3 where tbg3.opt_type not in(0,2,3) and tbg3.del_flag = 0 GROUP BY tbg3.schedule_item_budget_id) temp_tbg3 -- (select sum(tbg3.amount) amt,tbg3.schedule_item_budget_id from tbs_budget_log tbg3 where tbg3.opt_type not in(0,2,3) and tbg3.del_flag = 0 GROUP BY tbg3.schedule_item_budget_id) temp_tbg3
on temp_tbg3.schedule_item_budget_id = tsib.id -- on temp_tbg3.schedule_item_budget_id = tsib.id
where 1=1 where 1=1
AND (tb.subject_id = 0 OR tb.subject_id = #{query.subjectId} ) AND (tb.subject_id = 0 OR tb.subject_id = #{query.subjectId} )
AND tb.center_id = #{query.centerId} AND tb.center_id = #{query.centerId}
@ -64,4 +64,40 @@
</foreach> </foreach>
) )
</select> </select>
<select id="getBudgetUsedAmount" resultType="com.qs.serve.common.model.AmountDTO">
select sum(tbg.amount) as amount,tbg.schedule_item_budget_id as id
from tbs_budget_log tbg
where tbg.opt_type not in(0,2,3)
and tbg.del_flag = 0
and tbg.schedule_item_budget_id in
<foreach collection="ids" item ="selectId" index="i" open="(" close=")" separator=",">
#{selectId}
</foreach>
GROUP BY tbg.schedule_item_budget_id
</select>
<select id="getBudgetNotUsedAmount" resultType="com.qs.serve.common.model.AmountDTO">
select sum(tbg.amount) as amount,tbg.schedule_item_budget_id as id
from tbs_budget_log tbg
where tbg.del_flag = 0
and tbg.schedule_item_budget_id in
<foreach collection="ids" item ="selectId" index="i" open="(" close=")" separator=",">
#{selectId}
</foreach>
GROUP BY tbg.schedule_item_budget_id
</select>
<select id="getBudgetFinalUsedAmount" resultType="com.qs.serve.common.model.AmountDTO">
select sum(tbg.amount) as amount,tbg.schedule_item_budget_id as id
from tbs_budget_log tbg
where tbg.opt_type in(0,2,3)
and tbg.del_flag = 0
and tbg.schedule_item_budget_id in
<foreach collection="ids" item ="selectId" index="i" open="(" close=")" separator=",">
#{selectId}
</foreach>
GROUP BY tbg.schedule_item_budget_id
</select>
</mapper> </mapper>

Loading…
Cancel
Save