1. 增加拣选任务记录报表

This commit is contained in:
梁州 2026-02-02 10:36:51 +08:00
parent 048654698b
commit 755e6b4b95
7 changed files with 284 additions and 16 deletions

View File

@ -1,5 +1,8 @@
package com.wms.constants.enums;
import lombok.Getter;
@Getter
public enum PickTaskStatusEnum {
TEMP(-1, "暂存"),
NEW(0, "初始化"),
@ -15,11 +18,13 @@ public enum PickTaskStatusEnum {
this.value = value;
}
public Integer getCode() {
return code;
public static String getValueByCode(Integer code) {
for (PickTaskStatusEnum value : PickTaskStatusEnum.values()) {
if (value.code.equals(code)) {
return value.value;
}
}
return "错误枚举值";
}
public String getValue() {
return value;
}
}

View File

@ -15,6 +15,7 @@ import com.wms.entity.app.vo.FileVo;
import com.wms.entity.app.vo.UploadRecordVo;
import com.wms.entity.table.*;
import com.wms.service.*;
import com.wms.service.business.IWorkService;
import com.wms.utils.HttpUtils;
import com.wms.utils.StringUtils;
import com.wms.utils.excel.listener.*;
@ -37,9 +38,11 @@ import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
import static com.wms.config.InitLocalConfig.configMap;
import static com.wms.constants.WmsConstants.MYSQL_JSON_CI;
import static com.wms.utils.HttpUtils.getIpAddr;
import static com.wms.utils.StringUtils.convertJsonString;
@ -68,8 +71,10 @@ public class ExcelController {
private final WorkFlowService workFlowService;// 工作流服务
private final WorkDateService workDateService;// 工作日历服务
private final IStockUpdateRecordService stockUpdateRecordService; // 库存更新记录服务
private final IWorkService workService;
private final List<String> uploadFileHashStringList = new ArrayList<>();
private final PickTaskRecordService pickTaskRecordService;
/**
* 查询上传记录
@ -805,6 +810,38 @@ public class ExcelController {
.doWrite(goodsList.stream().map(WorkSummaryExcelVo::of).toList());
}
/**
* 导出拣选任务记录
*
* @param response 请求
*/
@PostMapping("/downloadPickTaskRecordsExcel")
@ResponseBody
public void downloadPickTaskRecordsExcel(@RequestBody PickTaskRecordQuery pickTaskRecordQuery, HttpServletResponse response) throws IOException {
logger.info("导出拣选任务记录,筛选参数:{}请求ip{}", convertJsonString(pickTaskRecordQuery), getIpAddr(servletRequest));
//设置响应格式
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("拣选任务记录", StandardCharsets.UTF_8).replaceAll("\\+", "%20");
response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
// 内容样式
HorizontalCellStyleStrategy horizontalCellStyleStrategy = ExcelContentStyle.getContentStyle();
List<PickTaskRecord> recordList = Collections.emptyList();
if (pickTaskRecordQuery.getWorkDate() != null) {
var queryWrapper = new LambdaQueryWrapper<PickTaskRecord>()
.like(StringUtils.isNotEmpty(pickTaskRecordQuery.getVehicleId()), PickTaskRecord::getVehicleId, pickTaskRecordQuery.getVehicleId())
.like(StringUtils.isNotEmpty(pickTaskRecordQuery.getStandId()), PickTaskRecord::getStandId, pickTaskRecordQuery.getStandId())
.between(PickTaskRecord::getArriveTime, pickTaskRecordQuery.getWorkDate().atStartOfDay(), pickTaskRecordQuery.getWorkDate().plusDays(1).atStartOfDay().minusSeconds(1));
recordList = pickTaskRecordService.list(queryWrapper);
}
EasyExcel.write(response.getOutputStream(), PickTaskRecordExcelVo.class)
.excelType(ExcelTypeEnum.XLSX)
.registerWriteHandler(horizontalCellStyleStrategy)
.sheet("拣选任务记录报表")
.doWrite(recordList.stream().map(PickTaskRecordExcelVo::fromPo).toList());
}
/**
* 导出工单
*
@ -822,11 +859,56 @@ public class ExcelController {
response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
// 内容样式
HorizontalCellStyleStrategy horizontalCellStyleStrategy = ExcelContentStyle.getContentStyle();
// 查询参数
LambdaQueryWrapper<KateOrders> kateOrdersLamdaQueryWrapper = new LambdaQueryWrapper<KateOrders>()
.eq(kateOrdersQuery.getPlanStartDate() != null, KateOrders::getPlanStartDate, kateOrdersQuery.getPlanStartDate())
.eq(kateOrdersQuery.getOrderStatus() != null, KateOrders::getOrderStatus, kateOrdersQuery.getOrderStatus());
List<KateOrders> kateOrdersList = kateOrdersService.list(kateOrdersLamdaQueryWrapper);
// 结果列表
List<KateOrders> kateOrdersList = Collections.emptyList();
if (kateOrdersQuery.getPlanStartDate() != null) {
// 添加进总汇总数据
List<WorkFlow> allFlows = new ArrayList<>();
// 查询配置是否使用默认开工日期
String useReqmtDate = configMap.get(ConfigMapKeyEnum.USE_REQUIRE_DATE.getConfigKey());
if (!StringUtils.isEmpty(useReqmtDate) && useReqmtDate.equals("1")) {// 使用工单的开工日期
// 查询配置是否使用默认开工日期调整
String useDefaultAdjust = configMap.get(ConfigMapKeyEnum.USE_DEFAULT_ADJUST.getConfigKey());
if (!StringUtils.isEmpty(useDefaultAdjust) && useDefaultAdjust.equals("1")) {
workService.findCurrentDateWorks(allFlows, kateOrdersQuery.getPlanStartDate());
} else {
workService.findCurrentDateWorksUseConfig(allFlows, kateOrdersQuery.getPlanStartDate());
}
} else {
// 获取当天所有的装载机工作
List<WorkFlow> thisDayMWLWorks = new ArrayList<>();
// 获取到当天所有的平地机工作
List<WorkFlow> thisDayMGWorks = new ArrayList<>();
// 需要合并第二天的平地机工作
List<WorkFlow> nextDayMGWorks = new ArrayList<>();
// 生成装载机工作流
workService.findWorks("", thisDayMWLWorks, "MWL", kateOrdersQuery.getPlanStartDate());
if (!thisDayMWLWorks.isEmpty()) {
allFlows.addAll(thisDayMWLWorks);
}
// 生成当天平地机工作流
workService.findWorks("", thisDayMGWorks, "NOT_MWL", kateOrdersQuery.getPlanStartDate());
if (!thisDayMGWorks.isEmpty()) {
allFlows.addAll(thisDayMGWorks);
// 查询配置是否需要合并第二天的配置
String ifMergeTomorrow = configMap.get(ConfigMapKeyEnum.IF_MERGE_TOMORROW.getConfigKey());
if (!StringUtils.isEmpty(ifMergeTomorrow) && ifMergeTomorrow.equals("1")) {
// 获取下一个工作日
LocalDate nextWorkDate = workService.nextWorkDate(kateOrdersQuery.getPlanStartDate());
if (nextWorkDate != null && nextWorkDate.isAfter(kateOrdersQuery.getPlanStartDate())) {
workService.findWorks("", nextDayMGWorks, "NOT_MWL", nextWorkDate);
}
if (!nextDayMGWorks.isEmpty()) {
// 添加第二天的平地机工作进汇总
allFlows.addAll(nextDayMGWorks);
}
}
}
}
if (!allFlows.isEmpty()) {
kateOrdersList = kateOrdersService.listByIds(allFlows.stream().map(WorkFlow::getOrderId).distinct().toList());
}
}
EasyExcel.write(response.getOutputStream(), KateOrdersExcelVo.class)
.excelType(ExcelTypeEnum.XLSX)
.registerWriteHandler(horizontalCellStyleStrategy)

View File

@ -0,0 +1,34 @@
package com.wms.entity.app.request;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
/**
* 拣选任务记录查询
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class PickTaskRecordQuery extends PageQuery {
/**
* 载具号
*/
@JsonProperty("vehicleId")
private String vehicleId;
/**
* 站台号
*/
@JsonProperty("standId")
private String standId;
/**
* 工作日期
*/
@JsonProperty("workDate")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate workDate;
}

View File

@ -1,5 +1,8 @@
package com.wms.service.business;
import com.wms.entity.table.WorkFlow;
import java.time.LocalDate;
import java.util.List;
/**
@ -40,4 +43,12 @@ public interface IWorkService {
void distributeWorks();
void distributeWorksMethod2();
void findCurrentDateWorks(List<WorkFlow> workFlows, LocalDate currentWorkDate);
void findCurrentDateWorksUseConfig(List<WorkFlow> workFlows, LocalDate currentWorkDate);
void findWorks(String workStation, List<WorkFlow> workFlows, String model, LocalDate currentWorkDate);
LocalDate nextWorkDate(LocalDate currentDate);
}

View File

@ -73,7 +73,8 @@ public class WorkServiceImplements implements IWorkService {
* @param currentDate 当前日期
* @return 下一个工作日
*/
private LocalDate nextWorkDate(LocalDate currentDate) {
@Override
public LocalDate nextWorkDate(LocalDate currentDate) {
// 判断是否是当天开工
int indexOfCurrentDate = localWorkDateList.indexOf(currentDate);
if (indexOfCurrentDate == -1) {
@ -903,7 +904,8 @@ public class WorkServiceImplements implements IWorkService {
* @param workFlows 工作流/工作任务
* @param model 机型
*/
private void findWorks(String workStation, List<WorkFlow> workFlows, String model, LocalDate currentWorkDate) {
@Override
public void findWorks(String workStation, List<WorkFlow> workFlows, String model, LocalDate currentWorkDate) {
String modelStr = Objects.equals(model, "MWL") ? "装载机" : "平地机";
//开始时间
LocalDateTime startTime = LocalDateTime.now();
@ -1029,19 +1031,20 @@ public class WorkServiceImplements implements IWorkService {
* @param workFlows 工作流
* @param currentWorkDate 日期
*/
private void findCurrentDateWorks(List<WorkFlow> workFlows, LocalDate currentWorkDate) {
@Override
public void findCurrentDateWorks(List<WorkFlow> workFlows, LocalDate currentWorkDate) {
//开始时间
LocalDateTime startTime = LocalDateTime.now();
System.out.println("分析当日工作流,开始时间:" + startTime);
// 获取开工日期调整配置
int dateAdjust = 0;
int dateAdjust = -1;
try {
String dateAdjustStr = configMap.get(ConfigMapKeyEnum.START_DATE_ADJUST.getConfigKey());
if (StringUtils.isNotEmpty(dateAdjustStr)) {
dateAdjust = Integer.parseInt(dateAdjustStr);
}
} catch (Exception e) {
logger.error("获取开工日期调整配置失败:{},使用默认值0", e.getMessage());
logger.error("获取开工日期调整配置失败:{},使用默认值-1", e.getMessage());
}
// 获取到需要查询的需求日期
int currentDateIndex = localWorkDateList.indexOf(currentWorkDate);
@ -1124,7 +1127,8 @@ public class WorkServiceImplements implements IWorkService {
* @param workFlows 工作流
* @param currentWorkDate 日期
*/
private void findCurrentDateWorksUseConfig(List<WorkFlow> workFlows, LocalDate currentWorkDate) {
@Override
public void findCurrentDateWorksUseConfig(List<WorkFlow> workFlows, LocalDate currentWorkDate) {
//开始时间
LocalDateTime startTime = LocalDateTime.now();
System.out.println("分析当日工作流,开始时间:" + startTime);
@ -1184,6 +1188,7 @@ public class WorkServiceImplements implements IWorkService {
}
if (currentDateKateWorkOrders.isEmpty()) {
logger.info("当前工作日没有待生成的工作流。");
return;
}
for (KateOrders tempOrder : currentDateKateWorkOrders) {
// 生成workFlow

View File

@ -1,6 +1,8 @@
package com.wms.utils;
import com.alibaba.fastjson2.JSON;
import org.springframework.boot.SpringApplication;
import org.springframework.context.ApplicationContext;
/**
* WMS字符串工具类
@ -27,6 +29,7 @@ public class StringUtils {
*/
public static String toUnderScoreCase(String str)
{
ApplicationContext applicationContext = SpringApplication.run(StringUtils.class);
if (str == null)
{
return null;
@ -140,4 +143,34 @@ public class StringUtils {
public static String padRight(String value, int size, String padStr) {
return org.apache.commons.lang3.StringUtils.rightPad(value, size, padStr);
}
/**
* 时长格式化最高xx天xx小时xx分xx秒
* @param origin
* @return 格式化字符串
*/
public static String durationFormat(Long origin) {
long dayDiv = 60 * 60 * 24;
long hourDiv = 60 * 60;
long minuteDiv = 60;
long days = origin / dayDiv;
long hours = (origin % dayDiv) / hourDiv;
long minutes = (origin % hourDiv) / minuteDiv;
long seconds = origin % minuteDiv;
String finalStr = "";
if (days > 0) {
finalStr += days + "";
}
if (hours > 0) {
finalStr += hours + "小时";
}
if (minutes > 0) {
finalStr += minutes + "分钟";
}
if (seconds > 0) {
finalStr += seconds + "";
}
return finalStr;
}
}

View File

@ -0,0 +1,98 @@
package com.wms.utils.excel.vo;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.wms.constants.enums.PickTaskStatusEnum;
import com.wms.entity.table.PickTaskRecord;
import com.wms.utils.StringUtils;
import lombok.Data;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.Objects;
/**
* 拣选任务记录excelVo
*/
@Data
public class PickTaskRecordExcelVo {
/**
* 拣选任务号
*/
@ExcelProperty("拣选任务号")
private String pickTaskId;
/**
* 载具号
*/
@ExcelProperty("载具号")
private String vehicleId;
/**
* 站台号
*/
@ExcelProperty("站台号")
private String standId;
/**
* 拣选任务状态
* -1暂时不可发送
* 0初始化
* 1已发送
* 2已完成
*/
@ExcelProperty("拣选任务状态")
private String pickStatus;
/**
* 到达时间
*/
@ExcelProperty("到达时间")
@DateTimeFormat("yyyy-MM-dd HH:mm:ss")
private LocalDateTime arriveTime;
/**
* 最近更新时间
*/
@ExcelProperty("离开时间")
@DateTimeFormat("yyyy-MM-dd HH:mm:ss")
private LocalDateTime lastUpdateTime;
/**
* 机型
* 1: 装载机2: 平地机
*/
@ExcelProperty("机型")
private String machineType;
/**
* 区域类型
* 1: 2:
*/
@ExcelProperty("区域类型")
private String areaType;
/**
* 滞留时长
*/
@ExcelProperty("滞留时长")
private String useTime;
/**
* 创建vo
* @param pickTaskRecord po
* @return vo
*/
public static PickTaskRecordExcelVo fromPo(PickTaskRecord pickTaskRecord) {
PickTaskRecordExcelVo pickTaskRecordExcelVo = new PickTaskRecordExcelVo();
pickTaskRecordExcelVo.setPickTaskId(pickTaskRecord.getPickTaskId());
pickTaskRecordExcelVo.setVehicleId(pickTaskRecord.getVehicleId());
pickTaskRecordExcelVo.setStandId(pickTaskRecord.getStandId());
pickTaskRecordExcelVo.setPickStatus(PickTaskStatusEnum.getValueByCode(pickTaskRecord.getPickStatus()));
pickTaskRecordExcelVo.setLastUpdateTime(pickTaskRecord.getLastUpdateTime());
pickTaskRecordExcelVo.setArriveTime(pickTaskRecord.getArriveTime());
pickTaskRecordExcelVo.setMachineType(Objects.equals(pickTaskRecord.getMachineType(), 1) ? "装载机" : "平地机");
pickTaskRecordExcelVo.setAreaType(Objects.equals(pickTaskRecord.getAreaType(), 1) ? "" : "");
if (pickTaskRecord.getArriveTime() != null && pickTaskRecord.getLastUpdateTime() != null) {
pickTaskRecordExcelVo.setUseTime(StringUtils.durationFormat(pickTaskRecord.getArriveTime().until(pickTaskRecord.getLastUpdateTime(), ChronoUnit.SECONDS)));
} else {
pickTaskRecordExcelVo.setUseTime("到达时间与离开时间中有一个错误。");
}
return pickTaskRecordExcelVo;
}
}