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

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.module.mes.controller.admin.feedingrecord.vo.FeedingRecordDetailRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.feedingrecord.vo.FeedingRecordPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.feedingrecord.vo.FeedingRecordRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.feedingrecord.vo.FeedingRecordSaveReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.itemrequisition.vo.ItemRequisitionDetailRespVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.feedingplan.FeedingRecordPlanDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.feedingrecord.FeedingRecordDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.feedingrecord.FeedingRecordDetailDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO;

import javax.validation.Valid;
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 FeedingRecordService {

    /**
     * 创建投料记录
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createFeedingRecord(@Valid FeedingRecordSaveReqVO createReqVO);

    /**
     * 更新投料记录
     *
     * @param updateReqVO 更新信息
     */
    void updateFeedingRecord(@Valid FeedingRecordSaveReqVO updateReqVO);

    /**
     * 删除投料记录
     *
     * @param id 编号
     */
    void deleteFeedingRecord(Long id);

    /**
     * 获得投料记录
     *
     * @param id 编号
     * @return 投料记录
     */
    FeedingRecordDO getFeedingRecord(Long id);

    /**
     * 获得投料记录分页
     *
     * @param pageReqVO 分页查询
     * @return 投料记录分页
     */
    PageResult<FeedingRecordRespVO> getFeedingRecordPage(FeedingRecordPageReqVO pageReqVO);
    List<FeedingRecordRespVO> buildList(List<FeedingRecordDO> list);
    // ==================== 子表（投料记录明细） ====================

    /**
     * 获得投料记录明细列表
     *
     * @param recordId 记录id
     * @return 投料记录明细列表
     */
    List<FeedingRecordDetailDO> getFeedingRecordDetailListByRecordId(Long recordId);

    List<FeedingRecordDetailRespVO> buildVOList(List<FeedingRecordDetailDO> list);

    List<FeedingRecordDO> getFeedingRecordList(Collection<Long> ids);

    default Map<Long, FeedingRecordDO> getRecordMap(Collection<Long> ids) {
        if (ids.isEmpty()) return new HashMap<>();
        return convertMap(getFeedingRecordList(ids), FeedingRecordDO::getId);
    }

    //提交、反提交投料记录单
    Map<String, FeedingRecordPlanDO> updateStatus(FeedingRecordDO recordDO, List<FeedingRecordDetailDO> detailDOList, String status, Long userId
            , List<PlanDO> planDOList, Map<Long, List<ItemRequisitionDetailRespVO>> planItemListMap,
                                                  Map<String, ItemRequisitionDetailRespVO> planItemMap);

    //提交干废品和湿废品投料记录，分配给计划
    void dealOtherRecord(FeedingRecordDO recordDO, String status, Long userId, List<PlanDO> planDOList);

    void dealWithOnPlan(PlanDO plan, List<FeedingRecordDetailDO> detailDOList, Map<String, ItemRequisitionDetailRespVO> planItemMap,
                        LoginUser user,FeedingRecordDO recordDO);


}