no message

main
HUOJIN\92525 2024-06-28 18:03:32 +08:00
parent 9efba159b6
commit 190271455e
13 changed files with 285 additions and 99 deletions

View File

@ -0,0 +1,14 @@
package com.youchain.appupdate.ReturnJson;
import lombok.Data;
@Data
public class ReturnTaskVo {
private Long taskId;//任务id
private String orderNumber;//箱号
private String itemCode;//物料编码
private String itemName;//物料名称
private String srcPointCode;//起始点
private String dstPointCode;//目标点
private Double planQty;//待拣货数量
}

View File

@ -8,6 +8,11 @@ import lombok.Data;
*/
@Data
public class FbPick {
@ApiModelProperty(value = "task任务id")
Long taskId;
@ApiModelProperty(value = "原托盘")
String srcStockCode;

View File

@ -2,8 +2,10 @@ package com.youchain.appupdate.rest;
import com.youchain.annotation.AnonymousAccess;
import com.youchain.annotation.Log;
import com.youchain.appupdate.ReturnJson.ReturnTaskVo;
import com.youchain.appupdate.inputJson.*;
import com.youchain.basicdata.service.StockService;
import com.youchain.businessdata.service.TaskService;
import com.youchain.exception.handler.ApiResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -28,6 +30,8 @@ public class BydAppController {
private final StockService stockService;
private final TaskService taskService;
@PostMapping("/scanMo")
@Log("扫描Mo票")
@ApiOperation("扫描Mo票")
@ -61,19 +65,34 @@ public class BydAppController {
}
@PostMapping("/scanStock")
@Log("扫描托盘")
@ApiOperation("扫描托盘")
@AnonymousAccess
public ResponseEntity<Object> scanStock(@RequestBody FbPick fbPick) {
try {
String srcStockCode = fbPick.getSrcStockCode();//原托盘
ReturnTaskVo taskVo = stockService.scanStock(srcStockCode);
return successResponse("扫描成功!", taskVo);
} catch (Exception e) {
return badRequest("扫描失败:" + e.getMessage());
}
}
@PostMapping("/fbPicking")
@Log("翻包拣货")
@ApiOperation("翻包拣货")
@AnonymousAccess
public ResponseEntity<Object> fbPicking(@RequestBody FbPick fbPick) {
try {
String srcStockCode = fbPick.getSrcStockCode();//原托盘
Long taskId = fbPick.getTaskId();//任务id
String orderNumber = fbPick.getOrderNumber();//箱号
String dstStockCode = fbPick.getDstStockCode();//目标托盘
stockService.fbPicking(taskId, orderNumber, dstStockCode);
return successResponse("拣货成功!");
} catch (Exception e) {
return badRequest(e.getMessage());
return badRequest("拣货失败:" + e.getMessage());
}
return successResponse("拣货成功!");
}

View File

@ -15,6 +15,7 @@
*/
package com.youchain.basicdata.service;
import com.youchain.appupdate.ReturnJson.ReturnTaskVo;
import com.youchain.basicdata.domain.Item;
import com.youchain.basicdata.domain.Point;
import com.youchain.basicdata.domain.Stock;
@ -166,6 +167,7 @@ public interface StockService {
/**
*
*
* @param itemCode
* @param pointCode
* @param scene
@ -174,11 +176,12 @@ public interface StockService {
/**
* Mo
*
* @param mo
* @param stockCode
* @return
*/
String scanMo(String stockCode,String mo);
String scanMo(String stockCode, String mo);
/**
*
@ -187,8 +190,24 @@ public interface StockService {
* @param boxNumbers
* @param pointCode
*/
void materialIn(String stockCode,Set boxNumbers,String pointCode);
void materialIn(String stockCode, Set boxNumbers, String pointCode);
Map<String,Stock> findByCodes(Set stockCodes);
Map<String, Stock> findByCodes(Set stockCodes);
/**
*
*
* @param stockCode
*/
ReturnTaskVo scanStock(String stockCode);
/**
*
*
* @param taskId
* @param orderNumber
* @param dstStockCode
*/
void fbPicking(Long taskId, String orderNumber, String dstStockCode);
}

View File

@ -18,6 +18,7 @@ package com.youchain.basicdata.service.impl;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.youchain.appupdate.ReturnJson.ReturnTaskVo;
import com.youchain.basicdata.domain.Item;
import com.youchain.basicdata.domain.Point;
import com.youchain.basicdata.domain.Stock;
@ -25,8 +26,11 @@ import com.youchain.basicdata.service.ItemService;
import com.youchain.basicdata.service.PointService;
import com.youchain.businessdata.domain.*;
import com.youchain.businessdata.repository.AsnDetailRepository;
import com.youchain.businessdata.repository.InventoryRepository;
import com.youchain.businessdata.repository.PickDetailRepository;
import com.youchain.businessdata.repository.TaskRepository;
import com.youchain.businessdata.service.*;
import com.youchain.businessdata.service.dto.TaskDto;
import com.youchain.utils.*;
import lombok.RequiredArgsConstructor;
import com.youchain.basicdata.repository.StockRepository;
@ -63,15 +67,20 @@ public class StockServiceImpl implements StockService {
private final StockRepository stockRepository;
private final AsnDetailRepository asnDetailRepository;
private final PickDetailRepository pickDetailRepository;
private final TaskRepository taskRepository;
private final InventoryRepository inventoryRepository;
private final AgvTaskService agvTaskService;
private final ItemService itemService;
private final InventoryService inventoryService;
private final InventoryLogService inventoryLogService;
private final AsnDetailService asnDetailService;
private final PickDetailService pickDetailService;
private final ItemKeyService itemKeyService;
private final PointService pointService;
private final TaskService taskService;
private final StockTypeToAreaMap stockTypeToAreaMap;
private final StockMapper stockMapper;
private final EntityManager entityMapper;
@ -106,6 +115,11 @@ public class StockServiceImpl implements StockService {
@Override
@Transactional(rollbackFor = Exception.class)
public StockDto create(Stock resources) {
if (resources.getPoint() != null) {
Point point = resources.getPoint();
point.setStatus(BaseStatus.USED);
pointService.update(point);
}
return stockMapper.toDto(stockRepository.save(resources));
}
@ -113,6 +127,16 @@ public class StockServiceImpl implements StockService {
@Transactional(rollbackFor = Exception.class)
public void update(Stock resources) {
Stock stock = stockRepository.findById(resources.getId()).orElseGet(Stock::new);
if (stock.getPoint() != null) {
Point point = stock.getPoint();
point.setStatus(BaseStatus.FREE);
pointService.update(point);
}
if (resources.getPoint() != null) {
Point point = resources.getPoint();
point.setStatus(BaseStatus.USED);
pointService.update(point);
}
ValidationUtil.isNull(stock.getId(), "Stock", "id", resources.getId());
stock.copy(resources);
stockRepository.save(stock);
@ -393,6 +417,159 @@ public class StockServiceImpl implements StockService {
return stockMap;
}
@Override
public ReturnTaskVo scanStock(String stockCode) {
Task task = taskRepository.findBySrcStockCode(stockCode);
if (task == null) {
throw new RuntimeException("未找到" + stockCode + "托盘的翻包拣货任务!");
}
ReturnTaskVo returnTaskVo = new ReturnTaskVo();
returnTaskVo.setTaskId(task.getId());
returnTaskVo.setOrderNumber(task.getItemKey().getOrderNumber());
returnTaskVo.setItemCode(task.getItem().getCode());
returnTaskVo.setItemName(task.getItem().getName());
returnTaskVo.setSrcPointCode(task.getSrcPointCode());
returnTaskVo.setDstPointCode(task.getDstPointCode());
returnTaskVo.setPlanQty(task.getPlanQty());
return returnTaskVo;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void fbPicking(Long taskId, String orderNumber, String dstStockCode) {
/**验证任务*/
Task task = validateTask(taskId, orderNumber);
/**验证目标容器*/
Stock dstStock = validatedstStock(dstStockCode);
/**待拣货数量*/
double moveQty = task.getPlanQty();
/**库存移位*/
moveInventory(task, dstStock, moveQty);
/**刷新拣货状态*/
refreshPickStatus(task, moveQty);
/**原托盘回库内*/
returnFBAgvTask(task.getDstPoint(), task.getSrcStock(), task.getItem());
}
/**
*
*
* @param taskId
* @param orderNumber
* @return
*/
private Task validateTask(Long taskId, String orderNumber) {
TaskDto taskDto = taskService.findById(taskId);
if (taskDto == null) {
throw new RuntimeException("未找到相应任务记录!");
}
Task task = taskService.toEntity(taskDto);//Dto转实体
if (!orderNumber.equals(task.getItemKey().getOrderNumber())) {
throw new RuntimeException("扫描的箱号与分配的箱号不一致!");
}
return task;
}
/**
*
*
* @param dstStockCode
* @return
*/
private Stock validatedstStock(String dstStockCode) {
if (StringUtils.isEmpty(dstStockCode)) {
throw new RuntimeException("请扫描目标托盘号!");
}
Stock dstStock = stockRepository.findByCode(dstStockCode, null);
if (dstStock == null) {
throw new RuntimeException(dstStockCode + "目标托盘不存在,请扫描正确的托盘号!");
}
if (BaseStatus.USED.equals(dstStock.getStatus())) {
throw new RuntimeException(dstStockCode + "目标托盘已使用,请更换新的托盘!");
}
if (dstStock.getPoint() == null) {
throw new RuntimeException(dstStockCode + "目标托盘没有关联点位!");
}
return dstStock;
}
private void moveInventory(Task task, Stock dstStock, double moveQty) {
//将占用数量移位,原库存回库内
Inventory inventory = task.getInventory();
inventory.setQueuedQty(inventory.getQueuedQty() - moveQty);
inventory.setQuantity(inventory.getQuantity() - moveQty);
inventoryRepository.save(inventory);
Inventory newInventory = new Inventory();
newInventory.setItemKey(inventory.getItemKey());
newInventory.setPoint(dstStock.getPoint());
newInventory.setPointCode(dstStock.getPoint().getCode());
newInventory.setStock(dstStock);
newInventory.setStockCode(dstStock.getCode());
newInventory.setQuantity(moveQty);
newInventory.setQueuedQty(0d);
newInventory.setDept(inventory.getDept());
inventoryRepository.save(newInventory);
task.setInventory(newInventory);
taskRepository.save(task);
if (inventory.getQuantity() <= 0) {
inventoryRepository.delete(inventory);
}
//库存日志
inventoryLogService.storeInventoryLog(BizStatus.MOVE, BizStatus.ADD, task.getPickDetail().getPo(), task.getItemKey(), task.getDstPoint(), dstStock.getPoint(), task.getSrcStock(), dstStock, 0d, moveQty, BizStatus.PICK, task.getId(), newInventory.getId(), "");
}
private void refreshPickStatus(Task task, double moveQty) {
task.setTaskStatus(BizStatus.FINISH);
task.setMoveQty(moveQty);
taskRepository.save(task);
PickDetail pickDetail = task.getPickDetail();
pickDetail.setPickedQty(moveQty);
pickDetailRepository.save(pickDetail);
//查询出库单的所有明细
Pick pick = pickDetail.getPick();
List<PickDetail> allocatePickDetailList = pickDetailRepository.findByAllPickDetail(pick.getId());
//判断是否全部拣货完成
boolean allPICK_ALL = allocatePickDetailList.stream().allMatch(detail -> detail.getOrderQty().equals(detail.getPickedQty()));
//判断是否有部分拣货完成
boolean anyPICKUP = allocatePickDetailList.stream().anyMatch(detail -> detail.getOrderQty().equals(detail.getPickedQty()));
// 当前状态
String status = pick.getStatus();
//更新状态且点位占用
if (allPICK_ALL) {
status = BizStatus.PICK_ALL;
} else if (anyPICKUP) {
status = BizStatus.PICKUP;
}
pick.setStatus(status);
}
private void returnFBAgvTask(Point srcPoint, Stock stock, Item item) {
String areaCode = stockTypeToAreaMap.getValueByKey(stock.getStockType());
Double itemHeight = null;
if (AreaNameDic.XJQ.equals(areaCode)) {
itemHeight = item.getExtendD2();//整托高度
}
Point endPoint = pointService.findByCode(null, BaseStatus.FREE, BaseStatus.STORAGE, areaCode, null, itemHeight);
if (endPoint == null) {
throw new RuntimeException(areaCode + "没有空闲点位!");
}
AgvTask agvTask = new AgvTask(BizStatus.FB_RETURN, stock.getCode(), srcPoint.getCode(), endPoint.getCode(), BizStatus.OPEN, "");
agvTaskService.create(agvTask);
agvTaskService.sendAgvTaskImpl(agvTask);
}
private Item validateItem(String itemCode) {
Item item = itemService.existItem(itemCode);
if (item == null) {

View File

@ -146,10 +146,12 @@ public class Task extends BaseEntity implements Serializable {
@Column(name = "`put_code`")
@ApiModelProperty(value = "上架号")
private String putCode;
@OneToOne
@JoinColumn(name = "inv_id")
@ApiModelProperty(value = "库存ID")
private Inventory inventory;
@OneToOne
@JoinColumn(name = "dept_id")
@ApiModelProperty(value = "仓库ID")

View File

@ -51,4 +51,8 @@ public interface TaskRepository extends JpaRepository<Task, Long>, JpaSpecificat
@Query(value = " select count(t.id) FROM Task t WHERE t.taskType='PICK' and t.taskStatus not in ('FINISH') and t.srcPoint.id=?1 ")
int existsByTask(Long srcPointId);
@Query(value = " from Task t WHERE t.taskType='PICK' and t.taskStatus='ARRIVED' and t.srcStock.code=:srcStockCode ")
Task findBySrcStockCode(String srcStockCode);
}

View File

@ -84,19 +84,7 @@ public class TaskController {
public ResponseEntity<Object> queryPickTask(TaskQueryCriteria criteria){
return new ResponseEntity<>(taskService.queryAll(criteria),HttpStatus.OK);
}
@PostMapping("/jhQr")
@Log("拣货确认")
@ApiOperation("拣货确认")
@AnonymousAccess
public ResponseEntity<Object> jhQr(@RequestBody Long[] ids){
System.out.println("task:"+ids);
for (Long id:ids){
taskService.invYw(id);
/* 更新Task状态*/
}
ApiResult apiResult=ApiResult.fail(200,"操作成功",null);
return new ResponseEntity<>(apiResult, HttpStatus.valueOf(apiResult.getStatus()));
}
@PostMapping
@Log("新增task")
@ApiOperation("新增task")

View File

@ -121,6 +121,7 @@ public interface TaskService {
/**
*
*
* @param taskId
* @throws Exception
*/
@ -128,16 +129,11 @@ public interface TaskService {
/**
* 退
*
* @param taskId
* @throws Exception
*/
void pickBarBack(long taskId, double pickedQuantity) throws Exception;
/**
*
* @param taskId
* @throws Exception
*/
void invYw(Long taskId);
/**
*

View File

@ -19,6 +19,7 @@ import com.youchain.basicdata.service.dto.ItemSmallDto;
import com.youchain.basicdata.service.dto.PointDto;
import com.youchain.basicdata.service.dto.StockDto;
import com.youchain.basicdata.service.dto.StockSmallDto;
import com.youchain.businessdata.domain.Inventory;
import com.youchain.modules.system.service.dto.DeptDto;
import com.youchain.modules.system.service.dto.DeptSmallDto;
import lombok.Data;
@ -106,8 +107,8 @@ public class TaskDto implements Serializable {
/** 上架号 */
private String putCode;
/** 库存ID */
private Long invId;
/** 库存 */
private Inventory inventory;
/** 仓库ID */
private DeptDto dept;

View File

@ -450,7 +450,7 @@ public class AgvTaskServiceImpl implements AgvTaskService {
switch (endAreaName) {
case AreaNameDic.XJQ:
case AreaNameDic.DJQ:
handleXJDJ(taskList, stock);//入库
handleXJDJ(agvTask, taskList, stock);//入库
break;
case AreaNameDic.FBQ:
handleFBQ(taskList, stock, endPoint);//备料完成
@ -547,23 +547,26 @@ public class AgvTaskServiceImpl implements AgvTaskService {
* @param taskList
* @param stock
*/
private void handleXJDJ(List<Task> taskList, Stock stock) {
//容器回存储区,新增库存、更新点位状态
for (Task task : taskList) {
AsnDetail ad = task.getAsnDetail();
ad.setReceivedQty(ad.getOrderQty());
ad.setStatus(BizStatus.RECEIVED);
ad.setStock(stock);
asnDetailService.update(ad);
private void handleXJDJ(AgvTask agvTask, List<Task> taskList, Stock stock) {
if (BizStatus.ASN.equals(agvTask.getType())) {
//容器回存储区,新增库存、更新点位状态
for (Task task : taskList) {
AsnDetail ad = task.getAsnDetail();
ad.setReceivedQty(ad.getOrderQty());
ad.setStatus(BizStatus.RECEIVED);
ad.setStock(stock);
asnDetailService.update(ad);
task.setTaskStatus(BizStatus.FINISH);
task.setMoveQty(task.getPlanQty());
task.setSrcStock(stock);
task.setDstStock(stock);
taskService.update(task);
task.setTaskStatus(BizStatus.FINISH);
task.setMoveQty(task.getPlanQty());
task.setSrcStock(stock);
task.setDstStock(stock);
taskService.update(task);
updateInventory(stock, task, ad);
updateInventory(stock, task, ad);
}
}
}
/**
@ -573,6 +576,8 @@ public class AgvTaskServiceImpl implements AgvTaskService {
*/
private void handleFBQ(List<Task> taskList, Stock stock, Point endPoint) {
//将托盘的物料移动到备料库位
stock.setPoint(endPoint);
stockRepository.save(stock);
List<Inventory> inventoryList = inventoryService.queryInventory(stock);
for (Inventory inventory : inventoryList) {
inventory.setPoint(endPoint);
@ -580,7 +585,7 @@ public class AgvTaskServiceImpl implements AgvTaskService {
}
/* 更新Task任务状态*/
for (Task task : taskList) {
task.setTaskStatus(BizStatus.FINISH);
task.setTaskStatus(BizStatus.ARRIVED);
taskRepository.save(task);
}
}

View File

@ -15,22 +15,19 @@
*/
package com.youchain.businessdata.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.youchain.basicdata.domain.Item;
import com.youchain.basicdata.domain.Point;
import com.youchain.basicdata.domain.Stock;
import com.youchain.basicdata.repository.StockRepository;
import com.youchain.basicdata.service.dto.StockSmallDto;
import com.youchain.basicdata.service.PointService;
import com.youchain.businessdata.ReturnJson.RPTaskList;
import com.youchain.businessdata.domain.*;
import com.youchain.businessdata.inputJson.IPTask;
import com.youchain.businessdata.repository.*;
import com.youchain.businessdata.service.AgvTaskService;
import com.youchain.businessdata.service.InventoryLogService;
import com.youchain.businessdata.service.InventoryService;
import com.youchain.businessdata.service.dto.InventoryDto;
import com.youchain.exception.BadRequestException;
import com.youchain.modules.system.domain.Dept;
import com.youchain.utils.*;
import lombok.RequiredArgsConstructor;
@ -41,7 +38,6 @@ import com.youchain.businessdata.service.mapstruct.TaskMapper;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.SQLQuery;
import org.hibernate.transform.AliasToEntityMapResultTransformer;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.data.domain.Page;
@ -67,12 +63,12 @@ public class TaskServiceImpl implements TaskService {
private final TaskRepository taskRepository;
private final TaskMapper taskMapper;
private final InventoryRepository inventoryRepository;
private final InventoryService inventoryService;
private final PickDetailRepository pickDetailRepository;
private final PickRepository pickRepository;
private final InventoryLogService inventoryLogService;
private final PointService pointService;
private final EntityManager entityMapper;
private final StockRepository stockRepository;
private final StockTypeToAreaMap stockTypeToAreaMap;
@Override
public Map<String, Object> queryAll(TaskQueryCriteria criteria, Pageable pageable) {
@ -256,51 +252,6 @@ public class TaskServiceImpl implements TaskService {
}
}
@Override
public void invYw(Long taskId) {
Task task=taskRepository.getById(taskId);
ItemKey ik=task.getItemKey();
Point endPoint = task.getDstPoint();//目标点位
Double qty=task.getPlanQty();//拣货数量
Stock stock = null;
List<Stock> stockList=stockRepository.findByPointAndFb(endPoint.getId());//查询翻包容器
if (stockList.size()<0){
throw new BadRequestException(HttpStatus.INTERNAL_SERVER_ERROR, "目标位置没有翻包容器");
}else {
stock=stockList.get(0);
}
// 扣除库存
Inventory inventory=task.getInventory();
inventory.setQueuedQty(inventory.getQueuedQty()-qty);
inventory.setQuantity(inventory.getQuantity()-qty);
inventoryRepository.save(inventory);
// 添加库存
Inventory inv = inventoryService.getInventory(ik, endPoint, stock, UserUtils.isDept, BizStatus.RECEIVING_UP);
inv.setQuantity(qty);
inventoryRepository.save(inv);
// 添加库存日志
inventoryLogService.storeInventoryLog(BizStatus.MOVE, BizStatus.ADD, task.getPickDetail().getPick().getCode(), task.getItemKey(), task.getDstPoint(), task.getSrcPoint(), task.getSrcStock(), stock, 0d, qty, BizStatus.PICK, task.getId(), inv.getId(), "");
/* 更新Task状态*/
task.setMoveQty(qty);
task.setTaskStatus(BizStatus.FINISH);
taskRepository.save(task);
/* 更新出库明细*/
PickDetail pickDetail=task.getPickDetail();
pickDetail.setPickedQty(pickDetail.getPickedQty()+qty);
if (pickDetail.getPickedQty()>=pickDetail.getAllocatedQty()){
pickDetail.setStatus(BizStatus.PICK_ALL);
}
pickDetailRepository.save(pickDetail);
/* 更新出库单*/
Pick pick=pickDetail.getPick();
List<PickDetail> pickDetailList=pickDetailRepository.findByPickNo(pick.getId());
if (pickDetailList.size()==0){
pick.setStatus(BizStatus.PICK_ALL);
pickRepository.save(pick);
}
}
@Transactional(readOnly = true)
public List<RPTaskList> queryTaskApp(IPTask t) {
String sql = "SELECT t.pick_detail_id pickDetailId, it.code itemCode,it.`name` itemName,t.plan_qty qty,ik.prop_c1 pch,t.src_point_code srcPointCode,t.src_stock_code stockCode,t.dst_point_code dstPointCode\n" +

View File

@ -66,15 +66,20 @@ public interface BizStatus {
*/
public static String ATWORK = "ATWORK";
/**
* -
*/
public static String ARRIVED = "ARRIVED";
/**
* -
*/
public static String UP_CONTAINER = "UP_CONTAINER";
/**
* -
* -
*/
public static String RETURN = "RETURN";
public static String FB_RETURN = "FB_RETURN";