Commit 06ca2d2c LN

策略出库功能

1 个父辈 ccabc300
...@@ -370,7 +370,7 @@ public class DataCache { ...@@ -370,7 +370,7 @@ public class DataCache {
List<Storage> storages=Lists.newArrayList(); List<Storage> storages=Lists.newArrayList();
for (Storage storage : for (Storage storage :
allStorages.values()) { allStorages.values()) {
if(storageIds.contains(storage.getId())){ if(storageIds==null|| storageIds.contains(storage.getId())){
storages.add(storage); storages.add(storage);
} }
} }
...@@ -391,8 +391,10 @@ public class DataCache { ...@@ -391,8 +391,10 @@ public class DataCache {
if(pnInventoryItem == null){ if(pnInventoryItem == null){
pnInventoryItem = new InventoryItem(); pnInventoryItem = new InventoryItem();
pnInventoryItem.setStorageName(storageInventoryItem.getStorageName()); pnInventoryItem.setStorageName(storageInventoryItem.getStorageName());
pnInventoryItem.setStorageId(storage.getId());
}else{ }else{
pnInventoryItem.setStorageName(""); pnInventoryItem.setStorageName(null);
pnInventoryItem.setStorageId(null);
} }
pnInventoryItem.setPartNumber(partNumber); pnInventoryItem.setPartNumber(partNumber);
pnInventoryItem.setStockCount(pnInventoryItem.getStockCount() + storageInventoryItem.getStockCount()); pnInventoryItem.setStockCount(pnInventoryItem.getStockCount() + storageInventoryItem.getStockCount());
......
...@@ -47,10 +47,12 @@ public class InventoryItem { ...@@ -47,10 +47,12 @@ public class InventoryItem {
* 即将过期的盘数(2个小时内) * 即将过期的盘数(2个小时内)
*/ */
private int willExireReel = 0; private int willExireReel = 0;
private String storageId ;
/** /**
* 设备名称 * 设备名称
*/ */
private String StorageName=""; private String storageName ;
public String getPartNumber() { public String getPartNumber() {
return partNumber; return partNumber;
......
package com.neotel.smfcore.core.storage.rest; package com.neotel.smfcore.core.storage.rest;
import com.google.common.base.Strings;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.common.utils.StorageConstants;
import com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE;
import com.neotel.smfcore.core.device.util.DataCache; import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.storage.bean.InventoryItem; import com.neotel.smfcore.core.storage.bean.InventoryItem;
import com.neotel.smfcore.core.storage.rest.dto.InventoryItemDto;
import com.neotel.smfcore.core.storage.rest.dto.StorageDto; import com.neotel.smfcore.core.storage.rest.dto.StorageDto;
import com.neotel.smfcore.core.storage.rest.dto.StoragePosDto;
import com.neotel.smfcore.core.storage.rest.dto.TacticsOutDto;
import com.neotel.smfcore.core.storage.rest.mapstruct.InventoryItemMapper;
import com.neotel.smfcore.core.storage.rest.mapstruct.StoragePosMapper;
import com.neotel.smfcore.core.storage.rest.query.InventoryQueryCriteria; import com.neotel.smfcore.core.storage.rest.query.InventoryQueryCriteria;
import com.neotel.smfcore.core.storage.rest.query.StoragePosFindCriteria;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Label; import com.neotel.smfcore.core.storage.service.po.Label;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.util.TaskService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
@Slf4j @Slf4j
@RestController @RestController
...@@ -30,14 +49,93 @@ import java.util.Map; ...@@ -30,14 +49,93 @@ import java.util.Map;
public class MaterialController { public class MaterialController {
@Autowired @Autowired
private DataCache dataCache; private DataCache dataCache;
@Autowired
private InventoryItemMapper inventoryItemMapper;
@Autowired
private TaskService taskService;
@ApiOperation("策略出库获取库存") @Autowired
private final StoragePosMapper storagePosMapper;
@Autowired
private final IStoragePosManager storagePosManager;
@ApiOperation("策略出库获取库存列表")
@GetMapping(value = "/inventory") @GetMapping(value = "/inventory")
@PreAuthorize("el.check('tacticsOuput')") @PreAuthorize("@el.check('tacticsOuput')")
public ResponseEntity<List<InventoryItem>> inventory(InventoryQueryCriteria criteria) { public ResponseEntity<List<InventoryItemDto>> inventory(InventoryQueryCriteria criteria) {
Map<String, InventoryItem> inventoryItemMap = dataCache.getAllInventory(criteria.getStorageIdList()); Map<String, InventoryItem> inventoryItemMap = dataCache.getAllInventory(criteria.getStorageIdList());
List<InventoryItem> list= Lists.newArrayList(inventoryItemMap.values()); List<InventoryItem> list = Lists.newArrayList(inventoryItemMap.values());
return new ResponseEntity<>(list, HttpStatus.OK);
return new ResponseEntity<>(inventoryItemMapper.toDto(list), HttpStatus.OK);
}
@ApiOperation("策略出库")
@GetMapping(value = "/tacticsOuput")
@PreAuthorize("@el.check('tacticsOuput')")
public ResultBean tacticsOuput(@RequestBody Set<TacticsOutDto> outDtoSet) {
if(outDtoSet==null){
throw new ValidateException("smfcode.valueCanotNull","{0}不能为空",new String[]{"PN"} );
}
for (TacticsOutDto dto :
outDtoSet) {
if(dto.getPartNumber()==null){
throw new ValidateException("smfcode.valueCanotNull","{0}不能为空",new String[]{"PN"} );
}else if(dto.getPlateNumber()==null){
throw new ValidateException("smfcode.valueCanotNull","{0}不能为空",new String[]{"Num"} );
}
}
taskService.tacticsCheckOut(outDtoSet);
return ResultBean.newOkResult("ok");
} }
@ApiOperation("物料分组界面")
@GetMapping("/labelOuput")
@PreAuthorize("@el.check('labelOuput')")
public PageData<StoragePosDto> storagePosFind(StoragePosFindCriteria criteria, Pageable pageable, HttpServletRequest request){
if(criteria.getStorageId()!=null&&criteria.getStorageId().equals("0")){
criteria.setStorageId(null);
}
Query query= QueryHelp.getQuery(criteria);
Criteria baseCriteria= Criteria.where("used").is(true);
int componentType = criteria.getType();
String name="";
if(componentType != -1){
int type = componentType;
request.setAttribute("type", componentType);
if(componentType == 41){//锡膏夹具
type = COMPONENT_TYPE.FIXTURE;
name = StorageConstants.PACKAGE_TYPE.SOLDER_FIXTURE.getCode();
}else if(componentType == 42){//PCB夹具
type = COMPONENT_TYPE.FIXTURE;
name = StorageConstants.PACKAGE_TYPE.PCB_FIXTURE.getCode();
}
baseCriteria.and("barcode.type").is(type);
}
String expire = criteria.getExpire();
if(!Strings.isNullOrEmpty(expire)){
if("solder".equalsIgnoreCase(expire)){
baseCriteria.and("barcode.expTime").lte(new Date());
}else if("pcb".equalsIgnoreCase(expire)){
baseCriteria.and("barcode.expireDate").lte(new Date());
}
request.setAttribute("expire",expire);
}
query.addCriteria(baseCriteria);
PageData<StoragePos> pages=storagePosManager.findByPage(query,pageable);
List<StoragePosDto> StoragePosDtos=storagePosMapper.toDto(pages.getContent());
return new PageData(StoragePosDtos,pages.getTotalElements());
}
} }
package com.neotel.smfcore.core.storage.rest.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
public class InventoryItemDto implements Serializable {
@ApiModelProperty("物编")
private String partNumber;
@ApiModelProperty("库存数量")
private int stockCount = 0;
@ApiModelProperty("锁定的数量")
private int lockCount = 0;
@ApiModelProperty("库存盘数")
private int stockReel = 0;
@ApiModelProperty("锁定的盘数")
private int lockReel = 0;
@ApiModelProperty("过期的盘数")
private int expireReel = 0;
@ApiModelProperty("即将过期的盘数(2个小时内)")
private int willExireReel = 0;
@ApiModelProperty("设备ID")
private String storageId;
@ApiModelProperty("设备名称")
private String storageName;
private int plateNumber=1;
}
package com.neotel.smfcore.core.storage.rest.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
public class TacticsOutDto implements Serializable {
@ApiModelProperty("物编")
private String partNumber;
@ApiModelProperty("出库盘数")
private Integer plateNumber;
@ApiModelProperty("料仓Id")
private String storageId;
}
package com.neotel.smfcore.core.storage.rest.mapstruct;
import com.neotel.smfcore.common.base.BaseMapper;
import com.neotel.smfcore.core.storage.bean.InventoryItem;
import com.neotel.smfcore.core.storage.rest.dto.InventoryItemDto;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
@Mapper(componentModel = "spring" ,unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface InventoryItemMapper extends BaseMapper<InventoryItemDto, InventoryItem> {
}
...@@ -33,6 +33,9 @@ public class StoragePosFindCriteria { ...@@ -33,6 +33,9 @@ public class StoragePosFindCriteria {
@ApiModelProperty("库位号") @ApiModelProperty("库位号")
private String posName; private String posName;
@QueryCondition
@ApiModelProperty("标签ID")
private String labelId;
@ApiModelProperty("类型") @ApiModelProperty("类型")
private int type =-1 ; private int type =-1 ;
......
...@@ -14,7 +14,13 @@ import com.neotel.smfcore.core.device.bean.StatusBean; ...@@ -14,7 +14,13 @@ import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.enums.OP; import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.enums.OP_STATUS; import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.device.util.DataCache; import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS;
import com.neotel.smfcore.core.order.enums.ORDER_COLOR;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE;
import com.neotel.smfcore.core.storage.enums.DeviceType; import com.neotel.smfcore.core.storage.enums.DeviceType;
import com.neotel.smfcore.core.storage.rest.dto.TacticsOutDto;
import com.neotel.smfcore.core.storage.service.manager.IStorageManager; import com.neotel.smfcore.core.storage.service.manager.IStorageManager;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager; import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.manager.impl.StorageManagerImpl; import com.neotel.smfcore.core.storage.service.manager.impl.StorageManagerImpl;
...@@ -857,4 +863,55 @@ public class TaskService { ...@@ -857,4 +863,55 @@ public class TaskService {
// QisdaApi.ClearStockBy(task.getPosName()); // QisdaApi.ClearStockBy(task.getPosName());
// } // }
} }
/**
* 策略出库
*/
public synchronized void tacticsCheckOut(Set<TacticsOutDto> tacticsOutDtos) {
CHECKOUT_TYPE checkoutType = dataCache.getCheckOutType();
List<String> availableStorageIds = new ArrayList<>();
for (Storage storage : dataCache.getAllStorage().values()) {
//默认所有料仓可用
// StatusBean statusBean =dataCache. getStatus(storage.getCid());
// if (statusBean.isAvailable())
{
availableStorageIds.add(storage.getId());
}
}
Collection<String> excludePosIds = excludePosIds();
//其他出库模式一次性全部生成任务
for (TacticsOutDto item : tacticsOutDtos) {
log.info("开始执行策略出库[" + item.getPartNumber() + "] [" + item.getStorageId() + "] 盘数=" + item.getPlateNumber());
String partNumber = item.getPartNumber();
for (int i = 1; i <= item.getPlateNumber(); i++) {
StoragePos pos = null;
if (item.getStorageId() != null) {
String[] storageIds = new String[]{item.getStorageId()};
pos = storagePosManager.findPartNumberInStorages(Lists.newArrayList(storageIds), partNumber, excludePosIds, checkoutType);
} else {
pos = storagePosManager.findPartNumberInStorages(availableStorageIds, partNumber, excludePosIds, checkoutType);
}
if (pos == null) {
log.error("策略出库[" + item.getPartNumber() + "] 未找到可以出库的物料[" + partNumber + "]");
break;
} else {
log.info("策略出库,PN[" + item.getPartNumber() + "]第[" + i + "]盘, 出库位置仓位【" + pos.getPosName() + "】RI=[" + pos.getBarcode().getBarcode() + "] PN=[" + partNumber + "] num:" + pos.getBarcode().getAmount());
DataLog task = newTask(pos);
task.setSourceId(null);
task.setSourceName("策略出库");
task.setType(OP.CHECKOUT);
addTaskToExecute(task);
}
}
}
}
} }
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!