package com.ygtx.gxt.service;

import java.util.Date;
import java.util.List;

import com.ygtx.common.core.domain.entity.SysDept;
import com.ygtx.gxt.domain.*;
import org.springframework.web.multipart.MultipartFile;

/**
 * 维保工单Service接口
 *
 * @author ygtx
 * @date 2025-10-25
 */
public interface IGxtWorkOrderService {
    /**
     * 查询维保工单
     *
     * @param id 维保工单主键
     * @return 维保工单
     */
    public GxtWorkOrder selectGxtWorkOrderById(Long id);

    /**
     * 查询维保工单列表
     *
     * @param gxtWorkOrder 维保工单
     * @return 维保工单集合
     */
    public List<GxtWorkOrder> selectGxtWorkOrderList(GxtWorkOrder gxtWorkOrder);

    /**
     * 新增维保工单
     *
     * @param gxtWorkOrder 维保工单
     * @return 结果
     */
    public int insertGxtWorkOrder(GxtWorkOrder gxtWorkOrder);

    /**
     * 修改维保工单
     *
     * @param gxtWorkOrder 维保工单
     * @return 结果
     */
    public int updateGxtWorkOrder(GxtWorkOrder gxtWorkOrder);

    /**
     * 批量删除维保工单
     *
     * @param ids 需要删除的维保工单主键集合
     * @return 结果
     */
    public int deleteGxtWorkOrderByIds(Long[] ids);

    /**
     * 删除维保工单信息
     *
     * @param id 维保工单主键
     * @return 结果
     */
    public int deleteGxtWorkOrderById(Long id);

    /**
     * 派单给班组组长
     *
     * @param id             工单ID
     * @param teamLeaderId   班组组长ID
     * @param teamLeaderName 班组组长姓名
     * @return 结果
     */
    public int assignToTeamLeader(Long id, Long teamLeaderId, String teamLeaderName);

    /**
     * 班组组长接单
     *
     * @param id 工单ID
     * @return 结果
     */
    public int acceptByTeamLeader(Long id);

    /**
     * 班组组长派单给工作组成员
     *
     * @param id                  工单ID
     * @param workGroupMemberId   工作组成员ID
     * @param workGroupMemberName 工作组成员姓名
     * @return 结果
     */
    public int assignToWorkGroupMember(Long id, Long workGroupMemberId, String workGroupMemberName);

    /**
     * 工作组成员接单
     *
     * @param id 工单ID
     * @return 结果
     */
    public int acceptByWorkGroupMember(Long id);

    /**
     * 接单（支持一次性选择处理人员和检修人员）
     *
     * @param gxtWorkOrder 工单对象，包含处理人员、检修人员信息及流转记录
     * @return 结果
     */
    public int acceptOrder(GxtWorkOrder gxtWorkOrder);

    /**
     * 开始处理工单
     *
     * @param gxtWorkOrder 工单对象，包含工单状态和其他信息
     * @return 结果
     */
    public int startWorkOrder(GxtWorkOrder gxtWorkOrder);

    /**
     * 暂停工单
     *
     * @param gxtWorkOrder 工单对象，包含暂停原因不会
     * @return 结果
     */
    public int pauseWorkOrder(GxtWorkOrder gxtWorkOrder);

    /**
     * 继续处理工单
     *
     * @param gxtWorkOrder 工单对象仅包含工单ID
     * @return 结果
     */
    public int resumeWorkOrder(GxtWorkOrder gxtWorkOrder);

    /**
     * 审批挂起申请
     *
     * @param gxtWorkOrder 工单对象，包含审批结果不会
     * @return 结果
     */
    public int approveWorkOrder(GxtWorkOrder gxtWorkOrder);

    /**
     * 挂起工单申请
     *
     * @param gxtWorkOrder 工单对象，包含挂起原因不会
     * @return 结果
     */
    public int suspendWorkOrder(GxtWorkOrder gxtWorkOrder);

    /**
     * 重启工单
     *
     * @param id 工单ID
     * @return 结果
     */
    public int restartWorkOrder(Long id);

    /**
     * 完成工单
     *
     * @param gxtWorkOrder 工单对象，仅包含工单ID
     * @return 结果
     */
    public int completeWorkOrder(GxtWorkOrder gxtWorkOrder);

    /**
     * 查询工单流转记录
     *
     * @param orderId 工单ID
     * @return 流转记录集合
     */
    public List<GxtWorkOrderFlow> selectWorkOrderFlowByOrderId(Long orderId);

    /**
     * 上传工单附件
     *
     * @param orderId 工单ID
     * @param files   文件数组
     * @return 结果
     */
    public int uploadAttachments(Long orderId, List<GxtWorkOrderAttachment> files);

    /**
     * 导入维保工单数据
     *
     * @param workOrderList   维保工单数据列表
     * @param isUpdateSupport 是否更新支持，如果已存在，则进行更新数据
     * @param operName        操作用户
     * @return 结果
     */
    public String importGxtWorkOrder(List<GxtWorkOrder> workOrderList, Boolean isUpdateSupport, String operName);
    
    /**
     * 根据工单ID查询维保工单人员列表
     * 
     * @param orderId 工单ID
     * @return 维保工单人员列表
     */
    public List<GxtWorkOrderPerson> selectWorkOrderPersonListByOrderId(Long orderId);
    
    /**
     * 更新维保工单人员列表
     * 
     * @param personList 人员列表
     * @return 结果
     */
    public int updateWorkOrderPersonList(List<GxtWorkOrderPerson> personList);

    public int updateGxtWorkOrderForScore(GxtWorkOrder order);

    public List<SysDept> getSummaryList(SysDept sysDept);

    public List<GxtOrderData> selectHomePageWorkOrderList(GxtOrderData gxtOrderData);

    public int getUnfinishedOrder();

    public String hasCenter();

    public boolean isSelect(GxtOrderData gxtOrderData);

    /**
     * 查询超时工单列表
     * 
     * @param gxtWorkOrder 维保工单查询条件
     * @return 超时工单列表
     */
    public List<GxtWorkOrder> selectOverdueWorkOrderList(GxtWorkOrder gxtWorkOrder,String keyword);

    /**
     * 查询即将超时工单列表
     * 
     * @param gxtWorkOrder 维保工单查询条件
     * @return 即将超时工单列表
     */
    public List<GxtWorkOrder> selectAlmostOverdueWorkOrderList(GxtWorkOrder gxtWorkOrder, String keyword);
    
    /**
     * 作废维保工单
     * 
     * @param gxtWorkOrder 维保工单
     * @return 结果
     */
    public int invalidateGxtWorkOrder(GxtWorkOrder gxtWorkOrder);

    /**
     * 停机
     * @param gxtWorkOrder
     * @return
     */
    public int shutdownOrder(GxtWorkOrder gxtWorkOrder);
    
    /**
     * 查询设备最近的维保工单
     *
     * @param pcsDeviceId 设备ID
     * @param limit 限制数量
     * @return 维保工单集合
     */
    public List<GxtWorkOrder> selectLatestGxtWorkOrderByDeviceId(Long pcsDeviceId, Integer limit);
    
    /**
     * 根据状态和排序字段查询设备相关的维保工单
     *
     * @param pcsDeviceId 设备ID
     * @param workOrderStatus 工单状态
     * @param excludeStatus 是否排除指定状态
     * @param orderByField 排序字段
     * @param limit 限制数量
     * @return 维保工单集合
     */
    public List<GxtWorkOrder> selectGxtWorkOrderByDeviceIdWithCondition(Long pcsDeviceId, String workOrderStatus, boolean excludeStatus, String orderByField, Integer limit);
    
    /**
     * 查询需要扣分的维保工单列表（已完成或已归档，复运时间不为空，且未被扣过分的工单）
     *
     * @return 维保工单集合
     */
    public List<GxtWorkOrder> selectGxtWorkOrderListForDeduction();

    /**
     * 撤回工单
     * @param gxtWorkOrder
     * @return
     */
    public int revokeOrder(GxtWorkOrder gxtWorkOrder);
    
    /**
     * 查询指定时间之后的有效维保工单（用于奖励计算）
     * 
     * @param equipmentId 设备ID
     * @param lastBreakTime 最近中断时间
     * @return 有效维保工单集合
     */
    public List<GxtWorkOrder> selectValidWorkOrdersAfterBreak(Long equipmentId, Date lastBreakTime);
}