diff --git a/src/main/java/com/wms/controller/ExcelController.java b/src/main/java/com/wms/controller/ExcelController.java index 9998874..71c3bfd 100644 --- a/src/main/java/com/wms/controller/ExcelController.java +++ b/src/main/java/com/wms/controller/ExcelController.java @@ -74,7 +74,8 @@ public class ExcelController { private final IWorkService workService; private final List uploadFileHashStringList = new ArrayList<>(); - private final PickTaskRecordService pickTaskRecordService; + private final PickTaskRecordService pickTaskRecordService;// 拣选任务记录服务 + private final AnalysisRecordService analysisRecordService;// 数据分析记录服务 /** * 查询上传记录 @@ -842,6 +843,41 @@ public class ExcelController { .doWrite(recordList.stream().map(PickTaskRecordExcelVo::fromPo).toList()); } + /** + * 导出数据分析记录 + * + * @param response 请求 + */ + @PostMapping("/downloadAnalysisRecordsExcel") + @ResponseBody + public void downloadAnalysisRecordsExcel(@RequestBody AnalysisRecordQuery analysisRecordQuery, HttpServletResponse response) throws IOException { + logger.info("导出数据分析记录,筛选参数:{},请求ip:{}", convertJsonString(analysisRecordQuery), 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(); + // 查询条件 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper() + .like(StringUtils.isNotEmpty(analysisRecordQuery.getWorkOrder()), AnalysisRecord::getWorkOrder, analysisRecordQuery.getWorkOrder()) + .like(StringUtils.isNotEmpty(analysisRecordQuery.getSmallBox()), AnalysisRecord::getSmallBox, analysisRecordQuery.getSmallBox()) + .like(StringUtils.isNotEmpty(analysisRecordQuery.getBigBox()), AnalysisRecord::getBigBox, analysisRecordQuery.getBigBox()) + .like(StringUtils.isNotEmpty(analysisRecordQuery.getGoodsId()), AnalysisRecord::getGoodsId, analysisRecordQuery.getGoodsId()) + .eq(analysisRecordQuery.getMachineType() != null, AnalysisRecord::getMachineType, analysisRecordQuery.getMachineType()) + .eq(analysisRecordQuery.getStartDate() != null, AnalysisRecord::getStartDate, analysisRecordQuery.getStartDate()) + .like(StringUtils.isNotEmpty(analysisRecordQuery.getVehicleId()), AnalysisRecord::getVehicleId, analysisRecordQuery.getVehicleId()) + .like(StringUtils.isNotEmpty(analysisRecordQuery.getStandId()), AnalysisRecord::getStandId, analysisRecordQuery.getStandId()); + List recordList = analysisRecordService.list(lambdaQueryWrapper); + EasyExcel.write(response.getOutputStream(), AnalysisRecordExcelVo.class) + .excelType(ExcelTypeEnum.XLSX) + .registerWriteHandler(horizontalCellStyleStrategy) + .sheet("数据分析记录报表") + .doWrite(recordList.stream().map(po -> BeanUtil.copyProperties(po, AnalysisRecordExcelVo.class)).toList()); + } + /** * 导出工单 * diff --git a/src/main/java/com/wms/controller/RecordController.java b/src/main/java/com/wms/controller/RecordController.java index 5a52a72..882cebc 100644 --- a/src/main/java/com/wms/controller/RecordController.java +++ b/src/main/java/com/wms/controller/RecordController.java @@ -7,17 +7,12 @@ import com.wms.annotation.MyLog; import com.wms.constants.enums.ResponseCode; import com.wms.entity.app.ResponseEntity; import com.wms.entity.app.dto.PageDto; +import com.wms.entity.app.request.AnalysisRecordQuery; import com.wms.entity.app.request.InventoryQuery; import com.wms.entity.app.request.TaskRecordQuery; -import com.wms.entity.app.request.WorkSummaryQuery; -import com.wms.entity.app.vo.InventoryRecordVo; -import com.wms.entity.app.vo.InventoryVo; -import com.wms.entity.app.vo.TaskRecordVO; -import com.wms.entity.app.vo.WorkSummaryVo; -import com.wms.entity.table.InventoryHistory; -import com.wms.entity.table.InventoryList; -import com.wms.entity.table.TaskRecord; -import com.wms.entity.table.WorkSummary; +import com.wms.entity.app.vo.*; +import com.wms.entity.table.*; +import com.wms.service.AnalysisRecordService; import com.wms.service.InventoryHistoryService; import com.wms.service.InventoryListService; import com.wms.service.TaskRecordService; @@ -59,14 +54,15 @@ public class RecordController { private final HttpServletRequest servletRequest; private final InventoryListService inventoryService;// 盘点服务 private final InventoryHistoryService inventoryHistoryService;// 盘点记录服务 + private final AnalysisRecordService analysisRecordService;// 数据分析记录服务 /** - * 查找所有物料 + * 查找所有任务记录 */ @PostMapping("/getTaskRecordByPage") @ResponseBody @Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED) - public String getGoodsInfoByPage(@RequestBody TaskRecordQuery taskRecordQuery){ + public String getTaskRecordByPage(@RequestBody TaskRecordQuery taskRecordQuery){ logger.info("接收到查询任务记录请求:{},请求ip:{}", convertJsonString(taskRecordQuery), HttpUtils.getIpAddr(servletRequest)); ResponseEntity response = new ResponseEntity(); try { @@ -160,4 +156,42 @@ public class RecordController { return convertJsonString(response); } } + + /** + * 查找所有数据分析记录 + */ + @PostMapping("/getAnalysisRecordByPage") + @ResponseBody + @Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED) + public String getAnalysisRecordByPage(@RequestBody AnalysisRecordQuery analysisRecordQuery){ + logger.info("接收到查询数据分析记录请求:{},请求ip:{}", convertJsonString(analysisRecordQuery), HttpUtils.getIpAddr(servletRequest)); + ResponseEntity response = new ResponseEntity(); + try { + Page page = analysisRecordQuery.toMpPage(); + // 查询条件 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper() + .like(StringUtils.isNotEmpty(analysisRecordQuery.getWorkOrder()), AnalysisRecord::getWorkOrder, analysisRecordQuery.getWorkOrder()) + .like(StringUtils.isNotEmpty(analysisRecordQuery.getSmallBox()), AnalysisRecord::getSmallBox, analysisRecordQuery.getSmallBox()) + .like(StringUtils.isNotEmpty(analysisRecordQuery.getBigBox()), AnalysisRecord::getBigBox, analysisRecordQuery.getBigBox()) + .like(StringUtils.isNotEmpty(analysisRecordQuery.getGoodsId()), AnalysisRecord::getGoodsId, analysisRecordQuery.getGoodsId()) + .eq(StringUtils.isNotEmpty(analysisRecordQuery.getMachineType()), AnalysisRecord::getMachineType, analysisRecordQuery.getMachineType()) + .eq(analysisRecordQuery.getStartDate() != null, AnalysisRecord::getStartDate, analysisRecordQuery.getStartDate()) + .like(StringUtils.isNotEmpty(analysisRecordQuery.getVehicleId()), AnalysisRecord::getVehicleId, analysisRecordQuery.getVehicleId()) + .like(StringUtils.isNotEmpty(analysisRecordQuery.getStandId()), AnalysisRecord::getStandId, analysisRecordQuery.getStandId()); + Page analysisRecordPage = analysisRecordService.page(page, lambdaQueryWrapper); + // 生成数据 + PageDto pageDto = PageDto.of(analysisRecordPage, records -> BeanUtil.copyProperties(records, AnalysisRecordVo.class)); + response.setCode(ResponseCode.OK.getCode()); + response.setMessage("查询成功"); + response.setReturnData(pageDto); + return convertJsonString(response); + } catch (Exception e) { + // 回滚事务 + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + logger.error("查询数据分析记录发生异常"); + response.setCode(ResponseCode.ERROR.getCode()); + response.setMessage("查询数据分析记录发生异常"); + return convertJsonString(response); + } + } } diff --git a/src/main/java/com/wms/controller/TaskController.java b/src/main/java/com/wms/controller/TaskController.java index bcaed84..58fdcf3 100644 --- a/src/main/java/com/wms/controller/TaskController.java +++ b/src/main/java/com/wms/controller/TaskController.java @@ -39,12 +39,14 @@ import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; 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.StringUtils.convertJsonString; +import static com.wms.utils.StringUtils.durationFormat; import static com.wms.utils.WmsUtils.generateId; /** @@ -156,6 +158,7 @@ public class TaskController { private final InventoryListService inventoryService; private final WorkSummaryService workSummaryService; private final InventoryHistoryService inventoryHistoryService; + private final AnalysisRecordService analysisRecordService;// 数据分析记录服务 // 定义全局锁对象 为了电子标签反馈消息互斥 @@ -923,6 +926,13 @@ public class TaskController { .set(Stock::getStockStatus, StockStatus.PICKING.getCode()) .eq(Stock::getVehicleId, boxArriveRequest.getVehicleNo()) .ne(Stock::getStockStatus, StockStatus.PICKING.getCode())); + // TODO 3.9 增加数据分析记录 + AnalysisRecord analysisRecord = new AnalysisRecord(); + analysisRecord.setRecordId(WmsUtils.generateId("")); + analysisRecord.setStandId(pickTask.getStandId()); + analysisRecord.setVehicleId(pickTask.getVehicleId()); + analysisRecord.setArriveTime(LocalDateTime.now()); + analysisRecordService.save(analysisRecord); response.setCode(ResponseCode.OK.getCode()); response.setMessage("上报成功"); @@ -1030,6 +1040,9 @@ public class TaskController { response.setMessage("当前站台当前物料查询不到对应的工作,请扫描其他料号或者按按钮。"); return convertJsonString(response); } + // TODO 3/9 数据分析记录新增 + List analysisRecords = new ArrayList<>(); + // 亮灯 BigDecimal originNum = stock.getGoodsRelated().getRemainNum(); BigDecimal realNum = stock.getGoodsRelated().getRemainNum(); @@ -1069,10 +1082,23 @@ public class TaskController { .set(ETagLocation::getConfirmNum, eTaskData.getNeedNum()) .eq(ETagLocation::getELocationId, eConfig.getELocationId())); // 设置工作流更新信息 -// tempWork.setPickedNum(tempWork.getPickedNum().add(thisPickNum)); tempWork.setLightStatus(1); tempWork.setOpUser(workQuery.getUserName()); realNum = realNum.subtract(thisPickNum); + // TODO 3/9 添加数据分析记录 + AnalysisRecord analysisRecord = new AnalysisRecord(); + analysisRecord.setRecordId(generateId("")); + analysisRecord.setWorkOrder(tempWork.getWorkOrder()); + analysisRecord.setSmallBox(tempWork.getWorkCenter()); + analysisRecord.setBigBox(tempWork.getBigBox()); + analysisRecord.setGoodsId(tempWork.getGoodsId()); + analysisRecord.setMachineType(tempWork.getMachineType() == 1 ? "装载机" : "平地机"); + analysisRecord.setStartDate(tempWork.getPlanDate()); + analysisRecord.setVehicleId(vehicleId); + analysisRecord.setStandId(standId); + analysisRecord.setLightTime(LocalDateTime.now()); + analysisRecord.setRequireNum(thisPickNum); + analysisRecords.add(analysisRecord); } } if (!eTaskDataList.isEmpty()) { @@ -1117,6 +1143,15 @@ public class TaskController { .set(Stand::getPickGoods, workQuery.getGoodsId()) .set(Stand::getPickVehicle, vehicleId) .eq(Stand::getStandId, standId)); + // TODO 3/9 保存数据分析记录 + try { + if (!analysisRecords.isEmpty()) { + analysisRecordService.saveBatch(analysisRecords); + } + } catch (Exception e) { + logger.error("保存数据分析记录错误{}", JSON.toJSONString(e)); + } + // 生成前台VO StandPickVo standPickVo = new StandPickVo(); standPickVo.setStandId(standId); @@ -1433,6 +1468,25 @@ public class TaskController { .set(ETagLocation::getNeedNum, null) .set(ETagLocation::getConfirmNum, null) .eq(ETagLocation::getELocationId, eTaskFeedbackRequest.getLocation())); + // TODO 3/9 新增数据分析记录 + try { + AnalysisRecord analysisRecord = new AnalysisRecord(); + analysisRecord.setRecordId(generateId("")); + analysisRecord.setWorkOrder(workFlow.getWorkOrder()); + analysisRecord.setSmallBox(workFlow.getWorkCenter()); + analysisRecord.setBigBox(workFlow.getBigBox()); + analysisRecord.setGoodsId(workFlow.getGoodsId()); + analysisRecord.setMachineType(workFlow.getMachineType() == 1 ? "装载机" : "平地机"); + analysisRecord.setStartDate(workFlow.getPlanDate()); + analysisRecord.setVehicleId(eTaskFeedbackRequest.getVehicleNo()); + analysisRecord.setStandId(workFlow.getWorkStation()); + analysisRecord.setCloseTime(LocalDateTime.now()); + analysisRecord.setConfirmNum(BigDecimal.valueOf(eTaskFeedbackRequest.getConfirmNum())); + analysisRecordService.save(analysisRecord); + } catch (Exception e) { + logger.error("添加数据分析记录失败:{}", JSON.toJSONString(e)); + } + } else {// 小盒子放入大盒子 // 根据location查询到对应的配置 ELocationConfigLast eLocationConfigLast = eLocationConfigLastService.getOne(new LambdaQueryWrapper() @@ -1636,6 +1690,19 @@ public class TaskController { response.setReturnData(pickVoEntity); } response.setCode(ResponseCode.OK.getCode()); + // TODO 3/9 新增数据分析记录 + try { + AnalysisRecord analysisRecord = new AnalysisRecord(); + analysisRecord.setRecordId(generateId("")); + analysisRecord.setVehicleId(pickTask.getVehicleId()); + analysisRecord.setStandId(standId); + analysisRecord.setArriveTime(pickTask.getArriveTime()); + analysisRecord.setLeaveTime(LocalDateTime.now()); + analysisRecord.setLastTime(durationFormat(analysisRecord.getArriveTime().until(analysisRecord.getLeaveTime(), ChronoUnit.SECONDS))); + analysisRecordService.save(analysisRecord); + } catch (Exception e) { + logger.error("数据分析记录保存异常{}", JSON.toJSONString(e)); + } } } else { // 存储拣选记录 @@ -1675,6 +1742,19 @@ public class TaskController { response.setReturnData(pickVoEntity); } response.setCode(ResponseCode.OK.getCode()); + // TODO 3/9 新增数据分析记录 + try { + AnalysisRecord analysisRecord = new AnalysisRecord(); + analysisRecord.setRecordId(generateId("")); + analysisRecord.setVehicleId(pickTask.getVehicleId()); + analysisRecord.setStandId(standId); + analysisRecord.setArriveTime(pickTask.getArriveTime()); + analysisRecord.setLeaveTime(LocalDateTime.now()); + analysisRecord.setLastTime(durationFormat(analysisRecord.getArriveTime().until(analysisRecord.getLeaveTime(), ChronoUnit.SECONDS))); + analysisRecordService.save(analysisRecord); + } catch (Exception e) { + logger.error("数据分析记录保存异常{}", JSON.toJSONString(e)); + } } } return convertJsonString(response); @@ -1812,6 +1892,19 @@ public class TaskController { response.setMessage("当前工作已经全部完成,请至完成界面进行后续工作。"); } response.setCode(ResponseCode.OK.getCode()); + // TODO 3/9 新增数据分析记录 + try { + AnalysisRecord analysisRecord = new AnalysisRecord(); + analysisRecord.setRecordId(generateId("")); + analysisRecord.setVehicleId(pickTask.getVehicleId()); + analysisRecord.setStandId(pickTask.getStandId()); + analysisRecord.setArriveTime(pickTask.getArriveTime()); + analysisRecord.setLeaveTime(LocalDateTime.now()); + analysisRecord.setLastTime(durationFormat(analysisRecord.getArriveTime().until(analysisRecord.getLeaveTime(), ChronoUnit.SECONDS))); + analysisRecordService.save(analysisRecord); + } catch (Exception e) { + logger.error("数据分析记录保存异常{}", JSON.toJSONString(e)); + } } } else { // 存储拣选记录 @@ -1848,6 +1941,19 @@ public class TaskController { response.setMessage("当前工作已经全部完成,请至完成界面进行后续工作。"); } response.setCode(ResponseCode.OK.getCode()); + // TODO 3/9 新增数据分析记录 + try { + AnalysisRecord analysisRecord = new AnalysisRecord(); + analysisRecord.setRecordId(generateId("")); + analysisRecord.setVehicleId(pickTask.getVehicleId()); + analysisRecord.setStandId(pickTask.getStandId()); + analysisRecord.setArriveTime(pickTask.getArriveTime()); + analysisRecord.setLeaveTime(LocalDateTime.now()); + analysisRecord.setLastTime(durationFormat(analysisRecord.getArriveTime().until(analysisRecord.getLeaveTime(), ChronoUnit.SECONDS))); + analysisRecordService.save(analysisRecord); + } catch (Exception e) { + logger.error("数据分析记录保存异常{}", JSON.toJSONString(e)); + } } } return convertJsonString(response); @@ -2586,6 +2692,8 @@ public class TaskController { WorkStationConfig currentBigBoxConfig = stationConfigs.get(0); // 当前配置的工单数/大盒子 int orderQuantity = currentBigBoxConfig.getOrderQuantity(); + // 亮灯顺序是否为正序 + boolean isAsc = Objects.equals(currentBigBoxConfig.getVehicleLocation(), "1"); // 亮灯列表 List eTaskDataList = new ArrayList<>(); // 查询这个大盒子对应的小盒子 @@ -2635,11 +2743,12 @@ public class TaskController { // 利用DBS对这些工单id进行排序 LambdaQueryWrapper dbsQueryWrapper = new LambdaQueryWrapper() .in(KateDBS::getWorkOrder, orderIds); - if (Objects.equals(currentBigBoxConfig.getModel(), "MWL")) { - // 装载机正序排序 + // 根据配置判断是否是正序排序 + if (isAsc) { + // 正序排序 dbsQueryWrapper.orderByAsc(KateDBS::getWorkSequence); } else { - // 平地机倒序排序 + // 倒序排序 dbsQueryWrapper.orderByDesc(KateDBS::getWorkSequence); } List kateDBSList = kateDBSService.list(dbsQueryWrapper); @@ -2652,11 +2761,12 @@ public class TaskController { // 查询到这些工单的dbs Map orderedOrdersIdsMap = kateDBSList.stream().collect(Collectors.toMap(KateDBS::getWorkOrder, KateDBS::getWorkSequence)); List orderedOrdersIds; - if (Objects.equals(currentBigBoxConfig.getModel(), "MWL")) { - // 装载机正序排序 + // 根据配置判断是否是正序排序 + if (isAsc) { + // 正序排序 orderedOrdersIds = orderedOrdersIdsMap.entrySet().stream().sorted(Map.Entry.comparingByValue()).map(Map.Entry::getKey).toList(); } else { - // 平地机倒序排序 + // 倒序排序 orderedOrdersIds = orderedOrdersIdsMap.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())).map(Map.Entry::getKey).toList(); } List toBeLightedOrders = orderedOrdersIds.stream().skip((long) (sortBoxRequest.getOrderOfOrders() - 1) * orderQuantity).limit(orderQuantity).toList(); diff --git a/src/main/java/com/wms/entity/app/request/AnalysisRecordQuery.java b/src/main/java/com/wms/entity/app/request/AnalysisRecordQuery.java new file mode 100644 index 0000000..83859e3 --- /dev/null +++ b/src/main/java/com/wms/entity/app/request/AnalysisRecordQuery.java @@ -0,0 +1,119 @@ +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.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * 数据分析记录查询参数 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class AnalysisRecordQuery extends PageQuery { + /** + * 主键 + */ + @JsonProperty("recordId") + private String recordId; + /**、 + * 工单 + */ + @JsonProperty("workOrder") + private String workOrder; + /** + * 小盒子 + */ + @JsonProperty("smallBox") + private String smallBox; + /** + * 大盒子 + */ + @JsonProperty("bigBox") + private String bigBox; + /** + * 料号 + */ + @JsonProperty("goodsId") + private String goodsId; + /** + * 机型 + */ + @JsonProperty("machineType") + private String machineType; + /** + * 开工日期 + */ + @JsonProperty("startDate") + @JsonFormat(pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate startDate; + /** + * 载具号 + */ + @JsonProperty("vehicleId") + private String vehicleId; + /** + * 库位号 + */ + @JsonProperty("locationId") + private String locationId; + /** + * 本次分配数量 + */ + @JsonProperty("distributeQty") + private BigDecimal distributeQty; + /** + * 站台号 + */ + @JsonProperty("standId") + private String standId; + /** + * 到达时间 + */ + @JsonProperty("arriveTime") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime arriveTime; + /** + * 离开时间 + */ + @JsonProperty("leaveTime") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime leaveTime; + /** + * 滞留时常 + */ + @JsonProperty("lastTime") + private String lastTime; + /** + * 亮灯时间 + */ + @JsonProperty("lightTime") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime lightTime; + /** + * 拍灯时间 + */ + @JsonProperty("closeTime") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime closeTime; + /** + * 需求数量 + */ + @JsonProperty("requireNum") + private BigDecimal requireNum; + /** + * 确认数量 + */ + @JsonProperty("confirmNum") + private BigDecimal confirmNum; +} diff --git a/src/main/java/com/wms/entity/app/vo/AnalysisRecordVo.java b/src/main/java/com/wms/entity/app/vo/AnalysisRecordVo.java new file mode 100644 index 0000000..f2ceb9f --- /dev/null +++ b/src/main/java/com/wms/entity/app/vo/AnalysisRecordVo.java @@ -0,0 +1,117 @@ +package com.wms.entity.app.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * 数据分析记录vo + */ +@Data +public class AnalysisRecordVo { + /** + * 主键 + */ + @JsonProperty("recordId") + private String recordId; + /** + * 工单 + */ + @JsonProperty("workOrder") + private String workOrder; + /** + * 小盒子 + */ + @JsonProperty("smallBox") + private String smallBox; + /** + * 大盒子 + */ + @JsonProperty("bigBox") + private String bigBox; + /** + * 料号 + */ + @JsonProperty("goodsId") + private String goodsId; + /** + * 机型 + */ + @JsonProperty("machineType") + private String machineType; + /** + * 开工日期 + */ + @JsonProperty("startDate") + @JsonFormat(pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate startDate; + /** + * 载具号 + */ + @JsonProperty("vehicleId") + private String vehicleId; + /** + * 库位号 + */ + @JsonProperty("locationId") + private String locationId; + /** + * 本次分配数量 + */ + @JsonProperty("distributeQty") + private BigDecimal distributeQty; + /** + * 站台号 + */ + @JsonProperty("standId") + private String standId; + /** + * 到达时间 + */ + @JsonProperty("arriveTime") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime arriveTime; + /** + * 离开时间 + */ + @JsonProperty("leaveTime") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime leaveTime; + /** + * 滞留时长 + */ + @JsonProperty("lastTime") + private String lastTime; + /** + * 亮灯时间 + */ + @JsonProperty("lightTime") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime lightTime; + /** + * 拍灯时间 + */ + @JsonProperty("closeTime") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime closeTime; + /** + * 需求数量 + */ + @JsonProperty("requireNum") + private BigDecimal requireNum; + /** + * 确认数量 + */ + @JsonProperty("confirmNum") + private BigDecimal confirmNum; +} diff --git a/src/main/java/com/wms/entity/table/AnalysisRecord.java b/src/main/java/com/wms/entity/table/AnalysisRecord.java new file mode 100644 index 0000000..0f4c397 --- /dev/null +++ b/src/main/java/com/wms/entity/table/AnalysisRecord.java @@ -0,0 +1,110 @@ +package com.wms.entity.table; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Getter; +import lombok.Setter; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * 记录表 + */ +@Getter +@Setter +@TableName("tbl_app_analysis_record") +public class AnalysisRecord { + /** + * 主键 + */ + @TableId("record_id") + private String recordId; + /**、 + * 工单 + */ + @TableField("work_order") + private String workOrder; + /** + * 小盒子 + */ + @TableField("small_box") + private String smallBox; + /** + * 大盒子 + */ + @TableField("big_box") + private String bigBox; + /** + * 料号 + */ + @TableField("goods_id") + private String goodsId; + /** + * 机型 + */ + @TableField("machine_type") + private String machineType; + /** + * 开工日期 + */ + @TableField("start_date") + private LocalDate startDate; + /** + * 载具号 + */ + @TableField("vehicle_id") + private String vehicleId; + /** + * 库位号 + */ + @TableField("location_id") + private String locationId; + /** + * 本次分配数量 + */ + @TableField("distribute_qty") + private BigDecimal distributeQty; + /** + * 站台号 + */ + @TableField("stand_id") + private String standId; + /** + * 到达时间 + */ + @TableField("arrive_time") + private LocalDateTime arriveTime; + /** + * 离开时间 + */ + @TableField("leave_time") + private LocalDateTime leaveTime; + /** + * 滞留时常 + */ + @TableField("last_time") + private String lastTime; + /** + * 亮灯时间 + */ + @TableField("light_time") + private LocalDateTime lightTime; + /** + * 拍灯时间 + */ + @TableField("close_time") + private LocalDateTime closeTime; + /** + * 需求数量 + */ + @TableField("require_num") + private BigDecimal requireNum; + /** + * 确认数量 + */ + @TableField("confirm_num") + private BigDecimal confirmNum; +} diff --git a/src/main/java/com/wms/mapper/AnalysisRecordMapper.java b/src/main/java/com/wms/mapper/AnalysisRecordMapper.java new file mode 100644 index 0000000..f48a66e --- /dev/null +++ b/src/main/java/com/wms/mapper/AnalysisRecordMapper.java @@ -0,0 +1,12 @@ +package com.wms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.wms.entity.table.AnalysisRecord; +import org.apache.ibatis.annotations.Mapper; + +/** + * 分析记录mapper + */ +@Mapper +public interface AnalysisRecordMapper extends BaseMapper { +} diff --git a/src/main/java/com/wms/service/AnalysisRecordService.java b/src/main/java/com/wms/service/AnalysisRecordService.java new file mode 100644 index 0000000..dac6fa3 --- /dev/null +++ b/src/main/java/com/wms/service/AnalysisRecordService.java @@ -0,0 +1,10 @@ +package com.wms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.wms.entity.table.AnalysisRecord; + +/** + * 分析记录 服务接口 + */ +public interface AnalysisRecordService extends IService { +} 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 552462c..e5d139f 100644 --- a/src/main/java/com/wms/service/business/serviceImplements/WorkServiceImplements.java +++ b/src/main/java/com/wms/service/business/serviceImplements/WorkServiceImplements.java @@ -13,6 +13,7 @@ import com.wms.service.business.IWmsTaskService; import com.wms.service.business.IWorkService; import com.wms.utils.DbTransUtils; import com.wms.utils.StringUtils; +import com.wms.utils.WmsUtils; import lombok.RequiredArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -60,6 +61,7 @@ public class WorkServiceImplements implements IWorkService { private final List workCreatingStations = new ArrayList<>();// 当前正在创建任务的站台 private final VehicleService vehicleService;// 料箱服务 private final DbTransUtils dbTransUtils;// 事务事务工具类 + private final AnalysisRecordService analysisRecordService;// 数据分析记录服务 //获取配置文件的是否添加了需求时间 @@ -375,6 +377,8 @@ public class WorkServiceImplements implements IWorkService { List needUpdateWorkFlowIds = new ArrayList<>();// 需要更新的工作流id List needUpdateOrderIds = new ArrayList<>();// 需要更新的工单id List thisTimeCannotOutVehicleIds = new ArrayList<>();// 本次不能出库的载具号 + // 本次需要添加的分析记录 TODO 新增于3/6 + List anysisRecordList = new ArrayList<>(); // 查询出所有的库存 List allStockList = stockService.list(); // 第一次循环,分出已经出库的物料。 @@ -460,12 +464,32 @@ public class WorkServiceImplements implements IWorkService { if (needNum.compareTo(BigDecimal.ZERO) <= 0) { continue; } - if (afterNum.compareTo(needNum) >= 0) { - afterNum = afterNum.subtract(needNum); - workFlow.setDistributedNum(workFlow.getNeedNum()); + // 生成记录数据 TODO 新增于3/6 + AnalysisRecord analysisRecord = new AnalysisRecord(); + analysisRecord.setRecordId(WmsUtils.generateId("")); + analysisRecord.setWorkOrder(workFlow.getWorkOrder()); + analysisRecord.setSmallBox(workFlow.getWorkCenter()); + analysisRecord.setBigBox(workFlow.getBigBox()); + analysisRecord.setGoodsId(workFlow.getGoodsId()); + if (Objects.equals(workFlow.getMachineType(), 1)) { + analysisRecord.setMachineType("装载机"); + } else if (Objects.equals(workFlow.getMachineType(), 2)) { + analysisRecord.setMachineType("平地机"); } else { - afterNum = BigDecimal.ZERO; + analysisRecord.setMachineType("机型错误值:" + workFlow.getMachineType()); + } + analysisRecord.setStartDate(workFlow.getPlanDate()); + + if (afterNum.compareTo(needNum) >= 0) { + // TODO 新增数据分析记录 3/6 + analysisRecord.setDistributeQty(needNum); + workFlow.setDistributedNum(workFlow.getNeedNum()); + afterNum = afterNum.subtract(needNum); + } else { + // TODO 新增数据分析记录 3/6 + analysisRecord.setDistributeQty(afterNum); workFlow.setDistributedNum(workFlow.getDistributedNum() == null ? afterNum : workFlow.getDistributedNum().add(afterNum)); + afterNum = BigDecimal.ZERO; } workFlow.setWorkStatus(1); // 添加需要更新的工作流id @@ -476,6 +500,11 @@ public class WorkServiceImplements implements IWorkService { if (!needUpdateOrderIds.contains(workFlow.getOrderId())) { needUpdateOrderIds.add(workFlow.getOrderId()); } + // TODO 新增数据分析记录 3/6 + analysisRecord.setVehicleId(stock.getVehicleId()); + analysisRecord.setLocationId(stock.getLocationId()); + analysisRecord.setStandId(standId); + anysisRecordList.add(analysisRecord); } } if (afterNum.compareTo(originNum) != 0) { @@ -539,12 +568,32 @@ public class WorkServiceImplements implements IWorkService { if (needNum.compareTo(BigDecimal.ZERO) <= 0) { continue; } - if (afterNum.compareTo(needNum) >= 0) { - afterNum = afterNum.subtract(needNum); - workFlow.setDistributedNum(workFlow.getNeedNum()); + // 生成记录数据 TODO 新增于3/6 + AnalysisRecord analysisRecord = new AnalysisRecord(); + analysisRecord.setRecordId(WmsUtils.generateId("")); + analysisRecord.setWorkOrder(workFlow.getWorkOrder()); + analysisRecord.setSmallBox(workFlow.getWorkCenter()); + analysisRecord.setBigBox(workFlow.getBigBox()); + analysisRecord.setGoodsId(workFlow.getGoodsId()); + if (Objects.equals(workFlow.getMachineType(), 1)) { + analysisRecord.setMachineType("装载机"); + } else if (Objects.equals(workFlow.getMachineType(), 2)) { + analysisRecord.setMachineType("平地机"); } else { - afterNum = BigDecimal.ZERO; + analysisRecord.setMachineType("机型错误值:" + workFlow.getMachineType()); + } + analysisRecord.setStartDate(workFlow.getPlanDate()); + + if (afterNum.compareTo(needNum) >= 0) { + // TODO 新增数据分析记录 3/6 + analysisRecord.setDistributeQty(needNum); + workFlow.setDistributedNum(workFlow.getNeedNum()); + afterNum = afterNum.subtract(needNum); + } else { + // TODO 新增数据分析记录 3/6 + analysisRecord.setDistributeQty(afterNum); workFlow.setDistributedNum(workFlow.getDistributedNum() == null ? afterNum : workFlow.getDistributedNum().add(afterNum)); + afterNum = BigDecimal.ZERO; } workFlow.setWorkStatus(1); // 添加需要更新的工作流id @@ -555,6 +604,12 @@ public class WorkServiceImplements implements IWorkService { if (!needUpdateOrderIds.contains(workFlow.getOrderId())) { needUpdateOrderIds.add(workFlow.getOrderId()); } + + // TODO 新增数据分析记录 3/6 + analysisRecord.setVehicleId(stock.getVehicleId()); + analysisRecord.setLocationId(stock.getLocationId()); + analysisRecord.setStandId(standId); + anysisRecordList.add(analysisRecord); } } if (afterNum.compareTo(originNum) != 0) { @@ -587,12 +642,32 @@ public class WorkServiceImplements implements IWorkService { if (needNum.compareTo(BigDecimal.ZERO) <= 0) { continue; } - if (afterNum.compareTo(needNum) >= 0) { - afterNum = afterNum.subtract(needNum); - workFlow.setDistributedNum(workFlow.getNeedNum()); + // 生成记录数据 TODO 新增于3/6 + AnalysisRecord analysisRecord = new AnalysisRecord(); + analysisRecord.setRecordId(WmsUtils.generateId("")); + analysisRecord.setWorkOrder(workFlow.getWorkOrder()); + analysisRecord.setSmallBox(workFlow.getWorkCenter()); + analysisRecord.setBigBox(workFlow.getBigBox()); + analysisRecord.setGoodsId(workFlow.getGoodsId()); + if (Objects.equals(workFlow.getMachineType(), 1)) { + analysisRecord.setMachineType("装载机"); + } else if (Objects.equals(workFlow.getMachineType(), 2)) { + analysisRecord.setMachineType("平地机"); } else { - afterNum = BigDecimal.ZERO; + analysisRecord.setMachineType("机型错误值:" + workFlow.getMachineType()); + } + analysisRecord.setStartDate(workFlow.getPlanDate()); + + if (afterNum.compareTo(needNum) >= 0) { + // TODO 新增数据分析记录 3/6 + analysisRecord.setDistributeQty(needNum); + workFlow.setDistributedNum(workFlow.getNeedNum()); + afterNum = afterNum.subtract(needNum); + } else { + // TODO 新增数据分析记录 3/6 + analysisRecord.setDistributeQty(afterNum); workFlow.setDistributedNum(workFlow.getDistributedNum() == null ? afterNum : workFlow.getDistributedNum().add(afterNum)); + afterNum = BigDecimal.ZERO; } workFlow.setWorkStatus(1); // 添加需要更新的工作流id @@ -603,6 +678,12 @@ public class WorkServiceImplements implements IWorkService { if (!needUpdateOrderIds.contains(workFlow.getOrderId())) { needUpdateOrderIds.add(workFlow.getOrderId()); } + // TODO 新增数据分析记录 3/6 + analysisRecord.setVehicleId(stock.getVehicleId()); + analysisRecord.setLocationId(stock.getLocationId()); + analysisRecord.setStandId(workFlow.getWorkStation()); + anysisRecordList.add(analysisRecord); + // 创建拣选任务 String key = stock.getVehicleId() + "_" + workFlow.getWorkStation(); // 此次新建的保存过 @@ -653,10 +734,20 @@ public class WorkServiceImplements implements IWorkService { .set(KateOrders::getLastUpdateReason, "执行工作") .in(KateOrders::getOrderId, needUpdateOrderIds)); } + } }); if (!doTransResult) { logger.error("解析工作生成任务时,数据库事务执行错误。"); + } else { + // TODO 3/9 新增保存数据分析记录 + try { + if (!anysisRecordList.isEmpty()) { + analysisRecordService.saveBatch(anysisRecordList); + } + } catch (Exception e) { + logger.error("保存数据分析记录时发生错误。{}", JSON.toJSONString(e)); + } } } diff --git a/src/main/java/com/wms/service/serviceImplements/AnalysisRecordServiceImpl.java b/src/main/java/com/wms/service/serviceImplements/AnalysisRecordServiceImpl.java new file mode 100644 index 0000000..00a1e5f --- /dev/null +++ b/src/main/java/com/wms/service/serviceImplements/AnalysisRecordServiceImpl.java @@ -0,0 +1,14 @@ +package com.wms.service.serviceImplements; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.wms.entity.table.AnalysisRecord; +import com.wms.mapper.AnalysisRecordMapper; +import com.wms.service.AnalysisRecordService; +import org.springframework.stereotype.Service; + +/** + * 分析记录 服务实现类 + */ +@Service +public class AnalysisRecordServiceImpl extends ServiceImpl implements AnalysisRecordService { +} diff --git a/src/main/java/com/wms/utils/excel/listener/UploadStationConfigListener.java b/src/main/java/com/wms/utils/excel/listener/UploadStationConfigListener.java index 45aee8b..615b28b 100644 --- a/src/main/java/com/wms/utils/excel/listener/UploadStationConfigListener.java +++ b/src/main/java/com/wms/utils/excel/listener/UploadStationConfigListener.java @@ -4,7 +4,6 @@ import cn.hutool.core.bean.BeanUtil; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.read.listener.ReadListener; import com.alibaba.excel.util.ListUtils; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.wms.config.InitLocalConfig; import com.wms.entity.table.WorkStationConfig; import com.wms.service.WorkStationConfigService; @@ -14,7 +13,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.time.LocalDateTime; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -45,8 +43,8 @@ public class UploadStationConfigListener implements ReadListener + + + + \ No newline at end of file