package cn.iocoder.yudao.module.mes.service.plan;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.itemrequisition.vo.ItemRequisitionSaveReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.PlanPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.PlanRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.PlanSaveReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.PlanStatusUpdateVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO;
import cn.iocoder.yudao.module.mes.service.itemrequisition.entity.ItemRequisitionAndStock;

import javax.validation.Valid;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;

/**
 * 生产计划 Service 接口
 *
 * @author 内蒙必硕
 */
public interface PlanService {

    /**
     * 创建生产计划
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createPlan(@Valid PlanSaveReqVO createReqVO);

    /**
     * 更新生产计划
     *
     * @param updateReqVO 更新信息
     */
    void updatePlan(@Valid PlanSaveReqVO updateReqVO);

    /**
     * 删除生产计划
     *
     * @param id 编号
     */
    void deletePlan(Long id);

    /**
     * 获得生产计划
     *
     * @param id 编号
     * @return 生产计划
     */
    PlanDO getPlan(Long id);

    /**
     * 获得生产计划分页
     *
     * @param pageReqVO 分页查询
     * @return 生产计划分页
     */
    PageResult<PlanRespVO> getPlanPage(PlanPageReqVO pageReqVO);

    /**
     * 查询按日期排序最后一个未完成(已经下达)的计划
     **/
    PlanDO selectLastOne();

    List<PlanRespVO> buildVOList(List<PlanDO> list);
    List<PlanDO> buildProgress(List<PlanDO> list);

    Boolean saveBatchPlan(List<PlanDO> planDOList);

    Boolean arrangePlan(ItemRequisitionSaveReqVO saveReqVO, PlanDO planDO, List<ItemRequisitionAndStock> list);

    Boolean arrangePlanNum(ItemRequisitionSaveReqVO saveReqVO, PlanDO planDO);

    List<PlanDO> getPlanList(Collection<Long> ids);

    default Map<Long, PlanDO> getPlanMap(Collection<Long> ids) {
        if (ids.isEmpty()) return new HashMap<>();
        return convertMap(getPlanList(ids), PlanDO::getId);
    }

    List<PlanDO> getPlanByStatus(List<Integer> statusList);
    List<PlanDO> getPlanByStatusAndProduct(List<Integer> statusList, Long productId);
    List<PlanDO> getPlanByStatusAndPipeline(List<Integer> statusList, String pipeline);

    void updateStatus( Long id,Integer status);

    /**获取当前某些状态的计划的产品列表**/
    List<ErpProductRespVO> getProductByPlanStatus(List<Integer> statusList);

    List<PlanDO> getPlanBy(PlanPageReqVO pageReqVO);

    void createPlanStockIn(PlanStatusUpdateVO statusUpdateVO,PlanDO planDO);

    /**
     * 获得生产计划分页
     *
     * @param pageReqVO 分页查询
     * @return 生产计划分页
     */
    PlanRespVO getPlanRespVO(PlanDO planDO);

    List<PlanDO> getPlanCapacity(List<Integer> statusList, LocalDateTime startTime, LocalDateTime  endTime);

    List<Map<String, Object>> getLastSevenDaysCompletedCount();
}