package com.engine.salary.web; import com.engine.common.util.ServiceUtil; import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationFormDTO; import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationInfoDTO; import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationListDTO; import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailListQueryParam; import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationListQueryParam; import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationSaveParam; import com.engine.salary.entity.taxdeclaration.param.TaxDeclareRecordParam; import com.engine.salary.service.TaxDeclarationExcelService; import com.engine.salary.service.TaxDeclarationService; import com.engine.salary.service.impl.TaxDeclarationExcelServiceImpl; import com.engine.salary.service.impl.TaxDeclarationServiceImpl; import com.engine.salary.util.ResponseResult; import com.engine.salary.util.SalaryDateUtil; import com.engine.salary.util.page.PageInfo; import com.engine.salary.wrapper.TaxDeclarationDetailWrapper; import com.engine.salary.wrapper.TaxDeclarationWrapper; import com.engine.salary.wrapper.TaxDeclareRecordWrapper; import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.parameters.RequestBody; import lombok.extern.slf4j.Slf4j; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.web.bind.annotation.RequestParam; 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.text.ParseException; import java.time.LocalDate; import java.util.Collection; import java.util.List; import java.util.Map; @Slf4j public class TaxDeclarationController { private TaxDeclarationService getService(User user) { return ServiceUtil.getService(TaxDeclarationServiceImpl.class, user); } private TaxDeclarationWrapper getTaxDeclarationWrapper(User user) { return ServiceUtil.getService(TaxDeclarationWrapper.class, user); } private TaxDeclarationExcelService getTaxDeclarationExcelService(User user) { return ServiceUtil.getService(TaxDeclarationExcelServiceImpl.class, user); } private TaxDeclarationDetailWrapper getTaxDeclarationDetailWrapper(User user) { return ServiceUtil.getService(TaxDeclarationDetailWrapper.class, user); } private TaxDeclareRecordWrapper getTaxDeclareRecordWrapper(User user) { return ServiceUtil.getService(TaxDeclareRecordWrapper.class, user); } //个税申报表列表 @POST @Path("/list") @Produces(MediaType.APPLICATION_JSON) public String list(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody TaxDeclarationListQueryParam queryParam) throws ParseException { User user = HrmUserVarify.getUser(request, response); queryParam.setFromSalaryMonth(SalaryDateUtil.String2YearMonth(queryParam.getFromSalaryMonthStr() == null ? "" : queryParam.getFromSalaryMonthStr())); queryParam.setEndSalaryMonth(SalaryDateUtil.String2YearMonth(queryParam.getEndSalaryMonthStr() == null ? "" : queryParam.getEndSalaryMonthStr())); return new ResponseResult>(user).run(getTaxDeclarationWrapper(user)::listPage, queryParam); } @POST @Path("/withDrawTaxDeclaration") @Produces(MediaType.APPLICATION_JSON) public String deleteTaxDeclaration(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody TaxDeclarationSaveParam param) { User user = HrmUserVarify.getUser(request, response); return new ResponseResult(user).run(getTaxDeclarationWrapper(user)::withDrawTaxDeclaration, param.getTaxDeclarationId()); } //个税申报表表单 @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(user).run(getTaxDeclarationWrapper(user)::getForm, id); } //个税申报表相关信息 @GET @Path("/getTaxDeclarationInfo") @Produces(MediaType.APPLICATION_JSON) public String getTaxDeclarationInfo(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "taxDeclarationId") Long taxDeclarationId) { User user = HrmUserVarify.getUser(request, response); return new ResponseResult(user).run(getTaxDeclarationWrapper(user)::getTaxDeclarationInfoById, taxDeclarationId); } //个税申报表生成 @POST @Path("/save") @Produces(MediaType.APPLICATION_JSON) public String save(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody TaxDeclarationSaveParam param) { User user = HrmUserVarify.getUser(request, response); param.setSalaryMonth(SalaryDateUtil.String2YearMonth(param.getSalaryMonthStr())); return new ResponseResult(user).run(getTaxDeclarationWrapper(user)::save, param); } //个税申报表详情列表 @POST @Path("/detail/list") @Produces(MediaType.APPLICATION_JSON) public String listTaxDeclarationDetail(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody TaxDeclarationDetailListQueryParam param) { User user = HrmUserVarify.getUser(request, response); param.setTaxDeclarationId(Long.parseLong(param.getTaxDeclarationIdStr())); return new ResponseResult(user).run(getTaxDeclarationDetailWrapper(user)::listPage, param); } //个税申报表相关信息 @GET @Path("/export") @Produces(MediaType.APPLICATION_OCTET_STREAM) public Response exportTaxDeclaration(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "taxDeclarationId") Long taxDeclarationId) { try { User user = HrmUserVarify.getUser(request, response); XSSFWorkbook workbook = getTaxDeclarationExcelService(user).exportTaxDeclaration(taxDeclarationId); 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; } } /** * 刷新个税申报表的待刷新标识 * * @param param 更新参数 * @return */ @Path("/updateIcon") @ApiOperation("刷新个税申报表的待刷新标识") @Produces(MediaType.APPLICATION_JSON) public String updateIcon(@Context HttpServletRequest request, @Context HttpServletResponse response,@RequestBody TaxDeclareRecordParam param) { taxDeclareRecordWrapper.updateIcon(param.getTaxDeclareRecordId(), UserContext.getCurrentEmployeeId(), TenantContext.getCurrentTenantKey()); return WeaResult.success(null); User user = HrmUserVarify.getUser(request, response); return new ResponseResult(user).run(getTaxDeclarationWrapper(user)::getTaxDeclarationInfoById, taxDeclarationId); } /** * 个税申报表生成 * * @param ids 个税申报记录id * @return */ @Path("/delete") @ApiOperation("个税申报表生成") @Produces(MediaType.APPLICATION_JSON) public WeaResult delete(@RequestBody Collection ids) { taxDeclareRecordWrapper.delete(ids, UserContext.getCurrentEmployeeId(), TenantContext.getCurrentTenantKey()); return WeaResult.success(null); } /** * 个税申报表是否已经生成 * * @param index 进度缓存索引 * @return */ @GetMapping("/getRate") @ApiOperation("个税申报表是否已经生成") @Produces(MediaType.APPLICATION_JSON) public WeaResult getRate(@RequestParam(value = "index") String index) { TaxDeclarationRateDTO rateDTO = taxDeclareRecordWrapper.getRate(index, TenantContext.getCurrentTenantKey()); return WeaResult.success(rateDTO); } /** * 获取个税申报记录下的个税申报表TAB * * @param id 个税申报记录id * @return */ @GetMapping("/getTaxDeclarationTab") @ApiOperation("获取个税申报记录下的个税申报表TAB") @Produces(MediaType.APPLICATION_JSON) public WeaResult> getTaxDeclarationTab(@RequestParam(value = "id") Long id) { List taxDeclarationTab = taxDeclareRecordWrapper.getTaxDeclarationTab(id, UserContext.getCurrentEmployeeId(), TenantContext.getCurrentTenantKey()); return WeaResult.success(taxDeclarationTab); } /** * 在线申报 * * @param taxDeclareRecordParam 在线申报参数 * @return */ @Path("/declare") @ApiOperation("在线申报") @Produces(MediaType.APPLICATION_JSON) public WeaResult declare(@RequestBody @Validated TaxDeclareRecordParam taxDeclareRecordParam) { String cacheKey = taxDeclareRecordWrapper.declare(taxDeclareRecordParam.getTaxDeclareRecordId(), UserContext.getCurrentEmployeeId(), TenantContext.getCurrentTenantKey()); return WeaResult.success(cacheKey); } /** * 获取在线申报反馈 * * @param taxDeclareRecordParam 申报反馈参数 * @return */ @Path("/getDeclareFeedback") @ApiOperation("获取在线申报反馈") @Produces(MediaType.APPLICATION_JSON) public WeaResult getDeclareFeedback(@RequestBody @Validated TaxDeclareRecordParam taxDeclareRecordParam) { String cacheKey = taxDeclareRecordWrapper.getDeclareFeedback(taxDeclareRecordParam.getTaxDeclareRecordId(), UserContext.getCurrentEmployeeId(), TenantContext.getCurrentTenantKey()); return WeaResult.success(cacheKey); } /** * 作废 * * @param taxDeclareRecordParam 作废参数 * @return */ @Path("/cancel") @ApiOperation("作废") @Produces(MediaType.APPLICATION_JSON) public WeaResult cancel(@RequestBody @Validated TaxDeclareRecordParam taxDeclareRecordParam) { String cacheKey = taxDeclareRecordWrapper.cancelDeclare(taxDeclareRecordParam.getTaxDeclareRecordId(), UserContext.getCurrentEmployeeId(), TenantContext.getCurrentTenantKey()); return WeaResult.success(cacheKey); } /** * 获取作废反馈 * * @param taxDeclareRecordParam 作废反馈参数 * @return */ @Path("/getCancelFeedback") @ApiOperation("获取作废反馈") @Produces(MediaType.APPLICATION_JSON) public WeaResult getCancelFeedback(@RequestBody @Validated TaxDeclareRecordParam taxDeclareRecordParam) { String cacheKey = taxDeclareRecordWrapper.getCancelFeedback(taxDeclareRecordParam.getTaxDeclareRecordId(), UserContext.getCurrentEmployeeId(), TenantContext.getCurrentTenantKey()); return WeaResult.success(cacheKey); } /** * 更正申报 * * @param taxDeclareRecordParam 更正申报参数 * @return */ @Path("/updateDeclare") @ApiOperation("更正申报") @Produces(MediaType.APPLICATION_JSON) public WeaResult updateDeclare(@RequestBody @Validated TaxDeclareRecordParam taxDeclareRecordParam) { String cacheKey = taxDeclareRecordWrapper.updateDeclare(taxDeclareRecordParam.getTaxDeclareRecordId(), UserContext.getCurrentEmployeeId(), TenantContext.getCurrentTenantKey()); return WeaResult.success(cacheKey); } /** * 税局端申报状态查询 * * @param taxDeclareRecordParam 查询参数 * @return */ @Path("/queryDeclareStatus") @ApiOperation("税局端申报状态查询") @Produces(MediaType.APPLICATION_JSON) public WeaResult queryDeclareStatus(@RequestBody @Validated TaxDeclareRecordParam taxDeclareRecordParam) { String res = taxDeclareRecordWrapper.queryDeclareStatus(taxDeclareRecordParam.getTaxDeclareRecordId(), UserContext.getCurrentEmployeeId(), TenantContext.getCurrentTenantKey()); return WeaResult.success(res); } /** * 税局端申报明细查询 * * @param taxDeclareRecordParam 查询申报明细参数 * @return */ @Path("/queryCompanyIncomes") @ApiOperation("税局端申报明细查询") @Produces(MediaType.APPLICATION_JSON) public WeaResult queryCompanyIncomes(@RequestBody @Validated TaxDeclareRecordParam taxDeclareRecordParam) { String res = taxDeclareRecordWrapper.queryCompanyIncomes(taxDeclareRecordParam.getTaxDeclareRecordId(), UserContext.getCurrentEmployeeId(), TenantContext.getCurrentTenantKey()); return WeaResult.success(res); } /** * 刷新数据 * * @param taxDeclareRecordParam 刷新数据参数 * @return */ @Path("/refreshData") @ApiOperation("刷新数据") @Produces(MediaType.APPLICATION_JSON) public WeaResult refreshData(@RequestBody @Validated TaxDeclareRecordParam taxDeclareRecordParam) { String cacheKey = taxDeclareRecordWrapper.refreshData(taxDeclareRecordParam.getTaxDeclareRecordId(), UserContext.getCurrentEmployeeId(), TenantContext.getCurrentTenantKey()); return WeaResult.success(cacheKey); } /** * 个税申报表详情列表 * * @param queryParam 查询条件 * @return */ @Path("/detail/list") @ApiOperation("个税申报表申报数据列表") @Produces(MediaType.APPLICATION_JSON) public WeaResult> listTaxDeclarationValue(@RequestBody TaxDeclarationValueListQueryParam queryParam) { WeaTable weaTable = taxDeclareRecordWrapper.listValuePage(queryParam, UserContext.getCurrentEmployeeId(), TenantContext.getCurrentTenantKey()); return WeaResult.success(weaTable); } /** * 导出个税申报表申报数据 * * @param queryParam 导出参数 * @return */ @Path("/detail/export") @ApiOperation("导出个税申报表申报数据") @Produces(MediaType.APPLICATION_JSON) public WeaResult> exportTaxDeclaration(@RequestBody @Validated TaxDeclarationValueListQueryParam queryParam) { Map map = taxDeclareRecordWrapper.exportTaxDeclarationValue(queryParam, UserContext.getCurrentUser()); return WeaResult.success(map); } /** * 个税申报表申报数据-人员未报送列表 * * @param queryParam 查询条件 * @return */ @Path("/employee/list4NotDeclare") @ApiOperation("个税申报表申报数据-人员未报送列表") @Produces(MediaType.APPLICATION_JSON) public WeaResult> listEmployee4NotDeclare(@RequestBody @Validated AbnormalEmployeeListQueryParam queryParam) { WeaTable weaTable = taxDeclareRecordWrapper.listEmployeePage4NotDeclare(queryParam, TenantContext.getCurrentTenantKey()); return WeaResult.success(weaTable); } /** * 个税申报表申报数据-报送人员无申报数据列表 * * @param queryParam 查询条件 * @return */ @Path("/employee/list4NoValue") @ApiOperation("个税申报表申报数据-报送人员无申报数据列表") @Produces(MediaType.APPLICATION_JSON) public WeaResult> listEmployee4NoValue(@RequestBody @Validated AbnormalEmployeeListQueryParam queryParam) { WeaTable weaTable = taxDeclareRecordWrapper.listEmployeePage4NoValue(queryParam, TenantContext.getCurrentTenantKey()); return WeaResult.success(weaTable); } /** * 个税申报表申报数据-申报失败列表 * * @param queryParam 查询条件 * @return */ @Path("/employee/list4Fail") @ApiOperation("个税申报表申报数据-申报失败列表") @Produces(MediaType.APPLICATION_JSON) public WeaResult> listEmployee4Fail(@RequestBody @Validated AbnormalEmployeeListQueryParam queryParam) { WeaTable weaTable = taxDeclareRecordWrapper.listEmployeePage4Fail(queryParam, TenantContext.getCurrentTenantKey()); return WeaResult.success(weaTable); } /** * 个税申报表申报数据-导出人员未报送列表 * * @param queryParam 查询条件 * @return */ @Path("/employee/export4NotDeclare") @ApiOperation("个税申报表申报数据-导出人员未报送列表") @Produces(MediaType.APPLICATION_JSON) public WeaResult> exportEmployee4NotDeclare(@RequestBody @Validated AbnormalEmployeeListQueryParam queryParam) { Map map = taxDeclareRecordWrapper.exportEmployee4NotDeclare(queryParam, UserContext.getCurrentUser()); return WeaResult.success(map); } /** * 个税申报表申报数据-导出报送人员无申报数据列表 * * @param queryParam 查询条件 * @return */ @Path("/employee/export4NoValue") @ApiOperation("个税申报表申报数据-导出报送人员无申报数据列表") @Produces(MediaType.APPLICATION_JSON) public WeaResult> exportEmployee4NoValue(@RequestBody @Validated AbnormalEmployeeListQueryParam queryParam) { Map map = taxDeclareRecordWrapper.exportEmployee4NoValue(queryParam, UserContext.getCurrentUser()); return WeaResult.success(map); } /** * 个税申报表申报数据-导出申报失败列表 * * @param queryParam 导出参数 * @return */ @Path("/employee/export4Fail") @ApiOperation("个税申报表申报数据-导出申报失败列表") @Produces(MediaType.APPLICATION_JSON) public WeaResult> exportEmployee4Fail(@RequestBody @Validated AbnormalEmployeeListQueryParam queryParam) { Map map = taxDeclareRecordWrapper.exportEmployee4Fail(queryParam, UserContext.getCurrentUser()); return WeaResult.success(map); } }