|
|
@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
|
|
|
import jakarta.annotation.Resource; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
import org.dromara.common.core.domain.model.LoginUser; |
|
|
|
import org.dromara.common.core.exception.ServiceException; |
|
|
|
import org.dromara.common.core.utils.DateUtils; |
|
|
|
import org.dromara.common.core.utils.MapstructUtils; |
|
|
|
import org.dromara.common.core.utils.StringUtils; |
|
|
@ -32,6 +33,7 @@ import org.dromara.platform.domain.vo.WorkOrderInfoVo; |
|
|
|
import org.dromara.workflow.service.IActTaskService; |
|
|
|
|
|
|
|
import java.time.Duration; |
|
|
|
import java.time.Instant; |
|
|
|
import java.time.LocalDateTime; |
|
|
|
import java.time.ZoneId; |
|
|
|
import java.time.format.DateTimeFormatter; |
|
|
@ -172,32 +174,7 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { |
|
|
|
@Autowired |
|
|
|
private IActTaskService actTaskService; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private RuntimeService runtimeService; |
|
|
|
public void startLeaveProcess(TestLeaveBo leaveBo) { |
|
|
|
// 创建并保存请假记录
|
|
|
|
//TestLeaveVo leaveVo = testLeaveService.insertByBo(leaveBo);
|
|
|
|
|
|
|
|
// 启动流程参数
|
|
|
|
StartProcessBo startProcessBo = new StartProcessBo(); |
|
|
|
// 设置流程对应的业务表
|
|
|
|
startProcessBo.setTableName("work_order_info"); |
|
|
|
// 设置业务主键
|
|
|
|
//startProcessBo.setBusinessKey(leaveVo.getId().toString());
|
|
|
|
// 设置流程变量
|
|
|
|
// Map<String, Object> variables = new HashMap<>();
|
|
|
|
// variables.put("applyUserId", getUserId());
|
|
|
|
// variables.put("leaveType", leaveBo.getLeaveType());
|
|
|
|
// variables.put("startDate", leaveBo.getStartDate());
|
|
|
|
// variables.put("endDate", leaveBo.getEndDate());
|
|
|
|
// variables.put("leaveDays", leaveBo.getLeaveDays());
|
|
|
|
// variables.put("reason", leaveBo.getRemark());
|
|
|
|
// startProcessBo.setVariables(variables);
|
|
|
|
|
|
|
|
// 启动流程实例
|
|
|
|
Map<String, Object> result = actTaskService.startWorkFlow(startProcessBo); |
|
|
|
|
|
|
|
} |
|
|
|
/** |
|
|
|
* 新增工单信息 |
|
|
|
* |
|
|
@ -368,6 +345,11 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { |
|
|
|
|
|
|
|
@Override |
|
|
|
public void takeOrder(String workOrderId) { |
|
|
|
WorkOrderInfoVo workOrderInfoVo = baseMapper.selectVoById(workOrderId); |
|
|
|
if (workOrderInfoVo.getStatus() != 1){ |
|
|
|
throw new ServiceException("当前工单状态未处于:待接单状态,不能进行接单操作!"); |
|
|
|
} |
|
|
|
|
|
|
|
// 1.获取当前用户登录信息
|
|
|
|
LoginUser loginUser = LoginHelper.getLoginUser(); |
|
|
|
WorkOrderProcessBo workOrderProcess = new WorkOrderProcessBo(); |
|
|
@ -422,7 +404,6 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { |
|
|
|
// 封装
|
|
|
|
for (WorkOrderInfoVo record : filterRecords) { |
|
|
|
String workOrderId = record.getId(); |
|
|
|
|
|
|
|
LambdaQueryWrapper<WorkOrderProcess> queryWrapper = new LambdaQueryWrapper<>(); |
|
|
|
queryWrapper.eq(WorkOrderProcess::getWorkOrderId, workOrderId); |
|
|
|
queryWrapper.eq(WorkOrderProcess::getStage, "故障接单"); |
|
|
@ -439,6 +420,18 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { |
|
|
|
// 如果没有找到接单记录或没有接单时间,可以设为默认值
|
|
|
|
record.setRestTime("暂无接单信息"); |
|
|
|
} |
|
|
|
// 设置延期信息
|
|
|
|
if (record.getStatus() == 7){ |
|
|
|
WorkOrderDelayVo delayVo = workOrderDelayService.queryById(Long.valueOf(workOrderId)); |
|
|
|
if (delayVo != null){ |
|
|
|
Date afterDelayTime = delayVo.getAfterDelayTime(); |
|
|
|
// 将 Date 转换为 Instant
|
|
|
|
Instant instant = afterDelayTime.toInstant(); |
|
|
|
ZoneId zone = ZoneId.of("Asia/Shanghai"); |
|
|
|
LocalDateTime dueDateTime = instant.atZone(zone).toLocalDateTime(); |
|
|
|
record.setRestTime(getTimeLeft(dueDateTime)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -491,6 +484,32 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public String getTimeLeft(LocalDateTime dueDateTime ) { |
|
|
|
// 当前时间
|
|
|
|
LocalDateTime now = LocalDateTime.now(); |
|
|
|
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<WorkOrderInfoVo> reviewList(WorkOrderInfoBo bo, PageQuery pageQuery) { |
|
|
|
LambdaQueryWrapper<WorkOrderInfo> lqw = buildQueryWrapper(bo); |
|
|
@ -520,7 +539,15 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { |
|
|
|
workDealInfo.setFixTime(new Date()); |
|
|
|
workDealInfo.setWorkOrderId(bo.getId()); |
|
|
|
// 3.创建处理信息
|
|
|
|
workDealInfoMapper.insert(workDealInfo); |
|
|
|
LambdaQueryWrapper<WorkDealInfo> qw = new LambdaQueryWrapper<>(); |
|
|
|
qw.eq(WorkDealInfo::getWorkOrderId, bo.getId()); |
|
|
|
WorkDealInfo workDealInfoFromDb = workDealInfoMapper.selectOne(qw); |
|
|
|
if (workDealInfoFromDb != null){ |
|
|
|
workDealInfo.setId(workDealInfoFromDb.getId()); |
|
|
|
workDealInfoMapper.updateById(workDealInfo); |
|
|
|
}else { |
|
|
|
workDealInfoMapper.insert(workDealInfo); |
|
|
|
} |
|
|
|
|
|
|
|
// 4.创建流程信息
|
|
|
|
String workOrderId = bo.getId(); |
|
|
@ -544,7 +571,7 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { |
|
|
|
LocalDateTime time2 = LocalDateTime.now(); |
|
|
|
Date date2 = Date.from(time2.atZone(ZoneId.systemDefault()).toInstant()); |
|
|
|
workOrderProcess.setOperationTime(date2); |
|
|
|
// TODO 处理反馈信息 从表单中获取
|
|
|
|
// 处理反馈信息 从表单中获取
|
|
|
|
workOrderProcess.setFeedback(bo.getFixResult()); |
|
|
|
// 计算时间差
|
|
|
|
Duration duration = Duration.between(time1, time2); |
|
|
@ -565,13 +592,14 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { |
|
|
|
|
|
|
|
@Override |
|
|
|
public void initReviewOrder(WorkReviewInfoBo bo) { |
|
|
|
LoginUser loginUser = LoginHelper.getLoginUser(); |
|
|
|
// 1.插入审核信息表
|
|
|
|
workReviewInfoService.insertByBo(bo); |
|
|
|
// 2.根据处理结果判断
|
|
|
|
String handleResult = bo.getHandleResult(); |
|
|
|
String workOrderId = bo.getId(); |
|
|
|
bo.setId(null); |
|
|
|
bo.setWorkOrderId(workOrderId); |
|
|
|
LoginUser loginUser = LoginHelper.getLoginUser(); |
|
|
|
|
|
|
|
// 1.插入审核信息表
|
|
|
|
workReviewInfoService.insertByBo(bo); |
|
|
|
if (handleResult.equals("通过")){ |
|
|
|
WorkOrderProcessBo workOrderProcess = new WorkOrderProcessBo(); |
|
|
|
// 设置基础信息
|
|
|
@ -613,8 +641,8 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { |
|
|
|
// 设置基础信息
|
|
|
|
workOrderProcess.setWorkOrderId(workOrderId); |
|
|
|
workOrderProcess.setOperator(loginUser.getNickname()); |
|
|
|
workOrderProcess.setStage("故障处理"); |
|
|
|
workOrderProcess.setOperationName("故障处理"); |
|
|
|
workOrderProcess.setStage("初审"); |
|
|
|
workOrderProcess.setOperationName("初审"); |
|
|
|
workOrderProcess.setDescription("初审不通过需要重新处理工单"); |
|
|
|
// 获取最近一个节点的操作时间
|
|
|
|
LambdaQueryWrapper<WorkOrderProcess> wrapper = new LambdaQueryWrapper<>(); |
|
|
@ -675,7 +703,7 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { |
|
|
|
Duration duration = Duration.between(time1, time2); |
|
|
|
long durationInSeconds = duration.getSeconds(); |
|
|
|
String formatDuration = formatDuration((int) durationInSeconds); |
|
|
|
workOrderProcess.setDuration(formatDuration); |
|
|
|
//workOrderProcess.setDuration(formatDuration);
|
|
|
|
Boolean flag = workOrderProcessService.insertByBo(workOrderProcess); |
|
|
|
|
|
|
|
if (flag){ |
|
|
@ -700,13 +728,14 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { |
|
|
|
|
|
|
|
@Override |
|
|
|
public void lastReviewOrder(WorkReviewInfoBo bo) { |
|
|
|
String handleResult = bo.getHandleResult(); |
|
|
|
String workOrderId = bo.getId(); |
|
|
|
bo.setId(null); |
|
|
|
bo.setWorkOrderId(workOrderId); |
|
|
|
LoginUser loginUser = LoginHelper.getLoginUser(); |
|
|
|
// 1.插入审核信息表
|
|
|
|
workReviewInfoService.insertByBo(bo); |
|
|
|
// 2.根据处理结果判断
|
|
|
|
String handleResult = bo.getHandleResult(); |
|
|
|
String workOrderId = bo.getId(); |
|
|
|
|
|
|
|
if (handleResult.equals("通过")){ |
|
|
|
WorkOrderProcessBo workOrderProcess = new WorkOrderProcessBo(); |
|
|
|
// 设置基础信息
|
|
|
@ -752,7 +781,8 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { |
|
|
|
endBo.setOperator(loginUser.getNickname()); |
|
|
|
workOrderProcessService.insertByBo(endBo); |
|
|
|
} |
|
|
|
}else { |
|
|
|
}else if ("退回".equals(handleResult)){ |
|
|
|
// 终审不通过需要重新处理工单
|
|
|
|
WorkOrderProcessBo workOrderProcess = new WorkOrderProcessBo(); |
|
|
|
// 设置基础信息
|
|
|
|
workOrderProcess.setWorkOrderId(workOrderId); |
|
|
@ -818,7 +848,7 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { |
|
|
|
LocalDateTime time2 = LocalDateTime.now(); |
|
|
|
Date date2 = Date.from(time2.atZone(ZoneId.systemDefault()).toInstant()); |
|
|
|
workOrderProcess.setOperationTime(date2); |
|
|
|
// TODO 处理反馈信息 从表单中获取 回退原因
|
|
|
|
// 处理反馈信息 从表单中获取 回退原因
|
|
|
|
workOrderProcess.setFeedback(bo.getBackReason()); |
|
|
|
// 计算时间差
|
|
|
|
Duration duration = Duration.between(time1, time2); |
|
|
@ -925,14 +955,15 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { |
|
|
|
updateWrapper1.set(WorkOrderDelay::getHandleResult,"审核通过"); |
|
|
|
workOrderDelayMapper.update(null,updateWrapper1); |
|
|
|
|
|
|
|
// TODO 创建延期流程
|
|
|
|
//创建延期流程
|
|
|
|
WorkDelayProcess workDelayProcess = new WorkDelayProcess(); |
|
|
|
workDelayProcess.setWorkOrderId(workOrderId); |
|
|
|
workDelayProcess.setOperator(loginUser.getNickname()); |
|
|
|
workDelayProcess.setStage("派单人审核"); |
|
|
|
workDelayProcess.setOperationName("派单人审核"); |
|
|
|
workDelayProcess.setDescription("在派单人审核环节进行了派单人审核操作"); |
|
|
|
workDelayProcess.setFeedback(bo.getAuditOpinion()); |
|
|
|
workDelayProcess.setFeedback("审核通过:"+bo.getAuditOpinion()); |
|
|
|
// 设置时间
|
|
|
|
LambdaQueryWrapper<WorkDelayProcess> wrapper = new LambdaQueryWrapper<>(); |
|
|
|
wrapper.eq(WorkDelayProcess::getWorkOrderId, workOrderId) |
|
|
|
.orderByDesc(WorkDelayProcess::getOperationTime) |
|
|
@ -943,11 +974,9 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { |
|
|
|
log.info("最近一个节点:{}-->操作时间{}",recentTarget.getOperationName(), recentTarget.getOperationTime()); |
|
|
|
Date lastTime = recentTarget.getOperationTime(); |
|
|
|
LocalDateTime time1 = LocalDateTime.ofInstant(lastTime.toInstant(), ZoneId.systemDefault()); |
|
|
|
// 设置操作时间
|
|
|
|
LocalDateTime time2 = LocalDateTime.now(); |
|
|
|
Date date2 = Date.from(time2.atZone(ZoneId.systemDefault()).toInstant()); |
|
|
|
workDelayProcess.setOperationTime(date2); |
|
|
|
workDelayProcess.setFeedback(bo.getHandleResult()); |
|
|
|
// 计算时间差
|
|
|
|
Duration duration = Duration.between(time1, time2); |
|
|
|
long durationInSeconds = duration.getSeconds(); |
|
|
@ -966,7 +995,43 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { |
|
|
|
}else { |
|
|
|
throw new RuntimeException("延期申请不存在,无法审核!"); |
|
|
|
} |
|
|
|
// TODO 根据 处理中(已延期) 去修改现在的超时时间
|
|
|
|
|
|
|
|
} else if (handleResult.equals("审核拒绝")) { |
|
|
|
LambdaUpdateWrapper<WorkOrderDelay> updateWrapper1 = new LambdaUpdateWrapper<>(); |
|
|
|
updateWrapper1.eq(WorkOrderDelay::getId, bo.getId()); |
|
|
|
updateWrapper1.set(WorkOrderDelay::getHandleResult, "审核拒绝"); |
|
|
|
workOrderDelayMapper.update(null, updateWrapper1); |
|
|
|
|
|
|
|
WorkDelayProcess workDelayProcess = new WorkDelayProcess(); |
|
|
|
workDelayProcess.setWorkOrderId(workOrderId); |
|
|
|
workDelayProcess.setOperator(loginUser.getNickname()); |
|
|
|
workDelayProcess.setStage("派单人审核"); |
|
|
|
workDelayProcess.setOperationName("派单人审核"); |
|
|
|
workDelayProcess.setDescription("在派单人审核环节进行了派单人审核操作"); |
|
|
|
workDelayProcess.setFeedback("审核未通过:"+bo.getAuditOpinion()); |
|
|
|
LambdaQueryWrapper<WorkDelayProcess> wrapper = new LambdaQueryWrapper<>(); |
|
|
|
wrapper.eq(WorkDelayProcess::getWorkOrderId, workOrderId) |
|
|
|
.orderByDesc(WorkDelayProcess::getOperationTime) |
|
|
|
.last("LIMIT 1"); |
|
|
|
WorkDelayProcess recentTarget = workDelayProcessMapper.selectOne(wrapper); |
|
|
|
|
|
|
|
if (recentTarget != null) { |
|
|
|
log.info("最近一个节点:{}-->操作时间{}", recentTarget.getOperationName(), recentTarget.getOperationTime()); |
|
|
|
Date lastTime = recentTarget.getOperationTime(); |
|
|
|
LocalDateTime time1 = LocalDateTime.ofInstant(lastTime.toInstant(), ZoneId.systemDefault()); |
|
|
|
// 设置操作时间
|
|
|
|
LocalDateTime time2 = LocalDateTime.now(); |
|
|
|
Date date2 = Date.from(time2.atZone(ZoneId.systemDefault()).toInstant()); |
|
|
|
workDelayProcess.setOperationTime(date2); |
|
|
|
// 计算时间差
|
|
|
|
Duration duration = Duration.between(time1, time2); |
|
|
|
long durationInSeconds = duration.getSeconds(); |
|
|
|
String formatDuration = formatDuration((int) durationInSeconds); |
|
|
|
workDelayProcess.setDuration(formatDuration); |
|
|
|
workDelayProcessMapper.insert(workDelayProcess); |
|
|
|
}else { |
|
|
|
throw new RuntimeException("延期申请不存在,无法审核!"); |
|
|
|
} |
|
|
|
} |
|
|
|
// 记录操作历史记录表
|
|
|
|
WorkOrderDelayHistoryBo historyBo = new WorkOrderDelayHistoryBo(); |
|
|
|