no message

main
暴炳林 2024-06-14 15:50:08 +08:00
parent bcef8c2859
commit acc0887fcf
11 changed files with 137 additions and 26 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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){

View File

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

View File

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