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

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.cf.imes.framework.common.enums.PlanStatusEnum;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderStatisticsReqVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.OrderGoodsResp;
import com.cf.imes.module.executor.controller.admin.plan.vo.OrderPlanPlateStatisticsRespVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.OrderPlanStatisticsAreaRespVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.OrderPlanStatisticsCountRespVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.PlateOptimize;
import com.cf.imes.module.executor.dal.dataobject.plan.PlanDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

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

/**
 * 生产单开料排单 Mapper
 *
 * @author 晨丰科技
 */
@Mapper
public interface PlanMapper extends BaseMapperX<PlanDO> {


    IPage<PlanDO> selectPlanPageList(@Param("page") IPage page,@Param(Constants.WRAPPER) Wrapper<PlanDO> wrapper);


    List<PlateOptimize> selectPlateListByPlanId(@Param("planId") Long planId, @Param("organId") Long organId);




    default List<PlanDO> selectByMachineId(Long machineId,Long organId) {
        return selectList( new LambdaQueryWrapperX<PlanDO>()
                .eq(PlanDO::getDeleted,false)
                .eq(PlanDO::getOrganId,organId)
                .eq(PlanDO::getMachineId,machineId));
    }

    /**
     * 排单按时间分组统计数量
     *
     * @param reqVO
     * @return
     */
    List<OrderPlanStatisticsCountRespVO> selectPlanCountGroupByCreateTime(@Param("req") OrderStatisticsReqVO reqVO);

    /**
     * 排单按时间分组统计面积
     * @param reqVO
     * @return
     */
    List<OrderPlanStatisticsAreaRespVO> selectPlanAreaGroupByCreateTime(@Param("req") OrderStatisticsReqVO reqVO);


    List<PlanDO> selectPlanDataSource(@Param("filed") String filed,@Param("planId") Long planId,@Param("organId") Long organId);



    List<PlanDO> selectPlanIds(@Param("sort") Long sort,@Param("organId") Long organId);



    List<PlanDO> selectPlanIdsFalse(@Param("sort") Long sort,@Param("organId") Long organId);


    List<PlanDO> selectPlanStatus(@Param("planIds") List<Long> planIds,@Param("organId") Long organId);

    void updatePlanStatus(@Param("planId") Long planId,@Param("status") Integer status,@Param("organId")  Long organId);



    List<Long> selectPlanList(@Param("planIds") List<Long> planIds, @Param("organId") Long organId);




    default List<PlanDO> selectPlanListByData(String planData,Long organId) {
        return selectList( new LambdaQueryWrapperX<PlanDO>()
                .eq(PlanDO::getOrganId,organId)
                .eq(PlanDO::getDeleted,false)
                .eq(PlanDO::getCreateTime,planData));
    }


    List<PlanDO> selectPlanSortList(@Param("status") List<Integer> status,@Param("organId") Long organId);



    default List<PlanDO> selectProcessScheme(Long processId,Long organId) {
        return selectList( new LambdaQueryWrapperX<PlanDO>()
                .eq(PlanDO::getOrganId,organId)
                .eq(PlanDO::getDeleted,false)
                .in(PlanDO::getProcessId,processId)
                .select(PlanDO::getId));
    }


    PlanDO selectSortOnePlan(@Param("sort") Long sort, @Param("organId") Long organId);


    PlanDO selectLastPlan(@Param("sort") Long sort, @Param("organId") Long organId);


    default List<PlanDO> selectIsTopPlanList(Long organId) {
        return selectList( new LambdaQueryWrapperX<PlanDO>()
                .eq(PlanDO::getOrganId,organId)
                .eq(PlanDO::getDeleted,false)
                .eq(PlanDO::getIsTop,true)
                .in(PlanDO::getStatus, Arrays.asList(PlanStatusEnum.NOCUTTING.getStatus(),PlanStatusEnum.OPENING.getStatus()))
                .orderByAsc(PlanDO::getUpdateTime));
    }

    List<PlanDO> selectIsTopUpPlan(@Param("updateTime") LocalDateTime updateTime,@Param("organId") Long organId);


    List<PlanDO> selectIsTopDownPlan(@Param("updateTime") LocalDateTime updateTime,@Param("organId") Long organId);

    /**
     * 查询排单下的材质、颜色、品牌、厚度分组
     * @param planId
     * @param organId
     * @return
     */
    List<OrderGoodsResp> selectPlanGoodsList(@Param("planId") Long planId, @Param("organId") Long organId);

    /**
     * 统计涉及移除小板的排单下还存在的排单数量
     *
     * @param planIds
     * @param organId
     * @return
     */
    List<OrderPlanPlateStatisticsRespVO> countDeletePlanPlate(@Param("planIds") List<Long> planIds, @Param("orderIds") Set<Long> orderIds, @Param("organId") Long organId);

    /**
     * 查询排单下订单id的列表
     *
     * @param planIds
     * @param organId
     * @return
     */
    List<OrderPlanPlateStatisticsRespVO> selectPlanOrderIds(@Param("planIds") List<Long> planIds, @Param("orderIds") Set<Long> orderIds, @Param("organId") Long organId);

    /**
     * 查询排单+生产单下订单材质orderGoodsId
     *
     * @param planId
     * @param orderIds
     * @param organId
     * @return
     */
    List<Long> selectPlanOrderGoodsId(@Param("planId") Long planId, @Param("orderIds") List<Long> orderIds, @Param("organId") Long organId);
}