|
@ -40,6 +40,9 @@ import java.time.LocalDateTime; |
|
|
import java.time.ZoneId; |
|
|
import java.time.ZoneId; |
|
|
import java.time.format.DateTimeFormatter; |
|
|
import java.time.format.DateTimeFormatter; |
|
|
import java.util.*; |
|
|
import java.util.*; |
|
|
|
|
|
import java.util.concurrent.CompletableFuture; |
|
|
|
|
|
import java.util.concurrent.ExecutorService; |
|
|
|
|
|
import java.util.concurrent.Executors; |
|
|
import java.util.regex.Matcher; |
|
|
import java.util.regex.Matcher; |
|
|
import java.util.regex.Pattern; |
|
|
import java.util.regex.Pattern; |
|
|
import java.util.stream.Collectors; |
|
|
import java.util.stream.Collectors; |
|
@ -228,7 +231,13 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { |
|
|
lqw.eq(StringUtils.isNotBlank(bo.getMaintenanceUnit()), WorkOrderInfo::getMaintenanceUnit, bo.getMaintenanceUnit()); |
|
|
lqw.eq(StringUtils.isNotBlank(bo.getMaintenanceUnit()), WorkOrderInfo::getMaintenanceUnit, bo.getMaintenanceUnit()); |
|
|
//当前状态:status
|
|
|
//当前状态:status
|
|
|
lqw.eq(bo.getStatus() != null, WorkOrderInfo::getStatus, bo.getStatus()); |
|
|
lqw.eq(bo.getStatus() != null, WorkOrderInfo::getStatus, bo.getStatus()); |
|
|
|
|
|
// 按照报修时间查询
|
|
|
|
|
|
lqw.between( |
|
|
|
|
|
bo.getStartDate() != null && bo.getStartDate() != null, |
|
|
|
|
|
WorkOrderInfo::getRepairTime, |
|
|
|
|
|
bo.getStartDate(), |
|
|
|
|
|
bo.getEndDate() |
|
|
|
|
|
); |
|
|
// 添加按创建时间降序排序
|
|
|
// 添加按创建时间降序排序
|
|
|
// lqw.orderByDesc(WorkOrderInfo::getCreateTime);
|
|
|
// lqw.orderByDesc(WorkOrderInfo::getCreateTime);
|
|
|
return lqw; |
|
|
return lqw; |
|
@ -246,6 +255,10 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { |
|
|
*/ |
|
|
*/ |
|
|
@Override |
|
|
@Override |
|
|
public Boolean insertByBo(WorkOrderInfoBo bo) { |
|
|
public Boolean insertByBo(WorkOrderInfoBo bo) { |
|
|
|
|
|
Set<String> faultLocationList = this.getFaultLocationList(null); |
|
|
|
|
|
if (faultLocationList.contains(bo.getFaultLocation())) { |
|
|
|
|
|
throw new ServiceException("该点位正在维修,请勿重复上报!"); |
|
|
|
|
|
} |
|
|
WorkOrderInfo add = MapstructUtils.convert(bo, WorkOrderInfo.class); |
|
|
WorkOrderInfo add = MapstructUtils.convert(bo, WorkOrderInfo.class); |
|
|
// 设置报修时间
|
|
|
// 设置报修时间
|
|
|
add.setRepairTime(DateUtil.date()); |
|
|
add.setRepairTime(DateUtil.date()); |
|
@ -326,6 +339,87 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { |
|
|
return flag; |
|
|
return flag; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
public Boolean insertByExcel(WorkOrderInfoBo bo) { |
|
|
|
|
|
WorkOrderInfo add = MapstructUtils.convert(bo, WorkOrderInfo.class); |
|
|
|
|
|
// 设置报修时间
|
|
|
|
|
|
add.setRepairTime(DateUtil.date()); |
|
|
|
|
|
validEntityBeforeSave(add); |
|
|
|
|
|
List<Attachment> attachments = bo.getAttachments(); |
|
|
|
|
|
AttachmentSerializer serializer = new AttachmentSerializer(); |
|
|
|
|
|
String serializedAttachment = serializer.serializeAttachments(attachments); |
|
|
|
|
|
add.setAttachment(serializedAttachment); |
|
|
|
|
|
LoginUser loginUser = LoginHelper.getLoginUser(); |
|
|
|
|
|
// 设置报修人员
|
|
|
|
|
|
String nickname = loginUser.getNickname(); |
|
|
|
|
|
add.setRepairer(nickname); |
|
|
|
|
|
// 设置维护单位
|
|
|
|
|
|
String contractName = bo.getContractName(); |
|
|
|
|
|
String partyB = projectInfoService.getContractPartyBNameByContractName(contractName); |
|
|
|
|
|
if (partyB != null) { |
|
|
|
|
|
add.setMaintenanceUnit(partyB); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
boolean flag = baseMapper.insert(add) > 0; |
|
|
|
|
|
if (flag) { |
|
|
|
|
|
// 自动生成的工单id
|
|
|
|
|
|
String generatedId = add.getId(); |
|
|
|
|
|
bo.setId(generatedId); // 设置到bo对象中
|
|
|
|
|
|
String isDispatched = bo.getIsDispatched(); |
|
|
|
|
|
|
|
|
|
|
|
WorkOrderProcessBo workOrderProcess1 = new WorkOrderProcessBo(); |
|
|
|
|
|
workOrderProcess1.setWorkOrderId(generatedId); |
|
|
|
|
|
workOrderProcess1.setOperator(loginUser.getNickname()); |
|
|
|
|
|
workOrderProcess1.setStage("故障上报"); |
|
|
|
|
|
workOrderProcess1.setOperationName("故障上报"); |
|
|
|
|
|
workOrderProcess1.setDescription("在故障上报环节进行了窗口上报故障操作"); |
|
|
|
|
|
// 设置操作时间
|
|
|
|
|
|
LocalDateTime time1 = LocalDateTime.now(); |
|
|
|
|
|
Date date1 = Date.from(time1.atZone(ZoneId.systemDefault()).toInstant()); |
|
|
|
|
|
workOrderProcess1.setOperationTime(date1); |
|
|
|
|
|
workOrderProcess1.setFeedback("故障以上报,等待派遣"); |
|
|
|
|
|
|
|
|
|
|
|
if (workOrderProcessService.insertByBo(workOrderProcess1)) { |
|
|
|
|
|
LambdaUpdateWrapper<WorkOrderInfo> updateWrapper = new LambdaUpdateWrapper<>(); |
|
|
|
|
|
updateWrapper.eq(WorkOrderInfo::getId, generatedId) |
|
|
|
|
|
.set(WorkOrderInfo::getStatus, 0); |
|
|
|
|
|
baseMapper.update(null, updateWrapper); |
|
|
|
|
|
log.info("修改对应的工单的状态 :待派遣"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (StringUtils.equals(isDispatched, "是")) { |
|
|
|
|
|
|
|
|
|
|
|
WorkOrderProcessBo workOrderProcess2 = new WorkOrderProcessBo(); |
|
|
|
|
|
workOrderProcess2.setWorkOrderId(generatedId); |
|
|
|
|
|
workOrderProcess2.setOperator(loginUser.getNickname()); |
|
|
|
|
|
workOrderProcess2.setStage("故障派遣"); |
|
|
|
|
|
workOrderProcess2.setOperationName("故障派遣"); |
|
|
|
|
|
workOrderProcess2.setDescription("在故障派遣环节进行了故障派遣操作"); |
|
|
|
|
|
|
|
|
|
|
|
// 设置操作时间
|
|
|
|
|
|
LocalDateTime time2 = LocalDateTime.now(); |
|
|
|
|
|
Date date2 = Date.from(time2.atZone(ZoneId.systemDefault()).toInstant()); |
|
|
|
|
|
workOrderProcess2.setOperationTime(date2); |
|
|
|
|
|
workOrderProcess2.setFeedback(bo.getDispatchOpinion()); |
|
|
|
|
|
|
|
|
|
|
|
Duration duration = Duration.between(time1, time2); // 计算时间差
|
|
|
|
|
|
// 将持续时间(以秒为单位)设置到对象中
|
|
|
|
|
|
long durationInSeconds = duration.getSeconds(); |
|
|
|
|
|
String formatDuration = formatDuration((int) durationInSeconds); |
|
|
|
|
|
workOrderProcess2.setDuration(formatDuration); |
|
|
|
|
|
if (workOrderProcessService.insertByBo(workOrderProcess2)) { |
|
|
|
|
|
LambdaUpdateWrapper<WorkOrderInfo> updateWrapper = new LambdaUpdateWrapper<>(); |
|
|
|
|
|
updateWrapper.eq(WorkOrderInfo::getId, generatedId) |
|
|
|
|
|
.set(BaseEntity::getUpdateTime, new Date()) |
|
|
|
|
|
.set(WorkOrderInfo::getStatus, 1); |
|
|
|
|
|
baseMapper.update(null, updateWrapper); |
|
|
|
|
|
log.info("修改对应的工单的状态 :待接单"); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return flag; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 规范格式,如:01时02分03秒
|
|
|
// 规范格式,如:01时02分03秒
|
|
@ -1563,86 +1657,92 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { |
|
|
LambdaQueryWrapper<WorkOrderInfo> lqw = buildQueryWrapper(bo); |
|
|
LambdaQueryWrapper<WorkOrderInfo> lqw = buildQueryWrapper(bo); |
|
|
List<WorkOrderInfoVo> orderInfoVoList = baseMapper.selectVoList(lqw); |
|
|
List<WorkOrderInfoVo> orderInfoVoList = baseMapper.selectVoList(lqw); |
|
|
|
|
|
|
|
|
for (WorkOrderInfoVo record : orderInfoVoList) { |
|
|
// 创建线程池(根据 CPU 核心数调整)
|
|
|
// 1.罚款信息
|
|
|
int corePoolSize = Runtime.getRuntime().availableProcessors() * 2; |
|
|
String workOrderId = record.getId(); |
|
|
ExecutorService executor = Executors.newFixedThreadPool(corePoolSize); |
|
|
WorkOrderInfoDto overTimeCostInfo = this.getOverTimeCost(workOrderId); |
|
|
|
|
|
// 响应超时罚款
|
|
|
|
|
|
record.setHandleTimeOutCount(overTimeCostInfo.getHandleTimeOutCount()); |
|
|
|
|
|
record.setHandleCost(overTimeCostInfo.getHandleCost()); |
|
|
|
|
|
record.setIsHandleOverTime(overTimeCostInfo.getIsHandleOverTime()); |
|
|
|
|
|
|
|
|
|
|
|
// 接单超时罚款
|
|
|
|
|
|
record.setOrderAcceptTimeOutCount(overTimeCostInfo.getOrderAcceptTimeOutCount()); |
|
|
|
|
|
record.setOrderTakingCost(overTimeCostInfo.getOrderTakingCost()); |
|
|
|
|
|
record.setTotalCost(overTimeCostInfo.getTotalCost()); |
|
|
|
|
|
record.setIsOrderTakingOverTime(overTimeCostInfo.getIsOrderTakingOverTime()); |
|
|
|
|
|
// 2.处理人信息(最后一次处理的人)
|
|
|
|
|
|
String handler = workOrderProcessMapper.getHandlerByWorkOrderId(workOrderId); |
|
|
|
|
|
if (handler != null){ |
|
|
|
|
|
record.setHandler(handler); |
|
|
|
|
|
}else { |
|
|
|
|
|
record.setHandler("无"); |
|
|
|
|
|
} |
|
|
|
|
|
// 3.接单时间(最后一次)
|
|
|
|
|
|
Date orderAcceptTime = workOrderProcessMapper.getOrderAcceptTimeByWorkOrderId(workOrderId); |
|
|
|
|
|
if (orderAcceptTime != null){ |
|
|
|
|
|
record.setOrderAcceptTime(orderAcceptTime); |
|
|
|
|
|
} |
|
|
|
|
|
// 4.是否延期
|
|
|
|
|
|
LambdaQueryWrapper<WorkOrderDelay> queryDelayWrapper = new LambdaQueryWrapper<>(); |
|
|
|
|
|
queryDelayWrapper.eq(WorkOrderDelay::getId, workOrderId); |
|
|
|
|
|
queryDelayWrapper.eq(WorkOrderDelay::getHandleResult,"审核通过"); |
|
|
|
|
|
queryDelayWrapper.orderByDesc(WorkOrderDelay::getCreateTime); |
|
|
|
|
|
queryDelayWrapper.last("LIMIT 1"); |
|
|
|
|
|
WorkOrderDelayVo workOrderDelayVo = workOrderDelayMapper.selectVoOne(queryDelayWrapper); |
|
|
|
|
|
if (workOrderDelayVo != null){ |
|
|
|
|
|
record.setIsDelay("是"); |
|
|
|
|
|
record.setDelayTime(workOrderDelayVo.getAfterDelayTime()); |
|
|
|
|
|
record.setDelayReason(workOrderDelayVo.getDelayReason()); |
|
|
|
|
|
}else { |
|
|
|
|
|
record.setIsDelay("否"); |
|
|
|
|
|
} |
|
|
|
|
|
// 5.工单审核中的其他罚款
|
|
|
|
|
|
record.setOtherCost(0.0); |
|
|
|
|
|
record.setOtherCostReason("无"); |
|
|
|
|
|
|
|
|
|
|
|
LambdaQueryWrapper<WorkReviewInfo> reviewInfoQueryWrapper = new LambdaQueryWrapper<>(); |
|
|
|
|
|
reviewInfoQueryWrapper.eq(WorkReviewInfo::getWorkOrderId, workOrderId); |
|
|
|
|
|
reviewInfoQueryWrapper.orderByDesc(WorkReviewInfo::getCreateTime); |
|
|
|
|
|
reviewInfoQueryWrapper.last("LIMIT 1"); |
|
|
|
|
|
WorkReviewInfo lastReviewInfo = workReviewInfoMapper.selectOne(reviewInfoQueryWrapper); |
|
|
|
|
|
if (lastReviewInfo != null){ |
|
|
|
|
|
if (lastReviewInfo.getOtherCost() != null) { |
|
|
|
|
|
record.setOtherCost(Double.valueOf(lastReviewInfo.getOtherCost())); |
|
|
|
|
|
} else { |
|
|
|
|
|
record.setOtherCost(0.0); // 或者 0.0,根据业务需求决定默认值
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (lastReviewInfo.getOtherCostReason() != null) { |
|
|
try { |
|
|
record.setOtherCostReason(lastReviewInfo.getOtherCostReason()); |
|
|
// 使用 CompletableFuture 并发处理每条记录
|
|
|
} else { |
|
|
List<CompletableFuture<WorkOrderInfoVo>> futureList = orderInfoVoList.stream() |
|
|
record.setOtherCostReason("无"); // 或者 ""
|
|
|
.map(vo -> CompletableFuture.supplyAsync(() -> enrichWorkOrderInfo(vo), executor)) |
|
|
} |
|
|
.collect(Collectors.toList()); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 6.工单审核中的初审建议
|
|
|
// 等待所有任务完成
|
|
|
String initAdvice = workReviewInfoMapper.getInitAdvice(workOrderId); |
|
|
CompletableFuture.allOf(futureList.toArray(new CompletableFuture[0])).join(); |
|
|
if (StringUtils.isNotBlank(initAdvice)){ |
|
|
|
|
|
record.setInitAdvice(initAdvice); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 7.工单审核中的终审建议
|
|
|
// 获取结果(顺序保持一致)
|
|
|
String lastAdvice = workReviewInfoMapper.getLastAdvice(workOrderId); |
|
|
for (int i = 0; i < orderInfoVoList.size(); i++) { |
|
|
if (StringUtils.isNotBlank(lastAdvice)){ |
|
|
orderInfoVoList.set(i, futureList.get(i).join()); |
|
|
record.setLastAdvice(lastAdvice); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
} finally { |
|
|
|
|
|
executor.shutdown(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
return orderInfoVoList; |
|
|
return orderInfoVoList; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private WorkOrderInfoVo enrichWorkOrderInfo(WorkOrderInfoVo vo) { |
|
|
|
|
|
String workOrderId = vo.getId(); |
|
|
|
|
|
|
|
|
|
|
|
// 1. 罚款信息
|
|
|
|
|
|
WorkOrderInfoDto overTimeCostInfo = this.getOverTimeCost(workOrderId); |
|
|
|
|
|
vo.setHandleTimeOutCount(overTimeCostInfo.getHandleTimeOutCount()); |
|
|
|
|
|
vo.setHandleCost(overTimeCostInfo.getHandleCost()); |
|
|
|
|
|
vo.setIsHandleOverTime(overTimeCostInfo.getIsHandleOverTime()); |
|
|
|
|
|
vo.setOrderAcceptTimeOutCount(overTimeCostInfo.getOrderAcceptTimeOutCount()); |
|
|
|
|
|
vo.setOrderTakingCost(overTimeCostInfo.getOrderTakingCost()); |
|
|
|
|
|
vo.setTotalCost(overTimeCostInfo.getTotalCost()); |
|
|
|
|
|
vo.setIsOrderTakingOverTime(overTimeCostInfo.getIsOrderTakingOverTime()); |
|
|
|
|
|
|
|
|
|
|
|
// 2. 处理人信息
|
|
|
|
|
|
String handler = workOrderProcessMapper.getHandlerByWorkOrderId(workOrderId); |
|
|
|
|
|
vo.setHandler(handler != null ? handler : "无"); |
|
|
|
|
|
|
|
|
|
|
|
// 3. 接单时间
|
|
|
|
|
|
Date orderAcceptTime = workOrderProcessMapper.getOrderAcceptTimeByWorkOrderId(workOrderId); |
|
|
|
|
|
vo.setOrderAcceptTime(orderAcceptTime); |
|
|
|
|
|
|
|
|
|
|
|
// 4. 是否延期
|
|
|
|
|
|
LambdaQueryWrapper<WorkOrderDelay> queryDelayWrapper = new LambdaQueryWrapper<>(); |
|
|
|
|
|
queryDelayWrapper.eq(WorkOrderDelay::getId, workOrderId); |
|
|
|
|
|
queryDelayWrapper.eq(WorkOrderDelay::getHandleResult, "审核通过"); |
|
|
|
|
|
queryDelayWrapper.orderByDesc(WorkOrderDelay::getCreateTime); |
|
|
|
|
|
queryDelayWrapper.last("LIMIT 1"); |
|
|
|
|
|
WorkOrderDelayVo workOrderDelayVo = workOrderDelayMapper.selectVoOne(queryDelayWrapper); |
|
|
|
|
|
if (workOrderDelayVo != null) { |
|
|
|
|
|
vo.setIsDelay("是"); |
|
|
|
|
|
vo.setDelayTime(workOrderDelayVo.getAfterDelayTime()); |
|
|
|
|
|
vo.setDelayReason(workOrderDelayVo.getDelayReason()); |
|
|
|
|
|
} else { |
|
|
|
|
|
vo.setIsDelay("否"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 5. 其他罚款
|
|
|
|
|
|
LambdaQueryWrapper<WorkReviewInfo> reviewInfoQueryWrapper = new LambdaQueryWrapper<>(); |
|
|
|
|
|
reviewInfoQueryWrapper.eq(WorkReviewInfo::getWorkOrderId, workOrderId); |
|
|
|
|
|
reviewInfoQueryWrapper.orderByDesc(WorkReviewInfo::getCreateTime); |
|
|
|
|
|
reviewInfoQueryWrapper.last("LIMIT 1"); |
|
|
|
|
|
WorkReviewInfo lastReviewInfo = workReviewInfoMapper.selectOne(reviewInfoQueryWrapper); |
|
|
|
|
|
if (lastReviewInfo != null) { |
|
|
|
|
|
vo.setOtherCost(lastReviewInfo.getOtherCost() != null ? Double.valueOf(lastReviewInfo.getOtherCost()) : 0.0); |
|
|
|
|
|
vo.setOtherCostReason(StringUtils.isNotBlank(lastReviewInfo.getOtherCostReason()) ? lastReviewInfo.getOtherCostReason() : "无"); |
|
|
|
|
|
} else { |
|
|
|
|
|
vo.setOtherCost(0.0); |
|
|
|
|
|
vo.setOtherCostReason("无"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 6. 初审建议
|
|
|
|
|
|
String initAdvice = workReviewInfoMapper.getInitAdvice(workOrderId); |
|
|
|
|
|
vo.setInitAdvice(StringUtils.isNotBlank(initAdvice) ? initAdvice : null); |
|
|
|
|
|
|
|
|
|
|
|
// 7. 终审建议
|
|
|
|
|
|
String lastAdvice = workReviewInfoMapper.getLastAdvice(workOrderId); |
|
|
|
|
|
vo.setLastAdvice(StringUtils.isNotBlank(lastAdvice) ? lastAdvice : null); |
|
|
|
|
|
|
|
|
|
|
|
return vo; |
|
|
|
|
|
} |
|
|
@Override |
|
|
@Override |
|
|
public WorkOrderInfoDto getOverTimeCost(String workOrderId) { |
|
|
public WorkOrderInfoDto getOverTimeCost(String workOrderId) { |
|
|
WorkOrderInfoVo record = baseMapper.selectVoById(workOrderId); |
|
|
WorkOrderInfoVo record = baseMapper.selectVoById(workOrderId); |
|
@ -1748,6 +1848,8 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService { |
|
|
public Set<String> getFaultLocationList(String maintenanceUnit) { |
|
|
public Set<String> getFaultLocationList(String maintenanceUnit) { |
|
|
LambdaQueryWrapper<WorkOrderInfo> queryWrapper = new LambdaQueryWrapper<>(); |
|
|
LambdaQueryWrapper<WorkOrderInfo> queryWrapper = new LambdaQueryWrapper<>(); |
|
|
queryWrapper.eq(StringUtils.isNotBlank(maintenanceUnit), WorkOrderInfo::getMaintenanceUnit, maintenanceUnit); |
|
|
queryWrapper.eq(StringUtils.isNotBlank(maintenanceUnit), WorkOrderInfo::getMaintenanceUnit, maintenanceUnit); |
|
|
|
|
|
// 还没有结案的故障点位,因为一个点位可能重复故障 不加限制不行
|
|
|
|
|
|
queryWrapper.ne(WorkOrderInfo::getStatus, 6); |
|
|
|
|
|
|
|
|
List<WorkOrderInfo> workOrderInfos = baseMapper.selectList(queryWrapper); |
|
|
List<WorkOrderInfo> workOrderInfos = baseMapper.selectList(queryWrapper); |
|
|
Set<String> faultLocationList = workOrderInfos.stream() |
|
|
Set<String> faultLocationList = workOrderInfos.stream() |
|
|