Commit 467324c9 sunke

Merge remote-tracking branch 'origin/master'

2 个父辈 f11f6c78 ef46faa2
正在显示 15 个修改的文件 包含 575 行增加147 行删除
......@@ -6,9 +6,6 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
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.common.utils.StringUtils;
import com.neotel.smfcore.common.utils.YmlUpdateUtil;
import com.neotel.smfcore.core.barcode.service.manager.IComponentManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.service.po.Component;
......@@ -16,7 +13,6 @@ import com.neotel.smfcore.core.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.inList.util.InListCache;
import com.neotel.smfcore.core.language.service.bean.LanguageInfo;
import com.neotel.smfcore.core.language.service.po.LanguageMsg;
import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.core.storage.bean.InventoryItem;
import com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE;
......@@ -41,8 +37,6 @@ import org.springframework.stereotype.Repository;
import javax.annotation.PostConstruct;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 缓存
......@@ -72,12 +66,12 @@ public class DataCache {
private InListCache inListCache;
@Autowired
private IComponentManager componentManager;
private IComponentManager componentManager;
/**
* 是否需要推送温湿度报警值
*/
public static Map<String, Boolean> needUpdateHumidityMap = new ConcurrentHashMap<>();
public static Map<String, Boolean> needUpdateHumidityMap = new ConcurrentHashMap<>();
/**
* 一些设置的缓存
......@@ -92,7 +86,15 @@ public class DataCache {
/**
* 库位占用Map, key为cid,value为已使用的库位列表
*/
private static Map<String,List<String>> usedPosNameMap = new ConcurrentHashMap<>();
private static Map<String, List<String>> usedPosNameMap = new ConcurrentHashMap<>();
/**
* 锡膏料仓冷藏区和回温区使用库位数, key为cid, key为 WarmPos 时value表示回温区使用数量,key为 ColdingPos 时value为冷藏区使用数量
*/
private static Map<String, Map<String, Integer>> spUsedPosCountMap = new ConcurrentHashMap<>();
public static String warmPosUseCount = "warmPosUseCount";
public static String coldingPosUseCount = "coldingPosUseCount";
/**
* 禁用库位名称列表
......@@ -121,14 +123,15 @@ public class DataCache {
/**
* 获取缓存信息
*
* @param cacheKey
* @param <T>
* @return
*/
public <T> T getCache(String cacheKey){
public <T> T getCache(String cacheKey) {
Object value = cacheMap.get(cacheKey);
if(value != null){
return (T)value;
if (value != null) {
return (T) value;
}
return null;
}
......@@ -141,7 +144,7 @@ public class DataCache {
return orderSetting;
}
public List<LanguageInfo> getLanguageList(){
public List<LanguageInfo> getLanguageList() {
List<LanguageInfo> lanList = getCache(Constants.CACHE_languageType);
if (lanList == null || lanList.size() <= 0) {
lanList = MessageUtils.getDefaultLanList();
......@@ -153,27 +156,27 @@ public class DataCache {
/**
* 更新缓存信息
*/
public void updateCache(String cacheKey, Object value){
cacheItemDao.updateCacheItem(cacheKey,value);
cacheMap.put(cacheKey,value);
if(cacheKey.equals(Constants.CACHE_CodeRule)){
List<String> ruleList=(List<String>)value;
public void updateCache(String cacheKey, Object value) {
cacheItemDao.updateCacheItem(cacheKey, value);
cacheMap.put(cacheKey, value);
if (cacheKey.equals(Constants.CACHE_CodeRule)) {
List<String> ruleList = (List<String>) value;
codeResolve.updateBarcodeRuleList(ruleList);
}
log.info("updateCache ["+cacheKey+"]=["+value+"]");
log.info("updateCache [" + cacheKey + "]=[" + value + "]");
}
/**
* 获取配置信息同时插入数据库,如果配置值为空,使用数据库配置的值
*/
public String getConfigCache(String configKey,String configValue) {
if(Strings.isNullOrEmpty(configValue)){
public String getConfigCache(String configKey, String configValue) {
if (Strings.isNullOrEmpty(configValue)) {
//没有配置,使用数据库的配置值
return getCache(configKey);
}else{
} else {
//有配置值,将配置值写入数据库
updateCache(configKey,configValue);
updateCache(configKey, configValue);
return configValue;
}
}
......@@ -181,9 +184,9 @@ public class DataCache {
/**
* 是否需要推送温湿度报警值
*/
public boolean needUpdateHumidiy(String cid){
public boolean needUpdateHumidiy(String cid) {
Boolean needUpdateHumidiy = needUpdateHumidityMap.get(cid);
if(needUpdateHumidiy == null || needUpdateHumidiy){
if (needUpdateHumidiy == null || needUpdateHumidiy) {
needUpdateHumidityMap.put(cid, false);
return true;
}
......@@ -191,14 +194,14 @@ public class DataCache {
}
public Settings getSettings(){
if(settings == null){
public Settings getSettings() {
if (settings == null) {
List<Settings> allSettings = settingsDao.findAll();
if(allSettings == null || allSettings.isEmpty()){
if (allSettings == null || allSettings.isEmpty()) {
settings = new Settings();
// settings.setOutType(CHECKOUT_TYPE.EFFICIENCY.name());
settings = settingsDao.save(settings);
}else{
} else {
settings = allSettings.get(0);
}
......@@ -212,18 +215,18 @@ public class DataCache {
/**
* 出库方式
*/
public CHECKOUT_TYPE getCheckOutType(){
public CHECKOUT_TYPE getCheckOutType() {
// String outType = getSettings().getOutType();
String outType = getCache(Constants.CACHE_CheckOutType);
if(ObjectUtil.isEmpty(outType)){
outType=CHECKOUT_TYPE.EFFICIENCY.name();
updateCache(Constants.CACHE_CheckOutType,outType);
log.info("未配置 出库策略配置类型,默认为"+outType);
if (ObjectUtil.isEmpty(outType)) {
outType = CHECKOUT_TYPE.EFFICIENCY.name();
updateCache(Constants.CACHE_CheckOutType, outType);
log.info("未配置 出库策略配置类型,默认为" + outType);
}
return CHECKOUT_TYPE.valueOf(outType);
}
public Settings updateSettings(Settings newSetting){
public Settings updateSettings(Settings newSetting) {
settings = settingsDao.save(newSetting);
List<String> ruleItems = settings.getCodeRuleList();
codeResolve.updateBarcodeRuleList(ruleItems);
......@@ -272,8 +275,7 @@ public class DataCache {
/**
* 库存 map, key 为 cid,value 为料盘存量 map(key为 PartNumber,value 为 库存数量及盘数的Bean)
*/
private static Map<String,Map<String,InventoryItem>> inventoryMap = new ConcurrentHashMap<>();
private static Map<String, Map<String, InventoryItem>> inventoryMap = new ConcurrentHashMap<>();
/**
......@@ -296,14 +298,14 @@ public class DataCache {
// return storageIds;
// }
//
public Map<String, Storage> getAllStorage(){
if(allStorage.isEmpty()){
synchronized (allStorage){
if(allStorage.isEmpty()){
public Map<String, Storage> getAllStorage() {
if (allStorage.isEmpty()) {
synchronized (allStorage) {
if (allStorage.isEmpty()) {
List<Storage> all = storageManager.findAll();
if(all != null){
if (all != null) {
Map<String, Storage> map = new ConcurrentHashMap<>();
for(Storage storage : all){
for (Storage storage : all) {
List<PlateSizeBean> plateSizeBeanList = storagePosManager.getStoragePosUsage(storage.getId());
storage.initUsage(plateSizeBeanList);
......@@ -313,7 +315,7 @@ public class DataCache {
}
allStorage = map;
log.info("加载所有料仓["+all.size()+"]信息到缓存");
log.info("加载所有料仓[" + all.size() + "]信息到缓存");
}
}
}
......@@ -336,8 +338,8 @@ public class DataCache {
/**
* 根据 cid 获取料仓信息
*/
public Storage getStorage(String cid){
if(Strings.isNullOrEmpty(cid)){
public Storage getStorage(String cid) {
if (Strings.isNullOrEmpty(cid)) {
return null;
}
return getAllStorage().get(cid);
......@@ -346,9 +348,9 @@ public class DataCache {
/**
* 根据 Id 获取料仓信息
*/
public Storage getStorageById(String storageId){
for(Storage storage : getAllStorage().values()){
if(storage.getId().equals(storageId)){
public Storage getStorageById(String storageId) {
for (Storage storage : getAllStorage().values()) {
if (storage.getId().equals(storageId)) {
return storage;
}
}
......@@ -357,15 +359,15 @@ public class DataCache {
/**
* 根据 料仓名称 Name 获取料仓信息
*/
public Storage getStorageByName(String storageName){
for(Storage storage : getAllStorage().values()){
if(storage.getName().equals(storageName)){
public Storage getStorageByName(String storageName) {
for (Storage storage : getAllStorage().values()) {
if (storage.getName().equals(storageName)) {
return storage;
}
}
return null;
}
public Storage reloadStorage(Storage storage,String oldCid) throws ValidateException {
public Storage reloadStorage(Storage storage, String oldCid) throws ValidateException {
if (!oldCid.equals("") && allStorage.containsKey(oldCid)) {
allStorage.remove(oldCid);
......@@ -390,7 +392,7 @@ public class DataCache {
/**
* 获取禁用库位缓存
*/
public Set<String> getDisabledPosNameSet(){
public Set<String> getDisabledPosNameSet() {
initDisabledPosNameSet();
return disabledPosNameSet;
}
......@@ -398,8 +400,8 @@ public class DataCache {
/**
* 初始化禁用库位缓存
*/
private synchronized void initDisabledPosNameSet(){
if(disabledPosNameSet == null){
private synchronized void initDisabledPosNameSet() {
if (disabledPosNameSet == null) {
disabledPosNameSet = new HashSet<>();
List<StoragePos> disabledPosList = storagePosManager.findDisabled();
for (StoragePos disabledPos : disabledPosList) {
......@@ -412,11 +414,11 @@ public class DataCache {
/**
* 更新禁用库位缓存
*/
public void updateDisablePos(StoragePos pos){
public void updateDisablePos(StoragePos pos) {
initDisabledPosNameSet();
if(pos.isEnabled()){
if (pos.isEnabled()) {
disabledPosNameSet.remove(pos.getPosName());
}else{
} else {
disabledPosNameSet.add(pos.getPosName());
}
}
......@@ -424,7 +426,7 @@ public class DataCache {
/**
* 出库时清除使用库位列表
*/
private void removeUsedPosNameList(String cid, String posName){
private void removeUsedPosNameList(String cid, String posName) {
List<String> usedPosNameList = getUsedPosNameList(cid);
usedPosNameList.remove(posName);
usedPosNameMap.put(cid, usedPosNameList);
......@@ -433,7 +435,7 @@ public class DataCache {
/**
* 入库时增加使用库位列表
*/
private void addUsedPosNameList(String cid, String posName){
private void addUsedPosNameList(String cid, String posName) {
List<String> usedPosNameList = getUsedPosNameList(cid);
usedPosNameList.add(posName);
usedPosNameMap.put(cid, usedPosNameList);
......@@ -441,18 +443,18 @@ public class DataCache {
/**
* 获取设备所有占用的库位名称列表
*/
public List<String> getUsedPosNameList(String cid){
public List<String> getUsedPosNameList(String cid) {
List<String> posNameList = usedPosNameMap.get(cid);
if(posNameList == null){
if (posNameList == null) {
Storage storage = getStorage(cid);
posNameList = new ArrayList<>();
if(storage != null){
log.info("加载["+cid+"]所有已使用库位到缓存");
if (storage != null) {
log.info("加载[" + cid + "]所有已使用库位到缓存");
List<StoragePos> allPos = storagePosManager.findUsedPosNameByStorageId(storage.getId());
for (StoragePos pos : allPos) {
posNameList.add(pos.getPosName());
}
usedPosNameMap.put(cid,posNameList);
usedPosNameMap.put(cid, posNameList);
}
}
return posNameList;
......@@ -463,38 +465,38 @@ public class DataCache {
* 锁定库存
* @param cid
* @param partNumber 物料编号
* @return 锁定结果,true 表示有足够的库存,锁定成功;false表示库存不足,锁定失败
* @return 锁定结果, true 表示有足够的库存,锁定成功;false表示库存不足,锁定失败
*/
public boolean lockOneReel(String cid, String partNumber){
public boolean lockOneReel(String cid, String partNumber) {
boolean result = false;
InventoryItem inventoryItem = getStorageInventoryByPartNumber(cid, partNumber);
if(inventoryItem != null) {
if (inventoryItem != null) {
int lockReel = inventoryItem.getLockReel();
//理论上这里是同一个对象,不需要再显式的放入map 中
result = inventoryItem.lockOne();
log.info("锁定料仓["+cid+"]物料["+partNumber+"],锁定数量["+lockReel+"]=>["+inventoryItem.getLockReel()+"],当前库存:"+inventoryItem.getStockReel());
updateStorageInventory(cid,inventoryItem);
log.info("锁定料仓[" + cid + "]物料[" + partNumber + "],锁定数量[" + lockReel + "]=>[" + inventoryItem.getLockReel() + "],当前库存:" + inventoryItem.getStockReel());
updateStorageInventory(cid, inventoryItem);
}
return result;
}
/**
* 解除锁定库存(出库任务完成或取消时调用)
*/
public void unLockOneReel(String cid, String partNumber){
public void unLockOneReel(String cid, String partNumber) {
InventoryItem partNumberInventory = getStorageInventoryByPartNumber(cid, partNumber);
if(partNumberInventory != null) {
if (partNumberInventory != null) {
int lockReel = partNumberInventory.getLockReel();
//理论上这里是同一个对象,不需要再显式的放入map 中
partNumberInventory.unLock(1);
log.info("解除锁定料仓["+cid+"]物料["+partNumber+"],锁定数量["+lockReel+"]=>["+partNumberInventory.getLockReel()+"],当前库存:"+partNumberInventory.getStockReel());
updateStorageInventory(cid,partNumberInventory);
log.info("解除锁定料仓[" + cid + "]物料[" + partNumber + "],锁定数量[" + lockReel + "]=>[" + partNumberInventory.getLockReel() + "],当前库存:" + partNumberInventory.getStockReel());
updateStorageInventory(cid, partNumberInventory);
}
}
/**
* 获取库存信息,key 为 PN
*/
public Map<String,InventoryItem> getAllInventory(List<String> storageIds,String blurry) {
public Map<String, InventoryItem> getAllInventory(List<String> storageIds, String blurry) {
Map<String, Storage> allStorages = getAllStorage();
List<Storage> storages = Lists.newArrayList();
for (Storage storage : allStorages.values()) {
......@@ -506,7 +508,7 @@ public class DataCache {
Map<String, InventoryItem> resultMap = new HashMap<>();
for (InventoryItem item : map.values()) {
if (ObjectUtil.isNotEmpty(blurry)) {
if(item.getPartNumber().contains(blurry)){
if (item.getPartNumber().contains(blurry)) {
resultMap.put(item.getPartNumber(), item);
}
} else {
......@@ -519,19 +521,19 @@ public class DataCache {
/**
* 获取某些料仓的库存信息
*/
private Map<String,InventoryItem> getInventory(Collection<Storage> storageList){
Map<String,InventoryItem> resultMap = Maps.newHashMap();
private Map<String, InventoryItem> getInventory(Collection<Storage> storageList) {
Map<String, InventoryItem> resultMap = Maps.newHashMap();
for (Storage storage : storageList) {
Map<String, InventoryItem> storageInventory = getStorageInventory(storage.getCid());
for(InventoryItem storageInventoryItem : storageInventory.values()){
for (InventoryItem storageInventoryItem : storageInventory.values()) {
storageInventoryItem.setStorageName(storage.getName());
String partNumber = storageInventoryItem.getPartNumber();
InventoryItem pnInventoryItem = resultMap.get(storageInventoryItem.getPartNumber());
if(pnInventoryItem == null){
if (pnInventoryItem == null) {
pnInventoryItem = new InventoryItem();
pnInventoryItem.setStorageName(storageInventoryItem.getStorageName());
pnInventoryItem.setStorageId(storage.getId());
}else{
} else {
pnInventoryItem.setStorageName(null);
pnInventoryItem.setStorageId(null);
}
......@@ -541,7 +543,7 @@ public class DataCache {
pnInventoryItem.setStockReel(pnInventoryItem.getStockReel() + storageInventoryItem.getStockReel());
pnInventoryItem.setLockReel(pnInventoryItem.getLockReel() + storageInventoryItem.getLockReel());
resultMap.put(partNumber,pnInventoryItem);
resultMap.put(partNumber, pnInventoryItem);
}
}
return resultMap;
......@@ -550,26 +552,26 @@ public class DataCache {
/**
* 获取料仓的库存信息
*/
public Map<String, InventoryItem> getStorageInventory(String cid){
public Map<String, InventoryItem> getStorageInventory(String cid) {
Map<String, InventoryItem> storageInventory = inventoryMap.get(cid);
if(storageInventory == null){
if (storageInventory == null) {
storageInventory = initInventory(cid);
}
return storageInventory;
}
public InventoryItem getStorageInventoryByPartNumber(String cid, String partNumber){
public InventoryItem getStorageInventoryByPartNumber(String cid, String partNumber) {
Map<String, InventoryItem> storageInventory = getStorageInventory(cid);
InventoryItem partNumberInventoryItem = storageInventory.get(partNumber);
if(partNumberInventoryItem == null){
InventoryItem partNumberInventoryItem = storageInventory.get(partNumber);
if (partNumberInventoryItem == null) {
partNumberInventoryItem = new InventoryItem();
partNumberInventoryItem.setPartNumber(partNumber);
}
return partNumberInventoryItem;
}
private synchronized Map<String, InventoryItem> initInventory(String cid){
private synchronized Map<String, InventoryItem> initInventory(String cid) {
Storage storage = getStorage(cid);
Map<String, InventoryItem> storageInventoryMap = storagePosManager.getInventory(storage.getId());
//未完成的 Task 也需要锁定
......@@ -587,7 +589,7 @@ public class DataCache {
// }
// }
log.info("初始化料仓["+cid+"]的库存信息["+storageInventoryMap.size()+"]条");
log.info("初始化料仓[" + cid + "]的库存信息[" + storageInventoryMap.size() + "]条");
inventoryMap.put(cid, storageInventoryMap);
return storageInventoryMap;
}
......@@ -599,10 +601,10 @@ public class DataCache {
* @param amount
* @return
*/
public int updateInventoryAmount(String cid,String partNumber,int amount){
if(amount != 0){
InventoryItem inventoryItem = getStorageInventoryByPartNumber(cid,partNumber);
if(inventoryItem == null){
public int updateInventoryAmount(String cid, String partNumber, int amount) {
if (amount != 0) {
InventoryItem inventoryItem = getStorageInventoryByPartNumber(cid, partNumber);
if (inventoryItem == null) {
inventoryItem = new InventoryItem();
inventoryItem.setPartNumber(partNumber);
}
......@@ -616,46 +618,48 @@ public class DataCache {
/**
* 修改库存,出库为负,入库为正
*/
public int updateInventory(StoragePos pos, Barcode barcode){
public int updateInventory(StoragePos pos, Barcode barcode) {
Storage storage = getStorageById(pos.getStorageId());
String cid = storage.getCid();
String partNumber = barcode.getPartNumber();
int amount = 0;
String sizeStr = pos.getSizeStr();
if(pos.getBarcode() == null){
if (pos.getBarcode() == null) {
//出库
amount = - barcode.getAmount();
amount = -barcode.getAmount();
storage.emptyOnePos(pos);
updateSpUsePosCount(storage, pos, -1);
removeUsedPosNameList(cid, pos.getPosName());
}else{
} else {
//入库
amount = barcode.getAmount();
storage.useOnePos(pos);
updateSpUsePosCount(storage, pos, 1);
addUsedPosNameList(cid, pos.getPosName());
//入库单处理
if(ObjectUtil.isNotEmpty(storage.getInListName())){
inListCache.UpdateInList(storage.getInListName(),pos,barcode);
if (ObjectUtil.isNotEmpty(storage.getInListName())) {
inListCache.UpdateInList(storage.getInListName(), pos, barcode);
}
}
allStorage.put(cid, storage);
return updateInventoryAmount(cid,partNumber,amount);
return updateInventoryAmount(cid, partNumber, amount);
}
private void updateStorageInventory(String cid, InventoryItem inventoryItem){
private void updateStorageInventory(String cid, InventoryItem inventoryItem) {
Map<String, InventoryItem> storageInventory = inventoryMap.get(cid);
storageInventory.put(inventoryItem.getPartNumber(), inventoryItem);
inventoryMap.put(cid, storageInventory);
}
public List<String> getCidsByGroupId(String groupId,boolean nullReturnAll){
public List<String> getCidsByGroupId(String groupId, boolean nullReturnAll) {
if(groupId!=null&&groupId.equals("-1")){
groupId="";
if (groupId != null && groupId.equals("-1")) {
groupId = "";
}
List<String> cidList = Lists.newArrayList();
for (Storage storage : getAllStorage().values()) {
if (groupId!=null) {
if (groupId != null) {
// String storageGroupId = storage.getGroupId();
// if(ObjectUtils.isEmpty(storageGroupId)){
// storageGroupId="";
......@@ -663,48 +667,48 @@ public class DataCache {
// if ( storageGroupId.equals(groupId)) {
// cidList.add(storage.getCid());
// }
if(storage.IsRightGroup(groupId)){
if (storage.IsRightGroup(groupId)) {
cidList.add(storage.getCid());
}
} else if(nullReturnAll){
} else if (nullReturnAll) {
cidList.add(storage.getCid());
}
}
return cidList;
}
public List<String> getStorageIdsByGroupId(String groupId,boolean nullReturnAll){
public List<String> getStorageIdsByGroupId(String groupId, boolean nullReturnAll) {
if(groupId!=null&&groupId.equals("-1")){
groupId="";
if (groupId != null && groupId.equals("-1")) {
groupId = "";
}
List<String> storageIds = Lists.newArrayList();
for (Storage storage : getAllStorage().values()) {
if (groupId!=null) {
if(storage.IsRightGroup(groupId)){
if (groupId != null) {
if (storage.IsRightGroup(groupId)) {
storageIds.add(storage.getId());
}
} else if(nullReturnAll){
} else if (nullReturnAll) {
storageIds.add(storage.getId());
}
}
return storageIds;
}
public void clearGroup(String groupId){
if(ObjectUtil.isEmpty(groupId)||groupId.equals("-1")){
public void clearGroup(String groupId) {
if (ObjectUtil.isEmpty(groupId) || groupId.equals("-1")) {
return;
}
for (String key :
allStorage.keySet()) {
if(allStorage.get(key).getGroupId().equals(groupId)){
if (allStorage.get(key).getGroupId().equals(groupId)) {
allStorage.get(key).setGroupId("");
}
}
}
public List<String> getAvailableStorageIds(){
public List<String> getAvailableStorageIds() {
List<String> availableStorageIds = new ArrayList<>();
for (Storage storage : getAllStorage().values()) {
StatusBean bean = DevicesStatusUtil.getStatusBean(storage.getCid());
......@@ -715,10 +719,10 @@ public class DataCache {
}
return availableStorageIds;
}
public List<String> getAvailableStorageIds(DeviceType deviceType){
public List<String> getAvailableStorageIds(DeviceType deviceType) {
List<String> availableStorageIds = new ArrayList<>();
for (Storage storage : getAllStorage().values()) {
if(storage.getType().equals(deviceType.name())) {
if (storage.getType().equals(deviceType.name())) {
StatusBean bean = DevicesStatusUtil.getStatusBean(storage.getCid());
if (bean == null || bean.timeOut() || !bean.isAvailable()) {
continue;
......@@ -728,7 +732,7 @@ public class DataCache {
}
return availableStorageIds;
}
public Storage AutoCreateStorage(String cid,String deviceType) {
public Storage AutoCreateStorage(String cid, String deviceType) {
//判断cid存在
Storage storage = null;
storage = getStorage(cid);
......@@ -751,14 +755,77 @@ public class DataCache {
storage = storageManager.save(storage);
reloadStorage(storage, "");
log.info("AutoCreateStorage :自动创建料仓完成:cid["+storage.getCid()+"]name["+storage.getName()+"]type["+storage.getType()+"]");
log.info("AutoCreateStorage :自动创建料仓完成:cid[" + storage.getCid() + "]name[" + storage.getName() + "]type[" + storage.getType() + "]");
return storage;
}
public int getPNsluggishDay(String pn){
Component component = componentManager.findOneByPN(pn);
if(component!=null){
return component.getSluggishDay();
}
return 0;
public int getPNsluggishDay(String pn) {
Component component = componentManager.findOneByPN(pn);
if (component != null) {
return component.getSluggishDay();
}
return 0;
}
public Storage getOneStorageByType(DeviceType type) {
//查找mimo的cid
String cid = "";
DeviceType[] types = new DeviceType[]{type};
for (Storage storage :
allStorage.values()) {
if (storage.isType(types)) {
return storage;
}
}
return null;
}
public void updateSpUsePosCount(Storage storage, StoragePos pos, int addCount) {
try {
if (!storage.isSolderPaste()) {
return;
}
String cid = storage.getCid();
String type = pos.isWarmPos() ? warmPosUseCount : coldingPosUseCount;
if (!spUsedPosCountMap.containsKey(cid)) {
LoadStorageUsePosCount(cid);
}
Map<String, Integer> map = spUsedPosCountMap.get(cid);
Integer value = map.get(type) + addCount;
map.put(type, value);
spUsedPosCountMap.put(cid, map);
} catch (Exception ex) {
log.error("updateSpUsePosCount " + storage.getCid() + "," + pos.getPosName() + "," + addCount + " 出错:" + ex.getMessage());
}
}
private void LoadStorageUsePosCount(String cid) {
Storage storage = getStorage(cid);
int waramCount = 0;
int coldingCount = 0;
if (ObjectUtil.isNotEmpty(storage)) {
List<StoragePos> allPos = storagePosManager.findUsedPosNameByStorageId(storage.getId());
for (StoragePos pos :
allPos) {
if (pos.isWarmPos()) {
waramCount++;
} else {
coldingCount++;
}
}
}
Map<String, Integer> map = new HashMap<>();
map.put(warmPosUseCount, waramCount);
map.put(coldingPosUseCount, coldingCount);
spUsedPosCountMap.put(cid, map);
}
public Integer getSpUsePosCount(String cid, String type) {
if (!spUsedPosCountMap.containsKey(cid)) {
LoadStorageUsePosCount(cid);
}
Map<String, Integer> map = spUsedPosCountMap.get(cid);
return map.get(type);
}
}
......@@ -99,7 +99,7 @@ public class InListController {
if (inListItems.size() <= 0) {
continue;
}
InList inList = new InList(name, INLIST_STATUS.WAIT, inListItems);
InList inList = new InList(name, INLIST_STATUS.WAIT, inListItems,0L);
InList dbList = inListManager.findByName(name);
if (dbList != null) {
......
......@@ -26,4 +26,8 @@ public class InList extends BasePo implements Serializable {
private List<InListItem> inListItems;
/**
* 开始入库单入库时间,超时需要发送邮件
*/
private long startTime=0L;
}
......@@ -2,7 +2,6 @@ package com.neotel.smfcore.core.kanban.rest;
import cn.hutool.core.util.ObjectUtil;
import com.google.common.base.Strings;
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;
......@@ -23,20 +22,16 @@ import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.service.manager.impl.DataLogManagerImpl;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.service.po.Humiture;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import com.neotel.smfcore.security.annotation.AnonymousPutMapping;
import com.neotel.smfcore.security.service.manager.IGroupManager;
import com.neotel.smfcore.security.service.manager.impl.GroupManagerImpl;
import com.neotel.smfcore.security.service.manager.impl.UserManagerImpl;
import com.neotel.smfcore.security.service.po.Group;
import com.neotel.smfcore.security.service.po.User;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import javafx.concurrent.Task;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -44,7 +39,6 @@ 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.security.access.prepost.PreAuthorize;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
......@@ -470,6 +464,13 @@ public class BoxKanbanController {
}
}
}
//如果是锡膏料仓,需要把回温区物料数量,冷藏区物料数量显示
if(storage.isSolderPaste()){
Integer warmUseCount=dataCache.getSpUsePosCount(storage.getCid(),DataCache.warmPosUseCount);
Integer coldingUseCount=dataCache.getSpUsePosCount(storage.getCid(),DataCache.coldingPosUseCount);
boxDto.getData().put(DataCache.warmPosUseCount,warmUseCount.toString());
boxDto.getData().put(DataCache.warmPosUseCount,coldingUseCount.toString());
}
return boxDto;
}
......
......@@ -17,7 +17,6 @@ import java.util.List;
import java.util.Map;
@Controller
@RequestMapping("/rest/api/micron")
@Slf4j
public class MicronApi extends BaseSmfApiListener {
......
......@@ -17,6 +17,10 @@ import java.util.*;
*/
@Slf4j
public class Micron20031Api {
public static String MODE_DISABLE_SAP="DISABLE_SAP";
public static String MODE_DISABLE_MAM="DISABLE_MAM";
public static String MODE_DISABLE_MAM_AND_SAP="DISABLE_MAM_AND_SAP";
public static String MODE_ENABLE_MAM_SAP="ENABLE_MAM_SAP";
private static String AUTH_TOKEN = "";
......@@ -151,19 +155,24 @@ public class Micron20031Api {
* //Input: MatReqNo, MaterialType
* //Output: MatReqNo, Micron Part Number, Lot No, Quantity, UnitOfMeasures, MaterialType, Message, Status
*/
public static DepositMatReqBean getMatReqDetail(String matReqNo) throws ApiException {
public static List<DepositMatReqBean> getMatReqDetail(String matReqNo) throws ApiException {
//pnMap的key为pn, value为库存数量
String getMatReqDetailUrl = "";
String auth = getAuthToken();
Map<String,Object> dataMap = new HashMap<>();
dataMap.put("MatReqNo",matReqNo);
dataMap.put("MaterialType",MATERIAL_TYPE);
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("MatReqNo", matReqNo);
dataMap.put("MaterialType", MATERIAL_TYPE);
log.info("调用MES接口 getMatReqDetail,参数:"+JsonUtil.toJsonStr(dataMap));
log.info("调用MES接口 getMatReqDetail,参数:" + JsonUtil.toJsonStr(dataMap));
String resultStr = HttpHelper.postJsonWithAuth(getMatReqDetailUrl, dataMap, auth);
log.info("调用MES接口 getMatReqDetail 返回:" + resultStr);
DepositMatReqBean depositMatReqBean = JsonUtil.toObj(resultStr,DepositMatReqBean.class);
return depositMatReqBean;
Map<String, Object> resultMap = JsonUtil.toMap(resultStr);
List<DepositMatReqBean> beans = new ArrayList<>();
if (resultMap.containsKey("materialDocList")) {
beans = (List<DepositMatReqBean>) resultMap.get("materialDocList");
}
// DepositMatReqBean depositMatReqBean = JsonUtil.toObj(resultStr,DepositMatReqBean.class);
return beans;
}
/**
......
package com.neotel.smfcore.custom.micron20031;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.exception.ApiException;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.api.bean.CodeValidateParam;
import com.neotel.smfcore.core.api.listener.BaseSmfApiListener;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.inList.enums.INLIST_STATUS;
import com.neotel.smfcore.core.inList.service.po.InList;
import com.neotel.smfcore.core.inList.util.InListCache;
import com.neotel.smfcore.core.storage.service.po.Storage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import javax.swing.text.html.InlineView;
@Slf4j
public class MicronSpApiListener extends BaseSmfApiListener {
@Autowired
private InListCache inListCache;
@Override
public boolean isForThisApi(String apiName) {
return false;
}
@Override
public Barcode canPutInAfterResolve(String inCheckUrl, CodeValidateParam params, Barcode barcode) throws ValidateException {
//判断是否是入库单入库
for (Storage storage :
params.getStorageList()) {
if (ObjectUtil.isNotEmpty(storage.getInListName())) {
//如果入库单还在执行中,验证是否可以入库
InList inList = inListCache.getInList(storage.getInListName());
if (inList.getStatus() < INLIST_STATUS.WAIT) {
try {
Barcode resultBarcode = Micron20031Api.depositCreateMA(barcode, params.getLoginUser());
if(resultBarcode!=null){
return resultBarcode;
}
} catch (ApiException apiException) {
log.error("MicronSpApiListener canPutInAfterResolve depositCreateMA error: " + apiException.getMessage());
return null;
}
}
//普通入库验证 调用return
try {
Barcode resultBarcode = Micron20031Api.returnMaterial(barcode, Micron20031Api.MODE_ENABLE_MAM_SAP, params.getLoginUser());
if(resultBarcode!=null){
return resultBarcode;
}
} catch (ApiException apiException) {
log.error("MicronSpApiListener canPutInAfterResolve returnMaterial error: " + apiException.getMessage());
return null;
}
}
}
return null;
}
}
......@@ -53,6 +53,10 @@ public class MicronSpController {
Integer used = 0;
if (pos.isUsed()) {
used = 1;
boolean AuthoriseNg= pos.getBarcode().getAppendData("AuthoriseNg") ;
if(AuthoriseNg){
used=2;
}
}
// used=1;
......
package com.neotel.smfcore.custom.micron20031;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ApiException;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.inList.rest.bean.dto.InListDto;
import com.neotel.smfcore.core.inList.rest.bean.mapstruct.InListMapper;
import com.neotel.smfcore.core.inList.service.manager.IInListManager;
import com.neotel.smfcore.core.inList.service.po.InList;
import com.neotel.smfcore.core.inList.service.po.InListItem;
import com.neotel.smfcore.core.inList.util.InListCache;
import com.neotel.smfcore.core.storage.enums.DeviceType;
import com.neotel.smfcore.core.storage.service.manager.IStorageManager;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.custom.micron20031.bean.DepositMatReqBean;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@RestController
@Api(tags = "20031:load Desposit/Return")
@RequestMapping("/rest/micron/sp")
public class MicronSpLoadController {
@Autowired
private InListCache inListCache;
@Autowired
private IInListManager inListManager;
@Autowired
private InListMapper inListMapper;
@Autowired
private IStorageManager storageManager;
@Autowired
private DataCache dataCache;
@ApiOperation("获取入库单详情")
@GetMapping(value = "/desposit/getMatReqDetail")
public ResultBean getMatReqDetail(String matReqNo) {
if (ObjectUtil.isEmpty(matReqNo)) {
return ResultBean.newOkResult(null);
}
try {
//先查询入库单是否存在
InList inList = inListCache.getInList(matReqNo);
if (inList == null) {
List<DepositMatReqBean> beans = Micron20031Api.getMatReqDetail(matReqNo);
inList = new InList();
inList.setName(matReqNo);
List<InListItem> items = new ArrayList<>();
for (DepositMatReqBean bean :
beans) {
InListItem item = new InListItem();
item.setPN(bean.getMicronPN());
item.setNum(bean.getQuantity());
item.setName(matReqNo);
items.add(item);
}
inList.setInListItems(items);
log.info("load 获取到入库单:" + inList.getName() + ",共" + items.size() + "条工单详情");
inList = inListManager.createWithItems(inList);
inListCache.addInListToMap(inList);
//保存入库单
// return ResultBean.newOkResult(reqBean);
}
InListDto inListDto = inListMapper.toDto(inList);
return ResultBean.newOkResult(inListDto);
} catch (ApiException e) {
return ResultBean.newErrorResult(1, e.getMessage(), e.getMessage());
}
}
@ApiOperation("开始入库单 入库")
@RequestMapping(value = "/desposit/start")
public ResultBean startDesposit(String matReqNo) {
InList inList = inListCache.getInList(matReqNo);
if (inList == null) {
return ResultBean.newErrorResult(-1, "smfcore.micron.operationFailure", "操作失败");
}
Storage storage = dataCache.getOneStorageByType(DeviceType.AUTO);
if (storage == null) {
//未找到料仓,无法开始入库
return ResultBean.newErrorResult(-1, "smfcore.micron.operationFailure", "操作失败");
}
inList.setStartTime(System.currentTimeMillis());
inListManager.save(inList);
inListCache.addInListToMap(inList);
storage.setInListName(matReqNo);
log.info("设置料仓[" + storage.getName() + "]的入库单为:[" + matReqNo + "],同时更新入库单开始时间");
storageManager.save(storage);
dataCache.reloadStorage(storage, storage.getCid());
return ResultBean.newOkResult(matReqNo);
}
@ApiOperation("开始回库 ")
@RequestMapping(value = "/return/start")
public ResultBean startReturn() {
Storage storage = dataCache.getOneStorageByType(DeviceType.AUTO);
if (storage == null) {
//未找到料仓,无法开始入库
return ResultBean.newErrorResult(-1, "smfcore.micron.operationFailure", "操作失败");
}
storage.setInListName("");
log.info("设置料仓[" + storage.getName() + "]开始 return ");
storageManager.save(storage);
dataCache.reloadStorage(storage, storage.getCid());
return ResultBean.newOkResult("");
}
}
package com.neotel.smfcore.custom.micron20031;
import com.google.common.base.Strings;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ApiException;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.storage.rest.dto.StoragePosDto;
import com.neotel.smfcore.core.storage.rest.mapstruct.StoragePosMapper;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Storage;
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.ApiOperation;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@Slf4j
@RestController
@Api(tags = "20031:Unload Withdraw_new/Withdraw_Offline/Removal")
@RequestMapping("/rest/micron/sp")
public class MicronSpUnloadController {
@Autowired
private DataCache dataCache;
@Autowired
private TaskService taskService;
@Autowired
private IStoragePosManager storagePosManager;
@Autowired
private StoragePosMapper storagePosMapper;
@ApiOperation("出库:Withdraw Offline GetEquipIDList")
@GetMapping(value = "/unload/offlineIdList")
public ResultBean getEquipIdList() {
try {
List<String> equipIdList = Micron20031Api.getEquipIDList();
return ResultBean.newOkResult(equipIdList);
} catch (ApiException e) {
return ResultBean.newErrorResult(1, e.getMessage(), e.getMessage());
}
}
@ApiOperation("出库:Withdraw Offline GetMicronPN")
@GetMapping(value = "/unload/getMicronPN")
public ResultBean GetMicronPN(String lotId,String lineId) {
try {
String pn = Micron20031Api.getMicronPN(lotId, lineId);
//根据PN查找对应的物料,验证成功后返回
Criteria c = Criteria.where("used").is(true);
c.and("barcode.partNumber").is(pn);
c.and("barcode.appendData.AuthoriseNg").ne(true);
List<StoragePos> posList = storagePosManager.findByQuery(new Query(c));
for (StoragePos pos :
posList) {
try {
//验证
Micron20031Api.chkAuthoriseToDispatch(pos.getBarcode(), Micron20031Api.MODE_ENABLE_MAM_SAP, SecurityUtils.getCurrentUsername());
log.info("unload/getMicronPN [" + pn + "] barcode [" + pos.getBarcode().getBarcode() + "] chkAuthoriseToDispatch 成功");
StoragePosDto dto = storagePosMapper.toDto(pos);
return ResultBean.newOkResult(dto);
} catch (ApiException ex) {
log.error("unload/getMicronPN [" + pn + "] barcode [" + pos.getBarcode().getBarcode() + "] chkAuthoriseToDispatch 失败:" + ex.toString());
//需要标记此物料
Barcode barcode = pos.getBarcode();
barcode.updateAppendData("AuthoriseNg", true);
pos.setBarcode(barcode);
storagePosManager.save(pos);
log.info("unload/getMicronPN [" + pn + "] barcode [" + pos.getBarcode().getBarcode() + "] 标记为NG");
}
}
return ResultBean.newOkResult(pn);
} catch (ApiException e) {
return ResultBean.newErrorResult(1, e.getMessage(), e.getMessage());
}
}
@ApiOperation("开始出库")
@PutMapping("/unload/checkout")
public ResultBean checkout( @RequestBody Map<String,String> params) {
String posName = params.get("posName");
StoragePos pos = storagePosManager.getByPosName(posName);
if (pos == null) {
return ResultBean.newErrorResult(-1, "smfcore.micron.operationFailure", "操作失败");
}
Storage storage = dataCache.getStorageById(pos.getStorageId());
if (storage == null) {
throw new ValidateException("smfcore.valueNotExist", "{0}[{1}]不存在", new String[]{"storageId", pos.getStorageId()});
}
log.info("出库料仓【" + storage.getName() + "_" + storage.getCid() + "】位置仓位【" + pos.getPosName() + "】");
String outResult = taskService.checkout(storage, pos, true, SecurityUtils.getCurrentUsername());
if (!Strings.isNullOrEmpty(outResult)) {
throw new ValidateException("smfcore.error", outResult);
}
return ResultBean.newOkResult("");
}
}
package com.neotel.smfcore.custom.micron20031.bean;
package com.neotel.smfcore.custom.micron20031.bean.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
......
package com.neotel.smfcore.custom.micron20031.bean;
package com.neotel.smfcore.custom.micron20031.bean.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
......
package com.neotel.smfcore.custom.micron20031.bean;
package com.neotel.smfcore.custom.micron20031.bean.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
......
package com.neotel.smfcore.custom.micron20031.bean;
package com.neotel.smfcore.custom.micron20031.bean.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
......
package com.neotel.smfcore.custom.micron20031.bean.dto;
import com.neotel.smfcore.core.barcode.rest.bean.dto.BarcodeDto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SpUnloadDto {
@ApiModelProperty("库位ID")
private String id;
@ApiModelProperty("料仓ID")
private String storageId;
@ApiModelProperty("库位号")
private String posName;
@ApiModelProperty("条码")
private String barcode;
@ApiModelProperty("物料编号")
private String partNumber;
@ApiModelProperty("数量")
private int num;
@ApiModelProperty("出库结果,默认1=成功,0=失败")
private int unloadState = 1;
}
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!