薪酬系统-薪资核算,自定义导出字段

This commit is contained in:
sy 2023-07-12 15:20:02 +08:00
parent d10d5da364
commit c78c8375f0
5 changed files with 169 additions and 5 deletions

View File

@ -20,5 +20,10 @@ public class SalaryItemConstant {
*/
public static final String RESULT_IMPORT_FIELD_SIGN="_salaryAcctResultImportFieldSign";
/**
* 薪资核算导出缓存表头字段key
*/
public static final String RESULT_EXPORT_FIELD_SIGN="_salaryAcctResultExportFieldSign";
}

View File

@ -57,4 +57,7 @@ public class SalaryAcctResultQueryParam extends BaseQueryParam {
private Collection<Long> ids;
private String workcode;
//薪资项目id
private Collection<Long> salaryItemIds;
}

View File

@ -73,6 +73,14 @@ public interface SalaryAcctExcelService {
*/
SalaryAcctImportFieldDTO getImportField(Long salaryAcctId);
/**
* 薪资核算导出时候薪资项目按取值方式分组
*
* @param salaryAcctId
* @return
*/
SalaryAcctImportFieldDTO getExportField(Long salaryAcctId);
/**
* 下载薪资核算导入模板
*
@ -110,6 +118,8 @@ public interface SalaryAcctExcelService {
void cacheImportField(List<Long> salaryItems);
void cacheExportField(List<Long> salaryItems);
//
// /**
// * 薪资核算结果校验异常导出

View File

@ -287,12 +287,38 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc
List<WeaTableColumnGroup> headerColumnGroup = Lists.newArrayList();
// 查询列表的表头
List<WeaTableColumnGroup> weaTableColumns = listWeaTableColumn(salaryAcctRecordPO);
parseHeader(headerColumnGroup, weaTableColumns);
//判断是否按照自定义字段导出表头
List<WeaTableColumnGroup> finalWeaTableColumns = new ArrayList<>();
if (queryParam.getSalaryItemIds() != null ) {
// 必须选择导出所需的薪资项目
if (CollectionUtils.isEmpty(queryParam.getSalaryItemIds())) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(99019, "参数错误,请选择导入模板所需的薪资项目"));
}
List<Object> headerRangeList = new ArrayList<>();
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listByIds(queryParam.getSalaryItemIds());
for (SalaryItemPO salaryItemPO : salaryItemPOS) {
headerRangeList.add(salaryItemPO.getId().toString());
}
for (WeaTableColumnGroup tableColumn : weaTableColumns) {
WeaTableColumnGroup columnGroupItem = (WeaTableColumnGroup) tableColumn;
if (columnGroupItem.getChildren() != null) {
List<WeaTableColumnGroup> childrenColumns = columnGroupItem.getChildren().stream().filter(f -> headerRangeList.contains(f.getColumn())).collect(Collectors.toList());
if (childrenColumns.size() > 0) {
columnGroupItem.setChildren(childrenColumns);
finalWeaTableColumns.add(columnGroupItem);
}
} else if (headerRangeList.contains(columnGroupItem.getColumn())) {
finalWeaTableColumns.add(columnGroupItem);
}
}
} else {
finalWeaTableColumns = weaTableColumns;
}
// parseHeader(headerColumnGroup, weaTableColumns);
parseHeader(headerColumnGroup, finalWeaTableColumns);
// // excel导出的表头
// String[] headers = headerColumnGroup.stream()
// .map(WeaTableColumn::getText)
// .toArray(String[]::new);
// List<Object> headerList = new ArrayList<>(Arrays.asList(headers));
List<Object> headerList = new ArrayList<>(weaTableColumns);
// 查询薪资核算结果
List<Map<String, Object>> resultMapList = getSalaryAcctResultService(user).listByParam(queryParam);
@ -461,6 +487,70 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc
return SalaryAcctImportFieldDTO.builder().itemsByGroup(itemsByGroup).checkItems(checkItems).build();
}
@Override
public SalaryAcctImportFieldDTO getExportField(Long salaryAcctRecordId) {
// 查询薪资核算记录
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(salaryAcctRecordId);
if (Objects.isNull(salaryAcctRecordPO)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除"));
}
// 查询薪资核算记录所用的薪资账套的薪资项目副本
List<SalarySobItemPO> salarySobItems = getSalarySobItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
Set<Long> salaryItemIds = SalaryEntityUtil.properties(salarySobItems, SalarySobItemPO::getSalaryItemId);
// 查询薪资项目
List<SalaryItemPO> salaryItems = getSalaryItemService(user).listByIds(salaryItemIds);
Map<Long, SalaryItemPO> salaryItemMap = SalaryEntityUtil.convert2Map(salaryItems, SalaryItemPO::getId);
Map<Long, List<SalarySobItemPO>> salarySobItemPOMap = SalaryEntityUtil.group2Map(salarySobItems, SalarySobItemPO::getSalarySobItemGroupId);
// 查询薪资账套的薪资项目分类
List<SalarySobItemGroupPO> salarySobItemGroupPOS = getSalarySobItemGroupService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
// 对分组进行排序
salarySobItemGroupPOS = SalaryAcctResultBO.sortGroup(salarySobItemGroupPOS);
// 对分组内薪资项目排序
SalaryAcctResultBO.sortItem(salarySobItemPOMap);
// 根据账套分组封装薪资项目的值
List<SalaryAcctImportFieldDTO.ImportFieldByGroupDTO> itemsByGroup = new ArrayList<>();
for(SalarySobItemGroupPO groupPO : salarySobItemGroupPOS){
List<SalarySobItemPO> groupItems = salarySobItemPOMap.getOrDefault(groupPO.getId(),Collections.emptyList());
List<SalaryAcctImportFieldDTO.ImportFieldDTO> items = groupItems.stream()
.map(salarySobItemPO -> SalaryAcctImportFieldDTO.ImportFieldDTO.builder()
.salaryItemId(salarySobItemPO.getSalaryItemId())
.salaryItemName(Optional.ofNullable(salaryItemMap.get(salarySobItemPO.getSalaryItemId())).map(SalaryItemPO::getName).orElse(StringUtils.EMPTY))
.build())
.collect(Collectors.toList());
itemsByGroup.add(SalaryAcctImportFieldDTO.ImportFieldByGroupDTO.builder()
.salarySobItemGroupId(groupPO.getId())
.salarySobItemGroupName(groupPO.getName())
.salaryItems(items)
.sortedIndex(groupPO.getSortedIndex()).build() );
}
// 未分类
List<SalarySobItemPO> noGroupItems = salarySobItemPOMap.getOrDefault(0L, Collections.emptyList());
if(CollectionUtils.isNotEmpty(noGroupItems)){
List<SalaryAcctImportFieldDTO.ImportFieldDTO> items = noGroupItems.stream()
.map(salarySobItemPO ->SalaryAcctImportFieldDTO.ImportFieldDTO.builder()
.salaryItemId(salarySobItemPO.getSalaryItemId())
.salaryItemName(Optional.ofNullable(salaryItemMap.get(salarySobItemPO.getSalaryItemId())).map(SalaryItemPO::getName).orElse(StringUtils.EMPTY))
.build())
.collect(Collectors.toList());
itemsByGroup.add(SalaryAcctImportFieldDTO.ImportFieldByGroupDTO.builder()
.salarySobItemGroupId(0L)
.salarySobItemGroupName("未分类")
.salaryItems(items)
.sortedIndex(itemsByGroup.size()).build());
}
// 缓存勾选
String cacheKey = user.getUID() + SalaryItemConstant.RESULT_EXPORT_FIELD_SIGN;
String cacheValue = (String)Util_DataCache.getObjVal(cacheKey);
List<Long> checkItems = JsonUtil.parseList(cacheValue, Long.class) == null ? new ArrayList<>() : JsonUtil.parseList(cacheValue, Long.class);
// 转换成dto
// return SalaryAcctImportFieldDTO.builder().formulaItems(formulaItems).sqlItems(sqlItems).inputItems(inputItems).checkItems(checkItems).build();
return SalaryAcctImportFieldDTO.builder().itemsByGroup(itemsByGroup).checkItems(checkItems).build();
}
@Override
public XSSFWorkbook exportImportTemplate(SalaryAcctImportTemplateParam param) {
ValidUtil.doValidator(param);
@ -697,6 +787,12 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc
Util_DataCache.setObjVal(cacheKey, JsonUtil.toJsonString(salaryItems));
}
@Override
public void cacheExportField(List<Long> salaryItems) {
String cacheKey = user.getUID() + SalaryItemConstant.RESULT_EXPORT_FIELD_SIGN;
Util_DataCache.setObjVal(cacheKey, JsonUtil.toJsonString(salaryItems));
}
@Override
public Map<String, Object> previewImportSalaryAcctResult(SalaryAcctImportParam param) {

View File

@ -481,6 +481,38 @@ public class SalaryAcctController {
}
}
//导出核算结果(自定义导出字段)
@GET
@Path("/acctresult/exportWithCustomFields")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response exportSalaryAcctResultWithCustomFields(@Context HttpServletRequest request, @Context HttpServletResponse response) {
try {
SalaryAcctResultQueryParam param = new SalaryAcctResultQueryParam();
setSalaryAcctResultQueryParam(request, param);
String salaryItemIds = request.getParameter("salaryItemIds");
if (StringUtils.isNotBlank(salaryItemIds)) {
param.setSalaryItemIds(Arrays.stream(salaryItemIds.split(",")).map(Long::valueOf).collect(Collectors.toList()));
}
User user = HrmUserVarify.getUser(request, response);
XSSFWorkbook workbook = getSalaryAcctExcelWrapper(user).exportSalaryAcctResult(param);
String fileName = "薪资核算结果" + LocalDate.now();
try {
fileName = URLEncoder.encode(fileName + ".xlsx", "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
StreamingOutput output = outputStream -> {
workbook.write(outputStream);
outputStream.flush();
};
response.setContentType("application/octet-stream");
return Response.ok(output).header("Content-disposition", "attachment;filename=" + fileName).header("Cache-Control", "no-cache").build();
} catch (Exception e) {
log.error("薪资核算结果导出异常", e);
throw e;
}
}
//导入核算结果前生成导入模板时可选的薪资项目
@GET
@ -491,6 +523,15 @@ public class SalaryAcctController {
return new ResponseResult<Long, SalaryAcctImportFieldDTO>(user).run(getSalaryAcctExcelService(user)::getImportField, salaryAcctRecordId);
}
//导出核算结果前生成可选的薪资项目
@GET
@Path("/acctresult/exportField")
@Produces(MediaType.APPLICATION_JSON)
public String exportField(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "salaryAcctRecordId") Long salaryAcctRecordId) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<Long, SalaryAcctImportFieldDTO>(user).run(getSalaryAcctExcelService(user)::getExportField, salaryAcctRecordId);
}
// 薪资核算导入字段缓存
@POST
@Path("/acctresult/cacheImportField")
@ -500,6 +541,15 @@ public class SalaryAcctController {
return new ResponseResult<List<Long>, String>(user).run(getSalaryAcctExcelService(user)::cacheImportField, param.getSalaryItems());
}
// 薪资核算导出字段缓存
@POST
@Path("/acctresult/cacheExportField")
@Produces(MediaType.APPLICATION_JSON)
public String cacheExportField(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctImportParam param) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<List<Long>, String>(user).run(getSalaryAcctExcelService(user)::cacheExportField, param.getSalaryItems());
}
//导出导入模板
@GET
@Path("/acctresult/importtemplate/export")