package com.qmth.sop.business.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qmth.sop.business.bean.params.DeviceDeliveryParam;
import com.qmth.sop.business.bean.params.DeviceInOutForm;
import com.qmth.sop.business.bean.result.FlowTaskResult;
import com.qmth.sop.business.bean.result.TBDeviceDeliveryResult;
import com.qmth.sop.business.entity.SysUser;
import com.qmth.sop.business.entity.TBDeviceDelivery;
import com.qmth.sop.common.enums.DeviceDeliveryStatusEnum;
import com.qmth.sop.common.enums.DeviceUsageTypeEnum;
import com.qmth.sop.common.enums.InOutTypeEnum;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

/**
 * <p>
 * 设备发货表 服务类
 * </p>
 *
 * @author wangliang
 * @since 2023-11-28
 */
public interface TBDeviceDeliveryService extends IService<TBDeviceDelivery> {

    /**
     * 设备发货导入
     *
     * @param file excel文件
     * @throws IOException 异常
     */
    void deviceDeliveryImport(MultipartFile file) throws IOException;

    /**
     * 设备发货修改
     *
     * @param deviceDeliveryParam 设备发货修改参数
     */
    void editDeviceDelivery(DeviceDeliveryParam deviceDeliveryParam);

    /**
     * 设备发货管理查询
     *
     * @param iPage             分页参数
     * @param serviceId         服务单元id
     * @param usageType         用途类型
     * @param crmNo             项目单号
     * @param status            发货状态
     * @param deliverUserId     发货人
     * @param deliveryStartTime 发货开始时间
     * @param deliveryEndTime   发货结束时间
     * @param serialNo          设备序列号
     * @param deviceNo          设备编号
     * @param supplierId        供应商
     * @param receiveStartTime  验收开始时间
     * @param receiveEndTime    验收结束时间
     * @param consignee         收件人
     * @param mailingAddress    收件地址
     * @param deliveryType      出入库状态
     * @param brand             品牌
     * @param model             型号
     * @param expressNo         快递单号
     * @return 分页结果
     */
    IPage<TBDeviceDeliveryResult> page(IPage<TBDeviceDeliveryResult> iPage, Long serviceId, DeviceUsageTypeEnum usageType, String crmNo,
            DeviceDeliveryStatusEnum status, Long deliverUserId, Long deliveryStartTime, Long deliveryEndTime, String serialNo, String deviceNo, Long supplierId,
            Long receiveStartTime, Long receiveEndTime, String consignee, String mailingAddress,
            InOutTypeEnum deliveryType, String brand, String model, String expressNo) throws Exception;

    /**
     * 设备发货管理列表
     *
     * @param serviceId         服务单元id
     * @param usageType         用途类型
     * @param crmNo             项目单号
     * @param status            发货状态
     * @param deliverUserId     发货人
     * @param deliveryStartTime 发货开始时间
     * @param deliveryEndTime   发货结束时间
     * @param serialNo          设备序列号
     * @param deviceNo          设备编号
     * @param supplierId        供应商
     * @param receiveStartTime  验收开始时间
     * @param receiveEndTime    验收结束时间
     * @param consignee         收件人
     * @param mailingAddress    收件地址
     * @param deliveryType      出入库状态
     * @param brand             品牌
     * @param model             型号
     * @param expressNo         快递单号
     * @return 分页结果
     */
    List<TBDeviceDeliveryResult> list(Long serviceId, DeviceUsageTypeEnum usageType, String crmNo,
            DeviceDeliveryStatusEnum status, Long deliverUserId, Long deliveryStartTime, Long deliveryEndTime,
            String serialNo, String deviceNo, Long supplierId, Long receiveStartTime, Long receiveEndTime, String consignee, String mailingAddress,
            InOutTypeEnum deliveryType, String brand, String model, String expressNo) throws Exception;

    /**
     * 设备发货管理导出
     *
     * @param serviceId         服务单元id
     * @param usageType         用途类型
     * @param crmNo             项目单号
     * @param status            发货状态
     * @param deliverUserId     发货人
     * @param deliveryStartTime 发货开始时间
     * @param deliveryEndTime   发货结束时间
     * @param serialNo          设备序列号
     * @param deviceNo          设备编号
     * @param supplierId        供应商
     * @param receiveStartTime  验收开始时间
     * @param receiveEndTime    验收结束时间分页结果
     * @param consignee         收件人
     * @param mailingAddress    收件地址
     * @param deliveryType      出入库状态
     * @param brand             品牌
     * @param model             型号
     * @param expressNo         快递单号
     */
    void dataExport(Long serviceId, DeviceUsageTypeEnum usageType, String crmNo, DeviceDeliveryStatusEnum status,
            Long deliverUserId, Long deliveryStartTime, Long deliveryEndTime, String serialNo, String deviceNo,
            Long supplierId, Long receiveStartTime, Long receiveEndTime, String consignee, String mailingAddress,
            InOutTypeEnum deliveryType, String brand, String model, String expressNo) throws Exception;

    /**
     * 新增设备发货入库记录
     *
     * @param deviceInOutFormList 设备信息
     */
    void addInRecord(List<DeviceInOutForm> deviceInOutFormList);

    /**
     * 更新设备发货出库记录
     *
     * @param deviceInOutFormList 设备信息
     */
    void updateOutRecord(List<DeviceInOutForm> deviceInOutFormList);

    /**
     * 更新设备发货状态
     *
     * @param deviceDeliveryIdList 设备发货id集合
     * @param status               状态
     * @param requestUserId        请求人id
     */
    void updateStatus(List<Long> deviceDeliveryIdList, DeviceDeliveryStatusEnum status, Long requestUserId);

    /**
     * 查询发货人集合
     *
     * @return 发货人集合
     */
    List<SysUser> findDeliveryUserList();

    /**
     * 根据sop表单信息更新状态
     *
     * @param flowTaskResult flowTaskResult
     * @param status         status
     * @param userId         userId
     */
    void updateStatusBySop(FlowTaskResult flowTaskResult, DeviceDeliveryStatusEnum status, Long userId);

    /**
     * 更新设备相关
     *
     * @param flowTaskResult       flowTaskResult
     * @param sopNo                sopNo
     * @param status               status
     * @param userId               userId
     * @param deviceDeliveryUpdate deviceDeliveryUpdate
     */
    void updateDeviceRelated(FlowTaskResult flowTaskResult, String sopNo, DeviceDeliveryStatusEnum status, Long userId,
            Boolean deviceDeliveryUpdate);

    /**
     * 自动新增培训用出库明细记录（签收时）
     *
     * @param deviceDeliveryIdList 设备发货id集合
     */
    void autoOutDeviceForTrain(List<Long> deviceDeliveryIdList);

    /**
     * 查询设备返还集合（返还时）
     *
     * @param deviceDeliveryIdList 设备发货id集合
     * @return 设备返还表单
     */
    List<DeviceInOutForm> findDeviceReturnList(List<Long> deviceDeliveryIdList);
}