package com.xisc.pm.app.service;

import com.xisc.pm.api.dto.PmCompositeSlaParamDTO;
import com.xisc.pm.api.dto.PmCompositeSlabCopyDTO;
import com.xisc.pm.api.dto.PmCompositeSlabDTO;
import com.xisc.pm.api.dto.PmCompositeSlabListResDTO;
import com.xisc.pm.api.dto.PmCompositeSlabPdDTO;
import com.xisc.pm.api.dto.PmCompositeSlabReqDTO;
import com.xisc.pm.api.dto.PmCompositeSlabResDTO;
import com.xisc.pm.api.dto.PmCompositeSlabResLineDTO;
import com.xisc.pm.api.dto.PmPdBlockPosDTO;
import com.xisc.pm.domain.entity.PmCompositeSlab;
import com.xisc.pm.domain.entity.PmCompositeSlabList;
import com.xisc.pm.domain.entity.PmPdSlab;
import io.choerodon.core.domain.Page;
import io.choerodon.mybatis.pagehelper.domain.PageRequest;

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

/**
 * 复合/叠轧坯基本信息表(PmCompositeSlab)应用服务
 *
 * @author 纪文桃 wentao.ji01@hand-china.com
 * @since 2024-08-01 15:46:27
 */
public interface PmCompositeSlabService {

    /**
     * 查询数据
     *
     * @param pageRequest 分页参数
     * @param dto         请求参数
     * @param tenantId    租户
     * @return
     */
    Page<PmCompositeSlabResDTO> selectList(PageRequest pageRequest, PmCompositeSlabReqDTO dto, Long tenantId);

    /**
     * 保存数据
     *
     * @param tenantId 租户
     * @param dto      保存的数据
     */
    void saveData(Long tenantId, PmCompositeSlabDTO dto);

    /**
     * 合同行信息插叙
     *
     * @param id       主键id
     * @param tenantId 租户
     * @return
     */
    List<PmCompositeSlabResLineDTO> queryLineList(Long id, Long tenantId);

    /**
     * 根据主键slabId批量删除数据
     *
     * @param tenantId   租户
     * @param slabIdList 主键集合
     */
    void deleteListBySlabId(Long tenantId, List<Long> slabIdList);

    /**
     * 复制数据
     *
     * @param tenantId 租户
     * @param dto      对象
     */
    void copyData(Long tenantId, PmCompositeSlabCopyDTO dto);

    /**
     * 复合/叠轧板组板结果成批确认查询
     *
     * @param pageRequest 分页参数
     * @param dto         查询参数
     * @param tenantId    租户
     * @return
     */
    Page<PmCompositeSlab> confirmList(PageRequest pageRequest, PmCompositeSlaParamDTO dto, Long tenantId);

    /**
     * 组板确认
     *
     * @param tenantId 租户
     * @param idList   复合坯id集合
     */
    void confirm(Long tenantId, List<Long> idList);

    /**
     * 组板解散
     *
     * @param tenantId 租户
     * @param idList   复合坯id集合
     */
    void disband(Long tenantId, List<Long> idList);

    /**
     * 打印查询
     *
     * @param slabId   复合坯id
     * @param tenantId 租户
     * @return
     */
    List<PmCompositeSlabListResDTO> printList(Long slabId, Long tenantId);

    /**
     * 待组板基材查询
     * @param pageRequest
     * @param dto
     * @param organizationId
     * @return
     */
    Page<PmCompositeSlabPdDTO> compositePdList(PageRequest pageRequest, PmCompositeSlaParamDTO dto,
            Long organizationId);

    /**
     * 单层组板解散
     * @param organizationId 租户
     * @param idList 基材ID
     * @param singleLayer 是否是单层组板 
     */
    void release(Long organizationId, List<Long> idList, boolean singleLayer);

    /**
     * 单坯组板确认
     * @param organizationId
     * @param pmCompositeSlab
     */
    void singleConfirm(Long organizationId, PmCompositeSlab pmCompositeSlab);

    /**
     * 抛合同
     *
     * @param pmCompositeSlabLists
     * @param slabVirtualNoMap
     * @param mscLineNo
     * @param tenantId
     */
    void abandoningContract(String slabNo, List<PmCompositeSlabList> pmCompositeSlabLists, Map<String, String> slabVirtualNoMap,
                            String mscLineNo, Long tenantId);

    /**
     * 查询基材号的组板结果
     *
     * @param baseMatNo 基材号
     * @param tenantId  租户
     * @return
     */
    List<PmPdBlockPosDTO> queryBoardResult(String baseMatNo, Long tenantId);
    
    /**
     * 汇总并更新复合坯相关信息
     * @param slabNo
     */
    void summaryFhbPmPdSlabInfo(String slabNo , Long tenantId);

    /**
     * 生成命令参数表和命令小板表护具
     *
     * @param baseVirtualList
     * @param pmPdSlabList
     * @param tenantId
     */
    void createCmdContPlt(String baseVirtualSlabNo, String ponoSlabNo , String slabNo,List<String> virtaulSlabNoList, Long tenantId);

    /**
     * 抛轧钢材料状态变更
     *
     * @param compositeSlab
     * @param baseMatNo
     * @param organizationId
     */
    void callMatStatusModify(PmCompositeSlab compositeSlab, String baseMatNo, Long organizationId);
}

