package com.ximai.mes.pro.service.proWorkOrder;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ximai.mes.constant.WorkorderStatusEnum;
import com.ximai.mes.md.domain.MdItem;
import com.ximai.mes.pro.domain.ep.EPDtoProWorkOrder;
import com.ximai.mes.pro.domain.proWorkOrder.ProWorkorder;
import com.ximai.mes.pro.domain.sap.SAPDtoProWorkOrder;
import com.ximai.mes.pro.domain.vo.ProWorkOrderProcessToolLoseVo;
import com.ximai.mes.pro.domain.vo.ProWorkorderQuery;
import com.ximai.mes.pro.domain.vo.ProWorkorderVo;
import com.ximai.mes.pro.domain.vo.proWorkOrder.*;
import com.ximai.mes.remote.dto.ProWorkorderErpDto;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * @date 2022-05-09 * 生产工单Service接口
 */
public interface IProWorkorderService {

    /**
     * 查询生产工单
     *
     * @param workorderId 生产工单主键
     * @return 生产工单
     */
    ProWorkorderVo selectProWorkorderByWorkorderId(Long workorderId);

    /**
     * 单独查询工单任务
     *
     * @param workorderId
     * @return
     */
    ProWorkorder selectWorkorderById(Long workorderId);

    /**
     * 查询生产工单
     *
     * @param workorderCode 生产工单主键
     * @return 生产工单
     */
    List<ProWorkorder> selectArrangeListByCode(String workorderCode);

    /**
     * 查询生产工单列表
     *
     * @param proWorkorder 生产工单
     * @return 生产工单集合
     */
    List<ProWorkorder> selectProWorkorderList(ProWorkorderQuery proWorkorder);

    /**
     * 查询生产工单列表
     *
     * @param query 生产工单
     * @return 生产工单集合
     */
    List<ProWorkorder> selectListByQw(QueryWrapper<ProWorkorder> query);

    /**
     * 查询生产工单列表
     *
     * @param proWorkorder 根据中间表pro_task_workorder查询task_id生产工单列表
     * @return 生产工单集合
     */
    List<ProWorkorder> selectProWorkorderByTaskId(ProWorkorder proWorkorder);


    boolean checkWorkorderIsExsit(ProWorkorder proWorkorder);

    /**
     * 新增生产工单
     *
     * @param proWorkorder 生产工单
     * @return 结果
     */
    int insertProWorkorder(ProWorkorder proWorkorder);

    /**
     * 新增生产工单（包含bom及工序）
     *
     * @param proWorkorderVo 生产工单
     * @return 结果
     */
    int insertProWorkorderVo(ProWorkorderVo proWorkorderVo);


    /**
     * 生产完工，更新工单数量信息
     *
     * @param proWorkorder 生产工单
     * @param qualifyQuantity 完工数量
     * @param unQualifyQuantity 不合格数量
     * @return 结果
     */
    void reportUpdateProWorkorder(ProWorkorder proWorkorder, BigDecimal qualifyQuantity, BigDecimal unQualifyQuantity);


    void updateWorkorderState(ProWorkorder workorder, WorkorderStatusEnum workorderStatusEnum);
    /**
     * 修改生产工单
     *
     * @param proWorkorder 生产工单
     * @return 结果
     */
    int updateProWorkorder(ProWorkorder proWorkorder);

    /**
     * 修改生产工单
     *
     * @param proWorkorder 生产工单
     * @return 结果
     */
    int updateWoStatusByArrangeCode(ProWorkorder proWorkorder);

    /**
     * 批量删除生产工单
     *
     * @param workorderIds 需要删除的生产工单主键集合
     * @return 结果
     */
    int deleteProWorkorderByWorkorderIds(Long[] workorderIds);

    /**
     * 删除生产工单信息
     *
     * @param workorderId 生产工单主键
     * @return 结果
     */
    int deleteProWorkorderByWorkorderId(Long workorderId);


    /**
     * 修改生产工单（附带bom，工序）
     *
     * @param proWorkorderVo 生产工单
     * @return 结果
     */
    int updateProWorkorderWithBomAndProcess(ProWorkorderVo proWorkorderVo);

    /**
     * 工单工装齐套检查
     *
     * @param workOrderIds 工单ID
     */
    List<ProWorkOrderProcessToolLoseVo> checkToolNum(Long[] workOrderIds);


    String importWorkOrder(MultipartFile file) throws Exception;

    void importTemplate(HttpServletResponse response) throws IOException;

    void generateBomLine(Long workorderId);

    Integer countByParentCode(String workorderCode);

    void addComplements(ProWorkorderVo proWorkorder);

    ProWorkorder insertObj(ProWorkorder proWorkorderVo, ProWorkorderVo workorderVo);

    @Transactional
    int clossAndDeleteObjV2(ProWorkorder workorder);

    int closeObj(ProWorkorder workorderCode);

    List<ProWorkorder> selectSaleAndWorkorderList(ProWorkorder proWorkorder);

    List<Map<String, String>> getWorkorderProcessInfo(String workorderCode);

    List<ProWorkorderPrintTab> selectWorkorderPrintTab(ProWorkorderQuery proWorkorder);

    /**
     * 打样生产工单任务生成
     *
     * @param workorderProofMakeProduction
     */
    void proofMakeProduction(WorkorderProofMakeProduction workorderProofMakeProduction);

    List<ProWorkorderVo> getFeedBackRecord(ProWorkorderQuery proWorkorder);

    int updateObject(ProWorkorderVo proWorkorderVo);

    /**
     * 同步ERP数据
     */
    void syncErpData();

    /**
     * 首次新增同步ERP数据
     */
    void initSyncAddErpData();

    /**
     * 同步修改ERP数据
     * 查询所有ERP同步标识为未同步数据，同步成功后修改为已同步
     * 每次更新1000行，直到所有数据同步完成为止
     */
    void syncEditErpData();

    /**
     * 同步修改ERP数据
     * 查询所有ERP同步标识为未同步数据，同步成功后修改为已同步
     * 每次更新1000行，直到所有数据同步完成为止
     */
    void syncEditErpData(ProWorkorderErpDto workorderErpDto, Map<String, MdItem> itemMap);

    int updateWorkProcess(ProWorkorderVo proWorkorderVo);
}
