no message

main
暴炳林 2025-06-18 15:26:01 +08:00
parent edade7cc3c
commit 17ad836f0d
12 changed files with 185 additions and 21 deletions

View File

@ -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;

View File

@ -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<PointItem, Long>, JpaSpecificationExecutor<PointItem> {
@Query(value = "SELECT pi FROM PointItem pi", nativeQuery = false)
List<PointItem> findByPoint(Long id);
}

View File

@ -74,6 +74,7 @@ public class BoxController {
@PreAuthorize("@el.check('box:add')")
public ResponseEntity<Object> 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<Object> updateBox(@Validated @RequestBody Box resources) {
resources.setCode(resources.getWorkType()+":"+resources.getPoint().getCode());
boxService.update(resources);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}

View File

@ -72,6 +72,7 @@ public class PointItemController {
@ApiOperation("修改pointItem")
@PreAuthorize("@el.check('pointItem:edit')")
public ResponseEntity<Object> updatePointItem(@Validated @RequestBody PointItem resources){
resources.setCode(resources.getPoint().getCode()+":"+resources.getItem().getCode());
pointItemService.update(resources);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}

View File

@ -31,4 +31,6 @@ import java.util.List;
public interface InventoryRepository extends JpaRepository<Inventory, Long>, JpaSpecificationExecutor<Inventory> {
@Query(value = "select inv from Inventory inv where inv.billCode=?1 ")
List<Inventory> findByBillCode(String billCode);
@Query(value = "select inv from Inventory inv where inv.itemKey.item.code in ?1 ")
List<Inventory> findInvByItemCodes(List<String> itemCodes);
}

View File

@ -105,4 +105,5 @@ public interface InventoryService {
List<Inventory> getInvForPlan(String type,Long areaId,Long itemId,Long deptId);
List<Inventory> findInvByBillCode(Set billCode);
}

View File

@ -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<String> itemCodes, Point endPoint);
/**
* MO

View File

@ -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<String> itemCodes,Point endPoint) {
CompletableFuture<List<Inventory>> inventoryListFuture = CompletableFuture.supplyAsync(() -> {
List<Inventory> inventoryList = inventoryRepository.findInvByItemCodes(itemCodes);//物料号码查询库存信息
return inventoryList;
});
if (inventoryListFuture.join().isEmpty()) {
throw new RuntimeException("无库存信息!");
}
List<String> errorMsgList = new ArrayList<>();
inventoryListFuture.thenAccept((result) -> {
List<Inventory> inventoryToUpdate = new ArrayList<>();
List<PickDetail> pickDetailToCreate = new ArrayList<>();
List<AgvTask> agvTaskToCreate = new ArrayList<>();
List<Task> 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<Void> inventoryFuture = CompletableFuture.runAsync(() -> {
//批量更新库存信息
if (!inventoryToUpdate.isEmpty()) {
batchCreateOrUpdate.batchUpdate(inventoryToUpdate);
}
}, executor);
CompletableFuture<Void> pickDetailFuture = inventoryFuture.thenRunAsync(() -> {
//批量生成叫料明细
if (!pickDetailToCreate.isEmpty()) {
batchCreateOrUpdate.batchCreate(pickDetailToCreate);
}
}, executor);
CompletableFuture<Void> agvTaskFuture = pickDetailFuture.thenRunAsync(() -> {
// 批量生成agv任务
if (!agvTaskToCreate.isEmpty()) {
batchCreateOrUpdate.batchCreate(agvTaskToCreate);
}
}, executor);
CompletableFuture<Void> 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();

View File

@ -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<Object> modbusInfoData(){
List<ModbusInfo> modbusInfoList=modbusInfoRepository.findAll();
ApiResult apiResult=ApiResult.fail(200,"成功",modbusInfoList);
return new ResponseEntity<>(apiResult,apiResult.getStatus());
}
}

View File

@ -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<String> 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));
}

View File

@ -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<Box> boxList = boxRepository.getBoxAllData();
for (Box box : boxList){
List<String> dataValueList = box.getModbusInfo().getDataValueList();
if (dataValueList.get(box.getSort()-1).equals(box.getWorkCode())){
if (box.getWorkType().equals(BizStatus.PICK)){
List<PointItem> pointItemList=pointItemRepository.findByPoint(box.getPoint().getId());
// 获取 PointItem.item.code 集合
List<String> itemCodeList = pointItemList.stream()
.map(pointItem -> pointItem.getItem().getCode())
.collect(Collectors.toList());
// 出库
mlsService.getIssueInfo(itemCodeList, box.getPoint());
}
}
}
}
public void pickTask() {
// 下发出库任务
List<AgvTask> agvTaskList = agvTaskService.queryByAgvTask(BizStatus.OPEN,BizStatus.PICK);

View File

@ -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";
/**
* /