package cn.iocoder.yudao.module.tickets.service;

import cn.iocoder.yudao.module.tickets.entity.DlRepairTickets;
import cn.iocoder.yudao.module.tickets.vo.CustomerAndCarVO;
import cn.iocoder.yudao.module.tickets.vo.DlRepairTicketsReqVO;
import cn.iocoder.yudao.module.tickets.vo.DlRepairTicketsRespVO;
import cn.iocoder.yudao.module.tickets.vo.NoticeCusVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

import javax.servlet.http.HttpServletResponse;
import java.util.Map;

/**
 * 针对表【dl_repair_tickets(维修工单表)】的数据库操作Service
 *
 * @author 小李
 * @date 17:39 2024/9/13
 **/
public interface DlRepairTicketsService extends IService<DlRepairTickets> {

    /**
     * 维修工单表 新增
     *
     * @param ticketsRespVO 新增对象
     * @author 小李
     * @date 11:33 2024/9/20
     **/
    DlRepairTicketsRespVO createTickets(DlRepairTicketsRespVO ticketsRespVO);

    /**
     * 维修工单表 分页
     *
     * @param repairTicketsReqVO 查询对象
     * @author 小李
     * @date 20:51 2024/9/20
     **/
    IPage<DlRepairTickets> getTicketsPage(DlRepairTicketsReqVO repairTicketsReqVO, Page<DlRepairTickets> page);

    /**
     * 获得一个工单的详细信息
     *
     * @param id 工单ID
     * @author 小李
     * @date 16:05 2024/9/21
     **/
    DlRepairTicketsRespVO getTicketsById(String id);

    /**
     * 维修工单表 作废
     *
     * @param repairTicketsReqVO 工单对象
     * @author 小李
     * @date 19:46 2024/9/22
     **/
    void setTicketsVoid(DlRepairTicketsReqVO repairTicketsReqVO);

    /**
     * 维修工单表 结算
     *
     * @param repairTicketsRespVO 工单
     * @author 小李
     * @date 8:50 2024/9/23
     **/
    void setTicketsPaid(DlRepairTicketsRespVO repairTicketsRespVO);

    /**
     * 客户信息和车辆信息 新增、修改
     *
     * @param customerAndCarVO 用户信息和车辆信息
     * @author 小李
     * @date 9:25 2024/10/8
     **/
    void updateCustomerAndCar(CustomerAndCarVO customerAndCarVO);

    /**
     * 打印工单
     *
     * @param response HttpServletResponse
     * @param id       String
     * @author PQZ
     * @date 14:00 2024/10/12
     **/
    void print(HttpServletResponse response, String id);

    /**
     * 分类查询工单分页
     *
     * @author 小李
     * @date 16:26 2024/10/12
     * @param repairTicketsReqVO 查询对象
     **/
    IPage<DlRepairTickets> getPageType(DlRepairTicketsReqVO repairTicketsReqVO, Page<DlRepairTickets> page);

    /**
     * 判断登录用户的角色，针对维修工单中的四个角色
     *
     * @author 小李
     * @date 9:28 2024/10/14
     **/
    String getUserRole();

    /**
     * 接单
     *
     * @author 小李
     * @date 11:48 2024/10/14
     * @param id 工单ID
     **/
    void updateTake(String id);

    /**
     * 指派员工，通知施工
     *
     * @author 小李
     * @date 15:34 2024/10/14
     * @param reqVO 请求对象
     **/
    void updateRepair(DlRepairTicketsReqVO reqVO);

    /**
     * 更新工单状态
     *
     * @param respVO 请求对象
     * @author 小李
     * @date 15:46 2024/10/18
     **/
    void updateStatus(DlRepairTicketsRespVO respVO);

    /**
     * 配件客户是否可见
     *
     * @author 小李
     * @date 21:52 2024/10/18
     * @param id 工单ID
     * @param show 是否可见
     **/
    void updateShow(String id, String show);

    /**
     * 查待总检或待出厂检验的工单
     * 维修服务顾问和总检用的
     *
     * @author 小李
     * @date 11:40 2024/10/23
     * @param repairTicketsReqVO 请求对象
     **/
    IPage<DlRepairTickets> getPageByRole(DlRepairTicketsReqVO repairTicketsReqVO, Page<DlRepairTickets> page);

    /**
     * 维修总检完成总检
     *
     * @author 小李
     * @date 16:48 2024/10/23
     * @param respVO 请求对象
     **/
    void inspection(DlRepairTicketsRespVO respVO);

    /**
     * 服务顾问上传出厂检验日志
     *
     * @author 小李
     * @date 17:47 2024/10/23
     * @param respVO 请求对象
     **/
    void confirm(DlRepairTicketsRespVO respVO);

    /**
     * 从总检的角度差维修中、已完成的工单数量
     * @author vinjor-M
     * @date 11:30 2024/10/24
     * @return java.util.Map<java.lang.String,java.lang.Integer>
    **/
    Map<String,Integer> getBossNum();

    /**
     * 服务顾问通知客户取车
     *
     * @author 小李
     * @date 22:40 2024/10/23
     * @param noticeCusVO 请求对象
     **/
    void noticeCus(NoticeCusVO noticeCusVO);

    /**
     * 重新计算工单的一些数值
     *
     * @author 小李
     * @date 15:47 2024/10/24
     * @param ticketId 工单ID
     **/
    boolean computeTicket(String ticketId);

    /**
     * 新增工单子项
     *
     * @author 小李
     * @date 19:59 2024/10/24
     * @param respVO 主要有两个参数，主表ID,itemList(这个需要前端处理成子表的对象能接收的数据)
     **/
    void addItems(DlRepairTicketsRespVO respVO);

    /**
     * 用于同步一个工单的所有配件申请表的数据到维修工单，主要针对已领取数量小于申请数量的情况
     *
     * @author 小李
     * @date 9:52 2024/10/26
     * @param id 维修工单ID
     **/
    boolean syncTicketWaresToTicket(String id);

    /**
     * 超时自动总检
     *
     * @author 小李
     * @date 16:35 2024/10/26
    **/
    void autoInspection();

    /**
     * 修改工单主表，只是主表
     *
     * @author 小李
     * @date 10:25 2024/10/30
     * @param respVO 请求对象
     **/
    void updateTicket(DlRepairTicketsRespVO respVO);

    /**
     * 删除工单
     *
     * @author 小李
     * @date 20:05 2024/11/1
     * @param id 工单ID
     **/
    void removeTicketById(String id);
}
