package com.goafanti.common.dao;

import com.goafanti.Interview.bo.OutPublicAidUid;
import com.goafanti.admin.bo.OutFinanceCount;
import com.goafanti.common.model.OutPublicReleaseCount;
import com.goafanti.common.model.PublicRelease;
import com.goafanti.common.model.PublicReleaseDetails;
import com.goafanti.customer.bo.MyUserDetailsBo;
import com.goafanti.weChat.bo.*;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.util.Date;
import java.util.List;

/**
 * 公出表(PublicRelease)表数据库访问层
 *
 * @author makejava
 * @since 2025-09-02 11:22:46
 */
public interface PublicReleaseMapper {

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    PublicRelease selectById(Integer id);


    /**
     * 查询指定行数据
     *
     * @param publicRelease 查询条件
     * @param pageable      分页对象
     * @return 对象列表
     */
    List<PublicRelease> findPublicReleaseList(PublicRelease publicRelease);

    /**
     * 统计总行数
     *
     * @param publicRelease 查询条件
     * @return 总行数
     */
    int findPublicReleaseCount(PublicRelease publicRelease);

    /**
     * 新增数据
     *
     * @param publicRelease 实例对象
     * @return 影响行数
     */
    int insert(PublicRelease publicRelease);

    int insertSelective(PublicRelease publicRelease);

    /**
     * 批量新增数据（MyBatis原生foreach方法）
     *
     * @param entities List<PublicRelease> 实例对象列表
     * @return 影响行数
     */
    int insertBatch(@Param("entities") List<PublicRelease> entities);

    /**
     * 批量新增或按主键更新数据（MyBatis原生foreach方法）
     *
     * @param entities List<PublicRelease> 实例对象列表
     * @return 影响行数
     * @throws org.springframework.jdbc.BadSqlGrammarException 入参是空List的时候会抛SQL语句错误的异常，请自行校验入参
     */
    int insertOrUpdateBatch(@Param("entities") List<PublicRelease> entities);

    /**
     * 修改数据
     *
     * @param publicRelease 实例对象
     * @return 影响行数
     */
    int update(PublicRelease publicRelease);

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 影响行数
     */
    int deleteById(Integer id);

    int deleteByMainId(Integer id);

    OutPublicRelease selectDtails(@Param("id") Integer id);

    /**
     * 需要比对申请人其他公出时间，选择出重复的时间来判断是否生效。
     *  1 已有发起时间大于等于选择发起小于选择结束
     *  2 已有发起小于选择发起并且已有结束大于选择发起
     *  3 已有发起小于选择结束和已有结束大于选择结束
     * @param aid 申请人
     * @param start 开始时间
     * @param end 结束时间
     * @return
     */
    List<PublicRelease> checkTime(@Param("aid")String aid, @Param("start") Date start, @Param("end")Date end);

    void updateSignByAidAndUid(@Param("uid") String buyerId, @Param("aid") String salesmanId);

    List<OutPublicReleaseCount> getTimeUserFollow(@Param("date")Date date, @Param("now")Date now);

    List<OutPublicRelease> publicByOrder(String orderNo);

    List<PublicRelease> selectByMainId(@Param("mainId") Integer mainId,@Param("type") Integer type,@Param("aid") String aid);


    void updateStatusByMainId(@Param("status") Integer status, @Param("type") Integer type,@Param("mainId") Integer mainId,@Param("aid") String aid);

    OutPublicReleaseAndDetails selectDtailsByFid(@Param("ufid")String ufid);

    Integer selectCountByaidAndDate(@Param("aid") String aid, @Param("startTime") String startTime, @Param("endTime") String endTime);
    List<OutFinanceCount> selectByaidAndDate(@Param("aid") String aid, @Param("startTime") String startTime, @Param("endTime") String endTime);

    List<PublicRelease> selectByOrderNo(String orderNo);

    List<PublicRelease> selectMyNewPublic(String adminId);

    OutPublicReleaseList selectOutListBoById(Integer id);

    List<PublicRelease>  selectAll();

    List<releaseAndExpenseCountOut> releaseAndExpenseCount(InputreleaseAndExpenseCount in);

    PublicRelease selectSonIdByMain(Integer id);

    int selectCountByAssistUnaudited(String aid);

    int selectCountByUnaudited(String aid);

    int selectCountByOtherUnaudited(String aid);

    List<MyUserDetailsBo> selectByUid(String id);

    List<PublicRelease> selectByMainIdAndReviewer(@Param("id") Integer id, @Param("reviewerId") String reviewerId);

    List<PublicReleaseDetails> selectDetailsByPrid(Integer prid);

    void updateAssist(InputPublicRelease in);

    List<PublicRelease> checkTech(@Param("aid")String aid, @Param("start") Date start, @Param("end")Date end);

    List<MyUserDetailsBo> selectCountByUid(String id);

    /**
     * 获取时间内打卡数据，主要用于获取月份
     * @param start 开始时间
     * @param end  结束时间
     * @param type null =获取发起时间在时间段内，1=获取发起时间不在时间段内，但结束时间在的
     */
    List<PublicRelease> selectByMonth(@Param("start") LocalDate start, @Param("end") LocalDate end, @Param("type") Integer type);

    List<OutPublicAidUid> selectAllAidUid();
}

