package cn.iocoder.yudao.module.staff.service;

import cn.iocoder.yudao.module.label.entity.Label;
import cn.iocoder.yudao.module.staff.entity.CompanyStaff;
import cn.iocoder.yudao.module.staff.vo.CompanyStaffReqVO;
import cn.iocoder.yudao.module.staff.vo.CompanyStaffRespVO;
import cn.iocoder.yudao.module.system.api.permission.dto.RoleReqDTO;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

import javax.validation.Valid;
import java.util.Date;
import java.util.List;

/**
 * 企业管理-员工信息表 服务
 * @author 小李
 * @date 16:29 2024/8/6
**/
public interface CompanyStaffService extends IService<CompanyStaff> {

    /**
     * 获得企业管理-员工信息表分页
     * @author 小李
     * @date 17:11 2024/8/6
     * @param pageReqVO 分页查询
    **/
    IPage<CompanyStaff> queryListPage(CompanyStaffReqVO pageReqVO, Page<CompanyStaff> page);

    /**
     * 新增员工
     * @author 小李
     * @date 16:29 2024/8/6
     * @param staffRespVO 员工对象
    **/
    Long saveStaff(@Valid CompanyStaffRespVO staffRespVO);

    /**
     * 修改员工信息
     * @author 小李
     * @date 16:31 2024/8/6
     * @param staffRespVO 员工对象
    **/
    void updateStaff(@Valid CompanyStaffRespVO staffRespVO);

    /**
     * 删除员工信息
     * @author 小李
     * @date 16:32 2024/8/6
     * @param id 员工ID
    **/
    void deleteStaff(String id);

    /**
     * 删除员工信息通过用户id
     * @author zcy
     * @date 16:32 2024/8/6
     * @param userId 用户ID
     **/
    void deleteStaffByUserId(Long userId);

    /**
     * 获取当前功能的标签
     * @author 小李
     * @date 14:59 2024/8/7
     **/
    List<Label> getLabels();

    /**
     * 查询员工
     * @author 小李
     * @date 17:59 2024/8/6
     * @param id
     **/
    CompanyStaffRespVO getCompanyStaffById(String id);

    /**
     * 获取当前登录用户部门下所有员工信息
     * @author 小李
     * @date 15:54 2024/8/8
     **/
    List<CompanyStaff> getStaffList(String query);

    /**
     * 重置员工登录密码
     * @author 小李
     * @date 16:21 2024/8/9
     * @param staffRespVO 员工对象
     **/
    void resetPassword(CompanyStaffRespVO staffRespVO);

    /**
     * 验证工号是否重复
     * @author 小李
     * @date 14:03 2024/8/9
     * @param workNo 输入的工号
     **/
    Boolean checkWorkNo(String workNo);

    /**
     * 更新员工的工龄和司龄
     * @author 小李
     * @date 11:41 2024/8/13
    **/
    void updateStaffWorkAndJoinedYears();

    /**
     * 获取当前租户有些什么角色可以分配
     * @author 小李
     * @date 14:53 2024/8/14
    **/
    List<RoleReqDTO> getRoleList();

    /**
     * 新增推广记录
     * @author vinjor-m
     * @date 12:26 2024/8/14
     * @param dataFrom 客户来源
     * @param uniqueCode 推广码
     * @param user 被推广用户
     * @param promotionChannel 推广渠道
     * @param registerTime 被推广用户注册的时间
     **/
    Boolean createPromotion(String dataFrom,String uniqueCode, AdminUserDO user, String promotionChannel, Date registerTime);

    /**
     * 给所有没有推广码的员工设置推广码
     * @author vinjor-M
     * @date 17:23 2024/10/15
    **/
    void setStaffUnicode();
}
