|
@@ -1,13 +1,21 @@
|
|
|
package cn.ezhizao.project.business.salary.controller;
|
|
|
|
|
|
+import java.io.IOException;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
import java.sql.Timestamp;
|
|
|
import java.util.ArrayList;
|
|
|
+import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
import java.util.stream.Collectors;
|
|
|
import javax.annotation.Resource;
|
|
|
+import javax.servlet.ServletOutputStream;
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
|
|
|
import cn.ezhizao.common.utils.SecurityUtils;
|
|
|
+import cn.ezhizao.project.business.company.domain.BizCompany;
|
|
|
+import cn.ezhizao.project.business.company.service.IBizCompanyService;
|
|
|
import cn.ezhizao.project.business.finance.IndividualIncomeTaxIsZero.domain.BizFinancialIndividualIncomeTaxDetailIsZero;
|
|
|
import cn.ezhizao.project.business.finance.IndividualIncomeTaxIsZero.domain.BizFinancialIndividualIncomeTaxIsZero;
|
|
|
import cn.ezhizao.project.business.finance.IndividualIncomeTaxIsZero.service.IBizFinancialIndividualIncomeTaxIsZeroService;
|
|
@@ -25,17 +33,17 @@ import cn.ezhizao.project.business.salary.service.IBizFinancialSalaryDetailEmplo
|
|
|
import cn.ezhizao.project.business.salary.service.IBizFinancialSalaryDetailService;
|
|
|
import cn.ezhizao.project.business.workOrder.domain.BizWorkOrderRecord;
|
|
|
import cn.ezhizao.project.business.workOrder.service.IBizWorkOrderRecordService;
|
|
|
+import cn.hutool.core.io.IoUtil;
|
|
|
+import cn.hutool.poi.excel.ExcelWriter;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import io.swagger.annotations.ApiOperation;
|
|
|
+import org.apache.poi.ss.usermodel.CellStyle;
|
|
|
+import org.apache.poi.ss.usermodel.Font;
|
|
|
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
|
|
|
+import org.apache.poi.ss.usermodel.VerticalAlignment;
|
|
|
import org.springframework.security.access.prepost.PreAuthorize;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
-import org.springframework.web.bind.annotation.GetMapping;
|
|
|
-import org.springframework.web.bind.annotation.PostMapping;
|
|
|
-import org.springframework.web.bind.annotation.PutMapping;
|
|
|
-import org.springframework.web.bind.annotation.DeleteMapping;
|
|
|
-import org.springframework.web.bind.annotation.PathVariable;
|
|
|
-import org.springframework.web.bind.annotation.RequestBody;
|
|
|
-import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
-import org.springframework.web.bind.annotation.RestController;
|
|
|
+import org.springframework.web.bind.annotation.*;
|
|
|
import cn.ezhizao.framework.aspectj.lang.annotation.Log;
|
|
|
import cn.ezhizao.framework.aspectj.lang.enums.BusinessType;
|
|
|
import cn.ezhizao.project.business.salary.domain.BizFinancialSalary;
|
|
@@ -68,6 +76,8 @@ public class BizFinancialSalaryController extends BaseController {
|
|
|
private IBizFinancialReceiveTicketDetailService financialReceiveTicketDetailService;
|
|
|
@Resource
|
|
|
private IBizWorkOrderRecordService bizWorkOrderRecordService;
|
|
|
+ @Resource
|
|
|
+ private IBizCompanyService companyService;
|
|
|
|
|
|
@Resource
|
|
|
private IBizFinancialSalaryDetailEmployeeService bizFinancialSalaryDetailEmployeeService;
|
|
@@ -150,7 +160,7 @@ public class BizFinancialSalaryController extends BaseController {
|
|
|
return toAjax(bizFinancialSalaryService.removeBatchByIds(ids));
|
|
|
}
|
|
|
|
|
|
- @PreAuthorize("@ss.hasPermi('business:salary:query,business:salary:view')")
|
|
|
+ @PreAuthorize("@ss.hasAnyPermi('business:salary:query,business:salary:view')")
|
|
|
@PostMapping("/getDetail")
|
|
|
public AjaxResult getDetail(@RequestBody BizFinancialSalaryDetail bizFinancialSalaryDetail) {
|
|
|
List<BizFinancialSalaryDetail> bizFinancialSalaryDetails = bizFinancialSalaryDetailService.getList(bizFinancialSalaryDetail);
|
|
@@ -328,4 +338,126 @@ public class BizFinancialSalaryController extends BaseController {
|
|
|
bizWorkOrderRecordService.updateById(fromRecord);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ @ApiOperation("导出工资数据")
|
|
|
+ @PostMapping("/exportDetailExcel")
|
|
|
+ public void exportDetailExcel(@RequestParam Long id, HttpServletResponse response) {
|
|
|
+ BizFinancialSalaryDetail financialSalaryDetail = bizFinancialSalaryDetailService.getById(id);
|
|
|
+ BizCompany company;
|
|
|
+
|
|
|
+ if (null != financialSalaryDetail) {
|
|
|
+ BizFinancialSalaryDetailEmployee map = new BizFinancialSalaryDetailEmployee();
|
|
|
+// map.put("financialSalaryDetailId", financialSalaryDetail.getId());
|
|
|
+ map.setFinancialSalaryDetailId(financialSalaryDetail.getId());
|
|
|
+ List<BizFinancialSalaryDetailEmployee> financialSalaryDetailEmployeeList = bizFinancialSalaryDetailEmployeeService.getList(map);
|
|
|
+ financialSalaryDetail.setDetails(financialSalaryDetailEmployeeList);
|
|
|
+ company = companyService.getById(financialSalaryDetail.getCompanyId());
|
|
|
+ } else {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ ExcelWriter writer = cn.hutool.poi.excel.ExcelUtil.getWriter(true);
|
|
|
+ writer.merge(0, 0, 0, 12, "工资单", true);
|
|
|
+ writer.merge(1, 1, 0, 3, company.getName(), false);
|
|
|
+ writer.merge(1, 1, 4, 7, financialSalaryDetail.getYear() + "年 第" + financialSalaryDetail.getMonth() + "期", false);
|
|
|
+ writer.merge(1, 1, 8, 12, "单位:元", false);
|
|
|
+ writer.writeCellValue(0, 2, "员工名");
|
|
|
+ writer.writeCellValue(1, 2, "身份证号");
|
|
|
+ writer.writeCellValue(2, 2, "应发工资");
|
|
|
+ writer.writeCellValue(3, 2, "实发工资");
|
|
|
+ writer.writeCellValue(4, 2, "奖金及其他");
|
|
|
+ writer.writeCellValue(5, 2, "养老保险");
|
|
|
+ writer.writeCellValue(6, 2, "医疗保险");
|
|
|
+ writer.writeCellValue(7, 2, "失业险");
|
|
|
+ writer.writeCellValue(8, 2, "大病险");
|
|
|
+ writer.writeCellValue(9, 2, "公积金");
|
|
|
+ writer.writeCellValue(10, 2, "个税");
|
|
|
+ writer.writeCellValue(11, 2, "其他扣款");
|
|
|
+ writer.writeCellValue(12, 2, "备注");
|
|
|
+
|
|
|
+// List<String> rowHead = CollUtil.newArrayList("员工名", "公司名称", "身份证号", "应发工资", "实发工资", "奖金及其他", "养老保险", "医疗保险", "失业险", "大病险", "公积金", "个税", "其他扣款", "备注");
|
|
|
+ // 自定义标题别名
|
|
|
+
|
|
|
+// writer.writeHeadRow(rowHead);
|
|
|
+ int row = 0;
|
|
|
+ for (int i = 0; i < financialSalaryDetail.getDetails().size(); i++) {
|
|
|
+ writer.writeCellValue(0, i + 3, financialSalaryDetail.getDetails().get(i).getEmployeeName());
|
|
|
+// writer.writeCellValue(1, i + 1, company.getName());
|
|
|
+ writer.writeCellValue(1, i + 3, financialSalaryDetail.getDetails().get(i).getIdCode());
|
|
|
+ writer.writeCellValue(2, i + 3, financialSalaryDetail.getDetails().get(i).getPlanSalary());
|
|
|
+ writer.writeCellValue(3, i + 3, financialSalaryDetail.getDetails().get(i).getActuallySalary());
|
|
|
+ writer.writeCellValue(4, i + 3, financialSalaryDetail.getDetails().get(i).getBonusAmount());
|
|
|
+ writer.writeCellValue(5, i + 3, financialSalaryDetail.getDetails().get(i).getEndowmentInsurance());
|
|
|
+ writer.writeCellValue(6, i + 3, financialSalaryDetail.getDetails().get(i).getMedicalInsurance());
|
|
|
+ writer.writeCellValue(7, i + 3, financialSalaryDetail.getDetails().get(i).getUnemploymentBenefit());
|
|
|
+ writer.writeCellValue(8, i + 3, financialSalaryDetail.getDetails().get(i).getSeriousIllnessInsurance());
|
|
|
+ writer.writeCellValue(9, i + 3, financialSalaryDetail.getDetails().get(i).getHousingFund());
|
|
|
+ writer.writeCellValue(10, i + 3, financialSalaryDetail.getHasIndividualIncomeTax().equals(1) ? financialSalaryDetail.getDetails().get(i).getIndividualIncomeTaxConfirm() : financialSalaryDetail.getDetails().get(i).getCurrentIndividualIncomeTax());
|
|
|
+ writer.writeCellValue(11, i + 3, financialSalaryDetail.getDetails().get(i).getOtherCut());
|
|
|
+ writer.writeCellValue(12, i + 3, financialSalaryDetail.getDetails().get(i).getRemark());
|
|
|
+ row = i + 1;
|
|
|
+ }
|
|
|
+ writer.writeCellValue(0, row + 3, "合计");
|
|
|
+ writer.writeCellValue(1, row + 3, "");
|
|
|
+ writer.writeCellValue(2, row + 3, BigDecimal.valueOf(financialSalaryDetail.getDetails().stream().mapToDouble(v -> v.getPlanSalary().doubleValue()).sum()).setScale(2, RoundingMode.HALF_UP));
|
|
|
+ writer.writeCellValue(3, row + 3, BigDecimal.valueOf(financialSalaryDetail.getDetails().stream().mapToDouble(v -> v.getActuallySalary().doubleValue()).sum()).setScale(2, RoundingMode.HALF_UP));
|
|
|
+ writer.writeCellValue(4, row + 3, BigDecimal.valueOf(financialSalaryDetail.getDetails().stream().mapToDouble(v -> v.getBonusAmount().doubleValue()).sum()).setScale(2, RoundingMode.HALF_UP));
|
|
|
+ writer.writeCellValue(5, row + 3, BigDecimal.valueOf(financialSalaryDetail.getDetails().stream().mapToDouble(v -> v.getEndowmentInsurance().doubleValue()).sum()).setScale(2, RoundingMode.HALF_UP));
|
|
|
+ writer.writeCellValue(6, row + 3, BigDecimal.valueOf(financialSalaryDetail.getDetails().stream().mapToDouble(v -> v.getMedicalInsurance().doubleValue()).sum()).setScale(2, RoundingMode.HALF_UP));
|
|
|
+ writer.writeCellValue(7, row + 3, BigDecimal.valueOf(financialSalaryDetail.getDetails().stream().mapToDouble(v -> v.getUnemploymentBenefit().doubleValue()).sum()).setScale(2, RoundingMode.HALF_UP));
|
|
|
+ writer.writeCellValue(8, row + 3, BigDecimal.valueOf(financialSalaryDetail.getDetails().stream().mapToDouble(v -> v.getSeriousIllnessInsurance().doubleValue()).sum()).setScale(2, RoundingMode.HALF_UP));
|
|
|
+ writer.writeCellValue(9, row + 3, BigDecimal.valueOf(financialSalaryDetail.getDetails().stream().mapToDouble(v -> v.getHousingFund().doubleValue()).sum()).setScale(2, RoundingMode.HALF_UP));
|
|
|
+ writer.writeCellValue(10, row + 3, BigDecimal.valueOf(financialSalaryDetail.getDetails().stream().mapToDouble(v -> v.getCurrentIndividualIncomeTax().doubleValue()).sum()).setScale(2, RoundingMode.HALF_UP));
|
|
|
+ writer.writeCellValue(11, row + 3, BigDecimal.valueOf(financialSalaryDetail.getDetails().stream().mapToDouble(v -> v.getOtherCut().doubleValue()).sum()).setScale(2, RoundingMode.HALF_UP));
|
|
|
+
|
|
|
+ writer.writeCellValue(12, row + 3, "");
|
|
|
+
|
|
|
+ // 默认的,未添加alias的属性也会写出,如果想只写出加了别名的字段,可以调用此方法排除之
|
|
|
+ writer.setOnlyAlias(true);
|
|
|
+ // 设置列宽行高
|
|
|
+ writer.setDefaultRowHeight(22);
|
|
|
+ // 设置第一行 列宽
|
|
|
+ // writer.setColumnWidth(0, 20);
|
|
|
+ // 合并单元格后的标题行,使用默认标题样式
|
|
|
+// writer.merge(9, "客户");
|
|
|
+// writer.setRowHeight(0, 22);
|
|
|
+ //设置标题单元格 样式
|
|
|
+ Font headFont = writer.createFont();
|
|
|
+ // 设置字体大小,加载到样式中
|
|
|
+ headFont.setFontHeightInPoints((short) 11);
|
|
|
+ headFont.setFontName("楷体_GB2312");
|
|
|
+ headFont.setBold(true);
|
|
|
+ CellStyle headCellStyle = writer.getStyleSet().getHeadCellStyle();
|
|
|
+ headCellStyle.setFont(headFont);
|
|
|
+ headCellStyle.setAlignment(HorizontalAlignment.CENTER);
|
|
|
+ headCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
|
|
|
+ //设置普通单元格 样式
|
|
|
+ Font contentFont = writer.createFont();
|
|
|
+ // 设置字体大小,加载到样式中
|
|
|
+ contentFont.setFontHeightInPoints((short) 11);
|
|
|
+ contentFont.setFontName("宋体");
|
|
|
+ CellStyle cellstyle = writer.getStyleSet().getCellStyle();
|
|
|
+ cellstyle.setFont(contentFont);
|
|
|
+ cellstyle.setAlignment(HorizontalAlignment.CENTER);
|
|
|
+ cellstyle.setVerticalAlignment(VerticalAlignment.CENTER);
|
|
|
+ writer.setRowHeight(1, 22);
|
|
|
+ // headSize 为表格 标题 和 表头所占的 行数
|
|
|
+ int headSize = 2;
|
|
|
+ // 设置所有列宽自适应
|
|
|
+ writer.autoSizeColumnAll();
|
|
|
+ //out为OutputStream,需要写出到的目标流 response为HttpServletResponse对象
|
|
|
+ response.setContentType("application/vnd.ms-excel;charset=utf-8");
|
|
|
+ //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
|
|
|
+ response.setHeader("Content-Disposition", "attachment;filename=test.xlsx");
|
|
|
+ ServletOutputStream out = null;
|
|
|
+ try {
|
|
|
+ out = response.getOutputStream();
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ writer.flush(out, true);
|
|
|
+ // 关闭writer,释放内存
|
|
|
+ writer.close();
|
|
|
+ //此处记得关闭输出Servlet流
|
|
|
+ IoUtil.close(out);
|
|
|
+ }
|
|
|
}
|