package com.sunda.spmsoversea.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.sunda.spmscommon.ResponseResult;
import com.sunda.spmsoversea.dto.OverseaDeliveryNoteCompleteDTO;
import com.sunda.spmsoversea.dto.OverseaDeliveryNoteItemDTO;
import com.sunda.spmsoversea.dto.OverseaDeliveryNoteOaDTO;
import com.sunda.spmsoversea.dto.OverseaDeliveryNotePageDTO;
import com.sunda.spmsoversea.entity.OverseaDeliveryNote;
import com.sunda.spmsoversea.entity.OverseaDeliveryNoteDtl;
import com.sunda.spmsuser.entity.SpmsUser;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 海外仓交货单表 服务类
 * </p>
 *
 * @author Wayne
 * @since 2021-10-22
 */
public interface IOverseaDeliveryNoteService extends IService<OverseaDeliveryNote> {

    /** 检查海外收货交货单关联信息是否能被拆分入库任务 */
    ResponseResult checkOverseaDeliveryNote(String sapDeliveryNote);

    /** 获取交货单表头分页列表 */
    IPage getOverseaDeliveryNote(OverseaDeliveryNotePageDTO overseaDeliveryNotePageDTO);

    /** 获取交货单表头分页列表，PDA多状态查询 */
    IPage getOverseaDeliveryNotePda(OverseaDeliveryNotePageDTO overseaDeliveryNotePageDTO);

    /** 根据交货单号获取一条交货单表头信息——仅交货单信息 */
    OverseaDeliveryNote getOverseaDn(String sapDeliveryNote);

    /** 根据交货单号获取一条交货单表头信息——含装箱单信息 */
    Map<String, Object> getOverseaDnHead(String sapDeliveryNote);

    /** 根据交货单号获取交货单物料明细信息 
     * @param materialNo */
    List<Map<String, Object>> getOverseaDeliveryNoteItem(String sapDeliveryNote, String materialNo);

    /** 根据交货单号获取交货单箱码及箱码明细行号信息 */
    List<Map<String, Object>> getOverseaDeliveryNoteBox(String sapDeliveryNote);

    /** 根据交货单号、交货单行号获取一行明细数据 */
    OverseaDeliveryNoteDtl getDnDtl(String sapDeliveryNote, String sapDeliveryNoteItem);

    /**
     * 根据交货单号 sapDeliveryNote 查询交货单每一行物料实收、多收、少收数量。
     * @param sapDeliveryNote
     * @return
     */
    List<Map<String, Object>> getOverseaDnOverOrUnderCharged(String sapDeliveryNote);

    /**
     * 海外收货任务提交OA。
     * @param spmsUser
     * @return
     */
    ResponseResult overseaDeliveryNoteToOa(OverseaDeliveryNoteOaDTO overseaDeliveryNoteOaDTO, SpmsUser spmsUser,boolean newOa) throws Exception ;

    /**
     * 海外收货任务入库完成。状态变化：0-0; 0-2; 1-1; 1-2;
     * @param overseaDeliveryNoteCompleteDTO
     * @return
     */
    ResponseResult overseaWhsInCompleted(OverseaDeliveryNoteCompleteDTO overseaDeliveryNoteCompleteDTO, String userId)throws Exception ;

    /**
     * 海外收货任务提交SAP。
     * @param userId
     * @return
     */
    ResponseResult overseaDeliveryNoteToSap(String sapDeliveryNote, String postingDate, Integer dataVersion, String costCenter, String userId)throws Exception ;

    /***
     * 交货单SAP损益撤销操作。交货单撤回到状态1收货中。
     * 1-0; 无有效入库任务才能退回到待到货；更新状态、删除实收工厂、实收仓库、实际到货日期等字段；
     * 2-1; 更新交货单状态；
     * 8-1; 从SAP撤回少收凭证，更新交货单状态、删除少收凭证等信息；有少收凭证时才需要填写撤销过账日期字段；
     * 11-1; 如果少收凭证字段有值则先撤回少收凭证，没有的直接更新交货单状态；
     * @param sapDeliveryNote
     * @param cancelUnderPostingDate
     * @param userId
     * @return
     */
    ResponseResult cancelOverseaDeliveryNote(String sapDeliveryNote, String cancelPostingDate, String cancelUnderPostingDate, Integer dataVersion, String userId);

    /** 交货单关闭成废单，状态变化 0-12 */
    ResponseResult closeOverseaDeliveryNote(String sapDeliveryNote, Integer dataVersion, String userId) throws Exception;

    /** SPMS收货单据状态(默认0待到货;1收货中/SAP凭证撤销;2入库完成/提交OA成功;3提交OA失败;4OA审批不通过;5OA审批通过/提交SAP失败;
     * 6收货多收提交SAP失败;7收货多收提交SAP成功;8收货少收提交SAP失败;9收货少收提交SAP成功;10提交SAP完成;11收货完成;12关闭/废单;)
     * 获取已经到货(已生成入库任务)，但未完结(单据状态不为 0, 11, 12)，且到货时间超过 14 天 */
    List<Map<String, Object>> getOverdueDeliveryNote(String werks);
    
    /**
     * 查询交货单的行明细
     * @param record
     * @return
     */
	List<Map<String, Object>> selectOverseaDeliveryNoteItem(OverseaDeliveryNoteItemDTO record);


}
