Commit 12c1121a hjh

UID出库增加线体和PN出库回显

1 个父辈 fa9b0cbe
......@@ -83,6 +83,9 @@ public class Barcode extends BasePo implements Serializable {
* 盘高
*/
private int height = 0;
/**
* 供应商
*/
private String provider;
/**
* 批次
......@@ -561,4 +564,7 @@ public class Barcode extends BasePo implements Serializable {
}
}
}
public String getPartNumberAndProvider(){
return this.partNumber+"_"+this.provider;
}
}
......@@ -468,10 +468,12 @@ public class DataCache {
for (InventoryItem item : map.values()) {
if (ObjectUtil.isNotEmpty(blurry)) {
if (item.getPartNumber().contains(blurry)) {
resultMap.put(item.getPartNumber(), item);
resultMap.put(item.getPartNumberAndProvider(), item);
// resultMap.put(item.getPartNumber(), item);
}
} else {
resultMap.put(item.getPartNumber(), item);
resultMap.put(item.getPartNumberAndProvider(), item);
// resultMap.put(item.getPartNumber(), item);
}
}
return resultMap;
......@@ -488,7 +490,9 @@ public class DataCache {
for(InventoryItem storageInventoryItem : storageInventory.values()){
storageInventoryItem.setStorageName(storage.getName());
String partNumber = storageInventoryItem.getPartNumber();
InventoryItem pnInventoryItem = resultMap.get(storageInventoryItem.getPartNumber());
String provider = storageInventoryItem.getProvider();
InventoryItem pnInventoryItem = resultMap.get(storageInventoryItem.getPartNumberAndProvider());
// InventoryItem pnInventoryItem = resultMap.get(storageInventoryItem.getPartNumber());
if(pnInventoryItem == null){
pnInventoryItem = new InventoryItem();
pnInventoryItem.setStorageName(storageInventoryItem.getStorageName());
......@@ -498,12 +502,13 @@ public class DataCache {
pnInventoryItem.setStorageId(null);
}
pnInventoryItem.setPartNumber(partNumber);
pnInventoryItem.setProvider(provider);
pnInventoryItem.setStockCount(pnInventoryItem.getStockCount() + storageInventoryItem.getStockCount());
pnInventoryItem.setLockCount(pnInventoryItem.getLockCount() + storageInventoryItem.getLockCount());
pnInventoryItem.setStockReel(pnInventoryItem.getStockReel() + storageInventoryItem.getStockReel());
pnInventoryItem.setLockReel(pnInventoryItem.getLockReel() + storageInventoryItem.getLockReel());
resultMap.put(partNumber,pnInventoryItem);
resultMap.put(storageInventoryItem.getPartNumberAndProvider(),pnInventoryItem);
// resultMap.put(partNumber,pnInventoryItem);
}
}
return resultMap;
......@@ -523,10 +528,13 @@ public class DataCache {
public InventoryItem getStorageInventoryByPartNumber(String cid, String partNumber){
Map<String, InventoryItem> storageInventory = getStorageInventory(cid);
// 修改
InventoryItem partNumberInventoryItem = storageInventory.get(partNumber);
if(partNumberInventoryItem == null){
partNumberInventoryItem = new InventoryItem();
partNumberInventoryItem.setPartNumber(partNumber);
// 添加供货商
partNumberInventoryItem.setProvider("");
}
return partNumberInventoryItem;
}
......
......@@ -18,6 +18,13 @@ public class InventoryItem {
*/
private String partNumber;
//加个字段(供应商)
/**
* 供货商编号
*/
private String provider;
/**
* 库存数量
*/
......@@ -154,4 +161,8 @@ public class InventoryItem {
public void setLockCount(int lockCount) {
this.lockCount = lockCount;
}
public String getPartNumberAndProvider(){
return this.partNumber+"_"+this.provider;
}
}
......@@ -704,6 +704,10 @@ public class StoragePosController {
if (checkOutDto.getSingleOut() == null) {
checkOutDto.setSingleOut(true + "");
}
// 判断线体是否为空
if (StringUtils.isNotEmpty(checkOutDto.getLine())) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"线体"});
}
String isSingleOutStr = checkOutDto.getSingleOut();
boolean isSingleOut = Boolean.valueOf(isSingleOutStr);
......@@ -724,9 +728,8 @@ public class StoragePosController {
// if(!result) {
// throw new ValidateException("smfcore.error.getMaterialLot.out", "条码[{0}]验证失败,无法出库", new String[]{pos.getBarcode().getBarcode()});
// }
log.info("出库料仓【" + storage.getName() + "_" + storage.getCid() + "】位置仓位【" + pos.getPosName() + "】");
String outResult = taskService.checkout(storage, pos, isSingleOut,SecurityUtils.getCurrentUsername(),null,ExtendType.MANUAL_CHECKOUT);
String outResult = taskService.checkout(storage, pos, isSingleOut,SecurityUtils.getCurrentUsername(),null,ExtendType.MANUAL_CHECKOUT,checkOutDto.getLine());
if (!Strings.isNullOrEmpty(outResult)) {
throw new ValidateException("smfcore.error", outResult);
}
......
......@@ -5,8 +5,11 @@ import lombok.Data;
@Data
public class CheckOutDto {
@ApiModelProperty("库位ID号 ")
private String[] pids;
@ApiModelProperty("是否是单盘出库")
private String singleOut;
@ApiModelProperty("线体")
private String line;
}
......@@ -12,6 +12,9 @@ public class InventoryItemDto implements Serializable {
@ApiModelProperty("物编")
private String partNumber;
@ApiModelProperty("供应商")
private String provider;
@ApiModelProperty("库存数量")
private int stockCount = 0;
......
......@@ -12,6 +12,9 @@ public class TacticsOutDto implements Serializable {
@ApiModelProperty("物编")
private String partNumber;
@ApiModelProperty("供应商")
private String provider;
@ApiModelProperty("出库盘数")
private Integer plateNumber;
......
......@@ -33,6 +33,10 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
StoragePos findPartNumberInStorages(List<String> storageIdList, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType);
StoragePos findPartNumberAndProviderInStorages(List<String> storageIdList, String pn, String provider,Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType);
StoragePos findPartNumberAndProviderNumberInStorages(List<String> storageIdList,String labelId, String pn,String provider, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType);
StoragePos findPartNumberInStorages(List<String> storageIdList,String labelId, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType);
StoragePos findPartNumberInStorages(List<String> storageIdList, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType,String brand);
......
......@@ -46,10 +46,10 @@ public class StoragePosManagerImpl implements IStoragePosManager {
private DataCache dataCache;
*/
@Override
public List<PlateSizeBean> getStoragePosUsage(String storageId){
public List<PlateSizeBean> getStoragePosUsage(String storageId) {
Aggregation agg = Aggregation.newAggregation(
Aggregation.match(Criteria.where("storageId").is(storageId).and("enabled").is(true)),
Aggregation.group("w","h","used").count().as("count"),
Aggregation.group("w", "h", "used").count().as("count"),
Aggregation.project("count").and("plateSize").previousOperation()
);
AggregationResults<PlateSizeBean> results = storagePosDao.getMongoTemplate().aggregate(agg, StoragePos.class, PlateSizeBean.class);
......@@ -58,30 +58,32 @@ public class StoragePosManagerImpl implements IStoragePosManager {
}
@Override
public Map<String, InventoryItem> getInventory(String storageId){
public Map<String, InventoryItem> getInventory(String storageId) {
return getInventory(-1, storageId);
}
private List<InventoryItem> inventory(int type,String... storageIds){
private List<InventoryItem> inventory(int type, String... storageIds) {
Criteria c = Criteria.where("barcode").exists(true).and("storageId").in(storageIds);
if(type != -1){
if (type != -1) {
c = c.and("barcode.type").is(type);
}
Aggregation agg = Aggregation.newAggregation(
Aggregation.match(c),
Aggregation.group("barcode.partNumber").sum("barcode.amount").as("stockCount").count().as("stockReel"),
Aggregation.project("stockCount", "stockReel").and("partNumber").previousOperation()
Aggregation.group("barcode.partNumber")
.first("barcode.provider").as("provider")
.sum("barcode.amount").as("stockCount").count().as("stockReel"),
Aggregation.project("stockCount", "stockReel", "provider").and("partNumber").previousOperation()
);
AggregationResults<InventoryItem> results = storagePosDao.getMongoTemplate().aggregate(agg, StoragePos.class, InventoryItem.class);
return results.getMappedResults();
}
private List<InventoryItem> lockInventory(int type,String... storageIds){
private List<InventoryItem> lockInventory(int type, String... storageIds) {
//被锁定的仓位
//TODO:这里还需要去掉被指定批次锁定的,因为出错,暂时不加了..
Criteria c = Criteria.where("barcode").exists(true).and("storageId").in(storageIds)
.andOperator(Criteria.where("canCheckOutTime").gt(System.currentTimeMillis()));
if(type != -1){
if (type != -1) {
c = c.and("barcode.type").is(type);
}
......@@ -94,47 +96,43 @@ public class StoragePosManagerImpl implements IStoragePosManager {
return results.getMappedResults();
}
private Map<String, InventoryItem> getInventory(int type,String... storageIds){
private Map<String, InventoryItem> getInventory(int type, String... storageIds) {
Map<String, InventoryItem> inventoryMap = Maps.newHashMap();
List<InventoryItem> inventory = inventory(type,storageIds);
List<InventoryItem> inventory = inventory(type, storageIds);
List<InventoryItem> lockInventory = lockInventory(type, storageIds);
for (InventoryItem inventoryItem : inventory) {
inventoryMap.put(inventoryItem.getPartNumber(),inventoryItem);
inventoryMap.put(inventoryItem.getPartNumberAndProvider(), inventoryItem);
}
for (InventoryItem lockInventoryItem : lockInventory) {
String partNumber = lockInventoryItem.getPartNumber();
InventoryItem inventoryItem = inventoryMap.get(partNumber);
if(inventoryItem != null){
InventoryItem inventoryItem = inventoryMap.get(lockInventoryItem.getPartNumberAndProvider());
if (inventoryItem != null) {
inventoryItem.setLockReel(lockInventoryItem.getLockReel());
}
inventoryMap.put(partNumber,inventoryItem);
inventoryMap.put(lockInventoryItem.getPartNumberAndProvider(), inventoryItem);
}
List<InventoryItem> expireInventory = expireInventory(type, 0,storageIds);
List<InventoryItem> expireInventory = expireInventory(type, 0, storageIds);
for (InventoryItem expireInventoryItem : expireInventory) {
String partNumber = expireInventoryItem.getPartNumber();
InventoryItem inventoryItem = inventoryMap.get(partNumber);
if(inventoryItem != null){
InventoryItem inventoryItem = inventoryMap.get(expireInventoryItem.getPartNumberAndProvider());
if (inventoryItem != null) {
inventoryItem.setExpireReel(expireInventoryItem.getExpireReel());
}
inventoryMap.put(partNumber,inventoryItem);
inventoryMap.put(expireInventoryItem.getPartNumberAndProvider(), inventoryItem);
}
//统计2个小时内即将过期的
int inHours = 2;
List<InventoryItem> willExpireInventory = expireInventory(type, inHours, storageIds);
List<InventoryItem> willExpireInventory = expireInventory(type, inHours, storageIds);
for (InventoryItem wiilExpireInventoryItem : willExpireInventory) {
String partNumber = wiilExpireInventoryItem.getPartNumber();
InventoryItem inventoryItem = inventoryMap.get(partNumber);
if(inventoryItem != null){
InventoryItem inventoryItem = inventoryMap.get(wiilExpireInventoryItem.getPartNumberAndProvider());
if (inventoryItem != null) {
inventoryItem.setWillExireReel(wiilExpireInventoryItem.getWillExireReel());
}
inventoryMap.put(partNumber,inventoryItem);
inventoryMap.put(wiilExpireInventoryItem.getPartNumberAndProvider(), inventoryItem);
}
//获取agv类型的库存
Map<String,InventoryItem> agvInventory = getAgvBoxInventory(storageIds);
if (agvInventory != null && agvInventory.size() >0){
Map<String, InventoryItem> agvInventory = getAgvBoxInventory(storageIds);
if (agvInventory != null && agvInventory.size() > 0) {
inventoryMap.putAll(agvInventory);
}
......@@ -149,10 +147,11 @@ public class StoragePosManagerImpl implements IStoragePosManager {
/**
* 得到agvBox存储信息
*
* @param storageIds
* @return
*/
private Map<String, InventoryItem> getAgvBoxInventory(String...storageIds) {
private Map<String, InventoryItem> getAgvBoxInventory(String... storageIds) {
Map<String, InventoryItem> resultMap = new HashMap<>();
for (String storageId : storageIds) {
/*Storage storage = dataCache.getStorageById(storageId);
......@@ -166,17 +165,18 @@ public class StoragePosManagerImpl implements IStoragePosManager {
List<Barcode> subCodeList = pos.getBarcode().getSubCodeList();
if (subCodeList != null && !subCodeList.isEmpty()) {
for (Barcode barcode : subCodeList) {
InventoryItem item = resultMap.get(barcode.getPartNumber());
InventoryItem item = resultMap.get(barcode.getPartNumber()+"_"+barcode.getProvider());
if (item != null) {
item.setStockReel(item.getStockReel() + 1);
item.setStockCount(item.getStockCount() + barcode.getAmount());
} else {
item = new InventoryItem();
item.setPartNumber(barcode.getPartNumber());
item.setProvider(barcode.getProvider());
item.setStockCount(barcode.getAmount());
item.setStockReel(1);
}
resultMap.put(barcode.getPartNumber(), item);
resultMap.put(item.getPartNumberAndProvider(), item);
}
}
}
......@@ -188,22 +188,23 @@ public class StoragePosManagerImpl implements IStoragePosManager {
/**
* 统计多少个小时内即将过期的物料(inHours 为0表示截止到目前已经过期的,为1表示1个小时后过期,但现在还没过期的)
*
* @param storageIds
* @param type
* @param inHours
* @return
*/
private List<InventoryItem> expireInventory(int type, int inHours,String[] storageIds){
private List<InventoryItem> expireInventory(int type, int inHours, String[] storageIds) {
//过期的仓位
Criteria c = Criteria.where("barcode").exists(true).and("storageId").in(storageIds);
if(type != -1){
if (type != -1) {
c = c.and("barcode.type").is(type);
}
Criteria expireCriteria = Criteria.where("expireTime").gt(System.currentTimeMillis());
if(inHours > 0){
if (inHours > 0) {
expireCriteria = Criteria.where("expireTime").gt(System.currentTimeMillis()).lte(System.currentTimeMillis() + inHours * 60 * 60 * 1000);
}else{
} else {
expireCriteria = Criteria.where("expireTime").lte(System.currentTimeMillis());
}
......@@ -211,8 +212,8 @@ public class StoragePosManagerImpl implements IStoragePosManager {
Aggregation.match(c),
Aggregation.project("barcode").andExpression("barcode.putInTime + barcode.maxStorageTime * 60 * 60 * 1000").as("expireTime"),
Aggregation.match(expireCriteria),
Aggregation.group("barcode.partNumber").count().as("expireReel"),
Aggregation.project("expireReel").and("partNumber").previousOperation()
Aggregation.group("barcode.partNumber").first("barcode.provider").as("provider").count().as("expireReel"),
Aggregation.project("expireReel", "provider").and("partNumber").previousOperation()
);
AggregationResults<InventoryItem> results = storagePosDao.getMongoTemplate().aggregate(agg, StoragePos.class, InventoryItem.class);
return results.getMappedResults();
......@@ -221,11 +222,11 @@ public class StoragePosManagerImpl implements IStoragePosManager {
@Override
public StoragePos getByPosName(String posName) {
StoragePos pos = storagePosDao.findOneByCondition(new String[]{"posName"}, new String[]{posName});
if(pos==null){
if (pos == null) {
//库位的条码有可能是前面带了SOxxx-,所以这里去除SO-再查一遍库位,保持与之前的兼容
int index=posName.indexOf("-");
if(index>=0){
String posNameStr=posName.substring(index+1);
int index = posName.indexOf("-");
if (index >= 0) {
String posNameStr = posName.substring(index + 1);
pos = storagePosDao.findOneByCondition(new String[]{"posName"}, new String[]{posNameStr});
}
}
......@@ -238,8 +239,8 @@ public class StoragePosManagerImpl implements IStoragePosManager {
}
@Override
public List<StoragePos> findPosList(String storageId, List<String> posNames){
if(posNames == null || posNames.isEmpty()){
public List<StoragePos> findPosList(String storageId, List<String> posNames) {
if (posNames == null || posNames.isEmpty()) {
return Lists.newArrayList();
}
Criteria c = Criteria.where("storageId").is(storageId)
......@@ -247,9 +248,10 @@ public class StoragePosManagerImpl implements IStoragePosManager {
Query q = new Query(c);
return storagePosDao.findByQuery(q);
}
@Override
public StoragePos save(StoragePos storagePos) throws ValidateException {
if(!storagePos.isUsed()) {
if (!storagePos.isUsed()) {
//出库
List<String> mergePosNames = storagePos.getMergePosList();
List<StoragePos> mergePosList = findPosList(storagePos.getStorageId(), mergePosNames);
......@@ -262,7 +264,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
allPos += mergePos.getPosName() + ",";
}
if (ObjectUtil.isNotEmpty(allPos)) {
log.info("设置库位["+storagePos.getPosName()+"]合并的关联库位[ " + allPos + " ]使用状态为:false");
log.info("设置库位[" + storagePos.getPosName() + "]合并的关联库位[ " + allPos + " ]使用状态为:false");
}
storagePos.setMergePosList(null);
}
......@@ -274,11 +276,11 @@ public class StoragePosManagerImpl implements IStoragePosManager {
@Override
public void delete(StoragePos object) throws ValidateException {
storagePosDao.removeOneById(object.getId());
storagePosDao.removeOneById(object.getId());
}
@Override
public StoragePos getByBarcode(String barcode){
public StoragePos getByBarcode(String barcode) {
List<Criteria> orCriterialList = Lists.newArrayList();
orCriterialList.add(Criteria.where("barcode.barcode").is(barcode));
orCriterialList.add(Criteria.where("barcode.subCodeList.barcode").is(barcode));
......@@ -287,10 +289,10 @@ public class StoragePosManagerImpl implements IStoragePosManager {
}
@Override
public List<StoragePos> findNotEmptyByStorageId(String storageId){
public List<StoragePos> findNotEmptyByStorageId(String storageId) {
Criteria c = Criteria.where("barcode").exists(true)
.and("enabled").is(true);//可用;
if(!Strings.isNullOrEmpty(storageId)){
if (!Strings.isNullOrEmpty(storageId)) {
c = c.and("storageId").is(storageId);
}
Query query = new Query(c);
......@@ -302,7 +304,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
public List<StoragePos> findNotEmptyByStorageIdList(List<String> storageIdList) {
Criteria c = Criteria.where("barcode").exists(true)
.and("enabled").is(true);//可用;
if (storageIdList != null && !storageIdList.isEmpty()){
if (storageIdList != null && !storageIdList.isEmpty()) {
c = c.and("storageId").in(storageIdList);
}
Query query = new Query(c);
......@@ -319,10 +321,44 @@ public class StoragePosManagerImpl implements IStoragePosManager {
@Override
public StoragePos findPartNumberInStorages(List<String> storageIdList, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType) {
return findPartNumberInStorages(storageIdList,"",pn,excludePosIds,checkOutType);
return findPartNumberInStorages(storageIdList, "", pn, excludePosIds, checkOutType);
}
@Override
public StoragePos findPartNumberAndProviderInStorages(List<String> storageIdList, String pn,String provider, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType) {
return findPartNumberAndProviderNumberInStorages(storageIdList, "", pn,provider, excludePosIds, checkOutType);
}
@Override
public StoragePos findPartNumberAndProviderNumberInStorages(List<String> storageIdList, String labelId, String pn,String provider, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType) {
Criteria c = Criteria.where("barcode.partNumber").is(pn)
.and("id").nin(excludePosIds)
.and("enabled").is(true)//可用
.and("barcode.lockId").is(null);//没有被锁定的仓位;
if (storageIdList != null) {
c = c.and("storageId").in(storageIdList);
}
if (ObjectUtil.isNotEmpty(labelId)) {
c.and("labelId").is(labelId);
}
if (ObjectUtil.isNotEmpty(provider)) {
c.and("provider").is(provider);
}
Query q = new Query(c);
//Sort sort = getSortByCheckOutType(checkOutType);
Sort sort = Sort.by(Sort.Direction.ASC, "barcode.amount", "barcode.putInDate");
q.with(sort);
StoragePos pos = storagePosDao.findOne(q);
if (pos == null) {
log.info("使用" + checkOutType + " 策略出库 partNumber=" + pn + ",未找到可以出库的物料 ");
} else {
log.info("使用" + checkOutType + " 策略出库 partNumber=" + pn + ",找到出仓位置【" + pos.getPosName() + "】,RI【" + pos.getBarcode().getBarcode() + "】 ");
}
return pos;
}
@Override
public StoragePos findPartNumberInStorages(List<String> storageIdList,String labelId, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType) {
public StoragePos findPartNumberInStorages(List<String> storageIdList, String labelId, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType) {
Criteria c = Criteria.where("barcode.partNumber").is(pn)
.and("id").nin(excludePosIds)
.and("enabled").is(true)//可用
......@@ -335,7 +371,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
}
Query q = new Query(c);
//Sort sort = getSortByCheckOutType(checkOutType);
Sort sort = Sort.by(Sort.Direction.ASC,"barcode.amount","barcode.putInDate");
Sort sort = Sort.by(Sort.Direction.ASC, "barcode.amount", "barcode.putInDate");
q.with(sort);
StoragePos pos = storagePosDao.findOne(q);
if (pos == null) {
......@@ -360,7 +396,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
}
Query q = new Query(c);
//Sort sort = getSortByCheckOutType(checkOutType);
Sort sort = Sort.by(Sort.Direction.ASC, "barcode.amount", "barcode.expireDate","barcode.createDate");
Sort sort = Sort.by(Sort.Direction.ASC, "barcode.amount", "barcode.expireDate", "barcode.createDate");
q.with(sort);
StoragePos pos = storagePosDao.findOne(q);
if (pos == null) {
......@@ -388,11 +424,11 @@ public class StoragePosManagerImpl implements IStoragePosManager {
if (ObjectUtil.isNotEmpty(pn)) {
c.and("barcode.subCodeList.partNumber").is(pn);
}
if (isOut){
if (isOut) {
c.and("barcode.subCodeList.isOut").is(isOut);
}
//Sort sort = getSortByCheckOutType(checkOutType);
Sort sort = Sort.by(Sort.Direction.ASC, "barcode.subCodeList.amount","barcode.subCodeList.createDate"/*,"canCheckOutTime", "barcode.usedCount"*/);
Sort sort = Sort.by(Sort.Direction.ASC, "barcode.subCodeList.amount", "barcode.subCodeList.createDate"/*,"canCheckOutTime", "barcode.usedCount"*/);
Query q = new Query(c);
q.with(sort);
StoragePos pos = storagePosDao.findOne(q);
......@@ -413,7 +449,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
public List<StoragePos> findNotEmptyPosNameByStorageId(String storageId) {
Criteria c = Criteria.where("barcode").exists(true)
.and("enabled").is(true);//可用;
if(!Strings.isNullOrEmpty(storageId)){
if (!Strings.isNullOrEmpty(storageId)) {
c = c.and("storageId").is(storageId);
}
Query query = new Query(c);
......@@ -422,7 +458,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
}
@Override
public StoragePos findOneEmptyPosNameByStorageId(String storageId,String posName) {
public StoragePos findOneEmptyPosNameByStorageId(String storageId, String posName) {
Criteria c = Criteria.where("barcode").exists(false)
.and("enabled").is(true);//可用;
if (!Strings.isNullOrEmpty(storageId)) {
......@@ -438,10 +474,10 @@ public class StoragePosManagerImpl implements IStoragePosManager {
}
@Override
public List<StoragePos> findEmptyByStorageId(String storageId){
public List<StoragePos> findEmptyByStorageId(String storageId) {
Criteria c = Criteria.where("barcode").exists(false)
.and("enabled").is(true);//可用;
if(!Strings.isNullOrEmpty(storageId)){
if (!Strings.isNullOrEmpty(storageId)) {
c = c.and("storageId").is(storageId);
}
Query query = new Query(c);
......@@ -453,18 +489,18 @@ public class StoragePosManagerImpl implements IStoragePosManager {
/**
* 根据出库方式获取不同的 Sort
*/
private Sort getSortByCheckOutType(CHECKOUT_TYPE checkoutType){
private Sort getSortByCheckOutType(CHECKOUT_TYPE checkoutType) {
Sort sort = null;
if(CHECKOUT_TYPE.EXPIRE_FIRST.equals(checkoutType)){//先过期先出
sort = Sort.by(Sort.Direction.ASC, "barcode.expTime","barcode.expireDate","canCheckOutTime");
}else if(CHECKOUT_TYPE.FIFO.equals(checkoutType)){//严格的先进先出
if (CHECKOUT_TYPE.EXPIRE_FIRST.equals(checkoutType)) {//先过期先出
sort = Sort.by(Sort.Direction.ASC, "barcode.expTime", "barcode.expireDate", "canCheckOutTime");
} else if (CHECKOUT_TYPE.FIFO.equals(checkoutType)) {//严格的先进先出
sort = Sort.by(Sort.Direction.ASC, "canCheckOutTime", "barcode.usedCount");
}else if(CHECKOUT_TYPE.USED_FIRST.equals(checkoutType)){//尾料优先
} else if (CHECKOUT_TYPE.USED_FIRST.equals(checkoutType)) {//尾料优先
sort = Sort.by(Sort.Direction.ASC, "barcode.amount", "canCheckOutTime");
}else if(CHECKOUT_TYPE.PRODUCE_DATE.equals(checkoutType)){
} else if (CHECKOUT_TYPE.PRODUCE_DATE.equals(checkoutType)) {
//先生产先出
sort = Sort.by(Sort.Direction.ASC, "barcode.amount","barcode.produceDate", "canCheckOutTime");
}else{//效率优先
sort = Sort.by(Sort.Direction.ASC, "barcode.amount", "barcode.produceDate", "canCheckOutTime");
} else {//效率优先
sort = Sort.by(Sort.Direction.ASC, "canCheckOutTime", "createDate");
}
return sort;
......@@ -474,7 +510,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
public PageData<StoragePos> findByPage(Query query, Pageable pageable) {
int totalCount = storagePosDao.countByQuery(query);
List<StoragePos> list = storagePosDao.findByQuery(query, pageable);
return new PageData<StoragePos>(list,totalCount);
return new PageData<StoragePos>(list, totalCount);
}
@Override
......@@ -490,31 +526,32 @@ public class StoragePosManagerImpl implements IStoragePosManager {
@Override
public void removePosByStorageId(String storageId) {
Query query=new Query(Criteria.where("storageId").is(storageId));
Query query = new Query(Criteria.where("storageId").is(storageId));
storagePosDao.removeByQuery(query);
}
@Override
public void deletePoss(Set<String> ids) {
Query query =new Query(Criteria.where("id").in(ids));
List<StoragePos> poss= storagePosDao.findByQuery(query);
String delPosName="";
Query query = new Query(Criteria.where("id").in(ids));
List<StoragePos> poss = storagePosDao.findByQuery(query);
String delPosName = "";
for (StoragePos pos :
poss) {
if(pos.getBarcode()==null||pos.getBarcode().equals("")) {
if (pos.getBarcode() == null || pos.getBarcode().equals("")) {
}else{
throw new ValidateException("smfcore.thePosIsused"," 库位[{0}]有料[{1}],不能删除",new String[]{ pos.getPosName(),pos.getBarcode().getBarcode()});
} else {
throw new ValidateException("smfcore.thePosIsused", " 库位[{0}]有料[{1}],不能删除", new String[]{pos.getPosName(), pos.getBarcode().getBarcode()});
// throw new BadRequestException("库位[" + pos.getPosName() + "]中有料[" + pos.getBarcode() + "],不能删除");
}
delPosName+="["+pos.getId()+"_"+pos.getPosName()+"]";
delPosName += "[" + pos.getId() + "_" + pos.getPosName() + "]";
}
log.info("手动删除库位:"+delPosName+" 完成 ");
log.info("手动删除库位:" + delPosName + " 完成 ");
storagePosDao.removeByQuery(query);
}
@Override
public StoragePos getEmptyPosByStorage(Storage storage, Barcode barcode, Collection<String> excludePosIds) throws ValidateException{
return getEmptyPos(storage,barcode, excludePosIds,true);
public StoragePos getEmptyPosByStorage(Storage storage, Barcode barcode, Collection<String> excludePosIds) throws ValidateException {
return getEmptyPos(storage, barcode, excludePosIds, true);
}
private StoragePos getEmptyPos(Storage storage, Barcode barcode, Collection<String> excludePosIds, boolean warmPos) throws ValidateException {
......@@ -522,26 +559,26 @@ public class StoragePosManagerImpl implements IStoragePosManager {
Criteria c = Criteria.where("storageId").is(storage.getId());
COMPATIBLE_TYPE compatibleType = storage.getCompatibleType();
if(compatibleType == COMPATIBLE_TYPE.EXACT_MATCH){//完全匹配
if (compatibleType == COMPATIBLE_TYPE.EXACT_MATCH) {//完全匹配
c = c.and("w").is(barcode.getPlateSize()).and("h").is(barcode.getHeight());
}else if(compatibleType == COMPATIBLE_TYPE.FULLY_COMPATIBLE){//完全兼容
} else if (compatibleType == COMPATIBLE_TYPE.FULLY_COMPATIBLE) {//完全兼容
c = c.and("w").gte(barcode.getPlateSize()).and("h").gte(barcode.getHeight());//宽度大于等于料盘宽度,高度大于等于料盘高度
}else if(compatibleType == COMPATIBLE_TYPE.SIZE_COMPATIBLE){//同尺寸兼容
} else if (compatibleType == COMPATIBLE_TYPE.SIZE_COMPATIBLE) {//同尺寸兼容
c = c.and("w").is(barcode.getPlateSize()).and("h").gte(barcode.getHeight());//宽度等于料盘宽度,高度大于等于料盘高度
}
c = c.and("enabled").is(true)//可用
.and("used").is(false);//未使用
if(storage.isSolderPaste()){
if(warmPos){
if (storage.isSolderPaste()) {
if (warmPos) {
c = c.and("warmPos").is(true);//回温库位
}else{
} else {
c = c.and("warmPos").ne(true);//不是回温库位
}
}
//去除的仓位
if(excludePosIds != null && !excludePosIds.isEmpty()){
if (excludePosIds != null && !excludePosIds.isEmpty()) {
c = c.and("id").nin(excludePosIds);
}
Query query = new Query(c);
......@@ -552,7 +589,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
}
@Override
public StoragePos getEmptyPosByStorage(Storage storage, Barcode barcode, Collection<String> excludePosIds,String lastPosId) throws ValidateException {
public StoragePos getEmptyPosByStorage(Storage storage, Barcode barcode, Collection<String> excludePosIds, String lastPosId) throws ValidateException {
Criteria c = Criteria.where("storageId").is(storage.getId());
......@@ -578,29 +615,31 @@ public class StoragePosManagerImpl implements IStoragePosManager {
String msg = "";
// if (lastPosId == null || lastPosId.equals("")) {
//优先放入最合适的位置(根据尺寸),相同尺寸按优先级排序
query.with(Sort.by(Sort.Direction.ASC, "w").and(Sort.by(Sort.Direction.ASC, "h")).and(Sort.by(Sort.Direction.DESC, "priority")));
//优先放入最合适的位置(根据尺寸),相同尺寸按优先级排序
query.with(Sort.by(Sort.Direction.ASC, "w").and(Sort.by(Sort.Direction.ASC, "h")).and(Sort.by(Sort.Direction.DESC, "priority")));
// } else {
// Point point = PointUtil.getPosPoint(lastPosId, false);
// query.addCriteria(Criteria.where("coordinate").nearSphere(point));
// msg += "getEmptyPosByStorage 根据就近坐标查询[" + lastPosId + "][" + point.getX() + "," + point.getY() + "]";
// }
StoragePos pos = storagePosDao.findOne(query);
if ((!ObjectUtil.isNotEmpty(msg) )&& (pos != null)) {
if ((!ObjectUtil.isNotEmpty(msg)) && (pos != null)) {
Point targetP = PointUtil.getPosPoint(lastPosId, false);
log.info(msg + "结果:[" + pos.getPosName() + "][" + targetP.getX() + "," + targetP.getY() + "]");
}
return pos;
}
@Override
public List<StoragePos> findNotEmpty(){
public List<StoragePos> findNotEmpty() {
return findNotEmptyByStorageId(null);
}
@Override
public List<StoragePos> findByStorage(String storageId) {
return storagePosDao.findListByCondition(new String[]{"storageId" }, new String[]{storageId });
return storagePosDao.findListByCondition(new String[]{"storageId"}, new String[]{storageId});
}
@Override
public void insertAll(List<StoragePos> posList) {
storagePosDao.insertAll(posList);
......@@ -619,27 +658,26 @@ public class StoragePosManagerImpl implements IStoragePosManager {
@Override
public void clearStoragePosLabel(String labelId) {
Query query = new Query(Criteria.where("labelId").is(labelId));
storagePosDao.updateMulti(query, Update.update("labelId",""));
storagePosDao.updateMulti(query, Update.update("labelName",""));
storagePosDao.updateMulti(query, Update.update("labelId", ""));
storagePosDao.updateMulti(query, Update.update("labelName", ""));
}
@Override
public void updatePosLabel( String[] posIds, String labelId,String labelName) {
public void updatePosLabel(String[] posIds, String labelId, String labelName) {
Query query = new Query(Criteria.where("id").in(posIds));
storagePosDao.updateMulti(query, Update.update("labelId",labelId));
storagePosDao.updateMulti(query, Update.update("labelName",labelName));
storagePosDao.updateMulti(query, Update.update("labelId", labelId));
storagePosDao.updateMulti(query, Update.update("labelName", labelName));
}
@Override
public void clearLockPos(String lockId) {
Query query = new Query( Criteria.where("barcode.lockId").is(lockId));
storagePosDao.updateMulti(query, Update.update("barcode.lockId",""));
Query query = new Query(Criteria.where("barcode.lockId").is(lockId));
storagePosDao.updateMulti(query, Update.update("barcode.lockId", ""));
}
@Override
public StoragePos autoFindNextEmptyPos(Storage storage, Collection<String> excludePosIds,StoragePos currentPos) {
public StoragePos autoFindNextEmptyPos(Storage storage, Collection<String> excludePosIds, StoragePos currentPos) {
Criteria c = Criteria.where("storageId").is(storage.getId());
// c.and("priority").lt(currentPos.getPriority());
......@@ -671,16 +709,18 @@ public class StoragePosManagerImpl implements IStoragePosManager {
StoragePos pos = storagePosDao.findOne(query);
return pos;
}
@Override
public void updateBarcodeMsd(String pn,String msl,String thickness){
Query query = new Query( Criteria.where("barcode.partNumber").is(pn));
storagePosDao.updateMulti(query, Update.update("barcode.msl",msl));
storagePosDao.updateMulti(query, Update.update("barcode.thickness",thickness));
public void updateBarcodeMsd(String pn, String msl, String thickness) {
Query query = new Query(Criteria.where("barcode.partNumber").is(pn));
storagePosDao.updateMulti(query, Update.update("barcode.msl", msl));
storagePosDao.updateMulti(query, Update.update("barcode.thickness", thickness));
}
/**
* 查找同尺寸连续的库位,合并库位放置料盘,仅用于智能料架
*
* @param storage
* @param barcode
* @return
......@@ -688,17 +728,17 @@ public class StoragePosManagerImpl implements IStoragePosManager {
@Override
public List<StoragePos> getSameSizeContinuityEmptyPosList(Storage storage, Barcode barcode) throws ValidateException {
if(storage == null||(!storage.isNLMShelf())){
if (storage == null || (!storage.isNLMShelf())) {
//只适合移动料架NLM
throw new ValidateException( "smfcore.shelf.nlm.notFound", "未找到移动料架{0}",new String[]{storage.getId()});
throw new ValidateException("smfcore.shelf.nlm.notFound", "未找到移动料架{0}", new String[]{storage.getId()});
}
if(!storage.isMergePos()){
if (!storage.isMergePos()) {
return new ArrayList<>();
}
Criteria c = Criteria.where("storageId").is(storage.getId());
if(barcode.getPlateSize() > 7){
if (barcode.getPlateSize() > 7) {
c = c.and("w").gte(barcode.getPlateSize());
}else{
} else {
c = c.and("w").is(barcode.getPlateSize());
}
c = c.and("h").gte(0);//宽度大于等于料盘宽度,高度大于等于料盘高度
......@@ -709,9 +749,9 @@ public class StoragePosManagerImpl implements IStoragePosManager {
query.with(Sort.by(Sort.Direction.ASC, "posName"));
List<StoragePos> posList = storagePosDao.findByQuery(query);
//把不连续的过滤掉
Map<String,StoragePos> posMap = new ConcurrentHashMap<>();
for(StoragePos pos : posList){
posMap.put(pos.getPosName(),pos);
Map<String, StoragePos> posMap = new ConcurrentHashMap<>();
for (StoragePos pos : posList) {
posMap.put(pos.getPosName(), pos);
}
Set<String> posNames = posMap.keySet();
for (String posName : posNames) {
......@@ -720,13 +760,13 @@ public class StoragePosManagerImpl implements IStoragePosManager {
List<StoragePos> emptyPosList = new ArrayList<>();
emptyPosList.add(currentPos);
String nextPosName = posName;
while (true){
if(totalHeight >= barcode.getHeight()){
while (true) {
if (totalHeight >= barcode.getHeight()) {
return emptyPosList;
}
nextPosName = getNextPosName(nextPosName);
StoragePos nextPos = posMap.get(nextPosName);
if(nextPos == null){
if (nextPos == null) {
break;
}
emptyPosList.add(nextPos);
......@@ -760,8 +800,8 @@ public class StoragePosManagerImpl implements IStoragePosManager {
c = c.and("id").nin(excludePosIds);
}
if (StringUtils.isNotBlank(logo)){
Pattern pattern=Pattern.compile(QueryHelp.escapeExprSpecialWord(logo), Pattern.CASE_INSENSITIVE);
if (StringUtils.isNotBlank(logo)) {
Pattern pattern = Pattern.compile(QueryHelp.escapeExprSpecialWord(logo), Pattern.CASE_INSENSITIVE);
c.and("posName").regex(pattern);
}
......@@ -777,7 +817,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
// msg += "getEmptyPosByStorage 根据就近坐标查询[" + lastPosId + "][" + point.getX() + "," + point.getY() + "]";
// }
StoragePos pos = storagePosDao.findOne(query);
if ((!ObjectUtil.isNotEmpty(msg) )&& (pos != null)) {
if ((!ObjectUtil.isNotEmpty(msg)) && (pos != null)) {
Point targetP = PointUtil.getPosPoint(lastPosId, false);
log.info(msg + "结果:[" + pos.getPosName() + "][" + targetP.getX() + "," + targetP.getY() + "]");
}
......@@ -788,27 +828,27 @@ public class StoragePosManagerImpl implements IStoragePosManager {
/**
* 获取下一库位的库位名(后缀数字+1)
*/
private String getNextPosName(String posName){
private String getNextPosName(String posName) {
String posIndexStr = "";
String prefixStr = "";
for(int i=1;i<=posName.length();i++){
for (int i = 1; i <= posName.length(); i++) {
char c = posName.charAt(posName.length() - i);
if(!Character.isDigit(c)){
if (!Character.isDigit(c)) {
prefixStr = posName.substring(0, posName.length() - i + 1);
break;
}
posIndexStr = c + posIndexStr;
}
if(posIndexStr.isEmpty()){
if (posIndexStr.isEmpty()) {
return "";
}
int posIndex = Integer.valueOf(posIndexStr);
int nextPosIndex = posIndex + 1;
return prefixStr +String.format("%0"+posIndexStr.length()+"d",nextPosIndex);
return prefixStr + String.format("%0" + posIndexStr.length() + "d", nextPosIndex);
}
public List<StoragePos> findNotEmptyPosName(){
public List<StoragePos> findNotEmptyPosName() {
Criteria c = Criteria.where("barcode").exists(true)
.and("enabled").is(true);//可用;
Query query = new Query(c);
......@@ -817,7 +857,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
}
@Override
public StoragePos getPosNameByPnAndStrId(String partNumber,String storageId) {
public StoragePos getPosNameByPnAndStrId(String partNumber, String storageId) {
return storagePosDao.findOne(new Query(Criteria.where("partNumber").is(partNumber).and("storageId").is(storageId)));
}
......@@ -839,7 +879,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
Criteria c = Criteria.where("barcode.partNumber").is(pn)
.and("id").nin(excludePosIds)
.and("enabled").is(true);//可用
//.and("barcode.lockId").is(null);//没有被锁定的仓位;
//.and("barcode.lockId").is(null);//没有被锁定的仓位;
if (storageIdList != null) {
c = c.and("storageId").in(storageIdList);
}
......@@ -854,8 +894,8 @@ public class StoragePosManagerImpl implements IStoragePosManager {
public void batchUpdatePosEnabled(List<String> idList, boolean enabled) {
Query query = new Query(Criteria.where("id").in(idList));
Update update = new Update();
update.set("enabled",enabled);
storagePosDao.updateMulti(query,update);
update.set("enabled", enabled);
storagePosDao.updateMulti(query, update);
}
@Override
......
......@@ -141,7 +141,7 @@ public class TaskService {
public synchronized String checkout(Storage storage, StoragePos pos, boolean isSingleOut, String opUserName, String stationName) throws ValidateException {
return checkout(storage, pos, isSingleOut, opUserName, stationName, -1);
return checkout(storage, pos, isSingleOut, opUserName, stationName, -1,"");
}
/**
......@@ -153,13 +153,11 @@ public class TaskService {
* @return
* @throws ValidateException
*/
public synchronized String checkout(Storage storage, StoragePos pos, boolean isSingleOut, String opUserName, String stationName, int extendType) throws ValidateException {
public synchronized String checkout(Storage storage, StoragePos pos, boolean isSingleOut, String opUserName, String stationName, int extendType,String line) throws ValidateException {
if (pos.getBarcode() == null) {
String msg = "库位[" + pos.getPosName() + "]中已无物料,忽略";
log.info(msg);
throw new ValidateException("smfcore.allBoxView.noReel", "库位{0}中无物料", new String[]{pos.getPosName()});
// Barcode barcode=new Barcode();
// SimpleDateFormat formatter= new SimpleDateFormat("HHmmss");
// Date date = new Date(System.currentTimeMillis());
......@@ -207,6 +205,9 @@ public class TaskService {
if (extendType != -1) {
task.setExtendType(extendType);
}
if (StringUtils.isNotEmpty(line)){
task.setLine(line);
}
addTaskToExecute(task);
//}
return "";
......@@ -1211,17 +1212,18 @@ public class TaskService {
//其他出库模式一次性全部生成任务
for (TacticsOutDto item : tacticsOutDtos) {
log.info("开始执行策略出库[" + item.getPartNumber() + "] [" + item.getStorageId() + "] 盘数=" + item.getPlateNumber());
log.info("开始执行策略出库[" + item.getPartNumber() + "][" + item.getProvider() + "] [" + item.getStorageId() + "] 盘数=" + item.getPlateNumber());
String partNumber = item.getPartNumber();
String provider = item.getProvider();
for (int i = 1; i <= item.getPlateNumber(); i++) {
Collection<String> excludePosIds = excludePosIds();
StoragePos pos = null;
if (item.getStorageId() != null) {
String[] storageIds = new String[]{item.getStorageId()};
pos = storagePosManager.findPartNumberInStorages(Lists.newArrayList(storageIds), partNumber, excludePosIds, checkoutType);
pos = storagePosManager.findPartNumberAndProviderInStorages(Lists.newArrayList(storageIds), partNumber,provider, excludePosIds, checkoutType);
} else {
pos = storagePosManager.findPartNumberInStorages(availableStorageIds, partNumber, excludePosIds, checkoutType);
pos = storagePosManager.findPartNumberAndProviderInStorages(availableStorageIds, partNumber,provider, excludePosIds, checkoutType);
}
if (pos == null) {
log.error("策略出库[" + item.getPartNumber() + "] 未找到可以出库的物料[" + partNumber + "]");
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!