Commit b3e54ce0 sunke

完善Neotel接口

1 个父辈 e949681c
......@@ -110,7 +110,7 @@ public class NLPShelfHandler extends BaseDeviceHandler{
return putIn(loginUser,groupId,storageId, barcodeSave,token);
}
private ResultBean putIn(String loginUser, String groupId,String storageId,Barcode barcode,String token) {
protected ResultBean putIn(String loginUser, String groupId,String storageId,Barcode barcode,String token) {
// CodeBean codeBean = codeResolve.resolveSingleCode(codeStr);
if (barcode == null || barcode.getBarcode() == null) {
......
......@@ -224,6 +224,19 @@ public class LiteOrderCache {
smfApi.onOrderStatusChange(liteOrder);
}
private LiteOrder getLiteOrder(String orderNo){
LiteOrder order = liteOrderMap.get(orderNo);
if (order == null) {
log.info("缓存中未找到[" + orderNo + "],从数据库中重新加载");
order = liteOrderManager.findByOrderNo(orderNo);
if(order != null){
List<LiteOrderItem> items = liteOrderItemManager.findOrderItems(order.getId());
order.setOrderItems(items);
}
}
return order;
}
/**
* 更新工单状态信息
*/
......@@ -233,15 +246,7 @@ public class LiteOrderCache {
//更新工单状态
String orderNo = task.getSourceName();
if (!Strings.isNullOrEmpty(orderNo)) {
LiteOrder order = liteOrderMap.get(orderNo);
if (order == null) {
log.info("缓存中未找到[" + orderNo + "],从数据库中重新加载");
order = liteOrderManager.findByOrderNo(orderNo);
if(order != null){
List<LiteOrderItem> items = liteOrderItemManager.findOrderItems(order.getId());
order.setOrderItems(items);
}
}
LiteOrder order = getLiteOrder(orderNo);
if (order != null) {
//任务是取消的,需要将总待出库数量-1
if (task.isCancel()) {
......
......@@ -66,4 +66,6 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
List<StoragePos> findPosList(String storageId, List<String> posNames);
List<StoragePos> getSameSizeContinuityEmptyPosList(Storage storage, Barcode barcode) throws ValidateException;
List<StoragePos> findByBarcodesAndPartNums(List<String> storageIds, List<String> partNums, List<String> reelIds);
}
......@@ -580,4 +580,22 @@ public class StoragePosManagerImpl implements IStoragePosManager {
return prefixStr +String.format("%0"+posIndexStr.length()+"d",nextPosIndex);
}
@Override
public List<StoragePos> findByBarcodesAndPartNums(List<String> storageIds, List<String> partNums, List<String> reelIds) {
//构造查询条件
Query query = new Query();
Criteria criteria = Criteria.where("barcode").exists(true);
if(storageIds != null && storageIds.isEmpty()){
criteria.and("storageId").in(storageIds);
}
if (reelIds != null && !reelIds.isEmpty()){
criteria.and("barcode.barcode").in(reelIds);
}
if (partNums != null && !partNums.isEmpty()){
criteria.and("barcode.partNumber").in(partNums);
}
query.addCriteria(criteria);
return storagePosDao.findByQuery(query);
}
}
package com.neotel.smfcore.custom.neotel;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.common.utils.HttpHelper;
import com.neotel.smfcore.common.utils.JsonUtil;
import com.neotel.smfcore.core.api.bean.ApiResult;
import com.neotel.smfcore.core.api.listener.BaseSmfApiListener;
import com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderItemManager;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.system.service.po.DataLog;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.text.ParseException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Service
@Slf4j
public class NeotelApi extends BaseSmfApiListener {
@Autowired
private ILiteOrderItemManager liteOrderItemManager;
@Override
public boolean isForThisApi(String apiName) {
return apiName != null && apiName.equalsIgnoreCase("neotel");
}
@Override
public void inTaskStatusChange(String inNotifyUrl, DataLog task) {
String requestParams = "";
String responseInfo = "";
if (task.isFinished()) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("reelId", task.getBarcode());
paramMap.put("location", task.getPosName());
paramMap.put("source", "SMF");
Barcode barcode = barcodeManager.findByBarcode(task.getBarcode());
String fullCode = "";
if (barcode != null) {
fullCode = barcode.getFullCode();
}
paramMap.put("fullCode", fullCode);
try {
requestParams = JsonUtil.toJsonStr(paramMap);
log.info(task.getBarcode() + "入库通知,参数" + requestParams);
responseInfo = HttpHelper.postJson(inNotifyUrl, paramMap);
log.info(task.getBarcode() + "入库通知返回" + responseInfo);
ApiResult apiResult = JsonUtil.toObj(responseInfo, ApiResult.class);
} catch (Exception e) {
log.error("入库通知接口出错:" + e.getMessage());
}
}
}
@Override
public void outTaskStatusChange(String outNotifyUrl, DataLog task) {
String requestParams = "";
String responseInfo = "";
if (task.isFinished()) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("reelId", task.getBarcode());
paramMap.put("partNum", task.getPartNumber());
paramMap.put("qty", task.getNum() + "");
paramMap.put("boxNo", task.getCid());
paramMap.put("location", task.getPosName());
String hSerial = "";
String so = "";
String slotNum = "";
String feederInfo = "";
String sourceId = task.getSourceId();
if(Strings.isNotBlank(sourceId)){
LiteOrder liteOrder = liteOrderManager.get(task.getSourceId());
if(liteOrder != null){
hSerial = liteOrder.getOrderNo();
so = liteOrder.getSo();
}
String subSourceId = task.getSubSourceId();
LiteOrderItem orderItem = liteOrderItemManager.get(subSourceId);
if(orderItem != null){
slotNum = orderItem.getSlotNum() + "";
feederInfo = orderItem.getFeederInfo();
}
}
paramMap.put("hSerial", hSerial);
paramMap.put("so", so);
paramMap.put("slotNum", slotNum);
paramMap.put("feederInfo", feederInfo);
try {
requestParams = JsonUtil.toJsonStr(paramMap);
log.info(task.getBarcode() + "出库通知,参数" + requestParams);
responseInfo = HttpHelper.postJson(outNotifyUrl, paramMap);
log.info(task.getBarcode() + "出库通知返回" + responseInfo);
ApiResult apiResult = JsonUtil.toObj(responseInfo, ApiResult.class);
} catch (Exception e) {
log.error("出库通知接口出错:" + e.getMessage());
}
}
}
private String getData(Map<String, Object> dataMap, String dataKey) {
Object data = dataMap.get(dataKey);
if (data == null) {
return "";
} else {
return data.toString();
}
}
/**
* 入库判定
*
* @param inCheckUrl
* @param barcode
* @return
* @throws ValidateException
*/
@Override
public Barcode canPutIn(String inCheckUrl, Barcode barcode) throws ValidateException {
log.info("{}类型为:{}", barcode.getBarcode(), barcode.getType());
if (COMPONENT_TYPE.COMPONENT != barcode.getType()) {
return null;
}
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("reelId", barcode.getBarcode());
paramMap.put("fullCode", barcode.getFullCode());
try {
log.info(barcode.getBarcode() + "入库验证,参数" + JsonUtil.toJsonStr(paramMap));
String result = HttpHelper.postJson(inCheckUrl, paramMap);
log.info(barcode.getBarcode() + "入库验证返回" + result);
ApiResult apiResult = JsonUtil.toObj(result, ApiResult.class);
if (apiResult.getCode() == 0) {
Map<String, Object> dataMap = (Map<String, Object>) apiResult.getData();
String partNum = getData(dataMap, "partNum");
if (Strings.isNotBlank(partNum)) {
barcode.setPartNumber(partNum);
}
String vendor = getData(dataMap, "vendor");
if (Strings.isNotBlank(vendor)) {
barcode.setProvider(vendor);
}
String qtyStr = getData(dataMap, "qty");
if (Strings.isNotBlank(qtyStr)) {
int qty = Integer.valueOf(qtyStr);
if (qty > 0) {
barcode.setAmount(qty);
}
}
String batch = getData(dataMap, "batch");
if (Strings.isNotBlank(batch)) {
barcode.setBatch(batch);
}
try {
String produceDateStr = getData(dataMap, "produceDate");
if (Strings.isNotBlank(produceDateStr)) {
Date produceDate = DateUtil.toDate(produceDateStr, "yyyy-MM-dd HH:mm:ss");
barcode.setProduceDate(produceDate);
}
} catch (ParseException e) {
log.error("日期转换出错", e);
}
barcode = barcodeManager.saveBarcode(barcode);
return barcode;
} else {
return null;
}
} catch (Exception e) {
log.error("入库验证接口出错:" + e.getMessage());
throw new ValidateException("smfcore.mesApi.inCheck.error", "MES验证出错:" + e.getMessage());
}
}
/**
* 需求单状态通知
*
* @param orderNotifyUrl
* @param liteOrder
*/
@Override
public void onOrderStatusChange(String orderNotifyUrl, LiteOrder liteOrder) {
}
@Override
public LiteOrder fetchOrder(String fetchOrderUrl, String orderNumber, String username) {
return null;
}
}
package com.neotel.smfcore.custom.neotel;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.JsonUtil;
import com.neotel.smfcore.common.utils.StorageConstants;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.bean.BoxStatusBean;
import com.neotel.smfcore.core.device.bean.StatusBean;
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.bean.UsageItem;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import com.neotel.smfcore.security.annotation.AnonymousPostMapping;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;
@Slf4j
@RestController
@RequestMapping("/rest/api")
public class NeotelController {
@Autowired
protected ILiteOrderManager liteOrderManager;
@Autowired
protected LiteOrderCache liteOrderCache;
@Autowired
private DataCache dataCache;
@Autowired
private IStoragePosManager storagePosManager;
@ApiOperation("6.1创建需求单")
@AnonymousPostMapping("/outInfo")
public ResultBean outInfo(@RequestBody List<Map<String, Object>> paramList) {
log.info("{}收到数据为:{}", "创建需求单outInfo", JsonUtil.toJsonStr(paramList));
if (!paramList.isEmpty()) {
for (Map<String, Object> paramMap : paramList) {
if (paramMap.get("hSerial") == null) {
return ResultBean.newErrorResult(1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"hSerial"});
}
if (paramMap.get("outItems") == null) {
return ResultBean.newErrorResult(1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"outItems"});
}
String orderNo = paramMap.get("hSerial").toString(); //需求单号
String line = paramMap.get("line") == null ? "" : paramMap.get("line").toString(); //线别
String so = paramMap.get("so") == null ? "" : paramMap.get("so").toString(); //工单号
//需求单详情数据
List<LiteOrderItem> orderItemList = new ArrayList<>();
List<Map> outItemList = JsonUtil.toList(paramMap.get("outItems").toString(), Map.class);
if (!outItemList.isEmpty()) {
for (Map outItem : outItemList) {
LiteOrderItem orderItem = new LiteOrderItem();
if (outItem.get("slotNum") != null) {
orderItem.setSlotNum(Integer.valueOf(outItem.get("slotNum").toString())); //站位编号
}
if (outItem.get("reelId") != null) {
String reelId = outItem.get("reelId").toString();
orderItem.setRi(reelId); //料盘唯一码
orderItem.setNeedNum(1);
}
orderItemList.add(orderItem);
}
}
//开始保存数据
LiteOrder liteOrder = new LiteOrder();
liteOrder.setOrderNo(orderNo);
liteOrder.setLine(line);
liteOrder.setSo(so);
liteOrder.setType(2);
liteOrder.setOrderItems(orderItemList);
liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
}
return ResultBean.newOkResult("");
}
return ResultBean.newErrorResult(1, "smfcore.valueCanotNull", "需求单信息不能为空");
}
@ApiOperation("6.2关闭需求单")
@AnonymousPostMapping("/closeOutInfo")
public ResultBean closeOutInfo(@RequestBody Map<String, String> paramMap) {
String orderNo = paramMap.get("hSerial"); //需求工单
if (ObjectUtils.isEmpty(orderNo)) {
return ResultBean.newErrorResult(1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"hSerial"});
}
String result = liteOrderCache.closeOrder(orderNo);
if ("smfcore.order.close.success".equals(result)) {
return ResultBean.newOkResult("");
} else {
return ResultBean.newErrorResult(1, "", "关闭失败");
}
}
@ApiOperation("6.3 获取实时库存")
@AnonymousPostMapping("/inventory")
public ResultBean inventory(@RequestBody Map<String, List<String>> paramMap) {
List<String> partNums = paramMap.get("partNums");
List<String> reelIds = paramMap.get("reelIds");
List<String> cids = paramMap.get("towerIds");
List<String> storageIds = new ArrayList<>();
if(cids != null){
for (String cid : cids) {
Storage storage = dataCache.getStorage(cid);
if(storage != null){
storageIds.add(storage.getId());
}
}
}
List<StoragePos> storagePosList = storagePosManager.findByBarcodesAndPartNums(storageIds, partNums, reelIds);
if (storagePosList != null) {
List<Map<String, Object>> resultMapList = new ArrayList<>();
for (StoragePos storagePos : storagePosList) {
Barcode barcode = storagePos.getBarcode();
if (barcode != null) {
if (barcode.getSubCodeList() != null && !barcode.getSubCodeList().isEmpty()) {
for (Barcode subBarcode : barcode.getSubCodeList()) {
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("reelId", subBarcode.getBarcode());
resultMap.put("qty", subBarcode.getAmount());
resultMap.put("towerId", storagePos.getStorageId());
resultMap.put("location", storagePos.getPosName());
resultMap.put("partNum", subBarcode.getPartNumber());
resultMapList.add(resultMap);
}
} else {
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("reelId", barcode.getBarcode());
resultMap.put("qty", barcode.getAmount());
resultMap.put("towerId", storagePos.getStorageId());
resultMap.put("location", storagePos.getPosName());
resultMap.put("partNum", barcode.getPartNumber());
resultMapList.add(resultMap);
}
}
}
return ResultBean.newOkResult(resultMapList);
}
return ResultBean.newErrorResult(1, "", "未找到实时库存信息");
}
@ApiOperation("6.4 设备状态获取")
@AnonymousPostMapping("/deviceStatus")
public ResultBean deviceStatus(@RequestBody Map<String, Object> paramMap) {
Collection<Storage> storageList = Lists.newArrayList();
List<String> deviceKeyList = paramMap.get("deviceKeyList") == null ? null : JsonUtil.toList(paramMap.get("deviceKeyList").toString(), String.class);
//如果没有的话 就查询所有的
if (deviceKeyList == null || deviceKeyList.size() < 1) {
storageList.addAll(dataCache.getAllStorage().values());
} else {
for (String cid : deviceKeyList) {
Storage storage = dataCache.getStorage(cid);
storageList.add(storage);
}
}
List<Map<String, Object>> results = Lists.newArrayList();
for (Storage storage : storageList) {
StatusBean statusBean = DevicesStatusUtil.getStatusBean(storage.getCid());
Map<String, BoxStatusBean> boxStatusMap = statusBean.getBoxStatus();
int status = -1;
if (boxStatusMap != null) {
BoxStatusBean boxStatusBean = boxStatusMap.get("1");
if (boxStatusBean != null) {
status = boxStatusBean.getStatus();
}
}
int storageStatus = status;
if (status == StorageConstants.STATUS.OFFLINE || statusBean.timeOut()) {
//离线
storageStatus = -1;
}
String msg = statusBean.getMsg();
String msgType = statusBean.getDeviceType();
Map<String, Object> itemMap = new HashMap<>();
itemMap.put("deviceKey", storage.getType() + "." + storage.getCid());
itemMap.put("name", storage.getName());
itemMap.put("status", storageStatus);
itemMap.put("msg", msg);
itemMap.put("msgType", msgType);
itemMap.put("startTime", storage.getCreateDate());
itemMap.put("updateTime", storage.getUpdateDate());
Map<String, Object> deviceDataMap = new HashMap<>();
Map<String, Object> emptySlotMap = Maps.newHashMap();
Map<String, Object> totalSlotMap = Maps.newHashMap();
Map<String, UsageItem> usageMap = storage.getUsageMap();
for (UsageItem usageItem : usageMap.values()) {
String sizeStr = usageItem.getSizeStr();
int total = usageItem.getTotalCount();
int used = usageItem.getUsedCount();
totalSlotMap.put(sizeStr, total);
emptySlotMap.put(sizeStr, total - used);
}
deviceDataMap.put("towerId", storage.getCid());
deviceDataMap.put("status", statusBean.getStatus());
deviceDataMap.put("name", storage.getName());
deviceDataMap.put("doorReelSignal", statusBean.getDoorReelSingnal());
deviceDataMap.put("barcode", statusBean.getData().get("barcode"));
deviceDataMap.put("emptySlot", emptySlotMap);
deviceDataMap.put("totalSlot", totalSlotMap);
itemMap.put("deviceData", deviceDataMap);
results.add(itemMap);
}
return ResultBean.newOkResult(results);
}
}
......@@ -2,11 +2,11 @@ server:
port: 8800
api:
#name: Neotel
#inCheckUrl: DaLu
#outNotifyUrl: https://matlabel-tool.com:4434/SMD_BOXAPI/OutBox
#inNotifyUrl: https://matlabel-tool.com:4434/SMD_BOXAPI/InBox
name: Hella
hella:
host: 127.0.0.1
port: 9999
# 文件存储路径
file:
......@@ -41,6 +41,6 @@ app:
type: ""
menu:
show:
show: orderSetting
hide:
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!