package com.fjhx.item.service.product;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fjhx.common.entity.AvailableStockBo;
import com.fjhx.item.entity.product.ProcessesBo;
import com.fjhx.item.entity.product.bo.ProductAnalysisBo;
import com.fjhx.item.entity.product.dto.ProductInfoDto;
import com.fjhx.item.entity.product.dto.ProductInfoSelectDto;
import com.fjhx.item.entity.product.po.ProductInfo;
import com.fjhx.item.entity.product.vo.ProductInfoVo;
import com.fjhx.item.enums.ProductAvailableRecordType;
import com.ruoyi.common.core.service.BaseService;
import com.ruoyi.common.utils.wrapper.IWrapper;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;


/**
 * <p>
 * 产品库 服务类
 * </p>
 *
 * @author zlj
 * @since 2023-03-17
 */
public interface ProductInfoService extends BaseService<ProductInfo> {

    /**
     * 产品库分页
     */
    Page<ProductInfoVo> getPage(ProductInfoSelectDto dto);

    /**
     * 产品库新增
     */
    void add(ProductInfoDto productInfoDto);

    /**
     * 产品库编辑
     */
    void edit(ProductInfoDto productInfoDto);

    /**
     * 产品库明细
     */
    ProductInfoVo detail(Long id);

    /**
     * 产品库删除
     */
    void delete(Long id);


    void editAvailableQuantity(List<AvailableStockBo> inOutList, Long businessId, ProductAvailableRecordType businessType, Long companyId);

    /**
     * 根据产品IDS获取产品
     *
     * @param productIds
     * @return
     */
    List<ProductInfoVo> getListByProductIds(List<Long> productIds);

    /**
     * 根据产品类型获取产品
     *
     * @return
     */
    List<ProductInfoVo> getListByProductType(Integer productType, Integer definition, String productName, String productCode);

    /**
     * 产品统计（数据看板-产品分析页面）
     *
     * @param productInfoDto
     */
    Map<String, Object> productStatistics(ProductInfoDto productInfoDto);

    /**
     * 产品分布（数据看板-产品分析页面）
     *
     * @param productInfoDto
     */
    List<Map<String, Object>> productDistribution(ProductInfoDto productInfoDto);

    /**
     * 产品类型排行（数据看板-产品分析页面）
     *
     * @param productInfoDto
     */
    List<Map<String, Object>> productTypeRanking(ProductInfoSelectDto productInfoDto);

    /**
     * 产品排行（数据看板-产品分析页面）
     *
     * @param productInfoDto
     */
    Page<ProductInfoVo> productRanking(ProductInfoSelectDto productInfoDto);

    /**
     * 产品统计
     *
     * @return
     */
    Map<String, Object> statisticsProduct();

    /**
     * 产品库统计(根据产品库类型进行分类统计)
     */
    Map<String, Object> productInfoStatistics(ProductInfoSelectDto dto);

    /**
     * 产品分析-数据看板
     */
    Page<ProductAnalysisBo> getProductAnalysisPage(Page<Object> page, IWrapper<ProductInfo> wrapper);

    /**
     * 导出Excel
     */
    void excelExport(HttpServletResponse httpServletResponse, ProductInfoSelectDto dto);

    Page<ProductInfoVo> getProductByMaterialId(ProductInfoSelectDto dto);

    List<ProcessesBo> getProcessesByTechnologyId(Long technologyId);
}
