Browse Source

工单信息导出相关调整

ops-management-platform-backend-dev
gjh 2 weeks ago
parent
commit
0e472041b9
  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/controller/WorkOrderInfoController.java
  3. 70
      ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/converter/WorkOrderStatusConverter.java
  4. 95
      ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/domain/dto/WorkOrderInfoDto.java
  5. 28
      ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/domain/vo/WorkOrderInfoVo.java
  6. 3
      ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/service/IWorkOrderInfoService.java
  7. 68
      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

@ -79,9 +79,7 @@ public class ExcelController {
*/ */
@PostMapping("/ExportWorkOrderInfo") @PostMapping("/ExportWorkOrderInfo")
public void ExportWorkOrderInfo(WorkOrderInfoBo bo, HttpServletResponse response) throws IOException { public void ExportWorkOrderInfo(WorkOrderInfoBo bo, HttpServletResponse response) throws IOException {
List<WorkOrderInfoVo> list = workOrderInfoService.queryList(bo); List<WorkOrderInfoVo> list = workOrderInfoService.queryListForExport(bo);
// TODO 填充数据
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8");

5
ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/controller/WorkOrderInfoController.java

@ -14,6 +14,7 @@ import org.dromara.platform.domain.WorkOrderInfo;
import org.dromara.platform.domain.WorkReviewInfo; import org.dromara.platform.domain.WorkReviewInfo;
import org.dromara.platform.domain.bo.WorkOrderDelayBo; import org.dromara.platform.domain.bo.WorkOrderDelayBo;
import org.dromara.platform.domain.bo.WorkReviewInfoBo; import org.dromara.platform.domain.bo.WorkReviewInfoBo;
import org.dromara.platform.domain.dto.WorkOrderInfoDto;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit; import org.dromara.common.idempotent.annotation.RepeatSubmit;
@ -217,8 +218,8 @@ public class WorkOrderInfoController extends BaseController {
} }
@GetMapping("/getOverTimeCost") @GetMapping("/getOverTimeCost")
public R<WorkOrderInfoVo> getOverTimeCost(String workOrderId ) { public R<WorkOrderInfoDto> getOverTimeCost(String workOrderId ) {
WorkOrderInfoVo rs = workOrderInfoService.getOverTimeCost(workOrderId); WorkOrderInfoDto rs = workOrderInfoService.getOverTimeCost(workOrderId);
return R.ok(rs); return R.ok(rs);
} }
} }

70
ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/converter/WorkOrderStatusConverter.java

@ -0,0 +1,70 @@
package org.dromara.platform.converter;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
/**
* 用户信息性别转换器
*
* @author 张德龙
*/
public class WorkOrderStatusConverter implements Converter<Long> {
/**
* Convert Java objects to excel objects
*
* @param value Java Data.NotNull.
* @param contentProperty Content property.Nullable.
* @param globalConfiguration Global configuration.NotNull.
* @return Data to put into a Excel
* * 当前状态
* * 0 待派遣
* * 1 待接单
* * 2 处理中
* * 3 运维单位处理时回退至派遣
* * 4 初审
* * 5 终审
* * 6 结案
* * 7 处理中(已延期)
* * 8 作废
* * 9 待接单(派遣)
* * 10 待接单(转派)
*/
@Override
public WriteCellData<?> convertToExcelData(Long value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
if (value == null) {
return new WriteCellData<>("未知");
}
long status = value; // 自动拆箱为基本类型 long
switch ((int) status) { // 可以安全地转为 int
case 0:
return new WriteCellData<>("待派遣");
case 1:
return new WriteCellData<>("待接单");
case 2:
return new WriteCellData<>("处理中");
case 3:
return new WriteCellData<>("运维单位处理时回退至派遣");
case 4:
return new WriteCellData<>("初审");
case 5:
return new WriteCellData<>("终审");
case 6:
return new WriteCellData<>("结案");
case 7:
return new WriteCellData<>("处理中(已延期)");
case 8:
return new WriteCellData<>("作废");
case 9:
return new WriteCellData<>("待接单(派遣)");
case 10:
return new WriteCellData<>("待接单(转派)");
default:
return new WriteCellData<>("未知");
}
}
}

95
ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/domain/dto/WorkOrderInfoDto.java

@ -0,0 +1,95 @@
package org.dromara.platform.domain.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import org.dromara.platform.domain.Attachment;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* 工单信息视图对象 work_order_info
*
* @author gejunhao
* @date 2025-04-27
*/
@Data
public class WorkOrderInfoDto implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 工单ID
*/
@ExcelProperty(value = "工单ID")
private String id;
/**
* 当前状态
* 0 待派遣
* 1 待接单
* 2 处理中
* 3 运维单位处理时回退至派遣
* 4 初审
* 5 终审
* 6 结案
* 7 处理中(已延期)
* 8 作废
* 9 待接单(派遣)
* 10 待接单(转派)
*/
@ExcelProperty(value = "当前状态")
private Long status;
/**
* 剩余接单时间
*/
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 String isHandleOverTime;
@ExcelProperty(value = "接单是否超期")
private String isOrderTakingOverTime;
@ExcelProperty(value = "响应超时(单位:小时)")
private int handleTimeOutCount;
@ExcelProperty(value = "接单超时(单位:小时)")
private int orderAcceptTimeOutCount;
@ExcelProperty(value = "响应超期扣款")
private Double handleCost;
@ExcelProperty(value = "接单超期扣款")
private Double orderTakingCost;
@ExcelProperty(value = "总扣款")
private Double totalCost;
}

28
ruoyi-modules/guoyan-platform/src/main/java/org/dromara/platform/domain/vo/WorkOrderInfoVo.java

@ -6,6 +6,7 @@ import org.dromara.common.translation.annotation.Translation;
import java.util.Date; import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import org.dromara.common.translation.constant.TransConstant; import org.dromara.common.translation.constant.TransConstant;
import org.dromara.platform.converter.WorkOrderStatusConverter;
import org.dromara.platform.domain.Attachment; import org.dromara.platform.domain.Attachment;
import org.dromara.platform.domain.WorkOrderInfo; import org.dromara.platform.domain.WorkOrderInfo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
@ -130,7 +131,7 @@ public class WorkOrderInfoVo implements Serializable {
/** /**
* 故障图片 * 故障图片
*/ */
@ExcelProperty(value = "故障图片") @ExcelIgnore
private String attachment; private String attachment;
/** /**
@ -190,7 +191,7 @@ public class WorkOrderInfoVo implements Serializable {
* 9 待接单(派遣) * 9 待接单(派遣)
* 10 待接单(转派) * 10 待接单(转派)
*/ */
@ExcelProperty(value = "当前状态") @ExcelProperty(value = "当前状态",converter = WorkOrderStatusConverter.class)
private Long status; private Long status;
@TableField(exist = false) @TableField(exist = false)
@ -237,9 +238,15 @@ public class WorkOrderInfoVo implements Serializable {
@ExcelProperty(value = "是否延期") @ExcelProperty(value = "是否延期")
private String isDelay; private String isDelay;
@ExcelProperty(value = "是否超期") // @ExcelProperty(value = "是否超期")
private String isTimeOut; // private String isTimeOut;
@ExcelProperty(value = "响应是否超期")
private String isHandleOverTime;
@ExcelProperty(value = "接单是否超期")
private String isOrderTakingOverTime;
@ExcelProperty(value = "响应超时(单位:小时)") @ExcelProperty(value = "响应超时(单位:小时)")
private int handleTimeOutCount; private int handleTimeOutCount;
@ -248,9 +255,18 @@ public class WorkOrderInfoVo implements Serializable {
private int orderAcceptTimeOutCount; private int orderAcceptTimeOutCount;
@ExcelProperty(value = "响应超期扣款") @ExcelProperty(value = "响应超期扣款")
private Double handleTimeOutCost; private Double handleCost;
@ExcelProperty(value = "接单超期扣款") @ExcelProperty(value = "接单超期扣款")
private Double orderAcceptTimeOutCost; private Double orderTakingCost;
@ExcelProperty(value = "总扣款")
private Double totalCost;
@ExcelProperty(value = "其他扣款")
private Double otherCost;
@ExcelProperty(value = "其他扣款原因")
private String otherCostReason;
} }

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

@ -5,6 +5,7 @@ import org.dromara.platform.domain.WorkOrderInfo;
import org.dromara.platform.domain.WorkReviewInfo; import org.dromara.platform.domain.WorkReviewInfo;
import org.dromara.platform.domain.bo.WorkOrderDelayBo; import org.dromara.platform.domain.bo.WorkOrderDelayBo;
import org.dromara.platform.domain.bo.WorkReviewInfoBo; import org.dromara.platform.domain.bo.WorkReviewInfoBo;
import org.dromara.platform.domain.dto.WorkOrderInfoDto;
import org.dromara.platform.domain.vo.WorkOrderInfoVo; import org.dromara.platform.domain.vo.WorkOrderInfoVo;
import org.dromara.platform.domain.bo.WorkOrderInfoBo; import org.dromara.platform.domain.bo.WorkOrderInfoBo;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
@ -139,5 +140,5 @@ public interface IWorkOrderInfoService {
List<WorkOrderInfoVo> queryListForExport(WorkOrderInfoBo bo); List<WorkOrderInfoVo> queryListForExport(WorkOrderInfoBo bo);
WorkOrderInfoVo getOverTimeCost(String workOrderId); WorkOrderInfoDto getOverTimeCost(String workOrderId);
} }

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

@ -1,5 +1,6 @@
package org.dromara.platform.service.impl; package org.dromara.platform.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@ -20,6 +21,7 @@ import lombok.RequiredArgsConstructor;
import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.platform.domain.*; import org.dromara.platform.domain.*;
import org.dromara.platform.domain.bo.*; import org.dromara.platform.domain.bo.*;
import org.dromara.platform.domain.dto.WorkOrderInfoDto;
import org.dromara.platform.domain.vo.WorkOrderDelayVo; import org.dromara.platform.domain.vo.WorkOrderDelayVo;
import org.dromara.platform.mapper.*; import org.dromara.platform.mapper.*;
import org.dromara.platform.service.*; import org.dromara.platform.service.*;
@ -127,6 +129,11 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService {
// 如果没有找到接单记录或没有接单时间,可以设为默认值 // 如果没有找到接单记录或没有接单时间,可以设为默认值
workOrderInfoVo.setRestTime("暂无接单信息"); workOrderInfoVo.setRestTime("暂无接单信息");
} }
WorkOrderInfoDto overTimeCost = this.getOverTimeCost(id);
workOrderInfoVo.setHandleCost(overTimeCost.getHandleCost());
workOrderInfoVo.setOrderTakingCost(overTimeCost.getOrderTakingCost());
workOrderInfoVo.setIsHandleOverTime(overTimeCost .getIsHandleOverTime());
workOrderInfoVo.setIsOrderTakingOverTime(overTimeCost.getIsOrderTakingOverTime());
return workOrderInfoVo; return workOrderInfoVo;
} }
@ -495,11 +502,13 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService {
qw.orderByAsc(WorkOrderProcess::getCreateTime); qw.orderByAsc(WorkOrderProcess::getCreateTime);
qw.last("LIMIT 1"); qw.last("LIMIT 1");
WorkOrderProcess latest = workOrderProcessMapper.selectOne(qw); WorkOrderProcess latest = workOrderProcessMapper.selectOne(qw);
if (latest != null){
Date operationTime = latest.getOperationTime(); Date operationTime = latest.getOperationTime();
// 单位:小时 // 单位:小时
Long responseTime = record.getResponseTime(); Long responseTime = record.getResponseTime();
record.setRestTime(getTimeLeft(operationTime, responseTime)); record.setRestTime(getTimeLeft(operationTime, responseTime));
} }
}
// 设置延期信息 // 设置延期信息
if (record.getStatus() == 7){ if (record.getStatus() == 7){
@ -1435,7 +1444,13 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService {
LambdaQueryWrapper<WorkOrderProcess> dealQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<WorkOrderProcess> dealQueryWrapper = new LambdaQueryWrapper<>();
dealQueryWrapper.eq(WorkOrderProcess::getWorkOrderId, workOrderId); dealQueryWrapper.eq(WorkOrderProcess::getWorkOrderId, workOrderId);
dealQueryWrapper.eq(WorkOrderProcess::getStage, "故障接单"); dealQueryWrapper.eq(WorkOrderProcess::getStage, "故障接单");
if (record.getStatus()==9){
// 如果是派遣的时间还是按照第一个人的接单时间来计算,否则都是按照最后一次接单时间来计算
dealQueryWrapper.orderByAsc(WorkOrderProcess::getCreateTime);
}else {
dealQueryWrapper.orderByDesc(WorkOrderProcess::getCreateTime); dealQueryWrapper.orderByDesc(WorkOrderProcess::getCreateTime);
}
dealQueryWrapper.last("LIMIT 1"); dealQueryWrapper.last("LIMIT 1");
WorkOrderProcess dealProcess = workOrderProcessMapper.selectOne(dealQueryWrapper); WorkOrderProcess dealProcess = workOrderProcessMapper.selectOne(dealQueryWrapper);
if (dealProcess != null && dealProcess.getOperationTime() != null) { if (dealProcess != null && dealProcess.getOperationTime() != null) {
@ -1446,27 +1461,40 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService {
if (handleTimeOutSituation.startsWith("超时")) { if (handleTimeOutSituation.startsWith("超时")) {
int timeoutHours = calculateTotalTimeoutHours(handleTimeOutSituation); int timeoutHours = calculateTotalTimeoutHours(handleTimeOutSituation);
record.setHandleTimeOutCount(timeoutHours); record.setHandleTimeOutCount(timeoutHours);
record.setHandleTimeOutCost(timeoutHours * Double.valueOf(handleTimeOutCost)); record.setHandleCost(timeoutHours * Double.parseDouble(handleTimeOutCost));
record.setIsHandleOverTime("是");
}else {
record.setHandleCost(0.0);
record.setIsHandleOverTime("否");
} }
if (orderAcceptTimeOutSituation.startsWith("超时")) { if (orderAcceptTimeOutSituation.startsWith("超时")) {
int timeoutHours = calculateTotalTimeoutHours(orderAcceptTimeOutSituation); int timeoutHours = calculateTotalTimeoutHours(orderAcceptTimeOutSituation);
record.setOrderAcceptTimeOutCount(timeoutHours); record.setOrderAcceptTimeOutCount(timeoutHours);
record.setHandleTimeOutCost(timeoutHours * Double.valueOf(orderTakingCost)); record.setOrderTakingCost(timeoutHours * Double.parseDouble(orderTakingCost));
record.setIsOrderTakingOverTime("是");
}else {
record.setOrderTakingCost(0.0);
record.setIsOrderTakingOverTime("否");
} }
// 判空
Double handleCost = record.getHandleCost() == null ? 0.0 : record.getHandleCost();
Double orderAcceptCost = record.getOrderTakingCost() == null ? 0.0 : record.getOrderTakingCost();
record.setTotalCost(handleCost + orderAcceptCost);
} }
return orderInfoVoList; return orderInfoVoList;
} }
@Override @Override
public WorkOrderInfoVo getOverTimeCost(String workOrderId) { public WorkOrderInfoDto getOverTimeCost(String workOrderId) {
WorkOrderInfoVo record = baseMapper.selectVoById(workOrderId); WorkOrderInfoVo record = baseMapper.selectVoById(workOrderId);
String handleTimeOutSituation = ""; String handleTimeOutSituation = "";
String orderAcceptTimeOutSituation = ""; String orderAcceptTimeOutSituation = "";
String projectName = record.getProjectName();
// 根据项目名称获取接单超期信息 // 根据项目名称获取接单超期信息
LambdaQueryWrapper<ProjectInfo> projectQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<ProjectInfo> projectQueryWrapper = new LambdaQueryWrapper<>();
projectQueryWrapper.eq(ProjectInfo::getProjectName, projectName); projectQueryWrapper.eq(ProjectInfo::getProjectName, record.getProjectName());
projectQueryWrapper.last("LIMIT 1"); projectQueryWrapper.last("LIMIT 1");
ProjectInfo projectInfo = projectInfoMapper.selectOne(projectQueryWrapper); ProjectInfo projectInfo = projectInfoMapper.selectOne(projectQueryWrapper);
String orderTakingOverTime = projectInfo.getOrderTakingOverTime(); String orderTakingOverTime = projectInfo.getOrderTakingOverTime();
@ -1488,7 +1516,14 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService {
LambdaQueryWrapper<WorkOrderProcess> dealQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<WorkOrderProcess> dealQueryWrapper = new LambdaQueryWrapper<>();
dealQueryWrapper.eq(WorkOrderProcess::getWorkOrderId, workOrderId); dealQueryWrapper.eq(WorkOrderProcess::getWorkOrderId, workOrderId);
dealQueryWrapper.eq(WorkOrderProcess::getStage, "故障接单"); dealQueryWrapper.eq(WorkOrderProcess::getStage, "故障接单");
if (record.getStatus()==9){
// 如果是派遣的时间还是按照第一个人的接单时间来计算,否则都是按照最后一次接单时间来计算
dealQueryWrapper.orderByAsc(WorkOrderProcess::getCreateTime);
}else {
dealQueryWrapper.orderByDesc(WorkOrderProcess::getCreateTime); dealQueryWrapper.orderByDesc(WorkOrderProcess::getCreateTime);
}
dealQueryWrapper.last("LIMIT 1"); dealQueryWrapper.last("LIMIT 1");
WorkOrderProcess dealProcess = workOrderProcessMapper.selectOne(dealQueryWrapper); WorkOrderProcess dealProcess = workOrderProcessMapper.selectOne(dealQueryWrapper);
if (dealProcess != null && dealProcess.getOperationTime() != null) { if (dealProcess != null && dealProcess.getOperationTime() != null) {
@ -1499,14 +1534,31 @@ public class WorkOrderInfoServiceImpl implements IWorkOrderInfoService {
if (handleTimeOutSituation.startsWith("超时")) { if (handleTimeOutSituation.startsWith("超时")) {
int timeoutHours = calculateTotalTimeoutHours(handleTimeOutSituation); int timeoutHours = calculateTotalTimeoutHours(handleTimeOutSituation);
record.setHandleTimeOutCount(timeoutHours); record.setHandleTimeOutCount(timeoutHours);
record.setHandleTimeOutCost(timeoutHours * Double.parseDouble(handleTimeOutCost)); record.setHandleCost(timeoutHours * Double.parseDouble(handleTimeOutCost));
record.setIsHandleOverTime("是");
}else {
record.setHandleCost(0.0);
record.setIsHandleOverTime("否");
} }
if (orderAcceptTimeOutSituation.startsWith("超时")) { if (orderAcceptTimeOutSituation.startsWith("超时")) {
int timeoutHours = calculateTotalTimeoutHours(orderAcceptTimeOutSituation); int timeoutHours = calculateTotalTimeoutHours(orderAcceptTimeOutSituation);
record.setOrderAcceptTimeOutCount(timeoutHours); record.setOrderAcceptTimeOutCount(timeoutHours);
record.setHandleTimeOutCost(timeoutHours * Double.parseDouble(orderTakingCost)); record.setOrderTakingCost(timeoutHours * Double.parseDouble(orderTakingCost));
record.setIsOrderTakingOverTime("是");
}else {
record.setOrderTakingCost(0.0);
record.setIsOrderTakingOverTime("否");
} }
return record;
// 判空
Double handleCost = record.getHandleCost() == null ? 0.0 : record.getHandleCost();
Double orderAcceptCost = record.getOrderTakingCost() == null ? 0.0 : record.getOrderTakingCost();
record.setTotalCost(handleCost + orderAcceptCost);
WorkOrderInfoDto workOrderInfoDto = new WorkOrderInfoDto();
BeanUtil.copyProperties(record, workOrderInfoDto);
return workOrderInfoDto;
} }
/** /**

Loading…
Cancel
Save