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();
} // }
} //}
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.google.common.collect.Lists; //import com.google.common.collect.Lists;
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.bean.CodeBean; //import com.neotel.smfcore.core.barcode.bean.CodeBean;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager; //import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.manager.IComponentManager; //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.Barcode;
import com.neotel.smfcore.core.barcode.service.po.Component; //import com.neotel.smfcore.core.barcode.service.po.Component;
import com.neotel.smfcore.core.barcode.utils.CodeResolve; //import com.neotel.smfcore.core.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.device.api.CodeValidateParam; //import com.neotel.smfcore.core.device.api.CodeValidateParam;
import com.neotel.smfcore.core.device.enums.OP; //import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.enums.OP_STATUS; //import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.device.util.DataCache; //import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.LiteOrderCache; //import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager; //import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager;
import com.neotel.smfcore.core.order.service.po.LiteOrder; //import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem; //import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE; //import com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE;
import com.neotel.smfcore.core.storage.service.manager.ILabelManager; //import com.neotel.smfcore.core.storage.service.manager.ILabelManager;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager; //import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Label; //import com.neotel.smfcore.core.storage.service.po.Label;
import com.neotel.smfcore.core.storage.service.po.Storage; //import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos; //import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.listener.ITaskListener; //import com.neotel.smfcore.core.system.listener.ITaskListener;
import com.neotel.smfcore.core.system.service.dao.IDataLogDao; //import com.neotel.smfcore.core.system.service.dao.IDataLogDao;
import com.neotel.smfcore.core.system.service.po.DataLog; //import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService; //import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.core.system.websocket.MsgType; //import com.neotel.smfcore.core.system.websocket.MsgType;
import com.neotel.smfcore.core.system.websocket.SocketMsg; //import com.neotel.smfcore.core.system.websocket.SocketMsg;
import com.neotel.smfcore.core.system.websocket.WebSocketServer; //import com.neotel.smfcore.core.system.websocket.WebSocketServer;
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 com.neotel.smfcore.security.service.manager.IGroupManager; //import com.neotel.smfcore.security.service.manager.IGroupManager;
import com.neotel.smfcore.security.service.po.Group; //import com.neotel.smfcore.security.service.po.Group;
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.apache.logging.log4j.util.Strings; //import org.apache.logging.log4j.util.Strings;
import org.apache.mina.core.service.IoHandlerAdapter; //import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus; //import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession; //import org.apache.mina.core.session.IoSession;
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.*; //import java.util.*;
import java.util.concurrent.ConcurrentHashMap; //import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong; //import java.util.concurrent.atomic.AtomicLong;
//
/** ///**
* Created by sunke on 2021/5/26. // * Created by sunke on 2021/5/26.
*/ // */
@Service //@Service
public class HellaServiceHandler extends IoHandlerAdapter implements ITaskListener { //public class HellaServiceHandler extends IoHandlerAdapter implements ITaskListener {
//
@Autowired // @Autowired
private IComponentManager componentManager; // private IComponentManager componentManager;
//
@Autowired // @Autowired
private IBarcodeManager barcodeManager; // private IBarcodeManager barcodeManager;
//
@Autowired // @Autowired
private IDataLogDao dataLogDao; // private IDataLogDao dataLogDao;
//
@Autowired // @Autowired
private TaskService taskService; // private TaskService taskService;
//
@Autowired // @Autowired
protected IStoragePosManager storagePosManager; // protected IStoragePosManager storagePosManager;
//
@Autowired // @Autowired
protected ILiteOrderManager liteOrderManager; // protected ILiteOrderManager liteOrderManager;
//
@Autowired // @Autowired
private DataCache dataCache; // private DataCache dataCache;
//
@Autowired // @Autowired
private LiteOrderCache liteOrderCache; // private LiteOrderCache liteOrderCache;
//
@Autowired // @Autowired
private IGroupManager groupManager; // private IGroupManager groupManager;
//
@Autowired // @Autowired
private ILabelManager labelManager; // private ILabelManager labelManager;
//
@Autowired // @Autowired
private CodeResolve codeResolve; // private CodeResolve codeResolve;
//
protected final static Logger log = LogManager.getLogger(); // protected final static Logger log = LogManager.getLogger();
//
private AtomicLong eventId = new AtomicLong(0); // private AtomicLong eventId = new AtomicLong(0);
//
private Map<String,HellaReqCommand> commandMap = new ConcurrentHashMap<>(); // private Map<String,HellaReqCommand> commandMap = new ConcurrentHashMap<>();
//
/** // /**
* 检查物料条码 // * 检查物料条码
* <STX>checkMaterial;eventId;scannedCode<CR><LF> // * <STX>checkMaterial;eventId;scannedCode<CR><LF>
* @return // * @return
*/ // */
public ResultBean checkMaterial(CodeValidateParam param){ // public ResultBean checkMaterial(CodeValidateParam param){
String loginUser=param.getLoginUser(); // String loginUser=param.getLoginUser();
String groupId=param.getGroupId(); // String groupId=param.getGroupId();
String storageId=param.getStorageId(); // String storageId=param.getStorageId();
String scannedCode= param.getCode(); // String scannedCode= param.getCode();
String token=param.getToken(); // String token=param.getToken();
//
HellaReqCommand command = HellaReqCommand.newCheckMaterialCmd(eventId.incrementAndGet(),scannedCode); // HellaReqCommand command = HellaReqCommand.newCheckMaterialCmd(eventId.incrementAndGet(),scannedCode);
command.setToken(token); // command.setToken(token);
command.setGroupId(groupId); // command.setGroupId(groupId);
boolean storageCheckMaterial=false; // boolean storageCheckMaterial=false;
if(ObjectUtil.isNotEmpty(storageId)){ // if(ObjectUtil.isNotEmpty(storageId)){
Storage storage=dataCache.getStorageById(storageId); // Storage storage=dataCache.getStorageById(storageId);
if(storage!=null){ // if(storage!=null){
storageCheckMaterial=true; // storageCheckMaterial=true;
command.setGroupId(storage.getGroupId()); // command.setGroupId(storage.getGroupId());
command.setStorageId(storageId); // command.setStorageId(storageId);
}
}
command.setLoginUser(loginUser);
for (HellaReqCommand hellaReqCommand : commandMap.values()) {
if(storageCheckMaterial) {
if(ObjectUtil.isNotEmpty(hellaReqCommand.getStorageId())&&hellaReqCommand.getStorageId().equals(storageId)&&hellaReqCommand.isCheckMaterialReq()){
//有未完成的入库请求
commandMap.remove(hellaReqCommand.getEventId());
log.info("清理未完成的入库检查请求[" + hellaReqCommand.getEventId() + "]:" + hellaReqCommand.getData());
}
}else {
if (hellaReqCommand.getGroupId().equals(groupId) && hellaReqCommand.isCheckMaterialReq()) {
//有未完成的入库请求
commandMap.remove(hellaReqCommand.getEventId());
log.info("清理未完成的入库检查请求[" + hellaReqCommand.getEventId() + "]:" + hellaReqCommand.getData());
//return ResultBean.newErrorResult(-1,"["+hellaReqCommand.getData()+"]入库任务未完成,无法入库");
}
}
}
commandMap.put(command.getEventId(),command);
log.info("发送检查物料条码请求:" + command.toReqMsg());
ResultBean resultBean = HellaTcpClient.sendMsg(command.toReqMsg());
// ResultBean resultBean = testCheckOK(command);
resultBean.setMsg("Check Material result:"+resultBean.getMsg());
return resultBean;
}
@Override
public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
log.info("客户端与服务端连接[空闲] - " + status.toString());
if(session != null){
session.closeNow();
}
}
@Override
public void messageSent(IoSession session, Object message) throws Exception {
super.messageSent(session, message);
}
@Override
public void sessionClosed(IoSession session) throws Exception {
super.sessionClosed(session);
log.info("与服务端" + session.getRemoteAddress() +" 的连接已断开");
}
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
String msg = message.toString();
msg= msg.replace("\u0002","");
log.info("Received Tcp Server msg:" + msg);
//getInventory;21296;
String[] resposArr = msg.split(";",-1);
String cmd = resposArr[0];
String eventId = resposArr[1];
HellaRespCommand respCommand = new HellaRespCommand();
respCommand.setCmd(cmd);
respCommand.setEventId(eventId);
if(respCommand.isCheckMaterialResp()){
handleCheckMaterialResp(respCommand,resposArr);
}else if(respCommand.isLoadMaterialResp()){
//入库完成反馈
String returnCode = resposArr[2];
String messageText = resposArr[3];
respCommand.setReturnCode(returnCode);
respCommand.setMessageText(messageText);
HellaReqCommand requestCommand = commandMap.get(respCommand.getEventId());
if(requestCommand == null || requestCommand.isCheckMaterialReq()){
log.error("未找到["+respCommand.getEventId()+"]对应的入库完成通知信息");
return;
}
String groupId = requestCommand.getGroupId();
if(respCommand.isOkResp()){
ResultBean okResult = ResultBean.newOkResult("smfcore.loadMaterialFinished","loading material is finished: {0}" ,new String[]{messageText},"");
WebSocketServer.sendMsg(requestCommand.getToken(),new SocketMsg(null, okResult.getMsg(), MsgType.INFO,"smfclient.loadMaterialFinished",new String[]{messageText}));
}else{
ResultBean ngResult = ResultBean.newErrorResult(Integer.valueOf(returnCode),"smfcore.loadMaterialFailed","loading material failed:{0}",new String[]{messageText} );
WebSocketServer.sendMsg(requestCommand.getToken(),new SocketMsg(null, ngResult.getMsg(), MsgType.ERROR,"smfclient.loadMaterialFailed",new String[]{messageText}));
}
commandMap.remove(respCommand.getEventId());
}else if(respCommand.isUnloadMaterialCmd()){
//单盘出库
//<STX>unloadMaterial;eventId;partNumber;containerNumber<CR><LF>
String reelId = resposArr[2];
StoragePos storagePos = storagePosManager.getByBarcode(reelId);
String resultCode = "0";
String resultMsg = "OK";
if(storagePos == null){
//<STX>unloadMaterialResp;eventId;returnCode;messageText<CR><LF>
resultCode = "-1";
resultMsg = "Not Found";
}else {
String lockId = storagePos.getBarcode().getLockId();
if(Strings.isNotBlank(lockId)){
resultCode = "-2";
resultMsg = "The reel is locked by ["+lockId+"]";
}else{
Storage storage = dataCache.getStorageById(storagePos.getStorageId());
try{
taskService.checkout(storage,storagePos,false,"");
}catch(ValidateException ve){
resultCode = "-3";
resultMsg = ve.getMessage();
}
}
}
String respMsg = "unloadMaterialResp;"+ eventId+";" + resultCode+";"+resultMsg;
// log.info(respMsg);
// session.write("\02" + respMsg);
HellaTcpClient.sendMsg(respMsg,session);
}else if(respCommand.isOrderMaterialExtCmd()){
handleOrderMaterialExtCmd(session,resposArr);
}else if(respCommand.isGetInventoryCmd()){
//<STX>getInventory;eventId;shelfNumber<CR><LF>
//20220217修改: <STX>getInventory;eventId;lineNumber<CR><LF>
// String shelfNumber = resposArr[2];
// Storage shelf = null;
// if(ObjectUtil.isNotEmpty(shelfNumber)) {
// Collection<Storage> allStorages = dataCache.getAllStorage().values();
// for (Storage storage : allStorages) {
// if (storage.getName().equals(shelfNumber)) {
// shelf = storage;
// }
// }
// } // }
// }
String lineNumber=resposArr[2]; // command.setLoginUser(loginUser);
List<String> shelfIds=new ArrayList<>(); //
if(ObjectUtil.isNotEmpty(lineNumber)){ // for (HellaReqCommand hellaReqCommand : commandMap.values()) {
Group group= groupManager.getByGroupName(lineNumber); // if(storageCheckMaterial) {
if(group!=null){ // if(ObjectUtil.isNotEmpty(hellaReqCommand.getStorageId())&&hellaReqCommand.getStorageId().equals(storageId)&&hellaReqCommand.isCheckMaterialReq()){
shelfIds =dataCache. getStorageIdsByGroupId(group.getId(), false); // //有未完成的入库请求
} // commandMap.remove(hellaReqCommand.getEventId());
} // log.info("清理未完成的入库检查请求[" + hellaReqCommand.getEventId() + "]:" + hellaReqCommand.getData());
String resultCode = "0";
String resultMsg = "OK";
String dataStr = "";
int posSize=0;
// if(ObjectUtil.isNotEmpty(shelfNumber)&&shelf == null){
if(ObjectUtil.isNotEmpty(lineNumber)&&shelfIds.size()<=0){
//<STX>getInventoryResp;eventId;returnCode;messageText;numberofResults;partNumber1;containerNumber;remainQuantity;MSL;lightClass;SelfPosition;reserved;…;partNumberN;containerNumberN;remainQuantityN;MSLN;lightClassN;SelfPositionN;reservedN;<CR><LF>
resultCode = "-1";
resultMsg = "Shelf is not found";
dataStr = "0";
}else {
// String shelfId="";
// if(!(shelf==null)){
// shelfId=shelf.getId();
// } // }
if(shelfIds.size()<=0){ // }else {
shelfIds.add(""); // if (hellaReqCommand.getGroupId().equals(groupId) && hellaReqCommand.isCheckMaterialReq()) {
} // //有未完成的入库请求
log.info("getInventory,lineNumber["+lineNumber+"],shelfIds["+String.join(",",shelfIds)+"]"); // commandMap.remove(hellaReqCommand.getEventId());
for (String shelfId : // log.info("清理未完成的入库检查请求[" + hellaReqCommand.getEventId() + "]:" + hellaReqCommand.getData());
shelfIds) { // //return ResultBean.newErrorResult(-1,"["+hellaReqCommand.getData()+"]入库任务未完成,无法入库");
List<StoragePos> posList = storagePosManager.findNotEmptyByStorageId(shelfId); // }
int numberOfResult = posList.size(); // }
log.info("getInventory,shelfId["+shelfId+"],numberOfResult["+numberOfResult+"]"); // }
posSize+=numberOfResult;
// dataStr = "" + numberOfResult;
for (StoragePos storagePos : posList) {
Barcode barcode = storagePos.getBarcode();
String pn = barcode.getPartNumber();
String reelId = barcode.getBarcode();
int qty = barcode.getAmount();
String msl = barcode.getMsl();
String lightClass = barcode.getBatch();
String posName = storagePos.getPosName();
String reserved = "0";
if (Strings.isNotBlank(barcode.getLockId())) {
reserved = "1";
}
// dataStr = dataStr + ";" + pn + ";" + reelId + ";" + qty + ";" + msl + ";" + lightClass + ";" + posName + ";" + reserved;
if(ObjectUtil.isNotEmpty(dataStr)){
dataStr = dataStr + ";" + pn + ";" + reelId + ";" + qty + ";" + msl + ";" + lightClass + ";" + posName + ";" + reserved;
}else{
dataStr = pn + ";" + reelId + ";" + qty + ";" + msl + ";" + lightClass + ";" + posName + ";" + reserved;
}
}
}
}
String respMsg = "getInventoryResp;"+eventId+";"+resultCode+";"+resultMsg+";"+posSize+";"+dataStr;
// log.info(respMsg);
//session.write("\02" + respMsg);
HellaTcpClient.sendMsg(respMsg,session);
}
}
private ResultBean testCheckOK(HellaReqCommand command) {
HellaRespCommand respCommand = new HellaRespCommand();
respCommand.setCmd("TestCheckMaterial");
respCommand.setEventId(command.getEventId());
String codeStr = command.getData().toString();
CodeBean codeBean = codeResolve.resolveSingleCode(codeStr);
if(codeBean==null||codeBean.getBarcode()==null){
return ResultBean.newErrorResult(1,"smfcore.error.barcode.invalid","{0}不是有效的条码",new String[]{codeStr});
}
if(ObjectUtil.isNotEmpty(codeBean.getErrorCode()) ){
return ResultBean.newErrorResult(1,codeBean.getErrorCode(),codeBean.getError(),codeBean.getParams());
}
String pn=codeBean.getBarcode().getPartNumber();
String reelId=codeBean.getBarcode().getBarcode();
String num=codeBean.getBarcode().getAmount()+"";
String[] resposArr = new String[]{"TestCheckMaterial",command.getEventId(),"0","OK",pn,reelId,num,"1","LC01"};
try {
handleCheckMaterialResp(respCommand,resposArr);
return ResultBean.newOkResult("");
} catch (ValidateException e) {
log.error(e);
return ResultBean.newErrorResult(1,e.getMsgKey(),e.getDefaultMsg());
}
}
/**
* 处理入库验证返回消息
* @param respCommand
* @param resposArr
*/
private void handleCheckMaterialResp(HellaRespCommand respCommand, String[] resposArr) throws ValidateException{
String returnCode = resposArr[2];
String messageText = resposArr[3];
respCommand.setReturnCode(returnCode);
respCommand.setMessageText(messageText);
HellaReqCommand requestCommand = commandMap.get(respCommand.getEventId());
if(requestCommand == null || !requestCommand.isCheckMaterialReq()){
log.error("未找到["+respCommand.getEventId()+"]对应的入库请求信息");
return;
}
String groupId = requestCommand.getGroupId();
String storageId=requestCommand.getStorageId();
String loginUser = requestCommand.getLoginUser();
String fullCode = requestCommand.getData().toString();
String token=requestCommand.getToken().toString();
if(respCommand.isOkResp()){
//<STX>loadMaterialResp;eventId;returnCode;messageText;partNumber;containerNumber;remainQuantity;MSL;lightClass<CR><LF>
//可以入库,生成一个任务,通知到页面,并将其存下来
String pn = resposArr[4];
String reelId = resposArr[5];
String qty = resposArr[6];
String msl = resposArr[7];
String lightClass = "";
if(resposArr.length >= 9){
lightClass = resposArr[8];
}
//checkMaterialResp;1;0;OK;714.758-41;48200085SIA1531JU2N15;1000.0;1;
Barcode barcode = barcodeManager.findByBarcode(reelId);
if(barcode == null){
barcode = new Barcode();
barcode.setBarcode(reelId);
Component component = componentManager.findByPartNumberAndProvider(pn,null);
if(component == null){
log.info("自动添加["+pn+"]的档案信息");
component = new Component();
component.setPartNumber(pn);
component.setAmount(Double.valueOf(qty).intValue());
component.setPlateSize(1);
component.setHeight(1);
component.setName(pn);
componentManager.save(component);
}
log.info("创建条码["+reelId+"]");
}
barcode.setPartNumber(pn);
barcode.setMsl(msl);
barcode.setBatch(lightClass);
barcode.setAmount(Double.valueOf(qty).intValue());
barcode.setFullCode(fullCode);
barcode = barcodeManager.save(barcode);
DataLog dataLog = new DataLog();
dataLog.setBarcode(reelId);
dataLog.setPartNumber(pn);
dataLog.setType(OP.PUT_IN);
dataLog.setNum(barcode.getAmount());
dataLog.setStatus(OP_STATUS.WAIT.name());
dataLog.setGroupId(groupId);
dataLog.setStorageId(storageId);
dataLog.setMemo(barcode.getMemo());
dataLog.setOperator(loginUser);
if(ObjectUtil.isNotEmpty(storageId)){
Storage storage=dataCache.getStorageById(storageId);
if(storage!=null){
dataLog.setCid(storage.getCid());
dataLog.setStorageName(storage.getName());
}
}
try{
taskService.addTaskToExecute(dataLog);
ResultBean okResult = ResultBean.newOkResult("checking material is ok: " + messageText);
WebSocketServer.sendMsg(token,new SocketMsg(null, okResult.getMsg(), MsgType.INFO,"smfclient.checkingMaterialOk",new String[]{messageText}));
}catch(Exception e){
WebSocketServer.sendMsg(token,new SocketMsg(null, e.getMessage(), MsgType.INFO,"smfclient.nlp.error",new String[]{e.getMessage()}));
}
}else{
//NG,需要在界面上进行提示
ResultBean ngResult = ResultBean.newErrorResult(Integer.valueOf(returnCode),"smfcore.checkNg","checking material is ng:{0}" ,new String[]{messageText} );
WebSocketServer.sendMsg(token,new SocketMsg(null, ngResult.getMsg(), MsgType.ERROR,"smfclient.checkNg",new String[]{messageText}));
}
commandMap.remove(respCommand.getEventId());
}
/**
* 处理工单指令
*/
private void handleOrderMaterialExtCmd(IoSession session, String[] resposArr) throws ValidateException {
// //工单出库
// //<STX>orderMaterialExt;eventId;lineNumber;workorderNumber;currentWorkorderflag;reflowgroupNumber;numberofPartnumbers;partNumber1;numberofReels;…;partNumberN;numberofReels<CR><LF>
// //20220217 修改工单出库参数
// //<STX>orderMaterialExt;eventId;lineNumber;CRPNumber;currentWorkorderflag;productGroup;numberofPartnumbers;partNumber1;numberofReels;…;partNumberN;numberofReels<CR><LF>
// String responseEventId = resposArr[1];
// String groupName = resposArr[2];//设备组名称
// String workorderNumber = resposArr[3];
//// workorderNumber=responseEventId;
// //currentWorkorderflag 0 for current workorder; 1 for next workorder
// String currentWorkorderflag = resposArr[4];
//// String reflowgroupNumber = resposArr[5];
// String labelName=resposArr[5];//标签名称
// String numberofPartnumbers = resposArr[6];
// LiteOrder liteOrder = liteOrderManager.findByOrderNo(workorderNumber);
// if(liteOrder != null){
// log.info("数据库中已存在工单号为["+workorderNumber+"]的工单,忽略");
// int resultCode=-1;
// String resultMsg="workorderNumber ["+workorderNumber+"] already exists";
// String respMsg = "orderMaterialExtResp;"+ responseEventId+";" + resultCode+";"+resultMsg+";"+workorderNumber+";"+currentWorkorderflag+";"+labelName+";"+numberofPartnumbers ;
// //
// HellaTcpClient.sendMsg(respMsg,session); // commandMap.put(command.getEventId(),command);
// }else{ // log.info("发送检查物料条码请求:" + command.toReqMsg());
// List<LiteOrderItem> items = Lists.newArrayList(); // ResultBean resultBean = HellaTcpClient.sendMsg(command.toReqMsg());
// int startIndex = 6; //// ResultBean resultBean = testCheckOK(command);
// while(startIndex+2<resposArr.length){ // resultBean.setMsg("Check Material result:"+resultBean.getMsg());
// String partNumber = resposArr[startIndex + 1]; // return resultBean;
// String numberofReels = resposArr[startIndex+2]; // }
// LiteOrderItem item = new LiteOrderItem(); //
// item.setPn(partNumber); //
// item.setNeedReelCount(Integer.valueOf(numberofReels)); //
// items.add(item); // @Override
// startIndex = startIndex + 2; // public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
// log.info("客户端与服务端连接[空闲] - " + status.toString());
// if(session != null){
// session.closeNow();
// }
// }
//
// @Override
// public void messageSent(IoSession session, Object message) throws Exception {
// super.messageSent(session, message);
// }
//
// @Override
// public void sessionClosed(IoSession session) throws Exception {
// super.sessionClosed(session);
// log.info("与服务端" + session.getRemoteAddress() +" 的连接已断开");
// }
//
// @Override
// public void messageReceived(IoSession session, Object message) throws Exception {
// String msg = message.toString();
// msg= msg.replace("\u0002","");
// log.info("Received Tcp Server msg:" + msg);
// //getInventory;21296;
// String[] resposArr = msg.split(";",-1);
// String cmd = resposArr[0];
// String eventId = resposArr[1];
//
// HellaRespCommand respCommand = new HellaRespCommand();
// respCommand.setCmd(cmd);
// respCommand.setEventId(eventId);
//
// if(respCommand.isCheckMaterialResp()){
// handleCheckMaterialResp(respCommand,resposArr);
// }else if(respCommand.isLoadMaterialResp()){
// //入库完成反馈
// String returnCode = resposArr[2];
// String messageText = resposArr[3];
// respCommand.setReturnCode(returnCode);
// respCommand.setMessageText(messageText);
// HellaReqCommand requestCommand = commandMap.get(respCommand.getEventId());
// if(requestCommand == null || requestCommand.isCheckMaterialReq()){
// log.error("未找到["+respCommand.getEventId()+"]对应的入库完成通知信息");
// return;
// }
// String groupId = requestCommand.getGroupId();
//
// if(respCommand.isOkResp()){
// ResultBean okResult = ResultBean.newOkResult("smfcore.loadMaterialFinished","loading material is finished: {0}" ,new String[]{messageText},"");
//
// WebSocketServer.sendMsg(requestCommand.getToken(),new SocketMsg(null, okResult.getMsg(), MsgType.INFO,"smfclient.loadMaterialFinished",new String[]{messageText}));
// }else{
// ResultBean ngResult = ResultBean.newErrorResult(Integer.valueOf(returnCode),"smfcore.loadMaterialFailed","loading material failed:{0}",new String[]{messageText} );
// WebSocketServer.sendMsg(requestCommand.getToken(),new SocketMsg(null, ngResult.getMsg(), MsgType.ERROR,"smfclient.loadMaterialFailed",new String[]{messageText}));
// } // }
// liteOrder = new LiteOrder(workorderNumber,items); // commandMap.remove(respCommand.getEventId());
// liteOrder.setSource(groupName); // }else if(respCommand.isUnloadMaterialCmd()){
// log.info("新增加订单:" + liteOrder.getOrderNo()+",设备组名称["+groupName+"],标签名称["+labelName+"]"); // //单盘出库
// liteOrder = liteOrderManager.createWithItems(liteOrder); // //<STX>unloadMaterial;eventId;partNumber;containerNumber<CR><LF>
// liteOrderCache.addOrderToMap(liteOrder); // String reelId = resposArr[2];
// //对工单进行锁定 // StoragePos storagePos = storagePosManager.getByBarcode(reelId);
// List<String> storageIdList = new ArrayList<>(); // String resultCode = "0";
// // String resultMsg = "OK";
// Map<String, Storage> allStorage = dataCache.getAllStorage(); // if(storagePos == null){
// Group group = groupManager.getByGroupName(groupName); // //<STX>unloadMaterialResp;eventId;returnCode;messageText<CR><LF>
// if(group != null){ // resultCode = "-1";
// for (Storage storage : allStorage.values()) { // resultMsg = "Not Found";
//// if(storage.getGroupId().equals(storage.getGroupId())){ // }else {
// if(storage.IsRightGroup(group.getId())){ // String lockId = storagePos.getBarcode().getLockId();
// storageIdList.add(storage.getId()); // if(Strings.isNotBlank(lockId)){
// resultCode = "-2";
// resultMsg = "The reel is locked by ["+lockId+"]";
// }else{
// Storage storage = dataCache.getStorageById(storagePos.getStorageId());
// try{
// taskService.checkout(storage,storagePos,false,"");
// }catch(ValidateException ve){
// resultCode = "-3";
// resultMsg = ve.getMessage();
// } // }
// } // }
// } // }
// String respMsg = "unloadMaterialResp;"+ eventId+";" + resultCode+";"+resultMsg;
//// log.info(respMsg);
//// session.write("\02" + respMsg);
// HellaTcpClient.sendMsg(respMsg,session);
// }else if(respCommand.isOrderMaterialExtCmd()){
// handleOrderMaterialExtCmd(session,resposArr);
// }else if(respCommand.isGetInventoryCmd()){
// //<STX>getInventory;eventId;shelfNumber<CR><LF>
// //20220217修改: <STX>getInventory;eventId;lineNumber<CR><LF>
//// String shelfNumber = resposArr[2];
//// Storage shelf = null;
//// if(ObjectUtil.isNotEmpty(shelfNumber)) {
//// Collection<Storage> allStorages = dataCache.getAllStorage().values();
//// for (Storage storage : allStorages) {
//// if (storage.getName().equals(shelfNumber)) {
//// shelf = storage;
//// }
//// }
//// }
// //
// //增加标签过滤 // String lineNumber=resposArr[2];
// String labelId=""; // List<String> shelfIds=new ArrayList<>();
// if(ObjectUtil.isNotEmpty(labelName)){ // if(ObjectUtil.isNotEmpty(lineNumber)){
// Label label=labelManager.getBylabelName(labelName ); // Group group= groupManager.getByGroupName(lineNumber);
// if(label!=null){ // if(group!=null){
// labelId=label.getId() ; // shelfIds =dataCache. getStorageIdsByGroupId(group.getId(), false);
// } // }
// } // }
// //
//
// CHECKOUT_TYPE checkOutType = dataCache.getCheckOutType();
// Collection<String> excludePosIds = new ArrayList<>();
//
// String resultCode = "0"; // String resultCode = "0";
// String resultMsg = "OK"; // String resultMsg = "OK";
// String resultDataStr = ""; // String dataStr = "";
// for (LiteOrderItem liteOrderItem : liteOrder.getOrderItems()) { // int posSize=0;
// int reelCount = liteOrderItem.getNeedReelCount(); //// if(ObjectUtil.isNotEmpty(shelfNumber)&&shelf == null){
// String pn = liteOrderItem.getPn(); // if(ObjectUtil.isNotEmpty(lineNumber)&&shelfIds.size()<=0){
// int lockCount = 0; // //<STX>getInventoryResp;eventId;returnCode;messageText;numberofResults;partNumber1;containerNumber;remainQuantity;MSL;lightClass;SelfPosition;reserved;…;partNumberN;containerNumberN;remainQuantityN;MSLN;lightClassN;SelfPositionN;reservedN;<CR><LF>
// while(lockCount < reelCount){ // resultCode = "-1";
// StoragePos pos = storagePosManager.findPartNumberInStorages(storageIdList,labelId, pn, excludePosIds, checkOutType); // resultMsg = "Shelf is not found";
// if(pos == null){ // dataStr = "0";
// break; // }else {
// }else{ //// String shelfId="";
// try { //// if(!(shelf==null)){
// Barcode barcode = pos.getBarcode(); //// shelfId=shelf.getId();
// resultDataStr = resultDataStr + ";" + barcode.getPartNumber()+ ";" + barcode.getBarcode()+";"+barcode.getAmount(); //// }
// barcode.setLockId(workorderNumber); // if(shelfIds.size()<=0){
// barcode.setLockName(liteOrderItem.getId()); // shelfIds.add("");
// pos.setBarcode(barcode); // }
// storagePosManager.save(pos); // log.info("getInventory,lineNumber["+lineNumber+"],shelfIds["+String.join(",",shelfIds)+"]");
// Storage storage = dataCache.getStorageById(pos.getStorageId()); // for (String shelfId :
// dataCache.lockOneReel(storage.getCid(),pn); // shelfIds) {
// } catch (ValidateException e) { // List<StoragePos> posList = storagePosManager.findNotEmptyByStorageId(shelfId);
// log.error("锁定料盘出错",e); // int numberOfResult = posList.size();
// log.info("getInventory,shelfId["+shelfId+"],numberOfResult["+numberOfResult+"]");
// posSize+=numberOfResult;
//// dataStr = "" + numberOfResult;
// for (StoragePos storagePos : posList) {
// Barcode barcode = storagePos.getBarcode();
// String pn = barcode.getPartNumber();
// String reelId = barcode.getBarcode();
// int qty = barcode.getAmount();
// String msl = barcode.getMsl();
// String lightClass = barcode.getBatch();
// String posName = storagePos.getPosName();
// String reserved = "0";
// if (Strings.isNotBlank(barcode.getLockId())) {
// reserved = "1";
// }
//// dataStr = dataStr + ";" + pn + ";" + reelId + ";" + qty + ";" + msl + ";" + lightClass + ";" + posName + ";" + reserved;
// if(ObjectUtil.isNotEmpty(dataStr)){
// dataStr = dataStr + ";" + pn + ";" + reelId + ";" + qty + ";" + msl + ";" + lightClass + ";" + posName + ";" + reserved;
// }else{
// dataStr = pn + ";" + reelId + ";" + qty + ";" + msl + ";" + lightClass + ";" + posName + ";" + reserved;
// } // }
// lockCount = lockCount + 1;
// } // }
//
// } // }
// }
// //
// int notFoundReelCount = reelCount - lockCount; // String respMsg = "getInventoryResp;"+eventId+";"+resultCode+";"+resultMsg+";"+posSize+";"+dataStr;
// if(notFoundReelCount > 0){ //// log.info(respMsg);
// //有未绑定的 // //session.write("\02" + respMsg);
// resultCode = "-1"; // HellaTcpClient.sendMsg(respMsg,session);
// resultMsg = "Some material not on the shelf"; // }
// for (int i=0;i<notFoundReelCount;i++){ //
// resultDataStr = resultDataStr + ";" + pn + ";NOT_FOUND;0"; // }
// } //
//
//
// private ResultBean testCheckOK(HellaReqCommand command) {
// HellaRespCommand respCommand = new HellaRespCommand();
// respCommand.setCmd("TestCheckMaterial");
// respCommand.setEventId(command.getEventId());
// String codeStr = command.getData().toString();
// CodeBean codeBean = codeResolve.resolveSingleCode(codeStr);
// if(codeBean==null||codeBean.getBarcode()==null){
// return ResultBean.newErrorResult(1,"smfcore.error.barcode.invalid","{0}不是有效的条码",new String[]{codeStr});
// }
// if(ObjectUtil.isNotEmpty(codeBean.getErrorCode()) ){
// return ResultBean.newErrorResult(1,codeBean.getErrorCode(),codeBean.getError(),codeBean.getParams());
// }
// String pn=codeBean.getBarcode().getPartNumber();
// String reelId=codeBean.getBarcode().getBarcode();
// String num=codeBean.getBarcode().getAmount()+"";
// String[] resposArr = new String[]{"TestCheckMaterial",command.getEventId(),"0","OK",pn,reelId,num,"1","LC01"};
// try {
// handleCheckMaterialResp(respCommand,resposArr);
// return ResultBean.newOkResult("");
// } catch (ValidateException e) {
// log.error(e);
// return ResultBean.newErrorResult(1,e.getMsgKey(),e.getDefaultMsg());
// }
// }
//
// /**
// * 处理入库验证返回消息
// * @param respCommand
// * @param resposArr
// */
// private void handleCheckMaterialResp(HellaRespCommand respCommand, String[] resposArr) throws ValidateException{
// String returnCode = resposArr[2];
// String messageText = resposArr[3];
// respCommand.setReturnCode(returnCode);
// respCommand.setMessageText(messageText);
// HellaReqCommand requestCommand = commandMap.get(respCommand.getEventId());
// if(requestCommand == null || !requestCommand.isCheckMaterialReq()){
// log.error("未找到["+respCommand.getEventId()+"]对应的入库请求信息");
// return;
// }
// String groupId = requestCommand.getGroupId();
// String storageId=requestCommand.getStorageId();
// String loginUser = requestCommand.getLoginUser();
// String fullCode = requestCommand.getData().toString();
// String token=requestCommand.getToken().toString();
// if(respCommand.isOkResp()){
// //<STX>loadMaterialResp;eventId;returnCode;messageText;partNumber;containerNumber;remainQuantity;MSL;lightClass<CR><LF>
// //可以入库,生成一个任务,通知到页面,并将其存下来
// String pn = resposArr[4];
// String reelId = resposArr[5];
// String qty = resposArr[6];
// String msl = resposArr[7];
//
// String lightClass = "";
//
// if(resposArr.length >= 9){
// lightClass = resposArr[8];
// }
//
// //checkMaterialResp;1;0;OK;714.758-41;48200085SIA1531JU2N15;1000.0;1;
//
// Barcode barcode = barcodeManager.findByBarcode(reelId);
// if(barcode == null){
// barcode = new Barcode();
// barcode.setBarcode(reelId);
// Component component = componentManager.findByPartNumberAndProvider(pn,null);
// if(component == null){
// log.info("自动添加["+pn+"]的档案信息");
// component = new Component();
// component.setPartNumber(pn);
// component.setAmount(Double.valueOf(qty).intValue());
// component.setPlateSize(1);
// component.setHeight(1);
// component.setName(pn);
// componentManager.save(component);
// } // }
// log.info("创建条码["+reelId+"]");
// } // }
// barcode.setPartNumber(pn);
// barcode.setMsl(msl);
// barcode.setBatch(lightClass);
// barcode.setAmount(Double.valueOf(qty).intValue());
// barcode.setFullCode(fullCode);
// barcode = barcodeManager.save(barcode);
// //
// if("1".equals(currentWorkorderflag)){ // DataLog dataLog = new DataLog();
// liteOrderCache.checkOutOrder(liteOrder); // dataLog.setBarcode(reelId);
// dataLog.setPartNumber(pn);
// dataLog.setType(OP.PUT_IN);
// dataLog.setNum(barcode.getAmount());
// dataLog.setStatus(OP_STATUS.WAIT.name());
// dataLog.setGroupId(groupId);
// dataLog.setStorageId(storageId);
// dataLog.setMemo(barcode.getMemo());
// dataLog.setOperator(loginUser);
// if(ObjectUtil.isNotEmpty(storageId)){
// Storage storage=dataCache.getStorageById(storageId);
// if(storage!=null){
// dataLog.setCid(storage.getCid());
// dataLog.setStorageName(storage.getName());
// }
// }
// try{
// taskService.addTaskToExecute(dataLog);
// ResultBean okResult = ResultBean.newOkResult("checking material is ok: " + messageText);
// WebSocketServer.sendMsg(token,new SocketMsg(null, okResult.getMsg(), MsgType.INFO,"smfclient.checkingMaterialOk",new String[]{messageText}));
// }catch(Exception e){
// WebSocketServer.sendMsg(token,new SocketMsg(null, e.getMessage(), MsgType.INFO,"smfclient.nlp.error",new String[]{e.getMessage()}));
// } // }
// //<STX>orderMaterialExtResp;eventId;returnCode;messageText;workorderNumber;currentWorkorderflag;reflowgroupNumber;numberofPartnumbers;partNumber1;containerNumber;quantity;…;partNumberN;containerNumberN;quantityN<CR><LF>
// //<STX>orderMaterialExtResp;1;0;OK;61598;1;325.618-01;3;790.130-13;abcde;3000; 790.131-01;abcdf;5000;790.131-01;abcdg;2580<CR><LF>
// //orderMaterialExtResp;0;-1;Some material not on the shelf;1408;1;325.618-01;1;;791.704-06NOT_FOUND;0
// //<STX>orderMaterialExtResp;eventId;returnCode;messageText;workorderNumber;currentWorkorderflag;reflowgroupNumber;numberofPartnumbers;partNumber1;containerNumber;quantity;…;partNumberN;containerNumberN;quantityN<CR><LF>
// String respMsg = "orderMaterialExtResp;"+ responseEventId+";" + resultCode+";"+resultMsg+";"+workorderNumber+";"+currentWorkorderflag+";"+labelName+";"+numberofPartnumbers +resultDataStr;
//// log.info("工单结果:" + respMsg);
//// session.write("\02"+respMsg);
// //
// HellaTcpClient.sendMsg(respMsg,session); // }else{
// //NG,需要在界面上进行提示
// ResultBean ngResult = ResultBean.newErrorResult(Integer.valueOf(returnCode),"smfcore.checkNg","checking material is ng:{0}" ,new String[]{messageText} );
// WebSocketServer.sendMsg(token,new SocketMsg(null, ngResult.getMsg(), MsgType.ERROR,"smfclient.checkNg",new String[]{messageText}));
// } // }
} // commandMap.remove(respCommand.getEventId());
// }
/** //
* 入库完成通知 // /**
* <STX>loadMaterial;eventId;scannedCode;shelfNumber;shelfSlot<CR><LF> // * 处理工单指令
* @return // */
*/ // private void handleOrderMaterialExtCmd(IoSession session, String[] resposArr) throws ValidateException {
private void loadMaterial(String groupId, String scannedCode,String shelfNumber, String shelfSlot){ //// //工单出库
HellaReqCommand command = HellaReqCommand.newLoadMaterialCmd(eventId.incrementAndGet(),scannedCode,shelfNumber,shelfSlot); //// //<STX>orderMaterialExt;eventId;lineNumber;workorderNumber;currentWorkorderflag;reflowgroupNumber;numberofPartnumbers;partNumber1;numberofReels;…;partNumberN;numberofReels<CR><LF>
command.setGroupId(groupId); //// //20220217 修改工单出库参数
commandMap.put(command.getEventId(),command); //// //<STX>orderMaterialExt;eventId;lineNumber;CRPNumber;currentWorkorderflag;productGroup;numberofPartnumbers;partNumber1;numberofReels;…;partNumberN;numberofReels<CR><LF>
log.info("发送入库完成通知:" + command.toReqMsg()); //// String responseEventId = resposArr[1];
HellaTcpClient.sendMsg(command.toReqMsg()); //// String groupName = resposArr[2];//设备组名称
} //// String workorderNumber = resposArr[3];
////// workorderNumber=responseEventId;
@Override //// //currentWorkorderflag 0 for current workorder; 1 for next workorder
public void onTaskStatusChange(DataLog task) { //// String currentWorkorderflag = resposArr[4];
if(task.isFinished()){ ////// String reflowgroupNumber = resposArr[5];
if(task.isPutInTask()){ //// String labelName=resposArr[5];//标签名称
String groupId = task.getGroupId(); //// String numberofPartnumbers = resposArr[6];
String fullCode = task.getBarcode(); //// LiteOrder liteOrder = liteOrderManager.findByOrderNo(workorderNumber);
Barcode barcode = barcodeManager.findByBarcode(task.getBarcode()); //// if(liteOrder != null){
if(barcode != null){ //// log.info("数据库中已存在工单号为["+workorderNumber+"]的工单,忽略");
fullCode = barcode.getFullCode(); //// int resultCode=-1;
} //// String resultMsg="workorderNumber ["+workorderNumber+"] already exists";
loadMaterial(groupId,fullCode,task.getStorageName(),task.getPosName()); //// String respMsg = "orderMaterialExtResp;"+ responseEventId+";" + resultCode+";"+resultMsg+";"+workorderNumber+";"+currentWorkorderflag+";"+labelName+";"+numberofPartnumbers ;
} ////
} //// HellaTcpClient.sendMsg(respMsg,session);
} //// }else{
//// List<LiteOrderItem> items = Lists.newArrayList();
//// int startIndex = 6;
} //// while(startIndex+2<resposArr.length){
//// String partNumber = resposArr[startIndex + 1];
//// String numberofReels = resposArr[startIndex+2];
//// LiteOrderItem item = new LiteOrderItem();
//// item.setPn(partNumber);
//// item.setNeedReelCount(Integer.valueOf(numberofReels));
//// items.add(item);
//// startIndex = startIndex + 2;
//// }
//// liteOrder = new LiteOrder(workorderNumber,items);
//// liteOrder.setSource(groupName);
//// log.info("新增加订单:" + liteOrder.getOrderNo()+",设备组名称["+groupName+"],标签名称["+labelName+"]");
//// liteOrder = liteOrderManager.createWithItems(liteOrder);
//// liteOrderCache.addOrderToMap(liteOrder);
//// //对工单进行锁定
//// List<String> storageIdList = new ArrayList<>();
////
//// Map<String, Storage> allStorage = dataCache.getAllStorage();
//// Group group = groupManager.getByGroupName(groupName);
//// if(group != null){
//// for (Storage storage : allStorage.values()) {
////// if(storage.getGroupId().equals(storage.getGroupId())){
//// if(storage.IsRightGroup(group.getId())){
//// storageIdList.add(storage.getId());
//// }
//// }
//// }
////
//// //增加标签过滤
//// String labelId="";
//// if(ObjectUtil.isNotEmpty(labelName)){
//// Label label=labelManager.getBylabelName(labelName );
//// if(label!=null){
//// labelId=label.getId() ;
//// }
//// }
////
////
//// CHECKOUT_TYPE checkOutType = dataCache.getCheckOutType();
//// Collection<String> excludePosIds = new ArrayList<>();
////
//// String resultCode = "0";
//// String resultMsg = "OK";
//// String resultDataStr = "";
//// for (LiteOrderItem liteOrderItem : liteOrder.getOrderItems()) {
//// int reelCount = liteOrderItem.getNeedReelCount();
//// String pn = liteOrderItem.getPn();
//// int lockCount = 0;
//// while(lockCount < reelCount){
//// StoragePos pos = storagePosManager.findPartNumberInStorages(storageIdList,labelId, pn, excludePosIds, checkOutType);
//// if(pos == null){
//// break;
//// }else{
//// try {
//// Barcode barcode = pos.getBarcode();
//// resultDataStr = resultDataStr + ";" + barcode.getPartNumber()+ ";" + barcode.getBarcode()+";"+barcode.getAmount();
//// barcode.setLockId(workorderNumber);
//// barcode.setLockName(liteOrderItem.getId());
//// pos.setBarcode(barcode);
//// storagePosManager.save(pos);
//// Storage storage = dataCache.getStorageById(pos.getStorageId());
//// dataCache.lockOneReel(storage.getCid(),pn);
//// } catch (ValidateException e) {
//// log.error("锁定料盘出错",e);
//// }
//// lockCount = lockCount + 1;
//// }
//// }
////
//// int notFoundReelCount = reelCount - lockCount;
//// if(notFoundReelCount > 0){
//// //有未绑定的
//// resultCode = "-1";
//// resultMsg = "Some material not on the shelf";
//// for (int i=0;i<notFoundReelCount;i++){
//// resultDataStr = resultDataStr + ";" + pn + ";NOT_FOUND;0";
//// }
//// }
//// }
////
//// if("1".equals(currentWorkorderflag)){
//// liteOrderCache.checkOutOrder(liteOrder);
//// }
//// //<STX>orderMaterialExtResp;eventId;returnCode;messageText;workorderNumber;currentWorkorderflag;reflowgroupNumber;numberofPartnumbers;partNumber1;containerNumber;quantity;…;partNumberN;containerNumberN;quantityN<CR><LF>
//// //<STX>orderMaterialExtResp;1;0;OK;61598;1;325.618-01;3;790.130-13;abcde;3000; 790.131-01;abcdf;5000;790.131-01;abcdg;2580<CR><LF>
//// //orderMaterialExtResp;0;-1;Some material not on the shelf;1408;1;325.618-01;1;;791.704-06NOT_FOUND;0
//// //<STX>orderMaterialExtResp;eventId;returnCode;messageText;workorderNumber;currentWorkorderflag;reflowgroupNumber;numberofPartnumbers;partNumber1;containerNumber;quantity;…;partNumberN;containerNumberN;quantityN<CR><LF>
//// String respMsg = "orderMaterialExtResp;"+ responseEventId+";" + resultCode+";"+resultMsg+";"+workorderNumber+";"+currentWorkorderflag+";"+labelName+";"+numberofPartnumbers +resultDataStr;
////// log.info("工单结果:" + respMsg);
////// session.write("\02"+respMsg);
////
//// HellaTcpClient.sendMsg(respMsg,session);
//// }
// }
//
// /**
// * 入库完成通知
// * <STX>loadMaterial;eventId;scannedCode;shelfNumber;shelfSlot<CR><LF>
// * @return
// */
// private void loadMaterial(String groupId, String scannedCode,String shelfNumber, String shelfSlot){
// HellaReqCommand command = HellaReqCommand.newLoadMaterialCmd(eventId.incrementAndGet(),scannedCode,shelfNumber,shelfSlot);
// command.setGroupId(groupId);
// commandMap.put(command.getEventId(),command);
// log.info("发送入库完成通知:" + command.toReqMsg());
// HellaTcpClient.sendMsg(command.toReqMsg());
// }
//
// @Override
// public void onTaskStatusChange(DataLog task) {
// if(task.isFinished()){
// if(task.isPutInTask()){
// String groupId = task.getGroupId();
// String fullCode = task.getBarcode();
// Barcode barcode = barcodeManager.findByBarcode(task.getBarcode());
// if(barcode != null){
// fullCode = barcode.getFullCode();
// }
// loadMaterial(groupId,fullCode,task.getStorageName(),task.getPosName());
// }
// }
// }
//
//
//}
package com.neotel.smfcore.hella.tcp; //package com.neotel.smfcore.hella.tcp;
//
import cn.hutool.core.util.ObjectUtil; //import cn.hutool.core.util.ObjectUtil;
import com.google.common.base.Strings; //import com.google.common.base.Strings;
import com.neotel.smfcore.common.bean.ResultBean; //import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.StringUtils; //import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.device.util.DataCache; //import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.system.service.po.Settings; //import com.neotel.smfcore.core.system.service.po.Settings;
import com.neotel.smfcore.hella.handler.HellaServiceHandler; //import lombok.Data;
import lombok.Data; //import lombok.extern.slf4j.Slf4j;
import lombok.extern.slf4j.Slf4j; //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.apache.mina.core.filterchain.IoFilterAdapter;
import org.apache.mina.core.filterchain.IoFilterAdapter; //import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.future.ConnectFuture; //import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IdleStatus; //import org.apache.mina.core.session.IoSession;
import org.apache.mina.core.session.IoSession; //import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.ProtocolCodecFilter; //import org.apache.mina.filter.codec.textline.LineDelimiter;
import org.apache.mina.filter.codec.textline.LineDelimiter; //import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory; //import org.apache.mina.filter.logging.MdcInjectionFilter;
import org.apache.mina.filter.logging.MdcInjectionFilter; //import org.apache.mina.transport.socket.nio.NioSocketConnector;
import org.apache.mina.transport.socket.nio.NioSocketConnector; //import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Autowired; //import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.annotation.Value; //import org.springframework.stereotype.Service;
import org.springframework.stereotype.Service; //
//import javax.annotation.PostConstruct;
import javax.annotation.PostConstruct; //import javax.annotation.PreDestroy;
import javax.annotation.PreDestroy; //import java.net.InetSocketAddress;
import java.net.InetSocketAddress; //import java.nio.charset.Charset;
import java.nio.charset.Charset; //
///**
/** // * Created by sunke on 2019/4/17.
* Created by sunke on 2019/4/17. // */
*/ //@Slf4j
@Slf4j //@Service
@Service //public class HellaTcpClient {
public class HellaTcpClient { //
// private static NioSocketConnector connector;
private static NioSocketConnector connector; //
//
// private static String host = "";
private static String host = ""; // private static int port = 9999;
private static int port = 9999; //
// @Value("${hella.host:}")
@Value("${hella.host:}") // public void setHost(String host) {
public void setHost(String host) { // HellaTcpClient.host = host;
HellaTcpClient.host = host; // }
} //
// @Value("${hella.port:9999}")
@Value("${hella.port:9999}") // public void setPort(int port) {
public void setPort(int port) { // HellaTcpClient.port = port;
HellaTcpClient.port = port; // }
} //
// @Autowired
@Autowired // private HellaServiceHandler hellaServiceHandler;
private HellaServiceHandler hellaServiceHandler; //
// @Autowired
@Autowired // private DataCache dataCache;
private DataCache dataCache; //
// private static IoSession theSession;
private static IoSession theSession; //
//
// @PostConstruct
@PostConstruct // public void init(){
public void init(){ // host=dataCache.GetConfigCache("hella.host","hella.host",host);
host=dataCache.GetConfigCache("hella.host","hella.host",host); // port=Integer.parseInt(dataCache.GetConfigCache("hella.port","hella.port",port+"")) ;
port=Integer.parseInt(dataCache.GetConfigCache("hella.port","hella.port",port+"")) ; // updateServerInfo(host, port);
updateServerInfo(host, port); // if(ObjectUtil.isEmpty(host)||ObjectUtil.isEmpty(port)){
if(ObjectUtil.isEmpty(host)||ObjectUtil.isEmpty(port)){ // log.info("配置不完整,不需要连接");
log.info("配置不完整,不需要连接"); // }else{
}else{ // start();
start(); // }
} // }
} //
// public static boolean isEnable() {
public static boolean isEnable() { // if (ObjectUtil.isEmpty(host) || ObjectUtil.isEmpty(port)) {
if (ObjectUtil.isEmpty(host) || ObjectUtil.isEmpty(port)) { // return false;
return false; // } else {
} else { // return true;
return true; // }
} // }
} //
// public static void updateServerInfo(String serverHost, int serverPort){
public static void updateServerInfo(String serverHost, int serverPort){ // host = serverHost;
host = serverHost; // port = serverPort;
port = serverPort; // log.info("设置Tcp连接信息为["+host+":"+port+"]");
log.info("设置Tcp连接信息为["+host+":"+port+"]"); // if(connector != null){
if(connector != null){ // connector.dispose();
connector.dispose(); // }
} // //connectThreadStart();
//connectThreadStart(); // }
} //
// public void start(){
public void start(){ // connector = new NioSocketConnector(); //创建连接客户端
connector = new NioSocketConnector(); //创建连接客户端 // connector.setConnectTimeoutMillis(30000); //设置连接超时
connector.setConnectTimeoutMillis(30000); //设置连接超时 // //断线重连回调拦截器
//断线重连回调拦截器 // connector.getFilterChain().addFirst("reconnection", new IoFilterAdapter() {
connector.getFilterChain().addFirst("reconnection", new IoFilterAdapter() { // @Override
@Override // public void sessionClosed(NextFilter nextFilter, IoSession ioSession) throws Exception {
public void sessionClosed(NextFilter nextFilter, IoSession ioSession) throws Exception { // log.info("执行断线重连");
log.info("执行断线重连"); // connectThreadStart();
connectThreadStart(); // }
} // });
}); //
// connector.getFilterChain().addLast("mdc", new MdcInjectionFilter());
connector.getFilterChain().addLast("mdc", new MdcInjectionFilter()); // TextLineCodecFactory factory = new TextLineCodecFactory(Charset.defaultCharset(), LineDelimiter.CRLF,LineDelimiter.CRLF);
TextLineCodecFactory factory = new TextLineCodecFactory(Charset.defaultCharset(), LineDelimiter.CRLF,LineDelimiter.CRLF); //// factory.setDecoderMaxLineLength(10240);
// factory.setDecoderMaxLineLength(10240); //// factory.setEncoderMaxLineLength(10240);
// factory.setEncoderMaxLineLength(10240); // //加入解码器
//加入解码器 // connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(factory));
connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(factory)); //
// connector.getSessionConfig().setReceiveBufferSize(10240); // 设置接收缓冲区的大小
connector.getSessionConfig().setReceiveBufferSize(10240); // 设置接收缓冲区的大小 // connector.getSessionConfig().setSendBufferSize(10240);// 设置输出缓冲区的大小
connector.getSessionConfig().setSendBufferSize(10240);// 设置输出缓冲区的大小 //
// connector.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 30000); //读写都空闲时间:30秒
connector.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 30000); //读写都空闲时间:30秒 // connector.getSessionConfig().setIdleTime(IdleStatus.READER_IDLE, 40000);//读(接收通道)空闲时间:40秒
connector.getSessionConfig().setIdleTime(IdleStatus.READER_IDLE, 40000);//读(接收通道)空闲时间:40秒 // connector.getSessionConfig().setIdleTime(IdleStatus.WRITER_IDLE, 50000);//写(发送通道)空闲时间:50秒
connector.getSessionConfig().setIdleTime(IdleStatus.WRITER_IDLE, 50000);//写(发送通道)空闲时间:50秒 //
// //添加处理器
//添加处理器 // connector.setHandler(hellaServiceHandler);
connector.setHandler(hellaServiceHandler); // log.info("开始连接");
log.info("开始连接"); // connectThreadStart();
connectThreadStart(); //
//
// }
} // // 停止MINA服务
// 停止MINA服务 // @PreDestroy
@PreDestroy // public void stop() {
public void stop() { // try {
try { // if(connector!=null){
if(connector!=null){ // log.info("stopping the TCP Client");
log.info("stopping the TCP Client"); // connector.dispose();
connector.dispose(); // }else{
}else{ // log.info("stopping the TCP Client: connector=null ");
log.info("stopping the TCP Client: connector=null "); // }
} // } catch (Exception e) {
} catch (Exception e) { // log.error("TCP Server stop error:",e);
log.error("TCP Server stop error:",e); // }
} // }
} //
// private static boolean isConnectThreadRunning = false;
private static boolean isConnectThreadRunning = false; // public static void connectThreadStart(){
public static void connectThreadStart(){ // if(isConnectThreadRunning){
if(isConnectThreadRunning){ // return;
return; // }
} // isConnectThreadRunning = true;
isConnectThreadRunning = true; // new Thread(new Runnable() {
new Thread(new Runnable() { // public void run() {
public void run() { // for (;;) {
for (;;) { // try {
try { // Thread.sleep(5000);// 连接失败后,重连
Thread.sleep(5000);// 连接失败后,重连 // if(!Strings.isNullOrEmpty(host)){
if(!Strings.isNullOrEmpty(host)){ // connector.setDefaultRemoteAddress(new InetSocketAddress(host, port));// 设置默认访问地址
connector.setDefaultRemoteAddress(new InetSocketAddress(host, port));// 设置默认访问地址 // ConnectFuture future = connector.connect();
ConnectFuture future = connector.connect(); // // 等待连接创建成功
// 等待连接创建成功 // future.awaitUninterruptibly();
future.awaitUninterruptibly(); // // 获取会话
// 获取会话 // IoSession ioSession = future.getSession();
IoSession ioSession = future.getSession(); // if(ioSession.isConnected()){
if(ioSession.isConnected()){ // theSession = ioSession;
theSession = ioSession; // log.info("连接["+ connector.getDefaultRemoteAddress().getHostName() +":"+ connector.getDefaultRemoteAddress().getPort()+"]成功");
log.info("连接["+ connector.getDefaultRemoteAddress().getHostName() +":"+ connector.getDefaultRemoteAddress().getPort()+"]成功"); // break;
break; // }else{
}else{ // theSession = null;
theSession = null; // }
} // }
} // } catch (Exception e) {
} catch (Exception e) { // log.error("连接服务端" + host + ":" + port + "失败" + ",异常内容:" + e.getMessage(), e);
log.error("连接服务端" + host + ":" + port + "失败" + ",异常内容:" + e.getMessage(), e); // }
} // }
} // isConnectThreadRunning = false;
isConnectThreadRunning = false; // }
} // }).start();
}).start(); //
// }
} //
//
// public static ResultBean sendMsg(String msg){
public static ResultBean sendMsg(String msg){ // if(theSession != null && theSession.isConnected()){
if(theSession != null && theSession.isConnected()){ // log.info("发送消息到Tcp Server:" + msg);
log.info("发送消息到Tcp Server:" + msg); // theSession.write("\02"+msg);
theSession.write("\02"+msg); // return ResultBean.newOkResult("");
return ResultBean.newOkResult(""); // }else{
}else{ // return ResultBean.newErrorResult(-1,"smfcore.noconnecttion","no connecttion");
return ResultBean.newErrorResult(-1,"smfcore.noconnecttion","no connecttion"); // }
} // }
} //
// public static void sendMsg(String msg,IoSession session){
public static void sendMsg(String msg,IoSession session){ // log.info("发送反馈消息:" + msg);
log.info("发送反馈消息:" + msg); // session.write("\02" + msg);
session.write("\02" + msg); // }
} //
//}
}
...@@ -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!