package cn.estsh.i3plus.ext.mes.pcn.api.base;

import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.*;
import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import io.swagger.annotations.ApiOperation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @author yumingxing
 * @version 1.0
 * @date 2021/1/13 9:27
 **/
public interface ISxWorkOrderExtService {

    /**
     * 手动创建生成生产工单
     *
     * @param workOrderDto 生产工单
     */
    void insertManualGenerate(GenerateWorkOrderDto workOrderDto);

    /**
     * excel导入生成生产工单
     *
     * @param excelWorkOrderDtoList 上次的文件
     */
    void importGenerate(List<ExcelWorkOrderDto> excelWorkOrderDtoList);

    /**
     * 调整工作顺序
     *
     * @param generateWorkOrderDto 生成工作单dto
     */
    void adjustWorkOrder(GenerateWorkOrderDto generateWorkOrderDto);


    /**
     * 生产工单 分页查询
     *
     * @param workOrderQueryDto 查询参数
     * @param pager        分页参数
     * @return 生产工单 分页数据
     */
    ListPager<WorkOrderPageVo> getListPageByCondition(WorkOrderQueryDto workOrderQueryDto, Pager pager);


    /**
     * 停止工作订单
     *
     * @param orderNo 订单编号
     */
    void stopWorkOrder(String orderNo);

    /**
     * 启动工单
     *
     * @param orderNo 订单编号
     */
    void startWorkOrder(String orderNo);

    /**
     * 关闭工单
     *
     * @param orderNo 订单没有
     */
    void closeWorkOrder(String orderNo);

    /**
     * 发布工作指令
     *
     * @param orderNo 订单编号
     */
    void releaseWorkOrder(String orderNo);

    /**
     * 更新seq
     *
     * @param workOrderSeq 工作订单seq
     */
    void updateSeq(WorkOrderSeq workOrderSeq);


    /**
     * 生产工单状态批量调整
     *
     * @param workOrderStatus 状态
     * @param orderNoList     工单号
     */
    void updateWorkOrderStatus(Integer workOrderStatus, List<String> orderNoList);

    GenerateWorkOrderDto getMesWorkOrderDetail(String orderNo);

    List<MesWorkOrderExt> findMesWorkOrderBySeqAsc(MesWorkOrder mesWorkOrder);


    /**
     * 根据产线工单信息，更新工单的计划开始时间，计划结束时间与顺序
     *
     * @param mesWorkOrderList 工单集合
     */
    @ApiOperation("根据产线工单信息，更新工单的计划开始时间，计划结束时间与顺序")
    void updateSortByMesWorkOrder(List<MesWorkOrderExt> mesWorkOrderList);

    /**
     * 根据工单号获取工单信息
     * @param organizeCode
     * @param orderNo
     * @return
     */
    @ApiOperation(value = "根据工单号获取工单信息", notes = "根据工单号获取工单信息")
    MesWorkOrderExt getWorkOrderExtByOrderNo(String organizeCode, String orderNo);

    /**
     * 根据工单号获取工单信息
     * @param organizeCode
     * @param orderNo
     * @return
     */
    @ApiOperation(value = "根据工单号获取工单信息", notes = "根据工单号获取工单信息")
    MesWorkOrder getWorkOrderByOrderNo(String organizeCode, String orderNo);

    /**
     * 根据生产线及状态查询工单集合(seq正序)
     * @param organizeCode
     * @param workCenterCode
     * @param workOrderStatus
     * @return
     */
    @ApiOperation(value = "根据生产线及状态查询工单集合(seq正序)", notes = "根据生产线及状态查询工单集合(seq正序)")
    List<MesWorkOrderExt> getWorkOrderListByCenterAndStatus(String organizeCode, String workCenterCode, Integer workOrderStatus);

    /**
     * 根据生产线及状态查询工单集合(计划开始时间倒序)
     * @param organizeCode
     * @param workCenterCode
     * @param workOrderStatus
     * @return
     */
    @ApiOperation(value = "根据生产线及状态查询工单集合(计划开始时间倒序)", notes = "根据生产线及状态查询工单集合(计划开始时间倒序)")
    List<MesWorkOrderExt> getWorkOrderListByCenterAndStatusOrderByStartTime(String organizeCode, String workCenterCode, Integer workOrderStatus);

    /**
     * 修改工单信息的条码生成状态
     * @param workOrder 工单信息
     * @param userName 操作人
     * @param snCreateStatus 条码生成状态
     */
    @ApiOperation(value = "修改工单信息的条码生成状态", notes = "修改工单信息的条码生成状态")
    void saveSnCreateStatus(MesWorkOrderExt workOrder, String userName, Integer snCreateStatus);

    /**
     * 修改工单的条码生成状态
     * @param workOrder 工单信息
     * @param userInfo 操作人
     * @param snCreateStatus 条码生成状态
     */
    @ApiOperation(value = "修改工单的条码生成状态", notes = "修改工单的条码生成状态")
    @Transactional(propagation = Propagation.REQUIRES_NEW, noRollbackFor = {ImppBusiException.class, Exception.class})
    void saveSnCreateStatusNewRequires(MesWorkOrderExt workOrder, String userInfo, Integer snCreateStatus);

    /**
     * 开窗生产工单分页查询
     * @param workOrderQueryDto 查询条件
     * @param pager  分页条件
     * @return 工单分页信息
     */
    @ApiOperation(value = "开窗生产工单分页查询", notes = "开窗生产工单分页查询")
    ListPager queryWindowWorkOrderExtListPage(WorkOrderQueryDto workOrderQueryDto, Pager pager);

    /**
     * BU-QMS开窗生产工单分页查询
     * @param workOrderQueryDto 查询条件
     * @param pager  分页条件
     * @return 工单分页信息
     */
    @ApiOperation(value = "BU-QMS开窗生产工单分页查询", notes = "开窗生产工单分页查询")
    ListPager queryBuWindowWorkOrderExtListPage(WorkOrderQueryDto workOrderQueryDto, Pager pager);

    /**
     * 根据生产线获取首个启动状态的返工工单信息
     * @param organizeCode 组织代码
     * @param workCenterCode 生产线代码
     * @return 首个启动状态的返工工单信息
     */
    @ApiOperation(value = "根据生产线获取首个启动工单信息", notes = "根据生产线获取首个启动工单信息")
    MesWorkOrder getFirstOpenedRemadeWorkOrderByWorkCenterCode(String organizeCode, String workCenterCode);

    /**
     * 包装条码解绑
     * @param packageSn 包装条码
     */
    @ApiOperation(value = "包装条码解绑", notes = "包装条码解绑")
    void packageSnUnbind(String packageSn, String organizeCode, String userName);

    /**
     * 包装条码解绑
     * @param workOrderNoList 工单号集合
     * @param organizeCode 组织代码
     */
    @ApiOperation(value = "根据工单号集合获取工单信息", notes = "根据工单号集合获取工单信息")
    List<MesWorkOrder> queryMesWorkOrderByOrderNoList(List<String> workOrderNoList, String organizeCode);
}
