package cn.iocoder.yudao.module.tickets.controller.admin;


import cn.iocoder.yudao.common.RepairCons;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.tickets.entity.DlRepairTickets;
import cn.iocoder.yudao.module.tickets.service.DlRepairTicketsService;
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.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;

import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;

/**
 * 维修工单表(DlRepairTickets)表控制层
 *
 * @author 小李
 * @date 18:21 2024/9/13
 **/
@RestController
@RequestMapping("/repair/tickets")
public class DlRepairTicketsController {
    /**
     * 服务对象
     */
    @Resource
    private DlRepairTicketsService dlRepairTicketsService;


    /**
     * 维修工单表 新增
     *
     * @param ticketsRespVO 新增对象
     * @author 小李
     * @date 11:33 2024/9/20
     **/
    @PostMapping("/create")
    @Operation(summary = "维修工单表 新增")
    public CommonResult<?> createTicket(@RequestBody DlRepairTicketsRespVO ticketsRespVO) {
        return CommonResult.success(dlRepairTicketsService.createTickets(ticketsRespVO));
    }

    /**
     * 维修工单表 分页
     *
     * @param repairTicketsReqVO 查询对象
     * @param pageNo             页码
     * @param pageSize           条数
     * @author 小李
     * @date 20:51 2024/9/20
     **/
    @GetMapping("/page")
    @Operation(summary = "维修工单表 分页")
    public CommonResult<?> getTicketsPage(DlRepairTicketsReqVO repairTicketsReqVO,
                                          @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
                                          @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
        Page<DlRepairTickets> page = new Page<>(pageNo, pageSize);
        return success(dlRepairTicketsService.getTicketsPage(repairTicketsReqVO, page));
    }

    /**
     * 获得一个工单的详细信息
     *
     * @param id 工单ID
     * @author 小李
     * @date 16:05 2024/9/21
     **/
    @GetMapping("/get")
    @Operation(summary = "查看一个工单的详细信息")
    public CommonResult<?> getTicketsById(@RequestParam("id") String id) {
        return success(dlRepairTicketsService.getTicketsById(id));
    }

    /**
     * 维修工单表 作废
     *
     * @param repairTicketsReqVO 工单对象
     * @author 小李
     * @date 19:46 2024/9/22
     **/
    @PostMapping("/void")
    @Operation(summary = "维修工单表 作废")
    public CommonResult<?> setTicketsVoid(@RequestBody DlRepairTicketsReqVO repairTicketsReqVO) {
        dlRepairTicketsService.setTicketsVoid(repairTicketsReqVO);
        return CommonResult.ok();
    }

    /**
     * 维修工单表 结算
     *
     * @param repairTicketsRespVO 工单
     * @author 小李
     * @date 8:50 2024/9/23
     **/
    @PostMapping("/paid")
    @Operation(summary = "维修工单表 结算")
    public CommonResult<?> setTicketsPaid(@RequestBody DlRepairTicketsRespVO repairTicketsRespVO) {
        dlRepairTicketsService.setTicketsPaid(repairTicketsRespVO);
        return CommonResult.ok();
    }

//    /**
//     * 维修工单表 导出
//     *
//     * @param file 导出文件
//     * @author lzt
//     * @date 2024年10月11日
//     */
//    @PostMapping("/print")
//    @Operation(summary = "维修工单表 导出")
//    public ResponseEntity<Result<FileInfo>> printDocument(@RequestParam("file") MultipartFile file) {
//        if (file.isEmpty()) {
//            return ResponseEntity.badRequest().body(new Result<>(null, "文件不能为空"));
//        }
//
//        try {
//            FileDO fileInfo = fileService.createFileDetail(file.getOriginalFilename(), "/ticket", IoUtil.readBytes(file.getInputStream()));
//            return ResponseEntity.ok(new Result<>(fileInfo, "文件上传成功"));
//        } catch (Exception e) {
//            return ResponseEntity.status(500).body(new Result<>(null, "文件上传失败: " + e.getMessage()));
//        }
//    }

    /**
     * 维修工单打印
     *
     * @param response HttpServletResponse
     * @param id       维修工单id
     * @author PQZ
     * @date 13:48 2024/10/12
     **/
    @GetMapping("/print/{id}")
    @Operation(summary = "维修工单打印")
    public void printDocument(HttpServletResponse response, @PathVariable String id) {
        dlRepairTicketsService.print(response, id);
    }

    /**
     * 客户信息和车辆信息 新增、修改
     *
     * @param customerAndCarVO 用户信息和车辆信息
     * @author 小李
     * @date 9:25 2024/10/8
     **/
    @PostMapping("/updateUserAndCar")
    @Operation(summary = "客户信息和车辆信息 新增、修改")
    public CommonResult<?> updateCustomerAndCar(@RequestBody CustomerAndCarVO customerAndCarVO) {
        dlRepairTicketsService.updateCustomerAndCar(customerAndCarVO);
        return CommonResult.ok();
    }

    /**
     * 分类查询工单分页
     *
     * @param repairTicketsReqVO 查询对象
     * @param pageNo             页码
     * @param pageSize           条数
     * @author 小李
     * @date 16:26 2024/10/12
     **/
    @GetMapping("/pageType")
    @Operation(summary = "分类查询工单分页")
    public CommonResult<?> getPageType(DlRepairTicketsReqVO repairTicketsReqVO,
                                       @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
                                       @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
        Page<DlRepairTickets> page = new Page<>(pageNo, pageSize);
        if (StringUtils.isEmpty(repairTicketsReqVO.getSelectType())) {
            //查询类型为空，默认查待处理的
            repairTicketsReqVO.setSelectType(RepairCons.TICKETS_WAITING);
        }
        return success(dlRepairTicketsService.getPageType(repairTicketsReqVO, page));
    }

    /**
     * 判断登录用户的角色，针对维修工单中的四个角色
     *
     * @author 小李
     * @date 9:28 2024/10/14
     **/
    @GetMapping("/userRole")
    @Operation(summary = "判断登录用户的角色，针对维修工单中的四个角色")
    public CommonResult<?> getUserRole() {
        return success(dlRepairTicketsService.getUserRole());
    }

    /**
     * 接单
     *
     * @param id 工单ID
     * @author 小李
     * @date 11:48 2024/10/14
     **/
    @GetMapping("/take")
    @Operation(summary = "接单")
    public CommonResult<?> updateTake(@RequestParam("id") String id) {
        dlRepairTicketsService.updateTake(id);
        return CommonResult.ok();
    }

    /**
     * 指派员工，通知施工
     *
     * @param reqVO 请求对象
     * @author 小李
     * @date 15:34 2024/10/14
     **/
    @PostMapping("/notify")
    @Operation(summary = "指派员工，通知施工")
    public CommonResult<?> updateRepair(@RequestBody DlRepairTicketsReqVO reqVO) {
        dlRepairTicketsService.updateRepair(reqVO);
        return CommonResult.ok();
    }

    /**
     * 更新工单状态
     *
     * @param respVO 请求对象
     * @author 小李
     * @date 15:46 2024/10/18
     **/
    @PostMapping("/updateStatus")
    @Operation(summary = "更新工单状态")
    public CommonResult<?> updateStatus(@RequestBody DlRepairTicketsRespVO respVO) {
        dlRepairTicketsService.updateStatus(respVO);
        return CommonResult.ok();
    }

    /**
     * 配件客户是否可见
     *
     * @param id   工单ID
     * @param show 是否可见
     * @author 小李
     * @date 21:52 2024/10/18
     **/
    @GetMapping("/show")
    @Operation(summary = "配件客户是否可见")
    public CommonResult<?> updateShow(@RequestParam("id") String id, @RequestParam("show") String show) {
        dlRepairTicketsService.updateShow(id, show);
        return CommonResult.ok();
    }

    /**
     * 查待总检或待出厂检验的工单
     * 维修服务顾问和总检用的
     *
     * @param repairTicketsReqVO 请求对象
     * @param pageNo             页码
     * @param pageSize           条数
     * @author 小李
     * @date 11:40 2024/10/23
     **/
    @GetMapping("/pageByRole")
    @Operation(summary = "查待总检或待出厂检验的工单")
    public CommonResult<?> getPageByRole(DlRepairTicketsReqVO repairTicketsReqVO,
                                         @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
                                         @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
        Page<DlRepairTickets> page = new Page<>(pageNo, pageSize);
        return success(dlRepairTicketsService.getPageByRole(repairTicketsReqVO, page));
    }

    /**
     * 维修总检完成总检
     *
     * @author 小李
     * @date 16:48 2024/10/23
     * @param respVO 请求对象
    **/
    @PostMapping("/inspection")
    @Operation(summary = "维修总检完成总检")
    public CommonResult<?> inspection(@RequestBody DlRepairTicketsRespVO respVO) {
        dlRepairTicketsService.inspection(respVO);
        return CommonResult.ok();
    }

    /**
     * 服务顾问上传出厂检验日志
     *
     * @author 小李
     * @date 17:47 2024/10/23
     * @param respVO 请求对象
    **/
    @PostMapping("/confirm")
    @Operation(summary = "服务顾问上传出厂检验日志")
    public CommonResult<?> confirm(@RequestBody DlRepairTicketsRespVO respVO) {
        dlRepairTicketsService.confirm(respVO);
        return CommonResult.ok();
    }

    /**
     * 从总检的角度差维修中、已完成的工单数量
     * @author vinjor-M
     * @date 11:29 2024/10/24
     * @return cn.iocoder.yudao.framework.common.pojo.CommonResult<?>
    **/
    @GetMapping("/getBossNum")
    @Operation(summary = "从总检的角度差维修中、已完成的工单数量")
    public CommonResult<?> getBossNum() {
        return success(dlRepairTicketsService.getBossNum());
    }

    /**
     * 服务顾问通知客户取车
     *
     * @author 小李
     * @date 22:40 2024/10/23
     * @param noticeCusVO 请求对象
    **/
    @PostMapping("/noticeCus")
    @Operation(summary = "服务顾问通知客户取车")
    public CommonResult<?> noticeCus(@RequestBody NoticeCusVO noticeCusVO) {
        dlRepairTicketsService.noticeCus(noticeCusVO);
        return CommonResult.ok();
    }

    /**
     * 新增工单子项
     *
     * @author 小李
     * @date 19:59 2024/10/24
     * @param respVO 主要有两个参数，主表ID,itemList(这个需要前端处理成子表的对象能接收的数据)
    **/
    @PostMapping("/addItems")
    @Operation(summary = "新增工单子项")
    public CommonResult<?> addItems(@RequestBody DlRepairTicketsRespVO respVO) {
        dlRepairTicketsService.addItems(respVO);
        return CommonResult.ok();
    }

    /**
     * 修改工单主表，只是主表
     *
     * @author 小李
     * @date 10:25 2024/10/30
     * @param respVO 请求对象
    **/
    @PostMapping("/updateTicket")
    @Operation(summary = "修改工单主表，只是主表")
    public CommonResult<?> updateTicket(@RequestBody DlRepairTicketsRespVO respVO) {
        dlRepairTicketsService.updateTicket(respVO);
        return CommonResult.ok();
    }

    /**
     * 删除工单
     *
     * @author 小李
     * @date 20:05 2024/11/1
     * @param id 工单ID
    **/
    @DeleteMapping("/remove")
    @Operation(summary = "删除工单")
    public CommonResult<?> removeTicketById(@RequestParam("id") String id) {
        dlRepairTicketsService.removeTicketById(id);
        return CommonResult.ok();
    }
}

