From 36a77a8e0f01061291c98c38cd5aeb3ff878e04d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Mon, 6 Nov 2023 18:46:49 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E6=8A=A5=E8=A1=A8?= =?UTF-8?q?=E7=BB=B4=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../report/SalaryStatisticsItemMapper.xml | 48 +++++ .../entity/bo/SalaryStatisticsReportBO.java | 193 +++++++++++++++++- .../dto/SalaryStatisticsItemRuleDTO.java | 17 +- .../param/SalaryStatisticsItemSaveParam.java | 13 +- .../entity/po/SalaryStatisticsItemPO.java | 8 +- .../SalaryStatisticsItemStringRuleEnum.java | 2 +- .../impl/SalaryStatisticsItemServiceImpl.java | 8 + 7 files changed, 263 insertions(+), 26 deletions(-) diff --git a/src/com/engine/salary/mapper/report/SalaryStatisticsItemMapper.xml b/src/com/engine/salary/mapper/report/SalaryStatisticsItemMapper.xml index 68d44970b..69abc9536 100644 --- a/src/com/engine/salary/mapper/report/SalaryStatisticsItemMapper.xml +++ b/src/com/engine/salary/mapper/report/SalaryStatisticsItemMapper.xml @@ -19,6 +19,10 @@ + + + + @@ -42,6 +46,10 @@ , t.tenant_key , t.unit_type , t.update_time + , t.last_rule + , t.old_rule + , t.frequent_rule + , t.tile_rule @@ -184,6 +192,18 @@ update_time, + + last_rule, + + + old_rule, + + + frequent_rule, + + + tile_rule, + @@ -237,6 +257,18 @@ #{updateTime}, + + #{lastRule}, + + + #{oldRule}, + + + #{frequentRule}, + + + #{tileRule}, + @@ -260,6 +292,10 @@ tenant_key=#{tenantKey}, unit_type=#{unitType}, update_time=#{updateTime}, + last_rule=#{lastRule}, + old_rule=#{oldRule}, + frequent_rule=#{frequentRule}, + tile_rule=#{tileRule}, WHERE id = #{id} AND delete_type = 0 @@ -317,6 +353,18 @@ update_time=#{updateTime}, + + last_rule=#{lastRule}, + + + old_rule=#{oldRule}, + + + frequent_rule=#{frequentRule}, + + + tile_rule=#{tileRule}, + WHERE id = #{id} AND delete_type = 0 diff --git a/src/com/engine/salary/report/entity/bo/SalaryStatisticsReportBO.java b/src/com/engine/salary/report/entity/bo/SalaryStatisticsReportBO.java index 2498a91cf..df2420303 100644 --- a/src/com/engine/salary/report/entity/bo/SalaryStatisticsReportBO.java +++ b/src/com/engine/salary/report/entity/bo/SalaryStatisticsReportBO.java @@ -13,6 +13,7 @@ import com.engine.salary.report.entity.param.SalaryStatisticsReportDataQueryPara import com.engine.salary.report.entity.po.SalaryStatisticsDimensionPO; import com.engine.salary.report.entity.po.SalaryStatisticsItemPO; import com.engine.salary.report.entity.po.SalaryStatisticsReportPO; +import com.engine.salary.report.enums.SalaryStatisticsItemStringRuleEnum; import com.engine.salary.report.enums.UnitTypeEnum; import com.engine.salary.report.util.ReportDataUtil; import com.engine.salary.report.util.ReportTimeUtil; @@ -20,6 +21,7 @@ import com.engine.salary.util.SalaryDateUtil; import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.page.PageInfo; +import com.google.common.base.Joiner; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import org.apache.commons.collections4.CollectionUtils; @@ -45,7 +47,6 @@ public class SalaryStatisticsReportBO { public static final String MAX = "max"; public static final String MIN = "min"; public static final String MEDIAN = "median"; - public static final String LATEST = "last"; public static final String ZERO = "0"; public static final String ONE = "1"; @@ -174,7 +175,13 @@ public class SalaryStatisticsReportBO { // 6.中位数规则数据处理 calculate4Median(result, item, nowDetail, lastDetail, sameDetail); // 7.最近值 - calculate4Latest(result, item, nowDetail, lastDetail, sameDetail); + calculate4Last(result, item, nowDetail, lastDetail, sameDetail); + // 8.最久值 + calculate4Old(result, item, nowDetail, lastDetail, sameDetail); + // 9.最频繁 + calculate4Frequent(result, item, nowDetail, lastDetail, sameDetail); + // 10.平铺 + calculate4Tile(result, item, nowDetail, lastDetail, sameDetail); }); return result; } @@ -491,14 +498,14 @@ public class SalaryStatisticsReportBO { * @param lastDetail * @param sameDetail */ - private static void calculate4Latest(Map result, SalaryStatisticsItemPO item, List> nowDetail, List> lastDetail, List> sameDetail) { - SalaryStatisticsItemRuleDTO medianRule = JSON.parseObject(item.getMedianRule(), SalaryStatisticsItemRuleDTO.class); - if (medianRule == null || medianRule.getTotalValue() != 1) { + private static void calculate4Last(Map result, SalaryStatisticsItemPO item, List> nowDetail, List> lastDetail, List> sameDetail) { + SalaryStatisticsItemRuleDTO lastRule = JSON.parseObject(item.getLastRule(), SalaryStatisticsItemRuleDTO.class); + if (lastRule == null || lastRule.getTotalValue() != 1) { return; } String lastValue = ""; // 本期 - if (medianRule.getTotalValue() == 1) { + if (lastRule.getTotalValue() == 1) { List decimalList = Lists.newArrayList(); if (StringUtils.isNotEmpty(item.getItemValue())) { String[] itemValues = item.getItemValue().split(COMMA); @@ -512,7 +519,109 @@ public class SalaryStatisticsReportBO { } // 本期最近值 lastValue = last(decimalList); - nowAndRatio(result, item, medianRule, LATEST, lastValue); + nowAndRatio(result, item, lastRule, SalaryStatisticsItemStringRuleEnum.LAST.getValue(), lastValue); + } + } + + /** + * 最旧的值 + * + * @param result + * @param item + * @param nowDetail + * @param lastDetail + * @param sameDetail + */ + private static void calculate4Old(Map result, SalaryStatisticsItemPO item, List> nowDetail, List> lastDetail, List> sameDetail) { + SalaryStatisticsItemRuleDTO oldRule = JSON.parseObject(item.getOldRule(), SalaryStatisticsItemRuleDTO.class); + if (oldRule == null || oldRule.getTotalValue() != 1) { + return; + } + String value = ""; + // 本期 + if (oldRule.getTotalValue() == 1) { + List decimalList = Lists.newArrayList(); + if (StringUtils.isNotEmpty(item.getItemValue())) { + String[] itemValues = item.getItemValue().split(COMMA); + for (String itemId : itemValues) { + for (Map x : nowDetail) { + if (MapUtils.isNotEmpty(x) && StringUtils.isNotBlank(x.get(itemId))) { + decimalList.add(x.get(itemId)); + } + } + } + } + // 本期最近值 + value = old(decimalList); + nowAndRatio(result, item, oldRule, SalaryStatisticsItemStringRuleEnum.OLD.getValue(), value); + } + } + + /** + * 最频繁 + * + * @param result + * @param item + * @param nowDetail + * @param lastDetail + * @param sameDetail + */ + private static void calculate4Frequent(Map result, SalaryStatisticsItemPO item, List> nowDetail, List> lastDetail, List> sameDetail) { + SalaryStatisticsItemRuleDTO frequentRule = JSON.parseObject(item.getOldRule(), SalaryStatisticsItemRuleDTO.class); + if (frequentRule == null || frequentRule.getTotalValue() != 1) { + return; + } + String value = ""; + // 本期 + if (frequentRule.getTotalValue() == 1) { + List decimalList = Lists.newArrayList(); + if (StringUtils.isNotEmpty(item.getItemValue())) { + String[] itemValues = item.getItemValue().split(COMMA); + for (String itemId : itemValues) { + for (Map x : nowDetail) { + if (MapUtils.isNotEmpty(x) && StringUtils.isNotBlank(x.get(itemId))) { + decimalList.add(x.get(itemId)); + } + } + } + } + // 本期最近值 + value = frequent(decimalList); + nowAndRatio(result, item, frequentRule, SalaryStatisticsItemStringRuleEnum.FREQUENT.getValue(), value); + } + } + + /** + * 平铺 + * + * @param result + * @param item + * @param nowDetail + * @param lastDetail + * @param sameDetail + */ + private static void calculate4Tile(Map result, SalaryStatisticsItemPO item, List> nowDetail, List> lastDetail, List> sameDetail) { + SalaryStatisticsItemRuleDTO tileRule = JSON.parseObject(item.getOldRule(), SalaryStatisticsItemRuleDTO.class); + if (tileRule == null || tileRule.getTotalValue() != 1) { + return; + } + String value = ""; + // 本期 + if (tileRule.getTotalValue() == 1) { + List decimalList = Lists.newArrayList(); + if (StringUtils.isNotEmpty(item.getItemValue())) { + String[] itemValues = item.getItemValue().split(COMMA); + for (String itemId : itemValues) { + for (Map x : nowDetail) { + if (MapUtils.isNotEmpty(x) && StringUtils.isNotBlank(x.get(itemId))) { + decimalList.add(x.get(itemId)); + } + } + } + } + // 本期最近值 + value = tile(decimalList); + nowAndRatio(result, item, tileRule, SalaryStatisticsItemStringRuleEnum.TILE.getValue(), value); } } @@ -549,10 +658,6 @@ public class SalaryStatisticsReportBO { String keyPrefix = item.getId().toString() + UD + ruleKey; // 本期合计 result.put(keyPrefix + K_NOW, sumDecimal); -// // 占比:和本期合计一样的值,便于计算 -// if (rule.getRatioValue() == 1) { -// result.put(keyPrefix + K_RATIO, result.get(keyPrefix + K_NOW)); -// } } /** @@ -655,6 +760,7 @@ public class SalaryStatisticsReportBO { /** * 最新的值 + * * @param list * @return */ @@ -665,6 +771,51 @@ public class SalaryStatisticsReportBO { return list.get(0); } + /** + * 最旧的值 + * + * @param list + * @return + */ + public static String old(List list) { + if (CollectionUtils.isEmpty(list)) { + return ""; + } + return list.get(list.size() - 1); + } + + /** + * 最频繁 + * + * @param list + * @return + */ + public static String frequent(List list) { + if (CollectionUtils.isEmpty(list)) { + return ""; + } + return list.stream() + .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) + .entrySet() + .stream() + .max(Map.Entry.comparingByValue()) + .map(Map.Entry::getKey) + .orElse(""); + } + /** + * 平铺 + * + * @param list + * @return + */ + public static String tile(List list) { + if (CollectionUtils.isEmpty(list)) { + return ""; + } + return Joiner.on(",").join((Iterable) list); + } + + public static List> po2map(List list, Map> salaryAcctResultValueMap) { if (CollectionUtils.isEmpty(list)) { return new ArrayList<>(); @@ -1021,6 +1172,26 @@ public class SalaryStatisticsReportBO { children.add(new WeaTableColumnGroup(COL_WIDTH, SalaryI18nUtil.getI18nLabel(174376, "中位数同比差值"), k + UD + MEDIAN + P_Y2Y_D_VALUE)); children.add(new WeaTableColumnGroup(COL_WIDTH, SalaryI18nUtil.getI18nLabel(174377, "中位数同比增幅"), k + UD + MEDIAN + P_Y2Y_INCREASE)); } + // 7.最新值children + SalaryStatisticsItemRuleDTO lastRule = JSON.parseObject(itemPO.getLastRule(), SalaryStatisticsItemRuleDTO.class); + if (lastRule != null && 1 == lastRule.getTotalValue()) { + children.add(new WeaTableColumnGroup(COL_WIDTH, SalaryI18nUtil.getI18nLabel(174246, "最新值"), k + UD + SalaryStatisticsItemStringRuleEnum.LAST.getValue() + P_NOW)); + } + // 8.最旧值children + SalaryStatisticsItemRuleDTO oldRule = JSON.parseObject(itemPO.getOldRule(), SalaryStatisticsItemRuleDTO.class); + if (oldRule != null && 1 == oldRule.getTotalValue()) { + children.add(new WeaTableColumnGroup(COL_WIDTH, SalaryI18nUtil.getI18nLabel(174246, "最旧值"), k + UD + SalaryStatisticsItemStringRuleEnum.OLD.getValue() + P_NOW)); + } + // 9.最频繁children + SalaryStatisticsItemRuleDTO frequentRule = JSON.parseObject(itemPO.getFrequentRule(), SalaryStatisticsItemRuleDTO.class); + if (frequentRule != null && 1 == frequentRule.getTotalValue()) { + children.add(new WeaTableColumnGroup(COL_WIDTH, SalaryI18nUtil.getI18nLabel(174246, "频繁出现"), k + UD + SalaryStatisticsItemStringRuleEnum.FREQUENT.getValue() + P_NOW)); + } + // 10.平铺children + SalaryStatisticsItemRuleDTO tileRule = JSON.parseObject(itemPO.getTileRule(), SalaryStatisticsItemRuleDTO.class); + if (tileRule != null && 1 == tileRule.getTotalValue()) { + children.add(new WeaTableColumnGroup(COL_WIDTH, SalaryI18nUtil.getI18nLabel(174246, "平铺"), k + UD + SalaryStatisticsItemStringRuleEnum.TILE.getValue() + P_NOW)); + } weaTableColumn.setChildren(children); result.add(weaTableColumn); }); diff --git a/src/com/engine/salary/report/entity/dto/SalaryStatisticsItemRuleDTO.java b/src/com/engine/salary/report/entity/dto/SalaryStatisticsItemRuleDTO.java index c64881c59..02cce6b8b 100644 --- a/src/com/engine/salary/report/entity/dto/SalaryStatisticsItemRuleDTO.java +++ b/src/com/engine/salary/report/entity/dto/SalaryStatisticsItemRuleDTO.java @@ -14,30 +14,29 @@ import java.math.BigDecimal; @Builder @NoArgsConstructor @AllArgsConstructor -//"薪酬统计报表自定义统计项目规则") public class SalaryStatisticsItemRuleDTO { - //是否有合计列") + //是否有合计列。若是文本,代表是否显示 private Integer totalValue; - //是否有占比列") + //是否有占比列 private Integer ratioValue; - //是否有环比列") + //是否有环比列 private Integer m2mValue; - //合计环比上限") + //合计环比上限 private BigDecimal m2mUpperLimit; - //合计环比下限") + //合计环比下限 private BigDecimal m2mLowerLimit; - //是否有同比列") + //是否有同比列 private Integer y2yValue; - //合计同比上限") + //合计同比上限 private BigDecimal y2yUpperLimit; - //合计同比下限") + //合计同比下限 private BigDecimal y2yLowerLimit; } diff --git a/src/com/engine/salary/report/entity/param/SalaryStatisticsItemSaveParam.java b/src/com/engine/salary/report/entity/param/SalaryStatisticsItemSaveParam.java index cc856e07f..933843736 100644 --- a/src/com/engine/salary/report/entity/param/SalaryStatisticsItemSaveParam.java +++ b/src/com/engine/salary/report/entity/param/SalaryStatisticsItemSaveParam.java @@ -50,9 +50,20 @@ public class SalaryStatisticsItemSaveParam { //中位数规则 private SalaryStatisticsItemRuleDTO medianRule; - + + //最近值 private SalaryStatisticsItemRuleDTO lastRule; + //最旧值 + private SalaryStatisticsItemRuleDTO oldRule; + + //频繁出现 + private SalaryStatisticsItemRuleDTO frequentRule; + + //平铺 + private SalaryStatisticsItemRuleDTO tileRule; + + //统计单位 private Integer unitType; } diff --git a/src/com/engine/salary/report/entity/po/SalaryStatisticsItemPO.java b/src/com/engine/salary/report/entity/po/SalaryStatisticsItemPO.java index b7ac48bb1..bcf430d57 100644 --- a/src/com/engine/salary/report/entity/po/SalaryStatisticsItemPO.java +++ b/src/com/engine/salary/report/entity/po/SalaryStatisticsItemPO.java @@ -130,7 +130,7 @@ public class SalaryStatisticsItemPO implements Serializable { /** * 最近值 *

- * "able":"1", 是否使用 + * "totalValue":"1", 是否使用 */ private String lastRule; @@ -138,7 +138,7 @@ public class SalaryStatisticsItemPO implements Serializable { * 最早值 *

* { - * "able":"1", 是否使用 + * "totalValue":"1", 是否使用 * } */ private String oldRule; @@ -147,7 +147,7 @@ public class SalaryStatisticsItemPO implements Serializable { * 出现最多 *

* { - * "able":"1", 是否使用 + * "totalValue":"1", 是否使用 * } */ private String frequentRule; @@ -156,7 +156,7 @@ public class SalaryStatisticsItemPO implements Serializable { * 平铺 *

* { - * "able":"1", 是否使用 + * "totalValue":"1", 是否使用 * } */ private String tileRule; diff --git a/src/com/engine/salary/report/enums/SalaryStatisticsItemStringRuleEnum.java b/src/com/engine/salary/report/enums/SalaryStatisticsItemStringRuleEnum.java index 1356b639f..3ca0bdcff 100644 --- a/src/com/engine/salary/report/enums/SalaryStatisticsItemStringRuleEnum.java +++ b/src/com/engine/salary/report/enums/SalaryStatisticsItemStringRuleEnum.java @@ -9,7 +9,7 @@ public enum SalaryStatisticsItemStringRuleEnum implements BaseEnum { LAST("last", "最近值", 83993), OLD("old", "最早值", 83994), - FREQUENT("frequent", "出现最多", 83994), + FREQUENT("frequent", "最频繁", 83994), TILE("tile", "平铺", 83994), ; diff --git a/src/com/engine/salary/report/service/impl/SalaryStatisticsItemServiceImpl.java b/src/com/engine/salary/report/service/impl/SalaryStatisticsItemServiceImpl.java index 8c56dc7ef..6468f3f4b 100644 --- a/src/com/engine/salary/report/service/impl/SalaryStatisticsItemServiceImpl.java +++ b/src/com/engine/salary/report/service/impl/SalaryStatisticsItemServiceImpl.java @@ -116,6 +116,10 @@ public class SalaryStatisticsItemServiceImpl extends Service implements SalarySt .maxRule(SalaryEntityUtil.toJSONString(saveParam.getMaxRule())) .minRule(SalaryEntityUtil.toJSONString(saveParam.getMinRule())) .medianRule(SalaryEntityUtil.toJSONString(saveParam.getMedianRule())) + .lastRule(SalaryEntityUtil.toJSONString(saveParam.getMedianRule())) + .oldRule(SalaryEntityUtil.toJSONString(saveParam.getMedianRule())) + .frequentRule(SalaryEntityUtil.toJSONString(saveParam.getMedianRule())) + .tileRule(SalaryEntityUtil.toJSONString(saveParam.getMedianRule())) .indexValue(max + 1) .statReportId(saveParam.getStatReportId()) .unitType(saveParam.getUnitType() == null ? UnitTypeEnum.YUAN.getValue() : saveParam.getUnitType()) @@ -149,6 +153,10 @@ public class SalaryStatisticsItemServiceImpl extends Service implements SalarySt itemPO.setMaxRule(SalaryEntityUtil.toJSONString(saveParam.getMaxRule())); itemPO.setMinRule(SalaryEntityUtil.toJSONString(saveParam.getMinRule())); itemPO.setMedianRule(SalaryEntityUtil.toJSONString(saveParam.getMedianRule())); + itemPO.setLastRule(SalaryEntityUtil.toJSONString(saveParam.getLastRule())); + itemPO.setOldRule(SalaryEntityUtil.toJSONString(saveParam.getOldRule())); + itemPO.setFrequentRule(SalaryEntityUtil.toJSONString(saveParam.getFrequentRule())); + itemPO.setTileRule(SalaryEntityUtil.toJSONString(saveParam.getTileRule())); } getSalaryStatisticsItemMapper().updateIgnoreNull(itemPO);