薪酬系统-薪资核算,自定义导出字段
This commit is contained in:
parent
d10d5da364
commit
c78c8375f0
|
|
@ -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";
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -57,4 +57,7 @@ public class SalaryAcctResultQueryParam extends BaseQueryParam {
|
|||
private Collection<Long> ids;
|
||||
|
||||
private String workcode;
|
||||
|
||||
//薪资项目id
|
||||
private Collection<Long> salaryItemIds;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
//
|
||||
// /**
|
||||
// * 薪资核算结果校验异常导出
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
Loading…
Reference in New Issue