工单代码:
工单状态枚举
/**
* 工单状态枚举
*/
@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>
浙公网安备 33010602011771号