Browse Source

工单导出加入线程池优化,调整检索条件

ops-management-platform-backend-dev
gjh 2 days ago
parent
commit
939f97673f
  1. 4
      ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/controller/ExcelController.java
  2. 5
      ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/domain/bo/InspectionPlanInfoBo.java
  3. 6
      ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/listener/WorkOrderInfoListener.java
  4. 2
      ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/IWorkOrderInfoService.java
  5. 10
      ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/impl/InspectionPlanInfoServiceImpl.java
  6. 3
      ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/impl/RoutineInspectionInfoServiceImpl.java
  7. 206
      ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/impl/WorkOrderInfoServiceImpl.java

4
ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/controller/ExcelController.java

@ -84,6 +84,7 @@ public class ExcelController {
*/
@PostMapping("/ExportWorkOrderInfo")
public void ExportWorkOrderInfo(WorkOrderInfoBo bo, HttpServletResponse response) throws IOException {
long t1 = System.currentTimeMillis();
List<WorkOrderInfoVo> list = workOrderInfoService.queryListForExport(bo);
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
@ -98,6 +99,9 @@ public class ExcelController {
EasyExcel.write(response.getOutputStream(), WorkOrderInfoVo.class)
.sheet("工单信息"+currentDate)
.doWrite(list);
long t2 = System.currentTimeMillis();
String message = "导出全部数据耗时时:"+(t2-t1)+"ms";
log.info(message);
}

5
ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/domain/bo/InspectionPlanInfoBo.java

@ -10,6 +10,7 @@ import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
/**
* 巡检计划业务对象 inspection_plan_info
@ -50,12 +51,16 @@ public class InspectionPlanInfoBo extends BaseEntity {
* 开始日期
*/
@NotNull(message = "开始日期不能为空", groups = { AddGroup.class, EditGroup.class })
@JsonFormat(pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date startDate;
/**
* 结束日期
*/
@NotNull(message = "结束日期不能为空", groups = { AddGroup.class, EditGroup.class })
@JsonFormat(pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date endDate;
/**

6
ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/listener/WorkOrderInfoListener.java

@ -76,13 +76,13 @@ public class WorkOrderInfoListener implements ReadListener<WorkOrderInfoVo> {
return;
}
// 不允许重复点位上报
if (faultLocationList.contains(info.getFaultLocation())) {
/* if (faultLocationList.contains(info.getFaultLocation())) {
int rowNum = analysisContext.readRowHolder().getRowIndex();
String errorMsg = String.format("第 %d 行数据导入失败:该点位正在维修 故障地点: %s",
rowNum, workOrderInfoVo.getFaultLocation());
errorMessages.add(errorMsg);
return;
}
}*/
String unit = contractInfoService.getIoCompany(contractName);
if (unit != null) {
@ -92,7 +92,7 @@ public class WorkOrderInfoListener implements ReadListener<WorkOrderInfoVo> {
WorkOrderInfoBo convert = BeanUtil.copyProperties(info, WorkOrderInfoBo.class);
workOrderInfoService.insertByBo(convert);
workOrderInfoService.insertByExcel(convert);
} catch (Exception e) {
int rowNum = analysisContext.readRowHolder().getRowIndex();

2
ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/IWorkOrderInfoService.java

@ -56,6 +56,8 @@ public interface IWorkOrderInfoService {
*/
Boolean insertByBo(WorkOrderInfoBo bo);
Boolean insertByExcel(WorkOrderInfoBo bo);
/**
* 修改工单信息
*

10
ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/impl/InspectionPlanInfoServiceImpl.java

@ -109,14 +109,20 @@ public class InspectionPlanInfoServiceImpl implements IInspectionPlanInfoService
lqw.like(StringUtils.isNotBlank(bo.getContractName()), InspectionPlanInfo::getContractName, bo.getContractName());
lqw.like(StringUtils.isNotBlank(bo.getProjectName()), InspectionPlanInfo::getProjectName, bo.getProjectName());
lqw.eq(StringUtils.isNotBlank(bo.getDescription()), InspectionPlanInfo::getDescription, bo.getDescription());
lqw.eq(bo.getStartDate() != null, InspectionPlanInfo::getStartDate, bo.getStartDate());
lqw.eq(bo.getEndDate() != null, InspectionPlanInfo::getEndDate, bo.getEndDate());
lqw.eq(bo.getFrequency() != null, InspectionPlanInfo::getFrequency, bo.getFrequency());
lqw.eq(bo.getStatus() != null, InspectionPlanInfo::getStatus, bo.getStatus());
lqw.eq(bo.getProgress() != null, InspectionPlanInfo::getProgress, bo.getProgress());
lqw.eq(StringUtils.isNotBlank(bo.getIoCompany()), InspectionPlanInfo::getIoCompany, bo.getIoCompany());
lqw.eq(bo.getFixTime() != null, InspectionPlanInfo::getFixTime, bo.getFixTime());
lqw.eq(bo.getPlanDate() != null, InspectionPlanInfo::getPlanDate, bo.getPlanDate());
// 对 时间 进行范围查询
if (bo.getStartDate() != null) {
lqw.ge(InspectionPlanInfo::getStartDate, bo.getStartDate());
}
if (bo.getEndDate() != null) {
lqw.le(InspectionPlanInfo::getEndDate, bo.getEndDate());
}
return lqw;
}

3
ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/impl/RoutineInspectionInfoServiceImpl.java

@ -85,8 +85,7 @@ public class RoutineInspectionInfoServiceImpl implements IRoutineInspectionInfoS
lqw.eq(bo.getServiceProject() != null, RoutineInspectionInfo::getServiceProject, bo.getServiceProject());
lqw.eq(StringUtils.isNotBlank(bo.getCode()), RoutineInspectionInfo::getCode, bo.getCode());
lqw.eq(StringUtils.isNotBlank(bo.getIoCompany()), RoutineInspectionInfo::getIoCompany, bo.getIoCompany());
//lqw.eq(bo.getScheduleStartDate() != null, RoutineInspectionInfo::getScheduleStartDate, bo.getScheduleStartDate());
//lqw.eq(bo.getScheduleEndDate() != null, RoutineInspectionInfo::getScheduleEndDate, bo.getScheduleEndDate());
lqw.eq(bo.getFinishDate() != null, RoutineInspectionInfo::getFinishDate, bo.getFinishDate());
lqw.eq(StringUtils.isNotBlank(bo.getPointName()), RoutineInspectionInfo::getPointName, bo.getPointName());
lqw.eq(bo.getStatus() != null, RoutineInspectionInfo::getStatus, bo.getStatus());

206
ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/impl/WorkOrderInfoServiceImpl.java

@ -40,6 +40,9 @@ import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
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.Pattern;
import java.util.stream.Collectors;
@ -228,7 +231,13 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService {
lqw.eq(StringUtils.isNotBlank(bo.getMaintenanceUnit()), WorkOrderInfo::getMaintenanceUnit, bo.getMaintenanceUnit());
//当前状态:status
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);
return lqw;
@ -246,6 +255,10 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService {
*/
@Override
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);
// 设置报修时间
add.setRepairTime(DateUtil.date());
@ -326,6 +339,87 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService {
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秒
@ -1563,32 +1657,53 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService {
LambdaQueryWrapper<WorkOrderInfo> lqw = buildQueryWrapper(bo);
List<WorkOrderInfoVo> orderInfoVoList = baseMapper.selectVoList(lqw);
for (WorkOrderInfoVo record : orderInfoVoList) {
// 创建线程池(根据 CPU 核心数调整)
int corePoolSize = Runtime.getRuntime().availableProcessors() * 2;
ExecutorService executor = Executors.newFixedThreadPool(corePoolSize);
try {
// 使用 CompletableFuture 并发处理每条记录
List<CompletableFuture<WorkOrderInfoVo>> futureList = orderInfoVoList.stream()
.map(vo -> CompletableFuture.supplyAsync(() -> enrichWorkOrderInfo(vo), executor))
.collect(Collectors.toList());
// 等待所有任务完成
CompletableFuture.allOf(futureList.toArray(new CompletableFuture[0])).join();
// 获取结果(顺序保持一致)
for (int i = 0; i < orderInfoVoList.size(); i++) {
orderInfoVoList.set(i, futureList.get(i).join());
}
} finally {
executor.shutdown();
}
return orderInfoVoList;
}
private WorkOrderInfoVo enrichWorkOrderInfo(WorkOrderInfoVo vo) {
String workOrderId = vo.getId();
// 1. 罚款信息
String workOrderId = record.getId();
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.处理人信息(最后一次处理的人)
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);
if (handler != null){
record.setHandler(handler);
}else {
record.setHandler("无");
}
// 3.接单时间(最后一次)
vo.setHandler(handler != null ? handler : "无");
// 3. 接单时间
Date orderAcceptTime = workOrderProcessMapper.getOrderAcceptTimeByWorkOrderId(workOrderId);
if (orderAcceptTime != null){
record.setOrderAcceptTime(orderAcceptTime);
}
vo.setOrderAcceptTime(orderAcceptTime);
// 4. 是否延期
LambdaQueryWrapper<WorkOrderDelay> queryDelayWrapper = new LambdaQueryWrapper<>();
queryDelayWrapper.eq(WorkOrderDelay::getId, workOrderId);
@ -1597,52 +1712,37 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService {
queryDelayWrapper.last("LIMIT 1");
WorkOrderDelayVo workOrderDelayVo = workOrderDelayMapper.selectVoOne(queryDelayWrapper);
if (workOrderDelayVo != null) {
record.setIsDelay("是");
record.setDelayTime(workOrderDelayVo.getAfterDelayTime());
record.setDelayReason(workOrderDelayVo.getDelayReason());
vo.setIsDelay("是");
vo.setDelayTime(workOrderDelayVo.getAfterDelayTime());
vo.setDelayReason(workOrderDelayVo.getDelayReason());
} else {
record.setIsDelay("否");
vo.setIsDelay("否");
}
// 5.工单审核中的其他罚款
record.setOtherCost(0.0);
record.setOtherCostReason("无");
// 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) {
if (lastReviewInfo.getOtherCost() != null) {
record.setOtherCost(Double.valueOf(lastReviewInfo.getOtherCost()));
} else {
record.setOtherCost(0.0); // 或者 0.0,根据业务需求决定默认值
}
if (lastReviewInfo.getOtherCostReason() != null) {
record.setOtherCostReason(lastReviewInfo.getOtherCostReason());
vo.setOtherCost(lastReviewInfo.getOtherCost() != null ? Double.valueOf(lastReviewInfo.getOtherCost()) : 0.0);
vo.setOtherCostReason(StringUtils.isNotBlank(lastReviewInfo.getOtherCostReason()) ? lastReviewInfo.getOtherCostReason() : "无");
} else {
record.setOtherCostReason("无"); // 或者 ""
}
vo.setOtherCost(0.0);
vo.setOtherCostReason("无");
}
// 6.工单审核中的初审建议
// 6. 初审建议
String initAdvice = workReviewInfoMapper.getInitAdvice(workOrderId);
if (StringUtils.isNotBlank(initAdvice)){
record.setInitAdvice(initAdvice);
}
vo.setInitAdvice(StringUtils.isNotBlank(initAdvice) ? initAdvice : null);
// 7.工单审核中的终审建议
// 7. 终审建议
String lastAdvice = workReviewInfoMapper.getLastAdvice(workOrderId);
if (StringUtils.isNotBlank(lastAdvice)){
record.setLastAdvice(lastAdvice);
}
vo.setLastAdvice(StringUtils.isNotBlank(lastAdvice) ? lastAdvice : null);
return vo;
}
return orderInfoVoList;
}
@Override
public WorkOrderInfoDto getOverTimeCost(String workOrderId) {
WorkOrderInfoVo record = baseMapper.selectVoById(workOrderId);
@ -1748,6 +1848,8 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService {
public Set<String> getFaultLocationList(String maintenanceUnit) {
LambdaQueryWrapper<WorkOrderInfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(StringUtils.isNotBlank(maintenanceUnit), WorkOrderInfo::getMaintenanceUnit, maintenanceUnit);
// 还没有结案的故障点位,因为一个点位可能重复故障 不加限制不行
queryWrapper.ne(WorkOrderInfo::getStatus, 6);
List<WorkOrderInfo> workOrderInfos = baseMapper.selectList(queryWrapper);
Set<String> faultLocationList = workOrderInfos.stream()

Loading…
Cancel
Save