package cn.iocoder.yudao.module.smartfactory.dal.mysql.staff;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
import cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo.StaffPageReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.staffsalary.vo.StaffSalaryPageReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.staffsalary.vo.StaffSalaryRespVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factoryinfo.FactoryInfoDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.staff.StaffDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.staffsalary.StaffSalaryDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Objects;

/**
 * 员工 Mapper
 *
 * @author 艾楷
 */
@Mapper
public interface StaffMapper extends BaseMapperX<StaffDO> {

    default PageResult<StaffDO> selectPage(StaffPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<StaffDO>()
                .eqIfPresent(StaffDO::getWorkTypeId, reqVO.getWorkTypeId())
                .eqIfPresent(StaffDO::getFactoryId, reqVO.getFactoryId())
                .likeIfPresent(StaffDO::getNickName, reqVO.getNickName())
                .eqIfPresent(StaffDO::getStatus, reqVO.getStatus())
                .orderByDesc(StaffDO::getId));
    }

    /**
     * 通过工厂id获取员工信息
     *
     * @param factoryId 工厂编号
     * @return 员工信息列表
     */
    List<StaffDO> getStaffData(@Param("factoryId") Long factoryId);

    /**
     * 获取员工信息
     * @param factoryId 工厂编号
     * @return 员工信息列表
     */
    List<StaffDO> getStaffDataV2(@Param("factoryId") Long factoryId);

    default PageResult<StaffSalaryRespVO> selectSalaryPage(StaffSalaryPageReqVO pageReqVO) {

        MPJLambdaWrapperX<StaffDO> query = new MPJLambdaWrapperX<StaffDO>()
                .selectAs(StaffDO::getId, StaffSalaryRespVO::getStaffId)
                .selectAs(StaffDO::getNickName, StaffSalaryRespVO::getStaffName)
                .selectAs(StaffDO::getFactoryId, StaffSalaryRespVO::getFactoryId)
                .selectAs(FactoryInfoDO::getShortName, StaffSalaryRespVO::getFactoryName)
                .selectAs(StaffDO::getWorkTypeId, StaffSalaryRespVO::getWorkTypeId)
                .selectAs(StaffSalaryDO::getMonth, StaffSalaryRespVO::getMonth)
                .selectAs(StaffDO::getSalary, StaffSalaryRespVO::getSalary)
                .selectAs(StaffSalaryDO::getId, StaffSalaryRespVO::getId)
                .selectAs(StaffSalaryDO::getAttendanceDays, StaffSalaryRespVO::getAttendanceDays)
                .selectAs(StaffSalaryDO::getPayableAmount, StaffSalaryRespVO::getPayableAmount)
                .selectAs(StaffSalaryDO::getReturnAmount, StaffSalaryRespVO::getReturnAmount)
                .selectAs(StaffSalaryDO::getDeductionAmount, StaffSalaryRespVO::getDeductionAmount)
                .selectAs(StaffSalaryDO::getRealAmount, StaffSalaryRespVO::getRealAmount)
                .selectAs(StaffSalaryDO::getDeductionItems, StaffSalaryRespVO::getDeductionItems)
                .selectAs(StaffSalaryDO::getStatus, StaffSalaryRespVO::getStatus)
                .selectAs(StaffSalaryDO::getSalarySubjectItems, StaffSalaryRespVO::getSalarySubjectItems)
                .selectAs(StaffSalaryDO::getCreateTime, StaffSalaryRespVO::getCreateTime);
        query.leftJoin(StaffSalaryDO.class, on -> on
                .eq(StaffDO::getId, StaffSalaryDO::getStaffId)
                .eq(Objects.nonNull(pageReqVO.getMonth()), StaffSalaryDO::getMonth, pageReqVO.getMonth())
                .eq(Objects.nonNull(pageReqVO.getStatus()), StaffSalaryDO::getStatus, pageReqVO.getStatus()));
        query.leftJoin(FactoryInfoDO.class, FactoryInfoDO::getId, StaffDO::getFactoryId);
        query.eqIfPresent(StaffDO::getFactoryId, pageReqVO.getFactoryId());
        query.eqIfPresent(StaffDO::getWorkTypeId, pageReqVO.getWorkTypeId());
        query.eqIfPresent(StaffDO::getId, pageReqVO.getStaffId());

        return selectJoinPage(pageReqVO, StaffSalaryRespVO.class, query);
    }

    StaffDO selectStaffByUserId(@Param("userId") Long userId);
}
