部分翻包拣货

main
HUOJIN\92525 2025-02-16 18:20:44 +08:00
parent 198bcba6ba
commit bf4d837e39
14 changed files with 83 additions and 53 deletions

View File

@ -22,4 +22,7 @@ public class FbPick {
@ApiModelProperty(value = "目标托盘")
String dstStockCode;
@ApiModelProperty(value = "实拣数量")
Double moveQty;
}

View File

@ -73,7 +73,7 @@ public class BydAppController {
Long taskId = fbPick.getTaskId();//任务id
String orderNumber = fbPick.getDstOrderNumber();//箱号
String dstStockCode = fbPick.getDstStockCode();//目标托盘
bydAppService.fbPicking(taskId, orderNumber, dstStockCode);
bydAppService.fbPicking(taskId, orderNumber, dstStockCode,fbPick.getMoveQty());
return successResponse("拣货成功", null);
} catch (Exception e) {
return badRequest("拣货失败:" + e.getMessage());

View File

@ -35,7 +35,7 @@ public interface BydAppService {
* @param orderNumber
* @param dstStockCode
*/
void fbPicking(Long taskId, String orderNumber, String dstStockCode);
void fbPicking(Long taskId, String orderNumber, String dstStockCode ,Double moveQty);
/**
*

View File

@ -194,15 +194,15 @@ public class BydAppServiceImpl implements BydAppService {
returnTaskVo.setItemName(task.getItem().getName());
returnTaskVo.setSrcPointCode(task.getSrcPointCode());
returnTaskVo.setDstPointCode(task.getDstPointCode());
returnTaskVo.setPlanQty(task.getPlanQty());
returnTaskVo.setPlanQty(task.getPlanQty()-task.getMoveQty());
return returnTaskVo;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void fbPicking(Long taskId, String orderNumber, String dstStockCode) {
public void fbPicking(Long taskId, String orderNumber, String dstStockCode,Double moveQty) {
//验证任务
Task task = validateTask(taskId, orderNumber);
Task task = validateTask(taskId, orderNumber,moveQty);
//工单
Pick pick = task.getPickDetail().getPick();
@ -211,7 +211,7 @@ public class BydAppServiceImpl implements BydAppService {
Stock dstStock = validatedstStock(task, pick, dstStockCode);
//库存移位
taskService.moveInventory(task, dstStock, task.getPlanQty());
taskService.moveInventory(task, dstStock, moveQty);
//刷新出库单状态
pickService.refreshPickStatus(task.getPickDetail().getPick());
@ -392,11 +392,14 @@ public class BydAppServiceImpl implements BydAppService {
* @param taskId Id
* @param orderNumber
*/
private Task validateTask(Long taskId, String orderNumber) {
private Task validateTask(Long taskId, String orderNumber,Double moveQty) {
Task task = taskService.findById(taskId);
if (task == null) {
throw new BadRequestException("未找到相应任务记录!");
}
if(moveQty>task.getPlanQty()-task.getMoveQty()){
throw new BadRequestException("实际拣货数量不能大于待拣货数量!");
}
if (orderNumber.equals(task.getItemKey().getOrderNumber())) {
return task;
} else {

View File

@ -28,6 +28,7 @@ import javax.persistence.*;
import javax.validation.constraints.*;
import java.io.Serializable;
import java.util.List;
import java.util.Set;
/**
* @author huojin
@ -80,10 +81,10 @@ public class Pick extends BaseEntity implements Serializable {
@ApiModelProperty(value = "备料点位")
private Point point;
@OneToOne
@JoinColumn(name = "`call_point_id`")
@Column(name = "`call_point_id`")
@ApiModelProperty(value = "叫料点位")
private Point callPoint;
private String callPoint;
@Column(name = "`is_call`")
@ApiModelProperty(value = "是否叫料")

View File

@ -149,9 +149,13 @@ public class Task extends BaseEntity implements Serializable {
private String putCode;
@Column(name = "inv_id")
@ApiModelProperty(value = "库存ID")
@ApiModelProperty(value = "库存ID")
private Long invId;
@Column(name = "new_inv_id")
@ApiModelProperty(value = "新库存ID")
private Long newInvId;
@OneToOne
@JoinColumn(name = "dept_id")
@ApiModelProperty(value = "仓库ID")

View File

@ -51,7 +51,7 @@ public interface TaskRepository extends JpaRepository<Task, Long>, JpaSpecificat
*
* @param pickId ID
*/
@Query("from Task t where t.pickDetail.pick.id =:pickId and t.planQty > t.moveQty")
@Query("from Task t where t.pickDetail.pick.id =:pickId and t.planQty > t.moveQty and t.agvTask.id is null")
List<Task> findByPickNotAllTask(Long pickId);
/**
@ -59,7 +59,7 @@ public interface TaskRepository extends JpaRepository<Task, Long>, JpaSpecificat
*
* @param pickId ID
*/
@Query("from Task t where t.pickDetail.pick.id =:pickId and t.planQty = t.moveQty")
@Query("from Task t where t.pickDetail.pick.id =:pickId and t.planQty - t.moveQty>0 ")
List<Task> findByPickAllTask(Long pickId);
/**

View File

@ -82,7 +82,7 @@ public class PickDto implements Serializable {
/**
*
*/
private Point callPoint;
private String callPoint;
/**
*

View File

@ -653,7 +653,7 @@ public class KMReServiceImpl implements KMReService {
List<Task> taskList = taskService.findTaskByCallAgvTask(agvTask.getId());
for (Task task : taskList) {
inventoryService.deleteAll(new Long[]{task.getInvId()});
inventoryService.deleteAll(new Long[]{task.getNewInvId()});
}
//点位占用
@ -663,10 +663,7 @@ public class KMReServiceImpl implements KMReService {
stockService.usedStock(stock, endPoint, BaseStatus.USED);
Pick pick = pickService.findByPickCode(agvTask.getLineSlotCode());
if (pick != null) {
pick.setStatus(BizStatus.CLOSE);
pickService.update(pick);
}
pickService.refreshPickStatus(pick);
//回传MES
pickService.returnPick(pick.getId());

View File

@ -82,7 +82,7 @@ public class MesServiceImpl implements MesService {
: null;
Item item = itemRepository.findByCode(itemCode);
if (item == null) {
item = itemService.createItem(itemDate.getItemCode(), itemDate.getItemName(), itemDate.getItemQty(), BizStatus.XJ);
item = itemService.createItem(itemCode, itemDate.getItemName(), itemDate.getItemQty(), BizStatus.XJ);
} else {
item.setGoodType(BizStatus.XJ);
item.setExtendD1(itemDate.getItemQty());
@ -112,7 +112,7 @@ public class MesServiceImpl implements MesService {
item.setExtendD1(itemDate.getItemQty());
itemRepository.save(item);
}
PickDetail pickDetail = createPickDetail(pick, item, BaseStatus.GD_TYPE_DP, itemDate.getItemQty(), null,splitItemCode);
PickDetail pickDetail = createPickDetail(pick, item, BaseStatus.GD_TYPE_DP, itemDate.getItemQty(), null, splitItemCode);
createPickDetails.add(pickDetail);
});
@ -134,7 +134,7 @@ public class MesServiceImpl implements MesService {
if (pick == null) {
throw new BadRequestException(gdNo + ":" + itemCode + ":" + station + "工单不存在,叫料失败!");
}
if (BizStatus.OPEN.equals(pick.getStatus()) || BizStatus.ASSIGN.equals(pick.getStatus())) {
if (BizStatus.OPEN.equals(pick.getStatus())) {
throw new BadRequestException(gdNo + "工单未备料完成,叫料失败!");
}
@ -143,12 +143,12 @@ public class MesServiceImpl implements MesService {
throw new BadRequestException(pointCode + "点位不存在或已失效!");
}
if (pick.getIsCall()) {
throw new BadRequestException(gdNo + "工单已叫料,请勿重复叫料!");
}
pick.setIsCall(true);
pick.setCallPoint(point);
if (pick.getCallPoint()==null || pick.getCallPoint().length()<=0) {
pick.setCallPoint(pointCode);
}else if(!pointCode.equals(pick.getCallPoint())){
pick.setCallPoint(pick.getCallPoint()+","+pointCode);
}
pickRepository.save(pick);
taskService.callEmptyStock(point);
@ -162,7 +162,7 @@ public class MesServiceImpl implements MesService {
throw new BadRequestException(gdNo + ":" + completeCode + ":" + station + "工单不存在,叫料失败!");
}
if (BizStatus.OPEN.equals(pick.getStatus()) || BizStatus.ASSIGN.equals(pick.getStatus())) {
if (BizStatus.OPEN.equals(pick.getStatus())) {
throw new BadRequestException(gdNo + "工单未备料完成,叫料失败!");
}
@ -171,11 +171,14 @@ public class MesServiceImpl implements MesService {
throw new BadRequestException(pointCode + "点位不存在或已失效!");
}
if (pick.getIsCall()) {
throw new BadRequestException(gdNo + "工单已叫料,请勿重复叫料!");
}
pick.setIsCall(true);
pick.setCallPoint(point);
if (pick.getCallPoint()==null || pick.getCallPoint().length()<=0) {
pick.setCallPoint(pointCode);
}else if(!pointCode.equals(pick.getCallPoint())){
pick.setCallPoint(pick.getCallPoint()+","+pointCode);
}
pickRepository.save(pick);
taskService.callEmptyStock(point);
}

View File

@ -133,7 +133,6 @@ public class PickServiceImpl implements PickService {
@Override
@Transactional(rollbackFor = Exception.class)
public void refreshPickStatus(Pick pick) {
// 查询出库单的所有明细
List<PickDetail> allocatePickDetailList = pickDetailService.findByAllPickDetail(pick.getId());
@ -154,7 +153,7 @@ public class PickServiceImpl implements PickService {
String status = pick.getStatus();
// 更新状态
if (orderQty - allocatedQty > 0 && allocatedQty != 0) {
if (orderQty - allocatedQty > 0 && allocatedQty != 0 && pickedQty == 0) {
status = BizStatus.ASSIGN;
} else if (orderQty == allocatedQty && pickedQty == 0) {
status = BizStatus.ALLOCATE;
@ -180,7 +179,7 @@ public class PickServiceImpl implements PickService {
String itemCode = pickDetail.getPropC3() == null ? pickDetail.getItem().getCode() : pickDetail.getPropC3();
jsonObject.put("MaterialCode", itemCode);
//数量
jsonObject.put("number", pickDetail.getOrderQty() == null ? 0 : pickDetail.getOrderQty().intValue());
jsonObject.put("number", pickDetail.getPickedQty()== null ? 0 : pickDetail.getPickedQty().intValue());
//taskId
jsonObject.put("taskId", pickDetail.getPick().getTaskCode());
return jsonObject;
@ -191,7 +190,10 @@ public class PickServiceImpl implements PickService {
Pick pick = pickRepository.getById(pickId);
List<PickDetail> pickDetailList = pickDetailRepository.findByAllPickDetail(pickId);
for (PickDetail pickDetail : pickDetailList) {
sendPick(UrlApi.stock(), pickDetail);
if(pickDetail.getPickedQty()>0){
sendPick(UrlApi.stock(), pickDetail);
}
}
refreshPickReturn(pick);
}

View File

@ -24,6 +24,7 @@ import com.youchain.businessdata.domain.*;
import com.youchain.businessdata.repository.*;
import com.youchain.businessdata.service.*;
import com.youchain.exception.BadRequestException;
import com.youchain.modules.system.domain.Dept;
import com.youchain.service.LogService;
import com.youchain.utils.*;
import lombok.RequiredArgsConstructor;
@ -199,11 +200,13 @@ public class TaskServiceImpl implements TaskService {
//查询出待分配的pickDetail
List<PickDetail> pickDetails = pickDetailService.findByPickDetailNoAllocate(pick.getId());
for (PickDetail pickDetail : pickDetails) {
msgList.add(this.allocate(pickDetail.getId(), pickDetail.getOrderQty(), endPoint));
synchronized (pickDetail.getId()) {
msgList.add(this.allocate(pickDetail.getId(), pickDetail.getOrderQty() - pickDetail.getAllocatedQty(), endPoint));
}
}
/* 更新出库单状态*/
synchronized (pick) {
synchronized (pick.getId()) {
pickService.refreshPickStatus(pick);
if (BizStatus.ALLOCATE.equals(pick.getStatus()) || BizStatus.ASSIGN.equals(pick.getStatus())) {
@ -258,9 +261,10 @@ public class TaskServiceImpl implements TaskService {
task.setTaskStatus(agvTask.getStatus());
taskRepository.save(task);
}
/*更新出库单状态*/
/*更新出库单状态*//*
pick.setStatus(BizStatus.PICKUP);
pickService.update(pick);
pickService.update(pick);*/
}
@ -302,7 +306,7 @@ public class TaskServiceImpl implements TaskService {
@Transactional(rollbackFor = Exception.class)
public void callJlTask(Pick pick) {
if (pick.getStock() == null) {
throw new BadRequestException(pick.getGdCode() + "翻包拣货!");
throw new BadRequestException(pick.getGdCode() + "工单未翻包拣货!");
}
if (pick.getCallPoint() == null) {
throw new BadRequestException(pick.getGdCode() + "工单没有叫料请求!");
@ -311,12 +315,17 @@ public class TaskServiceImpl implements TaskService {
Point srcPoint = pick.getStock().getPoint();
//终点
Point endPoint = pick.getCallPoint();
String[] points = pick.getCallPoint().split(",");
String endPointCode = points[points.length - 1];
Point endPoint = pointService.queryPoint(endPointCode, null, null, null);
//容器
Stock stock = pick.getStock();
//创建任务
if (!agvTaskService.findByEndSlotCode(endPoint.getCode(), BizStatus.CALL_PICK, "RACK_MOVE")) {
throw new BadRequestException(endPoint.getCode() + "点位有任务,请稍后再试!");
}
AgvTask agvTask = agvTaskService.createAgvTask(BizStatus.CALL_PICK, stock, srcPoint.getCode(), endPoint.getCode(), "RACK_MOVE");
agvTask.setLineSlotCode(pick.getCode());
agvTaskService.update(agvTask);
@ -367,7 +376,7 @@ public class TaskServiceImpl implements TaskService {
Set<String> tps = new HashSet<>();
for (Inventory inv : inventoryList) {
//判断托盘是否有任务
synchronized (inv) {
synchronized (inv.getId()) {
if (this.existsByStock(pick.getCode(), inv.getStockCode()) >= 1) {
tps.add(inv.getStockCode());
continue;
@ -394,7 +403,8 @@ public class TaskServiceImpl implements TaskService {
pickDetailService.update(pickDetail);
//生成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);
System.out.println(task.getId());
}
}
@ -560,6 +570,8 @@ public class TaskServiceImpl implements TaskService {
public void moveInventory(Task task, Stock dstStock, double moveQty) {
//将占用数量移位,原库存回库内
Inventory inventory = inventoryService.findById(task.getInvId());
ItemKey itemKey = inventory.getItemKey();
Dept dept = inventory.getDept();
synchronized (inventory) {
inventory.setQueuedQty(inventory.getQueuedQty() - moveQty);
inventory.setQuantity(inventory.getQuantity() - moveQty);
@ -572,14 +584,17 @@ public class TaskServiceImpl implements TaskService {
}
//生成新库存
Inventory newInventory = inventoryService.createInventory(inventory.getItemKey(), dstStock.getPoint(), dstStock, inventory.getDept(), moveQty);
Inventory newInventory = inventoryService.createInventory(itemKey, dstStock.getPoint(), dstStock, dept, moveQty);
//更新Task
task.setInvId(newInventory.getId());
task.setMoveQty(moveQty);
task.setTaskStatus(BizStatus.FINISH);
task.setInvId(inventory.getId());
task.setNewInvId(newInventory.getId());
task.setMoveQty(task.getMoveQty() + moveQty);
task.setDstStock(dstStock);
task.setDstStockCode(dstStock.getCode());
if (task.getPlanQty() - task.getMoveQty() == 0) {
task.setTaskStatus(BizStatus.FINISH);
}
taskRepository.save(task);
PickDetail pickDetail = task.getPickDetail();

View File

@ -1,7 +1,9 @@
package com.youchain.modules.quartz.task;
import com.youchain.basicdata.domain.Point;
import com.youchain.basicdata.domain.Stock;
import com.youchain.basicdata.service.PointService;
import com.youchain.basicdata.service.StockService;
import com.youchain.businessdata.domain.AgvTask;
import com.youchain.businessdata.domain.Pick;
import com.youchain.businessdata.domain.Task;
@ -28,7 +30,7 @@ import java.util.*;
public class pickTask {
@Autowired
public PointService pointService;
public StockService stockService;
@Autowired
public PickService pickService;
@ -77,7 +79,7 @@ public class pickTask {
*/
public void callJlTask() {
/*查询拣货完成完成的出库单*/
List<String> statuses = Arrays.asList(BizStatus.PICK_ALL);
List<String> statuses = Arrays.asList(BizStatus.PICKUP,BizStatus.PICK_ALL);
List<Pick> pickList = pickService.findByPickStatus(statuses, true);
if (pickList.isEmpty()) {
throw new BadRequestException("无拣货完成的出库单或出库单未叫料!");
@ -97,8 +99,9 @@ public class pickTask {
}
for (AgvTask agvTask : agvTaskList) {
if (BizStatus.PICK.equals(agvTask.getType())) {
Point point = pointService.validatePoint(agvTask.getEndSlotCode());
if(BaseStatus.FREE.equalsIgnoreCase(point.getStatus())){
//目标点没有托盘继续下发下一个任务
Stock stock= stockService.findByPointCode(agvTask.getEndSlotCode());
if(stock==null){
kmReService.sendAgvTask(agvTask, kmReService.sendAgvTaskCcJson(agvTask));
}
} else {

View File

@ -91,7 +91,6 @@ public interface BizStatus {
*/
String FINISH = "FINISH";
/**
* -
*/