拓扑图

This commit is contained in:
钱涛 2023-10-17 14:24:52 +08:00
parent e8f124d58c
commit cf1e1395f7
6 changed files with 91 additions and 128 deletions

View File

@ -1,9 +1,6 @@
package com.engine.salary.entity.salarysob.dto; package com.engine.salary.entity.salarysob.dto;
import com.engine.salary.entity.salaryformula.ExpressFormula; import com.engine.salary.entity.salaryformula.ExpressFormula;
import com.engine.salary.enums.SalaryRoundingModeEnum;
import com.engine.salary.enums.SalaryValueTypeEnum;
import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum;
import lombok.Data; import lombok.Data;
import java.util.List; import java.util.List;
@ -21,42 +18,16 @@ public class SalaryItemTopologyDTO {
*/ */
private String salaryItemName; private String salaryItemName;
/**
* 核算时隐藏
*/
private Integer itemHide;
/**
* 字段类型
*
* @see SalaryDataTypeEnum
*/
private String dataType;
/**
* 舍入规则
*
* @see SalaryRoundingModeEnum
*/
private Integer roundingMode;
/**
* 保留小数位
*/
private Integer pattern;
/**
* 取值方式
*
* @see SalaryValueTypeEnum
*/
private Integer valueType;
/** /**
* 公式 * 公式
*/ */
ExpressFormula formula; ExpressFormula formula;
/**
* 核算值
*/
private String result;
private List<SalaryItemTopologyDTO> children; private List<SalaryItemTopologyDTO> children;
} }

View File

@ -20,10 +20,19 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor @AllArgsConstructor
public class SalaryItemTopologyQueryParam { public class SalaryItemTopologyQueryParam {
//薪资账套id /**
* 薪资账套id
*/
@DataCheck(require = true, message = "薪资账套的ID不允许为空") @DataCheck(require = true, message = "薪资账套的ID不允许为空")
private Long salarySobId; private Long salarySobId;
//薪资项目id /**
* 薪资项目id
*/
private Long salaryItemId; private Long salaryItemId;
/**
* 薪资核算人员id
*/
private Long acctEmpId;
} }

View File

@ -1,6 +1,5 @@
package com.engine.salary.service; package com.engine.salary.service;
import com.engine.salary.entity.salaryacct.bo.SalaryCalcItem;
import com.engine.salary.entity.salaryitem.po.SalaryItemPO; import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
import com.engine.salary.entity.salarysob.dto.SalaryItemTopologyDTO; import com.engine.salary.entity.salarysob.dto.SalaryItemTopologyDTO;
import com.engine.salary.entity.salarysob.dto.SalarySobItemAggregateDTO; import com.engine.salary.entity.salarysob.dto.SalarySobItemAggregateDTO;
@ -130,9 +129,16 @@ public interface SalarySobItemService {
*/ */
SalarySobItemFormDTO getSalaryItemForm(SalarySobItemPO param); SalarySobItemFormDTO getSalaryItemForm(SalarySobItemPO param);
/**
* 更新
* @param po
*/
void update(SalarySobItemPO po); void update(SalarySobItemPO po);
List<SalaryCalcItem> itemTopology(Long salarySobId); /**
* 拓扑图
* @param param
* @return
*/
SalaryItemTopologyDTO topology(SalaryItemTopologyQueryParam param); SalaryItemTopologyDTO topology(SalaryItemTopologyQueryParam param);
} }

View File

@ -7,8 +7,7 @@ import com.engine.salary.biz.SalarySobItemBiz;
import com.engine.salary.biz.SalarySobItemGroupBiz; import com.engine.salary.biz.SalarySobItemGroupBiz;
import com.engine.salary.biz.SalarySobItemHideBiz; import com.engine.salary.biz.SalarySobItemHideBiz;
import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.constant.SalaryDefaultTenantConstant;
import com.engine.salary.entity.salaryacct.bo.SalaryCalcItem; import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO;
import com.engine.salary.entity.salaryacct.bo.SalaryCalcItemGraph;
import com.engine.salary.entity.salaryformula.ExpressFormula; import com.engine.salary.entity.salaryformula.ExpressFormula;
import com.engine.salary.entity.salaryformula.po.FormulaVar; import com.engine.salary.entity.salaryformula.po.FormulaVar;
import com.engine.salary.entity.salaryitem.po.SalaryItemPO; import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
@ -101,6 +100,10 @@ public class SalarySobItemServiceImpl extends Service implements SalarySobItemSe
private SalarySobDefaultItemMapper getSalarySobDefaultItemMapper() { private SalarySobDefaultItemMapper getSalarySobDefaultItemMapper() {
return MapperProxyFactory.getProxy(SalarySobDefaultItemMapper.class); return MapperProxyFactory.getProxy(SalarySobDefaultItemMapper.class);
} }
private SalaryAcctResultService getSalaryAcctResultService(User user) {
return ServiceUtil.getService(SalaryAcctResultServiceImpl.class, user);
}
// private LoggerTemplate salarySobLoggerTemplate; // private LoggerTemplate salarySobLoggerTemplate;
@Override @Override
@ -807,31 +810,15 @@ public class SalarySobItemServiceImpl extends Service implements SalarySobItemSe
return salarySobItemFormDTO; return salarySobItemFormDTO;
} }
/**
@Override * 拓扑图
public List<SalaryCalcItem> itemTopology(Long salarySobId) { *
// 3查询薪资核算记录所用薪资账套的薪资项目副本 * @param param
List<SalarySobItemPO> salarySobItemPOS = listBySalarySobId(salarySobId); * @return
if (CollectionUtils.isEmpty(salarySobItemPOS)) { */
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(99151, "当前所用的薪资账套未选择任何薪资项目,无法核算"));
}
// 4查询当前租户的所有薪资项目
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listAll();
// 8查询公式详情
Set<Long> formulaIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getFormulaId);
formulaIds.addAll(SalaryEntityUtil.properties(salaryItemPOS, SalaryItemPO::getFormulaId));
List<ExpressFormula> expressFormulas = getSalaryFormulaService(user).listExpressFormula(formulaIds);
// 9计算薪资项目的运算优先级
SalaryCalcItemGraph salaryCalcItemGraph = new SalaryCalcItemGraph(salarySobItemPOS, salaryItemPOS, expressFormulas);
List<SalaryCalcItem> salaryCalcItems = salaryCalcItemGraph.sort();
return salaryCalcItems;
}
@Override @Override
public SalaryItemTopologyDTO topology(SalaryItemTopologyQueryParam param) { public SalaryItemTopologyDTO topology(SalaryItemTopologyQueryParam param) {
// 查询薪资账套 // 查询薪资账套
SalarySobPO salarySobPO = salarySobBiz.getById(param.getSalarySobId()); SalarySobPO salarySobPO = salarySobBiz.getById(param.getSalarySobId());
if (Objects.isNull(salarySobPO)) { if (Objects.isNull(salarySobPO)) {
@ -848,35 +835,30 @@ public class SalarySobItemServiceImpl extends Service implements SalarySobItemSe
//所有薪资项目 //所有薪资项目
TopologyData topologyData = init(param); TopologyData topologyData = init(param);
SalaryItemPO salaryItemPO = topologyData.getSalaryItemPO(); SalaryItemPO salaryItemPO = topologyData.getSalaryItemPO();
Map<Long, SalaryItemPO> salaryItemIdMap = topologyData.getSalaryItemIdMap();
List<Long> hideItemIds = topologyData.getHideItemIds();
// 获取薪资项目公式 // 获取薪资项目公式
ExpressFormula expressFormula = getSalaryFormulaService(user).getExpressFormula(salarySobItemPO.getFormulaId()); ExpressFormula expressFormula = getSalaryFormulaService(user).getExpressFormula(salarySobItemPO.getFormulaId());
SalaryItemTopologyDTO salaryItemTopologyDTO = new SalaryItemTopologyDTO(); SalaryItemTopologyDTO salaryItemTopologyDTO = new SalaryItemTopologyDTO();
salaryItemTopologyDTO.setSalaryItemId(salarySobItemPO.getId()); salaryItemTopologyDTO.setSalaryItemId(salaryItemPO.getId());
salaryItemTopologyDTO.setSalaryItemName(salaryItemPO.getName()); salaryItemTopologyDTO.setSalaryItemName(salaryItemPO.getName());
salaryItemTopologyDTO.setItemHide(hideItemIds.contains(salaryItemPO.getId()) ? 1 : 0);
salaryItemTopologyDTO.setDataType(salaryItemPO.getDataType());
salaryItemTopologyDTO.setRoundingMode(salarySobItemPO.getRoundingMode() == null ? salaryItemPO.getRoundingMode() : salarySobItemPO.getRoundingMode());
salaryItemTopologyDTO.setPattern(salarySobItemPO.getPattern() == null ? salaryItemPO.getPattern() : salarySobItemPO.getPattern());
salaryItemTopologyDTO.setValueType(salarySobItemPO.getValueType() == null ? salaryItemPO.getValueType() : salarySobItemPO.getValueType());
salaryItemTopologyDTO.setFormula(expressFormula); salaryItemTopologyDTO.setFormula(expressFormula);
salaryItemTopologyDTO.setResult(topologyData.getResultItemMap().getOrDefault(salaryItemPO.getId(), ""));
topology(salaryItemTopologyDTO, topologyData); topology(salaryItemTopologyDTO, topologyData);
return salaryItemTopologyDTO; return salaryItemTopologyDTO;
} }
/**
* 递归拓扑
*
* @param salaryItemTopologyDTO
* @param topologyData
*/
private void topology(SalaryItemTopologyDTO salaryItemTopologyDTO, TopologyData topologyData) { private void topology(SalaryItemTopologyDTO salaryItemTopologyDTO, TopologyData topologyData) {
List<Long> hideItemIds = topologyData.getHideItemIds();
Long salaryItemId = topologyData.getSalaryItemId(); Long salaryItemId = topologyData.getSalaryItemId();
Map<Long, SalaryItemPO> salaryItemIdMap = topologyData.getSalaryItemIdMap(); Map<Long, SalaryItemPO> salaryItemIdMap = topologyData.getSalaryItemIdMap();
SalaryItemPO salaryItemPO = salaryItemIdMap.get(salaryItemId);
Map<String, SalaryItemPO> salaryItemCodeMap = topologyData.getSalaryItemCodeMap(); Map<String, SalaryItemPO> salaryItemCodeMap = topologyData.getSalaryItemCodeMap();
Map<String, SalarySobItemPO> salarySobItemCodeMap = topologyData.getSalarySobItemCodeMap(); Map<String, SalarySobItemPO> salarySobItemCodeMap = topologyData.getSalarySobItemCodeMap();
Map<Long, ExpressFormula> expressFormulaIdMap = topologyData.getExpressFormulaIdMap(); Map<Long, ExpressFormula> expressFormulaIdMap = topologyData.getExpressFormulaIdMap();
@ -891,7 +873,7 @@ public class SalarySobItemServiceImpl extends Service implements SalarySobItemSe
String source = formulaVar.getSource(); String source = formulaVar.getSource();
String fieldId = formulaVar.getFieldId().replace(source + "_", ""); String fieldId = formulaVar.getFieldId().replace(source + "_", "");
String name = formulaVar.getName(); String name = formulaVar.getName();
String fieldName = formulaVar.getFieldName();
//是否是薪资项目 //是否是薪资项目
boolean isSalaryItemVar; boolean isSalaryItemVar;
SalaryFormulaReferenceEnum salaryFormulaReferenceEnum = SalaryFormulaReferenceEnum.parseByValue(source); SalaryFormulaReferenceEnum salaryFormulaReferenceEnum = SalaryFormulaReferenceEnum.parseByValue(source);
@ -909,26 +891,20 @@ public class SalarySobItemServiceImpl extends Service implements SalarySobItemSe
ExpressFormula expressFormula; ExpressFormula expressFormula;
if (salarySobItemCodeMap.containsKey(fieldId)) { if (salarySobItemCodeMap.containsKey(fieldId)) {
// 如果薪资账套下重新定义了薪资项目的公式则使用薪资账套下的公式否则使用薪资项目本身的公式 // 如果薪资账套下重新定义了薪资项目的公式则使用薪资账套下的公式否则使用薪资项目本身的公式
expressFormula = expressFormulaIdMap.get(salarySobItemCodeMap.get(salaryItemPO.getCode()).getFormulaId()); expressFormula = expressFormulaIdMap.get(salarySobItemCodeMap.get(fieldId).getFormulaId());
} else if (salaryItemCodeMap.containsKey(fieldId)) {
expressFormula = expressFormulaIdMap.get(salaryItemCodeMap.get(fieldId).getFormulaId());
} else { } else {
expressFormula = expressFormulaIdMap.get(salaryItemPO.getFormulaId()); expressFormula = null;
} }
SalaryItemPO salaryItemChild = isSalaryItemVar ? salaryItemCodeMap.get(fieldId) : new SalaryItemPO();
SalarySobItemPO salarySobItemChild = salarySobItemCodeMap.get(fieldId);
if (salarySobItemChild == null) { SalaryItemPO salaryItemChild = isSalaryItemVar ? salaryItemCodeMap.get(fieldId) : new SalaryItemPO();
continue;
}
SalaryItemTopologyDTO salaryItemTopologyChild = new SalaryItemTopologyDTO(); SalaryItemTopologyDTO salaryItemTopologyChild = new SalaryItemTopologyDTO();
salaryItemTopologyChild.setSalaryItemId(salaryItemChild.getId()); salaryItemTopologyChild.setSalaryItemId(isSalaryItemVar ? salaryItemChild.getId() : null);
salaryItemTopologyChild.setSalaryItemName(salaryItemChild.getName()); salaryItemTopologyChild.setSalaryItemName(isSalaryItemVar ? salaryItemChild.getName() : fieldName);
salaryItemTopologyChild.setItemHide(hideItemIds.contains(salaryItemChild.getId()) ? 1 : 0);
salaryItemTopologyChild.setDataType(salaryItemChild.getDataType());
salaryItemTopologyChild.setRoundingMode(salarySobItemChild == null ? salaryItemChild.getRoundingMode() : salarySobItemChild.getRoundingMode());
salaryItemTopologyChild.setPattern(salarySobItemChild == null ? salaryItemChild.getPattern() : salarySobItemChild.getPattern());
salaryItemTopologyChild.setValueType(salarySobItemChild == null ? salaryItemChild.getValueType() : salarySobItemChild.getValueType());
salaryItemTopologyChild.setFormula(expressFormula); salaryItemTopologyChild.setFormula(expressFormula);
salaryItemTopologyChild.setResult(isSalaryItemVar ? topologyData.getResultItemMap().getOrDefault(salaryItemChild.getId(), "") : "");
salaryItemTopologyDTOChildren.add(salaryItemTopologyChild); salaryItemTopologyDTOChildren.add(salaryItemTopologyChild);
if (isSalaryItemVar) { if (isSalaryItemVar) {
@ -949,18 +925,9 @@ public class SalarySobItemServiceImpl extends Service implements SalarySobItemSe
private TopologyData init(SalaryItemTopologyQueryParam param) { private TopologyData init(SalaryItemTopologyQueryParam param) {
TopologyData topologyData = new TopologyData(); TopologyData topologyData = new TopologyData();
//薪资项目
topologyData.setSalaryItemId(param.getSalaryItemId()); topologyData.setSalaryItemId(param.getSalaryItemId());
// 获取核算时隐藏的薪资项目id
List<Long> hideItemIds = getSalarySobItemHideService(user).listHideGroupBysalarySobId(SalarySobItemHidePO.builder()
.salarySobId(param.getSalarySobId())
.isGroup(new Integer(0))
.salaryItemId(param.getSalaryItemId())
.build());
topologyData.setHideItemIds(hideItemIds);
List<SalaryItemPO> salaryItems = getSalaryItemService(user).listAll(); List<SalaryItemPO> salaryItems = getSalaryItemService(user).listAll();
topologyData.setSalaryItems(salaryItems);
Map<Long, SalaryItemPO> salaryItemIdMap = SalaryEntityUtil.convert2Map(salaryItems, SalaryItemPO::getId); Map<Long, SalaryItemPO> salaryItemIdMap = SalaryEntityUtil.convert2Map(salaryItems, SalaryItemPO::getId);
topologyData.setSalaryItemIdMap(salaryItemIdMap); topologyData.setSalaryItemIdMap(salaryItemIdMap);
@ -973,38 +940,56 @@ public class SalarySobItemServiceImpl extends Service implements SalarySobItemSe
//账套项目 //账套项目
List<SalarySobItemPO> salarySobItems = listBySalarySobId(param.getSalarySobId()); List<SalarySobItemPO> salarySobItems = listBySalarySobId(param.getSalarySobId());
topologyData.setSalarySobItems(salarySobItems);
Map<String, SalarySobItemPO> salarySobItemCodeMap = SalaryEntityUtil.convert2Map(salarySobItems, SalarySobItemPO::getSalaryItemCode); Map<String, SalarySobItemPO> salarySobItemCodeMap = SalaryEntityUtil.convert2Map(salarySobItems, SalarySobItemPO::getSalaryItemCode);
topologyData.setSalarySobItemCodeMap(salarySobItemCodeMap); topologyData.setSalarySobItemCodeMap(salarySobItemCodeMap);
//公式 //公式
List<ExpressFormula> expressFormulas = getSalaryFormulaService(user).listAllExpressFormula(); List<ExpressFormula> expressFormulas = getSalaryFormulaService(user).listAllExpressFormula();
topologyData.setExpressFormulas(expressFormulas);
Map<Long, ExpressFormula> expressFormulaIdMap = SalaryEntityUtil.convert2Map(expressFormulas, ExpressFormula::getId); Map<Long, ExpressFormula> expressFormulaIdMap = SalaryEntityUtil.convert2Map(expressFormulas, ExpressFormula::getId);
topologyData.setExpressFormulaIdMap(expressFormulaIdMap); topologyData.setExpressFormulaIdMap(expressFormulaIdMap);
//薪资结果
Long acctEmpId = param.getAcctEmpId();
if (acctEmpId != null) {
List<SalaryAcctResultPO> results = getSalaryAcctResultService(user).listBySalaryAcctEmployeeId(acctEmpId);
Map<Long, String> resultItemMap = SalaryEntityUtil.convert2Map(results, SalaryAcctResultPO::getSalaryItemId, SalaryAcctResultPO::getResultValue);
topologyData.setResultItemMap(resultItemMap);
} else {
topologyData.setResultItemMap(new HashMap<>());
}
return topologyData; return topologyData;
} }
@Data @Data
class TopologyData { class TopologyData {
/**
* 薪资项目id
*/
Long salaryItemId; Long salaryItemId;
List<Long> hideItemIds; /**
* 薪资项目
List<SalaryItemPO> salaryItems; */
Map<Long, SalaryItemPO> salaryItemIdMap; Map<Long, SalaryItemPO> salaryItemIdMap;
Map<String, SalaryItemPO> salaryItemCodeMap; Map<String, SalaryItemPO> salaryItemCodeMap;
//账套项目 /**
* 账套项目
*/
SalaryItemPO salaryItemPO; SalaryItemPO salaryItemPO;
List<SalarySobItemPO> salarySobItems;
Map<String, SalarySobItemPO> salarySobItemCodeMap; Map<String, SalarySobItemPO> salarySobItemCodeMap;
//公式 /**
List<ExpressFormula> expressFormulas; * 公式
*/
Map<Long, ExpressFormula> expressFormulaIdMap; Map<Long, ExpressFormula> expressFormulaIdMap;
/**
* 核算结果
*/
Map<Long, String> resultItemMap;
} }

View File

@ -2,7 +2,6 @@ package com.engine.salary.web;
import com.engine.common.util.ServiceUtil; import com.engine.common.util.ServiceUtil;
import com.engine.salary.entity.SalarySobExtRangePO; import com.engine.salary.entity.SalarySobExtRangePO;
import com.engine.salary.entity.salaryacct.bo.SalaryCalcItem;
import com.engine.salary.entity.salaryitem.dto.SalaryItemSobListDTO; import com.engine.salary.entity.salaryitem.dto.SalaryItemSobListDTO;
import com.engine.salary.entity.salaryitem.param.SalaryItemSearchParam; import com.engine.salary.entity.salaryitem.param.SalaryItemSearchParam;
import com.engine.salary.entity.salarysob.dto.*; import com.engine.salary.entity.salarysob.dto.*;
@ -388,19 +387,12 @@ public class SalarySobController {
/** /**
* 账套项目拓扑图 * 账套项目拓扑图
*
* @param request * @param request
* @param response * @param response
* @param salarySobId * @param param
* @return * @return
*/ */
@GET
@Path("/item/topology")
@Produces(MediaType.APPLICATION_JSON)
public String topology(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "salarySobId") Long salarySobId) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<Long, List<SalaryCalcItem>>(user).run(getSalarySobItemWrapper(user)::itemTopology, salarySobId);
}
@POST @POST
@Path("/item/topology") @Path("/item/topology")
@Produces(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON)
@ -486,7 +478,7 @@ public class SalarySobController {
@Produces(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON)
public String saveSalarySobAddUp(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalarySobAddUpRuleSaveParam saveParam) { public String saveSalarySobAddUp(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalarySobAddUpRuleSaveParam saveParam) {
User user = HrmUserVarify.getUser(request, response); User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<SalarySobAddUpRuleSaveParam,String>(user).run(getSalarySobAddUpRuleWrapper(user)::save, saveParam); return new ResponseResult<SalarySobAddUpRuleSaveParam, String>(user).run(getSalarySobAddUpRuleWrapper(user)::save, saveParam);
} }
/**********************************薪资账套的累计字段对应关系 end*********************************/ /**********************************薪资账套的累计字段对应关系 end*********************************/

View File

@ -3,7 +3,6 @@ package com.engine.salary.wrapper;
import com.engine.common.util.ServiceUtil; import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service; import com.engine.core.impl.Service;
import com.engine.salary.annotation.SalaryFormulaVar; import com.engine.salary.annotation.SalaryFormulaVar;
import com.engine.salary.entity.salaryacct.bo.SalaryCalcItem;
import com.engine.salary.entity.salaryformula.ExpressFormula; import com.engine.salary.entity.salaryformula.ExpressFormula;
import com.engine.salary.entity.salaryformula.dto.SalaryFormulaEmployeeDTO; import com.engine.salary.entity.salaryformula.dto.SalaryFormulaEmployeeDTO;
import com.engine.salary.entity.salaryitem.bo.SalaryItemBO; import com.engine.salary.entity.salaryitem.bo.SalaryItemBO;
@ -181,12 +180,13 @@ public class SalarySobItemWrapper extends Service {
return getSalarySobItemService(user).getSalaryItemForm(param); return getSalarySobItemService(user).getSalaryItemForm(param);
} }
public List<SalaryCalcItem> itemTopology(Long salarySobId) {
return getSalarySobItemService(user).itemTopology(salarySobId);
}
/**
* 拓扑图
* @param param
* @return
*/
public SalaryItemTopologyDTO topology(SalaryItemTopologyQueryParam param) { public SalaryItemTopologyDTO topology(SalaryItemTopologyQueryParam param) {
return getSalarySobItemService(user).topology(param); return getSalarySobItemService(user).topology(param);
} }