工单代码:

工单状态枚举

/**
 * 工单状态枚举
 */
@Getter
public enum WorkOrderStatusEnum {
    
    /**
     * 待处理
     */
    PENDING("待处理", "新创建的工单,等待工程师接单"),
    
    /**
     * 处理中
     */
    PROCESSING("处理中", "工程师已接单,正在处理"),
    
    /**
     * 待审核
     */
    WAITING_APPROVAL("待审核", "工程师已完成处理,等待班组长/工区长审核"),
    
    /**
     * 待确认
     */
    WAITING_CONFIRMATION("待确认", "班组长/工区长已审核,等待部门主管确认"),
    
    /**
     * 已完成
     */
    COMPLETED("已完成", "工单已完成全部流程"),
    
    /**
     * 已驳回
     */
    REJECTED("已驳回", "工单被驳回,需要重新处理");
    
    /**
     * 状态代码
     */
    private final String code;
    
    /**
     * 状态描述
     */
    private final String description;
    
    WorkOrderStatusEnum(String code, String description) {
        this.code = code;
        this.description = description;
    }
    
    /**
     * 根据状态代码获取枚举
     *
     * @param code 状态代码
     * @return 对应的枚举值,如果没有找到则返回null
     */
    public static WorkOrderStatusEnum getByCode(String code) {
        for (WorkOrderStatusEnum status : values()) {
            if (status.getCode().equals(code)) {
                return status;
            }
        }
        return null;
    }
} 

工单类型枚举

/**
 * 工单类型枚举
 */
@Getter
public enum WorkOrderTypeEnum {
    
    /**
     * 故障工单
     */
    FAULT("故障", "设备故障维修工单"),
    
    /**
     * 巡检工单
     */
    INSPECTION("巡检", "设备巡检工单"),
    
    /**
     * 保养工单
     */
    MAINTENANCE("保养", "设备保养工单"),
    
    /**
     * 检测工单
     */
    TESTING("检测", "设备检测工单");
    
    /**
     * 类型代码
     */
    private final String code;
    
    /**
     * 类型描述
     */
    private final String description;
    
    WorkOrderTypeEnum(String code, String description) {
        this.code = code;
        this.description = description;
    }
    
    /**
     * 根据类型代码获取枚举
     *
     * @param code 类型代码
     * @return 对应的枚举值,如果没有找到则返回null
     */
    public static WorkOrderTypeEnum getByCode(String code) {
        for (WorkOrderTypeEnum type : values()) {
            if (type.getCode().equals(code)) {
                return type;
            }
        }
        return null;
    }
} 

工单控制器

点击查看代码
```plaintext
/**
 * 工单控制器
 */
@Slf4j
@RestController
@RequestMapping("/workorder")
public class WorkOrderController {

    @Autowired
    private WorkOrderService workOrderService;
    
    @Autowired
    private WorkOrderPhotoService workOrderPhotoService;

    /**
     * 获取工单列表
     */
    @GetMapping("/list")
    public Result<IPage<WorkOrder>> getWorkOrderList(
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "10") Integer pageSize,
            WorkOrder workOrder,
            @RequestParam(required = false) String deviceName,
            @RequestParam(required = false) String startTime,
            @RequestParam(required = false) String endTime) {
        log.info("获取工单列表请求: pageNum={}, pageSize={}, workOrder={}, deviceName={}, startTime={}, endTime={}", 
                 pageNum, pageSize, workOrder, deviceName, startTime, endTime);
        try {
            Page<WorkOrder> page = new Page<>(pageNum, pageSize);
            IPage<WorkOrder> result = workOrderService.queryWorkOrderPage(page, workOrder, deviceName, startTime, endTime);
            log.info("获取工单列表成功: 总数={}, 当前页数据条数={}", result.getTotal(), result.getRecords().size());
            return Result.success(result);
        } catch (Exception e) {
            log.error("获取工单列表失败", e);
            return Result.fail("获取工单列表失败: " + e.getMessage());
        }
    }

    /**
     * 获取工单详情
     */
    @GetMapping("/detail/{id}")
    public Result<WorkOrder> getWorkOrderDetail(@PathVariable Long id) {
        WorkOrder workOrder = workOrderService.getById(id);
        if (workOrder == null) {
            return Result.fail("工单不存在");
        }
        return Result.success(workOrder);
    }

    /**
     * 创建工单
     */
    @PostMapping("/create")
    public Result<Long> createWorkOrder(@RequestBody WorkOrder workOrder) {
        Long orderId = workOrderService.createWorkOrder(workOrder);
        return Result.success(orderId);
    }

    /**
     * 工程师接单
     */
    @PostMapping("/accept")
    public Result<Boolean> acceptWorkOrder(@RequestBody Map<String, Object> params) {
        Long id = Long.valueOf(params.get("id").toString());
        Long engineerId = Long.valueOf(params.get("engineerId").toString());
        boolean success = workOrderService.acceptWorkOrder(id, engineerId);
        return success ? Result.success(true) : Result.fail("接单失败");
    }

    /**
     * 工程师完成工单
     */
    @PostMapping("/complete")
    public Result<Boolean> completeWorkOrder(@RequestBody Map<String, Object> params) {
        Long id = Long.valueOf(params.get("id").toString());
        String repairResult = params.get("repairResult").toString();
        String repairMethod = params.get("repairMethod").toString();
        boolean success = workOrderService.completeWorkOrder(id, repairResult, repairMethod);
        return success ? Result.success(true) : Result.fail("完成工单失败");
    }

    /**
     * 审核工单(班组长/工区长审核)
     */
    @PostMapping("/approve")
    public Result<Boolean> approveWorkOrder(@RequestBody Map<String, Object> params) {
        Long id = Long.valueOf(params.get("id").toString());
        Long approverId = Long.valueOf(params.get("approverId").toString());
        String approvalType = params.get("approvalType").toString();
        String approvalOpinion = params.get("approvalOpinion").toString();
        Boolean isApproved = Boolean.valueOf(params.get("isApproved").toString());
        
        // 验证人脸识别是否通过
        Boolean faceVerified = Boolean.valueOf(params.get("faceVerified").toString());
        if (!faceVerified) {
            return Result.fail("人脸验证未通过,无法进行审核");
        }
        
        boolean success = workOrderService.approveWorkOrder(id, approverId, approvalType, approvalOpinion, isApproved);
        return success ? Result.success(true) : Result.fail("审核失败");
    }

    /**
     * 主管确认工单(部门主管审核,最终销号)
     */
    @PostMapping("/confirm")
    public Result<Boolean> confirmWorkOrder(@RequestBody Map<String, Object> params) {
        Long id = Long.valueOf(params.get("id").toString());
        Long managerId = Long.valueOf(params.get("approverId").toString());
        Integer satisfactionScore = Integer.valueOf(params.get("satisfactionScore").toString());
        String comment = params.get("approvalOpinion").toString();
        
        // 验证人脸识别是否通过
        Boolean faceVerified = Boolean.valueOf(params.get("faceVerified").toString());
        if (!faceVerified) {
            return Result.fail("人脸验证未通过,无法进行确认");
        }
        
        // 获取电子签名数据
        String signature = null;
        if (params.containsKey("signature") && params.get("signature") != null) {
            signature = params.get("signature").toString();
        }
        
        // 创建签名记录(如果有签名)
        if (signature != null && !signature.isEmpty()) {
            // 这里可以添加将签名图片保存到服务器的逻辑
            log.info("接收到电子签名数据,长度: {}", signature.length());
            
            // 如果需要,可以将base64签名数据保存为图片文件
            // saveSignatureAsImage(signature, id, managerId);
        }
        
        boolean success = workOrderService.confirmWorkOrder(id, managerId, satisfactionScore, comment, signature);
        return success ? Result.success(true) : Result.fail("确认失败");
    }
    
    /**
     * 上传工单照片
     */
    @PostMapping("/upload-photo")
    public Result<String> uploadPhoto(
            @RequestParam("file") MultipartFile file,
            @RequestParam("orderId") Long orderId,
            @RequestParam("photoType") String photoType) {
        
        try {
            String photoUrl = workOrderPhotoService.uploadPhoto(file, orderId, photoType);
            return Result.success(photoUrl);
        } catch (Exception e) {
            log.error("上传照片失败", e);
            return Result.fail("上传照片失败: " + e.getMessage());
        }
    }
    
    /**
     * 检查照片质量
     */
    @PostMapping("/check-photo-quality")
    public Result<Map<String, Object>> checkPhotoQuality(@RequestBody Map<String, Object> params) {
        try {
            String photoUrl = params.get("photoUrl").toString();
            Map<String, Object> result = workOrderPhotoService.checkPhotoQuality(photoUrl);
            return Result.success(result);
        } catch (Exception e) {
            log.error("检查照片质量失败", e);
            return Result.fail("检查照片质量失败: " + e.getMessage());
        }
    }
    
    /**
     * 获取工单照片
     */
    @GetMapping("/photos")
    public Result<List<WorkOrderPhoto>> getWorkOrderPhotos(
            @RequestParam("orderId") Long orderId,
            @RequestParam("photoType") String photoType) {
        
        List<WorkOrderPhoto> photos = workOrderPhotoService.getPhotosByOrderIdAndType(orderId, photoType);
        return Result.success(photos);
    }
    
    /**
     * 删除工单照片
     */
    @DeleteMapping("/photo/{id}")
    public Result<Boolean> deletePhoto(@PathVariable Long id) {
        boolean success = workOrderPhotoService.removeById(id);
        return success ? Result.success(true) : Result.fail("删除照片失败");
    }
    
    /**
     * 导出工单列表
     */
    @GetMapping("/export")
    public void exportWorkOrders(
            HttpServletResponse response,
            WorkOrder workOrder,
            @RequestParam(required = false) String deviceName,
            @RequestParam(required = false) String startTime,
            @RequestParam(required = false) String endTime) {
        log.info("导出工单列表请求: workOrder={}, deviceName={}, startTime={}, endTime={}", 
                 workOrder, deviceName, startTime, endTime);
        try {
            // 查询所有符合条件的工单,不分页
            List<WorkOrder> workOrders = workOrderService.queryWorkOrderList(workOrder, deviceName, startTime, endTime);
            log.info("导出工单数据查询成功: 总数={}", workOrders.size());
            
            // 设置响应头
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            String fileName = URLEncoder.encode("工单列表_" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()), "UTF-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
            
            // 直接使用POI API而不是EasyExcel
            try (XSSFWorkbook workbook = new XSSFWorkbook()) {
                Sheet sheet = workbook.createSheet("工单列表");
                
                // 设置表头
                Row headerRow = sheet.createRow(0);
                String[] headers = {"工单编号", "工单类型", "工单状态", "优先级", "工单描述", "设备名称", "设备位置",
                                   "创建时间", "更新时间", "开始时间", "完成时间", "维修方法", "维修结果", "处理人员", "创建人"};
                
                CellStyle headerStyle = workbook.createCellStyle();
                headerStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
                headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
                headerStyle.setAlignment(HorizontalAlignment.CENTER);
                Font headerFont = workbook.createFont();
                headerFont.setBold(true);
                headerStyle.setFont(headerFont);
                
                for (int i = 0; i < headers.length; i++) {
                    Cell cell = headerRow.createCell(i);
                    cell.setCellValue(headers[i]);
                    cell.setCellStyle(headerStyle);
                    sheet.setColumnWidth(i, 20 * 256); // 设置列宽
                }
                
                // 日期格式
                CellStyle dateStyle = workbook.createCellStyle();
                CreationHelper createHelper = workbook.getCreationHelper();
                dateStyle.setDataFormat(createHelper.createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss"));
                
                // 填充数据
                int rowNum = 1;
                for (WorkOrder order : workOrders) {
                    Row row = sheet.createRow(rowNum++);
                    
                    // 转换为需要的VO数据
                    String orderTypeName = getOrderTypeName(order.getOrderType());
                    String statusName = getStatusName(order.getStatus());
                    String priorityName = getPriorityName(order.getPriority());
                    
                    // 获取设备和人员信息
                    String deviceNameStr = "设备" + order.getDeviceId();
                    String deviceLocation = "位置信息";
                    String engineerName = "工程师" + order.getEngineerId();
                    String creatorName = "创建人";
                    
                    try {
                        // 这里可以通过设备服务和用户服务获取更详细的信息
                    } catch (Exception e) {
                        log.warn("获取设备或人员信息失败", e);
                    }
                    
                    // 填充单元格
                    row.createCell(0).setCellValue(order.getOrderNo());
                    row.createCell(1).setCellValue(orderTypeName);
                    row.createCell(2).setCellValue(statusName);
                    row.createCell(3).setCellValue(priorityName);
                    row.createCell(4).setCellValue(order.getDescription());
                    row.createCell(5).setCellValue(deviceNameStr);
                    row.createCell(6).setCellValue(deviceLocation);
                    
                    // 处理日期字段
                    if (order.getCreatedTime() != null) {
                        Cell cell = row.createCell(7);
                        cell.setCellValue(order.getCreatedTime());
                        cell.setCellStyle(dateStyle);
                    } else {
                        row.createCell(7).setCellValue("");
                    }
                    
                    if (order.getUpdatedTime() != null) {
                        Cell cell = row.createCell(8);
                        cell.setCellValue(order.getUpdatedTime());
                        cell.setCellStyle(dateStyle);
                    } else {
                        row.createCell(8).setCellValue("");
                    }
                    
                    if (order.getStartTime() != null) {
                        Cell cell = row.createCell(9);
                        cell.setCellValue(order.getStartTime());
                        cell.setCellStyle(dateStyle);
                    } else {
                        row.createCell(9).setCellValue("");
                    }
                    
                    if (order.getEndTime() != null) {
                        Cell cell = row.createCell(10);
                        cell.setCellValue(order.getEndTime());
                        cell.setCellStyle(dateStyle);
                    } else {
                        row.createCell(10).setCellValue("");
                    }
                    
                    row.createCell(11).setCellValue(order.getRepairMethod());
                    row.createCell(12).setCellValue(order.getRepairResult());
                    row.createCell(13).setCellValue(engineerName);
                    row.createCell(14).setCellValue(creatorName);
                }
                
                // 写入响应输出流
                workbook.write(response.getOutputStream());
            }
            
            log.info("工单导出成功");
        } catch (Exception e) {
            log.error("工单导出失败", e);
            // 导出错误时无法直接返回Result,设置错误响应
            try {
                response.reset();
                response.setContentType("application/json");
                response.setCharacterEncoding("utf-8");
                response.getWriter().println(JSON.toJSONString(Result.fail("导出工单失败: " + e.getMessage())));
            } catch (IOException ex) {
                log.error("导出错误处理失败", ex);
            }
        }
    }
    
    /**
     * 获取工单类型名称
     */
    private String getOrderTypeName(String orderType) {
        if (orderType == null) return "";
        
        if (WorkOrderTypeEnum.FAULT.getCode().equals(orderType)) {
            return "故障报修";
        } else if (WorkOrderTypeEnum.INSPECTION.getCode().equals(orderType)) {
            return "设备巡检";
        } else if (WorkOrderTypeEnum.MAINTENANCE.getCode().equals(orderType)) {
            return "设备保养";
        } else if (WorkOrderTypeEnum.TESTING.getCode().equals(orderType)) {
            return "设备检测";
        }
        
        return orderType;
    }
    
    /**
     * 获取工单状态名称
     */
    private String getStatusName(String status) {
        if (status == null) return "";
        
        if (WorkOrderStatusEnum.PENDING.getCode().equals(status)) {
            return "待处理";
        } else if (WorkOrderStatusEnum.PROCESSING.getCode().equals(status)) {
            return "处理中";
        } else if (WorkOrderStatusEnum.WAITING_APPROVAL.getCode().equals(status)) {
            return "待审核";
        } else if (WorkOrderStatusEnum.WAITING_CONFIRMATION.getCode().equals(status)) {
            return "待确认";
        } else if (WorkOrderStatusEnum.COMPLETED.getCode().equals(status)) {
            return "已完成";
        } else if (WorkOrderStatusEnum.REJECTED.getCode().equals(status)) {
            return "已驳回";
        }
        
        return status;
    }
    
    /**
     * 获取优先级名称
     */
    private String getPriorityName(String priority) {
        if (priority == null) return "";
        
        if (WorkOrderConstants.PRIORITY_LOW.equals(priority)) {
            return "低";
        } else if (WorkOrderConstants.PRIORITY_MEDIUM.equals(priority)) {
            return "中";
        } else if (WorkOrderConstants.PRIORITY_HIGH.equals(priority)) {
            return "高";
        } else if (WorkOrderConstants.PRIORITY_URGENT.equals(priority)) {
            return "紧急";
        }
        
        return priority;
    }

    /**
     * 批量检查故障照片质量
     */
    @PostMapping("/check-fault-photos")
    public Result<Map<String, Object>> checkFaultPhotos(@RequestBody Map<String, Object> params) {
        try {
            String photoType = params.get("photoType").toString();
            @SuppressWarnings("unchecked")
            List<String> photoUrls = (List<String>) params.get("photoUrls");
            
            Map<String, Object> result = workOrderPhotoService.checkFaultPhotoQuality(photoType, photoUrls);
            return Result.success(result);
        } catch (Exception e) {
            log.error("批量检查故障照片质量失败", e);
            return Result.fail("批量检查故障照片质量失败: " + e.getMessage());
        }
    }
    
    /**
     * 故障销号
     */
    @PostMapping("/cancel-fault")
    public Result<Boolean> cancelFault(@RequestBody Map<String, Object> params) {
        try {
            log.info("开始处理故障销号请求: {}", params);
            if (!params.containsKey("id")) {
                return Result.fail("缺少工单ID参数");
            }
            
            if (!params.containsKey("approverId")) {
                return Result.fail("缺少审批人ID参数");
            }
            
            Long id = Long.valueOf(params.get("id").toString());
            Long approverId = Long.valueOf(params.get("approverId").toString());
            
            log.info("故障销号参数: 工单ID={}, 审批人ID={}", id, approverId);
            boolean success = workOrderService.cancelFault(id, approverId);
            
            if (success) {
                log.info("故障销号成功,工单ID: {}", id);
                return Result.success(true);
            } else {
                log.warn("故障销号失败,工单ID: {}", id);
                return Result.fail("故障销号处理失败");
            }
        } catch (Exception e) {
            log.error("故障销号处理异常", e);
            return Result.fail("故障销号处理异常: " + e.getMessage());
        }
    }
} 
</details>
posted on 2025-04-29 21:25  -MARIO  阅读(31)  评论(0)    收藏  举报