package com.bonus.material.ma.mapper;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

import com.bonus.common.biz.domain.lease.LeaseOutDetails;
import com.bonus.material.ma.domain.MaTypeHistory;
import com.bonus.material.ma.domain.Type;
import com.bonus.material.ma.domain.vo.MaTypeConfigVo;
import com.bonus.material.ma.domain.vo.MaTypeVo;
import com.bonus.material.ma.domain.vo.MaTypeSelectVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

/**
 * 物资类型Mapper接口
 * @author syruan
 */
@Mapper
public interface TypeMapper {

    // 查询物资类型的内部租赁价
    BigDecimal selectLeasePriceByTypeId(Long typeId);

    List<Type> selectMaTypeList(@Param("typeId") Long typeId,@Param("typeName") String typeName);

    /**
     * 查询物资类型3级--前端联动式下拉框
     * 没有4级规格型号
     * @param typeName
     * @return
     */
    List<Type> selectMaTypeThreeList(String typeName);

    /**
     * 查询物资类型
     *
     * @param typeId 物资类型主键
     * @return 物资类型
     */
    Type selectTypeByTypeId(Long typeId);

    /**
     * 根据level层级和typeID 查询父级ID
     * @param type
     */
    List<Integer> selectParentId(MaTypeVo type);

    /**
     * 根据物资仓库的ID查询物资类型列表
     * @param houseId 物资仓库ID
     */
    List<MaTypeSelectVo> selectMaTypeListByHouseId(Long houseId);

    List<MaTypeVo> getListByTypeName(@Param("typeId") Long typeId, @Param("type") MaTypeVo type);

    /**
     * 查询物资类型下拉树结构--根据上级ID
     * @param parentId 父级ID
     */
    List<MaTypeSelectVo> getMaTypeSelectVoListByParentId(@Param("parentId") Long parentId);

    /**
     * 物资类型树形结构

     */
    List<Type> selectMaTypeTree();

    /**
     * 查询物资类型列表
     *
     * @param type 物资类型
     * @return 物资类型集合
     */
    List<Type> selectTypeList(Type type);

    List<Type> selectTypeList4Keeper(Type type);

    List<Type> selectTypeList4Repair(Type type);


    /**
     * 查询物资类型列表 -- 并且查询当前节点的父级节点名称
     *
     * @param typeListVo 物资类型
     * @return 物资类型集合
     */
    List<MaTypeVo> selectTypeListAndParent(Type typeListVo);


    /**
     * 查询四级物资类型列表 -- 并且查询当前节点的父级节点名称
     * @param type
     * @return
     */
    List<MaTypeConfigVo> selectFourLevelTypeListAndParent(Type type);

    /**
     * 查询三级物资类型列表 -- 并且查询当前节点的父级节点名称
     * @param type
     * @return
     */
    List<MaTypeConfigVo> selectThreeLevelTypeListAndParent(Type type);

    /**
     * 新增物资类型
     *
     * @param type 物资类型
     * @return 结果
     */
    int insertType(Type type);

    /**
     * 修改物资类型
     *
     * @param type 物资类型
     * @return 结果
     */
    int updateType(Type type);

    /**
     * 删除物资类型 -- 真实删除
     *
     * @param typeId 物资类型主键
     * @return 结果
     */
    int deleteTypeByTypeId(Long typeId);

    /**
     * 删除物资类型 -- 逻辑删除
     *
     * @param typeId 物资类型主键
     * @return 结果
     */
    int logicDeleteTypeByTypeId(Long typeId);

    /**
     * 批量删除物资类型 -- 逻辑删除
     *
     * @param typeIds 需要删除的数据主键集合
     * @return 结果
     */
    int logicDeleteTypeByTypeIds(Long[] typeIds);

    Type queryByNameAndParentId(@Param("typeName") String typeName, @Param("parentId") Long parentId);

    int insertMaTypeLeasePriceHistory(MaTypeHistory maTypeHistory);

    List<MaTypeHistory> getMaTypeHistoryListBy(MaTypeHistory maTypeHistory);

    /**
     * 根据ID查询
     * @param typeId
     * @return
     */
    List<Type> selectById(Long typeId);

    /**
     * 减少 (ma_type 设备规格表)的库存数量
     */
    int updateMaTypeStockNum(@Param("record") Type type);

    Type selectByTypeId(@Param("record") LeaseOutDetails record);

    Type getMaType(Long typeId);

    int getCountOfCodeMachine(@Param("record") LeaseOutDetails record);

    int getMachineByCt(LeaseOutDetails record);

    int deleteTypeKeeperByTypeId(Type type);

    int insertTypeKeeper(Type keeper);

    int deleteTypeRepairerByTypeId(Type type);

    int insertTypeRepairer(Type repairer);

    /**
     * 库存退回
     * @param leaseOutDetails
     * @return
     */
    int addMaTypeStockNum(@Param("record") LeaseOutDetails leaseOutDetails);

    /**
     * 根据合同ID查询三级物资类型
     * @param agreementId
     * @return
     */
    List<Type> selectMaTypeThreeLists(Long agreementId);

    /**
     * 查询一级列表
     * @param maTypeVo
     * @return
     */
    List<MaTypeVo> getListLevel(MaTypeVo maTypeVo);

    /**
     * 查询数量
     * @param type
     * @return
     */
    Integer getCount(Type type);

    /**
     * 查询数量
     * @param type
     * @return
     */
    Type getNumList(Type type);

    /**
     * 批量查询数量 - 性能优化
     * @param agreementId 协议ID
     * @param typeIds 类型ID列表
     * @return 类型使用数量列表
     */
    List<Type> getNumListBatch(@Param("agreementId") Long agreementId, @Param("typeIds") List<Long> typeIds);

    /**
     * 查询物资类型管理绑定的用户列表
     * @param type
     * @return
     */
    List<MaTypeVo> getUserList(MaTypeVo type);

    int updateStorageNum(Type type);

    /**
     * 获取前置库存数量
     * @param type
     * @return
     */
    BigDecimal getStorageNumByTypeId(Type type);

    /**
     * 插入库存数量日志
     * @param type
     */
    void insertStorageNumLog(Type type);

    /**
     * 添加库存数量
     * @param type
     */
    int addStockNum(Type type);

    /**
     * 获取编码库存
     * @param type
     * @return
     */
    BigDecimal getMaCodeNum(Type type);
}
