package com.sw.mes.yb.plan.service;

import com.sw.mes.core.base.BaseService;
import com.sw.mes.yb.plan.dto.BatchSchedulingDto;
import com.sw.mes.yb.plan.dto.ProductionOrderCountDto;
import com.sw.mes.yb.plan.dto.SchedulingInfoDto;
import com.sw.mes.yb.plan.entity.ProductionOrder;
import com.sw.mes.yb.plan.entity.ProductionSchedule;

import java.util.List;
import java.util.Map;

/**
 * @Author
 * @Description：
 * @Date:
 * @Modified By:
 */
public interface ProductionScheduleService extends BaseService<ProductionSchedule> {
    void batchScheduling(BatchSchedulingDto dto);

    Map<Long, ProductionOrderCountDto> getProductionScheduleData();

    // 自动排程
    void autoScheduling();

    List<SchedulingInfoDto> getSchedulingInfo();

    ProductionSchedule findTopByDeviceIdAndStatusOrderByIdDesc(Long equipmentId, Integer status);

	ProductionSchedule findTopByDeviceNoAndStatusOrderByIdDesc(String equipmentCode, List<Integer> status);

    /**
     * 根据设备和状态集合查询排程
     * @param equipmentCode
     * @param status
     * @return
     */
    List<ProductionSchedule> findByDeviceNoAndStatus(String equipmentCode, List<Integer> status);

    /**
     * 根据订单ID查询非取消状态的排程
     * @param orderId
     * @return
     */
    List<ProductionSchedule> findNormalListByOrderId(Long orderId);

	List<ProductionSchedule> findByStatus1(Integer status);

    ProductionSchedule findByLotNo(String lotNo);

    ProductionSchedule findByLotNoC(String lotNo);

    List<ProductionSchedule> findAllByLotNo(String lotNo);

    ProductionSchedule findDataByLotNo(String lotNo);
    ProductionSchedule findDataByDeviceNo(String deviceNo,List<Integer> status);

    List<ProductionSchedule> findByOderId(Long id);

    List<String> queryLotNoByDeviceNo(String deviceNo);

    String queryLotNosByDeviceNo(String deviceNo);

    List<String> findTop3LotNoByEquipmentCode(String equipmentCode);

    /**
     * 设备加工能力改变，排程同步调整
     */
    void updateMachineCapacity(Integer id);

    /**
     * 修改排查状态
     */
    void updateStatus(Long scheduleId, Integer status);

    /**
     * 根据设备ID及排查状态查询
     */
    ProductionSchedule findByDeviceAndStatusList(Long deviceId, List<Integer> statusList);

    /**
     * 根据设备号查询最新炉次号信息
     */
    ProductionSchedule findByEquipmentCode(String code);

    /**
     * 根据炉台号查询
     * @param furnaceCode 炉台号
     */
    ProductionSchedule findByDeviceNo(String furnaceCode);


    /**
     * 修改订单状态
     * @param order
     * @param state
     */
    void setOrderSchedule(ProductionOrder order, int state);

    ProductionSchedule findPlanProductionById(Long id);

    /**
     * 根据设备号查询最近关闭炉次号信息
     * @param code
     * @param status
     * @return
     */
    ProductionSchedule findCloseByEquipmentCode(String code, int status);
}
