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

import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesPackageExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesPartExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.ProduceSnExtModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.SxPrintTemplateModel;
import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
import io.swagger.annotations.ApiOperation;

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

/**
 * @Author: wangjie
 * @CreateDate: 2021/01/19 15:06 下午
 * @Description:
 **/
public interface IProduceSnExtService {

    /**
     * 根据工单号获取条码集合
     * @param organizeCode 组织代码
     * @param workOrderNo 工单号
     * @return 条码集合
     */
    @ApiOperation(value = "根据工单号获取条码集合", notes = "根据工单号获取条码集合")
    List<MesProduceSnExt> getProduceSnExtListByOrderNo(String organizeCode, String workOrderNo);

    /**
     * 根据工单号获取条码集合
     * @param organizeCode 组织代码
     * @param workOrderNo 工单号
     * @return 条码集合
     */
    @ApiOperation(value = "根据工单号获取条码集合", notes = "根据工单号获取条码集合")
    List<MesProduceSnExt> getProduceSnExtListByOrderNoAndSnType(String organizeCode, String workOrderNo,Integer snType);

    /**
     * 根据工单号获取任意一个条码
     * @param organizeCode 组织代码
     * @param workOrderNo 工单号
     * @return 条码集合
     */
    @ApiOperation(value = "根据工单号获取任意一个条码", notes = "根据工单号获取任意一个条码")
    MesProduceSnExt getProduceSnExtByOrderNo(String organizeCode, String workOrderNo);

    /**
     * 根据最终工单号获取条码集合
     * @param organizeCode 组织代码
     * @param workOrderNo 工单号
     * @return 条码集合
     */
    @ApiOperation(value = "根据最终工单号获取条码集合", notes = "根据最终工单号获取条码集合")
    List<MesProduceSnExt> getProduceSnExtListByLastOrderNo(String organizeCode, String workOrderNo);

    /**
     * 按条件分页查询工单条码信息
     * @param produceSnExt 查询条件
     * @param pager 分页条件
     * @return 工单条码集合
     */
    @ApiOperation(value = "按条件分页查询工单条码信息", notes = "按条件分页查询工单条码信息")
    ListPager<MesProduceSnExt> queryProduceSnExtByPager(MesProduceSnExt produceSnExt, Pager pager);

    /**
     * 按条件分页查询工单条码信息,区分工单类型
     * @param produceSnExtModel
     * @param pager
     * @return
     */
    @ApiOperation(value = "按条件分页查询工单条码信息,区分工单类型", notes = "按条件分页查询工单条码信息,区分工单类型")
    ListPager<ProduceSnExtModel> queryProduceSnExtByWorkOrderTypeByPager(ProduceSnExtModel produceSnExtModel, Pager pager);

    /**
     * 批量生成工单的条码
     * @param flag true=自动/false=手动
     * @param param 参数
     */
    @ApiOperation(value = "批量生成工单的条码", notes = "批量生成工单的条码")
    void doWorkOrderCreateSn(Boolean flag, Object... param);

    /**
     * 手动打印条码
     * @param model 打印模板信息
     * @return 打印模板及数据
     */
    @ApiOperation(value = "手动打印条码", notes = "手动打印条码")
    List<Map<String, Object>> doWorkOrderPrintSn(SxPrintTemplateModel model);

    /**
     * 获取产品条码集合
     * @param model 打印数据
     * @param workOrderExt 工单信息
     * @return 产品条码集合
     */
    @ApiOperation(value = "获取产品条码集合", notes = "获取产品条码集合")
    List<MesProduceSnExt> getSnListByOrderNo(SxPrintTemplateModel model, MesWorkOrderExt workOrderExt);

    /**
     * 获取产品条码集合
     * @param model 打印数据
     * @return 产品条码集合
     */
    @ApiOperation(value = "获取产品条码集合", notes = "获取产品条码集合")
    List<MesProduceSnExt> getSnListByIdList(SxPrintTemplateModel model);

    /**
     * 封装打印对象
     * @param organizeCode 组织代码
     * @param produceSnExtList 产品条码集合
     * @param templateCode 打印模板代码
     * @param partExt 物料信息
     * @param snPrintTimes 条码打印张数
     * @param printType 打印类型
     * @return 打印对象
     */
    @ApiOperation(value = "封装打印对象", notes = "封装打印对象")
    SxPrintTemplateModel packSxPrintTemplateModel(String organizeCode, List<MesProduceSnExt> produceSnExtList, String templateCode, MesPartExt partExt, MesWorkOrderExt order, Integer snPrintTimes, Integer printType);

    /**
     * 根据产品条码获取条码信息
     * @param organizeCode 组织代码
     * @param serialNumber 产品条码
     * @return 条码信息
     */
    @ApiOperation(value = "根据产品条码获取条码信息", notes = "根据产品条码获取条码信息")
    MesProduceSnExt getProduceSnExtBySn(String organizeCode, String serialNumber);

    /**
     * 根据产品条码获取条码信息
     * @param organizeCode 组织代码
     * @param productSn 产品条码
     * @return 条码信息
     */
    @ApiOperation(value = "根据产品条码获取条码信息", notes = "根据产品条码获取条码信息")
    MesProduceSnExt getProduceSnExtByProductSn(String organizeCode, String productSn);

    /**
     * 根据产品条码获取条码信息
     * @param organizeCode 组织代码
     * @param serialNumber 产品条码
     * @param workOrderNo 工单号
     * @return 条码信息
     */
    @ApiOperation(value = "根据产品条码获取条码信息", notes = "根据产品条码获取条码信息")
    MesProduceSnExt getProduceSnExtBySnAndOrderNo(String organizeCode, String serialNumber, String workOrderNo);

    /**
     * 设置条码产线 工位 工序 下一道工序
     *
     * @param produceSnExt   条码信息
     * @param organizeCode   组织代码
     * @param workCenterCode 产线代码
     * @param workCellCode   工位代码
     */
    @ApiOperation(value = "设置条码产线 工位 工序 下一道工序", notes = "设置条码产线 工位 工序 下一道工序")
    void packSnExtProcess(MesProduceSnExt produceSnExt, String organizeCode, String workCenterCode, String workCellCode);

    /**
     * @Description: 手动生成包装条码
     * @Param [id, organizeCode, userInfo]
     * @return void
     * @Date 2021/5/21 13:54
     **/
    @ApiOperation(value = "手动生成包装条码", notes = "手动生成包装条码")
    void doWorkOrderHandCreatePackage(Long id, String organizeCode, String userInfo);

   /**
    * @Description: 进行弹框二次提示“包装数量为***，可产生N个包装条码，&&&“
    * @Param [id, organizeCode, userInfo]
    * @return java.lang.String
    * @Date 2021/5/27 14:52
    **/
    @ApiOperation(value = "进行弹框二次提示“包装数量为***，可产生N个包装条码，&&&“", notes = "进行弹框二次提示“包装数量为***，可产生N个包装条码，&&&“")
    String getWorkOrderCreatePackageQty(Long id, String organizeCode, String userInfo);

    /**
     * @Description: 按条件分页查询工单包装信息
     * @Param [pack, pager]
     * @return cn.estsh.i3plus.pojo.base.bean.ListPager
     * @Date 2021/5/24 15:24
     **/
    @ApiOperation(value = "按条件分页查询工单包装信息", notes = "按条件分页查询工单包装信息")
    ListPager queryPackageByPager(MesPackageExt pack, Pager pager) ;
    
    /**
     * @Description: 手动打印包装条码
     * @Param [model]
     * @return java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     * @Date 2021/5/24 17:09
     **/
    @ApiOperation(value = "手动打印包装条码", notes = "手动打印包装条码")
    List<Map<String, Object>> doWorkOrderPrintPackageNo(SxPrintTemplateModel model);


    /**
     * @Description: 获取包装条码集合
     * @Param [model, workOrderExt]
     * @return 包装条码集合
     * @Date 2021/5/24 17:14
     **/
    @ApiOperation(value = "获取包装条码集合", notes = "获取包装条码集合")
    List<MesPackageExt> getPackageListByOrderNo(SxPrintTemplateModel model, MesWorkOrderExt workOrderExt);

    /**
     * @Description: 获取包装条码集合
     * @Param [model]
     * @return 包装条码集合
     * @Date 2021/5/24 19:16
     **/
    @ApiOperation(value = "获取包装条码集合", notes = "获取包装条码集合")
    List<MesPackageExt> getPackageNoListByIdList(SxPrintTemplateModel model);

    /**
     * @Description: 封装打印对象
     * @Param [organizeCode, packageList, templateCode]
     * @return cn.estsh.i3plus.ext.mes.pcn.pojo.model.SxPrintTemplateModel
     * @Date 2021/5/24 19:34
     **/
    @ApiOperation(value = "封装打印对象", notes = "封装打印对象")
    SxPrintTemplateModel packSxPackagePrintTemplateModel(String organizeCode, List<MesPackageExt> packageList, String templateCode, MesPartExt partExt, Integer packNoPrintTimes, Integer printType);

    /**
     * 本体条码解绑
     * @param organizeCode 工厂代码
     * @param workOrderNo 工单号
     * @return
     */
    @ApiOperation(value = "本体条码解绑", notes = "本体条码解绑")
    Boolean checkWorkOrderUnBindSnIsValid(String organizeCode ,String workOrderNo);

    /**
     * 按条码分页查询条码状态为创建、在制的本体条码
     * @param organizeCode 工厂代码
     * @param workOrderNo 工单号
     * @return
     */
    @ApiOperation(value = "按条码分页查询条码状态为创建、在制的本体条码", notes = "按条码分页查询条码状态为创建、在制的本体条码")
    ListPager<MesProduceSnExt> queryProduceSnList(String organizeCode ,String workOrderNo, Pager pager);

    /**
     * 本体条码解绑
     * @param organizeCode 工厂代码
     * @param modifyUser 修改人
     * @param serialNumber 产品条码
     * @param keyPiecesIsBindFlag 关键件绑定标志
     * @return
     */
    @ApiOperation(value = "本体条码解绑", notes = "本体条码解绑")
    Boolean workOrderUnBindSn(String organizeCode, String modifyUser, String workOrderN, String serialNumber, Boolean keyPiecesIsBindFlag);

    /**
     * 只分页查询条码状态为创建和在制的条码
     * @param produceSnExt 条码信息
     * @param pager 分页
     * @return
     */
    ListPager<MesProduceSnExt> queryProduceSnExtOnlyCreateAndProcessByPager(MesProduceSnExt produceSnExt, Pager pager);

    /**
     * 根据产品条码获取条码信息
     * @param organizeCode 组织代码
     * @param serialNumber 产品条码
     * @return 条码信息
     */
    @ApiOperation(value = "根据产品条码获取无效状态的条码信息", notes = "根据产品条码获取条码信息")
    MesProduceSnExt getInvalidProduceSnExtBySn(String organizeCode, String serialNumber);


    /**
     * 新增条码信息
     * @param produceSnExt 条码信息
     * @return 条码信息
     */
    @ApiOperation(value = "新增条码信息", notes = "新增条码信息")
    MesProduceSnExt insertProduceSnExt(MesProduceSnExt produceSnExt);
}
