package com.engine.salary.web;
import com.engine.common.util.ServiceUtil;
import com.engine.salary.entity.salaryacct.dto.ConsolidatedTaxDetailDTO;
import com.engine.salary.entity.salaryacct.dto.SalaryAccEmployeeListDTO;
import com.engine.salary.entity.salaryacct.dto.SalaryAcctRecordFormDTO;
import com.engine.salary.entity.salaryacct.dto.SalaryAcctResultDetailDTO;
import com.engine.salary.entity.salaryacct.param.*;
import com.engine.salary.entity.salarysob.dto.SalarySobCycleDTO;
import com.engine.salary.enums.salarysob.SalaryEmployeeStatusEnum;
import com.engine.salary.util.ResponseResult;
import com.engine.salary.util.SalaryDateUtil;
import com.engine.salary.util.page.PageInfo;
import com.engine.salary.wrapper.SalaryAcctEmployeeWrapper;
import com.engine.salary.wrapper.SalaryAcctExcelWrapper;
import com.engine.salary.wrapper.SalaryAcctRecordWrapper;
import com.engine.salary.wrapper.SalaryAcctResultWrapper;
import io.swagger.v3.oas.annotations.parameters.RequestBody;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.jetbrains.annotations.NotNull;
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.Arrays;
import java.util.Collection;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 薪资核算
*
Copyright: Copyright (c) 2022
* Company: 泛微软件
*
* @author qiantao
* @version 1.0
**/
public class SalaryAcctController {
private SalaryAcctRecordWrapper salaryAcctRecordWrapper;
private SalaryAcctRecordWrapper getSalaryAcctRecordWrapper(User user) {
return (SalaryAcctRecordWrapper) ServiceUtil.getService(SalaryAcctRecordWrapper.class, user);
}
private SalaryAcctEmployeeWrapper getSalaryAcctEmployeeWrapper(User user) {
return (SalaryAcctEmployeeWrapper) ServiceUtil.getService(SalaryAcctEmployeeWrapper.class, user);
}
private SalaryAcctResultWrapper getSalaryAcctResultWrapper(User user) {
return (SalaryAcctResultWrapper) ServiceUtil.getService(SalaryAcctResultWrapper.class, user);
}
// private SalaryAcctCheckResultWrapper salaryAcctCheckResultWrapper;
// private SalaryComparisonResultWrapper salaryComparisonResultWrapper;
private SalaryAcctExcelWrapper getSalaryAcctExcelWrapper(User user) {
return (SalaryAcctExcelWrapper) ServiceUtil.getService(SalaryAcctExcelWrapper.class, user);
}
// private SalaryAcctExcelService salaryAcctExcelService;
// private SalaryBatchService salaryBatchService;
//
// /**********************************薪资核算记录相关 start*********************************/
//薪资核算列表
@POST
@Path("/list")
@Produces(MediaType.APPLICATION_JSON)
public String list(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctRecordQueryParam queryParam) {
User user = HrmUserVarify.getUser(request, response);
queryParam.setStartMonth(SalaryDateUtil.String2YearMonth(queryParam.getStartMonthStr()));
queryParam.setEndMonth(SalaryDateUtil.String2YearMonth(queryParam.getEndMonthStr()));
return new ResponseResult().run(getSalaryAcctRecordWrapper(user)::listPage, queryParam);
}
//薪资核算详情
@GET
@Path("/getForm")
@Produces(MediaType.APPLICATION_JSON)
public String getForm(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "id") Long id) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult().run(getSalaryAcctRecordWrapper(user)::getForm, id);
}
//获取薪资核算的薪资周期、考勤周期等
@GET
@Path("/getSalarySobCycle")
@Produces(MediaType.APPLICATION_JSON)
public String getSalarySobCycle(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "salaryAcctRecordId") Long salaryAcctRecordId) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult().run(getSalaryAcctRecordWrapper(user)::getSalarySobCycleById, salaryAcctRecordId);
}
//保存薪资核算的基本信息
@POST
@Path("/basic/save")
@Produces(MediaType.APPLICATION_JSON)
public String save(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctRecordSaveParam param) {
User user = HrmUserVarify.getUser(request, response);
param.setSalaryMonth(SalaryDateUtil.String2YearMonth(param.getSalaryMonthStr()));
return new ResponseResult().run(getSalaryAcctRecordWrapper(user)::save, param);
}
//删除薪资核算记录
@POST
@Path("/delete")
@Produces(MediaType.APPLICATION_JSON)
public String deleteSalaryAcctRecord(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody Collection ids) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult, Long>().run(getSalaryAcctRecordWrapper(user)::delete, ids);
}
//归档薪资核算记录
@GET
@Path("/file")
@Produces(MediaType.APPLICATION_JSON)
public String fileSalaryAcctRecord(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "id") Long id) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult().run(getSalaryAcctRecordWrapper(user)::file, id);
}
//重新核算
@POST
@Path("/reAccounting")
@Produces(MediaType.APPLICATION_JSON)
public String reAccounting(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctRecordReAccountParam param) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult().run(getSalaryAcctRecordWrapper(user)::reCalculate, param.getSalaryAcctRecordId());
}
//判断是否存在合并计税
@GET
@Path("/hasConsolidatedTax")
@Produces(MediaType.APPLICATION_JSON)
public String hasConsolidatedTax(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "id") Long id) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult().run(getSalaryAcctRecordWrapper(user)::hasConsolidatedTax, id);
}
/**********************************薪资核算记录相关 end*********************************/
/**********************************薪资核算人员相关 start*********************************/
//薪资核算人员确认列表
@POST
@Path("/acctemployee/list")
@Produces(MediaType.APPLICATION_JSON)
public String listSalaryAccountingEmployee(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctEmployeeQueryParam param) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult>().run(getSalaryAcctEmployeeWrapper(user)::listPage, param);
}
//薪资核算环比上期减少人员列表
@POST
@Path("/reducedemployee/list")
@Produces(MediaType.APPLICATION_JSON)
public String listReducedEmployee(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctEmployeeQueryParam param) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult>().run(getSalaryAcctEmployeeWrapper(user)::listPage4Reduce, param);
}
//添加薪资核算人员
@POST
@Path("/acctemployee/save")
@Produces(MediaType.APPLICATION_JSON)
public String saveSalaryAcctEmployee(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctEmployeeSaveParam param) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult().run(getSalaryAcctEmployeeWrapper(user)::save, param);
}
//删除薪资核算人员
@POST
@Path("/acctemployee/delete")
@Produces(MediaType.APPLICATION_JSON)
public String deleteSalaryAcctEmployee(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctEmployeeDeleteParam param) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult().run(getSalaryAcctEmployeeWrapper(user)::delete, param);
}
//检查薪资核算人员的个税扣缴义务人
@POST
@Path("/acctemployee/checkTaxAgent")
@Produces(MediaType.APPLICATION_JSON)
public String checkTaxAgent(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctEmpCheckTaxAgentParam param) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult().run(getSalaryAcctEmployeeWrapper(user)::checkTaxAgent, param.getSalaryAcctRecordId());
}
//刷新薪资核算人员的个税扣缴义务人
@POST
@Path("/acctemployee/refreshTaxAgent")
@Produces(MediaType.APPLICATION_JSON)
public String refreshTaxAgent(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctEmpRefreshTaxAgentParam param) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult().run(getSalaryAcctEmployeeWrapper(user)::refreshTaxAgent, param.getSalaryAcctRecordId());
}
//从环比上月减少添加薪资核算人员
@POST
@Path("/acctemployee/addFromReduce")
@Produces(MediaType.APPLICATION_JSON)
public String addFromReduce(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctEmployeeAddParam param) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult().run(getSalaryAcctEmployeeWrapper(user)::addFromReduce, param);
}
/**
* 导出人员范围
*/
@GET
@Path("/acctemployee/export")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response exportSalaryAcctEmployee(@Context HttpServletRequest request, @Context HttpServletResponse response) {
SalaryAcctEmployeeQueryParam param = buildSalaryAcctEmployeeQueryParam(request);
User user = HrmUserVarify.getUser(request, response);
XSSFWorkbook workbook = getSalaryAcctExcelWrapper(user).exportSalaryAcctEmployee(param);
String time = LocalDate.now().toString();
String fileName = "核算人员范围" + time;
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();
}
@NotNull
private SalaryAcctEmployeeQueryParam buildSalaryAcctEmployeeQueryParam(HttpServletRequest request) {
SalaryAcctEmployeeQueryParam param = new SalaryAcctEmployeeQueryParam();
String salaryAcctRecordId = request.getParameter("salaryAcctRecordId");
if (StringUtils.isNotBlank(salaryAcctRecordId)) {
param.setSalaryAcctRecordId(Long.parseLong(salaryAcctRecordId));
}
String employeeName = request.getParameter("employeeName");
if (StringUtils.isNotBlank(employeeName)) {
param.setEmployeeName(employeeName);
}
String taxAgentId = request.getParameter("taxAgentId");
if (StringUtils.isNotBlank(taxAgentId)) {
param.setTaxAgentId(Long.parseLong(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 status = request.getParameter("status");
if (StringUtils.isNotBlank(status)) {
param.setStatus(SalaryEmployeeStatusEnum.parseByValue(Integer.parseInt(status)));
}
//fixme 日期
request.getParameter("dismissDate");
String ids = request.getParameter("ids");
if (StringUtils.isNotBlank(ids)) {
param.setIds(Arrays.stream(ids.split(",")).map(Long::valueOf).collect(Collectors.toList()));
}
return param;
}
/**
* 导出环比减少人员
*/
@GET
@Path("/reducedemployee/export")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response exportReducedEmployee(@Context HttpServletRequest request, @Context HttpServletResponse response) {
SalaryAcctEmployeeQueryParam param = buildSalaryAcctEmployeeQueryParam(request);
User user = HrmUserVarify.getUser(request, response);
XSSFWorkbook workbook = getSalaryAcctExcelWrapper(user).exportReducedEmployee(param);
String time = LocalDate.now().toString();
String fileName = "环比上月减少人员" + time;
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();
}
/**********************************薪资核算人员相关 end*********************************/
/**********************************薪资核算结果 start*********************************/
//薪资核算结果列表
@POST
@Path("/acctresult/list")
@Produces(MediaType.APPLICATION_JSON)
public String listSalaryAcctResult(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctResultQueryParam param) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult>().run(getSalaryAcctResultWrapper(user)::listPage, param);
}
// @GetMapping("/acctresult/getSearchCondition")
// @ApiOperation(("获取薪资核算结果高级搜索"))
// @WeaPermission
// public WeaResult getSalaryAcctResultSearchCondition() {
// WeaSearchCondition searchCondition = salaryAcctResultWrapper.getSearchCondition(TenantContext.getCurrentTenantKey());
// return WeaResult.success(searchCondition);
// }
//薪资核算结果详情
@GET
@Path("/acctresult/detail")
@Produces(MediaType.APPLICATION_JSON)
public String getSalaryAcctResultDetail(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "id") Long id) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult().run(getSalaryAcctResultWrapper(user)::getForm, id);
}
//薪资核算结果详情
@GET
@Path("/acctresult/getConsolidatedTaxDetail")
@Produces(MediaType.APPLICATION_JSON)
public String getConsolidatedTaxDetail(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "salaryAcctEmpId") Long salaryAcctEmpId) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult().run(getSalaryAcctResultWrapper(user)::getConsolidatedTaxDetail, salaryAcctEmpId);
}
//编辑薪资核算结果
@POST
@Path("/acctresult/save")
@Produces(MediaType.APPLICATION_JSON)
public String saveSalaryAcctResult(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctResultSaveParam param) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult().run(getSalaryAcctResultWrapper(user)::save, param);
}
//薪资核算
@POST
@Path("/acctresult/accounting")
@Produces(MediaType.APPLICATION_JSON)
public String accounting(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctCalculateParam param) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult().run(getSalaryAcctResultWrapper(user)::calculate, param);
}
//导出核算结果
@GET
@Path("/acctresult/export")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response exportSalaryAcctResult(@Context HttpServletRequest request, @Context HttpServletResponse response) {
SalaryAcctResultQueryParam param = null;
User user = HrmUserVarify.getUser(request, response);
XSSFWorkbook workbook = getSalaryAcctExcelWrapper(user).exportSalaryAcctResult(param);
String time = LocalDate.now().toString();
String fileName = "薪资核算结果" + time;
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();
}
// @GetMapping("/acctresult/importField")
// @ApiOperation("导入核算结果前生成导入模板时可选的薪资项目")
// @WeaPermission
// public WeaResult getImportField(@RequestParam(value = "salaryAcctRecordId") Long salaryAcctRecordId) {
// SalaryAcctImportFieldDTO importField = salaryAcctExcelService.getImportField(salaryAcctRecordId, UserContext.getCurrentEmployeeId(), TenantContext.getCurrentTenantKey());
// return WeaResult.success(importField);
// }
//
// @PostMapping("/acctresult/importtemplate/export")
// @ApiOperation("导出导入模板")
// @WeaPermission
// public WeaResult