yubo
2025-09-24 35cfaa7259f3d494e7bd03aec5c7e035049ee19b
feat: 新增社保档位提醒功能

新增社保档位提醒功能,包括查询接口和导出功能:
- 在IEmpBaseInfoService接口中添加findInsuranceEmpBaseInfos方法
- 在EmpBaseInfoServiceImpl中实现社保提醒查询逻辑,根据年龄和性别条件筛选需要提醒的员工
- 在EmpBaseInfoController中新增insuranceAlertEmpBaseInfoList查询接口和exportInsuranceWithField导出接口
- 支持按社保类型(四险一档/二档)和性别进行筛选,自动计算年龄条件阈值
- 查询结果包含社保类型名称映射显示
3个文件已修改
123 ■■■■■ 已修改文件
febs-server/febs-server-hr/src/main/java/cc/mrbird/febs/server/hr/controller/EmpBaseInfoController.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
febs-server/febs-server-hr/src/main/java/cc/mrbird/febs/server/hr/service/IEmpBaseInfoService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
febs-server/febs-server-hr/src/main/java/cc/mrbird/febs/server/hr/service/impl/EmpBaseInfoServiceImpl.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
febs-server/febs-server-hr/src/main/java/cc/mrbird/febs/server/hr/controller/EmpBaseInfoController.java
@@ -22,7 +22,6 @@
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@@ -292,4 +291,25 @@
            throw new FebsException(message);
        }
    }
    @ApiOperation(value = "社保提醒人员基本信息翻页列表")
    @GetMapping("insurance/alert")
    @PreAuthorize("hasAuthority('empBaseinfo:list')")
    public FebsResponse insuranceAlertEmpBaseInfoList(QueryRequest request, EmpBaseInfo empBaseinfo) {
        Map<String, Object> dataTable = FebsUtil.getDataTable(this.empBaseInfoService.findInsuranceEmpBaseInfos(request, empBaseinfo));
        return new FebsResponse().data(dataTable);
    }
    @ApiOperation(value = "导出员工")
    @RequestMapping(value = "export/insurance",method= RequestMethod.POST)
    @ControllerEndpoint(operation = "导出社保提醒数据", exceptionMessage = "导出Excel失败")
    public void exportInsuranceWithField(QueryRequest request, HttpServletResponse response, String exportField,EmpBaseInfo empBaseinfo) throws IOException {
        request.setPageSize(25535);
        request.setPageNum(1);
        List<EmpBaseInfo> exportList = this.empBaseInfoService.findInsuranceEmpBaseInfos(request, empBaseinfo).getRecords();
        List<Map<String, Object>> allList = PoiExportExcel.getDataList(exportField, exportList, null);
        String fileName = "社保四险员工列表";
        Date currentDate = new Date();
        String dateStr = DateUtil.formatDate(currentDate);
        boolean result = PoiExportExcel.exportCommonExcel(response, fileName + dateStr, fileName, allList);
    }
}
febs-server/febs-server-hr/src/main/java/cc/mrbird/febs/server/hr/service/IEmpBaseInfoService.java
@@ -1,18 +1,14 @@
package cc.mrbird.febs.server.hr.service;
import cc.mrbird.febs.common.core.entity.QueryRequest;
import cc.mrbird.febs.common.core.entity.system.DicItem;
import cc.mrbird.febs.common.core.exception.FebsException;
import cc.mrbird.febs.server.hr.entity.*;
import cc.mrbird.febs.common.core.entity.QueryRequest;
import cc.mrbird.febs.server.hr.entity.EmpDimissionLog;
import cc.mrbird.febs.server.hr.entity.EmpJobChange;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.servlet.http.HttpServletResponse;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
import java.util.Map;
@@ -245,4 +241,12 @@
     */
    void updateEmpBaseKeyInfo();
    /**
     * 查询社保档位提醒员工  查询(分页)
     *
     * @param request     QueryRequest
     * @param empBaseInfo empBaseinfo
     * @return IPage<EmpBaseinfo>
     */
    IPage<EmpBaseInfo> findInsuranceEmpBaseInfos(QueryRequest request, EmpBaseInfo empBaseInfo);
}
febs-server/febs-server-hr/src/main/java/cc/mrbird/febs/server/hr/service/impl/EmpBaseInfoServiceImpl.java
@@ -1494,8 +1494,27 @@
        });
    }
    @Override
    public IPage<EmpBaseInfo> findInsuranceEmpBaseInfos(QueryRequest request, EmpBaseInfo empBaseInfo) {
        Page<EmpBaseInfo> page = new Page<>(request.getPageNum(), request.getPageSize());
        SortUtil.handlePageSort(request, page, "entryDate", FebsConstant.ORDER_ASC, true);
        IPage<EmpBaseInfo> iPage = empBaseInfoMapper.selectPageVo(page, createInsuranceAlertQueryWrapper(empBaseInfo));
        List<EmpBaseInfo> list = iPage.getRecords();
        List<DicItem> dicItems = CastUtil.castList(redisService.get("dicItems"), DicItem.class);
        list.forEach(item -> {
            item.setInsuranceTypeName(dicItems.stream()
                    .filter(k -> DicCode.INSURANCETYPE.equals(k.getDicCode()) && k.getDicItemCode().equals(item.getInsuranceType()))
                    .findFirst()
                    .map(DicItem::getDicItemName)
                    .orElse("未知"));
        });
        iPage.setRecords(list);
        return iPage;
    }
    /**
     * 根据设置的参数计算员工的年假
     *
     * @param date 入职日期
     * @return 年假天数
     */
@@ -1517,7 +1536,73 @@
        }
        return holiday;
    }
    private int  calculateAge(Date date){
    private int calculateAge(Date date) {
        return DateUtil.ageOfNow(date);
    }
    private QueryWrapper<EmpBaseInfo> createInsuranceAlertQueryWrapper(EmpBaseInfo empBaseInfo) {
        QueryWrapper<EmpBaseInfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("a.DelFlag", 0);
        //人员的状态,0-在职 1-离职 2-退休
        queryWrapper.eq("a.empStatus", "0");
        if (StringUtils.isNotBlank(empBaseInfo.getSex())) {
            queryWrapper.in("a.sex", empBaseInfo.getSex());
        }
           //男,1 女,2 (非深户)四险二档,6(非深户)四险一档,7
        int four_one_woman = Integer.parseInt(redisService.get("four_one_woman").toString());
        int four_one_man = Integer.parseInt(redisService.get("four_one_man").toString());
        int four_two_woman = Integer.parseInt(redisService.get("four_two_woman").toString());
        int four_two_man = Integer.parseInt(redisService.get("four_two_man").toString());
        if (StringUtils.isBlank(empBaseInfo.getInsuranceType())) {
            queryWrapper.and(wrapper -> wrapper
                    .nested(inner -> inner
                            .eq("a.insuranceType", "6") // insuranceType = '6'
                            .and(nestedInner -> nestedInner
                                    .nested(ageSexWrapper -> ageSexWrapper
                                            .gt("a.age", four_two_man) // age > 55
                                            .eq("a.sex", "1") // sex = '1'
                                    ).or().nested(ageSexWrapper -> ageSexWrapper
                                            .gt("a.age", four_two_woman) // age > 46
                                            .eq("a.sex", "2") // sex = '2'
                                    )
                            )
                    ).or().nested(inner -> inner
                            .eq("a.insuranceType", "7") // insuranceType = '7'
                            .and(nestedInner -> nestedInner
                                    .nested(ageSexWrapper -> ageSexWrapper
                                            .gt("a.age", four_one_man) // age > 45
                                            .eq("a.sex", "1") // sex = '1'
                                    ).or().nested(ageSexWrapper -> ageSexWrapper
                                            .gt("a.age", four_one_woman) // age > 39
                                            .eq("a.sex", "2") // sex = '2'
                                    )
                            )
                    )
            );
        } else {
            queryWrapper.eq("a.insuranceType", empBaseInfo.getInsuranceType());
            if (empBaseInfo.getInsuranceType().equals("7")) {
                queryWrapper.and(wrapper -> wrapper.nested(inner -> inner
                        .gt("a.age", four_one_man) // age > 45
                        .eq("a.sex", "1") // sex='1'
                ).or().nested(inner -> inner
                        .gt("a.age", four_one_woman) // age > 39
                        .eq("a.sex", "2") // sex='2'
                ));
            } else if (empBaseInfo.getInsuranceType().equals("6")) {
                queryWrapper.and(wrapper -> wrapper.nested(inner -> inner
                        .gt("a.age", four_two_man) // age > 55
                        .eq("a.sex", "1") // sex='1'
                ).or().nested(inner -> inner
                        .gt("a.age", four_two_woman) // age > 46
                        .eq("a.sex", "2") // sex='2'
                ));
            }
        }
        //queryWrapper.in("c.dept_Id", remoteDeptService.userRightDepts().split(StringConstant.COMMA));
        return queryWrapper;
    }
}