Commit 48f673de zshaohui

1.提供缓存信息接口给客户端

1 个父辈 102bc5b0
package com.neotel.smfcore.common.utils; package com.neotel.smfcore.common.utils;
public class Constants { public class Constants {
private Constants() { private Constants() {
// hide me // hide me
} }
...@@ -213,4 +215,7 @@ public class Constants { ...@@ -213,4 +215,7 @@ public class Constants {
*/ */
public static final String Cache_AuthDate = "Cache_AuthDate"; public static final String Cache_AuthDate = "Cache_AuthDate";
public static final String Cache_BoxCacheInfo = "Cache_BoxCacheInfo";
} }
...@@ -472,9 +472,9 @@ public class BaseDeviceHandler implements IDeviceHandler { ...@@ -472,9 +472,9 @@ public class BaseDeviceHandler implements IDeviceHandler {
} else if (BOX_STATUS.IN_FAILED == status) {//入库失败 } else if (BOX_STATUS.IN_FAILED == status) {//入库失败
//暂不处理 //暂不处理
} else if (BOX_STATUS.OUT_FINISHED == status) {//出仓完成 } else if (BOX_STATUS.OUT_FINISHED == status) {//出仓完成
finishedOutPos(statusBean.getCid(),posName,barcode,executeTime); //finishedOutPos(statusBean.getCid(),posName,barcode,executeTime);
} else if (BOX_STATUS.OUT_END == status) {//出库完成(放到仓门口 } else if (BOX_STATUS.OUT_END == status) {//出库完成(放到仓门口
endOutTask(statusBean.getCid(),posName,barcode); //endOutTask(statusBean.getCid(),posName,barcode);
} }
// else if (BOX_STATUS.REWARM_TAKING_END == status) { // else if (BOX_STATUS.REWARM_TAKING_END == status) {
// //回温取料完成, 将库位清空 // //回温取料完成, 将库位清空
......
...@@ -598,7 +598,7 @@ public class StoragePosManagerImpl implements IStoragePosManager { ...@@ -598,7 +598,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
StoragePos pos = storagePosDao.findOne(query); StoragePos pos = storagePosDao.findOne(query);
if ((!ObjectUtil.isNotEmpty(msg) )&& (pos != null)) { if ((!ObjectUtil.isNotEmpty(msg) )&& (pos != null)) {
Point targetP = PointUtil.getPosPoint(lastPosId, false); Point targetP = PointUtil.getPosPoint(lastPosId, false);
log.debug(msg + "结果:[" + pos.getPosName() + "][" + targetP.getX() + "," + targetP.getY() + "]"); log.info(msg + "结果:[" + pos.getPosName() + "][" + targetP.getX() + "," + targetP.getY() + "]");
} }
return pos; return pos;
} }
......
...@@ -252,6 +252,7 @@ public class DataLog extends BasePo implements Serializable ,Comparable<DataLog> ...@@ -252,6 +252,7 @@ public class DataLog extends BasePo implements Serializable ,Comparable<DataLog>
//是否关闭 //是否关闭
private boolean closed = false; private boolean closed = false;
private boolean outFromPos = false;
public String getBarcode() { public String getBarcode() {
if(barcode == null){ if(barcode == null){
......
...@@ -527,7 +527,8 @@ public class TaskService { ...@@ -527,7 +527,8 @@ public class TaskService {
String cid = storage.getCid(); String cid = storage.getCid();
//有入库任务的料仓不分配出库任务 //有入库任务的料仓不分配出库任务
if (!hasExecutingTask(cid, OP.PUT_IN)) { if (!hasExecutingTask(cid, OP.PUT_IN)) {
DataLog task = findCheckoutBoxTask(storage); //DataLog task = findCheckoutBoxTask(storage);
DataLog task = null;
if (task != null) { if (task != null) {
//从等待列表中删除,加入到执行列表中 //从等待列表中删除,加入到执行列表中
...@@ -935,7 +936,7 @@ public class TaskService { ...@@ -935,7 +936,7 @@ public class TaskService {
} }
try { try {
Collection<String> operatingPosIds = excludePosIds(); Collection<String> operatingPosIds = excludePosIds();
log.debug("尝试从[" + storage.getCid() + "]中为[" + barcode.getBarcode() + "]查找空位"); log.info("尝试从[" + storage.getCid() + "]中为[" + barcode.getBarcode() + "]查找空位");
StoragePos pos = storagePosManager.getEmptyPosByStorage(storage, barcode, operatingPosIds, lastPosId); StoragePos pos = storagePosManager.getEmptyPosByStorage(storage, barcode, operatingPosIds, lastPosId);
if (pos != null) { if (pos != null) {
//判断尺寸是否一致 //判断尺寸是否一致
...@@ -958,7 +959,7 @@ public class TaskService { ...@@ -958,7 +959,7 @@ public class TaskService {
for (Storage storage : availbleStorageList) { for (Storage storage : availbleStorageList) {
try { try {
Collection<String> operatingPosIds = excludePosIds(); Collection<String> operatingPosIds = excludePosIds();
log.debug("尝试从[" + storage.getCid() + "]中为[" + barcode.getBarcode() + "]查找空位"); log.info("尝试从[" + storage.getCid() + "]中为[" + barcode.getBarcode() + "]查找空位");
StoragePos pos = storagePosManager.getEmptyPosByStorage(storage, barcode, operatingPosIds, lastPosId); StoragePos pos = storagePosManager.getEmptyPosByStorage(storage, barcode, operatingPosIds, lastPosId);
if (pos != null) { if (pos != null) {
if(isSameSize(barcode,pos)){ if(isSameSize(barcode,pos)){
...@@ -1350,31 +1351,45 @@ public class TaskService { ...@@ -1350,31 +1351,45 @@ public class TaskService {
} }
public List<Barcode> barcodeListByCheckOutType(CHECKOUT_TYPE checkoutType, List<Barcode> barcodeList) { public List<Barcode> barcodeListByCheckOutType(CHECKOUT_TYPE checkoutType, List<Barcode> barcodeList) {
//按时间进行排序 // 处理barcodeList为null的情况
if (CHECKOUT_TYPE.EXPIRE_FIRST.equals(checkoutType)) {//先过期先出 if (barcodeList == null) {
barcodeList = barcodeList.stream().sorted(Comparator.comparing(Barcode::getExpireDate,Comparator.naturalOrder()) return Collections.emptyList();
.thenComparing(Barcode::getPutInDate,Comparator.naturalOrder())).collect(Collectors.toList()); }
} else if (CHECKOUT_TYPE.FIFO.equals(checkoutType)) {//严格的先进先出
barcodeList = barcodeList.stream().sorted(Comparator.comparing(Barcode::getPutInDate,Comparator.naturalOrder()) // 使用Comparator.nullsFirst或nullsLast处理可能的null值
.thenComparing(Barcode::getUsedCount)).collect(Collectors.toList()); Comparator<Barcode> comparator = null;
} else if (CHECKOUT_TYPE.USED_FIRST.equals(checkoutType)) {//尾料优先
barcodeList = barcodeList.stream().sorted(Comparator.comparing(Barcode::getAmount) if (CHECKOUT_TYPE.EXPIRE_FIRST.equals(checkoutType)) {
.thenComparing(Barcode::getPutInDate,Comparator.naturalOrder())).collect(Collectors.toList()); // 先过期先出
comparator = Comparator.comparing(Barcode::getExpireDate, Comparator.nullsFirst(Comparator.naturalOrder()))
.thenComparing(Barcode::getPutInDate, Comparator.nullsFirst(Comparator.naturalOrder()));
} else if (CHECKOUT_TYPE.FIFO.equals(checkoutType)) {
// 严格的先进先出
comparator = Comparator.comparing(Barcode::getPutInDate, Comparator.nullsFirst(Comparator.naturalOrder()))
.thenComparing(Barcode::getUsedCount);
} else if (CHECKOUT_TYPE.USED_FIRST.equals(checkoutType)) {
// 尾料优先
comparator = Comparator.comparing(Barcode::getAmount, Comparator.nullsFirst(Comparator.naturalOrder()))
.thenComparing(Barcode::getPutInDate, Comparator.nullsFirst(Comparator.naturalOrder()));
} else if (CHECKOUT_TYPE.PRODUCE_DATE.equals(checkoutType)) { } else if (CHECKOUT_TYPE.PRODUCE_DATE.equals(checkoutType)) {
barcodeList = barcodeList.stream().sorted(Comparator.comparing(Barcode::getProduceDate,Comparator.naturalOrder()) comparator = Comparator.comparing(Barcode::getProduceDate, Comparator.nullsFirst(Comparator.naturalOrder()))
.thenComparing(Barcode::getAmount) .thenComparing(Barcode::getAmount, Comparator.nullsFirst(Comparator.naturalOrder()))
.thenComparing(Barcode::getPutInDate,Comparator.naturalOrder())).collect(Collectors.toList()); .thenComparing(Barcode::getPutInDate, Comparator.nullsFirst(Comparator.naturalOrder()));
} else if (CHECKOUT_TYPE.BATCH_FIRST.equals(checkoutType)) { } else if (CHECKOUT_TYPE.BATCH_FIRST.equals(checkoutType)) {
barcodeList = barcodeList.stream().sorted(Comparator.comparing(Barcode::getBatch,Comparator.naturalOrder()) comparator = Comparator.comparing(Barcode::getBatch, Comparator.nullsFirst(Comparator.naturalOrder()))
.thenComparing(Barcode::getProduceDate,Comparator.naturalOrder()) .thenComparing(Barcode::getProduceDate, Comparator.nullsFirst(Comparator.naturalOrder()))
.thenComparing(Barcode::getAmount) .thenComparing(Barcode::getAmount, Comparator.nullsFirst(Comparator.naturalOrder()))
.thenComparing(Barcode::getPutInDate,Comparator.naturalOrder())).collect(Collectors.toList()); .thenComparing(Barcode::getPutInDate, Comparator.nullsFirst(Comparator.naturalOrder()));
} else {//效率优先 } else {
barcodeList = barcodeList.stream().sorted(Comparator.comparing(Barcode::getPutInDate,Comparator.naturalOrder()) // 效率优先
.thenComparing(Barcode::getCreateDate)) comparator = Comparator.comparing(Barcode::getPutInDate, Comparator.nullsFirst(Comparator.naturalOrder()))
.collect(Collectors.toList()); .thenComparing(Barcode::getCreateDate, Comparator.nullsFirst(Comparator.naturalOrder()));
} }
return barcodeList;
return barcodeList.stream()
.filter(Objects::nonNull) // 过滤掉可能的null元素
.sorted(comparator)
.collect(Collectors.toList());
} }
public void moveTaskToFinished(DataLog task) { public void moveTaskToFinished(DataLog task) {
......
package com.neotel.smfcore.custom.france1588.bean;
import lombok.Data;
import java.util.Date;
@Data
public class XlcTask {
private String taskId;
private String barcode;
private int type;
private String toloc;
private String posName;
private String status;
private Date createDate;
}
package com.neotel.smfcore.custom.france1588.controller;
import com.google.common.collect.Maps;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.ReelLockPosUtil;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.barcode.bean.CodeBean;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.utils.CodeResolve;
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.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.service.manager.IDataLogManager;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.france1588.bean.XlcTask;
import com.neotel.smfcore.custom.france1588.enums.TaskLoc;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
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 javax.servlet.http.HttpServletRequest;
import java.util.*;
import java.util.stream.Collectors;
@RestController
@Slf4j
@RequestMapping("/device1588")
public class Device1588Controller {
@Autowired
private IBarcodeManager barcodeManager;
@Autowired
private CodeResolve codeResolve;
@Autowired
private DataCache dataCache;
@Autowired
private TaskService taskService;
@Autowired
private IStoragePosManager storagePosManager;
@Autowired
private IDataLogManager dataLogManager;
/**
* 1.查询料盘尺寸, 请求料号, 返回尺寸
*/
@ApiOperation("查询物料尺寸")
@RequestMapping("/getReelSize")
@AnonymousAccess
public ResultBean getReelSize(String barcodeStr) {
Map<String, Integer> resultMap = new HashMap<>();
CodeBean codeBean = codeResolve.resolveSingleCode(barcodeStr);
if (codeBean.isValid()) {
Barcode barcode = codeBean.getBarcode();
resultMap.put("w", barcode.getPlateSize());
resultMap.put("h", barcode.getHeight());
return ResultBean.newOkResult(resultMap);
}
return ResultBean.newErrorResult(-1, "smfcore.valueInvalid", "[{0}]不是有效的参数", new String[]{barcodeStr});
}
/**
*2.查询入库用的料箱, 返回库位
* 延用通用的接口 /service/store/emptyPosForPutin
*/
/**
* 3.获取出库料箱,返回库位
*/
@ApiOperation("获取出库料箱,返回库位")
@RequestMapping("/generateBoxTask")
@AnonymousAccess
public ResultBean generateBoxTask(String cid) {
//key为posId,value为存的料盘数量
Map<String, Integer> posReelCountMap = xlcPosReelCount(cid);
//排序,找到物料最少的料箱
if (posReelCountMap == null || posReelCountMap.isEmpty()) {
return ResultBean.newErrorResult(-1, "smfcore.box.findFail", "未找到可以出库的料箱");
}
// 按 Value 升序排序
posReelCountMap = posReelCountMap.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(oldValue, newValue) -> oldValue,
LinkedHashMap::new // 保持顺序
));
//开始查找要出库的料箱
StoragePos pos = null;
for (String posId : posReelCountMap.keySet()) {
boolean hasNoFinishedTask = hasNoFinishedTask(posId);
if (hasNoFinishedTask) {
continue;
}
//判断有没有禁用
StoragePos storagePos = storagePosManager.get(posId);
if (!storagePos.isEnabled()) {
continue;
}
Barcode barcode = storagePos.getBarcode();
if (barcode == null) {
continue;
}
//判断有没有被锁定
String reelLockPosId = ReelLockPosUtil.getReelLockPosId(barcode.getBarcode());
if (StringUtils.isNotEmpty(reelLockPosId)) {
continue;
}
pos = storagePos;
break;
}
if (pos == null) {
return ResultBean.newErrorResult(-1, "smfcore.box.findFail", "未找到可以出库的料箱");
}
Storage storage = dataCache.getStorageById(pos.getStorageId());
DataLog dataLog = new DataLog(storage, pos.getBarcode(), pos);
dataLog.setLocInfo(TaskLoc.BOX_TASK_IN);
dataLog.setType(OP.CHECKOUT);
taskService.addTaskToExecute(dataLog);
return ResultBean.newOkResult(pos.getPosName());
}
/**
* 4.获取xlc的出库任务
*/
@ApiOperation("4.获取xlc的出库任务")
@RequestMapping("/getAllXlcTask")
@AnonymousAccess
public ResultBean getAllXlcTask(String cid) {
List<XlcTask> resultList = new ArrayList<>();
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog task : allTasks) {
if (!task.isCheckOutTask()){
continue;
}
if (task.isFinished() || task.isCancel()) {
continue;
}
//判断是不是xlc的
String storageId = task.getStorageId();
if (StringUtils.isEmpty(storageId)) {
continue;
}
Storage storage = dataCache.getStorageById(storageId);
if (!storage.isXLC()){
continue;
}
if (!storage.getCid().equals(cid)){
continue;
}
XlcTask xlcTask = new XlcTask();
xlcTask.setTaskId(task.getId());
xlcTask.setBarcode(task.getBarcode());
xlcTask.setType(task.getType());
xlcTask.setToloc(task.getLocInfo());
xlcTask.setPosName(task.getPosName());
xlcTask.setStatus(task.getStatus());
xlcTask.setCreateDate(task.getCreateDate());
if (StringUtils.isEmpty(xlcTask.getToloc())){
xlcTask.setToloc(TaskLoc.BOX_TASK_OUT);
}
resultList.add(xlcTask);
}
return ResultBean.newOkResult(resultList);
}
@ApiOperation("5.设置料箱为空料箱")
@RequestMapping("/setBoxEmpty")
@AnonymousAccess
public ResultBean setBoxEmpty(String boxStr) {
CodeBean codeBean = codeResolve.resolveSingleCode(boxStr);
if (!codeBean.isValid()) {
return ResultBean.newErrorResult(-1, "smfcore.error.barcode.invalid", "{0}不是有效的条码", new String[]{boxStr});
}
//生成出库任务
Barcode barcode = codeBean.getBarcode();
List<Barcode> subCodeList = barcode.getSubCodeList();
if (subCodeList != null && !subCodeList.isEmpty()) {
for (Barcode subCode : subCodeList) {
subCode.setPosName("");
subCode.setHostBarcodeId("");
barcodeManager.save(subCode);
DataLog dataLog = new DataLog();
dataLog.setBarcode(subCode.getBarcode());
dataLog.setPartNumber(subCode.getPartNumber());
dataLog.setPosName(barcode.getBarcode());
dataLog.setStatus(OP_STATUS.FINISHED.name());
dataLog.setNum(subCode.getAmount());
dataLog.setType(OP.CHECKOUT);
dataLogManager.save(dataLog);
}
}
barcode.setSubCodeList(new ArrayList<>());
barcodeManager.save(barcode);
return ResultBean.newOkResult("");
}
@ApiOperation("6.查询料箱空满状态")
@RequestMapping("/reelInBoxNum")
@AnonymousAccess
public ResultBean reelInBoxNum(String boxStr) {
CodeBean codeBean = codeResolve.resolveSingleCode(boxStr);
if (!codeBean.isValid()) {
return ResultBean.newErrorResult(-1, "smfcore.error.barcode.invalid", "{0}不是有效的条码", new String[]{boxStr});
}
int reelNum = 0;
Barcode barcode = codeBean.getBarcode();
List<Barcode> subCodeList = barcode.getSubCodeList();
if (subCodeList != null && !subCodeList.isEmpty()) {
reelNum = subCodeList.size();
}
return ResultBean.newOkResult(reelNum);
}
@ApiOperation("7.更新料箱位置信息")
@RequestMapping("/updateBoxLoc")
@AnonymousAccess
public ResultBean updateBoxLoc(HttpServletRequest request) {
String boxStr = request.getParameter("boxStr");
String statusStr = request.getParameter("statusStr");
log.info("更新料箱:" + boxStr + "状态为:" + statusStr);
//判断是不是有效的条码
CodeBean codeBean = codeResolve.resolveSingleCode(boxStr);
if (!codeBean.isValid()) {
return ResultBean.newErrorResult(-1, "smfcore.error.barcode.invalid", "{0}不是有效的条码", new String[]{boxStr});
}
Barcode boxBarcode = codeBean.getBarcode();
//判断任务是否存在
DataLog task = null;
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog dataLog : allTasks) {
if (boxBarcode.getBarcode().equals(dataLog.getBarcode())) {
if (!dataLog.isFinished() && !dataLog.isCancel()) {
task = dataLog;
break;
}
}
}
statusStr = statusStr.toUpperCase();
if (task != null) {
log.info("更新料箱[" + boxStr + "]的任务[" + task.getId() + "]状态为:" + statusStr);
//判断是不是与上一次的任务相同
if (task.getStatus().equals(statusStr)) {
return ResultBean.newOkResult("");
}
task.setStatus(statusStr);
if (OP_STATUS.EXECUTING.name().equals(statusStr)) {
taskService.updateQueueTask(task);
} else {
if (!task.isOutFromPos()) {
taskService.moveTaskToFinished(task);
outFromPos(task);
task.setOutFromPos(true);
}
taskService.updateFinishedTask(task);
}
} else {
StoragePos pos = storagePosManager.getByBarcode(boxBarcode.getBarcode());
//如果在库位中,则生成一个出库任务
if (pos != null){
Storage storage = dataCache.getStorageById(pos.getStorageId());
DataLog dataLog = new DataLog(storage, pos.getBarcode(), pos);
dataLog.setStatus(statusStr);
dataLog.setType(OP.CHECKOUT);
if (!dataLog.isOutFromPos()) {
taskService.moveTaskToFinished(dataLog);
outFromPos(dataLog);
dataLog.setOutFromPos(true);
}
taskService.updateFinishedTask(dataLog);
}
}
return ResultBean.newOkResult("");
}
@ApiOperation("8.料盘放入料箱")
@RequestMapping("/reelToBox")
@AnonymousAccess
public ResultBean reelToBox(HttpServletRequest request) {
String boxStr = request.getParameter("boxStr");
String barcodeStr = request.getParameter("barcodeStr");
log.info("收到料盘:" + barcodeStr + ",放到料箱:" + boxStr);
//判断物料是不是有效的
CodeBean codeBean = codeResolve.resolveSingleCode(barcodeStr);
if (!codeBean.isValid()) {
return ResultBean.newErrorResult(-1, "smfcore.error.barcode.invalid", "{0}不是有效的条码", new String[]{barcodeStr});
}
Barcode barcode = codeBean.getBarcode();
barcode = removeOldBox(barcode);
//判断料箱是不是有效的条码
CodeBean boxCodeBean = codeResolve.resolveSingleCode(boxStr);
if (!boxCodeBean.isValid()) {
return ResultBean.newErrorResult(-1, "smfcore.error.barcode.invalid", "{0}不是有效的条码", new String[]{boxStr});
}
Barcode boxBarcode = boxCodeBean.getBarcode();
putInNewBox(barcode, boxBarcode);
return ResultBean.newOkResult("");
}
@ApiOperation("9.判断是否需要出库")
@RequestMapping("/needOut")
@AnonymousAccess
public ResultBean needOut(HttpServletRequest request) {
String barcodeStr = request.getParameter("barcodeStr");
//判断物料是不是有效的
CodeBean codeBean = codeResolve.resolveSingleCode(barcodeStr);
if (!codeBean.isValid()) {
return ResultBean.newErrorResult(-1, "smfcore.error.barcode.invalid", "{0}不是有效的条码", new String[]{barcodeStr});
}
Barcode barcode = codeBean.getBarcode();
//判断需不需要出库
boolean needOut = false;
Integer awaiting = barcode.getAppendData("awaiting");
if (awaiting != null) {
needOut = true;
}
removeOldBox(barcode);
return ResultBean.newOkResult(needOut);
}
@ApiOperation("10.判断当前料箱是不是还有要出的物料")
@RequestMapping("/boxHasOutReel")
@AnonymousAccess
public ResultBean boxHasOutReel(HttpServletRequest request) {
String boxStr = request.getParameter("boxStr");
//判断物料是不是有效的
CodeBean codeBean = codeResolve.resolveSingleCode(boxStr);
if (!codeBean.isValid()) {
return ResultBean.newErrorResult(-1, "smfcore.error.barcode.invalid", "{0}不是有效的条码", new String[]{boxStr});
}
Barcode barcode = codeBean.getBarcode();
//判断需不需要出库
boolean needOut = false;
List<Barcode> subCodeList = barcode.getSubCodeList();
if (subCodeList != null && !subCodeList.isEmpty()){
for (Barcode subCode : subCodeList) {
Integer awaiting = subCode.getAppendData("awaiting");
if (awaiting != null) {
needOut = true;
break;
}
}
}
return ResultBean.newOkResult(needOut);
}
@ApiOperation("客户端修改缓存信息")
@RequestMapping("/updateCacheInfo")
@AnonymousAccess
public ResultBean updateCacheInfo(@RequestBody Map<String, Object> paramMap) {
Map<String, Object> cacheMap = dataCache.getCache(Constants.Cache_BoxCacheInfo);
if (cacheMap == null) {
cacheMap = Maps.newConcurrentMap();
}
if (!paramMap.isEmpty()) {
for (String key : paramMap.keySet()) {
cacheMap.put(key, paramMap.get(key));
}
}
dataCache.updateCache(Constants.Cache_BoxCacheInfo, cacheMap);
return ResultBean.newOkResult(cacheMap);
}
@ApiOperation("客户端获取缓存信息")
@RequestMapping("/getCacheInfo")
@AnonymousAccess
public ResultBean getCacheInfo() {
Map<String, Object> cacheMap = dataCache.getCache(Constants.Cache_BoxCacheInfo);
if (cacheMap == null) {
cacheMap = Maps.newConcurrentMap();
}
return ResultBean.newOkResult(cacheMap);
}
private void putInNewBox(Barcode barcode, Barcode boxBarcode) {
StoragePos pos = storagePosManager.getByBarcode(boxBarcode.getBarcode());
if (pos != null) {
boxBarcode = pos.getBarcode();
}
barcode.setPutInTime(System.currentTimeMillis());
barcode.setHostBarcodeId(boxBarcode.getId());
barcode.setPosName(boxBarcode.getPosName());
barcodeManager.save(barcode);
boxBarcode.UpdateSubCode(barcode);
barcodeManager.save(boxBarcode);
if (pos != null) {
pos.setBarcode(boxBarcode);
storagePosManager.save(pos);
}
DataLog task = new DataLog();
task.setStatus(OP_STATUS.FINISHED.name());
task.setPartNumber(barcode.getPartNumber());
task.setBarcode(barcode.getBarcode());
task.setNum(barcode.getAmount());
task.setType(OP.PUT_IN);
task.setCid(boxBarcode.getPartNumber());
task.setStorageName(boxBarcode.getBarcode());
task.setPosName(boxBarcode.getBarcode());
task.setOperator("smf");
task = dataLogManager.save(task);
taskService.updateFinishedTask(task);
}
private Barcode removeOldBox(Barcode barcode) {
String hostBarcodeId = barcode.getHostBarcodeId();
if (StringUtils.isEmpty(hostBarcodeId)) {
return barcode;
}
//生成出库任务
String orderItemId = barcode.getAppendData("orderItemId");
String orderNo = barcode.getAppendData("orderNo");
String orderId = barcode.getAppendData("orderId");
Barcode boxBarcode = barcodeManager.get(barcode.getHostBarcodeId());
StoragePos pos = storagePosManager.getByBarcode(boxBarcode.getBarcode());
if (pos != null) {
boxBarcode = pos.getBarcode();
}
int num = barcode.getAmount();
barcode.setHostBarcodeId("");
barcode.setPosName("");
barcode.updateAppendData("orderItemId", null);
barcode.updateAppendData("orderNo", null);
barcode.updateAppendData("orderId", null);
barcode.updateAppendData("awaiting", null);
barcode.setAmount(0);
//更新料箱信息
boxBarcode.UpdateSubCode(barcode);
barcode.setAmount(num);
barcodeManager.save(barcode);
barcodeManager.save(boxBarcode);
if (pos != null) {
pos.setBarcode(boxBarcode);
storagePosManager.save(pos);
}
DataLog task = new DataLog();
task.setStatus(OP_STATUS.FINISHED.name());
task.setPartNumber(barcode.getPartNumber());
task.setBarcode(barcode.getBarcode());
task.setNum(num);
task.setType(OP.CHECKOUT);
task.setCid(boxBarcode.getPartNumber());
task.setStorageName(boxBarcode.getBarcode());
task.setPosName(boxBarcode.getBarcode());
task.setOperator("smf");
if (StringUtils.isNotEmpty(orderItemId)) {
task.setSubSourceId(orderItemId);
}
if (StringUtils.isNotEmpty(orderNo)) {
task.setSourceName(orderNo);
}
if (StringUtils.isNotEmpty(orderId)) {
task.setSourceId(orderId);
}
task = dataLogManager.save(task);
taskService.updateFinishedTask(task);
return barcode;
}
private void outFromPos(DataLog opTask) {
if (StringUtils.isEmpty(opTask.getPosId())) {
return;
}
//从队列里面移除操作
taskService.removeQueueTask(opTask);
StoragePos storagePos = storagePosManager.get(opTask.getPosId());
Barcode barcode = storagePos.getBarcode();
if (barcode == null) {
log.warn("任务:" + opTask.getId() + " 仓位:" + opTask.getPosName() + " 的 Barcode 为null, 之前可能处理过,结束任务后直接返回");
return;
}
barcode = barcodeManager.get(barcode.getId());
if (barcode != null) {
//二维码状态
barcode.setUsed(true);
barcode.setUsedDate(new Date());
barcode.setCheckOutDate(new Date(), "");
barcode.setLockName(null);
barcode.setLockId(null);
barcode.setPosName(null);
barcodeManager.save(barcode);
}
storagePos.setBarcode(null);
storagePos.setUsed(false);
storagePosManager.save(storagePos);
log.info(opTask.getBarcode() + "出库完成,清空仓位: " + storagePos.getId() + "[" + storagePos.getPosName() + "]");
taskService.moveTaskToFinished(opTask);
}
private boolean hasNoFinishedTask(String posId) {
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog dataLog : allTasks) {
if (posId.equals(dataLog.getPosId()) && !dataLog.isFinished() && !dataLog.isCancel()) {
return true;
}
}
return false;
}
private Map<String, Integer> xlcPosReelCount(String cid) {
Map<String, Integer> posReelCountMap = new HashMap<>();
//只找xlc设备的料箱
for (Storage storage : dataCache.getAllStorage().values()) {
if (storage.isXLC() && storage.getCid().equals(cid)) {
Map<String, StoragePos> usedPosList = dataCache.getUsedPosList(storage.getCid());
if (usedPosList != null && !usedPosList.isEmpty()) {
for (StoragePos pos : usedPosList.values()) {
Barcode barcode = pos.getBarcode();
if (barcode != null) {
List<Barcode> subCodeList = barcode.getSubCodeList();
if (subCodeList == null || subCodeList.isEmpty()) {
posReelCountMap.put(pos.getId(), 0);
} else {
posReelCountMap.put(pos.getId(), subCodeList.size());
}
}
}
}
}
}
return posReelCountMap;
}
}
package com.neotel.smfcore.custom.france1588.enums;
public class TaskLoc {
public static final String BOX_TASK_IN = "BOX_TASK_IN";
public static final String BOX_TASK_OUT = "BOX_TASK_OUT";
}
\ No newline at end of file \ No newline at end of file
...@@ -434,4 +434,5 @@ smfcore.virtualOperations=\u865A\u62DF\u4ED3\u64CD\u4F5C ...@@ -434,4 +434,5 @@ smfcore.virtualOperations=\u865A\u62DF\u4ED3\u64CD\u4F5C
smfcore.equipment.view.ncgroup=Neo Counter smfcore.equipment.view.ncgroup=Neo Counter
smfcore.virtual.boxInPos=[{0}]\u5DF2\u5728\u5E93\u4F4D[{1}]\u4E2D,\u8BF7\u5148\u53D6\u51FA smfcore.virtual.boxInPos=[{0}]\u5DF2\u5728\u5E93\u4F4D[{1}]\u4E2D,\u8BF7\u5148\u53D6\u51FA
smfcore.virtual.quantityError=\u53D6\u51FA\u6570\u91CF\u5E94\u4E3A[{0}] smfcore.virtual.quantityError=\u53D6\u51FA\u6570\u91CF\u5E94\u4E3A[{0}]
smfcode.virtual.enter=\u8BF7\u626B\u63CF\u6216\u8F93\u5165\u6761\u7801\u540E\u6309\u56DE\u8F66\u786E\u8BA4
\ No newline at end of file \ No newline at end of file
smfcode.virtual.enter=\u8BF7\u626B\u63CF\u6216\u8F93\u5165\u6761\u7801\u540E\u6309\u56DE\u8F66\u786E\u8BA4
smfcore.box.findFail=\u672A\u627E\u5230\u53EF\u4EE5\u51FA\u5E93\u7684\u6599\u7BB1
\ No newline at end of file \ No newline at end of file
...@@ -424,4 +424,5 @@ smfcore.virtualOperations=Vorg\u00E4nge im virtuellen Lager ...@@ -424,4 +424,5 @@ smfcore.virtualOperations=Vorg\u00E4nge im virtuellen Lager
smfcore.equipment.view.ncgroup=Neo Counter smfcore.equipment.view.ncgroup=Neo Counter
smfcore.virtual.boxInPos=[{0}] befindet sich bereits im Lagerplatz [{1}]. Bitte entnehmen Sie es zuerst smfcore.virtual.boxInPos=[{0}] befindet sich bereits im Lagerplatz [{1}]. Bitte entnehmen Sie es zuerst
smfcore.virtual.quantityError=Die zu entnehmende Menge sollte [{0}] betragen smfcore.virtual.quantityError=Die zu entnehmende Menge sollte [{0}] betragen
smfcode.virtual.enter=Bitte scannen Sie den Barcode oder geben Sie ihn ein und best\u00E4tigen Sie mit Enter
\ No newline at end of file \ No newline at end of file
smfcode.virtual.enter=Bitte scannen Sie den Barcode oder geben Sie ihn ein und best\u00E4tigen Sie mit Enter
smfcore.box.findFail=Kein verf\u00FCgbarer Beh\u00E4lter f\u00FCr den Ausgang gefunden
\ No newline at end of file \ No newline at end of file
...@@ -425,4 +425,5 @@ smfcore.virtualOperations=Virtual Storage Op ...@@ -425,4 +425,5 @@ smfcore.virtualOperations=Virtual Storage Op
smfcore.equipment.view.ncgroup=Neo Counter smfcore.equipment.view.ncgroup=Neo Counter
smfcore.virtual.boxInPos=[{0}] is already in location [{1}]. Please remove it first smfcore.virtual.boxInPos=[{0}] is already in location [{1}]. Please remove it first
smfcore.virtual.quantityError=The quantity to be removed should be [{0}] smfcore.virtual.quantityError=The quantity to be removed should be [{0}]
smfcode.virtual.enter=Please scan or enter the barcode, then press Enter
\ No newline at end of file \ No newline at end of file
smfcode.virtual.enter=Please scan or enter the barcode, then press Enter
smfcore.box.findFail=No available bin found for outbound
\ No newline at end of file \ No newline at end of file
...@@ -424,4 +424,5 @@ smfcore.virtualOperations=Op\u00E9rations de l'entrep\u00F4t virtuel ...@@ -424,4 +424,5 @@ smfcore.virtualOperations=Op\u00E9rations de l'entrep\u00F4t virtuel
smfcore.equipment.view.ncgroup=Neo Counter smfcore.equipment.view.ncgroup=Neo Counter
smfcore.virtual.boxInPos=[{0}] est d\u00E9j\u00E0 dans l'emplacement [{1}]. Veuillez d'abord le retirer smfcore.virtual.boxInPos=[{0}] est d\u00E9j\u00E0 dans l'emplacement [{1}]. Veuillez d'abord le retirer
smfcore.virtual.quantityError=La quantit\u00E9 \u00E0 retirer doit \u00EAtre [{0}] smfcore.virtual.quantityError=La quantit\u00E9 \u00E0 retirer doit \u00EAtre [{0}]
smfcode.virtual.enter=Veuillez scanner ou saisir le code-barres, puis appuyer sur Entr\u00E9e
\ No newline at end of file \ No newline at end of file
smfcode.virtual.enter=Veuillez scanner ou saisir le code-barres, puis appuyer sur Entr\u00E9e
smfcore.box.findFail=Aucun bac disponible trouv\u00E9 pour la sortie
\ No newline at end of file \ No newline at end of file
...@@ -421,4 +421,5 @@ smfcore.virtualOperations=\u4EEE\u60F3\u5009\u5EAB\u64CD\u4F5C ...@@ -421,4 +421,5 @@ smfcore.virtualOperations=\u4EEE\u60F3\u5009\u5EAB\u64CD\u4F5C
smfcore.equipment.view.ncgroup=Neo Counter smfcore.equipment.view.ncgroup=Neo Counter
smfcore.virtual.boxInPos=[{0}] \u306F\u65E2\u306B\u30ED\u30B1\u30FC\u30B7\u30E7\u30F3 [{1}] \u306B\u3042\u308A\u307E\u3059\u3002\u5148\u306B\u53D6\u308A\u51FA\u3057\u3066\u304F\u3060\u3055\u3044 smfcore.virtual.boxInPos=[{0}] \u306F\u65E2\u306B\u30ED\u30B1\u30FC\u30B7\u30E7\u30F3 [{1}] \u306B\u3042\u308A\u307E\u3059\u3002\u5148\u306B\u53D6\u308A\u51FA\u3057\u3066\u304F\u3060\u3055\u3044
smfcore.virtual.quantityError=\u53D6\u308A\u51FA\u3057\u6570\u91CF\u306F[{0}]\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059 smfcore.virtual.quantityError=\u53D6\u308A\u51FA\u3057\u6570\u91CF\u306F[{0}]\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059
smfcode.virtual.enter=\u30D0\u30FC\u30B3\u30FC\u30C9\u3092\u30B9\u30AD\u30E3\u30F3\u3001\u307E\u305F\u306F\u5165\u529B\u5F8C\u3001Enter\u30AD\u30FC\u3092\u62BC\u3057\u3066\u304F\u3060\u3055\u3044
\ No newline at end of file \ No newline at end of file
smfcode.virtual.enter=\u30D0\u30FC\u30B3\u30FC\u30C9\u3092\u30B9\u30AD\u30E3\u30F3\u3001\u307E\u305F\u306F\u5165\u529B\u5F8C\u3001Enter\u30AD\u30FC\u3092\u62BC\u3057\u3066\u304F\u3060\u3055\u3044
smfcore.box.findFail=\u51FA\u5EAB\u53EF\u80FD\u306A\u7BB1\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093
\ No newline at end of file \ No newline at end of file
...@@ -421,4 +421,5 @@ smfcore.virtualOperations=\u865A\u62DF\u4ED3\u64CD\u4F5C ...@@ -421,4 +421,5 @@ smfcore.virtualOperations=\u865A\u62DF\u4ED3\u64CD\u4F5C
smfcore.equipment.view.ncgroup=Neo Counter smfcore.equipment.view.ncgroup=Neo Counter
smfcore.virtual.boxInPos=[{0}]\u5DF2\u5728\u5E93\u4F4D[{1}]\u4E2D,\u8BF7\u5148\u53D6\u51FA smfcore.virtual.boxInPos=[{0}]\u5DF2\u5728\u5E93\u4F4D[{1}]\u4E2D,\u8BF7\u5148\u53D6\u51FA
smfcore.virtual.quantityError=\u53D6\u51FA\u6570\u91CF\u5E94\u4E3A[{0}] smfcore.virtual.quantityError=\u53D6\u51FA\u6570\u91CF\u5E94\u4E3A[{0}]
smfcode.virtual.enter=\u8BF7\u626B\u63CF\u6216\u8F93\u5165\u6761\u7801\u540E\u6309\u56DE\u8F66\u786E\u8BA4
\ No newline at end of file \ No newline at end of file
smfcode.virtual.enter=\u8BF7\u626B\u63CF\u6216\u8F93\u5165\u6761\u7801\u540E\u6309\u56DE\u8F66\u786E\u8BA4
smfcore.box.findFail=\u672A\u627E\u5230\u53EF\u4EE5\u51FA\u5E93\u7684\u6599\u7BB1
\ No newline at end of file \ No newline at end of file
...@@ -421,4 +421,5 @@ smfcore.virtualOperations=\u865B\u64EC\u5009\u64CD\u4F5C ...@@ -421,4 +421,5 @@ smfcore.virtualOperations=\u865B\u64EC\u5009\u64CD\u4F5C
smfcore.equipment.view.ncgroup=Neo Counter smfcore.equipment.view.ncgroup=Neo Counter
smfcore.virtual.boxInPos=[{0}]\u5DF2\u5728\u5EAB\u4F4D[{1}]\u4E2D,\u8ACB\u5148\u53D6\u51FA smfcore.virtual.boxInPos=[{0}]\u5DF2\u5728\u5EAB\u4F4D[{1}]\u4E2D,\u8ACB\u5148\u53D6\u51FA
smfcore.virtual.quantityError=\u53D6\u51FA\u6578\u91CF\u61C9\u70BA[{0}] smfcore.virtual.quantityError=\u53D6\u51FA\u6578\u91CF\u61C9\u70BA[{0}]
smfcode.virtual.enter=\u8ACB\u6383\u63CF\u6216\u8F38\u5165\u689D\u78BC\u5F8C\u6309\u56DE\u8ECA\u78BA\u8A8D
\ No newline at end of file \ No newline at end of file
smfcode.virtual.enter=\u8ACB\u6383\u63CF\u6216\u8F38\u5165\u689D\u78BC\u5F8C\u6309\u56DE\u8ECA\u78BA\u8A8D
smfcore.box.findFail=\u672A\u627E\u5230\u53EF\u4EE5\u51FA\u5EAB\u7684\u6599\u7BB1
\ No newline at end of file \ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!