diff --git a/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/controller/ExcelController.java b/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/controller/ExcelController.java index b16e8de..3e5e03d 100644 --- a/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/controller/ExcelController.java +++ b/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/controller/ExcelController.java @@ -80,6 +80,9 @@ public class ExcelController { @PostMapping("/ExportWorkOrderInfo") public void ExportWorkOrderInfo(WorkOrderInfoBo bo, HttpServletResponse response) throws IOException { List list = workOrderInfoService.queryList(bo); + + // TODO 填充数据 + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); String flag = "工单信息"; diff --git a/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/controller/WorkOrderInfoController.java b/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/controller/WorkOrderInfoController.java index e74ffd0..cdd3ff7 100644 --- a/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/controller/WorkOrderInfoController.java +++ b/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/controller/WorkOrderInfoController.java @@ -215,4 +215,10 @@ public class WorkOrderInfoController extends BaseController { String unitName = workOrderInfoService.getMaintenanceUnit(workOrderId); return R.ok("获取对应的运维单位信息!", unitName); } + + @GetMapping("/getOverTimeCost") + public R getOverTimeCost(String workOrderId ) { + WorkOrderInfoVo rs = workOrderInfoService.getOverTimeCost(workOrderId); + return R.ok(rs); + } } diff --git a/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/domain/vo/WorkOrderInfoVo.java b/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/domain/vo/WorkOrderInfoVo.java index 199f612..f45d74c 100644 --- a/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/domain/vo/WorkOrderInfoVo.java +++ b/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/domain/vo/WorkOrderInfoVo.java @@ -222,4 +222,35 @@ public class WorkOrderInfoVo implements Serializable { * 剩余接单时间 */ private String orderAcceptDeadline; + + @ExcelProperty(value = "延期理由") + private String delayReason; + + /** + * 延期时间 + */ + @ExcelProperty(value = "延期时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date delayTime; + + + @ExcelProperty(value = "是否延期") + private String isDelay; + + @ExcelProperty(value = "是否超期") + private String isTimeOut; + + + @ExcelProperty(value = "响应超时(单位:小时)") + private int handleTimeOutCount; + + @ExcelProperty(value = "接单超时(单位:小时)") + private int orderAcceptTimeOutCount; + + @ExcelProperty(value = "响应超期扣款") + private Double handleTimeOutCost; + + @ExcelProperty(value = "接单超期扣款") + private Double orderAcceptTimeOutCost; + } diff --git a/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/IWorkOrderInfoService.java b/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/IWorkOrderInfoService.java index b0c7e29..c969d4f 100644 --- a/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/IWorkOrderInfoService.java +++ b/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/IWorkOrderInfoService.java @@ -136,4 +136,8 @@ public interface IWorkOrderInfoService { String getMaintenanceUnit(String workOrderId); TableDataInfo dealWithListForApp(WorkOrderInfoBo bo, PageQuery pageQuery); + + List queryListForExport(WorkOrderInfoBo bo); + + WorkOrderInfoVo getOverTimeCost(String workOrderId); } diff --git a/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/impl/WorkOrderInfoServiceImpl.java b/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/impl/WorkOrderInfoServiceImpl.java index db0bfc4..67e9060 100644 --- a/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/impl/WorkOrderInfoServiceImpl.java +++ b/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/impl/WorkOrderInfoServiceImpl.java @@ -37,6 +37,8 @@ import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; /** @@ -307,7 +309,7 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { return flag; } - + // 规范格式,如:01时02分03秒 public static String formatDuration(int seconds) { int hours = seconds / 3600; int minutes = (seconds % 3600) / 60; @@ -483,6 +485,22 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { // 如果没有找到接单记录或没有接单时间,可以设为默认值 record.setRestTime("暂无接单信息"); } + // 二次派遣不会重新计算时间 还是按照第一次接单时间来计算 + if (record.getStatus() == 9) { + // 处理时间不会重置 + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + qw.eq(WorkOrderProcess::getWorkOrderId, workOrderId); + qw.eq(WorkOrderProcess::getStage, "故障接单"); + // 按照时间降序排,最新的记录在最前面 + qw.orderByAsc(WorkOrderProcess::getCreateTime); + qw.last("LIMIT 1"); + WorkOrderProcess latest = workOrderProcessMapper.selectOne(qw); + Date operationTime = latest.getOperationTime(); + // 单位:小时 + Long responseTime = record.getResponseTime(); + record.setRestTime(getTimeLeft(operationTime, responseTime)); + } + // 设置延期信息 if (record.getStatus() == 7){ WorkOrderDelayVo delayVo = workOrderDelayService.queryById(Long.valueOf(workOrderId)); @@ -1383,4 +1401,156 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { return TableDataInfo.build(result); } + @Override + public List queryListForExport(WorkOrderInfoBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + List orderInfoVoList = baseMapper.selectVoList(lqw); + + for (WorkOrderInfoVo record : orderInfoVoList) { + String handleTimeOutSituation = ""; + String orderAcceptTimeOutSituation = ""; + String workOrderId = record.getId(); + String projectName = record.getProjectName(); + // 根据项目名称获取接单超期信息 + LambdaQueryWrapper projectQueryWrapper = new LambdaQueryWrapper<>(); + projectQueryWrapper.eq(ProjectInfo::getProjectName, projectName); + projectQueryWrapper.last("LIMIT 1"); + ProjectInfo projectInfo = projectInfoMapper.selectOne(projectQueryWrapper); + String orderTakingOverTime = projectInfo.getOrderTakingOverTime(); + String orderTakingCost = projectInfo.getOrderTakingCost(); + String handleTimeOutCost = projectInfo.getHandleCost(); + + // 1.接单超时 --> 参考时间:事件转派 故障派遣 + LambdaQueryWrapper takeOrderQueryWrapper = new LambdaQueryWrapper<>(); + takeOrderQueryWrapper.eq(WorkOrderProcess::getWorkOrderId, workOrderId); + takeOrderQueryWrapper.in(WorkOrderProcess::getStage, "故障派遣", "事件转派"); + takeOrderQueryWrapper.orderByDesc(WorkOrderProcess::getCreateTime); + takeOrderQueryWrapper.last("LIMIT 1"); + WorkOrderProcess takeOrderProcess = workOrderProcessMapper.selectOne(takeOrderQueryWrapper); + if (takeOrderProcess != null && takeOrderProcess.getOperationTime() != null) { + orderAcceptTimeOutSituation = getTimeLeft(takeOrderProcess.getOperationTime(),Long.valueOf(orderTakingOverTime)); + } + + // 2.响应超时(处理超时) --> 参考时间: 故障接单 + LambdaQueryWrapper dealQueryWrapper = new LambdaQueryWrapper<>(); + dealQueryWrapper.eq(WorkOrderProcess::getWorkOrderId, workOrderId); + dealQueryWrapper.eq(WorkOrderProcess::getStage, "故障接单"); + dealQueryWrapper.orderByDesc(WorkOrderProcess::getCreateTime); + dealQueryWrapper.last("LIMIT 1"); + WorkOrderProcess dealProcess = workOrderProcessMapper.selectOne(dealQueryWrapper); + if (dealProcess != null && dealProcess.getOperationTime() != null) { + handleTimeOutSituation = getTimeLeft(dealProcess.getOperationTime(),record.getResponseTime() ); + } + + + if (handleTimeOutSituation.startsWith("超时")) { + int timeoutHours = calculateTotalTimeoutHours(handleTimeOutSituation); + record.setHandleTimeOutCount(timeoutHours); + record.setHandleTimeOutCost(timeoutHours * Double.valueOf(handleTimeOutCost)); + } + if (orderAcceptTimeOutSituation.startsWith("超时")) { + int timeoutHours = calculateTotalTimeoutHours(orderAcceptTimeOutSituation); + record.setOrderAcceptTimeOutCount(timeoutHours); + record.setHandleTimeOutCost(timeoutHours * Double.valueOf(orderTakingCost)); + } + } + + return orderInfoVoList; + } + + @Override + public WorkOrderInfoVo getOverTimeCost(String workOrderId) { + WorkOrderInfoVo record = baseMapper.selectVoById(workOrderId); + String handleTimeOutSituation = ""; + String orderAcceptTimeOutSituation = ""; + String projectName = record.getProjectName(); + // 根据项目名称获取接单超期信息 + LambdaQueryWrapper projectQueryWrapper = new LambdaQueryWrapper<>(); + projectQueryWrapper.eq(ProjectInfo::getProjectName, projectName); + projectQueryWrapper.last("LIMIT 1"); + ProjectInfo projectInfo = projectInfoMapper.selectOne(projectQueryWrapper); + String orderTakingOverTime = projectInfo.getOrderTakingOverTime(); + String orderTakingCost = projectInfo.getOrderTakingCost(); + String handleTimeOutCost = projectInfo.getHandleCost(); + + // 1.接单超时 --> 参考时间:事件转派 故障派遣 + LambdaQueryWrapper takeOrderQueryWrapper = new LambdaQueryWrapper<>(); + takeOrderQueryWrapper.eq(WorkOrderProcess::getWorkOrderId, workOrderId); + takeOrderQueryWrapper.in(WorkOrderProcess::getStage, "故障派遣", "事件转派"); + takeOrderQueryWrapper.orderByDesc(WorkOrderProcess::getCreateTime); + takeOrderQueryWrapper.last("LIMIT 1"); + WorkOrderProcess takeOrderProcess = workOrderProcessMapper.selectOne(takeOrderQueryWrapper); + if (takeOrderProcess != null && takeOrderProcess.getOperationTime() != null) { + orderAcceptTimeOutSituation = getTimeLeft(takeOrderProcess.getOperationTime(),Long.valueOf(orderTakingOverTime)); + } + + // 2.响应超时(处理超时) --> 参考时间: 故障接单 + LambdaQueryWrapper dealQueryWrapper = new LambdaQueryWrapper<>(); + dealQueryWrapper.eq(WorkOrderProcess::getWorkOrderId, workOrderId); + dealQueryWrapper.eq(WorkOrderProcess::getStage, "故障接单"); + dealQueryWrapper.orderByDesc(WorkOrderProcess::getCreateTime); + dealQueryWrapper.last("LIMIT 1"); + WorkOrderProcess dealProcess = workOrderProcessMapper.selectOne(dealQueryWrapper); + if (dealProcess != null && dealProcess.getOperationTime() != null) { + handleTimeOutSituation = getTimeLeft(dealProcess.getOperationTime(),record.getResponseTime() ); + } + + + if (handleTimeOutSituation.startsWith("超时")) { + int timeoutHours = calculateTotalTimeoutHours(handleTimeOutSituation); + record.setHandleTimeOutCount(timeoutHours); + record.setHandleTimeOutCost(timeoutHours * Double.parseDouble(handleTimeOutCost)); + } + if (orderAcceptTimeOutSituation.startsWith("超时")) { + int timeoutHours = calculateTotalTimeoutHours(orderAcceptTimeOutSituation); + record.setOrderAcceptTimeOutCount(timeoutHours); + record.setHandleTimeOutCost(timeoutHours * Double.parseDouble(orderTakingCost)); + } + return record; + } + + /** + * 截取“超时”后面的部分 + */ + private String extractTimePart(String input) { + if (!input.startsWith("超时")) { + throw new IllegalArgumentException("输入必须以 '超时' 开头"); + } + return input.substring(2); // 去掉前两个字“超时” + } + + /** + * 使用正则表达式解析出天、小时、分钟 + */ + private int[] parseTime(String timeStr) { + Pattern pattern = Pattern.compile( + "(\\d+)[天]*(\\d+)[小时]*(\\d+)[分]*" + ); + Matcher matcher = pattern.matcher(timeStr); + + if (!matcher.matches()) { + throw new IllegalArgumentException("时间格式不正确,应为 'X天Y小时Z分',例如:'2天22小时48分'"); + } + + int days = Integer.parseInt(matcher.group(1)); + int hours = Integer.parseInt(matcher.group(2)); + int minutes = Integer.parseInt(matcher.group(3)); + + return new int[]{days, hours, minutes}; + } + + public int calculateTotalTimeoutHours(String input) { + // 步骤一:截取“超时”后面的部分 + String timePart = extractTimePart(input); + + // 步骤二:解析天、小时、分钟 + int[] timeValues = parseTime(timePart); + + int days = timeValues[0]; + int hours = timeValues[1]; + int minutes = timeValues[2]; + + // 步骤三:计算总计超时小时数 + return days * 24 + hours + (minutes >= 1 ? 1 : 0); + } }