Commit f13d7263 sunke

1 数据库连接池配置

2 优化挑料速度
1 个父辈 211a0cdc
......@@ -4,6 +4,7 @@ import com.mongodb.client.result.DeleteResult;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
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.PageRequest;
import org.springframework.data.domain.Pageable;
......@@ -23,6 +24,7 @@ import java.util.regex.Pattern;
*/
public abstract class AbstractBaseDao implements IBaseDao {
@Autowired
@Qualifier("mongoTemplate")
private MongoTemplate mongoTemplate;
private final static int DEFAULT_PAGE_SIZE = 10;
protected final transient Logger log = LogManager.getLogger(getClass());
......
......@@ -45,7 +45,7 @@ public class DataInitManager {
MainTimer mainTimer;
//@Value("${menu.show}")
private String[] menuShowList = new String[]{"mslOut"};
private String[] menuShowList = new String[]{/*"commonIn","returnIn","cutIn"*/};
//@Value("${menu.hide}")
private String[] menuHideList = new String[]{};
......@@ -125,8 +125,6 @@ public class DataInitManager {
private Map<String,Menu> getAllMenuMap() {
List<Menu> menus = new ArrayList<Menu>();
Map<String,Menu> functionMenuMap = new HashMap<>();
//物料管理:工单出库,查找出库(UID出库,PN出库),物料标签,料盒操作,出库策略,工单设置
......@@ -135,22 +133,27 @@ public class DataInitManager {
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, "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(out,new ArrayList<Menu>(), 1, "materialBox", "料盒操作", 1, "materialBox", "neolight/materialBox/index", "", 0, "mIbox",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(poutOut,new ArrayList<Menu>(), 1, "dumpWarehousing", "转储入库", 1, "dumpWarehousing", "system/dumpWarehousing/index", "", 0, "dumpWarehousing",functionMenuMap);
addNewFunctionMenu(poutOut,new ArrayList<Menu>(), 1, "singleDiskWarehousing", "单盘入库", 1, "singleDiskWarehousing", "system/singleDiskWarehousing/index", "", 0, "singleDiskWarehousing",functionMenuMap);
addNewFunctionMenu(out,new ArrayList<Menu>(), 1, "dumpWarehousing", "转储入库", 1, "dumpWarehousing", "system/dumpWarehousing/index", "", 0, "dumpWarehousing",functionMenuMap);
addNewFunctionMenu(out,new ArrayList<Menu>(), 1, "singleDiskWarehousing", "单盘入库", 1, "singleDiskWarehousing", "system/singleDiskWarehousing/index", "", 0, "singleDiskWarehousing",functionMenuMap);
addNewFunctionMenu(out,new ArrayList<Menu>(), 1, "sluggishMaterials", "呆滞物料", 1, "sluggishMaterials", "system/sluggishMaterials/index", "", 0, "sMaterial",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(out,new ArrayList<Menu>(), 1, "orderSet", "齐套", 1, "orderSet", "system/orderSet/index", "", 0, "outS",functionMenuMap);
addNewFunctionMenu(poutOut,new ArrayList<Menu>(), 1, "commonIn", "普通入库", 1, "commonIn", "system/singleStockIn/index", "", 0, "singleDiskWarehousing",functionMenuMap);
addNewFunctionMenu(poutOut,new ArrayList<Menu>(), 1, "returnIn", "退料入库", 1, "returnIn", "system/singleStockIn/index", "", 0, "singleDiskWarehousing",functionMenuMap);
addNewFunctionMenu(poutOut,new ArrayList<Menu>(), 1, "cutIn", "截料入库", 1, "cutIn", "system/singleStockIn/index", "", 0, "singleDiskWarehousing",functionMenuMap);
addNewFunctionMenu(poutOut,new ArrayList<Menu>(), 1, "sluggishMaterials", "呆滞物料", 1, "sluggishMaterials", "system/sluggishMaterials/index", "", 0, "sMaterial",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);
addNewFunctionMenu(orderM,new ArrayList<Menu>(), 1, "billworkOrder", "工单", 1, "billworkOrder", "neolight/billworkOrder/index", "", 0, "orderOut",functionMenuMap);
......@@ -245,24 +248,12 @@ public class DataInitManager {
if(dbMenus.isEmpty()){
log.info("创建默认菜单...");
menuListToShow = new String[]{
"lockMaterial", //设备看板
"singleOuput",
"tacticsOuput",
"outSetting",
"componentParts",
"barcode",
"barcodeSetting",
"taskLog",
//"orderSetting",//工单设置
"inOutData", //报表->出入库
"inventory", //报表->库存
"bunker", //设备管理
"storagePos", //库位管理
//"sysSetting", //系统设置
"peoples", //用户管理
"role" //角色管理
"searchOut","singleOuput","tacticsOuput","mslOut","inList","dumpWarehousing",
"commonIn","returnIn","cutIn","sluggishMaterials","safetyInventory","outList","orderSet","billworkOrder",
"reelOut", "orderSheet", "orderShortageOut", "orderShortageSheet", "productionLineReple","productionLineOut",
"componentParts","barcode","barcodeSetting","taskLog","message", "interfaceException",
"bunker","storagePos",
"peoples","role","about"
};
}
......
......@@ -80,6 +80,9 @@ public class DateUtil {
public static Date toDate(String strDate,String aMask)
throws ParseException {
if(ObjectUtil.isEmpty(strDate)){
return null;
}
if(ObjectUtil.isEmpty(aMask)){
aMask="yyyy-MM-dd HH:mm:ss";
}
......
......@@ -7,6 +7,7 @@ import org.springframework.data.mongodb.core.query.Query;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Set;
......@@ -19,6 +20,8 @@ public interface IComponentManager extends IBaseManager<Component> {
Component saveComponent(Component resources);
List<Component> findByPN(Collection<String> pnList);
void deleteComponents(Set<String> ids);
int saveComponentList(List<Component> componentList);
......
......@@ -98,6 +98,13 @@ public class ComponentManagerImpl implements IComponentManager {
}
@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) {
Query query = new Query(Criteria.where("id").in(ids));
List<Component> components = componentDao.findByQuery(query);
......
......@@ -40,6 +40,8 @@ import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReentrantLock;
@Api(tags = "SHELF: NLP感应料架")
@RestController
......@@ -129,6 +131,8 @@ public class NLPShelfHandler extends BaseDeviceHandler{
return statusBean;
}
private static Map<String,Boolean> processMap = new ConcurrentHashMap<>();
/**
* 客户端sensor变化
*/
......@@ -141,7 +145,17 @@ public class NLPShelfHandler extends BaseDeviceHandler{
if(storage == null){
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");
//实际信号无料,数据库有信息
......@@ -159,9 +173,9 @@ public class NLPShelfHandler extends BaseDeviceHandler{
if(noReelPosErrorList.length>0){
//log.info("开始检测noReelPosErrorList");
for (String noReelPosName : noReelPosErrorList) {
if(usedPosNameList.contains(noReelPosName)){
if(!usedPosNameList.contains(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{
String[] hasReelPosList = request.getParameterValues("hasReelPosList");
if(hasReelPosList != null){
log.info("开始检测hasReelPosList");
log.info(cid+"开始检测hasReelPosList");
Set<String> disabledPosNameSet = dataCache.getDisabledPosNameSet();
List<String> newList=new ArrayList<>();
for (String posName : hasReelPosList) {
if(disabledPosNameSet.contains(posName)){
log.info("sensorChange hasReelPosList [" + posName + "]库位被禁用,忽略");
log.info(cid + "sensorChange hasReelPosList [" + posName + "]库位被禁用,忽略");
continue;
}
newList.add(posName);
......@@ -193,20 +207,20 @@ public class NLPShelfHandler extends BaseDeviceHandler{
//入库的库位列表
if(hasReelPosList.length > 1){
String msg = "不可同时放入多盘物料:"+ String.join(",",hasReelPosList);
String msg = cid + "不可同时放入多盘物料:"+ String.join(",",hasReelPosList);
log.error(msg);
for (String posStr : hasReelPosList) {
inNgList.add(posStr);
}
}else if (hasReelPosList.length==1){
log.info("开始检测执行入库");
log.info(cid + "开始检测执行入库到库位:["+hasReelPosList[0]+"]");
StoragePos pos = storagePosManager.getByPosName(hasReelPosList[0]);
if(pos == null){
String msg = "未找到库位:"+String.join(",",hasReelPosList) ;
log.error(msg);
}
else if(!pos.getStorageId().equals(storage.getId())){
String msg = "["+storage.getName()+"]未找到库位:"+String.join(",",hasReelPosList) ;
String msg = "["+ cid +"]未找到库位:"+String.join(",",hasReelPosList) ;
log.error(msg);
}
//如果库位有料,直接结束
......@@ -214,7 +228,9 @@ public class NLPShelfHandler extends BaseDeviceHandler{
log.info("料架[" + cid + "]入库库位[" + pos.getPosName() + "]已有料: [" + pos.getBarcode().getBarcode() + "]");
}
else{
log.info(cid + "处理有料库位:["+pos.getPosName()+"]");
boolean posInResult = handlePosIn(storage,pos);
log.info(cid + "处理有料库位:["+pos.getPosName()+"]完成,结果:" + posInResult);
if(posInResult){
inOkList.add(pos.getPosName());
}else{
......@@ -227,9 +243,10 @@ public class NLPShelfHandler extends BaseDeviceHandler{
String[] noReelPosList = request.getParameterValues("noReelPosList");
if(noReelPosList != null){
//出库
log.info("出库检测noReelPosList");
for (String noReelPosName : noReelPosList) {
log.info(cid + "处理无料库位:["+noReelPosName+"]");
boolean handleNoReelPosResult = handleNoReelPos(storage,usedPosNameList,noReelPosName);
log.info(cid + "处理无料库位:["+noReelPosName+"]完成,结果:" + handleNoReelPosResult);
if(handleNoReelPosResult){
outOkList.add(noReelPosName);
}else{
......@@ -245,9 +262,13 @@ public class NLPShelfHandler extends BaseDeviceHandler{
dataMap.put("outNgList",outNgList);
dataMap.put("ngToOk",ngToOk);
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{
queueTask.setStorageName(storage.getName());
try {
//入库完成,发送入库完成请求
log.info("入库完成,发送入库完成请求");
log.info(queueTask.getBarcode() + "入库完成,发送入库完成请求");
super.finishedPutIn(storage.getCid(), pos.getPosName());
String msg = queueTask.getBarcode() + "入库到" + pos.getPosName() + "成功";
log.info(msg);
......@@ -315,7 +336,7 @@ public class NLPShelfHandler extends BaseDeviceHandler{
return inResult;
}
}
log.error("未找到["+pos.getPosName()+"]的入库任务");
log.warn("未找到["+pos.getPosName()+"]的入库任务");
return false;
}
......
......@@ -448,7 +448,22 @@ public class LiteOrderCache implements ITaskListener {
List<String> excludePosIds = Lists.newArrayList();
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()) {
......@@ -460,7 +475,12 @@ public class LiteOrderCache implements ITaskListener {
}
//查找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;
List<StoragePos> outPosList = new ArrayList<>();
......@@ -491,6 +511,7 @@ public class LiteOrderCache implements ITaskListener {
//排除掉这些库位,以免重复挑取同一盘料
for (StoragePos storagePos : outPosList) {
excludePosIds.add(storagePos.getId());
outPosNameList.add(storagePos.getPosName());
int reelAmount = storagePos.getBarcode().getAmount();
outNum = outNum + reelAmount;
}
......@@ -507,7 +528,13 @@ public class LiteOrderCache implements ITaskListener {
//判断是否需要截料
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.getMinStoreNum()>0&& posList.size() <=component.getMinStoreNum()){
needJieliao=true;
......@@ -735,7 +762,7 @@ public class LiteOrderCache implements ITaskListener {
* @param targetNum
* @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<StoragePos> outPosList = new ArrayList<>();
......@@ -813,7 +840,7 @@ public class LiteOrderCache implements ITaskListener {
* @param targetNum
* @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<StoragePos> itemPickPosList = new ArrayList<>();
boolean pickMaxQtyReel = false;
......
......@@ -155,12 +155,8 @@ public class OrderShortageController {
List<DataLog> taskList = new ArrayList<>();
if (liteOrders.size() > 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();
for (DataLog datalog :
allTasks) {
for (DataLog datalog : allTasks) {
if (datalog.isOrderTask() && datalog.getSourceId().equals(liteOrder.getId())) {
//判断是否是缺料出库
if (datalog.isAddOutbound()) {
......
......@@ -230,6 +230,21 @@ public class OutListCache implements ITaskListener {
Map<String, List<StoragePos>> needOutPosMap = new HashMap<>();//挑出的需要出库的料列表,key=itemId,value=库位
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()) {
String pn = outListItem.getMaterialNo();
......@@ -239,7 +254,13 @@ public class OutListCache implements ITaskListener {
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(isShortageOut){
shortage=true;
......@@ -251,7 +272,12 @@ public class OutListCache implements ITaskListener {
}
//查找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+"的物料");
int storageNum = 0;
......
......@@ -69,5 +69,5 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
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 {
return new ArrayList<>();
}
@Override
public List<StoragePos> findOrderItemInStorage(List<String> storageIdList,String pn, Collection<String> excludePosIds ) {
Criteria c = Criteria.where("barcode.partNumber").is(pn)
public List<StoragePos> findOrderItemInStorage(List<String> storageIdList,Set<String> pnList, Collection<String> excludePosIds ) {
Criteria c = Criteria.where("barcode.partNumber").in(pnList)
.and("id").nin(excludePosIds)
.and("enabled").is(true)//可用
.and("barcode.lockId").is(null)//没有被锁定的仓位;
......@@ -632,9 +634,9 @@ public class StoragePosManagerImpl implements IStoragePosManager {
//sort.and(Sort.by(Sort.Direction.ASC, "canCheckOutTime"));
q.with(amountSort).with(batchSort);
List<StoragePos> posList = storagePosDao.findByQuery(q);
if (posList == null || posList.size() <= 0) {
log.info("findOrderItemInStorage 挑料 partNumber=" + pn + ",未找到可以出库的物料 ");
}
// if (posList == null || posList.size() <= 0) {
// log.info("findOrderItemInStorage 挑料未找到可以出库的物料 ");
// }
return posList;
}
......
package com.neotel.smfcore.hella.handler;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.api.CodeValidateParam;
import com.neotel.smfcore.core.device.api.IOpAuthApi;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.hella.tcp.HellaTcpClient;
import com.neotel.smfcore.hella.tcp.command.HellaReqCommand;
import com.neotel.smfcore.hella.tcp.command.HellaRespCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class HellaApiHandler implements IOpAuthApi {
@Autowired
private HellaServiceHandler hellaServiceHandler;
@Override
public Barcode resolveBarcode(CodeValidateParam param) throws ValidateException {
if (!isEnable()) {
return null;
}
hellaServiceHandler.checkMaterial(param);
Barcode barcode = new Barcode();
barcode.setFullCode(param.getCode());
return barcode;
}
@Override
public Barcode canPutIn(Barcode barcode) throws ValidateException {
if (!isEnable()) {
return null;
}
return barcode;
}
@Override
public boolean canCheckout(Barcode barcode) throws ValidateException {
if(!isEnable()){
return false;
}
return false;
}
@Override
public boolean isEnable() {
return HellaTcpClient.isEnable();
}
}
//package com.neotel.smfcore.hella.handler;
//
//import cn.hutool.core.util.ObjectUtil;
//import com.neotel.smfcore.common.bean.ResultBean;
//import com.neotel.smfcore.common.exception.ValidateException;
//import com.neotel.smfcore.core.barcode.service.po.Barcode;
//import com.neotel.smfcore.core.device.api.CodeValidateParam;
//import com.neotel.smfcore.core.device.api.IOpAuthApi;
//import com.neotel.smfcore.core.storage.service.po.Storage;
//import com.neotel.smfcore.hella.tcp.HellaTcpClient;
//import com.neotel.smfcore.hella.tcp.command.HellaReqCommand;
//import com.neotel.smfcore.hella.tcp.command.HellaRespCommand;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//
//import java.util.ArrayList;
//import java.util.List;
//@Service
//public class HellaApiHandler implements IOpAuthApi {
//
// @Autowired
// private HellaServiceHandler hellaServiceHandler;
// @Override
// public Barcode resolveBarcode(CodeValidateParam param) throws ValidateException {
//
// if (!isEnable()) {
// return null;
// }
// hellaServiceHandler.checkMaterial(param);
// Barcode barcode = new Barcode();
// barcode.setFullCode(param.getCode());
// return barcode;
// }
//
// @Override
// public Barcode canPutIn(Barcode barcode) throws ValidateException {
// if (!isEnable()) {
// return null;
// }
// return barcode;
// }
//
// @Override
// public boolean canCheckout(Barcode barcode) throws ValidateException {
// if(!isEnable()){
// return false;
// }
// return false;
// }
//
// @Override
// public boolean isEnable() {
// return HellaTcpClient.isEnable();
// }
//}
package com.neotel.smfcore.hella.handler;
import cn.hutool.core.util.ObjectUtil;
import com.google.common.collect.Lists;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException;
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.IComponentManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.service.po.Component;
import com.neotel.smfcore.core.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.device.api.CodeValidateParam;
import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.LiteOrderCache;
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.LiteOrderItem;
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.IStoragePosManager;
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.StoragePos;
import com.neotel.smfcore.core.system.listener.ITaskListener;
import com.neotel.smfcore.core.system.service.dao.IDataLogDao;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.core.system.websocket.MsgType;
import com.neotel.smfcore.core.system.websocket.SocketMsg;
import com.neotel.smfcore.core.system.websocket.WebSocketServer;
import com.neotel.smfcore.hella.tcp.HellaTcpClient;
import com.neotel.smfcore.hella.tcp.command.HellaReqCommand;
import com.neotel.smfcore.hella.tcp.command.HellaRespCommand;
import com.neotel.smfcore.security.service.manager.IGroupManager;
import com.neotel.smfcore.security.service.po.Group;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.util.Strings;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
/**
* Created by sunke on 2021/5/26.
*/
@Service
public class HellaServiceHandler extends IoHandlerAdapter implements ITaskListener {
@Autowired
private IComponentManager componentManager;
@Autowired
private IBarcodeManager barcodeManager;
@Autowired
private IDataLogDao dataLogDao;
@Autowired
private TaskService taskService;
@Autowired
protected IStoragePosManager storagePosManager;
@Autowired
protected ILiteOrderManager liteOrderManager;
@Autowired
private DataCache dataCache;
@Autowired
private LiteOrderCache liteOrderCache;
@Autowired
private IGroupManager groupManager;
@Autowired
private ILabelManager labelManager;
@Autowired
private CodeResolve codeResolve;
protected final static Logger log = LogManager.getLogger();
private AtomicLong eventId = new AtomicLong(0);
private Map<String,HellaReqCommand> commandMap = new ConcurrentHashMap<>();
/**
* 检查物料条码
* <STX>checkMaterial;eventId;scannedCode<CR><LF>
* @return
*/
public ResultBean checkMaterial(CodeValidateParam param){
String loginUser=param.getLoginUser();
String groupId=param.getGroupId();
String storageId=param.getStorageId();
String scannedCode= param.getCode();
String token=param.getToken();
HellaReqCommand command = HellaReqCommand.newCheckMaterialCmd(eventId.incrementAndGet(),scannedCode);
command.setToken(token);
command.setGroupId(groupId);
boolean storageCheckMaterial=false;
if(ObjectUtil.isNotEmpty(storageId)){
Storage storage=dataCache.getStorageById(storageId);
if(storage!=null){
storageCheckMaterial=true;
command.setGroupId(storage.getGroupId());
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;
// }
// }
//package com.neotel.smfcore.hella.handler;
//
//import cn.hutool.core.util.ObjectUtil;
//import com.google.common.collect.Lists;
//import com.neotel.smfcore.common.bean.ResultBean;
//import com.neotel.smfcore.common.exception.ValidateException;
//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.IComponentManager;
//import com.neotel.smfcore.core.barcode.service.po.Barcode;
//import com.neotel.smfcore.core.barcode.service.po.Component;
//import com.neotel.smfcore.core.barcode.utils.CodeResolve;
//import com.neotel.smfcore.core.device.api.CodeValidateParam;
//import com.neotel.smfcore.core.device.enums.OP;
//import com.neotel.smfcore.core.device.enums.OP_STATUS;
//import com.neotel.smfcore.core.device.util.DataCache;
//import com.neotel.smfcore.core.order.LiteOrderCache;
//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.LiteOrderItem;
//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.IStoragePosManager;
//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.StoragePos;
//import com.neotel.smfcore.core.system.listener.ITaskListener;
//import com.neotel.smfcore.core.system.service.dao.IDataLogDao;
//import com.neotel.smfcore.core.system.service.po.DataLog;
//import com.neotel.smfcore.core.system.util.TaskService;
//import com.neotel.smfcore.core.system.websocket.MsgType;
//import com.neotel.smfcore.core.system.websocket.SocketMsg;
//import com.neotel.smfcore.core.system.websocket.WebSocketServer;
//import com.neotel.smfcore.hella.tcp.HellaTcpClient;
//import com.neotel.smfcore.hella.tcp.command.HellaReqCommand;
//import com.neotel.smfcore.hella.tcp.command.HellaRespCommand;
//import com.neotel.smfcore.security.service.manager.IGroupManager;
//import com.neotel.smfcore.security.service.po.Group;
//import org.apache.logging.log4j.LogManager;
//import org.apache.logging.log4j.Logger;
//import org.apache.logging.log4j.util.Strings;
//import org.apache.mina.core.service.IoHandlerAdapter;
//import org.apache.mina.core.session.IdleStatus;
//import org.apache.mina.core.session.IoSession;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//
//import java.util.*;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.concurrent.atomic.AtomicLong;
//
///**
// * Created by sunke on 2021/5/26.
// */
//@Service
//public class HellaServiceHandler extends IoHandlerAdapter implements ITaskListener {
//
// @Autowired
// private IComponentManager componentManager;
//
// @Autowired
// private IBarcodeManager barcodeManager;
//
// @Autowired
// private IDataLogDao dataLogDao;
//
// @Autowired
// private TaskService taskService;
//
// @Autowired
// protected IStoragePosManager storagePosManager;
//
// @Autowired
// protected ILiteOrderManager liteOrderManager;
//
// @Autowired
// private DataCache dataCache;
//
// @Autowired
// private LiteOrderCache liteOrderCache;
//
// @Autowired
// private IGroupManager groupManager;
//
// @Autowired
// private ILabelManager labelManager;
//
// @Autowired
// private CodeResolve codeResolve;
//
// protected final static Logger log = LogManager.getLogger();
//
// private AtomicLong eventId = new AtomicLong(0);
//
// private Map<String,HellaReqCommand> commandMap = new ConcurrentHashMap<>();
//
// /**
// * 检查物料条码
// * <STX>checkMaterial;eventId;scannedCode<CR><LF>
// * @return
// */
// public ResultBean checkMaterial(CodeValidateParam param){
// String loginUser=param.getLoginUser();
// String groupId=param.getGroupId();
// String storageId=param.getStorageId();
// String scannedCode= param.getCode();
// String token=param.getToken();
//
// HellaReqCommand command = HellaReqCommand.newCheckMaterialCmd(eventId.incrementAndGet(),scannedCode);
// command.setToken(token);
// command.setGroupId(groupId);
// boolean storageCheckMaterial=false;
// if(ObjectUtil.isNotEmpty(storageId)){
// Storage storage=dataCache.getStorageById(storageId);
// if(storage!=null){
// storageCheckMaterial=true;
// command.setGroupId(storage.getGroupId());
// command.setStorageId(storageId);
// }
String lineNumber=resposArr[2];
List<String> shelfIds=new ArrayList<>();
if(ObjectUtil.isNotEmpty(lineNumber)){
Group group= groupManager.getByGroupName(lineNumber);
if(group!=null){
shelfIds =dataCache. getStorageIdsByGroupId(group.getId(), false);
}
}
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();
// }
// 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());
// }
if(shelfIds.size()<=0){
shelfIds.add("");
}
log.info("getInventory,lineNumber["+lineNumber+"],shelfIds["+String.join(",",shelfIds)+"]");
for (String shelfId :
shelfIds) {
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 ;
// }else {
// if (hellaReqCommand.getGroupId().equals(groupId) && hellaReqCommand.isCheckMaterialReq()) {
// //有未完成的入库请求
// commandMap.remove(hellaReqCommand.getEventId());
// log.info("清理未完成的入库检查请求[" + hellaReqCommand.getEventId() + "]:" + hellaReqCommand.getData());
// //return ResultBean.newErrorResult(-1,"["+hellaReqCommand.getData()+"]入库任务未完成,无法入库");
// }
// }
// }
//
// 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;
// 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}));
// }
// 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());
// 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 labelId="";
// if(ObjectUtil.isNotEmpty(labelName)){
// Label label=labelManager.getBylabelName(labelName );
// if(label!=null){
// labelId=label.getId() ;
// String lineNumber=resposArr[2];
// List<String> shelfIds=new ArrayList<>();
// if(ObjectUtil.isNotEmpty(lineNumber)){
// Group group= groupManager.getByGroupName(lineNumber);
// if(group!=null){
// shelfIds =dataCache. getStorageIdsByGroupId(group.getId(), false);
// }
// }
//
//
// 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);
// 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){
// shelfIds.add("");
// }
// log.info("getInventory,lineNumber["+lineNumber+"],shelfIds["+String.join(",",shelfIds)+"]");
// for (String shelfId :
// shelfIds) {
// 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;
// }
// 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";
// }
// 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);
//
// if("1".equals(currentWorkorderflag)){
// liteOrderCache.checkOutOrder(liteOrder);
// 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()}));
// }
// //<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}));
// }
}
/**
* 入库完成通知
* <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());
}
}
}
}
// 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);
//// }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;
import cn.hutool.core.util.ObjectUtil;
import com.google.common.base.Strings;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.system.service.po.Settings;
import com.neotel.smfcore.hella.handler.HellaServiceHandler;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.mina.core.filterchain.IoFilterAdapter;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.LineDelimiter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.MdcInjectionFilter;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
/**
* Created by sunke on 2019/4/17.
*/
@Slf4j
@Service
public class HellaTcpClient {
private static NioSocketConnector connector;
private static String host = "";
private static int port = 9999;
@Value("${hella.host:}")
public void setHost(String host) {
HellaTcpClient.host = host;
}
@Value("${hella.port:9999}")
public void setPort(int port) {
HellaTcpClient.port = port;
}
@Autowired
private HellaServiceHandler hellaServiceHandler;
@Autowired
private DataCache dataCache;
private static IoSession theSession;
@PostConstruct
public void init(){
host=dataCache.GetConfigCache("hella.host","hella.host",host);
port=Integer.parseInt(dataCache.GetConfigCache("hella.port","hella.port",port+"")) ;
updateServerInfo(host, port);
if(ObjectUtil.isEmpty(host)||ObjectUtil.isEmpty(port)){
log.info("配置不完整,不需要连接");
}else{
start();
}
}
public static boolean isEnable() {
if (ObjectUtil.isEmpty(host) || ObjectUtil.isEmpty(port)) {
return false;
} else {
return true;
}
}
public static void updateServerInfo(String serverHost, int serverPort){
host = serverHost;
port = serverPort;
log.info("设置Tcp连接信息为["+host+":"+port+"]");
if(connector != null){
connector.dispose();
}
//connectThreadStart();
}
public void start(){
connector = new NioSocketConnector(); //创建连接客户端
connector.setConnectTimeoutMillis(30000); //设置连接超时
//断线重连回调拦截器
connector.getFilterChain().addFirst("reconnection", new IoFilterAdapter() {
@Override
public void sessionClosed(NextFilter nextFilter, IoSession ioSession) throws Exception {
log.info("执行断线重连");
connectThreadStart();
}
});
connector.getFilterChain().addLast("mdc", new MdcInjectionFilter());
TextLineCodecFactory factory = new TextLineCodecFactory(Charset.defaultCharset(), LineDelimiter.CRLF,LineDelimiter.CRLF);
// factory.setDecoderMaxLineLength(10240);
// factory.setEncoderMaxLineLength(10240);
//加入解码器
connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(factory));
connector.getSessionConfig().setReceiveBufferSize(10240); // 设置接收缓冲区的大小
connector.getSessionConfig().setSendBufferSize(10240);// 设置输出缓冲区的大小
connector.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 30000); //读写都空闲时间:30秒
connector.getSessionConfig().setIdleTime(IdleStatus.READER_IDLE, 40000);//读(接收通道)空闲时间:40秒
connector.getSessionConfig().setIdleTime(IdleStatus.WRITER_IDLE, 50000);//写(发送通道)空闲时间:50秒
//添加处理器
connector.setHandler(hellaServiceHandler);
log.info("开始连接");
connectThreadStart();
}
// 停止MINA服务
@PreDestroy
public void stop() {
try {
if(connector!=null){
log.info("stopping the TCP Client");
connector.dispose();
}else{
log.info("stopping the TCP Client: connector=null ");
}
} catch (Exception e) {
log.error("TCP Server stop error:",e);
}
}
private static boolean isConnectThreadRunning = false;
public static void connectThreadStart(){
if(isConnectThreadRunning){
return;
}
isConnectThreadRunning = true;
new Thread(new Runnable() {
public void run() {
for (;;) {
try {
Thread.sleep(5000);// 连接失败后,重连
if(!Strings.isNullOrEmpty(host)){
connector.setDefaultRemoteAddress(new InetSocketAddress(host, port));// 设置默认访问地址
ConnectFuture future = connector.connect();
// 等待连接创建成功
future.awaitUninterruptibly();
// 获取会话
IoSession ioSession = future.getSession();
if(ioSession.isConnected()){
theSession = ioSession;
log.info("连接["+ connector.getDefaultRemoteAddress().getHostName() +":"+ connector.getDefaultRemoteAddress().getPort()+"]成功");
break;
}else{
theSession = null;
}
}
} catch (Exception e) {
log.error("连接服务端" + host + ":" + port + "失败" + ",异常内容:" + e.getMessage(), e);
}
}
isConnectThreadRunning = false;
}
}).start();
}
public static ResultBean sendMsg(String msg){
if(theSession != null && theSession.isConnected()){
log.info("发送消息到Tcp Server:" + msg);
theSession.write("\02"+msg);
return ResultBean.newOkResult("");
}else{
return ResultBean.newErrorResult(-1,"smfcore.noconnecttion","no connecttion");
}
}
public static void sendMsg(String msg,IoSession session){
log.info("发送反馈消息:" + msg);
session.write("\02" + msg);
}
}
//package com.neotel.smfcore.hella.tcp;
//
//import cn.hutool.core.util.ObjectUtil;
//import com.google.common.base.Strings;
//import com.neotel.smfcore.common.bean.ResultBean;
//import com.neotel.smfcore.common.utils.StringUtils;
//import com.neotel.smfcore.core.device.util.DataCache;
//import com.neotel.smfcore.core.system.service.po.Settings;
//import lombok.Data;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.logging.log4j.LogManager;
//import org.apache.logging.log4j.Logger;
//import org.apache.mina.core.filterchain.IoFilterAdapter;
//import org.apache.mina.core.future.ConnectFuture;
//import org.apache.mina.core.session.IdleStatus;
//import org.apache.mina.core.session.IoSession;
//import org.apache.mina.filter.codec.ProtocolCodecFilter;
//import org.apache.mina.filter.codec.textline.LineDelimiter;
//import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
//import org.apache.mina.filter.logging.MdcInjectionFilter;
//import org.apache.mina.transport.socket.nio.NioSocketConnector;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Service;
//
//import javax.annotation.PostConstruct;
//import javax.annotation.PreDestroy;
//import java.net.InetSocketAddress;
//import java.nio.charset.Charset;
//
///**
// * Created by sunke on 2019/4/17.
// */
//@Slf4j
//@Service
//public class HellaTcpClient {
//
// private static NioSocketConnector connector;
//
//
// private static String host = "";
// private static int port = 9999;
//
// @Value("${hella.host:}")
// public void setHost(String host) {
// HellaTcpClient.host = host;
// }
//
// @Value("${hella.port:9999}")
// public void setPort(int port) {
// HellaTcpClient.port = port;
// }
//
// @Autowired
// private HellaServiceHandler hellaServiceHandler;
//
// @Autowired
// private DataCache dataCache;
//
// private static IoSession theSession;
//
//
// @PostConstruct
// public void init(){
// host=dataCache.GetConfigCache("hella.host","hella.host",host);
// port=Integer.parseInt(dataCache.GetConfigCache("hella.port","hella.port",port+"")) ;
// updateServerInfo(host, port);
// if(ObjectUtil.isEmpty(host)||ObjectUtil.isEmpty(port)){
// log.info("配置不完整,不需要连接");
// }else{
// start();
// }
// }
//
// public static boolean isEnable() {
// if (ObjectUtil.isEmpty(host) || ObjectUtil.isEmpty(port)) {
// return false;
// } else {
// return true;
// }
// }
//
// public static void updateServerInfo(String serverHost, int serverPort){
// host = serverHost;
// port = serverPort;
// log.info("设置Tcp连接信息为["+host+":"+port+"]");
// if(connector != null){
// connector.dispose();
// }
// //connectThreadStart();
// }
//
// public void start(){
// connector = new NioSocketConnector(); //创建连接客户端
// connector.setConnectTimeoutMillis(30000); //设置连接超时
// //断线重连回调拦截器
// connector.getFilterChain().addFirst("reconnection", new IoFilterAdapter() {
// @Override
// public void sessionClosed(NextFilter nextFilter, IoSession ioSession) throws Exception {
// log.info("执行断线重连");
// connectThreadStart();
// }
// });
//
// connector.getFilterChain().addLast("mdc", new MdcInjectionFilter());
// TextLineCodecFactory factory = new TextLineCodecFactory(Charset.defaultCharset(), LineDelimiter.CRLF,LineDelimiter.CRLF);
//// factory.setDecoderMaxLineLength(10240);
//// factory.setEncoderMaxLineLength(10240);
// //加入解码器
// connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(factory));
//
// connector.getSessionConfig().setReceiveBufferSize(10240); // 设置接收缓冲区的大小
// connector.getSessionConfig().setSendBufferSize(10240);// 设置输出缓冲区的大小
//
// connector.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 30000); //读写都空闲时间:30秒
// connector.getSessionConfig().setIdleTime(IdleStatus.READER_IDLE, 40000);//读(接收通道)空闲时间:40秒
// connector.getSessionConfig().setIdleTime(IdleStatus.WRITER_IDLE, 50000);//写(发送通道)空闲时间:50秒
//
// //添加处理器
// connector.setHandler(hellaServiceHandler);
// log.info("开始连接");
// connectThreadStart();
//
//
// }
// // 停止MINA服务
// @PreDestroy
// public void stop() {
// try {
// if(connector!=null){
// log.info("stopping the TCP Client");
// connector.dispose();
// }else{
// log.info("stopping the TCP Client: connector=null ");
// }
// } catch (Exception e) {
// log.error("TCP Server stop error:",e);
// }
// }
//
// private static boolean isConnectThreadRunning = false;
// public static void connectThreadStart(){
// if(isConnectThreadRunning){
// return;
// }
// isConnectThreadRunning = true;
// new Thread(new Runnable() {
// public void run() {
// for (;;) {
// try {
// Thread.sleep(5000);// 连接失败后,重连
// if(!Strings.isNullOrEmpty(host)){
// connector.setDefaultRemoteAddress(new InetSocketAddress(host, port));// 设置默认访问地址
// ConnectFuture future = connector.connect();
// // 等待连接创建成功
// future.awaitUninterruptibly();
// // 获取会话
// IoSession ioSession = future.getSession();
// if(ioSession.isConnected()){
// theSession = ioSession;
// log.info("连接["+ connector.getDefaultRemoteAddress().getHostName() +":"+ connector.getDefaultRemoteAddress().getPort()+"]成功");
// break;
// }else{
// theSession = null;
// }
// }
// } catch (Exception e) {
// log.error("连接服务端" + host + ":" + port + "失败" + ",异常内容:" + e.getMessage(), e);
// }
// }
// isConnectThreadRunning = false;
// }
// }).start();
//
// }
//
//
// public static ResultBean sendMsg(String msg){
// if(theSession != null && theSession.isConnected()){
// log.info("发送消息到Tcp Server:" + msg);
// theSession.write("\02"+msg);
// return ResultBean.newOkResult("");
// }else{
// return ResultBean.newErrorResult(-1,"smfcore.noconnecttion","no connecttion");
// }
// }
//
// public static void sendMsg(String msg,IoSession session){
// log.info("发送反馈消息:" + msg);
// session.write("\02" + msg);
// }
//
//}
......@@ -330,6 +330,7 @@ public class HikApi {
RequestParam info = new RequestParam(getReqCode(), userName, dataMap);
HikApiRequest request = new HikApiRequest(5, url,config.key_5_putInApi,config.secret_5_putInApi, info);
apiName = apiName +" ("+info.getReqCode()+") ";
log.info(apiName+" 发送 " + info.getData());
try {
......
......@@ -74,8 +74,7 @@ public class HikvisionApiController {
// msg string 提示消息
// data 返回数据
if (outInfos != null && outInfos.size() > 0) {
for (HikOrderInfo outInfo :
outInfos) {
for (HikOrderInfo outInfo : outInfos) {
//查找工单是否存在
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
......@@ -93,7 +93,8 @@ spring:
mongodb:
host: localhost # 主机地址
port: 27017 # 端口
database: hikvision20220801 # 数据库
database: hikvision # 数据库
messages:
encoding: utf-8
main:
......
......@@ -6,10 +6,10 @@
</Properties>
<appenders>
<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>
<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>
<TimeBasedTriggeringPolicy modulate="true" interval="1" />
</Policies>
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!