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.VeneerDecomposeCreateReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerDecomposeGoodsPageReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerDecomposeGoodsRespVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerDecomposeOrderPageReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerDecomposeOrderRespVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerDecomposePlateDataRespVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerDecomposePlatePageReqVO;

import java.util.List;

/**
 * 贴皮分解 Service。
 */
public interface VeneerDecomposeService {

    /**
     * 查询待贴皮分解订单分页列表。
     *
     * @param req 订单查询参数
     * @return 订单分页结果
     */
    PageResult<VeneerDecomposeOrderRespVO> getOrderPage(VeneerDecomposeOrderPageReqVO req);

    /**
     * 查询待贴皮分解材质分页列表。
     *
     * @param req 材质查询参数
     * @return 材质分页结果
     */
    PageResult<VeneerDecomposeGoodsRespVO> getGoodsPage(VeneerDecomposeGoodsPageReqVO req);

    /**
     * 按订单查询未贴皮分解板件列表。
     *
     * @param req 查询条件，必须包含订单 ID 列表
     * @return 去重后的板件及板件造型数据
     */
    VeneerDecomposePlateDataRespVO getOrderPlateList(VeneerDecomposePlatePageReqVO req);

    /**
     * 按板材查询未贴皮分解板件列表。
     *
     * @param req 查询条件，必须包含商品编码列表
     * @return 去重后的板件及板件造型数据
     */
    VeneerDecomposePlateDataRespVO getGoodsPlateList(VeneerDecomposePlatePageReqVO req);

    /**
     * 将原板件分解为 A 面和/或 B 面贴皮记录。
     *
     * @param req 分解参数
     */
    void decompose(VeneerDecomposeCreateReqVO req);

    /**
     * 根据原板件当前分解状态重新统计订单和订单板材的已分解板件数量。
     *
     * @param orderIds 订单ID列表
     * @param orderGoodsIds {@code order_goods} 主键列表
     */
    void refreshDecomposedPlateCount(List<Long> orderIds, List<Long> orderGoodsIds);
}
