出库-替换分配库存

main
bbl\baobl 2024-03-27 18:33:10 +08:00
parent 086f825430
commit ee5596c7c3
18 changed files with 253 additions and 90 deletions

View File

@ -383,9 +383,9 @@ public class PointServiceImpl implements PointService {
if (point==null){
point=new Point();
point.setDept(UserUtils.getDept());
c=c+1;
}else {
b=b+1;
}else {
c=c+1;
}
if (code!=null) point.setCode(code);
if (name!=null) point.setName(name);

View File

@ -23,6 +23,9 @@ import lombok.Data;
import cn.hutool.core.bean.BeanUtil;
import io.swagger.annotations.ApiModelProperty;
import cn.hutool.core.bean.copier.CopyOptions;
import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction;
import javax.persistence.*;
import javax.validation.constraints.*;
import java.sql.Timestamp;
@ -62,6 +65,7 @@ public class InventoryLog extends BaseEntity implements Serializable {
@OneToOne
@JoinColumn(name = "`item_key_id`")
@ApiModelProperty(value = "点位")
@NotFound(action= NotFoundAction.IGNORE)
private ItemKey itemKey;
@Column(name = "`storage_date`")
@ -108,6 +112,7 @@ public class InventoryLog extends BaseEntity implements Serializable {
@OneToOne
@JoinColumn(name = "`src_point_id`")
@ApiModelProperty(value = "源点位")
@NotFound(action= NotFoundAction.IGNORE)
private Point srcPoint;
@Column(name = "`src_point_code`")
@ -117,6 +122,7 @@ public class InventoryLog extends BaseEntity implements Serializable {
@OneToOne
@JoinColumn(name = "`src_stock_id`")
@ApiModelProperty(value = "源容器")
@NotFound(action= NotFoundAction.IGNORE)
private Stock srcStock;
@Column(name = "`src_stock_code`")
@ -126,6 +132,7 @@ public class InventoryLog extends BaseEntity implements Serializable {
@OneToOne
@JoinColumn(name = "`dst_point_id`")
@ApiModelProperty(value = "点位")
@NotFound(action= NotFoundAction.IGNORE)
private Point dstPoint;
@Column(name = "`dst_point_code`")
@ -135,6 +142,7 @@ public class InventoryLog extends BaseEntity implements Serializable {
@OneToOne
@JoinColumn(name = "`dst_stock_id`")
@ApiModelProperty(value = "目标容器")
@NotFound(action= NotFoundAction.IGNORE)
private Stock dstStock;
@Column(name = "`dst_stock_code`")
@ -149,6 +157,37 @@ public class InventoryLog extends BaseEntity implements Serializable {
@ApiModelProperty(value = "目标数量")
private Double dstQty=0d;
@Column(name = "`item_code`")
@ApiModelProperty(value = "物料代码")
private String itemCode;
@Column(name = "`item_name`")
@ApiModelProperty(value = "物理名称")
private String itemName;
@Column(name = "`prop_c1`")
@ApiModelProperty(value = "批次号")
private String propC1;
@Column(name = "`prop_c2`")
@ApiModelProperty(value = "字符")
private String propC2;
@Column(name = "`prop_c3`")
@ApiModelProperty(value = "系统单号")
private String propC3;
@Column(name = "`prop_c4`")
@ApiModelProperty(value = "厂家供货码")
private String propC4;
@Column(name = "`prop_c5`")
@ApiModelProperty(value = "供货数量")
private String propC5;
@Column(name = "`prop_c6`")
@ApiModelProperty(value = "流水号")
private String propC6;
public void copy(InventoryLog source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}

View File

@ -93,6 +93,10 @@ public class ItemKey extends BaseEntity implements Serializable {
@ApiModelProperty(value = "工单号")
private String orderNumber;
@Column(name = "`enabled`")
@ApiModelProperty(value = "是否启用")
private Boolean enabled=true;
public int getIntPropC5() {
int decimalNumber = Integer.parseInt(propC5, 16);
return decimalNumber;

View File

@ -58,4 +58,10 @@ public interface PickDetailRepository extends JpaRepository<PickDetail, Long>, J
List<PickDetail> findByPick(Long id);
@Query(value = "select pd from PickDetail pd where pd.pick.id=?1 and pd.allocatedQty>0", nativeQuery = false)
List<PickDetail> findByPickAllocated(Long id);
/** 查询 出库单未完成的明细*/
@Query(value = "select pd from PickDetail pd where pd.pick.id=?1 and pd.allocatedQty>pd.pickedQty")
List<PickDetail> findByQtyAllGtPick(Long id);
/** 查询拣货和分配中的 全部出库明细*/
@Query(value = "select pd from PickDetail pd where pd.status in ('PICKUP','ALLOCATE')")
List<PickDetail> getPickDetail();
}

View File

@ -31,4 +31,6 @@ import java.util.List;
public interface PickRepository extends JpaRepository<Pick, Long>, JpaSpecificationExecutor<Pick> {
@Query(value = "select p from Pick p where p.relatedBill2=?1")
Pick findByCode(String relatedBill2);
@Query(value = "select p from Pick p")
List<Pick> getPickList();
}

View File

@ -101,4 +101,6 @@ public interface TaskRepository extends JpaRepository<Task, Long>, JpaSpecificat
List<Map<String,Object>> findBySumPlanQty(String taskStatus,int beSkip,String goodType);
@Query(value = "select t from Task t where t.taskStatus =?1 and t.beSkip=?2 and t.taskType=?3")
List<Task> findByItemType(String taskStatus, int beSkip, String goodType);
Task findByPickDetailAndItem(Long id, String sku);
}

View File

@ -89,8 +89,7 @@ public class AsnController {
return new ResponseEntity<>(HttpStatus.OK);
}
@PostMapping("/getAsnList")
@Log("加载出库单下拉框")
@ApiOperation("加载出库单下拉框")
@Log("加载入库单下拉框")
@PreAuthorize("@el.check('asn:del')")
public ResponseEntity<Object> getAsnList() {
return new ResponseEntity<>(asnService.getAsnList(),HttpStatus.OK);

View File

@ -18,6 +18,7 @@ package com.youchain.businessdata.rest;
import com.youchain.annotation.AnonymousAccess;
import com.youchain.annotation.Log;
import com.youchain.businessdata.domain.Pick;
import com.youchain.businessdata.repository.PickRepository;
import com.youchain.businessdata.service.PickService;
import com.youchain.businessdata.service.dto.PickQueryCriteria;
import com.youchain.exception.handler.ApiResult;
@ -44,6 +45,7 @@ import javax.servlet.http.HttpServletResponse;
public class PickController {
private final PickService pickService;
private final PickRepository pickRepository;
@Log("导出数据")
@ApiOperation("导出数据")
@ -100,4 +102,10 @@ public class PickController {
ApiResult apiResult = pickService.allocate(ids);
return new ResponseEntity<>(apiResult, HttpStatus.valueOf(apiResult.getStatus()));
}
@PostMapping("/getPickList")
@Log("加载出库单下拉框")
@PreAuthorize("@el.check('asn:del')")
public ResponseEntity<Object> getPickList() {
return new ResponseEntity<>(pickRepository.getPickList(),HttpStatus.OK);
}
}

View File

@ -29,6 +29,7 @@ import com.youchain.businessdata.domain.PickDetail;
import com.youchain.businessdata.domain.Task;
import com.youchain.businessdata.inputJson.IPPickDetail;
import com.youchain.businessdata.inputJson.IScanPut;
import com.youchain.businessdata.repository.PickDetailRepository;
import com.youchain.businessdata.service.InventoryLogService;
import com.youchain.businessdata.service.PickDetailService;
import com.youchain.businessdata.service.TaskService;
@ -74,6 +75,7 @@ import static org.springframework.http.HttpStatus.BAD_REQUEST;
public class PickDetailController {
private final PickDetailService pickDetailService;
private final PickDetailRepository pickDetailRepository;
private final TaskService taskService;
@ -132,7 +134,7 @@ public class PickDetailController {
}
@PostMapping("/cancelAllocate")
@Log("取消分配")
@Log("出库明细-取消分配")
@AnonymousAccess
public synchronized ResponseEntity<Object> cancelAllocate(@RequestBody Long[] ids) throws Exception {
ApiResult apiResult = pickDetailService.cancelAllocate(ids);
@ -148,6 +150,12 @@ public class PickDetailController {
List<RPTaskList> t=taskService.queryTaskApp(null);
return new ResponseEntity<>(t,HttpStatus.OK);
}
@PostMapping("/getPickDetail")
@Log("人工出库-加载出库明细")
@AnonymousAccess
public ResponseEntity<Object> getPickDetail(){
return new ResponseEntity<>(pickDetailRepository.getPickDetail(),HttpStatus.OK);
}
@PostMapping("/pickingApp")
@Log("APP拣货确认")
@ -159,7 +167,7 @@ public class PickDetailController {
}
@PostMapping("/picking")
@Log("拣货")
@Log("出库-单品拣货")
@AnonymousAccess
public ResponseEntity<Object> picking(@RequestBody Long[] ids){
// pick_in(pickDetailId);

View File

@ -18,13 +18,23 @@ package com.youchain.businessdata.rest;
import com.alibaba.fastjson.JSONObject;
import com.youchain.annotation.AnonymousAccess;
import com.youchain.annotation.Log;
import com.youchain.basicdata.service.dto.PointDto;
import com.youchain.basicdata.domain.Point;
import com.youchain.basicdata.repository.PointRepository;
import com.youchain.basicdata.service.dto.PointQueryCriteria;
import com.youchain.businessdata.domain.Inventory;
import com.youchain.businessdata.domain.PickDetail;
import com.youchain.businessdata.domain.Task;
import com.youchain.businessdata.repository.InventoryRepository;
import com.youchain.businessdata.repository.PickDetailRepository;
import com.youchain.businessdata.repository.TaskRepository;
import com.youchain.businessdata.service.InventoryService;
import com.youchain.businessdata.service.PickDetailService;
import com.youchain.businessdata.service.TaskService;
import com.youchain.businessdata.service.dto.TaskQueryCriteria;
import com.youchain.exception.handler.ApiResult;
import com.youchain.utils.BaseStatus;
import com.youchain.utils.BizStatus;
import com.youchain.utils.UserUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.catalina.util.StandardSessionIdGenerator;
import org.springframework.data.domain.Pageable;
@ -32,10 +42,12 @@ import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
@ -52,6 +64,12 @@ import javax.servlet.http.HttpServletResponse;
public class TaskController {
private final TaskService taskService;
private final TaskRepository taskRepository;
private final InventoryService inventoryService;
private final PickDetailRepository pickDetailRepository;
private final PickDetailService pickDetailService;
private final InventoryRepository inventoryRepository;
private final PointRepository pointRepository;
@Log("导出数据")
@ApiOperation("导出数据")
@ -77,7 +95,7 @@ public class TaskController {
return new ResponseEntity<>(ApiResult.success(apiResult.getMessage(),apiResult.getData()), HttpStatus.valueOf(apiResult.getStatus()));
}
@PostMapping("/devanRfid")
@ApiOperation("人工出库-解析RFID关联的库存信息")
@ApiOperation("人工出库,人工入库-解析RFID关联的库存信息")
@AnonymousAccess
public ResponseEntity<Object> devanRfid(@RequestBody String data){
JSONObject jsonObject=JSONObject.parseObject(data);
@ -91,7 +109,48 @@ public class TaskController {
}
return new ResponseEntity<>(apiResult, HttpStatus.valueOf(apiResult.getStatus()));
}
@PostMapping("/picking")
@Log("人工出库-拣货确认")
@AnonymousAccess
public ResponseEntity<Object> picking(@RequestBody String data){
JSONObject jsonObject=JSONObject.parseObject(data);
// String rfid=jsonObject.getString("RFID");
Long taskId=jsonObject.getLong("taskId");
ApiResult apiResult;
/** 通过RFID获取Task后出库*/
apiResult = taskService.picking(new Long[]{taskId});
return new ResponseEntity<>(apiResult, HttpStatus.valueOf(apiResult.getStatus()));
}
/** 人工出库-解析RFID关联的(未分配)库存信息*/
@PostMapping("/replaceInv")
@Log("出库-替换分配库存")
@AnonymousAccess
@Transactional
public ApiResult replaceInv(@RequestBody String data) {
System.out.println("接收:"+data);
JSONObject jsonObject=JSONObject.parseObject(data);
Long invId=jsonObject.getLong("invId");
Long taskId=jsonObject.getLong("taskId");
Task task=taskRepository.getById(taskId);
PickDetail pickDetail=task.getPickDetail();
Inventory inventory=inventoryRepository.getById(invId);//实际出库 库存
ApiResult apiResult;
/** 取消分配库存 */
apiResult = pickDetailService.cancelAllocate(pickDetail.getId(),inventory.getQuantity());
if (apiResult.getStatus()!=200){
return apiResult;
}
/** 重新分配 */
Point point=pointRepository.findByCode(pickDetail.getPropC5());
List<Inventory> inventoryList= Arrays.asList(inventory);
apiResult = pickDetailService.allocate(pickDetail, UserUtils.getDept(), inventory.getQuantity(),0,point,inventoryList);
if (apiResult!=null){
return apiResult;
}
return ApiResult.fail(200,"操作成功",null);
}
@GetMapping(value = "/queryAsnTask")
@Log("查询task")

View File

@ -18,10 +18,12 @@ package com.youchain.businessdata.service;
import com.alibaba.fastjson.JSONObject;
import com.youchain.basicdata.domain.Item;
import com.youchain.basicdata.domain.Point;
import com.youchain.businessdata.domain.Inventory;
import com.youchain.businessdata.domain.PickDetail;
import com.youchain.businessdata.service.dto.PickDetailDto;
import com.youchain.businessdata.service.dto.PickDetailQueryCriteria;
import com.youchain.exception.handler.ApiResult;
import com.youchain.modules.system.domain.Dept;
import org.springframework.data.domain.Pageable;
import java.util.Map;
import java.util.List;
@ -86,9 +88,10 @@ public interface PickDetailService {
void download(List<PickDetailDto> all, HttpServletResponse response) throws IOException;
/**
*
* -
*/
ApiResult allocate(Long[] ids);
ApiResult allocate(PickDetail pickDetail, Dept dept, Double quantity, Integer agvFlag, Point endPoint, List<Inventory> inventoryList);
/**
*
@ -102,8 +105,9 @@ public interface PickDetailService {
/**
*
* quantity
*/
ApiResult cancelAllocate(long id,double quantity) ;
ApiResult cancelAllocate(long pdId,double cancelQuantity) ;
ApiResult cancelAllocate(Long[] ids);
/**

View File

@ -151,5 +151,6 @@ public interface TaskService {
ApiResult devanRfidAsn(String rfid);
/** 人工出库-解析RFID关联的库存信息*/
ApiResult devanRfidPT(String rfid);
}

View File

@ -15,20 +15,11 @@
*/
package com.youchain.businessdata.service.dto;
import com.youchain.base.BaseEntity;
import com.youchain.basicdata.domain.Item;
import com.youchain.businessdata.domain.ItemKey;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
import com.youchain.annotation.Query;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.validation.constraints.NotBlank;
/**
* @website https://eladmin.vip
* @author huojin
@ -39,7 +30,10 @@ public class InventoryQueryCriteria{
/*@Query(joinName = "itemKey>item>", propName="code" ,type = Query.Type.INNER_LIKE)
private String itemCode;*/
@Query(joinName = "itemKey>item", propName="id",type = Query.Type.EQUAL)
private String itemId;
@Query(type = Query.Type.EQUAL)
private Double queuedQty;
@Query(joinName = "itemKey>item>", propName="name",type = Query.Type.INNER_LIKE)
private String itemName;

View File

@ -171,6 +171,16 @@ public class InventoryLogServiceImpl implements InventoryLogService {
}else if(incDec== BizStatus.REDUCE){
log.setDstQty(srcQty-occurQty);
}
if (itemKey!=null){
log.setItemCode(itemKey.getItem().getCode());
log.setItemName(itemKey.getItem().getName());
log.setPropC1(itemKey.getPropC1());
log.setPropC2(itemKey.getPropC2());
log.setPropC3(itemKey.getPropC3());
log.setPropC4(itemKey.getPropC4());
log.setPropC5(itemKey.getPropC5());
log.setPropC6(itemKey.getPropC6());
}
log.setOccurTime(new Timestamp(System.currentTimeMillis()));
log.setRefObj(refObj);
log.setRefObjId(refObjId);

View File

@ -19,15 +19,12 @@ import com.youchain.basicdata.domain.Point;
import com.youchain.basicdata.domain.Stock;
import com.youchain.basicdata.repository.PointRepository;
import com.youchain.businessdata.domain.*;
import com.youchain.businessdata.repository.ItemKeyRepository;
import com.youchain.businessdata.repository.PickDetailRepository;
import com.youchain.businessdata.repository.TaskRepository;
import com.youchain.businessdata.repository.*;
import com.youchain.businessdata.service.InventoryLogService;
import com.youchain.businessdata.service.dto.*;
import com.youchain.modules.system.domain.Dept;
import com.youchain.utils.*;
import lombok.RequiredArgsConstructor;
import com.youchain.businessdata.repository.InventoryRepository;
import com.youchain.businessdata.service.InventoryService;
import com.youchain.businessdata.service.mapstruct.InventoryMapper;
import org.springframework.stereotype.Service;
@ -60,6 +57,7 @@ public class InventoryServiceImpl implements InventoryService {
private final PickDetailRepository pickDetailRepository;
private final EntityManager entityManager;
private final ItemKeyRepository itemKeyRepository;
private final PickRepository pickRepository;
private final TaskRepository taskRepository;
private final PointRepository pointRepository;
@ -266,10 +264,21 @@ public class InventoryServiceImpl implements InventoryService {
pickDetail.setStatus(BizStatus.PICK_ALL);
}
pickDetailRepository.save(pickDetail);
/** 更新出库单状态 -*/
List<PickDetail> pickDetailList=pickDetailRepository.findByQtyAllGtPick(pickDetail.getPick().getId());
if (pickDetailList.size()==0){
Pick pick=pickDetail.getPick();
pick.setStatus(BizStatus.PICK_ALL);
pickRepository.save(pick);
}
/** 添加库存日志,删除库存*/
Inventory inventory=task.getInventory();
inventoryLogService.storeInventoryLog(BizStatus.PICK_DOWN,BizStatus.REDUCE,inventory.getItemKey().getPropC3(),inventory.getItemKey(),task.getSrcPoint(),task.getDstPoint(),null,null,inventory.getQuantity(),task.getMoveQty(), task.getItemKey().getPropC6(),null,inventory.getId(),"");
inventoryRepository.delete(inventory);
// 失效ItemKey
ItemKey itemKey=inventory.getItemKey();
itemKey.setEnabled(false);
itemKeyRepository.save(itemKey);
}
}

View File

@ -156,6 +156,7 @@ public class ItemKeyServiceImpl implements ItemKeyService {
}
@Override
@Transactional(rollbackFor = Exception.class)
public ItemKey getItemKey(Item item, String propC1, String propC2, String propC3, String propC4, String propC5, String propC6,String propC7) {
ItemKey itemKey;
itemKey = itemKeyRepository.getByItemKey(item.getId(),propC1,propC2,propC3,propC4,propC5,propC6);

View File

@ -178,56 +178,10 @@ public class PickDetailServiceImpl implements PickDetailService {
if (pickDetail.getOrderQty() > pickDetail.getAllocatedQty()) {
List<Inventory> inventoryList = inventoryRepository.queryInventory(item.getId());
if (inventoryList.size() > 0) {
double allocateQty = 0;//分配数量
double unQty = quantity;//订单数量
for (Inventory inv : inventoryList) {
Point startPoint = inv.getPoint();//原库位
if (unQty == 0) {
break;
}
//整托分配
allocateQty = inv.getQuantity();
if (unQty < allocateQty) {
return ApiResult.fail(201, "单号:"+pickDetail.getPick().getRelatedBill1()
+"行:"+pickDetail.getLineNo()+",剩余订单数量不足一托"+"订单数量"+quantity+",剩余未分配数量"
+unQty+",库存单托数量"+inv.getQuantity(),null);
}
//更新库存
inv.setQueuedQty(allocateQty);
inventoryRepository.save(inv);
unQty = unQty-allocateQty;
//占用点位
startPoint.setStatus(BaseStatus.USED);
pointRepository.save(startPoint);
//更新出库单
pickDetail.setAllocatedQty(pickDetail.getAllocatedQty() + allocateQty);
pickDetail.setStatus(BizStatus.ALLOCATE);
pickDetailRepository.save(pickDetail);
//生成Task任务
Task task = new Task();
task.setItem(inv.getItemKey().getItem());
task.setItemKey(inv.getItemKey());
task.setPickDetail(pickDetail);
task.setBillCode(pickDetail.getPick().getRelatedBill1());
task.setSrcPoint(startPoint);
task.setDstPoint(endPoint);
task.setTaskType(BizStatus.PICK);
task.setTaskStatus(BizStatus.ALLOCATE);
task.setBeSkip(agvFlag);//是否AGV出库
task.setPlanQty(allocateQty);
task.setDept(dept);
task.setInventory(inv);
taskRepository.save(task);
if (agvFlag==1) {
/** 是否AGV任务*/
//生成AGV任务
AgvTask agvTask = agvTaskService.addAgvTask(BizStatus.AGV, startPoint.getStorageType(), startPoint.getCode(), endPoint.getCode(), BizStatus.OPEN, BizStatus.PICK);
//更新Task任务 写入关联AGV
task.setAgvTask(agvTask);
taskRepository.save(task);
}
}
}else {
ApiResult apiResult = allocate(pickDetail, dept, quantity, agvFlag, endPoint, inventoryList);
if (apiResult != null) return apiResult;
}
else {
return ApiResult.fail(500, item.getCode() + "料号,无库存", "");
}
}else {
@ -236,6 +190,59 @@ public class PickDetailServiceImpl implements PickDetailService {
return null;
}
public ApiResult allocate(PickDetail pickDetail, Dept dept, Double quantity, Integer agvFlag, Point endPoint, List<Inventory> inventoryList) {
double allocateQty;//待分配数量
double unQty = quantity;//订单总量
for (Inventory inv : inventoryList) {
Point startPoint = inv.getPoint();//原库位
if (unQty <= 0) {
break;
}
//整托分配
allocateQty = inv.getQuantity();
if (unQty < allocateQty) {
return ApiResult.fail(201, "单号:" + pickDetail.getPick().getRelatedBill1()
+ "行:" + pickDetail.getLineNo() + ",剩余订单数量不足一托" + "订单数量" + quantity + ",剩余未分配数量"
+ unQty + ",库存单托数量" + inv.getQuantity(), null);
}
//更新库存
inv.setQueuedQty(allocateQty);
inventoryRepository.save(inv);
unQty = unQty-allocateQty;
//占用点位
startPoint.setStatus(BaseStatus.USED);
pointRepository.save(startPoint);
//更新出库单
pickDetail.setAllocatedQty(pickDetail.getAllocatedQty() + allocateQty);
pickDetail.setStatus(BizStatus.ALLOCATE);
pickDetailRepository.save(pickDetail);
//生成Task任务
Task task = new Task();
task.setItem(inv.getItemKey().getItem());
task.setItemKey(inv.getItemKey());
task.setPickDetail(pickDetail);
task.setBillCode(pickDetail.getPick().getRelatedBill1());
task.setSrcPoint(startPoint);
task.setDstPoint(endPoint);
task.setTaskType(BizStatus.PICK);
task.setTaskStatus(BizStatus.ALLOCATE);
task.setBeSkip(agvFlag);//是否AGV出库
task.setPlanQty(allocateQty);
task.setDept(dept);
task.setInventory(inv);
taskRepository.save(task);
if (agvFlag ==1) {
/** 是否AGV任务*/
//生成AGV任务
AgvTask agvTask = agvTaskService.addAgvTask(BizStatus.AGV, startPoint.getStorageType(), startPoint.getCode(), endPoint.getCode(), BizStatus.OPEN, BizStatus.PICK);
//更新Task任务 写入关联AGV
task.setAgvTask(agvTask);
taskRepository.save(task);
}
}
return null;
}
@Override
@Transactional(rollbackFor = Exception.class)
public synchronized void allocateAll(long id, Point endPoint) throws Exception {
@ -371,12 +378,16 @@ public class PickDetailServiceImpl implements PickDetailService {
@Override
@Transactional(rollbackFor = Exception.class)
public ApiResult cancelAllocate(long id, double quantity){
public ApiResult cancelAllocate(long id, double cancelQuantity){
PickDetailDto pickDetailDto = findById(id);
PickDetail pd = toEntity(pickDetailDto);
List<Task> Tasks = taskRepository.getPickNotAllTask(id);
for (Task task : Tasks) {
if (cancelQuantity<=0){
break;
}
cancelQuantity=cancelQuantity-task.getPlanQty();
//根据Task找到对应的库存
Inventory inv = inventoryRepository.findById(task.getInventory().getId()).get();
inv.setQueuedQty(inv.getQueuedQty() - task.getPlanQty());
@ -411,7 +422,7 @@ public class PickDetailServiceImpl implements PickDetailService {
ApiResult apiResult=new ApiResult();
for (int i = 0; i < ids.length; i++) {
PickDetail pickDetail=pickDetailRepository.getById(ids[i]);
apiResult = cancelAllocate(pickDetail.getId(), pickDetail.getOrderQty());
apiResult = cancelAllocate(pickDetail.getId(), pickDetail.getAllocatedQty());
}
return apiResult;
}

View File

@ -535,7 +535,7 @@ public class TaskServiceImpl implements TaskService {
List<AsnDetail> asnDetailList = asnDetailRepository.findByAsnAndItem(asn.getRelatedBill1(),sku);
double orderQty=0;
for (int i = 0; i < asnDetailList.size(); i++) {
orderQty=orderQty+asnDetailList.get(i).getOrderQty();
orderQty=orderQty+(asnDetailList.get(i).getOrderQty()-asnDetailList.get(i).getReceivedQty());
}
data.put("lineNos",asnDetailList.size());
data.put("RFID",rfid);
@ -580,26 +580,31 @@ public class TaskServiceImpl implements TaskService {
if (inventory==null){
return ApiResult.fail(500,"库存异常",null);
}
List<Task> taskList=taskRepository.findByItemKey(itemKey.getId(), BizStatus.ALLOCATE);
if (taskList.size()!=1){
return ApiResult.fail(500,"Task异常",null);
}
Task task=taskList.get(0);
PickDetail pickDetail=task.getPickDetail();
Pick pick=pickDetail.getPick();
if (inventory.getQueuedQty()<=0){
// 未占用库存 询问是否更改出库库存
// 未分配
data.put("sku",sku);
data.put("RFID",rfid);
data.put("invId",inventory.getId());
return ApiResult.fail(201,"库存未进行分配,请选择需要出库出库单",data);
}else {
// 已分配
data.put("sku",sku);
data.put("RFID",rfid);
data.put("invId",inventory.getId());
data.put("receivedQty",inventory.getQueuedQty());
/** 查询关联Task任务*/
List<Task> taskList=taskRepository.findByItemKey(itemKey.getId(), BizStatus.ALLOCATE);
Task task=taskList.get(0);
PickDetail pickDetail=task.getPickDetail();
Pick pick=pickDetail.getPick();
// 已占用库存 推荐库存
data.put("relatedBill1",pick.getRelatedBill1());
data.put("relatedBill2",pick.getRelatedBill2());
data.put("billType",pick.getBillType());
data.put("sku",sku);
data.put("lineNo",pickDetail.getLineNo());
data.put("RFID",rfid);
data.put("pdId",pickDetail.getId());
data.put("taskId",task.getId());
data.put("orderQty",pickDetail.getOrderQty());
data.put("receivedQty",inventory.getQueuedQty());
data.put("orderQty",pickDetail.getAllocatedQty()-pickDetail.getPickedQty());
}
}else if (item.getGoodType().equals(BizStatus.BCP)){
@ -611,4 +616,5 @@ public class TaskServiceImpl implements TaskService {
}
return ApiResult.fail(200, "操作成功", data);
}
}