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

import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.module.executor.controller.admin.goods.vo.GoodsSaveReqVO;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderCadViewPlatePageReqVO;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrdersViewCadViewInfoRespVO;
import com.cf.imes.module.executor.controller.admin.plate.vo.*;
import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO;
import com.cf.imes.module.executor.dal.dataobject.plate.PlateGoodDO;

import jakarta.validation.Valid;
import java.util.List;
import java.util.Set;

/**
 * 订单板件 Service 接口
 *
 * @author 晨丰科技
 */
public interface PlateService {

    /**
     * 查询板件
     *
     * @param plateId
     * @return
     */
    PlateDO getPlate(Long plateId);

    /**
     * 根据短编号查询板件
     *
     * @param plateNo
     * @param orderIds
     * @return
     */
    PlateDO getPlateByNo(String plateNo, Long... orderIds);

    /**
     * 创建订单板件
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createPlate(@Valid PlateSaveReqVO createReqVO);

    /**
     * 更新订单板件
     *
     * @param updateReqVO 更新信息
     */
    void updatePlate(@Valid PlateSaveReqVO updateReqVO);

    /**
     * 删除订单板件
     *
     * @param plateIds 编号
     */
    void deletePlate(List<Long> plateIds,Long planId);


    /**
     * 获得订单板件分页
     *
     * @param pageReqVO 分页查询
     * @return 订单板件分页
     */
    PageResult<PlateDO> getPlatePage(PlatePageReqVO pageReqVO);

    PageResult<PlateGoodDO> getGoodsPlate(GoodsPlateFilterPageReqVO pageReqVO);

    /**
     * 查询订单未排单小板
     *
     * @param reqVO
     * @return
     */
    NoPlanPlateRespVO getOrdersNoPlanPlate(NoPlanPlatePageReqVO reqVO);


    /**
     * 批量导入小板
     *
     * @param importPlates 导入订单板材列表
     * @param orderId      订单Id
     * @return 导入结果
     */
    PlateImportRespVO importPlatesList(List<PlateSaveReqVO> importPlates, Long orderId);

    /**
     * @param ids: 待删除板件id集合
    * @return void
     */
    void deletePlates(Set<Long> ids);

    /**
     * 获得订单所有板材
     *
     * @param orderId 订单id
     * @return List<PlateDO>
     */
    List<PlateDO> getPlatesByOrderId(Long orderId);

    /**
     * @param pageReqVO:
     * @return PageResult<PlateDO>
     */
    PageResult<PlateRespVO> getPlatePageByTerms(PlateTermsPageReqVO pageReqVO);

    /**
     * @param createReqVOS
     * @return void
     */
    void updatePlateByRawGoodsId(List<GoodsSaveReqVO> createReqVOS);


    List<BodyPlateDetailVO> getPlateModelByPlateId(List<Long> bodyIds);

    List<InsertPlateRespVO> createNewPlate(List<OptimizationSavePlateReqVO> reqVO);

    /**
     * 获取柜体板件视图分页列表
     *
     * @param orderBodyPageRespVO
     * @return
     */
    PageResult<OrderViewPlatePageRespVO> getBodyViewPlatesPage(OrderCadViewPlatePageReqVO orderBodyPageRespVO);


    /**
     * 获取柜体配件视图分页列表
     *
     * @param orderBodyPageRespVO
     * @return
     */
    PageResult<OrderViewPartPageRespVO> getBodyViewPartsPage(OrderCadViewPlatePageReqVO orderBodyPageRespVO);


    /**
     * 根据板件id获取柜体下所有板件+配件cad视图所需信息
     *
     * @param orderBodyPageRespVO
     * @return
     */
    OrdersViewCadViewInfoRespVO getBodyViewCadInfo(OrderCadViewPlatePageReqVO orderBodyPageRespVO);

    /**
     * 根据板件id获取柜体下所有配件cad视图所需信息
     *
     * @param orderBodyPageRespVO
     * @return
     */
    OrdersViewCadViewInfoRespVO getBodyViewPartCadInfo(OrderCadViewPlatePageReqVO orderBodyPageRespVO);

    /**
     * 根据板编号获取板件信息
     *
     * @param plateNo
     * @return
     */
    OrderPlateWechatMiniProgramCadInfoRespVO getPlateInfoByPlateNo(String plateNo);

    /**
     * 根据板编号获取订单信息
     *
     * @param plateNo
     * @return
     */
    OrderWechatMiniProgramCadInfoRespVO getOrderInfoByPlateNo(String plateNo);

    /**
     * 根据板编号获取订单详情
     *
     * @param plateNo
     * @param reqVO
     * @return
     */
    OrdersViewCadViewInfoRespVO getOrderDetailsByPlateNo(String plateNo, OrderWechatMiniProgramDetailReqVO reqVO);
}