Commit 3a5ac57b LN

工单出库:PN出库修改。

1 个父辈 691a7087
......@@ -91,7 +91,7 @@ public class DataCache {
/**
* 库位占用Map, key为cid,value为已使用的库位列表
*/
private static Map<String, List<String>> usedPosNameMap = new ConcurrentHashMap<>();
private static Map<String, List<StoragePos>> usedPosMap = new ConcurrentHashMap<>();
/**
* 锡膏料仓冷藏区和回温区使用库位数, key为cid, key为 WarmPos 时value表示回温区使用数量,key为 ColdingPos 时value为冷藏区使用数量
......@@ -436,40 +436,75 @@ public class DataCache {
/**
* 出库时清除使用库位列表
*/
private void removeUsedPosNameList(String cid, String posName) {
List<String> usedPosNameList = getUsedPosNameList(cid);
usedPosNameList.remove(posName);
usedPosNameMap.put(cid, usedPosNameList);
private void removeUsedPosList(String cid, StoragePos pos) {
List<StoragePos> usedPosNameList = getUsedPosList(cid);
// usedPosNameList.remove(posName);
Iterator<StoragePos> iterator = usedPosNameList.iterator();
while (iterator.hasNext()) {
StoragePos book = iterator.next();
if (book.getPosName() .equals(pos.getPosName())) {
iterator.remove();
break;
}
}
List<StoragePos> list=new ArrayList<>();
iterator.forEachRemaining(list::add);
usedPosMap.put(cid, list);
}
/**
* 入库时增加使用库位列表
*/
private void addUsedPosNameList(String cid, String posName) {
List<String> usedPosNameList = getUsedPosNameList(cid);
usedPosNameList.add(posName);
usedPosNameMap.put(cid, usedPosNameList);
private void addUsedPosList(String cid, StoragePos pos) {
List<StoragePos> usedPosList = getUsedPosList(cid);
usedPosList.add(pos);
usedPosMap.put(cid, usedPosList);
}/**
* 获取设备所有占用的库位名称列表
*/
public List<StoragePos> getUsedPosList(String cid) {
List<StoragePos> allPos = usedPosMap.get(cid);
if (allPos == null) {
Storage storage = getStorage(cid);
if (storage != null) {
log.info("加载[" + cid + "]所有已使用库位到缓存");
allPos = storagePosManager.findUsedPosNameByStorageId(storage.getId());
// for (StoragePos pos : allPos) {
// posNameList.add(pos.getPosName());
// }
usedPosMap.put(cid, allPos);
}
}
return allPos;
}
/**
* 获取设备所有占用的库位名称列表
*/
public List<String> getUsedPosNameList(String cid) {
List<String> posNameList = usedPosNameMap.get(cid);
if (posNameList == null) {
List<String> posNameList = new ArrayList<>();
List<StoragePos> allPos = usedPosMap.get(cid);
if (allPos == null) {
Storage storage = getStorage(cid);
posNameList = new ArrayList<>();
if (storage != null) {
log.info("加载[" + cid + "]所有已使用库位到缓存");
List<StoragePos> allPos = storagePosManager.findUsedPosNameByStorageId(storage.getId());
for (StoragePos pos : allPos) {
posNameList.add(pos.getPosName());
allPos = storagePosManager.findUsedPosNameByStorageId(storage.getId());
usedPosMap.put(cid, allPos);
}
usedPosNameMap.put(cid, posNameList);
}
for (StoragePos pos : allPos) {
posNameList.add(pos.getPosName());
}
return posNameList;
}
public List<List<StoragePos>> getAllUsedPosMap() {
List<List<StoragePos>> posList = new ArrayList<>(usedPosMap.values());
return posList;
}
/**
* 锁定库存
......@@ -640,13 +675,13 @@ public class DataCache {
amount = -barcode.getAmount();
storage.emptyOnePos(pos);
updateSpUsePosCount(storage, pos, -1);
removeUsedPosNameList(cid, pos.getPosName());
removeUsedPosList(cid, pos );
} else {
//入库
amount = barcode.getAmount();
storage.useOnePos(pos);
updateSpUsePosCount(storage, pos, 1);
addUsedPosNameList(cid, pos.getPosName());
addUsedPosList(cid, pos );
//入库单处理
if (ObjectUtil.isNotEmpty(storage.getInListName())) {
inListCache.UpdateInList(storage.getInListName(), pos, barcode);
......
......@@ -7,12 +7,12 @@ import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.materialLog.rest.query.MaterialLogCriteria;
import com.neotel.smfcore.core.selfAudit.enums.SELFAUDIT_STATUS;
import com.neotel.smfcore.core.selfAudit.rest.dto.SelfAuditDto;
import com.neotel.smfcore.core.selfAudit.rest.dto.SelfAuditItemDto;
import com.neotel.smfcore.core.selfAudit.rest.mapstruct.SelfAuditItemMapper;
import com.neotel.smfcore.core.selfAudit.rest.mapstruct.SelfAuditMapper;
import com.neotel.smfcore.core.selfAudit.rest.query.SelfAuditCriteria;
import com.neotel.smfcore.core.selfAudit.service.manager.ISelfAuditManager;
import com.neotel.smfcore.core.selfAudit.service.po.SelfAudit;
import com.neotel.smfcore.core.selfAudit.service.po.SelfAuditItem;
......@@ -179,7 +179,7 @@ public class SelfAuditController {
}
@ApiOperation("查询盘点日志")
@GetMapping(value = "/list")
public PageData<SelfAuditDto> queryList(MaterialLogCriteria criteria, Pageable pageable) {
public PageData<SelfAuditDto> queryList(SelfAuditCriteria criteria, Pageable pageable) {
Query query = QueryHelp.getQuery(criteria);
PageData<SelfAudit> pages = selfAuditManager.findByPage(query, pageable);
......
package com.neotel.smfcore.core.selfAudit.rest.query;
import com.neotel.smfcore.common.annotation.QueryCondition;
import com.neotel.smfcore.common.bean.BetweenData;
import io.swagger.annotations.ApiModelProperty;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
public class SelfAuditCriteria {
@QueryCondition(blurry = "barcode,posName,locInfo")
private String blurry;
@QueryCondition(type = QueryCondition.Type.BETWEEN, propName = "updateDate")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private BetweenData<Date> createDate;
@QueryCondition(blurry = "barcode")
private String barcode;
@QueryCondition(blurry = "posName")
private String posName;
@ApiModelProperty("status")
@QueryCondition(blurry = "status")
private String status;
}
......@@ -32,6 +32,7 @@ import org.springframework.stereotype.Service;
import java.text.ParseException;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Pattern;
@Service
@Slf4j
......@@ -261,9 +262,25 @@ public class StoragePosManagerImpl implements IStoragePosManager {
public StoragePos findPartNumberInStorages(List<String> storageIdList, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType) {
return findPartNumberInStorages(storageIdList,"",pn,excludePosIds,checkOutType);
}
private String escapeExprSpecialWord(String keyword) {
if (ObjectUtil.isNotEmpty(keyword)) {
String[] fbsArr = { "\\", "$", "(", ")", "*", "+", ".", "[", "]", "?", "^", "{", "}", "|" };
for (String key : fbsArr) {
if (keyword.contains(key)) {
keyword = keyword.replace(key, "\\" + key);
}
}
}
return keyword;
}
@Override
public StoragePos findPartNumberInStorages(List<String> storageIdList,String labelId, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType,Map<String, String> appendDate) {
Criteria c = Criteria.where("barcode.partNumber").is(pn)
//
//criteria = criteria.and(attributeName).regex(pattern);
String regex="^"+escapeExprSpecialWord(pn.toString())+".*";
Pattern pattern = Pattern.compile(regex );
Criteria c = Criteria.where("barcode.partNumber").regex(pattern)
.and("id").nin(excludePosIds)
.and("enabled").is(true)//可用
.and("barcode.lockId").is(null);//没有被锁定的仓位;
......@@ -281,14 +298,34 @@ public class StoragePosManagerImpl implements IStoragePosManager {
if (pos == null) {
log.info("使用" + checkOutType + " 策略出库 partNumber=" + pn + ",未找到可以出库的物料 ");
} else {
log.info("使用" + checkOutType + " 策略出库 partNumber=" + pn + ",找到出仓位置【" + pos.getPosName() + "】,RI【" + pos.getBarcode().getBarcode() + "】 ");
log.info("使用" + checkOutType + " 策略出库 partNumber=" + pn + ",找到出仓位置【" + pos.getPosName() + "】,RI【" + pos.getBarcode().getBarcode() + "】 PN【"+pos.getBarcode().getPartNumber()+"】");
}
return pos;
}
@Override
public StoragePos findPartNumberInStorages(List<String> storageIdList, String labelId, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType) {
return findPartNumberInStorages(storageIdList,labelId,pn,excludePosIds,checkOutType,new HashMap<>());
// return findPartNumberInStorages(storageIdList,labelId,pn,excludePosIds,checkOutType,new HashMap<>());
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);
}
Query q = new Query(c);
Sort sort = getSortByCheckOutType(checkOutType);
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;
}
/**
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!