From 17ad836f0df067024737d397aa81353ceecc8258 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9A=B4=E7=82=B3=E6=9E=97?= <15237758276@163.com> Date: Wed, 18 Jun 2025 15:26:01 +0800 Subject: [PATCH] no message --- .../com/youchain/basicdata/domain/Box.java | 14 +-- .../repository/PointItemRepository.java | 5 + .../basicdata/rest/BoxController.java | 2 + .../basicdata/rest/PointItemController.java | 1 + .../repository/InventoryRepository.java | 2 + .../service/InventoryService.java | 1 + .../businessdata/service/MlsService.java | 8 +- .../service/impl/MlsServiceImpl.java | 100 ++++++++++++++++++ .../youchain/dropdown/DropdownController.java | 10 ++ .../com/youchain/jamod/domain/ModbusInfo.java | 13 +++ .../modules/quartz/task/pickTask.java | 38 +++++-- .../java/com/youchain/utils/BizStatus.java | 12 ++- 12 files changed, 185 insertions(+), 21 deletions(-) diff --git a/youchain-system/src/main/java/com/youchain/basicdata/domain/Box.java b/youchain-system/src/main/java/com/youchain/basicdata/domain/Box.java index f6b2a6a..15ba1f5 100644 --- a/youchain-system/src/main/java/com/youchain/basicdata/domain/Box.java +++ b/youchain-system/src/main/java/com/youchain/basicdata/domain/Box.java @@ -47,29 +47,25 @@ public class Box extends BaseEntity implements Serializable { @ApiModelProperty(value = "ID") private Long id; - @Column(name = "`code`",nullable = false) - @NotBlank + @Column(name = "`code`") @ApiModelProperty(value = "按钮盒编号") private String code; - @Column(name = "`name`",nullable = false) - @NotBlank + @Column(name = "`name`") @ApiModelProperty(value = "按钮盒名称") private String name; @OneToOne - @JoinColumn(name = "`item_id`",nullable = true) + @JoinColumn(name = "`item_id`") @ApiModelProperty(value = "物料") private Item item; @OneToOne - @JoinColumn(name = "`point_id`",nullable = false) - @NotNull + @JoinColumn(name = "`point_id`") @ApiModelProperty(value = "点位") private Point point; - @Column(name = "`enabled`",nullable = false) - @NotNull + @Column(name = "`enabled`") @ApiModelProperty(value = "状态:1启用、0禁用") private Boolean enabled=true; diff --git a/youchain-system/src/main/java/com/youchain/basicdata/repository/PointItemRepository.java b/youchain-system/src/main/java/com/youchain/basicdata/repository/PointItemRepository.java index 3a35583..4f00ff8 100644 --- a/youchain-system/src/main/java/com/youchain/basicdata/repository/PointItemRepository.java +++ b/youchain-system/src/main/java/com/youchain/basicdata/repository/PointItemRepository.java @@ -18,6 +18,9 @@ package com.youchain.basicdata.repository; import com.youchain.basicdata.domain.PointItem; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; /** * @website https://eladmin.vip @@ -25,4 +28,6 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor; * @date 2025-04-11 **/ public interface PointItemRepository extends JpaRepository, JpaSpecificationExecutor { + @Query(value = "SELECT pi FROM PointItem pi", nativeQuery = false) + List findByPoint(Long id); } \ No newline at end of file diff --git a/youchain-system/src/main/java/com/youchain/basicdata/rest/BoxController.java b/youchain-system/src/main/java/com/youchain/basicdata/rest/BoxController.java index e4aca28..4247b6f 100644 --- a/youchain-system/src/main/java/com/youchain/basicdata/rest/BoxController.java +++ b/youchain-system/src/main/java/com/youchain/basicdata/rest/BoxController.java @@ -74,6 +74,7 @@ public class BoxController { @PreAuthorize("@el.check('box:add')") public ResponseEntity createBox(@Validated @RequestBody Box resources) { resources.setDept(UserUtils.getDept()); + resources.setCode(resources.getWorkType()+":"+resources.getPoint().getCode()); boxService.create(resources); return new ResponseEntity<>(boxService.create(resources), HttpStatus.CREATED); } @@ -83,6 +84,7 @@ public class BoxController { @ApiOperation("修改box") @PreAuthorize("@el.check('box:edit')") public ResponseEntity updateBox(@Validated @RequestBody Box resources) { + resources.setCode(resources.getWorkType()+":"+resources.getPoint().getCode()); boxService.update(resources); return new ResponseEntity<>(HttpStatus.NO_CONTENT); } diff --git a/youchain-system/src/main/java/com/youchain/basicdata/rest/PointItemController.java b/youchain-system/src/main/java/com/youchain/basicdata/rest/PointItemController.java index f6df000..d533428 100644 --- a/youchain-system/src/main/java/com/youchain/basicdata/rest/PointItemController.java +++ b/youchain-system/src/main/java/com/youchain/basicdata/rest/PointItemController.java @@ -72,6 +72,7 @@ public class PointItemController { @ApiOperation("修改pointItem") @PreAuthorize("@el.check('pointItem:edit')") public ResponseEntity updatePointItem(@Validated @RequestBody PointItem resources){ + resources.setCode(resources.getPoint().getCode()+":"+resources.getItem().getCode()); pointItemService.update(resources); return new ResponseEntity<>(HttpStatus.NO_CONTENT); } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/repository/InventoryRepository.java b/youchain-system/src/main/java/com/youchain/businessdata/repository/InventoryRepository.java index 5033310..3625d3f 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/repository/InventoryRepository.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/repository/InventoryRepository.java @@ -31,4 +31,6 @@ import java.util.List; public interface InventoryRepository extends JpaRepository, JpaSpecificationExecutor { @Query(value = "select inv from Inventory inv where inv.billCode=?1 ") List findByBillCode(String billCode); + @Query(value = "select inv from Inventory inv where inv.itemKey.item.code in ?1 ") + List findInvByItemCodes(List itemCodes); } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/InventoryService.java b/youchain-system/src/main/java/com/youchain/businessdata/service/InventoryService.java index 0149eda..623baa5 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/InventoryService.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/InventoryService.java @@ -105,4 +105,5 @@ public interface InventoryService { List getInvForPlan(String type,Long areaId,Long itemId,Long deptId); List findInvByBillCode(Set billCode); + } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/MlsService.java b/youchain-system/src/main/java/com/youchain/businessdata/service/MlsService.java index f6381db..7d995f8 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/MlsService.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/MlsService.java @@ -1,9 +1,11 @@ package com.youchain.businessdata.service; import com.youchain.annotation.Log; +import com.youchain.basicdata.domain.Point; import com.youchain.businessdata.inputJson.*; import io.swagger.annotations.ApiOperation; +import java.util.List; import java.util.concurrent.ExecutionException; /** @@ -47,7 +49,11 @@ public interface MlsService { * @return */ void getIssueInfo(IssueInfo issueInfo); - + /** + * 光电直接叫料 + * @return + */ + void getIssueInfo(List itemCodes, Point endPoint); /** * 回传MO票 diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/MlsServiceImpl.java b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/MlsServiceImpl.java index 01107f5..f223e20 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/MlsServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/MlsServiceImpl.java @@ -12,6 +12,7 @@ import com.youchain.basicdata.service.ItemService; import com.youchain.basicdata.service.PointService; import com.youchain.businessdata.domain.*; import com.youchain.businessdata.inputJson.*; +import com.youchain.businessdata.repository.InventoryRepository; import com.youchain.businessdata.service.*; import com.youchain.config.thread.ThreadPoolExecutorUtil; import com.youchain.modules.system.domain.Dept; @@ -40,6 +41,7 @@ public class MlsServiceImpl implements MlsService { private final PointService pointService; private final PointRepository pointRepository; private final InventoryService inventoryService; + private final InventoryRepository inventoryRepository; private final RedisObjectUtils redisObjectUtils; private final BatchCreateOrUpdate batchCreateOrUpdate; @@ -531,7 +533,105 @@ public class MlsServiceImpl implements MlsService { throw new RuntimeException(errorMsgList.toString()); } } + @Override + @Transactional(rollbackFor = Exception.class) + public void getIssueInfo(List itemCodes,Point endPoint) { + CompletableFuture> inventoryListFuture = CompletableFuture.supplyAsync(() -> { + + List inventoryList = inventoryRepository.findInvByItemCodes(itemCodes);//物料号码查询库存信息 + + return inventoryList; + }); + + if (inventoryListFuture.join().isEmpty()) { + throw new RuntimeException("无库存信息!"); + } + List errorMsgList = new ArrayList<>(); + inventoryListFuture.thenAccept((result) -> { + List inventoryToUpdate = new ArrayList<>(); + List pickDetailToCreate = new ArrayList<>(); + List agvTaskToCreate = new ArrayList<>(); + List taskToCreate = new ArrayList<>(); + for (Inventory inv : result) { + if (inv.getBeLock()==true&&BaseCode.PICK_YH_QR.equals("1")){ + errorMsgList.add(inv.getItemKey().getPropC1() + "库存未验货!"); + continue; + } + if (inv.getQueuedQty()>0){ + errorMsgList.add(inv.getItemKey().getPropC1() + "库存已被占用!"); + continue; + } + //根据库存信息生成叫料任务 + Stock stock = inv.getStock();//容器 + Point startPoint = inv.getPoint();//起始点位 + ItemKey itemKey = inv.getItemKey(); + Item item = inv.getItemKey().getItem(); + + //更新库存信息 + inventoryToUpdate.add(updateInventory(inv)); + + //生成出库明细 + PickDetail pd = createPickDetail(item, inv.getBillCode(), itemKey.getPropC1(), inv.getQuantity(), ""); + pickDetailToCreate.add(pd); + + //生成搬运任务 + AgvTask agvTask = new AgvTask(BizStatus.PICK, stock.getCode(), startPoint.getCode(), endPoint.getCode(), BizStatus.OPEN, "PICKER_MOVE"); + agvTaskToCreate.add(agvTask); + + //生成Task + Task task = createTask(item, itemKey, pd, inv.getBillCode(), stock, startPoint, endPoint, agvTask, inv); + taskToCreate.add(task); + + break; + } + if (!errorMsgList.isEmpty()) { + throw new RuntimeException(errorMsgList.toString()); + } + ExecutorService executor = ThreadPoolExecutorUtil.getPoll("getIssueInfo-job"); + + // 批量更新库存信息 + CompletableFuture inventoryFuture = CompletableFuture.runAsync(() -> { + //批量更新库存信息 + if (!inventoryToUpdate.isEmpty()) { + batchCreateOrUpdate.batchUpdate(inventoryToUpdate); + } + + }, executor); + + + CompletableFuture pickDetailFuture = inventoryFuture.thenRunAsync(() -> { + //批量生成叫料明细 + if (!pickDetailToCreate.isEmpty()) { + batchCreateOrUpdate.batchCreate(pickDetailToCreate); + } + + }, executor); + + CompletableFuture agvTaskFuture = pickDetailFuture.thenRunAsync(() -> { + // 批量生成agv任务 + if (!agvTaskToCreate.isEmpty()) { + batchCreateOrUpdate.batchCreate(agvTaskToCreate); + } + + }, executor); + + CompletableFuture taskFuture = agvTaskFuture.thenRunAsync(() -> { + // 批量生成任务 + if (!taskToCreate.isEmpty()) { + batchCreateOrUpdate.batchCreate(taskToCreate); + + } + + }, executor); + taskFuture.join(); + + executor.shutdown(); + }); + if (!errorMsgList.isEmpty()) { + throw new RuntimeException(errorMsgList.toString()); + } + } private void processInventory(Inventory inv, Point endPoint) { Stock stock = inv.getStock(); Point startPoint = inv.getPoint(); diff --git a/youchain-system/src/main/java/com/youchain/dropdown/DropdownController.java b/youchain-system/src/main/java/com/youchain/dropdown/DropdownController.java index 8a28f7b..0ce54f1 100644 --- a/youchain-system/src/main/java/com/youchain/dropdown/DropdownController.java +++ b/youchain-system/src/main/java/com/youchain/dropdown/DropdownController.java @@ -8,6 +8,7 @@ import com.youchain.basicdata.repository.ItemRepository; import com.youchain.basicdata.repository.PointRepository; import com.youchain.exception.handler.ApiResult; import com.youchain.jamod.domain.ModbusInfo; +import com.youchain.jamod.repository.ModbusInfoRepository; import com.youchain.jamod.service.ModbusInfoService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -29,6 +30,7 @@ import java.util.List; @RequestMapping("/api/dropdown") public class DropdownController { private final PointRepository pointRepository; + private final ModbusInfoRepository modbusInfoRepository; private final ItemRepository itemRepository; @PostMapping("/pointData") @ApiOperation("全部点位") @@ -46,4 +48,12 @@ public class DropdownController { ApiResult apiResult=ApiResult.fail(200,"成功",itemList); return new ResponseEntity<>(apiResult,apiResult.getStatus()); } + @PostMapping("/modbusInfoData") + @ApiOperation("全部modbusInfo") + @AnonymousAccess + public ResponseEntity modbusInfoData(){ + List modbusInfoList=modbusInfoRepository.findAll(); + ApiResult apiResult=ApiResult.fail(200,"成功",modbusInfoList); + return new ResponseEntity<>(apiResult,apiResult.getStatus()); + } } diff --git a/youchain-system/src/main/java/com/youchain/jamod/domain/ModbusInfo.java b/youchain-system/src/main/java/com/youchain/jamod/domain/ModbusInfo.java index b94567a..94dce6a 100644 --- a/youchain-system/src/main/java/com/youchain/jamod/domain/ModbusInfo.java +++ b/youchain-system/src/main/java/com/youchain/jamod/domain/ModbusInfo.java @@ -25,6 +25,10 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import java.io.Serializable; import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; /** * @website https://eladmin.vip @@ -117,6 +121,15 @@ public class ModbusInfo implements Serializable { @ApiModelProperty(value = "报错原因") private String description; + public List getDataValueList() { + if (dataValues == null || dataValues.isEmpty()) { + return new ArrayList<>(); + } + String trimmedString = dataValues.substring(1, dataValues.length() - 1); + String[] stringArray = trimmedString.split(","); + return Arrays.asList(stringArray); + } + public void copy(ModbusInfo source){ BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true)); } diff --git a/youchain-system/src/main/java/com/youchain/modules/quartz/task/pickTask.java b/youchain-system/src/main/java/com/youchain/modules/quartz/task/pickTask.java index 94eb455..901f62e 100644 --- a/youchain-system/src/main/java/com/youchain/modules/quartz/task/pickTask.java +++ b/youchain-system/src/main/java/com/youchain/modules/quartz/task/pickTask.java @@ -1,10 +1,14 @@ package com.youchain.modules.quartz.task; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; +import com.youchain.basicdata.domain.Box; +import com.youchain.basicdata.domain.PointItem; +import com.youchain.basicdata.repository.BoxRepository; +import com.youchain.basicdata.repository.PointItemRepository; import com.youchain.businessdata.domain.AgvTask; +import com.youchain.businessdata.domain.Inventory; import com.youchain.businessdata.repository.AgvTaskRepository; import com.youchain.businessdata.service.AgvTaskService; +import com.youchain.businessdata.service.MlsService; import com.youchain.utils.BaseStatus; import com.youchain.utils.BizStatus; import com.youchain.utils.HttpPostUtil; @@ -13,11 +17,9 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.stream.Collectors; /** * 料箱出库任务下发 @@ -28,10 +30,32 @@ public class pickTask { @Autowired public AgvTaskService agvTaskService; - + @Autowired + public BoxRepository boxRepository; + @Autowired + public PointItemRepository pointItemRepository; + @Autowired + public MlsService mlsService; private static final int MAX_TASK_COUNT = 5; private static final long TIMEOUT_MS = 2*60*1000; + public void pickLLJTask() { + List boxList = boxRepository.getBoxAllData(); + for (Box box : boxList){ + List dataValueList = box.getModbusInfo().getDataValueList(); + if (dataValueList.get(box.getSort()-1).equals(box.getWorkCode())){ + if (box.getWorkType().equals(BizStatus.PICK)){ + List pointItemList=pointItemRepository.findByPoint(box.getPoint().getId()); + // 获取 PointItem.item.code 集合 + List itemCodeList = pointItemList.stream() + .map(pointItem -> pointItem.getItem().getCode()) + .collect(Collectors.toList()); + // 出库 + mlsService.getIssueInfo(itemCodeList, box.getPoint()); + } + } + } + } public void pickTask() { // 下发出库任务 List agvTaskList = agvTaskService.queryByAgvTask(BizStatus.OPEN,BizStatus.PICK); diff --git a/youchain-system/src/main/java/com/youchain/utils/BizStatus.java b/youchain-system/src/main/java/com/youchain/utils/BizStatus.java index 465e262..7a29301 100644 --- a/youchain-system/src/main/java/com/youchain/utils/BizStatus.java +++ b/youchain-system/src/main/java/com/youchain/utils/BizStatus.java @@ -95,6 +95,14 @@ public interface BizStatus { * 出库任务 */ public static String PICK = "PICK"; + /** + * 流利架送满 + */ + public static String FULL_OUT = "FULL_OUT"; + /** + * 流利架返空 + */ + public static String EMPTY_IN = "EMPTY_IN"; /** * 验货任务 @@ -204,10 +212,6 @@ public interface BizStatus { * 物料类型,轴承座 */ public static String ZC = "ZC"; - /** - * 空车入库 - */ - public static String EMPTY_IN = "EMPTY_IN"; /** * 空车出库/空箱出库