no message
parent
bcef8c2859
commit
acc0887fcf
|
|
@ -16,6 +16,7 @@
|
|||
package com.youchain.businessdata.domain;
|
||||
|
||||
import com.youchain.base.BaseEntity;
|
||||
import com.youchain.basicdata.domain.Point;
|
||||
import com.youchain.modules.system.domain.Dept;
|
||||
import lombok.Data;
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
|
|
@ -58,7 +59,11 @@ public class Pick extends BaseEntity implements Serializable {
|
|||
@Column(name = "`status`")
|
||||
@ApiModelProperty(value = "状态")
|
||||
private String status;
|
||||
|
||||
@OneToOne
|
||||
@JoinColumn(name = "`point_id`",nullable = false)
|
||||
@ApiModelProperty(value = "备料点位")
|
||||
@NotNull
|
||||
private Point point;
|
||||
@OneToOne
|
||||
@JoinColumn(name = "`gd_detail_id`",nullable = false)
|
||||
@NotNull
|
||||
|
|
|
|||
|
|
@ -54,4 +54,17 @@ public interface PickDetailRepository extends JpaRepository<PickDetail, Long>, J
|
|||
List<PickDetail> queryOutQHAllData(String time);
|
||||
@Query(value = "SELECT p FROM PickDetail p WHERE p.pick.id=?1 and p.item.id=?2", nativeQuery = false)
|
||||
List<PickDetail> findRepeat(Long pickId, Long itemId);
|
||||
|
||||
/**
|
||||
* 查询待分配的出库明细
|
||||
* @return
|
||||
*/
|
||||
@Query(value = "SELECT p FROM PickDetail p WHERE p.orderQty>p.allocatedQty", nativeQuery = false)
|
||||
List<PickDetail> findByAllocate();
|
||||
/**
|
||||
* 查询当前出库单是否有未分配完的明细
|
||||
* @return
|
||||
*/
|
||||
@Query(value = "SELECT p FROM PickDetail p WHERE p.orderQty>p.allocatedQty and p.pick.id=?1", nativeQuery = false)
|
||||
List<PickDetail> findByAllocate(Long pickId);
|
||||
}
|
||||
|
|
@ -30,4 +30,6 @@ import java.util.List;
|
|||
public interface PickRepository extends JpaRepository<Pick, Long>, JpaSpecificationExecutor<Pick> {
|
||||
@Query(value = "SELECT p FROM Pick p WHERE p.gdDetail.id=?1 and p.lineNo=?2", nativeQuery = false)
|
||||
List<Pick> findRepeat(long gdDetailId,int no);
|
||||
@Query(value = "SELECT p FROM Pick p WHERE p.status=?1 ", nativeQuery = false)
|
||||
List<Pick> findByStatus(String status);
|
||||
}
|
||||
|
|
@ -30,5 +30,6 @@ import java.util.Map;
|
|||
* @date 2023-08-16
|
||||
**/
|
||||
public interface TaskRepository extends JpaRepository<Task, Long>, JpaSpecificationExecutor<Task> {
|
||||
|
||||
@Query(value = "SELECT t FROM Task t WHERE t.pickDetail.pick.id=?1 and t.taskStatus='PICK'", nativeQuery = false)
|
||||
List<Task> findByPick(Long pickId);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -126,14 +126,9 @@ public class PickDetailController {
|
|||
public synchronized ResponseEntity<Object> allocate(@RequestBody Long[] ids) throws Exception {
|
||||
List<Long> pickDetailIds = Arrays.asList(ids);
|
||||
if (pickDetailIds.size() > 0) {
|
||||
try {
|
||||
for (Long id : pickDetailIds) {
|
||||
PickDetailDto pickDetailDto = pickDetailService.findById(id);
|
||||
pickDetailService.allocate(id, pickDetailDto.getOrderQty(),null);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
return new ResponseEntity(ApiResult.fail(BAD_REQUEST.value(), e.getMessage(), ""), HttpStatus.BAD_REQUEST);
|
||||
|
||||
for (Long id : pickDetailIds) {
|
||||
PickDetailDto pickDetailDto = pickDetailService.findById(id);
|
||||
pickDetailService.allocate(id, pickDetailDto.getOrderQty(),null);
|
||||
}
|
||||
} else {
|
||||
return new ResponseEntity(ApiResult.fail(BAD_REQUEST.value(), "参数错误或者为null", ""), HttpStatus.BAD_REQUEST);
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ public interface PickDetailService {
|
|||
/**
|
||||
* 分配
|
||||
*/
|
||||
void allocate(long id,double quantity,String areaName) throws Exception;
|
||||
void allocate(long id,double quantity,String areaName);
|
||||
|
||||
/**
|
||||
* 整出分配
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
*/
|
||||
package com.youchain.businessdata.service.dto;
|
||||
|
||||
import com.youchain.basicdata.domain.Point;
|
||||
import com.youchain.businessdata.domain.GdDetail;
|
||||
import com.youchain.modules.system.service.dto.DeptDto;
|
||||
import lombok.Data;
|
||||
|
|
@ -61,4 +62,6 @@ public class PickDto implements Serializable {
|
|||
/** 关联工单明细 */
|
||||
private Long gdDetailId;
|
||||
private GdDetail gdDetail;
|
||||
/** 关联备料点位 */
|
||||
private Point point;
|
||||
}
|
||||
|
|
@ -15,10 +15,13 @@
|
|||
*/
|
||||
package com.youchain.businessdata.service.impl;
|
||||
|
||||
import com.youchain.basicdata.domain.Point;
|
||||
import com.youchain.basicdata.repository.PointRepository;
|
||||
import com.youchain.businessdata.domain.Gd;
|
||||
import com.youchain.businessdata.domain.GdDetail;
|
||||
import com.youchain.businessdata.domain.Pick;
|
||||
import com.youchain.businessdata.repository.GdDetailRepository;
|
||||
import com.youchain.businessdata.repository.PickRepository;
|
||||
import com.youchain.businessdata.service.PickDetailService;
|
||||
import com.youchain.businessdata.service.PickService;
|
||||
import com.youchain.modules.system.domain.Dept;
|
||||
|
|
@ -52,6 +55,8 @@ public class GdServiceImpl implements GdService {
|
|||
private final GdRepository gdRepository;
|
||||
private final GdDetailRepository gdDetailRepository;
|
||||
private final PickService pickService;
|
||||
private final PickRepository pickRepository;
|
||||
private final PointRepository pointRepository;
|
||||
private final PickDetailService pickDetailService;
|
||||
private final DeptService deptService;
|
||||
private final GdMapper gdMapper;
|
||||
|
|
@ -153,6 +158,10 @@ public class GdServiceImpl implements GdService {
|
|||
no=no+1;
|
||||
/*生成出库明细*/
|
||||
pickDetailService.save(pick);
|
||||
/*添加 默认目标备料点位*/
|
||||
Point point=pointRepository.getById(2195l);
|
||||
pick.setPoint(point);
|
||||
pickRepository.save(pick);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@ import com.youchain.businessdata.repository.*;
|
|||
import com.youchain.businessdata.service.InventoryService;
|
||||
import com.youchain.businessdata.service.TaskService;
|
||||
import com.youchain.businessdata.service.dto.InventoryDto;
|
||||
import com.youchain.exception.BadRequestException;
|
||||
import com.youchain.exception.handler.ApiResult;
|
||||
import com.youchain.modules.quartz.utils.TimeNumberUtils;
|
||||
import com.youchain.modules.system.domain.Dept;
|
||||
|
|
@ -64,6 +65,7 @@ import static org.springframework.http.HttpStatus.BAD_REQUEST;
|
|||
@RequiredArgsConstructor
|
||||
public class PickDetailServiceImpl implements PickDetailService {
|
||||
private final PickDetailRepository pickDetailRepository;
|
||||
private final PickRepository pickRepository;
|
||||
private final GdDetailRepository gdDetailRepository;
|
||||
private final PickDetailMapper pickDetailMapper;
|
||||
private final InventoryService inventoryService;
|
||||
|
|
@ -138,14 +140,18 @@ public class PickDetailServiceImpl implements PickDetailService {
|
|||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public synchronized void allocate(long id, double quantity,String areaName) throws Exception {
|
||||
public synchronized void allocate(long id, double quantity,String areaName) {
|
||||
if (areaName==null){
|
||||
areaName="大件存储区,小件存储区";
|
||||
}
|
||||
PickDetailDto pickDetailDto = findById(id);
|
||||
PickDetail pd = toEntity(pickDetailDto);//Dto转实体
|
||||
ItemDto itemDto = pickDetailDto.getItem();
|
||||
Item item = itemService.toEntity(itemDto);
|
||||
Dept dept = item.getDept();//仓库
|
||||
Box box = boxRepository.getBoxByItem(item.getId());
|
||||
Point endPoint = box.getPoint();//目标点位
|
||||
Pick pick=pd.getPick();
|
||||
// Box box = boxRepository.getBoxByItem(item.getId());
|
||||
Point endPoint = pick.getPoint();//目标点位
|
||||
if (pd.getOrderQty() > pd.getAllocatedQty()) {
|
||||
List<Inventory> Inventorys = inventoryService.queryInventory(item.getId(),areaName);
|
||||
if (Inventorys.size() > 0) {
|
||||
|
|
@ -167,17 +173,29 @@ public class PickDetailServiceImpl implements PickDetailService {
|
|||
inv.setQueuedQty(inv.getQueuedQty() + allocateQty);
|
||||
inventoryService.update(inv);
|
||||
unQty -= allocateQty;
|
||||
/* 更新出库单明细状态*/
|
||||
pd.setAllocatedQty(pd.getAllocatedQty() + allocateQty);
|
||||
if (pd.getOrderQty().equals(pd.getAllocatedQty())) {
|
||||
pd.setStatus(BizStatus.ALLOCATE);
|
||||
}
|
||||
pickDetailRepository.save(pd);
|
||||
|
||||
/* 更新出库单状态*/
|
||||
List<PickDetail> pickDetailList=pickDetailRepository.findByAllocate(pick.getId());
|
||||
if (pickDetailList.size()<1){
|
||||
pick.setStatus(BizStatus.ALLOCATE);
|
||||
pickRepository.save(pick);
|
||||
}else {
|
||||
if (pick.getStatus().equals(BizStatus.OPEN)){
|
||||
pick.setStatus(BizStatus.ASSIGN);
|
||||
pickRepository.save(pick);
|
||||
}
|
||||
}
|
||||
//生成搬运任务
|
||||
AgvTask agvTask = new AgvTask(BizStatus.PICK, stock.getCode(), startPoint.getCode(), endPoint.getCode(), BizStatus.OPEN, "01");
|
||||
agvTaskRepository.save(agvTask);
|
||||
/*AgvTask agvTask = new AgvTask(BizStatus.PICK, stock.getCode(), startPoint.getCode(), endPoint.getCode(), BizStatus.OPEN, "01");
|
||||
agvTaskRepository.save(agvTask);*/
|
||||
//生成Task
|
||||
Task task = new Task();
|
||||
task.setTaskType(BizStatus.PICK);
|
||||
task.setItem(item);
|
||||
task.setItemKey(inv.getItemKey());
|
||||
task.setPickDetail(pd);
|
||||
|
|
@ -194,11 +212,12 @@ public class PickDetailServiceImpl implements PickDetailService {
|
|||
task.setPlanQty(allocateQty);
|
||||
task.setInvId(inv.getId());
|
||||
task.setDept(dept);
|
||||
task.setAgvTask(agvTask);
|
||||
// task.setAgvTask(agvTask);
|
||||
taskService.create(task);
|
||||
}
|
||||
}else {
|
||||
throw new BadRequestException(HttpStatus.NOT_IMPLEMENTED, "库存不足:"+item.getCode());
|
||||
}
|
||||
|
||||
} else {
|
||||
throw new RuntimeException("已分配,请勿重复操作!");
|
||||
}
|
||||
|
|
@ -349,6 +368,7 @@ public class PickDetailServiceImpl implements PickDetailService {
|
|||
pickDetail=pickDetailList.get(0);
|
||||
}
|
||||
pickDetail.setDept(UserUtils.isDept);
|
||||
pickDetail.setStatus(BizStatus.OPEN);
|
||||
pickDetail.setPick(pick);
|
||||
pickDetail.setItem(gdDetail.getItem());
|
||||
if (gdDetail.getBigItem()==null){
|
||||
|
|
|
|||
|
|
@ -3,14 +3,20 @@ package com.youchain.modules.quartz.task;
|
|||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.youchain.businessdata.domain.AgvTask;
|
||||
import com.youchain.businessdata.domain.Pick;
|
||||
import com.youchain.businessdata.domain.PickDetail;
|
||||
import com.youchain.businessdata.domain.Task;
|
||||
import com.youchain.businessdata.repository.AgvTaskRepository;
|
||||
import com.youchain.businessdata.repository.PickDetailRepository;
|
||||
import com.youchain.businessdata.repository.PickRepository;
|
||||
import com.youchain.businessdata.repository.TaskRepository;
|
||||
import com.youchain.businessdata.service.AgvTaskService;
|
||||
import com.youchain.utils.BaseStatus;
|
||||
import com.youchain.utils.BizStatus;
|
||||
import com.youchain.utils.HttpPostUtil;
|
||||
import com.youchain.utils.UrlApi;
|
||||
import com.youchain.businessdata.service.PickDetailService;
|
||||
import com.youchain.exception.BadRequestException;
|
||||
import com.youchain.utils.*;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
|
@ -25,7 +31,14 @@ import java.util.concurrent.CopyOnWriteArrayList;
|
|||
@Slf4j
|
||||
@Service
|
||||
public class pickTask {
|
||||
|
||||
@Autowired
|
||||
public PickDetailRepository pickDetailRepository;
|
||||
@Autowired
|
||||
public PickDetailService pickDetailService;
|
||||
@Autowired
|
||||
public PickRepository pickRepository;
|
||||
@Autowired
|
||||
public TaskRepository taskRepository;
|
||||
@Autowired
|
||||
public AgvTaskRepository agvTaskRepository;
|
||||
|
||||
|
|
@ -36,6 +49,54 @@ public class pickTask {
|
|||
|
||||
private long lastTaskTime = System.currentTimeMillis();
|
||||
|
||||
/**
|
||||
* 定时检测出库单,分配库存
|
||||
*/
|
||||
public void allocate() {
|
||||
System.out.println("定时检测物料,分配库存");
|
||||
/* 查询待分配的出库明细*/
|
||||
List<PickDetail> pickDetailList=pickDetailRepository.findByAllocate();
|
||||
List<String> arr=new ArrayList<>();//没有库存的物料集合
|
||||
for (PickDetail pickDetail:pickDetailList){
|
||||
/* 没有库存 不用分配*/
|
||||
if (arr.contains(pickDetail.getItem().getCode())){
|
||||
continue;
|
||||
}
|
||||
/* 分配库存*/
|
||||
try {
|
||||
pickDetailService.allocate(pickDetail.getId(), pickDetail.getOrderQty()-pickDetail.getAllocatedQty(), null);
|
||||
}catch (BadRequestException b){
|
||||
if (b.getStatus().equals(501)){
|
||||
/* 库存不足*/
|
||||
String itemCode= StringUtils.substringAfterLast(b.getMessage(), ":");
|
||||
arr.add(itemCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
System.out.println("分配出库单,库存不足:"+arr);
|
||||
}
|
||||
/**
|
||||
* 定时检测出库单,生成《备料》搬运任务
|
||||
*/
|
||||
public void pickAgvTask() {
|
||||
/*查询分配完成的出库单*/
|
||||
List<Pick> pickList=pickRepository.findByStatus(BizStatus.ALLOCATE);
|
||||
for (Pick pick:pickList){
|
||||
List<Task> taskList=taskRepository.findByPick(pick.getId());
|
||||
for (Task task:taskList){
|
||||
/*申城搬运任务*/
|
||||
AgvTask agvTask = new AgvTask(BizStatus.PICK, task.getSrcStockCode(), task.getSrcPointCode(), task.getDstPointCode(), BizStatus.OPEN, "01");
|
||||
agvTaskRepository.save(agvTask);
|
||||
/*更新Task任务*/
|
||||
task.setTaskStatus(BizStatus.ATWORK);
|
||||
task.setAgvTask(agvTask);
|
||||
taskRepository.save(task);
|
||||
}
|
||||
/*更新出库单状态*/
|
||||
pick.setStatus(BizStatus.PICKUP);
|
||||
pickRepository.save(pick);
|
||||
}
|
||||
}
|
||||
public void pickTask() {
|
||||
//按线边分组 下发出库任务
|
||||
List<Object> objectList = agvTaskRepository.queryGroupAgvTask();
|
||||
|
|
|
|||
|
|
@ -33,8 +33,10 @@ public interface BizStatus {
|
|||
* 出入库状态-已关闭
|
||||
*/
|
||||
public static String CLOSE = "CLOSE";
|
||||
/** 分配中*/
|
||||
public static String ASSIGN = "ASSIGN";
|
||||
/**
|
||||
* 出库状态-分配;
|
||||
* 出库状态-分配完成;
|
||||
*/
|
||||
public static String ALLOCATE = "ALLOCATE";
|
||||
/**
|
||||
|
|
@ -86,7 +88,7 @@ public interface BizStatus {
|
|||
*/
|
||||
public static String ASN = "ASN";
|
||||
/**
|
||||
* 出库任务
|
||||
* 备料任务
|
||||
*/
|
||||
public static String PICK = "PICK";
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue