Commit 4a9001b6 zshaohui

1.内仓接口对接优化

1 个父辈 e29fb769
......@@ -286,7 +286,7 @@ public class DataInitManager {
"inventory", //报表->库存
"bunker", //设备管理
"storagePos", //库位管理
//"sysSetting", //系统设置
"sysSetting", //系统设置
"peoples", //用户管理
"role" //角色管理
......
......@@ -394,7 +394,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
} else if (BOX_STATUS.IN_FAILED == status) {//入库失败
//暂不处理
} else if (BOX_STATUS.OUT_FINISHED == status) {//出仓完成
finishedOutPos(statusBean.getCid(),posName,executeTime);
//finishedOutPos(statusBean.getCid(),posName,executeTime);
} else if (BOX_STATUS.OUT_END == status) {//出库完成(放到仓门口
//暂不处理
}
......
......@@ -31,8 +31,6 @@ public class SisoBoxHandler extends BaseDeviceHandler {
if (humidityResult != null) {
return humidityResult;
}
if (statusBean.getOp() == OP.PUT_IN) {
log.debug("入库:" + statusBean.toString());
statusBean = putInLine(storage, statusBean);
......
......@@ -218,6 +218,8 @@ public class LiteOrderCache {
}else if(liteOrder.isOutTails()){
// setStatus(LITEORDER_STATUS.TAILS_FINISHED);
liteOrder.setClosed(true);
}else if (liteOrder.isOutTails()){
liteOrder.setClosed(true);
}
liteOrder.setTaskFinishedTime(System.currentTimeMillis());
......@@ -473,8 +475,8 @@ public class LiteOrderCache {
Storage storage = dataCache.getStorageById(pos.getStorageId());
DataLog task = new DataLog(storage,pos.getBarcode(),pos);
String operator = SecurityUtils.getCurrentUsername();
task.setOperator(operator);
/*String operator = SecurityUtils.getCurrentUsername();
task.setOperator(operator);*/
return task;
}
......
......@@ -9,6 +9,7 @@ import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.custom.lizhen.innerBox.bean.PreWarningItem;
import com.neotel.smfcore.custom.lizhen.innerBox.util.PreWarningItemCache;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -111,6 +112,7 @@ public class LizhenController {
@ApiOperation("5.缺料预警")
@PostMapping("/mPickingList")
@AnonymousAccess
public ResultBean mPickingList(@RequestBody Map<String, List<Map<String, String>>> paramMap) {
List<Map<String, String>> datas = paramMap.get("data");
if (datas == null || datas.isEmpty()) {
......
package com.neotel.smfcore.custom.lizhen.agvBox.rest;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.JsonUtil;
import com.neotel.smfcore.common.utils.ReelLockPosUtil;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
......@@ -239,12 +240,13 @@ public class AgvBoxDeviceClientController {
DataLog opTask = null;
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog task : allTasks) {
if (rfid.startsWith(task.getBarcode())) {
if (!task.isCancel() && !task.isFinished()) {
opTask = task;
break;
}
break;
}
}
if (opTask == null) {
......@@ -282,8 +284,6 @@ public class AgvBoxDeviceClientController {
if (OP_STATUS.OUT_ON_AGV.name().equals(statusStr)) {
//从库位中取出,需要移到完成队列中,并且清理库存
outFromPos(opTask);
//清理锁定库位
ReelLockPosUtil.removeReelLockPosInfo(rfid.replace("A","").replace("B",""));
}
taskService.updateFinishedTask(opTask);
......@@ -299,8 +299,11 @@ public class AgvBoxDeviceClientController {
opTask.setStatus(statusStr);
//入库任务
if (OP_STATUS.FINISHED.name().equals(statusStr)) {
taskService.moveTaskToFinished(opTask);
lockRfidTarget.remove(opTask.getBarcode());
intoPos(opTask);
//清理锁定库位
ReelLockPosUtil.removeReelLockPosInfo(rfid.replace("A","").replace("B",""));
} else {
taskService.updateQueueTask(opTask);
}
......@@ -345,7 +348,6 @@ public class AgvBoxDeviceClientController {
//更新缓存中的库存信息
opTask.setStatus(OP_STATUS.FINISHED.name());
taskService.updateFinishedTask(opTask);
taskService.removeFinishedTask(opTask);
}
......
......@@ -4,6 +4,7 @@ import com.google.common.collect.Lists;
import com.neotel.smfcore.common.bean.ReelLockPosInfo;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.JsonUtil;
import com.neotel.smfcore.common.utils.ReelLockPosUtil;
import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.common.utils.StringUtils;
......@@ -139,6 +140,8 @@ public class WarehouseController {
.and("enabled").is(true);//可用
//排除掉正在执行的仓位
Collection<String> excludePosIds = taskService.excludePosIds();
log.info("excludePosIds--"+JsonUtil.toJsonStr(excludePosIds));
if (excludePosIds != null && !excludePosIds.isEmpty()) {
c.and("id").nin(excludePosIds);
}
......
......@@ -64,6 +64,7 @@ public class InnerBoxRestController {
@ApiOperation("IA 出库更新任务状态")
@RequestMapping("/updateLocInfo")
@AnonymousAccess
public ResultBean updateLocInfo(HttpServletRequest request) {
String code = request.getParameter("barcode");
String status = request.getParameter("status");
......@@ -121,30 +122,15 @@ public class InnerBoxRestController {
}
//料箱与需求单进行绑定
String boxNumber = "";
if (loc.contains("-")) {
boxNumber = loc.substring(0, loc.indexOf("-"));
}
LiteOrderItem orderItem = liteOrderItemManager.getOrderItemByBarcode(code);
if (orderItem != null) {
String orderId = orderItem.getOrderId();
LiteOrder liteOrder = liteOrderManager.get(orderId);
if (liteOrder != null) {
liteOrder.setBoxNumber(boxNumber);
liteOrderManager.save(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
}
String boxNumber = loc.replaceAll("A","").replaceAll("B","");
LiteOrder liteOrder = liteOrderManager.get(opTask.getSourceId());
if (liteOrder != null) {
liteOrder.setBoxNumber(boxNumber);
liteOrderManager.save(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
}
}
}
} else {
opTask.setStatus(status);
//入库任务
if (OP_STATUS.FINISHED.name().equals(status)) {
intoPos(opTask);
} else {
taskService.updateQueueTask(opTask);
}
}
} else {
log.info(code + "更新状态时未找到状态:" + status + "");
......@@ -158,6 +144,7 @@ public class InnerBoxRestController {
@ApiOperation("IB 获取料箱状态信息")
@RequestMapping("/getBoxStatusInfo")
@AnonymousAccess
public ResultBean getBoxStatusInfo(HttpServletRequest request) {
String rfid = request.getParameter("rfid"); //料箱RFID
String cid = request.getParameter("cid");
......@@ -168,8 +155,9 @@ public class InnerBoxRestController {
@ApiOperation("IC 获取料架标签打印信息")
@RequestMapping("/rack/getPrintInfo")
@AnonymousAccess
public List<Map<String, String>> getPrintLabel(HttpServletRequest request) {
Collection<DataLog> dataLogs = taskService.getQueueTasks();
Collection<DataLog> dataLogs = taskService.getAllTasks();
List<Map<String, String>> results = new ArrayList<>();
for (DataLog dataLog : dataLogs) {
String barcode = dataLog.getBarcode();
......@@ -201,6 +189,7 @@ public class InnerBoxRestController {
@ApiOperation("ID 料架标签打印完成通知")
@RequestMapping("/rack/finishPrint")
@AnonymousAccess
public ResultBean finishPrintLabel(HttpServletRequest request) {
String barcode = request.getParameter("barcode");
Collection<DataLog> dataLogs = taskService.getQueueTasks();
......@@ -216,9 +205,10 @@ public class InnerBoxRestController {
@ApiOperation("IE 贴标前获取站位信息")
@RequestMapping("/getFeederInfo")
@AnonymousAccess
public ResultBean getFeederInfo(HttpServletRequest request) {
String barcode = request.getParameter("barcode");
Collection<DataLog> dataLogs = taskService.getQueueTasks();
Collection<DataLog> dataLogs = taskService.getAllTasks();
Map<String, String> resultMap = new HashMap<>();
for (DataLog dataLog : dataLogs) {
if (dataLog.getBarcode().equals(barcode)) {
......@@ -242,12 +232,12 @@ public class InnerBoxRestController {
@ApiOperation("周转箱取走")
@RequestMapping("/boxTakeAway")
@AnonymousAccess
public ResultBean boxTakeAway(HttpServletRequest request){
public ResultBean boxTakeAway(HttpServletRequest request) {
String rfid = request.getParameter("rfid");
rfid = rfid.replaceAll("A","").replaceAll("B","");
rfid = rfid.replaceAll("A", "").replaceAll("B", "");
Pattern pattern = Pattern.compile("^" + rfid + ".*$", Pattern.CASE_INSENSITIVE);
List<LiteOrder> liteOrders = liteOrderManager.findByQuery(new Query(Criteria.where("boxNumber").regex(pattern)));
if (liteOrders != null && liteOrders.isEmpty()){
if (liteOrders != null && liteOrders.isEmpty()) {
for (LiteOrder liteOrder : liteOrders) {
liteOrder.setBoxNumber("");
liteOrderManager.save(liteOrder);
......@@ -259,42 +249,6 @@ public class InnerBoxRestController {
/**
* 物料放入
*/
private void intoPos(DataLog opTask) {
//已完成,加入库存,并且从完成队列中清除
StoragePos storagePos = storagePosManager.get(opTask.getPosId());
//二维码状态
Barcode barcode = barcodeManager.findByBarcode(opTask.getBarcode());
if (barcode != null) {
barcode.setUsedCount(barcode.getUsedCount() + 1);
barcode.setPutInTime(System.currentTimeMillis());
barcode.setInOpor("");
barcode.setCheckOutDate(null, "");
barcode.setPosName(opTask.getPosName());
barcodeManager.save(barcode);
}
/**
* 仓位状态
*/
storagePos.setBarcode(barcode);
storagePos.setUsed(true);
storagePos.setCanCheckOutTime(System.currentTimeMillis());
storagePosManager.save(storagePos);
if (barcode != null) {
dataCache.updateInventory(storagePos, barcode);
//需要更新料箱中物料的库存
}
//更新缓存中的库存信息
opTask.setStatus(OP_STATUS.FINISHED.name());
taskService.updateFinishedTask(opTask);
taskService.removeFinishedTask(opTask);
}
/**
* 物料取出
*/
private void outFromPos(DataLog opTask) {
......@@ -340,27 +294,38 @@ public class InnerBoxRestController {
int remainTaskCount = 0; //所属需求单剩余当前料仓未完成任务数
int rackTaskCount = 0; //所属需求单剩余料架任务数
//当前料箱的隔口数量
resultMap.put("inCount",0);
resultMap.put("outCount",0);
Pattern pattern = Pattern.compile("^" + boxNumber + ".*$", Pattern.CASE_INSENSITIVE);
List<Barcode> barcodes = barcodeManager.findByQuery(new Query(Criteria.where("posName").regex(pattern)));
if (barcodes != null && !barcodes.isEmpty()) {
Map<String, Long> posCountMap = barcodes.stream().collect(Collectors.groupingBy(Barcode::getPosName, Collectors.counting()));
for (Map.Entry<String, Long> posCount : posCountMap.entrySet()) {
if (posCount.getKey().contains("A")) {
resultMap.put("inCount", posCount.getValue());
} else {
resultMap.put("outCount", posCount.getValue());
}
}
resultMap.putAll(posCountMap);
}
//获取当前工单数据
LiteOrder liteOrder = new LiteOrder();
LiteOrder liteOrder = null;
List<LiteOrder> liteOrders = liteOrderManager.findByQuery(new Query(Criteria.where("boxNumber").regex(pattern)));
if (liteOrders != null && !liteOrders.isEmpty()) {
liteOrder = liteOrders.get(0);
}
resultMap.put("hSerial","");
resultMap.put("line","");
if (liteOrder != null) {
String line = liteOrder.getLine();
String orderNo = liteOrder.getOrderNo();
resultMap.put("hSerial", orderNo);
resultMap.put("line", line);
List<LiteOrderItem> orderItems = liteOrder.getOrderItems();
List<LiteOrderItem> orderItems = liteOrderItemManager.findOrderItems(liteOrder.getId());
if (orderItems != null && !orderItems.isEmpty()) {
for (LiteOrderItem orderItem : orderItems) {
Collection<DataLog> dataLogs = taskService.getQueueTasks();
Collection<DataLog> dataLogs = taskService.getAllTasks();
for (DataLog dataLog : dataLogs) {
if (dataLog.isFinished() || dataLog.isCancel()) {
continue;
......
package com.neotel.smfcore.custom.lizhen.innerBox.util;
import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
......@@ -16,6 +17,7 @@ import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.lizhen.LizhenApi;
import com.neotel.smfcore.custom.lizhen.innerBox.bean.PreWarningItem;
import jdk.nashorn.internal.runtime.arrays.ArrayIndex;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -26,6 +28,7 @@ import org.springframework.stereotype.Service;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.Collectors;
......@@ -36,7 +39,7 @@ import java.util.stream.Collectors;
*/
@Slf4j
@Service
public class PreWarningItemCache {
public class PreWarningItemCache extends AbstractBaseDao {
/**
* 预警列表缓存
......@@ -54,25 +57,26 @@ public class PreWarningItemCache {
private static IStoragePosManager storagePosManager;
/**
* 添加到预警列表缓存中
*/
public static void addItems(List<PreWarningItem> items){
updateItem(items,false);
public static void addItems(List<PreWarningItem> items) {
updateItem(items, false);
}
private AtomicInteger atomicInteger = new AtomicInteger(0);
/**
* 从缓存列表中取出预警Item生成工单并执行
*/
private static void generateTask(){
private static void generateTask() {
boolean hasIdleBox = false;
//有料仓空闲下来就需要生成任务,保证料仓不空闲,提高节拍
Collection<Storage> boxList = dataCache.getAllStorage().values();
for (Storage storage : boxList) {
if(storage.isStorage(DeviceType.SMD_XLR)){
if (storage.isStorage(DeviceType.SMD_XLR)) {
Collection<DataLog> boxQueueTasks = taskService.getQueueTasks(storage.getCid());
if(boxQueueTasks.isEmpty()){
if (boxQueueTasks.isEmpty()) {
//料仓空闲,没有待执行的任务
hasIdleBox = true;
break;
......@@ -80,19 +84,22 @@ public class PreWarningItemCache {
}
}
if(hasIdleBox){
if (hasIdleBox) {
//最早的一条预警时间
List<PreWarningItem> lineItems = new ArrayList<>();
String firstItemLine = "";
//每次最多出多少盘
int maxReelCount = 30;
//如果取不到,从数据库中取
if (queueItemList == null || queueItemList.isEmpty()){
if (queueItemList == null || queueItemList.isEmpty()) {
queueItemList = dataCache.getCache(Constants.CACHE_preWarningItem);
}
if (queueItemList == null || queueItemList.isEmpty()) {
return;
}
for (PreWarningItem preWarningItem : queueItemList) {
String itemLine = preWarningItem.getLine();
if(Strings.isNotBlank(itemLine)){
if (Strings.isNotBlank(itemLine)) {
if (firstItemLine.isEmpty()) {
firstItemLine = itemLine;
if (System.currentTimeMillis() - preWarningItem.getReceiveDate().getTime() < 1 * 60 * 1000) {
......@@ -101,18 +108,18 @@ public class PreWarningItemCache {
}
}
//同一个线别的生成一个工单
if(itemLine.equals(firstItemLine)){
if (itemLine.equals(firstItemLine)) {
lineItems.add(preWarningItem);
}
if(lineItems.size() > maxReelCount){
if (lineItems.size() > maxReelCount) {
break;
}
}
}
if(!lineItems.isEmpty()){
if (!lineItems.isEmpty()) {
createAndExecuteLiteOrder(lineItems);
//工单生成后,从缓存中清除
updateItem(lineItems,true);
updateItem(lineItems, true);
}
}
}
......@@ -120,6 +127,7 @@ public class PreWarningItemCache {
/**
* 根据预警信息挑选物料, 生成工单任务并执行
*
* @param lineItems
*/
private static void createAndExecuteLiteOrder(List<PreWarningItem> lineItems) {
......@@ -137,14 +145,15 @@ public class PreWarningItemCache {
//处理线别需求单
LiteOrder liteOrder = new LiteOrder();
liteOrder.setType(2);
liteOrder.setOrderNo(getSeq());
liteOrder.setSo(getSeq());
liteOrder.setOrderNo(new PreWarningItemCache().getSeq());
liteOrder.setSo(new PreWarningItemCache().getSeq());
List<LiteOrderItem> orderItems = new ArrayList<>();
for (PreWarningItem item : lineItems) {
liteOrder.setLine(item.getLine());
//创建工单
LiteOrderItem orderItem = new LiteOrderItem();
while (true) {
boolean flag = true;
while (flag) {
String partnumber = item.getPartnumber();
Query q = new Query();
//库位有数据
......@@ -157,16 +166,16 @@ public class PreWarningItemCache {
}
//排除已经执行过的物料barcode
if (outPosIds != null && !outPosIds.isEmpty()) {
c.and("id").nin(outPosIds);
c.and("id").not().in(outPosIds);
}
//排除校验没通过的
if (noPossPosIds != null && !noPossPosIds.isEmpty()) {
c.and("id").nin(noPossPosIds);
// c.and("id").not().in(noPossPosIds);
}
//排除正在执行出库的工位
Collection<String> excludePosIds = taskService.excludePosIds();
if (excludePosIds != null && !excludePosIds.isEmpty()) {
c.and("id").nin(noPossPosIds);
// c.and("id").not().in(excludePosIds);
}
//排除正在执行的工单物料
Collection<String> excludeBarcodeIds = liteOrderCache.excludeBarcodeIds();
......@@ -176,16 +185,17 @@ public class PreWarningItemCache {
//然后最早入库的
q.addCriteria(c);
q.with(Sort.by(Sort.Direction.ASC, "canCheckOutTime", "barcode.subCodeList.usedCount")).limit(5);
log.info(q.toString());
// log.info(q.toString());
List<StoragePos> storagePoss = storagePosManager.findByQuery(q);
orderItem.setPn(item.getPartnumber());
orderItem.setSide(item.getSide());
orderItem.setFeederInfo(item.getSlot());
orderItem.setTableNo(item.getMachinename());
orderItem.setTableNo(item.getStation());
if (storagePoss == null || storagePoss.isEmpty()) {
orderItem.setRi(item.getPartnumber());
orderItem.setNeedNum(0);
orderItems.add(orderItem);
flag = false;
break;
} else {
for (StoragePos pos : storagePoss) {
......@@ -196,6 +206,8 @@ public class PreWarningItemCache {
outPosIds.add(pos.getId()); //防止其他地方出库
orderItem.setRi(barcode.getBarcode());
orderItem.setNeedNum(1);
orderItems.add(orderItem);
flag = false;
break;
} else {
log.info("partNumber:{}校验失败:{}", barcode.getPartNumber(), checkResult);
......@@ -205,13 +217,13 @@ public class PreWarningItemCache {
}
}
}
if (orderItems != null && !orderItems.isEmpty()) {
liteOrder.setOrderItems(orderItems);
liteOrder.setTaskReelCount(orderItems.size());
liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderManager.save(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
}
}
if (orderItems != null && !orderItems.isEmpty()) {
liteOrder.setOrderItems(orderItems);
liteOrder.setTaskReelCount(orderItems.size());
liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderManager.save(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
}
}
......@@ -231,16 +243,16 @@ public class PreWarningItemCache {
/**
* 定时执行,从缓存列表中取出预警Item生成工单并执行
*/
public static void runTimer(){
if(processing){
public static void runTimer() {
if (processing) {
return;
}
processing = true;
try{
try {
generateTask();
}catch (Exception e){
log.error("预警缓存定时器出错",e);
}finally {
} catch (Exception e) {
log.error("预警缓存定时器出错", e);
} finally {
processing = false;
}
}
......@@ -271,7 +283,18 @@ public class PreWarningItemCache {
PreWarningItemCache.storagePosManager = storagePosManager;
}
private static String getSeq(){
return UUID.randomUUID().toString();
//待修改----
private String getSeq() {
// return "H" + getNextId(getEntityClass().getName());
int seq = atomicInteger.addAndGet(1);
return "H" + seq;
}
@Override
public Class getEntityClass() {
return PreWarningItemCache.class;
}
}
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!