企业管理-员工信息

This commit is contained in:
xiao-fajia 2024-08-13 18:38:29 +08:00
parent 94db55c584
commit 603e962aa9
17 changed files with 372 additions and 23 deletions

View File

@ -41,4 +41,6 @@ public class BaseConstants {
public static final Integer UNIQUE_CODE_LEN = 6;
/**企业功能标识*/
public static final String FUNC_COMPANY = "company";
/**批量操作数据量*/
public static final Integer BATCH_SIZE = 100;
}

View File

@ -0,0 +1,55 @@
package cn.iocoder.yudao.module.custom.controller.admin;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.custom.entity.BasePromotion;
import cn.iocoder.yudao.module.custom.service.BasePromotionService;
import cn.iocoder.yudao.module.custom.vo.BasePromotionReqVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
/**
* 推广记录表 控制层
*
* @author 小李
* @date 16:42 2024/8/13
**/
@Tag(name = "管理后台 - 推广记录")
@Validated
@RestController
@RequestMapping("/base/promotion")
public class BasePromotionController {
@Resource
private BasePromotionService promotionService;
/**
* 分页查询推广记录
*
* @param pageReqVO 查询条件对象
* @param pageNo 页码
* @param pageSize 条数
* @author 小李
* @date 16:50 2024/8/13
**/
@GetMapping("/page")
@Operation(summary = "分页查询推广记录")
@PreAuthorize("@ss.hasPermission('base:promotion:query')")
public CommonResult<IPage<?>> getBasePromotionPage(BasePromotionReqVO pageReqVO,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
Page<BasePromotion> page = new Page<>(pageNo, pageSize);
return success(promotionService.queryListPage(pageReqVO, page));
}
}

View File

@ -0,0 +1,49 @@
package cn.iocoder.yudao.module.custom.entity;
import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* 推广记录表实体
* @author 小李
* @date 16:31 2024/8/13
**/
@TableName(value ="base_promotion")
@Data
@EqualsAndHashCode(callSuper = true)
public class BasePromotion extends TenantBaseDO {
/** 主键标识 */
@TableId(type = IdType.ASSIGN_ID)
private String id;
/** 推广用户idsystem_users表的id */
private Long oldUserId;
/** 推广用户姓名 */
private String oldUserName;
/** 推广渠道 */
private String promotionChannel;
/** 被推广用户idsystem_users表的id */
private Long newUserId;
/** 被推广用户姓名 */
private String newUserName;
/** 被推广用户注册时间 */
@JsonFormat(pattern="yyyy-MM-dd",timezone="GMT+8")
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date registerTime;
/** 被推广用户注册时填写的推广码 */
private String uniqueCode;
}

View File

@ -0,0 +1,28 @@
package cn.iocoder.yudao.module.custom.mapper;
import cn.iocoder.yudao.module.custom.entity.BasePromotion;
import cn.iocoder.yudao.module.custom.vo.BasePromotionReqVO;
import cn.iocoder.yudao.module.custom.vo.BasePromotionRespVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 推广记录表 Mapper
* @author 小李
* @date 16:38 2024/8/13
**/
@Mapper
public interface BasePromotionMapper extends BaseMapper<BasePromotion> {
/**
* 分页查询推广记录
*
* @param pageReqVO 查询条件对象
* @author 小李
* @date 16:50 2024/8/13
**/
IPage<BasePromotionRespVO> queryListPage(@Param("map") BasePromotionReqVO pageReqVO, Page<BasePromotion> page);
}

View File

@ -0,0 +1,17 @@
package cn.iocoder.yudao.module.custom.service;
import cn.iocoder.yudao.module.custom.entity.BasePromotion;
import cn.iocoder.yudao.module.custom.vo.BasePromotionReqVO;
import cn.iocoder.yudao.module.custom.vo.BasePromotionRespVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* 推广记录表 接口服务
* @author 小李
* @date 16:40 2024/8/13
**/
public interface BasePromotionService extends IService<BasePromotion> {
IPage<BasePromotionRespVO> queryListPage(BasePromotionReqVO pageReqVO, Page<BasePromotion> page);
}

View File

@ -0,0 +1,32 @@
package cn.iocoder.yudao.module.custom.service.impl;
import cn.iocoder.yudao.module.custom.entity.BasePromotion;
import cn.iocoder.yudao.module.custom.mapper.BasePromotionMapper;
import cn.iocoder.yudao.module.custom.service.BasePromotionService;
import cn.iocoder.yudao.module.custom.vo.BasePromotionReqVO;
import cn.iocoder.yudao.module.custom.vo.BasePromotionRespVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* 推广记录表 接口实现类
* @author 小李
* @date 16:41 2024/8/13
**/
@Service
public class BasePromotionServiceImpl extends ServiceImpl<BasePromotionMapper, BasePromotion> implements BasePromotionService {
/**
* 分页查询推广记录
*
* @param pageReqVO 查询条件对象
* @author 小李
* @date 16:50 2024/8/13
**/
@Override
public IPage<BasePromotionRespVO> queryListPage(BasePromotionReqVO pageReqVO, Page<BasePromotion> page) {
return baseMapper.queryListPage(pageReqVO, page);
}
}

View File

@ -0,0 +1,13 @@
package cn.iocoder.yudao.module.custom.vo;
import cn.iocoder.yudao.module.custom.entity.BasePromotion;
import lombok.Data;
/**
* 推广记录表查询VO
* @author 小李
* @date 16:36 2024/8/13
**/
@Data
public class BasePromotionReqVO extends BasePromotion {
}

View File

@ -0,0 +1,13 @@
package cn.iocoder.yudao.module.custom.vo;
import cn.iocoder.yudao.module.custom.entity.BasePromotion;
import lombok.Data;
/**
* 推广记录表响应或提交VO
* @author 小李
* @date 16:37 2024/8/13
**/
@Data
public class BasePromotionRespVO extends BasePromotion {
}

View File

@ -0,0 +1,23 @@
package cn.iocoder.yudao.scheduled;
import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* 定时提醒企业管理员资质过期
* @author 小李
* @date 16:02 2024/8/13
**/
@Component
@TenantJob
@Slf4j
public class NoticeCompanyQualsExpiredJob implements JobHandler {
@Override
public String execute(String param) throws Exception {
// TODO
return null;
}
}

View File

@ -0,0 +1,21 @@
<?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="cn.iocoder.yudao.module.custom.mapper.BasePromotionMapper">
<resultMap id="BaseResultMap" type="cn.iocoder.yudao.module.custom.entity.BasePromotion">
<id property="id" column="id" jdbcType="VARCHAR"/>
<result property="oldUserId" column="old_user_id" jdbcType="BIGINT"/>
<result property="oldUserName" column="old_user_name" jdbcType="VARCHAR"/>
<result property="promotionChannel" column="promotion_channel" jdbcType="VARCHAR"/>
<result property="newUserId" column="new_user_id" jdbcType="BIGINT"/>
<result property="newUserName" column="new_user_name" jdbcType="VARCHAR"/>
<result property="registerTime" column="register_time" jdbcType="TIMESTAMP"/>
<result property="uniqueCode" column="unique_code" jdbcType="VARCHAR"/>
</resultMap>
<select id="queryListPage" resultMap="BaseResultMap">
select * from base_promotion
</select>
</mapper>

View File

@ -13,7 +13,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.apache.ibatis.annotations.Param;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@ -154,6 +153,8 @@ public class CompanyStaffController {
* @date 14:59 2024/8/7
**/
@GetMapping("/labels")
@Operation(summary = "获取当前功能的标签")
@PreAuthorize("@ss.hasPermission('company:staff:query')")
public CommonResult<List<Label>> getLabels() {
return success(staffService.getLabels());
}
@ -165,6 +166,8 @@ public class CompanyStaffController {
* @date 15:54 2024/8/8
**/
@GetMapping("/list")
@Operation(summary = "获取当前登录用户部门下所有员工信息")
@PreAuthorize("@ss.hasPermission('company:staff:query')")
public CommonResult<List<CompanyStaff>> getStaffList() {
return success(staffService.getStaffList());
}
@ -177,6 +180,8 @@ public class CompanyStaffController {
* @date 14:03 2024/8/9
**/
@GetMapping("/checkWorkNo")
@Operation(summary = "验证工号是否重复")
@PreAuthorize("@ss.hasPermission('company:staff:query')")
public CommonResult<Boolean> checkWorkNo(@RequestParam("workNo") String workNo) {
return success(staffService.checkWorkNo(workNo));
}
@ -189,6 +194,8 @@ public class CompanyStaffController {
* @date 16:21 2024/8/9
**/
@PostMapping("/resetPassword")
@Operation(summary = "重置员工登录密码")
@PreAuthorize("@ss.hasPermission('company:staff:resetPassword')")
public CommonResult resetPassword(@RequestBody CompanyStaffRespVO staffRespVO) {
staffService.resetPassword(staffRespVO);
return CommonResult.ok();

View File

@ -87,4 +87,11 @@ public interface CompanyStaffService extends IService<CompanyStaff> {
* @param workNo 输入的工号
**/
Boolean checkWorkNo(String workNo);
/**
* 更新员工的工龄和司龄
* @author 小李
* @date 11:41 2024/8/13
**/
void updateStaffWorkAndJoinedYears();
}

View File

@ -4,10 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.common.BaseConstants;
import cn.iocoder.yudao.common.CommonErrorCodeConstants;
import cn.iocoder.yudao.framework.common.util.io.FileUtils;
import cn.iocoder.yudao.framework.datapermission.core.rule.DataPermissionRule;
import cn.iocoder.yudao.framework.datapermission.core.rule.dept.DeptDataPermissionRule;
import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.company.entity.Company;
import cn.iocoder.yudao.module.company.service.CompanyService;
@ -16,7 +13,6 @@ import cn.iocoder.yudao.module.label.entity.Label;
import cn.iocoder.yudao.module.label.service.BusiLabelService;
import cn.iocoder.yudao.module.label.service.LabelService;
import cn.iocoder.yudao.module.staff.entity.CompanyStaff;
import cn.iocoder.yudao.module.staff.entity.CompanyStaffChange;
import cn.iocoder.yudao.module.staff.mapper.CompanyStaffMapper;
import cn.iocoder.yudao.module.staff.service.CompanyStaffChangeService;
import cn.iocoder.yudao.module.staff.service.CompanyStaffService;
@ -37,6 +33,10 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.Period;
import java.time.ZoneId;
import java.util.List;
import java.util.stream.Collectors;
@ -68,6 +68,7 @@ public class CompanyStaffServiceImpl extends ServiceImpl<CompanyStaffMapper, Com
@Resource
private UniqueCodeService uniqueCodeService;
@Resource
private DataPermissionRule dataPermissionRule;
@ -140,7 +141,7 @@ public class CompanyStaffServiceImpl extends ServiceImpl<CompanyStaffMapper, Com
staffRespVO.setCorpId(company.getId());
// 2 生成唯一推广码
String uniqueCode = uniqueCodeService.createUniqueCode();
if (!ObjectUtil.isNotEmpty(uniqueCode)){
if (!ObjectUtil.isNotEmpty(uniqueCode)) {
throw exception(CommonErrorCodeConstants.UNIQUE_CODE_CREATE_REPEAT);
}
staffRespVO.setUniqueCode(uniqueCode);
@ -222,7 +223,7 @@ public class CompanyStaffServiceImpl extends ServiceImpl<CompanyStaffMapper, Com
/* 验证是否已交接工作 */
Boolean flag = staffChangeService.checkChangeStatus(staff.getUserId());
if (!flag){
if (!flag) {
throw exception(CommonErrorCodeConstants.STAFF_NOT_CHANGE);
}
@ -340,32 +341,35 @@ public class CompanyStaffServiceImpl extends ServiceImpl<CompanyStaffMapper, Com
/**
* 获取当前登录用户部门下所有员工信息
*
* @author 小李
* @date 15:54 2024/8/8
**/
@Override
public List<CompanyStaff> getStaffList(){
public List<CompanyStaff> getStaffList() {
return baseMapper.selectList(new QueryWrapper<>());
}
/**
* 重置员工登录密码
*
* @param staffRespVO 员工对象
* @author 小李
* @date 16:21 2024/8/9
* @param staffRespVO 员工对象
**/
public void resetPassword(CompanyStaffRespVO staffRespVO){
public void resetPassword(CompanyStaffRespVO staffRespVO) {
// 修改员工密码
adminUserApi.resetPassword(staffRespVO.getUserId(), staffRespVO.getPassword());
}
/**
* 验证工号是否重复
*
* @param workNo 输入的工号
* @author 小李
* @date 14:03 2024/8/9
* @param workNo 输入的工号
**/
public Boolean checkWorkNo(String workNo){
public Boolean checkWorkNo(String workNo) {
// 获取当前登录用户的部门ID和企业ID
AdminUserRespDTO loginUser = getLoginUser();
DeptRespDTO loginDept = getLoginDept(loginUser.getDeptId());
@ -379,31 +383,79 @@ public class CompanyStaffServiceImpl extends ServiceImpl<CompanyStaffMapper, Com
/**
* 获取当前登录用户的详细信息
*
* @author 小李
* @date 17:27 2024/8/9
**/
private AdminUserRespDTO getLoginUser(){
**/
private AdminUserRespDTO getLoginUser() {
Long userId = SecurityFrameworkUtils.getLoginUserId();
return adminUserApi.getUser(userId);
}
/**
* 获取当前登录用户的部门详细信息
*
* @param deptId 部门ID
* @author 小李
* @date 17:28 2024/8/9
* @param deptId 部门ID
**/
private DeptRespDTO getLoginDept(Long deptId){
**/
private DeptRespDTO getLoginDept(Long deptId) {
return deptApi.getDept(deptId);
}
/**
* 获取当前登录用户的企业详细信息
*
* @param corpName 企业名称
* @author 小李
* @date 18:03 2024/8/9
* @param corpName 企业名称
**/
private Company getLoginCompany(String corpName){
**/
private Company getLoginCompany(String corpName) {
return companyService.getOne(new LambdaQueryWrapper<Company>().eq(Company::getCorpName, corpName));
}
/**
* 更新员工的工龄和司龄
*
* @author 小李
* @date 11:41 2024/8/13
**/
@Override
@DSTransactional
public void updateStaffWorkAndJoinedYears() {
LambdaQueryWrapper<CompanyStaff> queryWrapper = new LambdaQueryWrapper<>();
Page<CompanyStaff> page = new Page<>(0, BaseConstants.BATCH_SIZE);
while (true) {
// 查询一页的数据
Page<CompanyStaff> companyStaffPage = baseMapper.selectPage(page, queryWrapper);
// 对每一页数据进行操作更新
List<CompanyStaff> result = companyStaffPage.getRecords().stream().map(item -> {
// 获取当前时间工作时间入职时间
LocalDate currentDate = LocalDate.now();
LocalDate workDate = item.getWorkDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate joinedDate = item.getJoinedDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
// 计算工龄
BigDecimal workYear = new BigDecimal(Period.between(workDate, currentDate).getYears());
item.setWorkYear(workYear);
// 计算司龄
BigDecimal joinedYear = new BigDecimal(Period.between(joinedDate, currentDate).getYears());
item.setJoinedYear(joinedYear);
return item;
}).collect(Collectors.toList());
// 批量更新
updateBatchById(result);
// 没有下一页了就退出
if (companyStaffPage.getRecords().isEmpty()){
break;
}
// 取一页
queryWrapper.gt(CompanyStaff::getId, page.getRecords().get(page.getRecords().size() - 1).getId());
}
}
}

View File

@ -0,0 +1,30 @@
package cn.iocoder.yudao.scheduled;
import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
import cn.iocoder.yudao.module.staff.service.CompanyStaffService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 定时更新员工的工龄和司龄
* @author 小李
* @date 14:00 2024/8/13
**/
@Component
@TenantJob
@Slf4j
public class UpdateCompanyStaffWorkAndJoinedYearsJob implements JobHandler {
@Resource
private CompanyStaffService staffService;
@Override
public String execute(String param) throws Exception {
// 执行更新
staffService.updateStaffWorkAndJoinedYears();
return null;
}
}

View File

@ -97,7 +97,7 @@
and (cs_old.tel like concat('%', #{map.tel}, '%') or cs_new.tel like concat('%', #{map.tel}, '%'))
</if>
<if test="map.changeTimeArray != null and map.changeTimeArray.length > 0">
and (csc.changeTime between #{map.changeTimeArray[0]} and #{map.changeTimeArray[1]})
and (csc.change_time between #{map.changeTimeArray[0]} and #{map.changeTimeArray[1]})
</if>
<if test="map.oldUserIds != null and map.oldUserIds.size > 0">
and csc.old_user_id in

View File

@ -8,7 +8,7 @@ import java.lang.annotation.Target;
/**
* 多租户 Job 注解
*/
@Target({ElementType.METHOD})
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface TenantJob {
}

View File

@ -2,12 +2,12 @@ server:
port: 48080
--- #################### 数据库相关配置 ####################
# exclude中少的内容 - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置
spring:
# 数据源配置项
autoconfigure:
exclude:
- com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源
- org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置
- de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置
- de.codecentric.boot.admin.server.ui.config.AdminServerUiAutoConfiguration # 禁用 Spring Boot Admin 的 Server UI 的自动配置
- de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration # 禁用 Spring Boot Admin 的 Client 的自动配置