package cn.iocoder.yudao.module.pms.service.iotmainworkorder;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.*;
import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorder.IotMainWorkOrderDO;
import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbom.IotMainWorkOrderBomDO;

import javax.validation.Valid;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 保养工单 Service 接口
 *
 * @author ruiqi
 */
public interface IotMainWorkOrderService {

    /**
     * 创建保养工单
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createIotMainWorkOrder(@Valid IotMainWorkOrderSaveReqVO createReqVO);

    /**
     * 更新保养工单
     *
     * @param updateReqVO 更新信息
     */
    void updateIotMainWorkOrder(@Valid IotMainWorkOrderSaveReqVO updateReqVO);

    /**
     * 删除保养工单
     *
     * @param id 编号
     */
    void deleteIotMainWorkOrder(Long id);

    /**
     * 获得保养工单
     *
     * @param id 编号
     * @return 保养工单
     */
    IotMainWorkOrderDO getIotMainWorkOrder(Long id);

    /**
     * 获得保养工单分页
     *
     * @param pageReqVO 分页查询
     * @return 保养工单分页
     */
    PageResult<IotMainWorkOrderDO> getIotMainWorkOrderPage(IotMainWorkOrderPageReqVO pageReqVO);

    /**
     * 获得保养工单列表
     *
     * @param pageReqVO 列表查询
     * @return 保养工单列表
     */
    List<IotMainWorkOrderDO> workOrders(IotMainWorkOrderPageReqVO pageReqVO);

    /**
     * 保养工单分页 按照 每个保养工单中 最近保养项的保养距离 由小到大 排序
     *
     * @param pageReqVO 分页查询
     * @return 保养工单分页
     */
    PageResult<IotMainWorkOrderRespVO> sortedMainWorkOrderPage(IotMainWorkOrderPageReqVO pageReqVO);

    /**
     * 以设备为维度统计所有保养明细中最近的保养数据 里程/时间/自然日期
     *
     * @param pageReqVO 分页查询
     * @return 保养工单分页
     */
    PageResult<IotDeviceRespVO> deviceMainDistances(IotMainWorkOrderPageReqVO pageReqVO);

    /**
     * 以公司为维度 统计所有超时保养的设备(保养里程 保养时长 保养自然日期) 统计报表明细
     *
     * @param pageReqVO 列表查询
     * @return 超时保养设备列表
     */
    List<IotDeviceRespVO> deviceMainTimeoutList(IotMainWorkOrderPageReqVO pageReqVO);

    /**
     * 以公司为维度 统计所有超时保养的设备(保养里程 保养时长 保养自然日期)
     *
     * @param pageReqVO 分页查询
     * @return 保养工单分页
     */
    List<IotDeviceMainTimeoutVO> timeoutDeviceMainDistances(IotMainWorkOrderPageReqVO pageReqVO);

    /**
     * 以设备为维度统计所有保养计划明细中最近的保养数据 里程/时间/自然日期 可能以设备BOM分组
     *
     * @param pageReqVO 分页查询
     * @return 保养工单分页
     */
    PageResult<IotDeviceRespVO> maintenanceSearch(IotMainWorkOrderPageReqVO pageReqVO);

    /**
     * 查询工单表中最大的id
     *
     * @return 最大的工单id
     */
    Long theMaxId();

    /**
     * 查询工单表中最大的id
     *
     * @return 最大的工单id
     */
    Long theMaxWorkOrderId();

    /**
     * 生成保养工单号
     *
     * @return 生成保养工单号
     */
    String createWorkOrderNumber();

    /**
     * 定时任务 批量新增 工单
     *
     * @return
     */
    void batchAddOrders(List<IotMainWorkOrderDO> workOrders);

    /**
     * 填报 保养 工单
     *
     * @return
     */
    void fillWorkOrder(IotMainWorkOrderSaveVO saveVO);

    /**
     * 新增 保养 工单
     *
     * @return
     */
    void addWorkOrder(IotMainWorkOrderSaveVO saveVO);

    /**
     * 根据 保养结果 统计工单数量
     *
     * @return
     */
    List<Map<String, Integer>> allWorkOrderCountByResult();

    /**
     * 获得保养工单分页
     *
     * @return
     */
    PageResult<IotMainWorkOrderRespVO> deviceOrderPage(IotMainWorkOrderPageReqVO pageReqVO);

    /**
     * 从设备台账查询保养工单 只关联当前设备明细
     *
     * @return
     */
    IotMainWorkOrderRespVO getDeviceMainWorkOrder(Long workOrderId, Long deviceId);

    /**
     * 设备调拨后同步 保养历史工单
     * 将 修改历史工单的 deptId 创建人 责任人
     * @param deviceIds 发生调拨的设备id 列表
     * @param deptId 调拨后部门id
     * @param personIds 调拨时设置的责任人列表
     * @param oldDeptPair key设备id  value设备调拨前所属部门id
     * @return
     */
    void syncWorkOrderData(List<Long> deviceIds, Long deptId, List<Long> personIds, Map<Long, Long> oldDeptPair);

    /**
     * 设备调拨后同步 保养 执行中 的工单
     * 修改工单的 deptId 创建人 责任人
     * @param deviceIds 发生调拨的设备id 列表
     * @param deptId 调拨后部门id
     * @param personIds 调拨时设置的责任人列表
     * @param oldDeptPair key设备id  value设备调拨前所属部门id
     * @return
     */
    void syncRunningWorkOrder(List<Long> deviceIds, Long deptId, List<Long> personIds, Map<Long, Long> oldDeptPair);

    /**
     * 查询设备BOM保养项 最新的 保养记录 (上次保养时间)
     *
     * @return
     */
    List<IotMainWorkOrderBomDO> historyWorkOrderBoms(Set<Long> deviceIds, Set<Long> bomNodeIds);

    /**
     * 历史保养工单物料记录出库 初始化保养的出库记录
     *
     * @return
     */
    void historyWorkOrderOutbound();

    /**
     * 修改退回的 保养 工单
     *
     * @return
     */
    void modifyWorkOrder(IotMainWorkOrderSaveVO saveVO);

    /**
     * 上传 历史保养工单 的附件
     *
     * @return
     */
    void hiWorkOrderAttachment(IotMainWorkOrderSaveReqVO orderReqVO);
}