diff --git a/src/main/java/com/wms/constants/enums/PickTaskStatusEnum.java b/src/main/java/com/wms/constants/enums/PickTaskStatusEnum.java index a55490f..0b9880f 100644 --- a/src/main/java/com/wms/constants/enums/PickTaskStatusEnum.java +++ b/src/main/java/com/wms/constants/enums/PickTaskStatusEnum.java @@ -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; - } } diff --git a/src/main/java/com/wms/controller/ExcelController.java b/src/main/java/com/wms/controller/ExcelController.java index 28cde1c..9998874 100644 --- a/src/main/java/com/wms/controller/ExcelController.java +++ b/src/main/java/com/wms/controller/ExcelController.java @@ -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 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 recordList = Collections.emptyList(); + if (pickTaskRecordQuery.getWorkDate() != null) { + var queryWrapper = new LambdaQueryWrapper() + .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 kateOrdersLamdaQueryWrapper = new LambdaQueryWrapper() - .eq(kateOrdersQuery.getPlanStartDate() != null, KateOrders::getPlanStartDate, kateOrdersQuery.getPlanStartDate()) - .eq(kateOrdersQuery.getOrderStatus() != null, KateOrders::getOrderStatus, kateOrdersQuery.getOrderStatus()); - List kateOrdersList = kateOrdersService.list(kateOrdersLamdaQueryWrapper); + // 结果列表 + List kateOrdersList = Collections.emptyList(); + if (kateOrdersQuery.getPlanStartDate() != null) { + // 添加进总汇总数据 + List 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 thisDayMWLWorks = new ArrayList<>(); + // 获取到当天所有的平地机工作 + List thisDayMGWorks = new ArrayList<>(); + // 需要合并第二天的平地机工作 + List 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) diff --git a/src/main/java/com/wms/entity/app/request/PickTaskRecordQuery.java b/src/main/java/com/wms/entity/app/request/PickTaskRecordQuery.java new file mode 100644 index 0000000..0071a7f --- /dev/null +++ b/src/main/java/com/wms/entity/app/request/PickTaskRecordQuery.java @@ -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; +} diff --git a/src/main/java/com/wms/service/business/IWorkService.java b/src/main/java/com/wms/service/business/IWorkService.java index b9087f2..3878ffc 100644 --- a/src/main/java/com/wms/service/business/IWorkService.java +++ b/src/main/java/com/wms/service/business/IWorkService.java @@ -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 workFlows, LocalDate currentWorkDate); + + void findCurrentDateWorksUseConfig(List workFlows, LocalDate currentWorkDate); + + void findWorks(String workStation, List workFlows, String model, LocalDate currentWorkDate); + + LocalDate nextWorkDate(LocalDate currentDate); } diff --git a/src/main/java/com/wms/service/business/serviceImplements/WorkServiceImplements.java b/src/main/java/com/wms/service/business/serviceImplements/WorkServiceImplements.java index 4dd9ad8..603b2bb 100644 --- a/src/main/java/com/wms/service/business/serviceImplements/WorkServiceImplements.java +++ b/src/main/java/com/wms/service/business/serviceImplements/WorkServiceImplements.java @@ -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 workFlows, String model, LocalDate currentWorkDate) { + @Override + public void findWorks(String workStation, List 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 workFlows, LocalDate currentWorkDate) { + @Override + public void findCurrentDateWorks(List 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 workFlows, LocalDate currentWorkDate) { + @Override + public void findCurrentDateWorksUseConfig(List 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 diff --git a/src/main/java/com/wms/utils/StringUtils.java b/src/main/java/com/wms/utils/StringUtils.java index 7ee4acc..22cc368 100644 --- a/src/main/java/com/wms/utils/StringUtils.java +++ b/src/main/java/com/wms/utils/StringUtils.java @@ -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; + } } diff --git a/src/main/java/com/wms/utils/excel/vo/PickTaskRecordExcelVo.java b/src/main/java/com/wms/utils/excel/vo/PickTaskRecordExcelVo.java new file mode 100644 index 0000000..b9d9a84 --- /dev/null +++ b/src/main/java/com/wms/utils/excel/vo/PickTaskRecordExcelVo.java @@ -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; + } +}