From ac47a0a252f0e7f897179da9142872a07b33800d Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Wed, 30 Oct 2024 09:28:18 +0800 Subject: [PATCH] =?UTF-8?q?feat(system):=20=E5=A2=9E=E5=8A=A0=E5=B7=A5?= =?UTF-8?q?=E8=B5=84=E6=9D=A1=E5=AF=BC=E5=85=A5=E5=8A=9F=E8=83=BD=E5=B9=B6?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=9B=B8=E5=85=B3=E6=9C=8D=E5=8A=A1-=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=B7=A5=E8=B5=84=E6=9D=A1=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E7=9A=84=E9=94=99=E8=AF=AF=E7=A0=81=E5=B8=B8?= =?UTF-8?q?=E9=87=8F=20-=20=E4=BF=AE=E6=94=B9=E8=80=83=E5=8B=A4=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E5=AF=BC=E5=87=BA=E5=8A=9F=E8=83=BD=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E8=A1=8C=E9=AB=98=E8=AE=BE=E7=BD=AE=20-=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=B7=A5=E8=B5=84=E6=9D=A1=E6=8E=A7=E5=88=B6=E5=99=A8?= =?UTF-8?q?=E5=92=8C=E6=9C=8D=E5=8A=A1=E5=AE=9E=E7=8E=B0=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=AF=BC=E5=85=A5=E5=8A=9F=E8=83=BD-=20=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E6=95=B0=E6=8D=AE=E5=BA=93=E5=AE=9E=E4=BD=93=E5=92=8C?= =?UTF-8?q?=E7=9B=B8=E5=85=B3VO=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=85=AC?= =?UTF-8?q?=E5=8F=B8=E5=90=8D=E7=A7=B0=E5=AD=97=E6=AE=B5=20-=20=E9=87=8D?= =?UTF-8?q?=E6=9E=84=E5=B7=A5=E8=B5=84=E6=9D=A1=E5=AF=BC=E5=87=BA=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=8C=E4=BC=98=E5=8C=96=E6=95=B0=E6=8D=AE=E5=A4=84?= =?UTF-8?q?=E7=90=86=E5=92=8C=E6=A0=B7=E5=BC=8F=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/enums/ErrorCodeConstants.java | 1 + .../admin/hr/PayslipController.java | 12 +++++- .../hr/vo/payslip/PayslipCreateReqVO.java | 3 ++ .../admin/hr/vo/payslip/PayslipRespVO.java | 3 ++ .../system/dal/dataobject/hr/PayslipDO.java | 5 +++ .../attendance/AttendanceServiceImpl.java | 4 +- .../attendance/CustomCellStyleHandler.java | 9 ++++ .../service/hr/payslip/PayslipService.java | 2 +- .../hr/payslip/PayslipServiceImpl.java | 42 +++++++++++++++---- 9 files changed, 67 insertions(+), 14 deletions(-) diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index 53038549..e9d3b11a 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -269,4 +269,5 @@ public interface ErrorCodeConstants { ErrorCode PAYSLIP_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_012_002_006, "导入数据不能为空!"); ErrorCode PAYSLIP_EXISTS = new ErrorCode(1_012_002_007, "所选公司在当前月份已上传工资条!如需修改,请勾选覆盖导入。"); ErrorCode PAYSLIP_ID_CARD_ERROR = new ErrorCode(1_012_002_008, "【{}】身份证输入有误,请核对后导入!"); + ErrorCode PAYSLIP_ISSUED = new ErrorCode(1_012_002_009, "所选公司在当前月份的工资条已下发,不能修改!"); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/hr/PayslipController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/hr/PayslipController.java index eaa297d0..315746b3 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/hr/PayslipController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/hr/PayslipController.java @@ -23,8 +23,10 @@ import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; import java.util.List; +import java.util.Map; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; @Tag(name = "管理后台 - 工资条") @@ -162,6 +164,10 @@ public class PayslipController { public CommonResult> getMyPage(@RequestBody PayslipPageReqVO pageReqVO) { PageResult pageResult = BeanUtils.toBean(payslipService.getMyPage(pageReqVO), PayslipRespVO.class); + + // 获取电子签名Map + Map signImgPathMap = fileApi.getUserSignImgPathMap(convertList(pageResult.getList(), PayslipRespVO::getUserId)).getCheckedData(); + pageResult.getList().forEach(data -> { List details = data.getDetails(); // 设置实发工资 @@ -189,7 +195,7 @@ public class PayslipController { .setValue(data.getRemark())); if (data.getIsConfirm() == 1) { - data.setSignURL(fileApi.getUserSignImgPath(data.getUserId()).getData()); + data.setSignURL(signImgPathMap.get(data.getUserId())); } // 设置签名 @@ -208,12 +214,14 @@ public class PayslipController { @Parameter(name = "file", description = "Excel 文件", required = true), @Parameter(name = "date", description = "日期", required = true), @Parameter(name = "deptId", description = "公司编号", required = true), + @Parameter(name = "companyName", description = "公司名称", required = true), @Parameter(name = "isUpdate", description = "是否允许覆盖", required = true) }) @PreAuthorize("@ss.hasPermission('system:hr:payslip:import')") public CommonResult importExcel(@RequestParam("file") MultipartFile file, @RequestParam("date") String date, @RequestParam("deptId") Long deptId, + @RequestParam("companyName") String companyName, @RequestParam("isUpdate") Boolean isUpdate) throws Exception { List list = EasyExcel.read(file.getInputStream(), PayslipImportExcelVO.class, null) @@ -221,7 +229,7 @@ public class PayslipController { .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理 .doReadAllSync(); // 导入数据 - payslipService.importPayslip(list, date, deptId, isUpdate); + payslipService.importPayslip(list, date, deptId, companyName, isUpdate); return success(true); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/hr/vo/payslip/PayslipCreateReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/hr/vo/payslip/PayslipCreateReqVO.java index cd9efed4..125ee93c 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/hr/vo/payslip/PayslipCreateReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/hr/vo/payslip/PayslipCreateReqVO.java @@ -25,6 +25,9 @@ public class PayslipCreateReqVO { @Schema(description = "所属公司编号") private Long companyDeptId; + @Schema(description = "所属公司名称") + private String companyName; + @Schema(description = "银行开户名") private String bankName; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/hr/vo/payslip/PayslipRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/hr/vo/payslip/PayslipRespVO.java index a6066456..e91baf89 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/hr/vo/payslip/PayslipRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/hr/vo/payslip/PayslipRespVO.java @@ -28,6 +28,9 @@ public class PayslipRespVO { @Schema(description = "所属公司编号") private Long companyDeptId; + @Schema(description = "公司名称", example = "芋道源码") + private String companyName; + @Schema(description = "银行开户名") private String bankName; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/hr/PayslipDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/hr/PayslipDO.java index 7c0d2b8c..9e6cf8d2 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/hr/PayslipDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/hr/PayslipDO.java @@ -40,6 +40,11 @@ public class PayslipDO extends BaseDO { */ private Long companyDeptId; + /** + * 所属公司名称 + */ + private String companyName; + /** * 薪资日期 YYYY-MM */ diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/AttendanceServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/AttendanceServiceImpl.java index 7aa57065..daadfffb 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/AttendanceServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/AttendanceServiceImpl.java @@ -1252,7 +1252,7 @@ public class AttendanceServiceImpl implements AttendanceService { .head(generateDailyHead(headTitle, detailedHead, maxSize)) .autoCloseStream(false) .excelType(ExcelTypeEnum.XLS) - .registerWriteHandler(new CustomCellStyleHandler()) + .registerWriteHandler(new CustomCellStyleHandler(null)) .sheet("考勤统计按日导出") .doWrite(data); response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("考勤统计", StandardCharsets.UTF_8.name())); @@ -1399,7 +1399,7 @@ public class AttendanceServiceImpl implements AttendanceService { .head(generateHead(headTitle, detailedHead)) .autoCloseStream(false) .excelType(ExcelTypeEnum.XLS) - .registerWriteHandler(new CustomCellStyleHandler()) + .registerWriteHandler(new CustomCellStyleHandler(null)) .sheet("考勤统计按月导出") .doWrite(data); response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("考勤统计", StandardCharsets.UTF_8.name())); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/CustomCellStyleHandler.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/CustomCellStyleHandler.java index 99057463..93348f4f 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/CustomCellStyleHandler.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/CustomCellStyleHandler.java @@ -14,6 +14,11 @@ import java.util.Map; public class CustomCellStyleHandler implements CellWriteHandler { private final Map styleCache = new HashMap<>(); + private final List nameList; + + public CustomCellStyleHandler(List nameList) { + this.nameList = nameList; + } @Override public void afterCellDispose( @@ -32,6 +37,10 @@ public class CustomCellStyleHandler implements CellWriteHandler { CellStyle cellStyle = getOrCreateCellStyle(workbook, isHead, relativeRowIndex, cellDataList); cell.setCellStyle(cellStyle); + + if (nameList != null && nameList.contains(cell.getStringCellValue())) { + cell.getRow().setHeightInPoints(150); + } } private CellStyle getOrCreateCellStyle(Workbook workbook, Boolean isHead, Integer relativeRowIndex, List> cellDataList) { diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/hr/payslip/PayslipService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/hr/payslip/PayslipService.java index 64c110c8..bf3e121e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/hr/payslip/PayslipService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/hr/payslip/PayslipService.java @@ -53,7 +53,7 @@ public interface PayslipService { * 导入工资条 * @param list 导入工资条数据 */ - void importPayslip(List list, String date, Long deptId, Boolean isUpdate); + void importPayslip(List list, String date, Long deptId, String companyName, Boolean isUpdate); /** * 下发工资条 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/hr/payslip/PayslipServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/hr/payslip/PayslipServiceImpl.java index ab98bd1a..252076ef 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/hr/payslip/PayslipServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/hr/payslip/PayslipServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.infra.api.file.FileApi; import cn.iocoder.yudao.module.system.controller.admin.hr.vo.payslip.*; import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; import cn.iocoder.yudao.module.system.dal.dataobject.hr.PayslipDO; @@ -20,6 +21,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.net.URL; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.ArrayList; @@ -51,6 +53,9 @@ public class PayslipServiceImpl implements PayslipService{ @Resource private AdminUserService userService; + @Resource + private FileApi fileApi; + @Override public void createPayslip(List createReqVO) { @@ -87,12 +92,20 @@ public class PayslipServiceImpl implements PayslipService{ @Override @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入 - public void importPayslip(List importList, String date, Long deptId, Boolean isUpdate) { + public void importPayslip(List importList, String date, Long deptId, String companyName, Boolean isUpdate) { if (CollUtil.isEmpty(importList)) { throw exception(PAYSLIP_IMPORT_LIST_IS_EMPTY); } + if (payslipMapper.selectCount(new LambdaQueryWrapperX() + .eq(PayslipDO::getSalaryDate, date) + .eqIfPresent(PayslipDO::getCompanyDeptId, deptId) + .eq(PayslipDO::getIsConfirm, 0)) > 0L) { + + throw exception(PAYSLIP_ISSUED); + } + // 判断如果选择覆盖, 则删除原有数据重新插入 if (isUpdate) { payslipMapper.deletePayslip(date, deptId); @@ -125,6 +138,7 @@ public class PayslipServiceImpl implements PayslipService{ payslipDO.setBankName(data.getBankName()); payslipDO.setBankNo(data.getBankNo()); payslipDO.setRemark(data.getRemark()); + payslipDO.setCompanyName(companyName); /* begin 设置明细数据 */ List details = new ArrayList<>(); @@ -146,7 +160,7 @@ public class PayslipServiceImpl implements PayslipService{ // 误餐补助 detailList.add(new PayslipDetail() .setCode("wcbz") - .setName("防暑降温费") + .setName("误餐补助") .setValue(data.getWcbz())); // 福利费 detailList.add(new PayslipDetail() @@ -258,11 +272,15 @@ public class PayslipServiceImpl implements PayslipService{ List userIds = convertList(list, PayslipRespVO::getUserId); Map userMap = convertMap(userService.getUserList(userIds), AdminUserDO::getId); - List> data = new ArrayList<>(); + // 获取电子签名Map + Map signImgPathMap = fileApi.getUserSignImgPathMap(userIds).getCheckedData(); + + List nameList = new ArrayList<>(); + List> data = new ArrayList<>(); int count = 1; for (PayslipRespVO payslipRespVO : list) { - List row = new ArrayList<>(); + List row = new ArrayList<>(); row.add(String.valueOf(count++)); row.add(payslipRespVO.getUserName()); row.add(userMap.get(payslipRespVO.getUserId()).getIdcard()); @@ -275,14 +293,15 @@ public class PayslipServiceImpl implements PayslipService{ }else { children.add(item); } - return children.stream().collect(Collectors.toMap(PayslipDetail::getCode, PayslipDetail::getValue)); + return children.stream().collect(Collectors.toMap(PayslipDetail::getCode, + value -> value.getValue() == null ? 0 : value.getValue())); }) .flatMap(map -> map.entrySet().stream()) // 将每个 Map 转换为 Entry 流 .collect(Collectors.toMap( Map.Entry::getKey, // 使用 Entry 的 key Map.Entry::getValue, // 使用 Entry 的 value (existing, replacement) -> existing // 处理键冲突,保留现有值 - ));; + )); row.add(detailMap.get("jbgz").toString()); row.add(detailMap.get("fsjwf").toString()); @@ -302,20 +321,25 @@ public class PayslipServiceImpl implements PayslipService{ row.add(payslipRespVO.getBankName()); row.add(payslipRespVO.getBankNo()); row.add(payslipRespVO.getRemark()); - row.add(payslipRespVO.getSignURL()); + if (payslipRespVO.getIsConfirm() == 1) { + row.add(new URL(signImgPathMap.get(payslipRespVO.getUserId()))); + nameList.add(payslipRespVO.getUserName()); + }else { + row.add(""); + } data.add(row); } // 获取公司信息 DeptDO deptDO = deptService.getDept(exportReqVO.getDeptId()); - String headTitle = deptDO.getName() + exportReqVO.getDate() + "工资条"; + EasyExcel.write(response.getOutputStream()) .head(getHead(headTitle, list.get(0))) .autoCloseStream(false) .excelType(ExcelTypeEnum.XLS) - .registerWriteHandler(new CustomCellStyleHandler()) + .registerWriteHandler(new CustomCellStyleHandler(nameList)) .sheet("工资条") .doWrite(data); response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("工资条", StandardCharsets.UTF_8.name()));