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

import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.OrderDetailComponentListReqVO;
import com.cf.imes.module.executor.dal.dataobject.ordercomponent.OrderComponentDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Set;

/**
 * 部件 Mapper
 *
 * @author Gqr
 * @since 2026/1/27 14:08
 */
@Mapper
public interface OrderComponentMapper extends BaseMapperX<OrderComponentDO> {
    /**
     * 查询订单下部件id、level、name列表，按层级倒序、id正序
     * @param orderIds
     * @return
     */
    List<OrderComponentDO> selectAllForFlatList(@Param("orderIds") List<Long> orderIds,
                                                @Param("processStatus") List<Integer> processStatus);

    /**
     * 订单详情部件列表查询
     *
     * @param reqVO
     * @return
     */
    Set<Long> getOrderDetailComponentIds(@Param("reqVO") OrderDetailComponentListReqVO reqVO);

    /**
     * 查询id列表中每个节点上同一棵树的所有父级
     *
     * @param ids
     * @param deleted
     * @return
     */
    List<OrderComponentDO> getTopComponentListIn(@Param("ids") List<Long> ids, boolean deleted);

    /**
     * 查询订单顶级部件，关联order_item，如果被移除了就不展示了
     *
     * @param orderIds
     * @param name
     * @return
     */
    List<OrderComponentDO> getOrderTopComponentList(@Param("orderIds")List<Long> orderIds, @Param("name") String name);

    /**
     * 查询订单顶级部件，关联order_item，如果被移除了就不展示了
     *
     * @param orderIds
     * @param processStatus
     * @return
     */
    List<OrderComponentDO> getOrderTopComponentListByAssemblyStatus(@Param("orderIds") List<Long> orderIds,
                                                                    @Param("assemblyStatusList") List<Integer> processStatus);

    /**
     * 查询符合节点条件的顶级部件 ID。
     *
     * @param orderIds 订单 ID 列表
     * @param componentIds 部件 ID 列表
     * @param componentId 部件 ID
     * @param name 部件名称
     * @param processStatus 节点加工状态（仅已加工、未加工）
     * @return 顶级部件 ID 列表
     */
    List<Long> getTopIdsByComponentAndProcessStatus(@Param("orderIds") List<Long> orderIds,
                                                     @Param("componentIds") Set<Long> componentIds,
                                                     @Param("componentId") Long componentId,
                                                     @Param("name") String name,
                                                     @Param("processStatus") List<Integer> processStatus);

    /**
     * 按部件 ID 或名称查询命中的部件节点，并计算装配状态。
     */
    List<OrderComponentDO> getComponentsByIdOrNameAndProcessStatus(@Param("orderIds") List<Long> orderIds,
                                                                     @Param("componentIds") Set<Long> componentIds,
                                                                     @Param("componentId") Long componentId,
                                                                     @Param("name") String name,
                                                                     @Param("processStatus") List<Integer> processStatus);

    /**
     * 查询订单topid下的所有大于level层级的部件列表
     * @param orderId
     * @param topId
     * @param level
     * @return
     */
    List<OrderComponentDO> getComponentListOnTopLevel(@Param("orderId") Long orderId,
                                                      @Param("topId") Long topId,
                                                      @Param("level") int level,
                                                      @Param("deleted") boolean deleted);

    /**
     * 查询是否有部件板件在排单中
     *
     * @param componentIds
     * @return
     */
    boolean selectOrderComponentPlateInPlan(@Param("componentIds") List<Long> componentIds);

    /**
     * 根据id查询，忽略逻辑删除
     *
     * @param id
     * @return
     */
    OrderComponentDO selectByIdIgnoreDeleted(@Param("id") Long id);

    /**
     * 更新部件删除状态
     *
     * @param componentIds
     */
    void updateOrderComponentsDeletedStatus(@Param("orderId") Long orderId, @Param("componentIds") List<Long> componentIds, @Param("delete") boolean delete);

    /**
     * 物理删除订单
     *
     * @return
     */
    int physicalDeleteByOrderIds(@Param("ids") List<Long> id);
}
