rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java
@@ -2,10 +2,7 @@ import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.api.controller.params.CheckObjParams; import com.vincent.rsf.server.api.controller.params.OpStockParams; import com.vincent.rsf.server.api.controller.params.OtherReceiptParams; import com.vincent.rsf.server.api.controller.params.ReceiptParams; import com.vincent.rsf.server.api.controller.params.*; import com.vincent.rsf.server.api.service.MobileService; import com.vincent.rsf.server.manager.controller.params.WaitPakinParam; import com.vincent.rsf.server.manager.entity.QlyIsptItem; @@ -207,11 +204,42 @@ @ApiOperation("获取上架信息") @PreAuthorize("hasAuthority('manager:qlyInspect:list')") @PostMapping("/stock/operate") @PostMapping("/stock/operate/list") public R operateToStock(@RequestBody OpStockParams params) { if (Objects.isNull(params)) { return R.error("参数不能为空!!"); } return mobileService.operateToStock(params); } @ApiOperation("人工上架") @PreAuthorize("hasAuthority('manager:qlyInspect:update')") @PostMapping("/stock/operate") public R publicToStock(@RequestBody PublicToStockParams params) { if (Objects.isNull(params)) { return R.error("参数不能为空!!"); } return mobileService.publicToStock(params); } @ApiOperation("获取任务信息") @PreAuthorize("hasAuthority('manager:qlyInspect:list')") @PostMapping("/task/stock/{code}") public R taskToStock(@PathVariable String code) { if (Objects.isNull(code)) { return R.error("参数不能为空!!"); } return mobileService.taskToStock(code); } @ApiOperation("任务上架") @PreAuthorize("hasAuthority('manager:qlyInspect:update')") @PostMapping("/task/stock") public R taskToLocs(@PathVariable String code) throws Exception { if (Objects.isNull(code)) { return R.error("参数不能为空!!"); } return mobileService.taskGetLocs(code); } } rsf-server/src/main/java/com/vincent/rsf/server/api/controller/params/PublicToStockParams.java
New file @@ -0,0 +1,22 @@ package com.vincent.rsf.server.api.controller.params; import com.vincent.rsf.server.manager.entity.AsnOrderItem; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; import java.util.List; @Data @Accessors(chain = true) @ApiModel(value = "PublicToStockParams", description = "人工上架") public class PublicToStockParams implements Serializable { @ApiModelProperty("库位编码") private String locCode; @ApiModelProperty("单据明细") private List<AsnOrderItem> itemList; } rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/TaskLocAreaDto.java
New file @@ -0,0 +1,25 @@ package com.vincent.rsf.server.api.entity.dto; import com.vincent.rsf.server.manager.entity.Loc; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; import java.util.List; @Data @Accessors(chain = true) @ApiModel(value = "TaskLocAreaDto", description = "库位信息") public class TaskLocAreaDto implements Serializable { @ApiModelProperty("库位库区") private String areaCode; @ApiModelProperty("库区名称") private String areaName; @ApiModelProperty("库区ID") private Long areaId; @ApiModelProperty("库位信息") private List<Loc> locs; } rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/TaskQueueDto.java
New file @@ -0,0 +1,28 @@ package com.vincent.rsf.server.api.entity.dto; import com.vincent.rsf.server.manager.entity.Loc; import com.vincent.rsf.server.manager.entity.Task; import com.vincent.rsf.server.manager.entity.TaskItem; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; import java.util.List; @Data @Accessors(chain = true) @ApiModel(value = "TaskQueueDto", description = "任务信息") public class TaskQueueDto implements Serializable { @ApiModelProperty("任务主单") private Task task; @ApiModelProperty("任务明细") private List<TaskItem> taskItems; @ApiModelProperty("库位信息") private TaskLocAreaDto locArea; } rsf-server/src/main/java/com/vincent/rsf/server/api/service/MobileService.java
@@ -1,10 +1,7 @@ package com.vincent.rsf.server.api.service; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.server.api.controller.params.CheckObjParams; import com.vincent.rsf.server.api.controller.params.OpStockParams; import com.vincent.rsf.server.api.controller.params.OtherReceiptParams; import com.vincent.rsf.server.api.controller.params.ReceiptParams; import com.vincent.rsf.server.api.controller.params.*; import com.vincent.rsf.server.manager.controller.params.WaitPakinParam; import com.vincent.rsf.server.manager.entity.AsnOrder; import com.vincent.rsf.server.manager.entity.QlyIsptItem; @@ -53,4 +50,10 @@ R checkUpdate(QlyIsptItem params); R operateToStock(OpStockParams params); R publicToStock(PublicToStockParams params); R taskToStock(String code); R taskGetLocs(String code) throws Exception; } rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java
@@ -4,14 +4,8 @@ import com.vincent.rsf.framework.common.Cools; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.api.controller.params.CheckObjParams; import com.vincent.rsf.server.api.controller.params.OpStockParams; import com.vincent.rsf.server.api.controller.params.OtherReceiptParams; import com.vincent.rsf.server.api.controller.params.ReceiptParams; import com.vincent.rsf.server.api.entity.dto.CheckObjDto; import com.vincent.rsf.server.api.entity.dto.InspectDetlDto; import com.vincent.rsf.server.api.entity.dto.InspectItemDto; import com.vincent.rsf.server.api.entity.dto.ReceiptDetlsDto; import com.vincent.rsf.server.api.controller.params.*; import com.vincent.rsf.server.api.entity.dto.*; import com.vincent.rsf.server.api.entity.enums.OrderWorkType; import com.vincent.rsf.server.api.service.MobileService; import com.vincent.rsf.server.common.config.ConfigProperties; @@ -49,6 +43,7 @@ import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; /** * @author Ryan @@ -101,16 +96,28 @@ @Autowired private WaitPakinItemService waitPakinItemService; @Autowired private AsnOrderItemLogService asnOrderItemLogService; @Autowired private FieldsItemService fieldsItemService; @Autowired private LocService locService; @Autowired private PurchaseService purchaseService; @Autowired private StockService stockService; @Autowired private StockItemService stockItemService; @Autowired private TaskService taskService; @Autowired private TaskItemService taskItemService; @Autowired private LocAreaMatRelaMapper locAreaMatRelaMapper; @Autowired private LocAreaRelaMapper locAreaRelaMapper; @Autowired private LocAreaMapper locAreaMapper; /** * @author Ryan @@ -607,6 +614,133 @@ } /** * 人工上架入库 * @param params * @return */ @Override @Transactional(rollbackFor = Exception.class) public R publicToStock(PublicToStockParams params) { if (Objects.isNull(params.getLocCode()) || StringUtils.isBlank(params.getLocCode())) { throw new CoolException("库位不能为空!!"); } if (Objects.isNull(params.getItemList()) || params.getItemList().isEmpty()) { throw new CoolException("单据明细不能为空!!"); } Long OrderId = params.getItemList().stream().findFirst().get().getAsnId(); AsnOrder order = asnOrderMapper.getOne(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getId, OrderId)); if (Objects.isNull(order)) { throw new CoolException("单据不存在!!"); } Stock stock = new Stock(); stock.setAsnId(OrderId).setAsnCode(order.getCode()); if (!Objects.isNull(order.getPoCode()) && StringUtils.isNotBlank(order.getPoCode())) { Purchase purchase = purchaseService.getOne(new LambdaQueryWrapper<Purchase>().eq(Purchase::getCode, order.getPoCode())); stock.setPlatOrderNo(purchase.getPlatCode()).setPlatToken(purchase.getPlatId()); } String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_STOCK_CODE, null); if (StringUtils.isBlank(ruleCode)) { throw new CoolException("当前业务:" + SerialRuleCode.SYS_STOCK_CODE + ",编码规则不存在!!"); } if (!stockService.save(stock)) { throw new CoolException("库存保存失败!!"); } Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getBarcode, params.getLocCode())); if (Objects.isNull(loc)) { throw new CoolException("库位不存在!!"); } List<StockItem> stockItems = new ArrayList<>(); params.getItemList().forEach(orderItem -> { StockItem stockItem = new StockItem(); BeanUtils.copyProperties(orderItem, stockItem); stockItem.setAsnItemId(orderItem.getId()) .setBarcode(orderItem.getBarcode()) .setLocId(loc.getId()) .setId(null) .setStockId(stock.getId()); stockItems.add(stockItem); }); if (!stockItemService.saveBatch(stockItems)) { throw new CoolException("任务上架失败!!"); } return R.ok(stock); } /** * 获取任务信息 * @param code * @return */ @Override public R taskToStock(String code) { if (StringUtils.isBlank(code)) { throw new CoolException("拖盘码不能为空!!"); } Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, code)); if (Objects.isNull(task)) { throw new CoolException("拖盘任务不存在!!"); } List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId())); if (!taskItems.isEmpty()) { throw new CoolException("拖盘任务明细不存在!!"); } TaskQueueDto queueDto = new TaskQueueDto(); queueDto.setTask(task).setTaskItems(taskItems); List<Long> list = taskItems.stream().map(TaskItem::getMatnrId).collect(Collectors.toList()); List<LocAreaMatRela> matRelas = locAreaMatRelaMapper.selectList(new LambdaQueryWrapper<LocAreaMatRela>().in(LocAreaMatRela::getMatnrId, list)); TaskLocAreaDto locAreaDto = new TaskLocAreaDto(); /**判断是否为空*/ if (matRelas.isEmpty()) { locAreaDto.setLocs(new ArrayList<>()); } else { Long ids = matRelas.stream().map(LocAreaMatRela::getLocId).collect(Collectors.toList()).stream().findFirst().get(); List<Loc> locs = locService.list(new LambdaQueryWrapper<Loc>().eq(Loc::getId, ids)); if (locs.isEmpty()) { locAreaDto.setLocs(new ArrayList<>()); } else { LocArea locArea = locAreaMapper.selectById(new LambdaQueryWrapper<Loc>().in(Loc::getId, ids)); if (!Objects.isNull(locArea)) { locAreaDto.setAreaName(locArea.getName()).setAreaCode(locArea.getCode()).setAreaId(locArea.getId()); } locAreaDto.setLocs(locs); } } queueDto.setLocArea(locAreaDto); return R.ok(queueDto); } /** * @Author Ryan * @param code * @desc 任务上架 * @return */ @Override @Transactional(rollbackFor = Exception.class) public R taskGetLocs(String code) throws Exception { if (StringUtils.isBlank(code)) { throw new CoolException("拖盘码不能为空!!"); } Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, code)); if (Objects.isNull(task)) { throw new CoolException("拖盘任务不存在!!"); } List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId())); if (!taskItems.isEmpty()) { throw new CoolException("拖盘任务明细不存在!!"); } List<Task> tasks = new ArrayList<>(); tasks.add(task); taskService.completeTask(tasks); return R.ok(); } /** * 获取ReceiptDetlsDtos */ private R getAsnOrderItem(List<AsnOrderItem> items) { rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.java
@@ -131,7 +131,9 @@ if (Objects.isNull(id)) { throw new CoolException("参数不能为空!!"); } return taskService.completeTask(id); // return taskService.completeTask(id); return null; } } rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItem.java
@@ -67,6 +67,11 @@ @ApiModelProperty("单据明细ID") private Long orderItemId; /** * 物料跟踪码 */ @ApiModelProperty("物料跟踪码") private String trackCode; /** * 物料编码 */ @ApiModelProperty(value= "物料编码") rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java
@@ -56,68 +56,11 @@ @Scheduled(cron = "0 0/05 * * * ? ") // @Scheduled(cron = "0/5 * * * * ?") @Transactional(rollbackFor = Exception.class) public void completeInStock() { public void completeInStock() throws Exception { List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskStatus, TaskStsType.COMPLETE_IN.id)); if (tasks.isEmpty()) { return; } List<Long> list = tasks.stream().map(Task::getId).collect(Collectors.toList()); List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, list)); if (taskItems.isEmpty()) { throw new CoolException("任务明细为空!!"); } /**对任务明细按订单进行分组*/ Map<Long, List<TaskItem>> orderMap = taskItems.stream().collect(Collectors.groupingBy(TaskItem::getOrderId)); List<StockItem> stockItems = new ArrayList<>(); orderMap.keySet().forEach(key -> { AsnOrder order = asnOrderService.getOne(new LambdaQueryWrapper<AsnOrder>() .eq(AsnOrder::getId, key) .select(AsnOrder::getId, AsnOrder::getPoCode, AsnOrder::getCode)); Stock stock = new Stock(); if (!Objects.isNull(order.getPoCode()) && StringUtils.isNotBlank(order.getPoCode())) { Purchase purchase = purchaseService.getOne(new LambdaQueryWrapper<Purchase>().eq(Purchase::getCode, order.getPoCode())); stock.setPlatOrderNo(purchase.getPlatCode()).setPlatToken(purchase.getPlatId()); } String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_STOCK_CODE, null); if (StringUtils.isBlank(ruleCode)) { throw new CoolException("当前业务:" + SerialRuleCode.SYS_STOCK_CODE + ",编码规则不存在!!"); } stock.setAsnId(order.getId()).setAsnCode(order.getCode()); if (!stockService.save(stock)) { throw new CoolException("库存保存失败!!"); } List<TaskItem> items = orderMap.get(key); for (TaskItem item : items) { /**通过任务明细中的taskId查询,获取TASK的目标库位信息*/ Task taskServiceOne = taskService.getOne(new LambdaQueryWrapper<Task>() .select(Task::getId, Task::getTargLoc, Task::getOrgLoc, Task::getBarcode) .eq(Task::getId, item.getTaskId())); Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, taskServiceOne.getTargLoc())); if (Objects.isNull(loc)) { throw new CoolException("库位不存在!!"); } AsnOrderItem orderItem = asnOrderItemService.getOne(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getId, item.getOrderItemId())); if (Objects.isNull(orderItem)) { throw new CoolException("单据明细不存在!!"); } StockItem stockItem = new StockItem(); BeanUtils.copyProperties(orderItem, stockItem); stockItem.setAsnItemId(item.getOrderItemId()) .setBarcode(taskServiceOne.getBarcode()) .setLocId(loc.getId()) .setId(null) .setStockId(stock.getId()); stockItems.add(stockItem); } if (!stockItemService.saveBatch(stockItems)) { throw new CoolException("库存修改架失败!!"); } }); /**修改库位状态为F.在库*/ List<String> locCodes = tasks.stream().map(Task::getTargLoc).collect(Collectors.toList()); if (!locService.update(new LambdaUpdateWrapper<Loc>().set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_F.type).in(Loc::getCode, locCodes))) { throw new CoolException("库位状态修改失败!!"); } taskService.completeTask(tasks); } } rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java
@@ -11,5 +11,7 @@ R generateTasks(List<WaitPakin> waitPakin, Long loginUserId); R completeTask(String id); // R completeTask(String id); void completeTask(List<Task> task) throws Exception; } rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
@@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; @@ -37,7 +38,16 @@ private WaitPakinItemService waitPakinItemService; @Autowired private LocService locService; @Autowired private PurchaseService purchaseService; @Autowired private AsnOrderService asnOrderService; @Autowired private AsnOrderItemService asnOrderItemService; @Autowired private StockService stockService; @Autowired private StockItemService stockItemService; @@ -96,6 +106,7 @@ taskItem.setTaskId(task.getId()) .setOrderType(OrderType.ORDER_RECEIPT.type) .setSource(item.getId()) .setTrackCode(item.getTrackCode()) .setCreateBy(loginUserId) .setUpdateBy(loginUserId) .setOrderId(item.getAsnId()) @@ -110,18 +121,74 @@ return R.ok("任务生成完毕!"); } /** * @author Ryan * @description 完成任务 * @param * @return * @time 2025/4/2 11:15 */ * 完成任务 * @param tasks * @throws Exception */ @Override @Transactional(rollbackFor = Exception.class) public R completeTask(String id) { return null; public void completeTask(List<Task> tasks) throws Exception { if (tasks.isEmpty()) { return; } List<Long> list = tasks.stream().map(Task::getId).collect(Collectors.toList()); List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, list)); if (taskItems.isEmpty()) { throw new CoolException("任务明细不能为空!!"); } /**对任务明细按订单进行分组*/ Map<Long, List<TaskItem>> orderMap = taskItems.stream().collect(Collectors.groupingBy(TaskItem::getOrderId)); List<StockItem> stockItems = new ArrayList<>(); orderMap.keySet().forEach(key -> { AsnOrder order = asnOrderService.getOne(new LambdaQueryWrapper<AsnOrder>() .eq(AsnOrder::getId, key) .select(AsnOrder::getId, AsnOrder::getPoCode, AsnOrder::getCode)); Stock stock = new Stock(); if (!Objects.isNull(order.getPoCode()) && StringUtils.isNotBlank(order.getPoCode())) { Purchase purchase = purchaseService.getOne(new LambdaQueryWrapper<Purchase>().eq(Purchase::getCode, order.getPoCode())); stock.setPlatOrderNo(purchase.getPlatCode()).setPlatToken(purchase.getPlatId()); } String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_STOCK_CODE, null); if (StringUtils.isBlank(ruleCode)) { throw new CoolException("当前业务:" + SerialRuleCode.SYS_STOCK_CODE + ",编码规则不存在!!"); } stock.setAsnId(order.getId()).setAsnCode(order.getCode()); if (!stockService.save(stock)) { throw new CoolException("库存保存失败!!"); } List<TaskItem> items = orderMap.get(key); for (TaskItem item : items) { /**通过任务明细中的taskId查询,获取TASK的目标库位信息*/ Task taskServiceOne = this.getOne(new LambdaQueryWrapper<Task>() .select(Task::getId, Task::getTargLoc, Task::getOrgLoc, Task::getBarcode) .eq(Task::getId, item.getTaskId())); Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, taskServiceOne.getTargLoc())); if (Objects.isNull(loc)) { throw new CoolException("库位不存在!!"); } AsnOrderItem orderItem = asnOrderItemService.getOne(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getId, item.getOrderItemId())); if (Objects.isNull(orderItem)) { throw new CoolException("单据明细不存在!!"); } StockItem stockItem = new StockItem(); BeanUtils.copyProperties(orderItem, stockItem); stockItem.setAsnItemId(item.getOrderItemId()) .setBarcode(taskServiceOne.getBarcode()) .setLocId(loc.getId()) .setId(null) .setStockId(stock.getId()); stockItems.add(stockItem); } if (!stockItemService.saveBatch(stockItems)) { throw new CoolException("库存修改架失败!!"); } }); /**修改库位状态为F.在库*/ List<String> locCodes = tasks.stream().map(Task::getTargLoc).collect(Collectors.toList()); if (!locService.update(new LambdaUpdateWrapper<Loc>().set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_F.type).in(Loc::getCode, locCodes))) { throw new CoolException("库位状态修改失败!!"); } } }