From b73bcca46598af4a9526d9fdb754b7617b76b121 Mon Sep 17 00:00:00 2001 From: gjh <1421wake> Date: Wed, 30 Apr 2025 10:53:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E5=8D=95=E5=A4=84=E7=90=86=E5=89=A9?= =?UTF-8?q?=E4=BD=99=E6=97=B6=E9=97=B4=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/domain/vo/WorkOrderInfoVo.java | 5 + .../service/impl/WorkDealInfoServiceImpl.java | 5 +- .../impl/WorkOrderInfoServiceImpl.java | 95 +++++++++++++++++-- 3 files changed, 94 insertions(+), 11 deletions(-) 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 a631124..344efdb 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 @@ -204,4 +204,9 @@ public class WorkOrderInfoVo implements Serializable { * 待处理人 */ private String handler; + + /** + * 剩余时间 + */ + private String restTime; } diff --git a/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/impl/WorkDealInfoServiceImpl.java b/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/impl/WorkDealInfoServiceImpl.java index 013f084..4737dd4 100644 --- a/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/impl/WorkDealInfoServiceImpl.java +++ b/ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/impl/WorkDealInfoServiceImpl.java @@ -1,5 +1,6 @@ package org.dromara.platform.service.impl; +import cn.hutool.core.util.ObjectUtil; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -146,8 +147,10 @@ public class WorkDealInfoServiceImpl implements IWorkDealInfoService { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(WorkDealInfo::getWorkOrderId, workOrderId); WorkDealInfo workDealInfo = baseMapper.selectOne(queryWrapper); + if (ObjectUtil.isNull(workDealInfo)) { + return null; + } String attachment = workDealInfo.getAttachment(); - // 封装返回附件信息 if (StringUtils.isNotBlank(attachment)) { AttachmentSerializer serializer = new AttachmentSerializer(); 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 5a18460..9c711ae 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 @@ -1,13 +1,9 @@ package org.dromara.platform.service.impl; -import cn.hutool.core.date.DateTime; -import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.annotations.Param; -import org.apache.poi.hssf.record.DVALRecord; import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; @@ -28,9 +24,7 @@ import org.dromara.workflow.domain.bo.StartProcessBo; import org.dromara.workflow.domain.bo.TaskBo; import org.dromara.workflow.domain.bo.TestLeaveBo; import org.dromara.workflow.domain.vo.TaskVo; -import org.dromara.workflow.domain.vo.TestLeaveVo; import org.flowable.engine.RuntimeService; -import org.flowable.engine.runtime.ProcessInstance; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -202,6 +196,7 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { boolean flag = baseMapper.insert(add) > 0; if (flag) { + // 自动生成的工单id String generatedId = add.getId(); bo.setId(generatedId); // 设置到bo对象中 String isDispatched = bo.getIsDispatched(); @@ -218,10 +213,16 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { workOrderProcess1.setOperationTime(date1); workOrderProcess1.setFeedback("故障以上报,等待派遣"); - workOrderProcessService.insertByBo(workOrderProcess1); - //TODO 修改对应的工单的状态 :待派遣 + if ( workOrderProcessService.insertByBo(workOrderProcess1)){ + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(WorkOrderInfo::getId, generatedId) + .set(WorkOrderInfo::getStatus, 0); + baseMapper.update(null, updateWrapper); + log.info("修改对应的工单的状态 :待派遣"); + } + if (StringUtils.equals(isDispatched, "是")) { - //TODO 修改对应的工单的状态 待接单 + WorkOrderProcessBo workOrderProcess2 = new WorkOrderProcessBo(); workOrderProcess2.setWorkOrderId(generatedId); workOrderProcess2.setOperator(loginUser.getNickname()); @@ -240,7 +241,12 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { long durationInSeconds = duration.getSeconds(); String formatDuration = formatDuration((int) durationInSeconds); workOrderProcess2.setDuration(formatDuration); - workOrderProcessService.insertByBo(workOrderProcess2); + if(workOrderProcessService.insertByBo(workOrderProcess2)){ + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(WorkOrderInfo::getId, generatedId) + .set(WorkOrderInfo::getStatus, 1); + baseMapper.update(null, updateWrapper); + log.info("修改对应的工单的状态 :待接单"); } } } @@ -381,10 +387,79 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { List filterRecords = records.stream() .filter(record -> record.getStatus() != null && record.getStatus() < 4) .collect(Collectors.toList()); + + // 封装 + for (WorkOrderInfoVo record : filterRecords) { + String workOrderId = record.getId(); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(WorkOrderProcess::getWorkOrderId, workOrderId); + queryWrapper.eq(WorkOrderProcess::getStage, "故障接单"); + + WorkOrderProcess target = workOrderProcessMapper.selectOne(queryWrapper); + + if (target != null && target.getOperationTime() != null) { + Date operationTime = target.getOperationTime(); + // 单位:小时 + Long responseTime = record.getResponseTime(); + // 设置剩余时间提示 + record.setRestTime(getTimeLeft(operationTime, responseTime)); + } else { + // 如果没有找到接单记录或没有接单时间,可以设为默认值 + record.setRestTime("暂无接单信息"); + } + } + + result.setRecords(filterRecords); return TableDataInfo.build(result); } + /** + * 计算距离响应截止时间的剩余/超时时间 + * + * @param acceptTime 接单时间(Date) + * @param responseHour 响应时间要求(单位:小时) + * @return 格式化的时间字符串,如:"剩余2天3小时4分" 或 "超时5小时6分" + */ + public String getTimeLeft(Date acceptTime, Long responseHour) { + if (acceptTime == null || responseHour == null || responseHour <= 0) { + return "无响应时间限制"; + } + + // 当前时间 + LocalDateTime now = LocalDateTime.now(); + + // 接单时间转为 LocalDateTime + LocalDateTime acceptDateTime = acceptTime.toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDateTime(); + + // 截止时间 = 接单时间 + 响应时间(小时) + LocalDateTime dueDateTime = acceptDateTime.plusHours(responseHour); + + Duration duration; + boolean isOverdue; + + if (now.isAfter(dueDateTime)) { + duration = Duration.between(dueDateTime, now); + isOverdue = true; + } else { + duration = Duration.between(now, dueDateTime); + isOverdue = false; + } + + long days = duration.toDays(); + long hours = duration.toHours() % 24; + long minutes = duration.toMinutes() % 60; + + if (isOverdue) { + return String.format("超时%d天%d小时%d分", days, hours, minutes); + } else { + return String.format("剩余%d天%d小时%d分", days, hours, minutes); + } + } + @Override public TableDataInfo reviewList(WorkOrderInfoBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo);