diff --git a/src/main/java/com/wms/controller/ExcelController.java b/src/main/java/com/wms/controller/ExcelController.java index cebff37..765d7ae 100644 --- a/src/main/java/com/wms/controller/ExcelController.java +++ b/src/main/java/com/wms/controller/ExcelController.java @@ -67,6 +67,7 @@ public class ExcelController { private final KateOrdersService kateOrdersService;// 工单服务 private final GoodsService goodsService;// 物料服务 private final WorkStationConfigService workStationConfigService;// 工站配置服务 + private final WorkSummaryService workSummaryService;// 工作分析服务 private final List uploadFileHashStringList = new ArrayList<>(); @@ -488,7 +489,7 @@ public class ExcelController { response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 - String fileName = URLEncoder.encode("盘点记录", StandardCharsets.UTF_8).replaceAll("\\+", "%20"); + String fileName = URLEncoder.encode("料箱报表", StandardCharsets.UTF_8).replaceAll("\\+", "%20"); response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); // 内容样式 HorizontalCellStyleStrategy horizontalCellStyleStrategy = ExcelContentStyle.getContentStyle(); @@ -505,6 +506,65 @@ public class ExcelController { .doWrite(vehicles.stream().map(VehicleExcelVo::of).toList()); } + /** + * 导出物料信息 + * + * @param response 请求 + */ + @PostMapping("/downloadGoodsExcel") + @ResponseBody + public void downloadGoodsExcel(@RequestBody GoodsQuery goodsQuery, HttpServletResponse response) throws IOException { + logger.info("导出物料报表,筛选参数:{},请求ip:{}", convertJsonString(goodsQuery), 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 goodsList = goodsService.list(new LambdaQueryWrapper() + .like(StringUtils.isNotEmpty(goodsQuery.getGoodsId()), Goods::getGoodsId, goodsQuery.getGoodsId())); + EasyExcel.write(response.getOutputStream(), GoodsExcelVo.class) + .excelType(ExcelTypeEnum.XLSX) + .registerWriteHandler(horizontalCellStyleStrategy) + .sheet("物料报表") + .doWrite(goodsList.stream().map(GoodsExcelVo::of).toList()); + } + + /** + * 导出工作总结 + * + * @param response 请求 + */ + @PostMapping("/downloadWorkSummaryExcel") + @ResponseBody + public void downloadWorkSummaryExcel(@RequestBody WorkSummaryQuery workSummaryQuery, HttpServletResponse response) throws IOException { + logger.info("导出物料报表,筛选参数:{},请求ip:{}", convertJsonString(workSummaryQuery), 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 goodsList = workSummaryService.list(new LambdaQueryWrapper() + .eq(workSummaryQuery.getLackStatus() != null, WorkSummary::getLackStatus, workSummaryQuery.getLackStatus()) + .eq(workSummaryQuery.getWorkDate() != null, WorkSummary::getWorkDate, workSummaryQuery.getWorkDate()) + .like(StringUtils.isNotEmpty(workSummaryQuery.getWorkStation()), WorkSummary::getWorkStation, workSummaryQuery.getWorkStation()) + .like(StringUtils.isNotEmpty(workSummaryQuery.getWorkOrder()), WorkSummary::getWorkOrder, workSummaryQuery.getWorkOrder()) + .like(StringUtils.isNotEmpty(workSummaryQuery.getWorkCenter()), WorkSummary::getWorkCenter, workSummaryQuery.getWorkCenter()) + .like(StringUtils.isNotEmpty(workSummaryQuery.getGoodsId()), WorkSummary::getGoodsId, workSummaryQuery.getGoodsId())); + EasyExcel.write(response.getOutputStream(), WorkSummaryExcelVo.class) + .excelType(ExcelTypeEnum.XLSX) + .registerWriteHandler(horizontalCellStyleStrategy) + .sheet("工作分析报表") + .doWrite(goodsList.stream().map(WorkSummaryExcelVo::of).toList()); + } + /** * 导出库位详情 * diff --git a/src/main/java/com/wms/controller/LocationController.java b/src/main/java/com/wms/controller/LocationController.java index 363c640..4da7127 100644 --- a/src/main/java/com/wms/controller/LocationController.java +++ b/src/main/java/com/wms/controller/LocationController.java @@ -301,6 +301,7 @@ public class LocationController { Page page = vehicleQuery.toMpPage(); Page vehiclePage = vehicleService.page(page, new LambdaQueryWrapper() .like(StringUtils.isNotEmpty(vehicleQuery.getVehicleId()), Vehicle::getVehicleId, vehicleQuery.getVehicleId()) + .like(StringUtils.isNotEmpty(vehicleQuery.getCurrentLocation()), Vehicle::getCurrentLocation, vehicleQuery.getCurrentLocation()) .eq(vehicleQuery.getVehicleStatus() != null, Vehicle::getVehicleStatus, vehicleQuery.getVehicleStatus()) .eq(vehicleQuery.getIsEmpty() != null, Vehicle::getIsEmpty, vehicleQuery.getIsEmpty()) .orderByDesc(Vehicle::getLastInTime)); diff --git a/src/main/java/com/wms/controller/StockController.java b/src/main/java/com/wms/controller/StockController.java index b02752f..22c4dc4 100644 --- a/src/main/java/com/wms/controller/StockController.java +++ b/src/main/java/com/wms/controller/StockController.java @@ -17,10 +17,7 @@ import com.wms.entity.app.request.StockUpdateRecordQuery; import com.wms.entity.app.vo.StockUpdateRecordVo; import com.wms.entity.app.vo.StockVo; import com.wms.entity.table.*; -import com.wms.service.IStockUpdateRecordService; -import com.wms.service.LocationService; -import com.wms.service.StockService; -import com.wms.service.VehicleService; +import com.wms.service.*; import com.wms.utils.HttpUtils; import com.wms.utils.StringUtils; import com.wms.utils.WmsUtils; @@ -72,6 +69,18 @@ public class StockController { * 料箱服务 */ private final VehicleService vehicleService; + /** + * 拣选任务服务 + */ + private final PickTaskService pickTaskService; + /** + * 流转料箱服务 + */ + private final OutsideVehiclesService outsideVehiclesService; + /** + * 站台要料服务 + */ + private final GoodsToStationService goodsToStationService; /** * 请求头部信息 */ @@ -364,28 +373,54 @@ public class StockController { return convertJsonString(rsp); } // 查询到当前处理的库存 - List currentStockList = stockService.list(new LambdaQueryWrapper() + Stock currentStock = stockService.getOne(new LambdaQueryWrapper() .eq(Stock::getVehicleId, handleRequest.getVehicleId()) - .apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, handleRequest.getGoodsId())); - if (currentStockList.isEmpty()) { + .apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, handleRequest.getGoodsId()) + .last("limit 1")); + if (currentStock == null) { logger.error("当前箱子中没有当前料号的库存。"); rsp.setCode(ResponseCode.ERROR.getCode()); rsp.setMessage("当前箱子中没有当前料号的库存。"); return convertJsonString(rsp); } - // 标记料箱 - // 删除库存 - for (Stock stock : currentStockList) { - - } // 找到当前箱子当前料对应的拣选任务-->取消拣选任务 + List pickTasks = pickTaskService.list(new LambdaQueryWrapper() + .eq(PickTask::getVehicleId, handleRequest.getVehicleId()) + .ne(PickTask::getPickStatus, 2)); + // 找出当前料箱有没有其他料也需要用 + List otherOutsideVehicles = outsideVehiclesService.list(new LambdaQueryWrapper() + .eq(OutsideVehicles::getVehicleId, handleRequest.getVehicleId()) + .ne(OutsideVehicles::getGoodsId, handleRequest.getGoodsId())); + if (otherOutsideVehicles != null && !otherOutsideVehicles.isEmpty()) { + // 找出其需要的拣选任务 + for (OutsideVehicles outsideVehicle : otherOutsideVehicles) { + // 找出这个料的对应的goodsToStation + + } + } + // 当前料 + OutsideVehicles currentOutsideVehicle = outsideVehiclesService.getOne(new LambdaQueryWrapper() + .eq(OutsideVehicles::getVehicleId, handleRequest.getVehicleId()) + .eq(OutsideVehicles::getGoodsId, handleRequest.getGoodsId()) + .last("limit 1")); + if (currentOutsideVehicle != null) { + // 已经分配的数量 + BigDecimal distributedNum = currentStock.getGoodsRelated().getRemainNum().subtract(currentOutsideVehicle.getRemainNum()); + // 将当前物料的所有goodsToStation + } // ----请求wcs接口 // 将这个料的实际剩余库存数量减去outsideVehicles的剩余数量,得出这个料的分配数量 // 回退goodsToStation - // ----在请求回库时,需要增加箱子状态的判断。异常状态---允许回库,但是不生成回库任务 + // ----在请求回库时,需要增 加箱子状态的判断。异常状态---允许回库,但是不生成回库任务 // 添加库存更新记录 - + // 标记料箱 + vehicleService.update(new LambdaUpdateWrapper() + .set(Vehicle::getVehicleStatus, VehicleStatus.EXCEPTION.getCode()) + .eq(Vehicle::getVehicleId, handleRequest.getVehicleId()) + .ne(Vehicle::getVehicleStatus, VehicleStatus.EXCEPTION.getCode())); + // 删除库存 + stockService.removeById(currentStock); return convertJsonString(rsp); } catch (Exception e) { diff --git a/src/main/java/com/wms/controller/TaskController.java b/src/main/java/com/wms/controller/TaskController.java index 31ac91d..893501b 100644 --- a/src/main/java/com/wms/controller/TaskController.java +++ b/src/main/java/com/wms/controller/TaskController.java @@ -1123,6 +1123,7 @@ public class TaskController { /** * 获取已完成行数信息 + * * @param standPickVo 查询 */ public void getFinishedInfo(String workStation, StandPickVo standPickVo) { @@ -1990,7 +1991,7 @@ public class TaskController { } if (!taskService.update(new LambdaUpdateWrapper() .set(Task::getTaskStatus, WmsTaskStatus.NEW.getCode()) - .set(Task::getDestination, nextLocationId) + .set(Task::getDestination, nextLocationId) .eq(Task::getVehicleId, requestBackQuery.getVehicleId()) .eq(Task::getTaskType, TaskType.IN.getCode()) .eq(Task::getTaskStatus, WmsTaskStatus.TEMP.getCode()) @@ -2271,7 +2272,7 @@ public class TaskController { } else { // 根据这些小盒子号找到对应的工单 List orderIds = eConfigLastList.stream().map(ELocationConfigLast::getWorkOrder).distinct().toList(); - sortBoxRequest.setSumOfOrders((orderIds.size() + orderQuantity - 1)/orderQuantity); + sortBoxRequest.setSumOfOrders((orderIds.size() + orderQuantity - 1) / orderQuantity); } response.setCode(ResponseCode.OK.getCode()); @@ -2568,7 +2569,7 @@ public class TaskController { tempOutTask.setIsPicking(1); outTasks.add(tempOutTask); } else if (Objects.equals(tempStock.getStockStatus(), StockStatus.OUT.getCode()) - || Objects.equals(tempStock.getStockStatus(), StockStatus.PICKING.getCode())) { + || Objects.equals(tempStock.getStockStatus(), StockStatus.PICKING.getCode())) { // 查询这个箱子的拣选任务 List thisVehiclePickTasks = pickTaskService.list(new LambdaQueryWrapper() .eq(PickTask::getVehicleId, tempStock.getVehicleId())); @@ -2641,7 +2642,7 @@ public class TaskController { if (!pickStandIds.isEmpty()) { message.append("有料需要去工作站台领取。站台号:"); pickStandIds.forEach(pickStandId -> message.append(pickStandId).append("、")); - message.replace(message.length()-1, message.length(), "。"); + message.replace(message.length() - 1, message.length(), "。"); } response.setMessage(String.valueOf(message)); } else { @@ -2706,7 +2707,7 @@ public class TaskController { // 判断信息是否完备 if (StringUtils.isEmpty(pickNumQuery.getGoodsId()) || StringUtils.isEmpty(pickNumQuery.getVehicleId()) - || pickNumQuery.getRealPickNum() == null) { + || pickNumQuery.getRealPickNum() == null) { logger.error("请求缺少必须参数,箱号、料号、数量不可缺少。"); response.setCode(ResponseCode.OK.getCode()); response.setMessage("请求缺少必须参数,箱号、料号、数量不可缺少。"); diff --git a/src/main/java/com/wms/utils/excel/vo/GoodsExcelVo.java b/src/main/java/com/wms/utils/excel/vo/GoodsExcelVo.java index f3c1037..3498cc7 100644 --- a/src/main/java/com/wms/utils/excel/vo/GoodsExcelVo.java +++ b/src/main/java/com/wms/utils/excel/vo/GoodsExcelVo.java @@ -146,6 +146,9 @@ public class GoodsExcelVo extends KanbanExcelVo { * @return excel对象 */ public static GoodsExcelVo of(Goods goodsPo) { - return BeanUtil.copyProperties(goodsPo, GoodsExcelVo.class); + GoodsExcelVo tempVo = new GoodsExcelVo(); + tempVo = BeanUtil.copyProperties(goodsPo, GoodsExcelVo.class); + tempVo.setKanban(goodsPo.getKanbanList()); + return tempVo; } }