no message

main
HUOJIN\92525 2025-02-21 11:58:12 +08:00
parent 0514b2b39f
commit 65bb9f90b5
12 changed files with 111 additions and 174 deletions

View File

@ -7,6 +7,7 @@ import com.youchain.basicdata.domain.Area;
import com.youchain.basicdata.domain.Item; import com.youchain.basicdata.domain.Item;
import com.youchain.basicdata.domain.Point; import com.youchain.basicdata.domain.Point;
import com.youchain.basicdata.domain.Stock; import com.youchain.basicdata.domain.Stock;
import com.youchain.basicdata.repository.StockRepository;
import com.youchain.basicdata.service.ItemService; import com.youchain.basicdata.service.ItemService;
import com.youchain.basicdata.service.PointService; import com.youchain.basicdata.service.PointService;
import com.youchain.basicdata.service.StockService; import com.youchain.basicdata.service.StockService;
@ -30,6 +31,7 @@ import java.util.stream.Collectors;
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
public class BydAppServiceImpl implements BydAppService { public class BydAppServiceImpl implements BydAppService {
private final StockRepository stockRepository;
private final StockService stockService; private final StockService stockService;
private final ItemService itemService; private final ItemService itemService;
private final PointService pointService; private final PointService pointService;
@ -230,7 +232,7 @@ public class BydAppServiceImpl implements BydAppService {
public void unBindContainer(String stockCode) { public void unBindContainer(String stockCode) {
Stock stock = stockService.validateStock(stockCode); Stock stock = stockService.validateStock(stockCode);
stock.setStatus(BaseStatus.FREE); stock.setStatus(BaseStatus.FREE);
stockService.update(stock); stockRepository.save(stock);
} }
/** /**

View File

@ -111,17 +111,6 @@ public class StockController {
return new ResponseEntity<>(HttpStatus.OK); return new ResponseEntity<>(HttpStatus.OK);
} }
@PutMapping("/updateStockStatus")
@Log("批量修改stock的状态")
@ApiOperation("批量修改stock的状态")
@PreAuthorize("@el.check('stock:edit')")
public ResponseEntity<Object> updateStockStatus(@Validated @RequestBody List<Stock> stockList) {
for (Stock s : stockList) {
stockService.update(s);
}
return new ResponseEntity<>(HttpStatus.OK);
}
@DeleteMapping @DeleteMapping
@Log("删除stock") @Log("删除stock")
@ApiOperation("删除stock") @ApiOperation("删除stock")

View File

@ -121,8 +121,16 @@ public class StockServiceImpl implements StockService {
point.setStatus(BaseStatus.FREE); point.setStatus(BaseStatus.FREE);
pointRepository.save(point); pointRepository.save(point);
} }
if (resources.getPoint() != null) { if (resources.getPoint() != null) {
//绑定的点位是否暂用了其他容器
Point point = resources.getPoint(); Point point = resources.getPoint();
Stock curStock = this.findByPointCode(point.getCode());
if (curStock != null) {
if (!curStock.getId().equals(resources.getId())) {
throw new BadRequestException(point.getCode() + "点位绑定的当前容器为" + curStock.getCode());
}
}
point.setStatus(BaseStatus.USED); point.setStatus(BaseStatus.USED);
pointRepository.save(point); pointRepository.save(point);
} else { } else {
@ -213,7 +221,6 @@ public class StockServiceImpl implements StockService {
} }
@Override @Override
public Map<String, Stock> findByCodes(Set<String> stockCodes) { public Map<String, Stock> findByCodes(Set<String> stockCodes) {
List<Stock> stockList = stockRepository.findByCodes(stockCodes); List<Stock> stockList = stockRepository.findByCodes(stockCodes);
@ -279,8 +286,8 @@ public class StockServiceImpl implements StockService {
} }
@Override @Override
public List<Stock> findByFreeOrUsedStock(String areaName,String status) { public List<Stock> findByFreeOrUsedStock(String areaName, String status) {
return stockRepository.findByFreeOrUsedStock(areaName,status); return stockRepository.findByFreeOrUsedStock(areaName, status);
} }
@Override @Override

View File

@ -17,6 +17,7 @@ package com.youchain.businessdata.rest;
import com.youchain.annotation.Log; import com.youchain.annotation.Log;
import com.youchain.basicdata.domain.*; import com.youchain.basicdata.domain.*;
import com.youchain.basicdata.repository.StockRepository;
import com.youchain.basicdata.service.StockService; import com.youchain.basicdata.service.StockService;
import com.youchain.businessdata.domain.*; import com.youchain.businessdata.domain.*;
import com.youchain.businessdata.service.*; import com.youchain.businessdata.service.*;
@ -52,7 +53,7 @@ public class AsnDetailController {
private final AsnDetailService asnDetailService; private final AsnDetailService asnDetailService;
private final StockService stockService; private final StockRepository stockRepository;
@Log("导出数据") @Log("导出数据")
@ApiOperation("导出数据") @ApiOperation("导出数据")
@ -80,7 +81,7 @@ public class AsnDetailController {
asnDetailService.create(asnDetail); asnDetailService.create(asnDetail);
Stock stock = asnDetail.getStock(); Stock stock = asnDetail.getStock();
stock.setStatus(BaseStatus.USED); stock.setStatus(BaseStatus.USED);
stockService.update(stock); stockRepository.save(stock);
return new ResponseEntity<>(HttpStatus.OK); return new ResponseEntity<>(HttpStatus.OK);
} }

View File

@ -127,7 +127,6 @@ public interface TaskService {
/** /**
* Task * Task
*
*/ */
List<Task> findByPickNotAllTask(); List<Task> findByPickNotAllTask();
@ -172,13 +171,11 @@ public interface TaskService {
/** /**
* *
*
*/ */
void materialPick(); void materialPick();
/** /**
* *
*
*/ */
void callEmptyStock(Point point); void callEmptyStock(Point point);
@ -195,9 +192,8 @@ public interface TaskService {
* *
* @param pickDetailId ID * @param pickDetailId ID
* @param quantity * @param quantity
* @param endPoint
*/ */
String allocate(long pickDetailId, double quantity, Point endPoint); String allocate(long pickDetailId, double quantity);
/** /**
* *

View File

@ -493,7 +493,7 @@ public class KMReServiceImpl implements KMReService {
case BizStatus.CALL_PICK: case BizStatus.CALL_PICK:
handleJl(stock, endPoint, agvTask);//叫料完成 handleJl(stock, endPoint, agvTask);//叫料完成
break; break;
case BizStatus.CALL_RETURN: case BizStatus.JL_Back:
case BizStatus.Cp_Off_Up: case BizStatus.Cp_Off_Up:
handleJlFkAndCpSx(endPoint, stock);//叫料返空完成;成品上线完成 handleJlFkAndCpSx(endPoint, stock);//叫料返空完成;成品上线完成
break; break;

View File

@ -286,10 +286,7 @@ public class MesServiceImpl implements MesService {
* @return * @return
*/ */
private List<Stock> getEmptyStockList() { private List<Stock> getEmptyStockList() {
List<Stock> emptyStockList = stockService.findByFreeOrUsedStock(AreaNameDic.CPRKHCQ, BaseStatus.FREE); List<Stock> emptyStockList = stockService.findByFreeOrUsedStock(AreaNameDic.CPRKQ, BaseStatus.FREE);
if (emptyStockList.isEmpty()) {
emptyStockList = stockService.findByFreeOrUsedStock(AreaNameDic.CPRKQ, BaseStatus.FREE);
}
return emptyStockList; return emptyStockList;
} }
@ -318,11 +315,6 @@ public class MesServiceImpl implements MesService {
if (srcPoint == null) { if (srcPoint == null) {
return transTask.getPointCode() + "点位不存在!"; return transTask.getPointCode() + "点位不存在!";
} }
// 处理下线缓存区有满货架的情况
String result = handleFullStockInCache(srcPoint);
if (result != null) {
return result;
}
//容器 //容器
Stock stock = stockService.findByPointCode(srcPoint.getCode()); Stock stock = stockService.findByPointCode(srcPoint.getCode());
@ -336,6 +328,12 @@ public class MesServiceImpl implements MesService {
} }
// 生成等待任务 // 生成等待任务
agvTaskService.createAgvTask(BizStatus.Cp_Off_Line, stock, srcPoint.getCode(), null, "RACK_MOVE"); agvTaskService.createAgvTask(BizStatus.Cp_Off_Line, stock, srcPoint.getCode(), null, "RACK_MOVE");
// 更新点位状态
pointService.usedPoint(srcPoint);
// 占用容器
stockService.usedStock(stock, srcPoint, BaseStatus.USED);
return "成品入库区和成品下线缓存区都没有空闲点位,请稍后再试!"; return "成品入库区和成品下线缓存区都没有空闲点位,请稍后再试!";
} }
@ -347,13 +345,10 @@ public class MesServiceImpl implements MesService {
// 创建Agv任务 // 创建Agv任务
AgvTask agvTask = agvTaskService.createAgvTask(BizStatus.Cp_Off_Line, stock, srcPoint.getCode(), endPoint.getCode(), "RACK_MOVE"); AgvTask agvTask = agvTaskService.createAgvTask(BizStatus.Cp_Off_Line, stock, srcPoint.getCode(), endPoint.getCode(), "RACK_MOVE");
// 同步更新终点点位状态和占用容器
synchronized (endPoint) {
// 更新点位状态 // 更新点位状态
pointService.usedPoint(endPoint); pointService.usedPoint(endPoint);
// 占用容器 // 占用容器
stockService.usedStock(stock, srcPoint, BaseStatus.USED); stockService.usedStock(stock, srcPoint, BaseStatus.USED);
}
return "呼叫成功"; return "呼叫成功";
@ -366,54 +361,9 @@ public class MesServiceImpl implements MesService {
*/ */
private Point findAvailableEndPoint() { private Point findAvailableEndPoint() {
List<Point> endPointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, AreaNameDic.CPRKQ); List<Point> endPointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, AreaNameDic.CPRKQ);
if (endPointList.isEmpty()) {
endPointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, AreaNameDic.CPXXHC);
}
return endPointList.isEmpty() ? null : endPointList.get(0); return endPointList.isEmpty() ? null : endPointList.get(0);
} }
/**
* 线
*
* @param srcPoint
* @return
*/
private String handleFullStockInCache(Point srcPoint) {
// 查询下线缓存区是否有满货架
List<Stock> fullStockList = stockService.findByFreeOrUsedStock(AreaNameDic.CPXXHC, BaseStatus.USED);
if (!fullStockList.isEmpty()) {
// 取第一个满货架容器
Stock fullStock = fullStockList.get(0);
// 查找成品入库区的可用终点点位
List<Point> endPointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, AreaNameDic.CPRKQ);
if (!endPointList.isEmpty()) {
// 取第一个可用终点点位
Point endPoint = endPointList.get(0);
// 验证终点是否有任务
if (agvTaskService.findByEndSlotCode(endPoint.getCode(), BizStatus.Cp_Off_Line, "RACK_MOVE")) {
// 创建Agv任务
AgvTask agvTask = agvTaskService.createAgvTask(BizStatus.Cp_Off_Line, fullStock, srcPoint.getCode(), endPoint.getCode(), "RACK_MOVE");
// 同步更新终点点位状态和占用容器
synchronized (endPoint) {
// 更新点位状态
pointService.usedPoint(endPoint);
// 占用容器
stockService.usedStock(fullStock, srcPoint, BaseStatus.USED);
}
}
} else {
// 没有空车的处理逻辑
if (!isSrcPointAvailable(fullStock.getPoint().getCode(), BizStatus.Cp_Off_Line, "RACK_MOVE")) {
return fullStock.getPoint().getCode() + "点位有任务,请稍后再试!";
}
// 生成agv任务进行等待
agvTaskService.createAgvTask(BizStatus.Cp_Off_Line, fullStock, fullStock.getCode(), null, "RACK_MOVE");
return "成品入库区和成品下线缓存区都没有空闲点位,请稍后再试!";
}
}
return null;
}
private String moveFxOffLine(TransTask transTask) { private String moveFxOffLine(TransTask transTask) {
//返修上线起点 //返修上线起点
String srcPointCode = transTask.getPointCode(); String srcPointCode = transTask.getPointCode();
@ -477,22 +427,27 @@ public class MesServiceImpl implements MesService {
List<Point> endPointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, dstAreaCode); List<Point> endPointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, dstAreaCode);
if (endPointList.isEmpty()) { if (endPointList.isEmpty()) {
// 没有空车的处理逻辑 // 没有空车的处理逻辑
if (!isSrcPointAvailable(srcPoint.getCode(), BizStatus.CALL_RETURN, "RACK_MOVE")) { if (!isSrcPointAvailable(srcPoint.getCode(), BizStatus.JL_Back, "RACK_MOVE")) {
return srcPoint.getCode() + "点位有任务,请稍后再试!"; return srcPoint.getCode() + "点位有任务,请稍后再试!";
} }
//生成agv任务进行等待 //生成agv任务进行等待
agvTaskService.createAgvTask(BizStatus.CALL_RETURN, stock, srcPoint.getCode(), null, "RACK_MOVE"); agvTaskService.createAgvTask(BizStatus.JL_Back, stock, srcPoint.getCode(), null, "RACK_MOVE");
// 更新点位状态
pointService.usedPoint(srcPoint);
// 占用容器
stockService.usedStock(stock, srcPoint, BaseStatus.USED);
return dstAreaCode.equals(AreaNameDic.XJFBCQ) ? "小件翻包存储区" : "大件翻包存储区" + "没有空闲点位!"; return dstAreaCode.equals(AreaNameDic.XJFBCQ) ? "小件翻包存储区" : "大件翻包存储区" + "没有空闲点位!";
} }
Point endPoint = endPointList.get(0); Point endPoint = endPointList.get(0);
if (!isEndPointAvailable(endPoint.getCode(), BizStatus.CALL_RETURN, "RACK_MOVE")) { if (!isEndPointAvailable(endPoint.getCode(), BizStatus.JL_Back, "RACK_MOVE")) {
return endPoint.getCode() + "点位有任务,请稍后再试!"; return endPoint.getCode() + "点位有任务,请稍后再试!";
} }
// 生成任务 // 生成任务
AgvTask agvTask = agvTaskService.createAgvTask(BizStatus.CALL_RETURN, stock, srcPoint.getCode(), endPoint.getCode(), "RACK_MOVE"); AgvTask agvTask = agvTaskService.createAgvTask(BizStatus.JL_Back, stock, srcPoint.getCode(), endPoint.getCode(), "RACK_MOVE");
synchronized (endPoint) { synchronized (endPoint) {
// 更新点位状态 // 更新点位状态
pointService.usedPoint(endPoint); pointService.usedPoint(endPoint);

View File

@ -169,53 +169,17 @@ public class TaskServiceImpl implements TaskService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void allocatePick(Pick pick) { public void allocatePick(Pick pick) {
//目标库位
Point endPoint = null;
if (pick.getPoint() == null) {
String areaName = null;
if (BaseStatus.GD_TYPE_CT.equals(pick.getOrderType())) {
areaName = AreaNameDic.XJFBQ;
} else if (BaseStatus.GD_TYPE_DP.equals(pick.getOrderType())) {
areaName = AreaNameDic.DJFBQ;
} else {
throw new BadRequestException("出库单类型错误!");
}
List<Point> pointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, areaName);
if (pointList.isEmpty()) {
String logMessage = pick.getCode() + "工单分配失败,翻包区没有空闲点位!";
if (!lastPollLogMessages.containsKey(logMessage)) {
logService.saveLogInfo(pick.getCode(), pick.getCode(), "/pick/allocatePick", logMessage, "出库单分配", 200, "info");
addLog(logMessage);
}
return;
}
endPoint = pointList.get(0);
} else {
endPoint = pick.getPoint();
}
List<String> msgList = new ArrayList<>();//存放提示信息 List<String> msgList = new ArrayList<>();//存放提示信息
//查询出待分配的pickDetail //查询出待分配的pickDetail
List<PickDetail> pickDetails = pickDetailService.findByPickDetailNoAllocate(pick.getId()); List<PickDetail> pickDetails = pickDetailService.findByPickDetailNoAllocate(pick.getId());
for (PickDetail pickDetail : pickDetails) { for (PickDetail pickDetail : pickDetails) {
msgList.add(this.allocate(pickDetail.getId(), pickDetail.getOrderQty() - pickDetail.getAllocatedQty(), endPoint)); msgList.add(this.allocate(pickDetail.getId(), pickDetail.getOrderQty() - pickDetail.getAllocatedQty()));
} }
/* 更新出库单状态*/ /* 更新出库单状态*/
pickService.refreshPickStatus(pick); pickService.refreshPickStatus(pick);
if (BizStatus.ALLOCATE.equals(pick.getStatus()) || BizStatus.ASSIGN.equals(pick.getStatus())) {
//绑定点位
pick.setPoint(endPoint);
pickService.update(pick);
//占用点位
pointService.usedPoint(endPoint);
}
//保存日志 //保存日志
String logMessage = msgList.toString(); String logMessage = msgList.toString();
if (!lastPollLogMessages.containsKey(logMessage)) { if (!lastPollLogMessages.containsKey(logMessage)) {
@ -280,7 +244,7 @@ public class TaskServiceImpl implements TaskService {
Point endPoint = pointList.get(0); Point endPoint = pointList.get(0);
//有任务则直接返回 //有任务则直接返回
if (!agvTaskService.findByEndSlotCode(endPoint.getCode(), BizStatus.CALL_RETURN, "RACK_MOVE")) { if (!agvTaskService.findByEndSlotCode(endPoint.getCode(), BizStatus.JL_Back, "RACK_MOVE")) {
return; return;
} }
@ -288,7 +252,7 @@ public class TaskServiceImpl implements TaskService {
pointService.usedPoint(endPoint); pointService.usedPoint(endPoint);
//创建任务 //创建任务
agvTaskService.createAgvTask(BizStatus.CALL_RETURN, stock, srcPoint.getCode(), endPoint.getCode(), "RACK_MOVE"); agvTaskService.createAgvTask(BizStatus.JL_Back, stock, srcPoint.getCode(), endPoint.getCode(), "RACK_MOVE");
} }
@ -319,7 +283,7 @@ public class TaskServiceImpl implements TaskService {
List<AgvTask> agvTasks = agvTaskService.findRepeat(task.getDstStockCode(), task.getDstPointCode(), endPoint.getCode()); List<AgvTask> agvTasks = agvTaskService.findRepeat(task.getDstStockCode(), task.getDstPointCode(), endPoint.getCode());
if (agvTasks.isEmpty()) { if (agvTasks.isEmpty()) {
//创建任务 //创建任务
agvTask = agvTaskService.createAgvTask(BizStatus.JL_Back, task.getDstStock(), task.getDstPointCode(), endPoint.getCode(), "RACK_MOVE"); agvTask = agvTaskService.createAgvTask(BizStatus.CALL_PICK, task.getDstStock(), task.getDstPointCode(), endPoint.getCode(), "RACK_MOVE");
agvTask.setLineSlotCode(pick.getCode()); agvTask.setLineSlotCode(pick.getCode());
agvTaskService.update(agvTask); agvTaskService.update(agvTask);
} else { } else {
@ -333,7 +297,7 @@ public class TaskServiceImpl implements TaskService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public String allocate(long id, double quantity, Point endPoint) { public String allocate(long id, double quantity) {
//出库明细 //出库明细
PickDetail pickDetail = pickDetailService.findById(id); PickDetail pickDetail = pickDetailService.findById(id);
@ -346,6 +310,20 @@ public class TaskServiceImpl implements TaskService {
if (pickDetail.getAllocatedQty() >= pickDetail.getOrderQty()) { if (pickDetail.getAllocatedQty() >= pickDetail.getOrderQty()) {
return pick.getCode() + "出库单;" + item.getCode() + "数量已分配!"; return pick.getCode() + "出库单;" + item.getCode() + "数量已分配!";
} }
String boxAreaName;
if (BaseStatus.GD_TYPE_CT.equals(pick.getOrderType())) {
boxAreaName = AreaNameDic.XJFBQ;
} else if (BaseStatus.GD_TYPE_DP.equals(pick.getOrderType())) {
boxAreaName = AreaNameDic.DJFBQ;
} else {
throw new BadRequestException("出库单类型错误!");
}
return allocateInternal(pick, pickDetail, item, boxAreaName, quantity);
}
private String allocateInternal(Pick pick, PickDetail pickDetail, Item item, String boxAreaName, double quantity) {
// 查询物料所在库区的库存
String areaName = stockTypeToAreaMap.getValueByKey(item.getGoodType()); String areaName = stockTypeToAreaMap.getValueByKey(item.getGoodType());
List<Inventory> inventoryList = inventoryService.queryInventory(null, item.getCode(), null, areaName, item.getDept().getId()); List<Inventory> inventoryList = inventoryService.queryInventory(null, item.getCode(), null, areaName, item.getDept().getId());
if (inventoryList.isEmpty()) { if (inventoryList.isEmpty()) {
@ -360,23 +338,37 @@ public class TaskServiceImpl implements TaskService {
return pick.getCode() + "出库单;" + item.getCode() + "物料库存不足,请先补充库存!"; return pick.getCode() + "出库单;" + item.getCode() + "物料库存不足,请先补充库存!";
} }
} }
double allocateQty = 0; double allocateQty = 0;
//未分配数量 // 未分配数量
double unQty = quantity; double unQty = quantity;
Set<String> tps = new HashSet<>(); Set<String> tps = new HashSet<>();
for (Inventory inv : inventoryList) { for (Inventory inv : inventoryList) {
//判断托盘是否有任务 // 判断托盘是否有任务
synchronized (inv.getId()) { synchronized (inv.getId()) {
if (this.existsByStock(pick.getCode(), inv.getStockCode()) >= 1) { if (this.existsByStock(pick.getCode(), inv.getStockCode()) >= 1) {
tps.add(inv.getStockCode()); tps.add(inv.getStockCode());
continue; continue;
} }
//起点
//查询翻包区是否有空闲点位
List<Point> pointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, boxAreaName);
if (pointList.isEmpty()) {
String logMessage = pick.getCode() + "明细分配失败," + (BaseStatus.GD_TYPE_CT.equals(pick.getOrderType()) ? "小件" : "大件") + "翻包区没有空闲点位!";
if (!lastPollLogMessages.containsKey(logMessage)) {
logService.saveLogInfo(pick.getCode(), pick.getCode(), "/pick/allocatePick", logMessage, "出库单分配", 200, "info");
addLog(logMessage);
}
return logMessage;
}
Point endPoint = pointList.get(0);
// 起点
Point startPoint = inv.getPoint(); Point startPoint = inv.getPoint();
if (unQty == 0) { if (unQty == 0) {
break; break;
} }
//库存可用数量 // 库存可用数量
allocateQty = inv.getQuantity() - inv.getQueuedQty(); allocateQty = inv.getQuantity() - inv.getQueuedQty();
if (allocateQty <= 0) { if (allocateQty <= 0) {
continue; continue;
@ -392,8 +384,11 @@ public class TaskServiceImpl implements TaskService {
pickDetail.setAllocatedQty(pickDetail.getAllocatedQty() + allocateQty); pickDetail.setAllocatedQty(pickDetail.getAllocatedQty() + allocateQty);
pickDetailService.update(pickDetail); pickDetailService.update(pickDetail);
//生成Task任务 // 生成Task任务
Task task = this.createTask(item, allocateQty, inv.getItemKey(), null, BizStatus.PICK, pickDetail, inv.getId(), inv.getStock(), startPoint, endPoint, null); Task task = this.createTask(item, allocateQty, inv.getItemKey(), null, BizStatus.PICK, pickDetail, inv.getId(), inv.getStock(), startPoint, endPoint, null);
//占用点位
pointService.usedPoint(endPoint);
} }
} }
@ -401,8 +396,10 @@ public class TaskServiceImpl implements TaskService {
return pick.getCode() + "出库单中" + item.getCode() + "物料分配成功!"; return pick.getCode() + "出库单中" + item.getCode() + "物料分配成功!";
} }
return tps + "托盘有任务!"; return tps + "托盘有任务!";
} }
// 增加物料可替代性判断 // 增加物料可替代性判断
private boolean isReplaceableMaterial(String material) { private boolean isReplaceableMaterial(String material) {
return material.equals("17300653-00") || material.equals("17213913-00"); return material.equals("17300653-00") || material.equals("17213913-00");
@ -577,6 +574,7 @@ public class TaskServiceImpl implements TaskService {
Inventory inventory = inventoryService.findById(task.getInvId()); Inventory inventory = inventoryService.findById(task.getInvId());
ItemKey itemKey = inventory.getItemKey(); ItemKey itemKey = inventory.getItemKey();
Dept dept = inventory.getDept(); Dept dept = inventory.getDept();
PickDetail pickDetail = task.getPickDetail();
synchronized (inventory) { synchronized (inventory) {
inventory.setQueuedQty(inventory.getQueuedQty() - moveQty); inventory.setQueuedQty(inventory.getQueuedQty() - moveQty);
inventory.setQuantity(inventory.getQuantity() - moveQty); inventory.setQuantity(inventory.getQuantity() - moveQty);
@ -598,10 +596,19 @@ public class TaskServiceImpl implements TaskService {
task.setDstStockCode(dstStock.getCode()); task.setDstStockCode(dstStock.getCode());
if (task.getPlanQty() - task.getMoveQty() == 0) { if (task.getPlanQty() - task.getMoveQty() == 0) {
task.setTaskStatus(BizStatus.FINISH); task.setTaskStatus(BizStatus.FINISH);
} else {
//部分拣货部分数量生成新的Task当前任务完成即可
task.setPlanQty(moveQty);
task.setMoveQty(moveQty);
task.setTaskStatus(BizStatus.FINISH);
// 生成Task任务
Task newTask = this.createTask(task.getItemKey().getItem(), task.getPlanQty() - moveQty, task.getItemKey(), null, BizStatus.PICK, pickDetail, task.getInvId(), task.getSrcStock(), task.getSrcPoint(), task.getDstPoint(), task.getAgvTask());
newTask.setDstStock(dstStock);
newTask.setDstStockCode(dstStock.getCode());
taskRepository.save(newTask);
} }
taskRepository.save(task); taskRepository.save(task);
PickDetail pickDetail = task.getPickDetail();
pickDetail.setPickedQty(pickDetail.getPickedQty() + moveQty); pickDetail.setPickedQty(pickDetail.getPickedQty() + moveQty);
pickDetailService.update(pickDetail); pickDetailService.update(pickDetail);

View File

@ -37,12 +37,8 @@ public class cpLineTask {
// 定义异常信息常量 // 定义异常信息常量
private static final String NO_EMPTY_SHELVES_ERROR_MSG = "成品入库区和成品入库缓存区都没有空闲点位,请及时处理!"; private static final String NO_EMPTY_SHELVES_ERROR_MSG = "成品入库区和成品入库缓存区都没有空闲点位,请及时处理!";
// 定义一个对象作为锁
private final Object lock = new Object();
public void sendAgvCpOffLine() { public void sendAgvCpOffLine() {
// 使用同步块确保线程安全
synchronized (lock) {
// 获取处于特定业务状态的AGV任务列表 // 获取处于特定业务状态的AGV任务列表
List<AgvTask> agvTaskList = agvTaskService.findOpenByAgvTask(BizStatus.Cp_Off_Line); List<AgvTask> agvTaskList = agvTaskService.findOpenByAgvTask(BizStatus.Cp_Off_Line);
// 如果任务列表为空,直接返回,避免不必要的处理 // 如果任务列表为空,直接返回,避免不必要的处理
@ -54,7 +50,6 @@ public class cpLineTask {
processAgvTask(agvTask); processAgvTask(agvTask);
} }
} }
}
private void processAgvTask(AgvTask agvTask) { private void processAgvTask(AgvTask agvTask) {
if (agvTask.getEndSlotCode() != null) { if (agvTask.getEndSlotCode() != null) {
@ -86,9 +81,6 @@ public class cpLineTask {
*/ */
private Point findAvailableEndPoint() { private Point findAvailableEndPoint() {
List<Point> endPointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, AreaNameDic.CPRKQ); List<Point> endPointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, AreaNameDic.CPRKQ);
if (endPointList.isEmpty()) {
endPointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, AreaNameDic.CPXXHC);
}
return endPointList.isEmpty() ? null : endPointList.get(0); return endPointList.isEmpty() ? null : endPointList.get(0);
} }

View File

@ -34,13 +34,10 @@ public class cpUpTask {
// 定义异常信息常量 // 定义异常信息常量
private static final String NO_EMPTY_SHELVES_ERROR_MSG = "成品入库区和成品入库缓存区都没有空货架,请及时解绑容器!"; private static final String NO_EMPTY_SHELVES_ERROR_MSG = "成品入库区和成品入库缓存区都没有空货架,请及时解绑容器!";
private final Object lock = new Object();
/** /**
* 线 * 线
*/ */
public void sendAgvCpOffUp() { public void sendAgvCpOffUp() {
synchronized (lock) {
List<AgvTask> agvTaskList = agvTaskService.findOpenByAgvTask(BizStatus.Cp_Off_Up); List<AgvTask> agvTaskList = agvTaskService.findOpenByAgvTask(BizStatus.Cp_Off_Up);
if (agvTaskList.isEmpty()) { if (agvTaskList.isEmpty()) {
return; return;
@ -50,13 +47,9 @@ public class cpUpTask {
processAgvTask(agvTask); processAgvTask(agvTask);
} }
} }
}
private List<Stock> getEmptyStockList() { private List<Stock> getEmptyStockList() {
List<Stock> emptyStockList = stockService.findByFreeOrUsedStock(AreaNameDic.CPRKHCQ, BaseStatus.FREE); List<Stock> emptyStockList = stockService.findByFreeOrUsedStock(AreaNameDic.CPRKQ, BaseStatus.FREE);
if (emptyStockList.isEmpty()) {
emptyStockList = stockService.findByFreeOrUsedStock(AreaNameDic.CPRKQ, BaseStatus.FREE);
}
return emptyStockList; return emptyStockList;
} }

View File

@ -68,6 +68,7 @@ public class jlBackTask {
Point endPoint = findAvailableEndPoint(areaName); Point endPoint = findAvailableEndPoint(areaName);
if (endPoint != null) { if (endPoint != null) {
updateAgvTaskWithEndPoint(agvTask, endPoint); updateAgvTaskWithEndPoint(agvTask, endPoint);
kmReService.sendAgvTask(agvTask, kmReService.sendAgvTaskHjJson(agvTask));
} else { } else {
// 若未找到可用结束点,抛出异常 // 若未找到可用结束点,抛出异常
throw new BadRequestException(areaName+NO_EMPTY_SHELVES_ERROR_MSG); throw new BadRequestException(areaName+NO_EMPTY_SHELVES_ERROR_MSG);

View File

@ -151,12 +151,6 @@ public interface BizStatus {
*/ */
String CALL_PICK = "CALL_PICK"; String CALL_PICK = "CALL_PICK";
/**
* -
*/
String CALL_RETURN = "CALL_RETURN";
/** /**
* - * -
*/ */