package com.cf.imes.module.executor.dal.mysql.veneer;

import com.baomidou.mybatisplus.core.metadata.IPage;
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.VeneerDecomposePlatePageReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerDecomposePlateRespVO;
import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO;
import com.cf.imes.module.executor.dal.dataobject.veneer.VeneerDecomposedPlateCountDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 贴皮分解 Mapper。
 */
@Mapper
public interface VeneerDecomposeMapper {

    /**
     * 分页查询存在未完成贴皮分解板件的根订单ID。
     *
     * @param page 分页参数
     * @param req 订单查询条件
     * @param orderDateTime 完整订单日期时间范围
     * @return 根订单ID分页结果
     */
    IPage<Long> selectRootOrderIdList(@Param("page") IPage<VeneerDecomposeOrderRespVO> page,
                                      @Param("req") VeneerDecomposeOrderPageReqVO req,
                                      @Param("orderDateTime") LocalDateTime[] orderDateTime);

    /**
     * 根据当前页根订单ID查询根订单信息。
     *
     * @param page 分页参数
     * @param rootIds 根订单ID列表
     * @return 根订单分页结果
     */
    IPage<VeneerDecomposeOrderRespVO> selectOrderList(@Param("page") IPage<VeneerDecomposeOrderRespVO> page,
                                                       @Param("rootIds") List<Long> rootIds);

    /**
     * 查询当前页根订单下存在未分解板件的子订单。
     *
     * @param rootIds 根订单ID列表
     * @param req 订单查询条件
     * @param orderDateTime 完整订单日期时间范围
     * @return 子订单列表
     */
    List<VeneerDecomposeOrderRespVO> selectOrderChildList(
            @Param("rootIds") List<Long> rootIds,
            @Param("req") VeneerDecomposeOrderPageReqVO req,
            @Param("orderDateTime") LocalDateTime[] orderDateTime);

    /**
     * 分页查询存在未完成贴皮分解板件的材质。
     *
     * @param page 分页参数
     * @param req 材质查询条件
     * @return 材质分页结果
     */
    IPage<VeneerDecomposeGoodsRespVO> selectGoodsPage(@Param("page") IPage<VeneerDecomposeGoodsRespVO> page,
                                                       @Param("req") VeneerDecomposeGoodsPageReqVO req);

    /**
     * 按订单查询未贴皮分解板件原始列表。
     * 同一板件可能因多个加工组返回多条记录，由 Service 层按板件主键去重。
     *
     * @param req 查询条件
     * @return 板件原始列表
     */
    List<VeneerDecomposePlateRespVO> selectOrderPlateList(
            @Param("req") VeneerDecomposePlatePageReqVO req);

    /**
     * 按板材查询未贴皮分解板件原始列表。
     * 同一板件可能因多个加工组返回多条记录，由 Service 层按板件主键去重。
     *
     * @param req 查询条件
     * @return 板件原始列表
     */
    List<VeneerDecomposePlateRespVO> selectGoodsPlateList(
            @Param("req") VeneerDecomposePlatePageReqVO req);

    /**
     * 查询本次可分解的原板件。
     *
     * @param req 分解请求参数
     * @param plateNos 本批待查询的板件编号
     * @return 未分解原板件
     */
    List<PlateDO> selectUndecomposedPlateList(@Param("req") VeneerDecomposeCreateReqVO req,
                                              @Param("plateNos") List<String> plateNos);

    /**
     * 将指定原板件标记为已分解。
     *
     * @param plateIds 原板件ID列表
     * @return 更新行数
     */
    int updatePlateDecomposed(@Param("plateIds") List<Long> plateIds);

    /**
     * 按订单重新统计已分解贴皮板件数量。
     *
     * @param orderIds 订单ID列表
     * @return 订单及其已分解板件数量
     */
    List<VeneerDecomposedPlateCountDO> selectOrderDecomposedPlateCount(
            @Param("orderIds") List<Long> orderIds);

    /**
     * 按订单板材重新统计已分解贴皮板件数量。
     *
     * @param orderGoodsIds {@code order_goods} 主键列表
     * @return 订单板材及其已分解板件数量
     */
    List<VeneerDecomposedPlateCountDO> selectGoodsDecomposedPlateCount(
            @Param("orderGoodsIds") List<Long> orderGoodsIds);

}
