package com.engine.salary.web;
import com.engine.common.util.ServiceUtil;
import com.engine.salary.entity.salaryarchive.dto.*;
import com.engine.salary.entity.salaryarchive.param.*;
import com.engine.salary.enums.salaryarchive.SalaryArchiveImportTypeEnum;
import com.engine.salary.enums.salaryarchive.SalaryArchiveListTypeEnum;
import com.engine.salary.enums.salaryarchive.SalaryArchiveStatusEnum;
import com.engine.salary.util.ResponseResult;
import com.engine.salary.util.SalaryDateUtil;
import com.engine.salary.util.SalaryI18nUtil;
import com.engine.salary.util.page.PageInfo;
import com.engine.salary.wrapper.SalaryArchiveItemWrapper;
import com.engine.salary.wrapper.SalaryArchiveTaxAgentWrapper;
import com.engine.salary.wrapper.SalaryArchiveWrapper;
import io.swagger.v3.oas.annotations.parameters.RequestBody;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import weaver.hrm.HrmUserVarify;
import weaver.hrm.User;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
/**
* 薪资档案
*
Copyright: Copyright (c) 2022
* Company: 泛微软件
*
* @author qiantao
* @version 1.0
**/
@Slf4j
public class SalaryArchiveController {
private SalaryArchiveWrapper getSalaryArchiveWrapper(User user) {
return ServiceUtil.getService(SalaryArchiveWrapper.class, user);
}
private SalaryArchiveItemWrapper getSalaryArchiveItemWrapper(User user) {
return ServiceUtil.getService(SalaryArchiveItemWrapper.class, user);
}
private SalaryArchiveTaxAgentWrapper getSalaryArchiveTaxAgentWrapper(User user) {
return ServiceUtil.getService(SalaryArchiveTaxAgentWrapper.class, user);
}
// /******** 薪资档案主表 start ***********************************************************************************************/
/**
* 获取各tab总人数
*
* @param request
* @param response
* @return
*/
@GET
@Path("/queryTabTotal")
@Produces(MediaType.APPLICATION_JSON)
public String queryTabTotal(@Context HttpServletRequest request, @Context HttpServletResponse response) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult>(user).run(getSalaryArchiveWrapper(user)::queryTabTotal);
}
/**
* 待定薪列表
*
* @return
*/
@POST
@Path("/pendingList")
@Produces(MediaType.APPLICATION_JSON)
public String pendingList(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryArchiveQueryParam queryParam) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult>(user).run(getSalaryArchiveWrapper(user)::pendingList, queryParam);
}
/**
* 设为定薪员工
*
* @param ids
* @return
*/
@POST
@Path("/gotoFixed")
@Produces(MediaType.APPLICATION_JSON)
public String gotoFixed(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody Collection ids) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult, Map>(user).run(getSalaryArchiveWrapper(user)::gotoFixed, ids);
}
/**
* 一键全部设为定薪员工
*
* @param queryParam
* @return
*/
@POST
@Path("/allGotoFixed")
@Produces(MediaType.APPLICATION_JSON)
public String allGotoFixed(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryArchiveQueryParam queryParam) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult>(user).run(getSalaryArchiveWrapper(user)::allGotoFixed, queryParam);
}
/**
* 删除待定薪待办
*
* @param ids
* @return
*/
@POST
@Path("/deletePendingTodo")
@Produces(MediaType.APPLICATION_JSON)
public String deletePendingTodo(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody Collection ids) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult, String>(user).run(getSalaryArchiveWrapper(user)::deletePendingTodo, ids);
}
/**
* 发薪列表
*
* @param queryParam
* @return
*/
@POST
@Path("/fixedList")
@Produces(MediaType.APPLICATION_JSON)
public String fixedList(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryArchiveQueryParam queryParam) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult>(user).run(getSalaryArchiveWrapper(user)::fixedList, queryParam);
}
/**
* 待停薪列表
*
* @param queryParam
* @return
*/
@POST
@Path("/suspendList")
@Produces(MediaType.APPLICATION_JSON)
public String suspendList(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryArchiveQueryParam queryParam) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult>(user).run(getSalaryArchiveWrapper(user)::suspendList, queryParam);
}
/**
* 停薪
*
* @param ids
* @return
*/
@POST
@Path("/gotoStop")
@Produces(MediaType.APPLICATION_JSON)
public String gotoStop(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody Collection ids) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult, Map>(user).run(getSalaryArchiveWrapper(user)::gotoStop, ids);
}
/**
* 一键全部停薪
*
* @param queryParam
* @return
*/
@POST
@Path("/allGotoStop")
@Produces(MediaType.APPLICATION_JSON)
public String allGotoStop(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryArchiveQueryParam queryParam) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult>(user).run(getSalaryArchiveWrapper(user)::allGotoStop, queryParam);
}
/**
* 删除待停薪待办
*
* @param ids
* @return
*/
@POST
@Path("/deleteSuspendTodo")
@Produces(MediaType.APPLICATION_JSON)
public String stopList(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody Collection ids) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult, String>(user).run(getSalaryArchiveWrapper(user)::deleteSuspendTodo, ids);
}
/**
* 停薪列表
*
* @param queryParam
* @return
*/
@POST
@Path("/stopList")
@Produces(MediaType.APPLICATION_JSON)
public String stopList(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryArchiveQueryParam queryParam) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult>(user).run(getSalaryArchiveWrapper(user)::stopList, queryParam);
}
/**
* 取消停薪
*
* @param ids
* @return
*/
@POST
@Path("/cancelStop")
@Produces(MediaType.APPLICATION_JSON)
public String cancelStop(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody Collection ids) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult, String>(user).run(getSalaryArchiveWrapper(user)::cancelStop, ids);
}
/**
* 薪资档案列表
*
* @param queryParam
* @return
*/
@POST
@Path("/list")
@Produces(MediaType.APPLICATION_JSON)
public String list(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryArchiveQueryParam queryParam) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult>(user).run(getSalaryArchiveWrapper(user)::listPage, queryParam);
}
/**
* 导出薪资档案
*
* @return
*/
@GET
@Path("/exportList")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response exportList(@Context HttpServletRequest request, @Context HttpServletResponse response) {
try {
User user = HrmUserVarify.getUser(request, response);
SalaryArchiveQueryParam queryParam = buildParam(request);
XSSFWorkbook workbook = getSalaryArchiveWrapper(user).exportList(queryParam);
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;
}
}
/**
* 获取薪资档案详情表单
*
* @return
*/
@GET
@Path("/getForm")
@Produces(MediaType.APPLICATION_JSON)
public String getFrom(@Context HttpServletRequest request, @Context HttpServletResponse response) {
User user = HrmUserVarify.getUser(request, response);
String salaryArchiveIdStr = request.getParameter("salaryArchiveId");
Long salaryArchiveId = null;
if (StringUtils.isNotBlank(salaryArchiveIdStr)) {
salaryArchiveId = Long.valueOf(salaryArchiveIdStr);
}
return new ResponseResult(user).run(getSalaryArchiveWrapper(user)::getFrom, salaryArchiveId);
}
/**
* 保存发薪设置
*
* @param saveParam
* @return
*/
@POST
@Path("/savePaySet")
@Produces(MediaType.APPLICATION_JSON)
public String savePaySet(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryArchiveSetPaySaveParam saveParam) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult(user).run(getSalaryArchiveWrapper(user)::savePaySet, saveParam);
}
/**
* 获取离职时段设置表单
*
* @return
*/
@GET
@Path("/getDimissionSetForm")
@Produces(MediaType.APPLICATION_JSON)
public String getDimissionSetForm(@Context HttpServletRequest request, @Context HttpServletResponse response) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult>(user).run(getSalaryArchiveWrapper(user)::getDimissionSetForm);
}
/**
* 保存离职时段设置
*
* @return
*/
@POST
@Path("/saveDimissionSet")
@Produces(MediaType.APPLICATION_JSON)
public String saveDimissionSet(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryArchiveDimissionSaveParam saveParam) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult(user).run(getSalaryArchiveWrapper(user)::saveDimissionSet, saveParam);
}
/**
* 获取导入类型
*
* @return
*/
@GET
@Path("/getImportTypes")
@Produces(MediaType.APPLICATION_JSON)
public String getImportTypes(@Context HttpServletRequest request, @Context HttpServletResponse response) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult>>(user).run(getSalaryArchiveWrapper(user)::getImportTypes);
}
/**
* 下载导入模板
*
* @return
*/
@GET
@Path("/downloadTemplate")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response downloadTemplate(@Context HttpServletRequest request, @Context HttpServletResponse response) {
try {
User user = HrmUserVarify.getUser(request, response);
SalaryArchiveQueryParam queryParam = buildParam(request);
XSSFWorkbook workbook = getSalaryArchiveWrapper(user).downloadTemplate(queryParam);
SalaryArchiveListTypeEnum listTypeEnum = queryParam.getListType();
// 待定薪列表
boolean isPendingList = listTypeEnum == SalaryArchiveListTypeEnum.PENDING;
// 定薪列表
boolean isFixedList = listTypeEnum == SalaryArchiveListTypeEnum.FIXED;
// 待停薪列表
boolean isSuspendList = listTypeEnum == SalaryArchiveListTypeEnum.SUSPEND;
if (isPendingList) {
queryParam.setRunStatusList(Arrays.asList(SalaryArchiveStatusEnum.PENDING.getValue()));
} else if (isFixedList) {
queryParam.setRunStatusList(Arrays.asList(SalaryArchiveStatusEnum.FIXED.getValue(), SalaryArchiveStatusEnum.SUSPEND.getValue()));
} else if (isSuspendList) {
queryParam.setRunStatusList(Arrays.asList(SalaryArchiveStatusEnum.SUSPEND.getValue()));
}
boolean isInit = SalaryArchiveImportTypeEnum.INIT.getValue().equals(queryParam.getImportType());
boolean isSalaryItemAdjust = SalaryArchiveImportTypeEnum.SALARYITEMADJUST.getValue().equals(queryParam.getImportType());
// 名称
String finalNameI18n = SalaryI18nUtil.getI18nLabel(101601, "薪资档案导入模板-")
+ SalaryI18nUtil.getI18nLabel(listTypeEnum.getLabelId(), listTypeEnum.getDefaultLabel());
if (isFixedList) {
// 初始化
if (isInit) {
finalNameI18n +=
"-" + SalaryI18nUtil.getI18nLabel(SalaryArchiveImportTypeEnum.INIT.getLabelId(), SalaryArchiveImportTypeEnum.INIT.getDefaultLabel());
// 调薪
} else if (isSalaryItemAdjust) {
finalNameI18n += "-" + SalaryI18nUtil
.getI18nLabel(SalaryArchiveImportTypeEnum.SALARYITEMADJUST.getLabelId(), SalaryArchiveImportTypeEnum.SALARYITEMADJUST.getDefaultLabel());
}
}
String fileName = finalNameI18n + 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;
}
}
@Nullable
private SalaryArchiveQueryParam buildParam(HttpServletRequest request) {
SalaryArchiveQueryParam param = new SalaryArchiveQueryParam();
String ids = request.getParameter("ids");
if (StringUtils.isNotBlank(ids)) {
param.setIds(Arrays.stream(ids.split(",")).map(Long::valueOf).collect(Collectors.toList()));
}
String username = request.getParameter("username");
if (StringUtils.isNotBlank(username)) {
param.setUsername(username);
}
String taxAgentId = request.getParameter("taxAgentId");
if (StringUtils.isNotBlank(taxAgentId)) {
param.setTaxAgentId(Long.valueOf(taxAgentId));
}
String departmentIds = request.getParameter("departmentIds");
if (StringUtils.isNotBlank(departmentIds)) {
param.setDepartmentIds(Arrays.stream(departmentIds.split(",")).map(Long::valueOf).collect(Collectors.toList()));
}
String positionIds = request.getParameter("positionIds");
if (StringUtils.isNotBlank(positionIds)) {
param.setPositionIds(Arrays.stream(positionIds.split(",")).map(Long::valueOf).collect(Collectors.toList()));
}
String userstatus = request.getParameter("userstatus");
if (StringUtils.isNotBlank(userstatus)) {
param.setUserstatus(userstatus);
}
String hiredate = request.getParameter("hiredate");
if (StringUtils.isNotBlank(hiredate)) {
param.setHiredate(Arrays.asList(hiredate.split(",")));
}
String importType = request.getParameter("importType");
param.setImportType(importType);
String hasData = request.getParameter("hasData");
if (StringUtils.isNotBlank(hasData)) {
param.setHasData(Boolean.valueOf(hasData));
}
String archiveStatus = request.getParameter("archiveStatus");
if (StringUtils.isNotBlank(archiveStatus)) {
param.setArchiveStatus(archiveStatus);
}
String runStatusLists = request.getParameter("runStatusList");
if (StringUtils.isNotBlank(runStatusLists)) {
param.setRunStatusList(Arrays.stream(runStatusLists.split(",")).collect(Collectors.toList()));
}
String listType = request.getParameter("listType");
if (StringUtils.isNotBlank(listType)) {
param.setListType(SalaryArchiveListTypeEnum.parseByValue(listType));
}
return param;
}
@POST
@Path("/preview")
@Produces(MediaType.APPLICATION_JSON)
public String preview(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryArchiveImportHandleParam importParam) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult>(user).run(getSalaryArchiveWrapper(user)::preview, importParam);
}
/**
* 导入薪资档案附件上传前置校验
*
* @param importParam
* @return
*/
@POST
@Path("/checkImportSalaryArchive")
@Produces(MediaType.APPLICATION_JSON)
public String checkImportSalaryArchive(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryArchiveImportHandleParam importParam) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult>(user).run(getSalaryArchiveWrapper(user)::checkImportSalaryArchiveParam, importParam);
}
//导入
@POST
@Path("/importSalaryArchive")
@Produces(MediaType.APPLICATION_JSON)
public String importSalaryArchive(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody Map importParam) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult