Commit f13d7263 sunke

1 数据库连接池配置

2 优化挑料速度
1 个父辈 211a0cdc
...@@ -4,6 +4,7 @@ import com.mongodb.client.result.DeleteResult; ...@@ -4,6 +4,7 @@ import com.mongodb.client.result.DeleteResult;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
...@@ -23,6 +24,7 @@ import java.util.regex.Pattern; ...@@ -23,6 +24,7 @@ import java.util.regex.Pattern;
*/ */
public abstract class AbstractBaseDao implements IBaseDao { public abstract class AbstractBaseDao implements IBaseDao {
@Autowired @Autowired
@Qualifier("mongoTemplate")
private MongoTemplate mongoTemplate; private MongoTemplate mongoTemplate;
private final static int DEFAULT_PAGE_SIZE = 10; private final static int DEFAULT_PAGE_SIZE = 10;
protected final transient Logger log = LogManager.getLogger(getClass()); protected final transient Logger log = LogManager.getLogger(getClass());
......
...@@ -45,7 +45,7 @@ public class DataInitManager { ...@@ -45,7 +45,7 @@ public class DataInitManager {
MainTimer mainTimer; MainTimer mainTimer;
//@Value("${menu.show}") //@Value("${menu.show}")
private String[] menuShowList = new String[]{"mslOut"}; private String[] menuShowList = new String[]{/*"commonIn","returnIn","cutIn"*/};
//@Value("${menu.hide}") //@Value("${menu.hide}")
private String[] menuHideList = new String[]{}; private String[] menuHideList = new String[]{};
...@@ -125,8 +125,6 @@ public class DataInitManager { ...@@ -125,8 +125,6 @@ public class DataInitManager {
private Map<String,Menu> getAllMenuMap() { private Map<String,Menu> getAllMenuMap() {
List<Menu> menus = new ArrayList<Menu>();
Map<String,Menu> functionMenuMap = new HashMap<>(); Map<String,Menu> functionMenuMap = new HashMap<>();
//物料管理:工单出库,查找出库(UID出库,PN出库),物料标签,料盒操作,出库策略,工单设置 //物料管理:工单出库,查找出库(UID出库,PN出库),物料标签,料盒操作,出库策略,工单设置
...@@ -135,22 +133,27 @@ public class DataInitManager { ...@@ -135,22 +133,27 @@ public class DataInitManager {
Menu out = Menu.CreatePMenu("查找出库", 20, "searchOut", 2, "findOut",poutOut); Menu out = Menu.CreatePMenu("查找出库", 20, "searchOut", 2, "findOut",poutOut);
addNewFunctionMenu(out,new ArrayList<Menu>(), 1, "checkOut", "UID出库", 1, "singleOuput", "neolight/singleOuput/index", "", 0, "export1",functionMenuMap); addNewFunctionMenu(out,new ArrayList<Menu>(), 1, "checkOut", "UID出库", 1, "singleOuput", "neolight/singleOuput/index", "", 0, "export1",functionMenuMap);
addNewFunctionMenu(out,new ArrayList<Menu>(), 1, "tacticsOuput", "PN出库", 1, "tacticsOuput", "neolight/tacticsOuput/index", "", 0, "tacticsOuput",functionMenuMap); addNewFunctionMenu(out,new ArrayList<Menu>(), 1, "tacticsOuput", "PN出库", 1, "tacticsOuput", "neolight/tacticsOuput/index", "", 0, "tacticsOuput",functionMenuMap);
addNewFunctionMenu(out,new ArrayList<Menu>(), 1, "mslOut", "湿敏管理", 1, "mslOut", "neolight/mslOut/index", "", 0, "tacticsOuput",functionMenuMap); addNewFunctionMenu(poutOut,new ArrayList<Menu>(), 1, "mslOut", "湿敏管理", 1, "mslOut", "neolight/mslOut/index", "", 0, "tacticsOuput",functionMenuMap);
addNewFunctionMenu(poutOut,new ArrayList<Menu>(), 1, "posOutput", "库位出库", 1, "posOutput", "system/posOutput/index", "", 0, "swagger",functionMenuMap);
addNewFunctionMenu(out,new ArrayList<Menu>(), 1, "posOutput", "库位出库", 1, "posOutput", "system/posOutput/index", "", 0, "swagger",functionMenuMap); addNewFunctionMenu(poutOut,new ArrayList<Menu>(), 1, "labelOuput", "物料标签", 1, "labelOuput", "neolight/labelOuput/index", "", 0, "mgroup",functionMenuMap);
addNewFunctionMenu(poutOut,new ArrayList<Menu>(), 1, "materialBox", "料盒操作", 1, "materialBox", "neolight/materialBox/index", "", 0, "mIbox",functionMenuMap);
addNewFunctionMenu(poutOut,new ArrayList<Menu>(), 1, "outSetting", "出库策略", 1, "outSetting", "system/outSetting/index", "", 0, "outSet",functionMenuMap);
addNewFunctionMenu(poutOut,new ArrayList<Menu>(), 1, "inList", "入库单", 1, "inList", "system/inList/index", "", 0, "headIcon",functionMenuMap);
addNewFunctionMenu(out,new ArrayList<Menu>(), 1, "labelOuput", "物料标签", 1, "labelOuput", "neolight/labelOuput/index", "", 0, "mgroup",functionMenuMap); addNewFunctionMenu(poutOut,new ArrayList<Menu>(), 1, "dumpWarehousing", "转储入库", 1, "dumpWarehousing", "system/dumpWarehousing/index", "", 0, "dumpWarehousing",functionMenuMap);
addNewFunctionMenu(out,new ArrayList<Menu>(), 1, "materialBox", "料盒操作", 1, "materialBox", "neolight/materialBox/index", "", 0, "mIbox",functionMenuMap); addNewFunctionMenu(poutOut,new ArrayList<Menu>(), 1, "singleDiskWarehousing", "单盘入库", 1, "singleDiskWarehousing", "system/singleDiskWarehousing/index", "", 0, "singleDiskWarehousing",functionMenuMap);
addNewFunctionMenu(out,new ArrayList<Menu>(), 1, "outSetting", "出库策略", 1, "outSetting", "system/outSetting/index", "", 0, "outSet",functionMenuMap);
addNewFunctionMenu(out,new ArrayList<Menu>(), 1, "inList", "入库单", 1, "inList", "system/inList/index", "", 0, "headIcon",functionMenuMap);
addNewFunctionMenu(out,new ArrayList<Menu>(), 1, "dumpWarehousing", "转储入库", 1, "dumpWarehousing", "system/dumpWarehousing/index", "", 0, "dumpWarehousing",functionMenuMap); addNewFunctionMenu(poutOut,new ArrayList<Menu>(), 1, "commonIn", "普通入库", 1, "commonIn", "system/singleStockIn/index", "", 0, "singleDiskWarehousing",functionMenuMap);
addNewFunctionMenu(out,new ArrayList<Menu>(), 1, "singleDiskWarehousing", "单盘入库", 1, "singleDiskWarehousing", "system/singleDiskWarehousing/index", "", 0, "singleDiskWarehousing",functionMenuMap); addNewFunctionMenu(poutOut,new ArrayList<Menu>(), 1, "returnIn", "退料入库", 1, "returnIn", "system/singleStockIn/index", "", 0, "singleDiskWarehousing",functionMenuMap);
addNewFunctionMenu(out,new ArrayList<Menu>(), 1, "sluggishMaterials", "呆滞物料", 1, "sluggishMaterials", "system/sluggishMaterials/index", "", 0, "sMaterial",functionMenuMap); addNewFunctionMenu(poutOut,new ArrayList<Menu>(), 1, "cutIn", "截料入库", 1, "cutIn", "system/singleStockIn/index", "", 0, "singleDiskWarehousing",functionMenuMap);
addNewFunctionMenu(out,new ArrayList<Menu>(), 1, "safetyInventory", "安全库存", 1, "safetyInventory", "system/safetyInventory/index", "", 0, "safeInventory",functionMenuMap);
addNewFunctionMenu(out,new ArrayList<Menu>(), 1, "outList", "转储出库", 1, "outList", "system/outList/index", "", 0, "outList",functionMenuMap); addNewFunctionMenu(poutOut,new ArrayList<Menu>(), 1, "sluggishMaterials", "呆滞物料", 1, "sluggishMaterials", "system/sluggishMaterials/index", "", 0, "sMaterial",functionMenuMap);
addNewFunctionMenu(out,new ArrayList<Menu>(), 1, "orderSet", "齐套", 1, "orderSet", "system/orderSet/index", "", 0, "outS",functionMenuMap); addNewFunctionMenu(poutOut,new ArrayList<Menu>(), 1, "safetyInventory", "安全库存", 1, "safetyInventory", "system/safetyInventory/index", "", 0, "safeInventory",functionMenuMap);
addNewFunctionMenu(poutOut,new ArrayList<Menu>(), 1, "outList", "转储出库", 1, "outList", "system/outList/index", "", 0, "outList",functionMenuMap);
addNewFunctionMenu(poutOut,new ArrayList<Menu>(), 1, "orderSet", "齐套", 1, "orderSet", "system/orderSet/index", "", 0, "outS",functionMenuMap);
Menu orderM = Menu.CreatePMenu("工单管理", 20, "orderManager", 2, "orderManager", null); Menu orderM = Menu.CreatePMenu("工单管理", 20, "orderManager", 2, "orderManager", null);
addNewFunctionMenu(orderM,new ArrayList<Menu>(), 1, "billworkOrder", "工单", 1, "billworkOrder", "neolight/billworkOrder/index", "", 0, "orderOut",functionMenuMap); addNewFunctionMenu(orderM,new ArrayList<Menu>(), 1, "billworkOrder", "工单", 1, "billworkOrder", "neolight/billworkOrder/index", "", 0, "orderOut",functionMenuMap);
...@@ -245,24 +248,12 @@ public class DataInitManager { ...@@ -245,24 +248,12 @@ public class DataInitManager {
if(dbMenus.isEmpty()){ if(dbMenus.isEmpty()){
log.info("创建默认菜单..."); log.info("创建默认菜单...");
menuListToShow = new String[]{ menuListToShow = new String[]{
"lockMaterial", //设备看板 "searchOut","singleOuput","tacticsOuput","mslOut","inList","dumpWarehousing",
"singleOuput", "commonIn","returnIn","cutIn","sluggishMaterials","safetyInventory","outList","orderSet","billworkOrder",
"tacticsOuput", "reelOut", "orderSheet", "orderShortageOut", "orderShortageSheet", "productionLineReple","productionLineOut",
"outSetting", "componentParts","barcode","barcodeSetting","taskLog","message", "interfaceException",
"componentParts", "bunker","storagePos",
"barcode", "peoples","role","about"
"barcodeSetting",
"taskLog",
//"orderSetting",//工单设置
"inOutData", //报表->出入库
"inventory", //报表->库存
"bunker", //设备管理
"storagePos", //库位管理
//"sysSetting", //系统设置
"peoples", //用户管理
"role" //角色管理
}; };
} }
......
...@@ -80,6 +80,9 @@ public class DateUtil { ...@@ -80,6 +80,9 @@ public class DateUtil {
public static Date toDate(String strDate,String aMask) public static Date toDate(String strDate,String aMask)
throws ParseException { throws ParseException {
if(ObjectUtil.isEmpty(strDate)){
return null;
}
if(ObjectUtil.isEmpty(aMask)){ if(ObjectUtil.isEmpty(aMask)){
aMask="yyyy-MM-dd HH:mm:ss"; aMask="yyyy-MM-dd HH:mm:ss";
} }
......
...@@ -7,6 +7,7 @@ import org.springframework.data.mongodb.core.query.Query; ...@@ -7,6 +7,7 @@ import org.springframework.data.mongodb.core.query.Query;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
...@@ -19,6 +20,8 @@ public interface IComponentManager extends IBaseManager<Component> { ...@@ -19,6 +20,8 @@ public interface IComponentManager extends IBaseManager<Component> {
Component saveComponent(Component resources); Component saveComponent(Component resources);
List<Component> findByPN(Collection<String> pnList);
void deleteComponents(Set<String> ids); void deleteComponents(Set<String> ids);
int saveComponentList(List<Component> componentList); int saveComponentList(List<Component> componentList);
......
...@@ -98,6 +98,13 @@ public class ComponentManagerImpl implements IComponentManager { ...@@ -98,6 +98,13 @@ public class ComponentManagerImpl implements IComponentManager {
} }
@Override @Override
public List<Component> findByPN(Collection<String> pnList) {
Query query = new Query(Criteria.where("partNumber").in(pnList));
List<Component> components = componentDao.findByQuery(query);
return components;
}
@Override
public void deleteComponents(Set<String> ids) { public void deleteComponents(Set<String> ids) {
Query query = new Query(Criteria.where("id").in(ids)); Query query = new Query(Criteria.where("id").in(ids));
List<Component> components = componentDao.findByQuery(query); List<Component> components = componentDao.findByQuery(query);
......
...@@ -40,6 +40,8 @@ import org.springframework.web.bind.annotation.*; ...@@ -40,6 +40,8 @@ import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSession;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReentrantLock;
@Api(tags = "SHELF: NLP感应料架") @Api(tags = "SHELF: NLP感应料架")
@RestController @RestController
...@@ -129,6 +131,8 @@ public class NLPShelfHandler extends BaseDeviceHandler{ ...@@ -129,6 +131,8 @@ public class NLPShelfHandler extends BaseDeviceHandler{
return statusBean; return statusBean;
} }
private static Map<String,Boolean> processMap = new ConcurrentHashMap<>();
/** /**
* 客户端sensor变化 * 客户端sensor变化
*/ */
...@@ -141,7 +145,17 @@ public class NLPShelfHandler extends BaseDeviceHandler{ ...@@ -141,7 +145,17 @@ public class NLPShelfHandler extends BaseDeviceHandler{
if(storage == null){ if(storage == null){
return ResultBean.newErrorResult(-1,"smfcore.shelfNotExist", "{0}对应的料架不存在",new String[]{cid} ); return ResultBean.newErrorResult(-1,"smfcore.shelfNotExist", "{0}对应的料架不存在",new String[]{cid} );
} }
synchronized(storage){ synchronized (storage){
Boolean process = processMap.get(cid);
if(process == null){
processMap.put(cid, true);
}else{
String msg = "料架["+cid+"]的上一次请求还未完成,忽略本次请求";
return ResultBean.newErrorResult(-1,"smfcore.shelfNotExist", msg);
}
}
try{
//实际信号有料,数据库无信息 //实际信号有料,数据库无信息
String[] hasReelPosErrorList = request.getParameterValues("hasReelPosErrorList"); String[] hasReelPosErrorList = request.getParameterValues("hasReelPosErrorList");
//实际信号无料,数据库有信息 //实际信号无料,数据库有信息
...@@ -159,9 +173,9 @@ public class NLPShelfHandler extends BaseDeviceHandler{ ...@@ -159,9 +173,9 @@ public class NLPShelfHandler extends BaseDeviceHandler{
if(noReelPosErrorList.length>0){ if(noReelPosErrorList.length>0){
//log.info("开始检测noReelPosErrorList"); //log.info("开始检测noReelPosErrorList");
for (String noReelPosName : noReelPosErrorList) { for (String noReelPosName : noReelPosErrorList) {
if(usedPosNameList.contains(noReelPosName)){ if(!usedPosNameList.contains(noReelPosName)){
ngToOk.add(noReelPosName); ngToOk.add(noReelPosName);
log.info("sensorChange 客户端上传 noReelPosErrorList 库位["+noReelPosName+"]数据库无物料,放入ngToOk"); log.info(cid + "sensorChange 客户端上传 noReelPosErrorList 库位["+noReelPosName+"]数据库无物料,放入ngToOk");
} }
} }
} }
...@@ -178,12 +192,12 @@ public class NLPShelfHandler extends BaseDeviceHandler{ ...@@ -178,12 +192,12 @@ public class NLPShelfHandler extends BaseDeviceHandler{
String[] hasReelPosList = request.getParameterValues("hasReelPosList"); String[] hasReelPosList = request.getParameterValues("hasReelPosList");
if(hasReelPosList != null){ if(hasReelPosList != null){
log.info("开始检测hasReelPosList"); log.info(cid+"开始检测hasReelPosList");
Set<String> disabledPosNameSet = dataCache.getDisabledPosNameSet(); Set<String> disabledPosNameSet = dataCache.getDisabledPosNameSet();
List<String> newList=new ArrayList<>(); List<String> newList=new ArrayList<>();
for (String posName : hasReelPosList) { for (String posName : hasReelPosList) {
if(disabledPosNameSet.contains(posName)){ if(disabledPosNameSet.contains(posName)){
log.info("sensorChange hasReelPosList [" + posName + "]库位被禁用,忽略"); log.info(cid + "sensorChange hasReelPosList [" + posName + "]库位被禁用,忽略");
continue; continue;
} }
newList.add(posName); newList.add(posName);
...@@ -193,20 +207,20 @@ public class NLPShelfHandler extends BaseDeviceHandler{ ...@@ -193,20 +207,20 @@ public class NLPShelfHandler extends BaseDeviceHandler{
//入库的库位列表 //入库的库位列表
if(hasReelPosList.length > 1){ if(hasReelPosList.length > 1){
String msg = "不可同时放入多盘物料:"+ String.join(",",hasReelPosList); String msg = cid + "不可同时放入多盘物料:"+ String.join(",",hasReelPosList);
log.error(msg); log.error(msg);
for (String posStr : hasReelPosList) { for (String posStr : hasReelPosList) {
inNgList.add(posStr); inNgList.add(posStr);
} }
}else if (hasReelPosList.length==1){ }else if (hasReelPosList.length==1){
log.info("开始检测执行入库"); log.info(cid + "开始检测执行入库到库位:["+hasReelPosList[0]+"]");
StoragePos pos = storagePosManager.getByPosName(hasReelPosList[0]); StoragePos pos = storagePosManager.getByPosName(hasReelPosList[0]);
if(pos == null){ if(pos == null){
String msg = "未找到库位:"+String.join(",",hasReelPosList) ; String msg = "未找到库位:"+String.join(",",hasReelPosList) ;
log.error(msg); log.error(msg);
} }
else if(!pos.getStorageId().equals(storage.getId())){ else if(!pos.getStorageId().equals(storage.getId())){
String msg = "["+storage.getName()+"]未找到库位:"+String.join(",",hasReelPosList) ; String msg = "["+ cid +"]未找到库位:"+String.join(",",hasReelPosList) ;
log.error(msg); log.error(msg);
} }
//如果库位有料,直接结束 //如果库位有料,直接结束
...@@ -214,7 +228,9 @@ public class NLPShelfHandler extends BaseDeviceHandler{ ...@@ -214,7 +228,9 @@ public class NLPShelfHandler extends BaseDeviceHandler{
log.info("料架[" + cid + "]入库库位[" + pos.getPosName() + "]已有料: [" + pos.getBarcode().getBarcode() + "]"); log.info("料架[" + cid + "]入库库位[" + pos.getPosName() + "]已有料: [" + pos.getBarcode().getBarcode() + "]");
} }
else{ else{
log.info(cid + "处理有料库位:["+pos.getPosName()+"]");
boolean posInResult = handlePosIn(storage,pos); boolean posInResult = handlePosIn(storage,pos);
log.info(cid + "处理有料库位:["+pos.getPosName()+"]完成,结果:" + posInResult);
if(posInResult){ if(posInResult){
inOkList.add(pos.getPosName()); inOkList.add(pos.getPosName());
}else{ }else{
...@@ -227,9 +243,10 @@ public class NLPShelfHandler extends BaseDeviceHandler{ ...@@ -227,9 +243,10 @@ public class NLPShelfHandler extends BaseDeviceHandler{
String[] noReelPosList = request.getParameterValues("noReelPosList"); String[] noReelPosList = request.getParameterValues("noReelPosList");
if(noReelPosList != null){ if(noReelPosList != null){
//出库 //出库
log.info("出库检测noReelPosList");
for (String noReelPosName : noReelPosList) { for (String noReelPosName : noReelPosList) {
log.info(cid + "处理无料库位:["+noReelPosName+"]");
boolean handleNoReelPosResult = handleNoReelPos(storage,usedPosNameList,noReelPosName); boolean handleNoReelPosResult = handleNoReelPos(storage,usedPosNameList,noReelPosName);
log.info(cid + "处理无料库位:["+noReelPosName+"]完成,结果:" + handleNoReelPosResult);
if(handleNoReelPosResult){ if(handleNoReelPosResult){
outOkList.add(noReelPosName); outOkList.add(noReelPosName);
}else{ }else{
...@@ -245,9 +262,13 @@ public class NLPShelfHandler extends BaseDeviceHandler{ ...@@ -245,9 +262,13 @@ public class NLPShelfHandler extends BaseDeviceHandler{
dataMap.put("outNgList",outNgList); dataMap.put("outNgList",outNgList);
dataMap.put("ngToOk",ngToOk); dataMap.put("ngToOk",ngToOk);
return ResultBean.newOkResult(dataMap); return ResultBean.newOkResult(dataMap);
}catch (Exception e){
String msg = "料架["+cid+"]处理sensorChange异常";
log.error(msg,e);
return ResultBean.newErrorResult(-1,"smfcore.sensorChangeError", msg);
}finally {
processMap.remove(cid);
} }
} }
/** /**
...@@ -282,7 +303,7 @@ public class NLPShelfHandler extends BaseDeviceHandler{ ...@@ -282,7 +303,7 @@ public class NLPShelfHandler extends BaseDeviceHandler{
queueTask.setStorageName(storage.getName()); queueTask.setStorageName(storage.getName());
try { try {
//入库完成,发送入库完成请求 //入库完成,发送入库完成请求
log.info("入库完成,发送入库完成请求"); log.info(queueTask.getBarcode() + "入库完成,发送入库完成请求");
super.finishedPutIn(storage.getCid(), pos.getPosName()); super.finishedPutIn(storage.getCid(), pos.getPosName());
String msg = queueTask.getBarcode() + "入库到" + pos.getPosName() + "成功"; String msg = queueTask.getBarcode() + "入库到" + pos.getPosName() + "成功";
log.info(msg); log.info(msg);
...@@ -315,7 +336,7 @@ public class NLPShelfHandler extends BaseDeviceHandler{ ...@@ -315,7 +336,7 @@ public class NLPShelfHandler extends BaseDeviceHandler{
return inResult; return inResult;
} }
} }
log.error("未找到["+pos.getPosName()+"]的入库任务"); log.warn("未找到["+pos.getPosName()+"]的入库任务");
return false; return false;
} }
......
...@@ -448,7 +448,22 @@ public class LiteOrderCache implements ITaskListener { ...@@ -448,7 +448,22 @@ public class LiteOrderCache implements ITaskListener {
List<String> excludePosIds = Lists.newArrayList(); List<String> excludePosIds = Lists.newArrayList();
excludePosIds.addAll(taskService.excludePosIds()); excludePosIds.addAll(taskService.excludePosIds());
List<String> outPosNameList = new ArrayList<>(); Set<String> pnList = new HashSet<>();
for (LiteOrderItem orderItem : cacheOrder.getOrderItems()) {
String pn = orderItem.getMaterialNo();
//需求数量
int needNum = orderItem.getQty() + orderItem.getIncrement() - orderItem.getTotalOutNum();
if (needNum <= 0) {
continue;
}
pnList.add(pn);
}
List<StoragePos> allAvailblePosList = storagePosManager.findOrderItemInStorage(availableStorageIds, pnList, excludePosIds);
Set<String> outPosNameList = new HashSet<>();
List<Component> componentList = componentManager.findByPN(pnList);
//获取此工单出库的所有物料 //获取此工单出库的所有物料
for (LiteOrderItem orderItem : cacheOrder.getOrderItems()) { for (LiteOrderItem orderItem : cacheOrder.getOrderItems()) {
...@@ -460,7 +475,12 @@ public class LiteOrderCache implements ITaskListener { ...@@ -460,7 +475,12 @@ public class LiteOrderCache implements ITaskListener {
} }
//查找PN的所有库存,PN=pn,未锁定,qty 从大到小,批次正序, 入库时间正序 //查找PN的所有库存,PN=pn,未锁定,qty 从大到小,批次正序, 入库时间正序
List<StoragePos> posList = storagePosManager.findOrderItemInStorage(availableStorageIds, pn, excludePosIds); List<StoragePos> posList = new ArrayList<>();
for (StoragePos storagePos : allAvailblePosList) {
if(storagePos.getBarcode().getPartNumber().equals(pn)){
posList.add(storagePos);
}
}
int targetNum = needNum; int targetNum = needNum;
List<StoragePos> outPosList = new ArrayList<>(); List<StoragePos> outPosList = new ArrayList<>();
...@@ -491,6 +511,7 @@ public class LiteOrderCache implements ITaskListener { ...@@ -491,6 +511,7 @@ public class LiteOrderCache implements ITaskListener {
//排除掉这些库位,以免重复挑取同一盘料 //排除掉这些库位,以免重复挑取同一盘料
for (StoragePos storagePos : outPosList) { for (StoragePos storagePos : outPosList) {
excludePosIds.add(storagePos.getId()); excludePosIds.add(storagePos.getId());
outPosNameList.add(storagePos.getPosName());
int reelAmount = storagePos.getBarcode().getAmount(); int reelAmount = storagePos.getBarcode().getAmount();
outNum = outNum + reelAmount; outNum = outNum + reelAmount;
} }
...@@ -507,7 +528,13 @@ public class LiteOrderCache implements ITaskListener { ...@@ -507,7 +528,13 @@ public class LiteOrderCache implements ITaskListener {
//判断是否需要截料 //判断是否需要截料
boolean needJieliao =false; boolean needJieliao =false;
//判断库存 使用最小库存盘数:当前盘数<=最小库存盘数时,需要截料 //判断库存 使用最小库存盘数:当前盘数<=最小库存盘数时,需要截料
Component component = componentManager.findOneByPN(pn); Component component = null;
for (Component c : componentList) {
if(c.getPartNumber().equals(pn)){
component = c;
break;
}
}
if(component != null){ if(component != null){
if(component.getMinStoreNum()>0&& posList.size() <=component.getMinStoreNum()){ if(component.getMinStoreNum()>0&& posList.size() <=component.getMinStoreNum()){
needJieliao=true; needJieliao=true;
...@@ -735,7 +762,7 @@ public class LiteOrderCache implements ITaskListener { ...@@ -735,7 +762,7 @@ public class LiteOrderCache implements ITaskListener {
* @param targetNum * @param targetNum
* @return * @return
*/ */
private List<StoragePos> pickBigOrderReels(String pn, List<String> outPosNameList, List<StoragePos> posList, int targetNum){ private List<StoragePos> pickBigOrderReels(String pn, Set<String> outPosNameList, List<StoragePos> posList, int targetNum){
List<String> excludePosNameList = new ArrayList<>(outPosNameList); List<String> excludePosNameList = new ArrayList<>(outPosNameList);
List<StoragePos> outPosList = new ArrayList<>(); List<StoragePos> outPosList = new ArrayList<>();
...@@ -813,7 +840,7 @@ public class LiteOrderCache implements ITaskListener { ...@@ -813,7 +840,7 @@ public class LiteOrderCache implements ITaskListener {
* @param targetNum * @param targetNum
* @return * @return
*/ */
private List<StoragePos> pickRepleReels(List<String> outPosNameList, List<StoragePos> posList, int targetNum){ private List<StoragePos> pickRepleReels(Set<String> outPosNameList, List<StoragePos> posList, int targetNum){
List<String> excludePosNameList = new ArrayList<>(outPosNameList); List<String> excludePosNameList = new ArrayList<>(outPosNameList);
List<StoragePos> itemPickPosList = new ArrayList<>(); List<StoragePos> itemPickPosList = new ArrayList<>();
boolean pickMaxQtyReel = false; boolean pickMaxQtyReel = false;
......
...@@ -155,12 +155,8 @@ public class OrderShortageController { ...@@ -155,12 +155,8 @@ public class OrderShortageController {
List<DataLog> taskList = new ArrayList<>(); List<DataLog> taskList = new ArrayList<>();
if (liteOrders.size() > 0) { if (liteOrders.size() > 0) {
LiteOrder liteOrder = liteOrders.get(0); LiteOrder liteOrder = liteOrders.get(0);
if (liteOrder.isNew() || liteOrder.isClosed()) {
throw new ValidateException("smfcore.order.notExecute", "工单[{0}]不在出库中", new String[]{liteOrder.getOrderNo()});
}
List<DataLog> allTasks = taskService.getAllTasks(); List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog datalog : for (DataLog datalog : allTasks) {
allTasks) {
if (datalog.isOrderTask() && datalog.getSourceId().equals(liteOrder.getId())) { if (datalog.isOrderTask() && datalog.getSourceId().equals(liteOrder.getId())) {
//判断是否是缺料出库 //判断是否是缺料出库
if (datalog.isAddOutbound()) { if (datalog.isAddOutbound()) {
......
...@@ -230,6 +230,21 @@ public class OutListCache implements ITaskListener { ...@@ -230,6 +230,21 @@ public class OutListCache implements ITaskListener {
Map<String, List<StoragePos>> needOutPosMap = new HashMap<>();//挑出的需要出库的料列表,key=itemId,value=库位 Map<String, List<StoragePos>> needOutPosMap = new HashMap<>();//挑出的需要出库的料列表,key=itemId,value=库位
List<String> itemPosNameList = new ArrayList<>(); List<String> itemPosNameList = new ArrayList<>();
Set<String> pnList = new HashSet<>();
for (OutListItem outListItem : outList.getOutListItems()) {
String pn = outListItem.getMaterialNo();
//需求数量
int needNum = outListItem.getDumpQty();
if (needNum <= 0) {
continue;
}
pnList.add(pn);
}
List<StoragePos> allAvailblePosList = storagePosManager.findOrderItemInStorage(availableStorageIds, pnList, taskService.excludePosIds());
List<Component> componentList = componentManager.findByPN(pnList);
//获取此转储出库单出库的所有物料 //获取此转储出库单出库的所有物料
for (OutListItem outListItem : outList.getOutListItems()) { for (OutListItem outListItem : outList.getOutListItems()) {
String pn = outListItem.getMaterialNo(); String pn = outListItem.getMaterialNo();
...@@ -239,7 +254,13 @@ public class OutListCache implements ITaskListener { ...@@ -239,7 +254,13 @@ public class OutListCache implements ITaskListener {
continue; continue;
} }
Component component = componentManager.findOneByPN(pn); Component component = null;
for (Component c : componentList) {
if(c.getPartNumber().equals(pn)){
component = c;
break;
}
}
if (component == null) { if (component == null) {
if(isShortageOut){ if(isShortageOut){
shortage=true; shortage=true;
...@@ -251,7 +272,12 @@ public class OutListCache implements ITaskListener { ...@@ -251,7 +272,12 @@ public class OutListCache implements ITaskListener {
} }
//查找PN的所有库存,PN=pn,未锁定,qty 从大到小,入库时间正序 //查找PN的所有库存,PN=pn,未锁定,qty 从大到小,入库时间正序
List<StoragePos> posList = storagePosManager.findOrderItemInStorage(availableStorageIds, pn, taskService.excludePosIds()); List<StoragePos> posList = new ArrayList<>();
for (StoragePos storagePos : allAvailblePosList) {
if(storagePos.getBarcode().getPartNumber().equals(pn)){
posList.add(storagePos);
}
}
log.info("共找到"+posList.size()+"盘"+pn+"的物料"); log.info("共找到"+posList.size()+"盘"+pn+"的物料");
int storageNum = 0; int storageNum = 0;
......
...@@ -69,5 +69,5 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> { ...@@ -69,5 +69,5 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
List<StoragePos> getSameSizeContinuityEmptyPosList(Storage storage, Barcode barcode) throws ValidateException; List<StoragePos> getSameSizeContinuityEmptyPosList(Storage storage, Barcode barcode) throws ValidateException;
List<StoragePos> findOrderItemInStorage( List<String> storageIdList, String pn, Collection<String> excludePosIds ); List<StoragePos> findOrderItemInStorage( List<String> storageIdList, Set<String> pnList, Collection<String> excludePosIds );
} }
...@@ -615,9 +615,11 @@ public class StoragePosManagerImpl implements IStoragePosManager { ...@@ -615,9 +615,11 @@ public class StoragePosManagerImpl implements IStoragePosManager {
return new ArrayList<>(); return new ArrayList<>();
} }
@Override @Override
public List<StoragePos> findOrderItemInStorage(List<String> storageIdList,String pn, Collection<String> excludePosIds ) { public List<StoragePos> findOrderItemInStorage(List<String> storageIdList,Set<String> pnList, Collection<String> excludePosIds ) {
Criteria c = Criteria.where("barcode.partNumber").is(pn) Criteria c = Criteria.where("barcode.partNumber").in(pnList)
.and("id").nin(excludePosIds) .and("id").nin(excludePosIds)
.and("enabled").is(true)//可用 .and("enabled").is(true)//可用
.and("barcode.lockId").is(null)//没有被锁定的仓位; .and("barcode.lockId").is(null)//没有被锁定的仓位;
...@@ -632,9 +634,9 @@ public class StoragePosManagerImpl implements IStoragePosManager { ...@@ -632,9 +634,9 @@ public class StoragePosManagerImpl implements IStoragePosManager {
//sort.and(Sort.by(Sort.Direction.ASC, "canCheckOutTime")); //sort.and(Sort.by(Sort.Direction.ASC, "canCheckOutTime"));
q.with(amountSort).with(batchSort); q.with(amountSort).with(batchSort);
List<StoragePos> posList = storagePosDao.findByQuery(q); List<StoragePos> posList = storagePosDao.findByQuery(q);
if (posList == null || posList.size() <= 0) { // if (posList == null || posList.size() <= 0) {
log.info("findOrderItemInStorage 挑料 partNumber=" + pn + ",未找到可以出库的物料 "); // log.info("findOrderItemInStorage 挑料未找到可以出库的物料 ");
} // }
return posList; return posList;
} }
......
package com.neotel.smfcore.hella.handler; //package com.neotel.smfcore.hella.handler;
//
import cn.hutool.core.util.ObjectUtil; //import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.bean.ResultBean; //import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException; //import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.barcode.service.po.Barcode; //import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.api.CodeValidateParam; //import com.neotel.smfcore.core.device.api.CodeValidateParam;
import com.neotel.smfcore.core.device.api.IOpAuthApi; //import com.neotel.smfcore.core.device.api.IOpAuthApi;
import com.neotel.smfcore.core.storage.service.po.Storage; //import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.hella.tcp.HellaTcpClient; //import com.neotel.smfcore.hella.tcp.HellaTcpClient;
import com.neotel.smfcore.hella.tcp.command.HellaReqCommand; //import com.neotel.smfcore.hella.tcp.command.HellaReqCommand;
import com.neotel.smfcore.hella.tcp.command.HellaRespCommand; //import com.neotel.smfcore.hella.tcp.command.HellaRespCommand;
import org.springframework.beans.factory.annotation.Autowired; //import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; //import org.springframework.stereotype.Service;
//
import java.util.ArrayList; //import java.util.ArrayList;
import java.util.List; //import java.util.List;
@Service //@Service
public class HellaApiHandler implements IOpAuthApi { //public class HellaApiHandler implements IOpAuthApi {
//
@Autowired // @Autowired
private HellaServiceHandler hellaServiceHandler; // private HellaServiceHandler hellaServiceHandler;
@Override // @Override
public Barcode resolveBarcode(CodeValidateParam param) throws ValidateException { // public Barcode resolveBarcode(CodeValidateParam param) throws ValidateException {
//
if (!isEnable()) { // if (!isEnable()) {
return null; // return null;
} // }
hellaServiceHandler.checkMaterial(param); // hellaServiceHandler.checkMaterial(param);
Barcode barcode = new Barcode(); // Barcode barcode = new Barcode();
barcode.setFullCode(param.getCode()); // barcode.setFullCode(param.getCode());
return barcode; // return barcode;
} // }
//
@Override // @Override
public Barcode canPutIn(Barcode barcode) throws ValidateException { // public Barcode canPutIn(Barcode barcode) throws ValidateException {
if (!isEnable()) { // if (!isEnable()) {
return null; // return null;
} // }
return barcode; // return barcode;
} // }
//
@Override // @Override
public boolean canCheckout(Barcode barcode) throws ValidateException { // public boolean canCheckout(Barcode barcode) throws ValidateException {
if(!isEnable()){ // if(!isEnable()){
return false; // return false;
} // }
return false; // return false;
} // }
//
@Override // @Override
public boolean isEnable() { // public boolean isEnable() {
return HellaTcpClient.isEnable(); // return HellaTcpClient.isEnable();
} // }
} //}
...@@ -330,6 +330,7 @@ public class HikApi { ...@@ -330,6 +330,7 @@ public class HikApi {
RequestParam info = new RequestParam(getReqCode(), userName, dataMap); RequestParam info = new RequestParam(getReqCode(), userName, dataMap);
HikApiRequest request = new HikApiRequest(5, url,config.key_5_putInApi,config.secret_5_putInApi, info); HikApiRequest request = new HikApiRequest(5, url,config.key_5_putInApi,config.secret_5_putInApi, info);
apiName = apiName +" ("+info.getReqCode()+") ";
log.info(apiName+" 发送 " + info.getData()); log.info(apiName+" 发送 " + info.getData());
try { try {
......
...@@ -74,8 +74,7 @@ public class HikvisionApiController { ...@@ -74,8 +74,7 @@ public class HikvisionApiController {
// msg string 提示消息 // msg string 提示消息
// data 返回数据 // data 返回数据
if (outInfos != null && outInfos.size() > 0) { if (outInfos != null && outInfos.size() > 0) {
for (HikOrderInfo outInfo : for (HikOrderInfo outInfo : outInfos) {
outInfos) {
//查找工单是否存在 //查找工单是否存在
String orderNo = outInfo.getJobNo(); String orderNo = outInfo.getJobNo();
......
package com.neotel.smfcore.security.config;
import lombok.Data;
@Data
public class CustomMongoProperties {
private String host;
private Integer port;
private String database;
private Integer maxConSize = 200;
private Integer minConSize = 100;
}
package com.neotel.smfcore.security.config;
import com.mongodb.MongoClientSettings;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.connection.ClusterConnectionMode;
import com.mongodb.connection.ClusterType;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class MongoDbConfig {
@Bean(name = "mongoProperties")
@ConfigurationProperties(prefix = "spring.data.mongodb")
protected CustomMongoProperties mongoProperties() {
return new CustomMongoProperties();
}
@Primary
@Bean(name = "mongoTemplate")
public MongoTemplate mongoTemplate(@Qualifier("mongoProperties") CustomMongoProperties mongoProperties) {
return new MongoTemplate(mongoDbFactory(mongoProperties));
}
private static MongoDatabaseFactory mongoDbFactory(CustomMongoProperties mongoProperties) {
ClusterConnectionMode clusterConnectionMode;
ClusterType clusterType;
List<ServerAddress> serverAddressList = new ArrayList<>();
clusterConnectionMode = ClusterConnectionMode.SINGLE;
clusterType = ClusterType.STANDALONE;
ServerAddress serverAddress = new ServerAddress(mongoProperties.getHost(), mongoProperties.getPort());
serverAddressList.add(serverAddress);
MongoClientSettings setting = MongoClientSettings.builder()
.applyToClusterSettings(builder ->
builder.hosts(serverAddressList)
.mode(clusterConnectionMode)
.requiredClusterType(clusterType)
).applyToConnectionPoolSettings(
builder ->
builder.maxSize(mongoProperties.getMaxConSize())
.minSize(mongoProperties.getMinConSize())
).build();
MongoClient mongoClient = MongoClients.create(setting);
return new SimpleMongoClientDatabaseFactory(mongoClient, mongoProperties.getDatabase());
}
}
\ No newline at end of file \ No newline at end of file
...@@ -93,7 +93,8 @@ spring: ...@@ -93,7 +93,8 @@ spring:
mongodb: mongodb:
host: localhost # 主机地址 host: localhost # 主机地址
port: 27017 # 端口 port: 27017 # 端口
database: hikvision20220801 # 数据库 database: hikvision # 数据库
messages: messages:
encoding: utf-8 encoding: utf-8
main: main:
......
...@@ -6,10 +6,10 @@ ...@@ -6,10 +6,10 @@
</Properties> </Properties>
<appenders> <appenders>
<Console name="Console" target="SYSTEM_OUT"> <Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5level [%file:%line] - %msg%n"/> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%file:%line] - %msg%n"/>
</Console> </Console>
<RollingFile name="log" fileName="${LOG_HOME}/${LOG_NAME}" filePattern="${LOG_HOME}/%d{yyyy-MM-dd}.${LOG_NAME}" append="true"> <RollingFile name="log" fileName="${LOG_HOME}/${LOG_NAME}" filePattern="${LOG_HOME}/%d{yyyy-MM-dd}.${LOG_NAME}" append="true">
<PatternLayout charset="GB18030" pattern="%d{yyyy-MM-dd HH:mm:ss} %-5level [%file:%line] - %msg%n" /> <PatternLayout charset="GB18030" pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%file:%line] - %msg%n" />
<Policies> <Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1" /> <TimeBasedTriggeringPolicy modulate="true" interval="1" />
</Policies> </Policies>
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!