no message
parent
0514b2b39f
commit
65bb9f90b5
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 取消分配
|
* 取消分配
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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,6 +338,7 @@ 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;
|
||||||
|
|
@ -371,6 +350,19 @@ public class TaskServiceImpl implements TaskService {
|
||||||
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) {
|
||||||
|
|
@ -394,6 +386,9 @@ public class TaskServiceImpl implements TaskService {
|
||||||
|
|
||||||
// 生成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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -151,12 +151,6 @@ public interface BizStatus {
|
||||||
*/
|
*/
|
||||||
String CALL_PICK = "CALL_PICK";
|
String CALL_PICK = "CALL_PICK";
|
||||||
|
|
||||||
/**
|
|
||||||
* 任务类型-叫料反空
|
|
||||||
*/
|
|
||||||
String CALL_RETURN = "CALL_RETURN";
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 库存日志-移位
|
* 库存日志-移位
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue