maven
22 小时以前 593cbad35cb45247ac022127ca7edad48ff92b12
yys 1.人员入职同步新增用户,离职禁用登录
2.社保管理模块开发
已添加12个文件
已修改10个文件
652 ■■■■■ 文件已修改
src/main/java/com/ruoyi/common/utils/OrderUtils.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/framework/web/domain/BaseEntity.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/domain/SysDept.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/mapper/SysDeptMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/service/impl/SysUserServiceImpl.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/controller/SchemeApplicableStaffController.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/controller/SchemeInsuranceDetailController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/mapper/SchemeApplicableStaffMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/mapper/SchemeInsuranceDetailMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/pojo/SchemeApplicableStaff.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/pojo/SchemeInsuranceDetail.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/pojo/StaffOnJob.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/SchemeApplicableStaffService.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/SchemeInsuranceDetailService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/impl/SchemeApplicableStaffServiceImpl.java 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/impl/SchemeInsuranceDetailServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dev.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/staff/SchemeApplicableStaffMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/staff/SchemeInsuranceDetailMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/system/SysDeptMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/system/SysUserMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/utils/OrderUtils.java
@@ -13,6 +13,7 @@
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
@@ -21,6 +22,50 @@
 */
public class OrderUtils {
    /**
     * List<Integer> è½¬æ¢ä¸º Long[] æ•°ç»„
     * @param ids
     * @return
     */
    public static Long[] listIntegerToLongArray(List<Integer> ids) {
        return ids.stream()
                // å¤„理null值:如果元素为null,转换为0L(可根据业务调整,比如抛异常)
                .map(id -> id != null ? id.longValue() : -1L)
                // å°†Stream<Long>转换为Long[]数组
                .toArray(Long[]::new);
    }
    /**
     * åˆ¤æ–­ç›®æ ‡id是否在逗号分隔的字符串中
     * @param targetId
     * @param str
     * @return
     */
    public boolean isStaffIdExist(Object targetId,String str) {
        // ç©ºå€¼æ ¡éªŒï¼Œé¿å…ç©ºæŒ‡é’ˆ
        if (str == null || str.trim().isEmpty() || targetId == null) {
            return false;
        }
        // æŒ‰é€—号分割成数组
        String[] idArray = str.split(",");
        // éåŽ†æ•°ç»„åˆ¤æ–­æ˜¯å¦åŒ…å«ç›®æ ‡id
        for (String id : idArray) {
            // åŽ»é™¤ç©ºæ ¼ï¼ˆé˜²æ­¢å­—ç¬¦ä¸²ä¸­æœ‰å¤šä½™ç©ºæ ¼ï¼Œå¦‚"1, 121")
            String cleanId = id.trim();
            // è½¬æ¢ä¸ºæ•°å­—并比较
            try {
                if (cleanId.equals(String.valueOf(targetId))) {
                    return true;
                }
            } catch (NumberFormatException e) {
                // è‹¥å­˜åœ¨éžæ•°å­—ID,直接返回false
                return false;
            }
        }
        return false;
    }
    /**
     * æŸ¥è¯¢å½“天(基于createTime字段)的记录数量
src/main/java/com/ruoyi/framework/web/domain/BaseEntity.java
@@ -39,6 +39,7 @@
    private Date updateTime;
    /** å¤‡æ³¨ */
    @TableField(exist = false)
    private String remark;
    /** è¯·æ±‚参数 */
src/main/java/com/ruoyi/project/system/domain/SysDept.java
@@ -6,6 +6,8 @@
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import com.baomidou.mybatisplus.annotation.TableField;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.framework.web.domain.BaseEntity;
@@ -50,15 +52,18 @@
    private String delFlag;
    /** çˆ¶éƒ¨é—¨åç§° */
    @TableField(exist = false)
    private String parentName;
    /** éƒ¨é—¨ç¼–号 */
    private String deptNick;
    /** å‘˜å·¥æ•°é‡ */
    @TableField(exist = false)
    private Integer staffCount;
    
    /** å­éƒ¨é—¨ */
    @TableField(exist = false)
    private List<SysDept> children = new ArrayList<SysDept>();
    public Long getDeptId()
src/main/java/com/ruoyi/project/system/mapper/SysDeptMapper.java
@@ -2,6 +2,7 @@
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import com.ruoyi.project.system.domain.SysDept;
@@ -12,7 +13,7 @@
 * @author ruoyi
 */
@Mapper
public interface SysDeptMapper
public interface SysDeptMapper extends BaseMapper<SysDept>
{
    /**
     * æŸ¥è¯¢éƒ¨é—¨ç®¡ç†æ•°æ®
src/main/java/com/ruoyi/project/system/service/impl/SysUserServiceImpl.java
@@ -456,7 +456,7 @@
    /**
     * æ‰¹é‡åˆ é™¤ç”¨æˆ·ä¿¡æ¯
     *
     *
     * @param userIds éœ€è¦åˆ é™¤çš„用户ID
     * @return ç»“æžœ
     */
@@ -473,6 +473,9 @@
        userRoleMapper.deleteUserRole(userIds);
        // åˆ é™¤ç”¨æˆ·ä¸Žå²—位关联
        userPostMapper.deleteUserPost(userIds);
        // åˆ é™¤ç”¨æˆ·ä¸Žéƒ¨é—¨æ•°æ®
        sysUserDeptMapper.delete(new LambdaQueryWrapper<SysUserDept>()
                .in(SysUserDept::getUserId, userIds));
        return userMapper.deleteUserByIds(userIds);
    }
src/main/java/com/ruoyi/staff/controller/SchemeApplicableStaffController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
package com.ruoyi.staff.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.OrderUtils;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.staff.pojo.SchemeApplicableStaff;
import com.ruoyi.staff.service.SchemeApplicableStaffService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * <p>
 * ç¤¾ä¿æ–¹æ¡ˆé€‚用人员表 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-05 11:50:17
 */
@Api(tags = "社保方案适用人员表")
@RestController
@RequestMapping("/schemeApplicableStaff")
public class SchemeApplicableStaffController extends BaseController {
    @Autowired
    private SchemeApplicableStaffService schemeApplicableStaffService;
    @GetMapping("/listPage")
    @ApiOperation(value = "分页查询")
    public AjaxResult listPage(Page page, SchemeApplicableStaff schemeApplicableStaff) {
        return schemeApplicableStaffService.listPage(page,schemeApplicableStaff);
    }
    @PostMapping("/add")
    @ApiOperation(value = "添加")
    @Transactional(rollbackFor = Exception.class)
    @Log(title = "社保方案适用人员表", businessType = BusinessType.INSERT)
    public AjaxResult add(@RequestBody SchemeApplicableStaff schemeApplicableStaff) {
        return schemeApplicableStaffService.add(schemeApplicableStaff);
    }
    @PostMapping("/updateSchemeApplicableStaff")
    @ApiOperation(value = "修改")
    @Transactional(rollbackFor = Exception.class)
    @Log(title = "社保方案适用人员表", businessType = BusinessType.UPDATE)
    public AjaxResult updateSchemeApplicableStaff(@RequestBody SchemeApplicableStaff schemeApplicableStaff) {
        return schemeApplicableStaffService.updateSchemeApplicableStaff(schemeApplicableStaff);
    }
    @DeleteMapping("/delete")
    @ApiOperation(value = "删除")
    @Transactional(rollbackFor = Exception.class)
    @Log(title = "社保方案适用人员表", businessType = BusinessType.DELETE)
    public AjaxResult delete(@RequestBody List<Long> ids) {
        return schemeApplicableStaffService.delete(ids);
    }
}
src/main/java/com/ruoyi/staff/controller/SchemeInsuranceDetailController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.staff.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * <p>
 * ç¤¾ä¿æ–¹æ¡ˆä¿é™©ç¦åˆ©æ˜Žç»†è¡¨ å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-05 11:52:23
 */
@RestController
@RequestMapping("/schemeInsuranceDetail")
public class SchemeInsuranceDetailController {
}
src/main/java/com/ruoyi/staff/mapper/SchemeApplicableStaffMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.staff.mapper;
import com.ruoyi.staff.pojo.SchemeApplicableStaff;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
 * <p>
 * ç¤¾ä¿æ–¹æ¡ˆé€‚用人员表 Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-05 11:50:17
 */
@Mapper
public interface SchemeApplicableStaffMapper extends BaseMapper<SchemeApplicableStaff> {
}
src/main/java/com/ruoyi/staff/mapper/SchemeInsuranceDetailMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.staff.mapper;
import com.ruoyi.staff.pojo.SchemeInsuranceDetail;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
 * <p>
 * ç¤¾ä¿æ–¹æ¡ˆä¿é™©ç¦åˆ©æ˜Žç»†è¡¨ Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-05 11:52:23
 */
@Mapper
public interface SchemeInsuranceDetailMapper extends BaseMapper<SchemeInsuranceDetail> {
}
src/main/java/com/ruoyi/staff/pojo/SchemeApplicableStaff.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,84 @@
package com.ruoyi.staff.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
/**
 * <p>
 * ç¤¾ä¿æ–¹æ¡ˆé€‚用人员表
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-05 11:50:17
 */
@Getter
@Setter
@TableName("scheme_applicable_staff")
@ApiModel(value = "SchemeApplicableStaff对象", description = "社保方案适用人员表")
public class SchemeApplicableStaff implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("社保方案保险福利明细")
    @TableField(exist = false)
    private List<SchemeInsuranceDetail> schemeInsuranceDetailList;
    @ApiModelProperty("主键ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty("标题")
    private String title;
    @ApiModelProperty("部门ids,多个使用,隔开")
    private String deptIds;
    @ApiModelProperty("部门名称,多个使用,隔开")
    @TableField(exist = false)
    private String deptNames;
    @ApiModelProperty("人员名称,多个使用,隔开")
    private String staffNames;
    @ApiModelProperty("人员id,多个使用,隔开")
    private String staffIds;
    @ApiModelProperty("保险类型名称多个使用,隔开")
    private String insuranceTypes;
    @ApiModelProperty("备注")
    private String remark;
    @TableField(exist = false)
    @ApiModelProperty("创建人名称")
    private String createUserName;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8", shape = JsonFormat.Shape.STRING)
    private LocalDateTime createTime;
    @ApiModelProperty("更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty("创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("更新人")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
}
src/main/java/com/ruoyi/staff/pojo/SchemeInsuranceDetail.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
package com.ruoyi.staff.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
/**
 * <p>
 * ç¤¾ä¿æ–¹æ¡ˆä¿é™©ç¦åˆ©æ˜Žç»†è¡¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-05 11:52:23
 */
@Getter
@Setter
@TableName("scheme_insurance_detail")
@ApiModel(value = "SchemeInsuranceDetail对象", description = "社保方案保险福利明细表")
public class SchemeInsuranceDetail implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("明细ID(主键)")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty("关联的社保方案ID")
    private Long schemeId;
    @ApiModelProperty("保险类型(如医疗保险、养老保险等)")
    private String insuranceType;
    @ApiModelProperty("缴费基数")
    private BigDecimal paymentBase;
    @ApiModelProperty("是否调用基本工资:1-否,2-是")
    private Integer useBasicSalary;
    @ApiModelProperty("个人缴费比例(%)")
    private BigDecimal personalRatio;
    @ApiModelProperty("个人固定缴费金额")
    private BigDecimal personalFixed;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty("创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("更新人")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
}
src/main/java/com/ruoyi/staff/pojo/StaffOnJob.java
@@ -69,6 +69,11 @@
    private Long sysDeptId;
    /**
     * è§’色
     */
    private Long roleId;
    /**
     * å®¶åº­ä½å€
     */
    @Excel(name = "家庭住址", sort = 6)
src/main/java/com/ruoyi/staff/service/SchemeApplicableStaffService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.staff.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.staff.pojo.SchemeApplicableStaff;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
 * <p>
 * ç¤¾ä¿æ–¹æ¡ˆé€‚用人员表 æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-05 11:50:17
 */
public interface SchemeApplicableStaffService extends IService<SchemeApplicableStaff> {
    AjaxResult listPage(Page page, SchemeApplicableStaff schemeApplicableStaff);
    AjaxResult add(SchemeApplicableStaff schemeApplicableStaff);
    AjaxResult updateSchemeApplicableStaff(SchemeApplicableStaff schemeApplicableStaff);
    AjaxResult delete(List<Long> ids);
}
src/main/java/com/ruoyi/staff/service/SchemeInsuranceDetailService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.staff.service;
import com.ruoyi.staff.pojo.SchemeInsuranceDetail;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * ç¤¾ä¿æ–¹æ¡ˆä¿é™©ç¦åˆ©æ˜Žç»†è¡¨ æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-05 11:52:23
 */
public interface SchemeInsuranceDetailService extends IService<SchemeInsuranceDetail> {
}
src/main/java/com/ruoyi/staff/service/impl/SchemeApplicableStaffServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,153 @@
package com.ruoyi.staff.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.project.system.domain.SysDept;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.domain.SysUserDept;
import com.ruoyi.project.system.mapper.SysDeptMapper;
import com.ruoyi.project.system.mapper.SysUserDeptMapper;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.staff.mapper.SchemeInsuranceDetailMapper;
import com.ruoyi.staff.pojo.SchemeApplicableStaff;
import com.ruoyi.staff.mapper.SchemeApplicableStaffMapper;
import com.ruoyi.staff.pojo.SchemeInsuranceDetail;
import com.ruoyi.staff.service.SchemeApplicableStaffService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
 * <p>
 * ç¤¾ä¿æ–¹æ¡ˆé€‚用人员表 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-05 11:50:17
 */
@Service
public class SchemeApplicableStaffServiceImpl extends ServiceImpl<SchemeApplicableStaffMapper, SchemeApplicableStaff> implements SchemeApplicableStaffService {
    @Autowired
    private SchemeApplicableStaffMapper schemeApplicableStaffMapper;
    @Autowired
    private SchemeInsuranceDetailMapper schemeInsuranceDetailMapper;
    @Autowired
    private SysUserDeptMapper sysUserDeptMapper;
    @Autowired
    private SysUserMapper sysUserMapper;
    @Autowired
    private SysDeptMapper sysDeptMapper;
    @Override
    public AjaxResult listPage(Page page, SchemeApplicableStaff schemeApplicableStaff) {
        LambdaQueryWrapper<SchemeApplicableStaff> schemeApplicableStaffLambdaQueryWrapper = new LambdaQueryWrapper<>();
        if(schemeApplicableStaff != null){
            if(StringUtils.isNotEmpty(schemeApplicableStaff.getTitle())){
                schemeApplicableStaffLambdaQueryWrapper.like(SchemeApplicableStaff::getTitle, schemeApplicableStaff.getTitle());
            }
        }
        Page<SchemeApplicableStaff> page1 = schemeApplicableStaffMapper.selectPage(page, schemeApplicableStaffLambdaQueryWrapper);
        List<Long> collect = page1.getRecords().stream().map(SchemeApplicableStaff::getId).collect(Collectors.toList());
        if(CollectionUtils.isEmpty(collect)){
            return AjaxResult.success(page1);
        }
        List<SchemeInsuranceDetail> schemeInsuranceDetails = schemeInsuranceDetailMapper
                .selectList(new LambdaQueryWrapper<SchemeInsuranceDetail>()
                        .in(SchemeInsuranceDetail::getSchemeId, collect));
        page1.getRecords().forEach(item -> {
            item.setSchemeInsuranceDetailList(schemeInsuranceDetails
                    .stream()
                    .filter(detail -> detail.getSchemeId().equals(item.getId()))
                    .collect(Collectors.toList()));
            SysUser sysUser = sysUserMapper.selectUserById(item.getCreateUser().longValue());
            item.setCreateUserName(sysUser == null ? "未知" : sysUser.getNickName());
            // èŽ·å–éƒ¨é—¨ä¿¡æ¯
            String[] split = item.getDeptIds().split(",");
            List<SysDept> sysDepts = sysDeptMapper.selectList(new LambdaQueryWrapper<SysDept>()
                    .in(SysDept::getDeptId, Arrays.stream(split).map(Long::valueOf).collect(Collectors.toList())));
            if(!CollectionUtils.isEmpty(sysDepts)){
                item.setDeptNames(sysDepts.stream().map(SysDept::getDeptName).collect(Collectors.joining(",")));
            }
        });
        return AjaxResult.success(page1);
    }
    public void setSchemeApplicableStaffUserInfo(SchemeApplicableStaff schemeApplicableStaff) {
        // é€šè¿‡éƒ¨é—¨èŽ·å–äººå‘˜id
        List<SysUserDept> sysUserDepts = sysUserDeptMapper.selectList(new LambdaQueryWrapper<SysUserDept>()
                .in(SysUserDept::getDeptId, schemeApplicableStaff.getDeptIds()));
        if(CollectionUtils.isEmpty(sysUserDepts)){
            throw new IllegalArgumentException("部门下无员工");
        }
        List<SysUser> sysUsers = sysUserMapper.selectUserByIds(sysUserDepts.stream().map(SysUserDept::getUserId).collect(Collectors.toList()));
        if(CollectionUtils.isEmpty(sysUsers)){
            throw new IllegalArgumentException("部门下无员工");
        }
        schemeApplicableStaff.setStaffIds(sysUsers
                .stream()
                .map(SysUser::getUserId)
                .filter(Objects::nonNull)         // è¿‡æ»¤æŽ‰ null å€¼
                .map(String::valueOf)
                .collect(Collectors.joining( ",")));
        schemeApplicableStaff.setStaffNames(sysUsers.stream().map(SysUser::getNickName).collect(Collectors.joining(",")));
    }
    @Override
    public AjaxResult add(SchemeApplicableStaff schemeApplicableStaff) {
        if(schemeApplicableStaff == null){
            return AjaxResult.error("参数错误");
        }
        if(CollectionUtils.isEmpty(schemeApplicableStaff.getSchemeInsuranceDetailList())){
            return AjaxResult.error("请选择方案明细");
        }
        setSchemeApplicableStaffUserInfo(schemeApplicableStaff); //根据部门设置用户信息
        int insert = schemeApplicableStaffMapper.insert(schemeApplicableStaff);
        schemeApplicableStaff.getSchemeInsuranceDetailList().forEach(item -> {
            item.setSchemeId(schemeApplicableStaff.getId());
            schemeInsuranceDetailMapper.insert(item);
        });
        return AjaxResult.success(insert);
    }
    @Override
    public AjaxResult updateSchemeApplicableStaff(SchemeApplicableStaff schemeApplicableStaff) {
        if(schemeApplicableStaff == null){
            return AjaxResult.error("参数错误");
        }
        setSchemeApplicableStaffUserInfo(schemeApplicableStaff); //根据部门设置用户信息
        int update = schemeApplicableStaffMapper.updateById(schemeApplicableStaff);
        // å…ˆåˆ ï¼Œé‡æ–°ç»‘定
        schemeInsuranceDetailMapper.delete(new LambdaQueryWrapper<SchemeInsuranceDetail>()
                .eq(SchemeInsuranceDetail::getSchemeId, schemeApplicableStaff.getId()));
        schemeApplicableStaff.getSchemeInsuranceDetailList().forEach(item -> {
            item.setSchemeId(schemeApplicableStaff.getId());
            schemeInsuranceDetailMapper.insert(item);
        });
        return AjaxResult.success(update);
    }
    @Override
    public AjaxResult delete(List<Long> ids) {
        if (CollectionUtils.isEmpty(ids)) {
            return AjaxResult.error("参数错误");
        }
        int delete = schemeApplicableStaffMapper.deleteBatchIds(ids);
        schemeInsuranceDetailMapper.delete(new LambdaQueryWrapper<SchemeInsuranceDetail>()
                .in(SchemeInsuranceDetail::getSchemeId, ids));
        return AjaxResult.success(delete);
    }
}
src/main/java/com/ruoyi/staff/service/impl/SchemeInsuranceDetailServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.staff.service.impl;
import com.ruoyi.staff.pojo.SchemeInsuranceDetail;
import com.ruoyi.staff.mapper.SchemeInsuranceDetailMapper;
import com.ruoyi.staff.service.SchemeInsuranceDetailService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
 * <p>
 * ç¤¾ä¿æ–¹æ¡ˆä¿é™©ç¦åˆ©æ˜Žç»†è¡¨ æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-05 11:52:23
 */
@Service
public class SchemeInsuranceDetailServiceImpl extends ServiceImpl<SchemeInsuranceDetailMapper, SchemeInsuranceDetail> implements SchemeInsuranceDetailService {
}
src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
@@ -6,10 +6,15 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.OrderUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.dto.WordDateDto;
import com.ruoyi.project.system.domain.SysPost;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysPostMapper;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.project.system.service.impl.SysUserServiceImpl;
import com.ruoyi.staff.dto.StaffOnJobDto;
import com.ruoyi.staff.mapper.StaffContractMapper;
import com.ruoyi.staff.mapper.StaffLeaveMapper;
@@ -22,6 +27,8 @@
import freemarker.template.Template;
import lombok.AllArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.ListUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -35,6 +42,7 @@
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.*;
import java.util.stream.Collectors;
@AllArgsConstructor
@Service
@@ -50,6 +58,12 @@
    @Autowired
    private StaffLeaveMapper staffLeaveMapper;
    @Autowired
    private SysUserServiceImpl sysUserService;
    @Autowired
    private SysUserMapper sysUserMapper;
    //在职员工台账分页查询
    @Override
@@ -64,14 +78,29 @@
        String[] ignoreProperties = {"id"};//排除id属性
        // åˆ¤æ–­ç¼–号是否存在
        List<StaffOnJob> staffOnJobs = staffOnJobMapper.selectList(Wrappers.<StaffOnJob>lambdaQuery().eq(StaffOnJob::getStaffNo, staffOnJobPrams.getStaffNo()));
        if (staffOnJobs.size()>0){
        if (staffOnJobs != null && !staffOnJobs.isEmpty()){
            throw new BaseException("编号为"+staffOnJobPrams.getStaffNo()+"的员工已经存在,无法新增!!!");
        }
        // åˆ›å»ºå…¥èŒæ•°æ®
        staffOnJobPrams.setContractExpireTime(staffOnJobPrams.getContractEndTime());
        staffOnJobPrams.setStaffState(1);
        staffOnJobMapper.insert(staffOnJobPrams);
        // æŸ¥è¯¢ç”¨æˆ·æ˜¯å¦å·²ç»æ–°å¢ž
        SysUser sysUser = sysUserService.selectUserById(staffOnJobPrams.getId());
        if(sysUser == null){
            SysUser sysUser1 = new SysUser();
            sysUser1.setUserName(staffOnJobPrams.getStaffNo());
            sysUser1.setNickName(staffOnJobPrams.getStaffName());
            String s = SecurityUtils.encryptPassword("123456");
            sysUser1.setPassword(s);
            Long[] posts = new Long[]{staffOnJobPrams.getSysPostId().longValue()};
            sysUser1.setPostIds(posts);
            sysUser1.setRoleIds(new Long[]{staffOnJobPrams.getRoleId()});
            sysUser1.setDeptIds(new  Long[]{staffOnJobPrams.getSysDeptId()});
            sysUser1.setStatus("0");
            sysUserService.insertUser(sysUser1);
        }
        // åˆ›å»ºåˆåŒè®°å½•
        StaffContract staffContract = new StaffContract();
        staffContract.setStaffOnJobId(staffOnJobPrams.getId());
@@ -112,10 +141,22 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int delStaffOnJobs(List<Integer> ids) {
        List<StaffOnJob> staffOnJobs = staffOnJobMapper.selectList(Wrappers.<StaffOnJob>lambdaQuery().in(StaffOnJob::getId, ids));
        if(CollectionUtils.isEmpty(staffOnJobs)){
            throw new BaseException("该员工不存在,无法删除!!!");
        }
        // åˆ é™¤å…¥èŒæ•°æ®
        staffOnJobMapper.deleteBatchIds(ids);
        // åˆ é™¤ç¦»èŒæ•°æ®
        staffLeaveMapper.delete(Wrappers.<StaffLeave>lambdaQuery().in(StaffLeave::getStaffOnJobId, ids));
        // åˆ é™¤ç”¨æˆ·æ•°æ®
        List<SysUser> sysUsers = sysUserMapper.selectList(Wrappers.<SysUser>lambdaQuery()
                .in(SysUser::getUserName, staffOnJobs.stream().map(StaffOnJob::getStaffNo).collect(Collectors.toList())));
        if(CollectionUtils.isNotEmpty(sysUsers)){
            Long[] longs = sysUsers.stream().map(SysUser::getUserId).toArray(Long[]::new);
            sysUserService.deleteUserByIds(longs);
        }
        // åˆ é™¤åˆåŒæ•°æ®
        return staffContractMapper.delete(Wrappers.<StaffContract>lambdaQuery().in(StaffContract::getStaffOnJobId, ids));
    }
src/main/resources/application-dev.yml
@@ -74,9 +74,9 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://localhost:3306/product-inventory-management-new?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://1.15.17.182:9999/product-inventory-management-new?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: 123456
        password: xd@123456..
      # ä»Žåº“数据源
      slave:
        # ä»Žæ•°æ®æºå¼€å…³/默认关闭
src/main/resources/mapper/staff/SchemeApplicableStaffMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.staff.mapper.SchemeApplicableStaffMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.staff.pojo.SchemeApplicableStaff">
        <id column="id" property="id" />
        <result column="title" property="title" />
        <result column="dept_ids" property="deptIds" />
        <result column="staff_names" property="staffNames" />
        <result column="staff_ids" property="staffIds" />
        <result column="insurance_types" property="insuranceTypes" />
        <result column="remark" property="remark" />
        <result column="create_time" property="createTime" />
        <result column="update_time" property="updateTime" />
        <result column="create_user" property="createUser" />
        <result column="update_user" property="updateUser" />
    </resultMap>
</mapper>
src/main/resources/mapper/staff/SchemeInsuranceDetailMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.staff.mapper.SchemeInsuranceDetailMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.staff.pojo.SchemeInsuranceDetail">
        <id column="id" property="id" />
        <result column="scheme_id" property="schemeId" />
        <result column="insurance_type" property="insuranceType" />
        <result column="payment_base" property="paymentBase" />
        <result column="use_basic_salary" property="useBasicSalary" />
        <result column="personal_ratio" property="personalRatio" />
        <result column="personal_fixed" property="personalFixed" />
        <result column="create_time" property="createTime" />
        <result column="update_time" property="updateTime" />
        <result column="create_user" property="createUser" />
        <result column="update_user" property="updateUser" />
    </resultMap>
</mapper>
src/main/resources/mapper/system/SysDeptMapper.xml
@@ -52,7 +52,7 @@
        order by d.parent_id, d.order_num
    </select>
    
    <select id="selectDeptListByRoleId" resultType="Long">
    <select id="selectDeptListByRoleId" resultType="java.lang.Long">
        select d.dept_id
        from sys_dept d
            left join sys_role_dept rd on d.dept_id = rd.dept_id
@@ -165,7 +165,7 @@
        update sys_dept set del_flag = '2' where dept_id = #{deptId}
    </delete>
    <select id="maxLevelDeptId">
    <select id="maxLevelDeptId" resultType="java.lang.Long">
        WITH RECURSIVE DepartmentHierarchy AS (
            SELECT dept_id, parent_id
            FROM sys_dept
src/main/resources/mapper/system/SysUserMapper.xml
@@ -139,6 +139,7 @@
    <select id="selectUserById" parameterType="Long" resultMap="SysUserResult">
        <include refid="selectUserVo"/>
        where u.user_id = #{userId}
        and u.del_flag = '0'
    </select>
    <select id="checkUserNameUnique" parameterType="String" resultMap="SysUserResult">
@@ -157,6 +158,7 @@
        where u.user_id in <foreach collection="userIds" item="item" open="(" separator="," close=")">
             #{item}
        </foreach>
        and u.del_flag = '0'
    </select>
    <select id="selectRegistrantIds" resultType="com.ruoyi.project.system.domain.SysUser">
        SELECT user_id, nick_name FROM sys_user
@@ -179,6 +181,7 @@
        <foreach collection="userIds" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>
        and del_flag = '0'
    </select>
    <select id="selectUserByNickName" resultType="com.ruoyi.project.system.domain.SysUser"
            parameterType="java.lang.String">