package com.cf.imes.module.executor.service.veneer;

import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanAddPlateReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanCreateReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanPageReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanPageRespVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanPlateRespVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanProduceReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanRemovePlateReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanSortReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanSortRespVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanUpdateReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanWithdrawProduceReqVO;

import java.util.List;

/**
 * 贴皮排单 Service。
 */
public interface VeneerPlanService {

    /**
     * 按前端提交的贴皮商品编号分组批量创建贴皮排单，每个分组生成一个排单。
     *
     * @param req 创建贴皮排单参数
     */
    void createPlan(VeneerPlanCreateReqVO req);

    /**
     * 更新未进入开料阶段的贴皮排单加工方案。
     *
     * @param req 排单ID及加工方案
     */
    void updatePlan(VeneerPlanUpdateReqVO req);

    /**
     * 将贴皮排单投入生产。
     *
     * @param req 待投入生产的排单ID
     */
    void producePlan(VeneerPlanProduceReqVO req);

    /**
     * 撤回贴皮排单的投入生产状态。
     *
     * @param req 待撤回生产的排单ID
     */
    void withdrawProduce(VeneerPlanWithdrawProduceReqVO req);

    /**
     * 向未进入开料阶段的贴皮排单新增贴皮记录。
     *
     * @param req 目标排单及待加入贴皮记录
     */
    void addPlanPlate(VeneerPlanAddPlateReqVO req);

    /**
     * 从未进入开料阶段的贴皮排单移除贴皮记录。
     *
     * @param req 目标排单及待移除贴皮记录
     */
    void removePlanPlate(VeneerPlanRemovePlateReqVO req);

    /**
     * 批量删除未进入开料阶段的贴皮排单，并将排单内贴皮恢复为待排单状态。
     *
     * @param planIds 贴皮排单ID列表
     */
    void deletePlan(List<Long> planIds);

    /**
     * 分页查询已创建的贴皮排单。
     *
     * @param req 分页及筛选条件
     * @return 贴皮排单分页结果
     */
    PageResult<VeneerPlanPageRespVO> getPlanPage(VeneerPlanPageReqVO req);

    /**
     * 查询指定贴皮排单下的全部贴皮明细。
     *
     * @param planId 贴皮排单ID
     * @return 排单贴皮明细列表
     */
    List<VeneerPlanPlateRespVO> getPlanPlateList(Long planId);

    /**
     * 查询未完成开料的贴皮排单优先级列表。
     *
     * @return 贴皮排单优先级列表
     */
    List<VeneerPlanSortRespVO> getPlanSortPage();

    /**
     * 批量设置未完成开料贴皮排单的优先级。
     *
     * @param req 排单ID及排序值列表
     */
    void setPlanSort(List<VeneerPlanSortReqVO> req);
}
