From 35cfaa7259f3d494e7bd03aec5c7e035049ee19b Mon Sep 17 00:00:00 2001
From: yubo <autumnal_wind@yeah.net>
Date: 星期三, 24 九月 2025 19:34:09 +0800
Subject: [PATCH] feat: 新增社保档位提醒功能

---
 febs-server/febs-server-hr/src/main/java/cc/mrbird/febs/server/hr/service/impl/EmpBaseInfoServiceImpl.java |  192 +++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 183 insertions(+), 9 deletions(-)

diff --git a/febs-server/febs-server-hr/src/main/java/cc/mrbird/febs/server/hr/service/impl/EmpBaseInfoServiceImpl.java b/febs-server/febs-server-hr/src/main/java/cc/mrbird/febs/server/hr/service/impl/EmpBaseInfoServiceImpl.java
index 21a2520..d1a12eb 100644
--- a/febs-server/febs-server-hr/src/main/java/cc/mrbird/febs/server/hr/service/impl/EmpBaseInfoServiceImpl.java
+++ b/febs-server/febs-server-hr/src/main/java/cc/mrbird/febs/server/hr/service/impl/EmpBaseInfoServiceImpl.java
@@ -28,6 +28,7 @@
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -214,15 +215,15 @@
     }
 
     /**
-     *
      * 增加员工后同步增加入职记录
-     *
+     * <p>
      * date 2021-07-30 09:12
-     * @author: luoyibo
+     *
      * @param empBaseInfo 员工信息
-     * @param operatorId 操作员Id
-     * @param empId 员工Id
+     * @param operatorId  操作员Id
+     * @param empId       员工Id
      * @return void
+     * @author: luoyibo
      */
     private void addEmpDimissLog(EmpBaseInfo empBaseInfo, String operatorId, Long empId) {
         EmpDimissionLog dimissionLog = new EmpDimissionLog();
@@ -231,6 +232,7 @@
         dimissionLog.setEntryDate(empBaseInfo.getEntryDate());
         dimissionLog.setDimissionType("20");
         dimissionLog.setRemark(empBaseInfo.getRemark());
+        dimissionLog.setDeptName(empBaseInfo.getAllDeptName());
         dimissionLog.setCreator(operatorId);
         dimissionLog.setModifier(operatorId);
 
@@ -355,6 +357,10 @@
         String operatorId = Optional.of(FebsUtil.getUserId()).orElse("1");
         String[] str = ids.split(",");
         List<String> list = new ArrayList<>(Arrays.asList(str));
+//        for (int i = 0, j = str.length; i < j; i++) {
+//            EmpBaseInfo emp = this.getById(str[i]);
+//            addEmpDimissLog(emp, operatorId, Long.valueOf(str[i]));
+//        }
         return empBaseInfoMapper.momentToNormal(list, operatorId) > 0;
     }
 
@@ -380,6 +386,7 @@
     public boolean closeEmpArchives(EmpDimissionLog empDimissionLog) {
         String operatorId = Optional.of(FebsUtil.getUserId()).orElse("1");
         String[] str = empDimissionLog.getEmpIds().split(",");
+        String[] empDeptNames = empDimissionLog.getDeptNames().split(",");
         List<String> list = new ArrayList<>(Arrays.asList(str));
         String[] strDate = empDimissionLog.getEntryDates().split(",");
 
@@ -396,6 +403,7 @@
             dimissionLog.setReporter(empDimissionLog.getReporter());
             dimissionLog.setCreator(operatorId);
             dimissionLog.setModifier(operatorId);
+            dimissionLog.setDeptName(empDeptNames[i]);
             dimissionLogService.save(dimissionLog);
         }
 
@@ -654,13 +662,13 @@
                 empBaseInfo.setArchivesStatus(dicItem.getDicItemCode());
             }
             empBaseInfo.setEmpStatus("0");
-            this.save(empBaseInfo);
+            boolean saveResult = this.save(empBaseInfo);
             //新入职员工需要增加一条入职记录
-            this.addEmpDimissLog(empBaseInfo,"2",empBaseInfo.getEmpId());
+            this.addEmpDimissLog(empBaseInfo, "2", empBaseInfo.getEmpId());
         }
     }
 
-    @Override
+    //    @Override
     public void getImage(String empId, HttpServletResponse response) throws Exception {
         EmpBaseInfo empBaseInfo = this.getById(empId);
         if (StrUtil.isBlank(empBaseInfo.getImagePath())) {
@@ -1189,7 +1197,7 @@
                 public void accept(QueryWrapper<EmpBaseInfo> wrapper) {
                     for (int i = 0; i < certificates.length; i++) {
                         String ageBtn = "|" + certificates[i] + "|";
-                        wrapper.gt("LOCATE('"+ageBtn+"',CONCAT('|',replace( certificateList, ',', '|,|'),'|'))",0);
+                        wrapper.gt("LOCATE('" + ageBtn + "',CONCAT('|',replace( certificateList, ',', '|,|'),'|'))", 0);
                     }
                 }
             };
@@ -1431,4 +1439,170 @@
     public boolean updateDeptName() {
         return empBaseInfoMapper.updateDeptName() > 0;
     }
+
+    @Override
+    public boolean updateEmpAge(String userId) {
+        List<EmpBaseInfo> empBaseInfoList = new ArrayList<>();
+        if (StringUtils.isNotBlank(userId)) {
+            EmpBaseInfo empBaseInfo = this.getById(userId);
+            empBaseInfoList.add(empBaseInfo);
+        } else {
+            empBaseInfoList = this.list();
+        }
+        if (!empBaseInfoList.isEmpty()) {
+            empBaseInfoList.parallelStream().forEach(p -> {
+                p.setAge(DateUtil.ageOfNow(p.getBirthdate()));
+                this.saveOrUpdate(p);
+            });
+        }
+        return false;
+    }
+
+    @Override
+    public void updateAnnualLeave(String userId) {
+        EmpBaseInfo empBaseInfo = this.getById(userId);
+        int holiday = calculateHoliday(empBaseInfo.getEntryDate());
+        empBaseInfo.setAnnualLeave(holiday);
+        baseMapper.update(null, new LambdaUpdateWrapper<EmpBaseInfo>()
+                .set(EmpBaseInfo::getAnnualLeave, holiday)
+                .eq(EmpBaseInfo::getEmpId, empBaseInfo.getEmpId()));
+    }
+
+    @Override
+    public void updateAnnualLeave() {
+        List<EmpBaseInfo> list = this.list();
+        list.parallelStream().forEach(p -> {
+            int holiday = calculateHoliday(p.getEntryDate());
+            p.setAnnualLeave(holiday);
+            baseMapper.update(null, new LambdaUpdateWrapper<EmpBaseInfo>()
+                    .set(EmpBaseInfo::getAnnualLeave, holiday)
+                    .eq(EmpBaseInfo::getEmpId, p.getEmpId()));
+        });
+    }
+
+    @Override
+    public void updateEmpBaseKeyInfo() {
+        List<EmpBaseInfo> list = this.list();
+        list.parallelStream().forEach(p -> {
+            int holiday = calculateHoliday(p.getEntryDate());
+            int age = calculateAge(p.getBirthdate());
+
+            baseMapper.update(null, new LambdaUpdateWrapper<EmpBaseInfo>()
+                    .set(EmpBaseInfo::getAnnualLeave, holiday)
+                    .set(EmpBaseInfo::getAge, age)
+                    .eq(EmpBaseInfo::getEmpId, p.getEmpId()));
+        });
+    }
+
+    @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 年假天数
+     */
+    private int calculateHoliday(Date date) {
+        int holiday = 0;
+        int joinYear = DateUtil.ageOfNow(date);
+        String configValue = redisService.get("annual_leave").toString();
+        String[] values = StrUtil.split(configValue, "|");
+        String[] condition = StrUtil.split(values[0], ",");
+        String[] days = StrUtil.split(values[1], ",");
+        if (condition.length == 2) {
+            int one = Integer.parseInt(condition[0]);
+            int two = Integer.parseInt(condition[1]);
+            if (joinYear >= one && joinYear < two) {
+                holiday = Integer.parseInt(days[0]);
+            } else if (joinYear >= two) {
+                holiday = Integer.parseInt(days[1]);
+            }
+        }
+        return holiday;
+    }
+
+    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;
+    }
 }

--
Gitblit v1.8.0