Commit e8bc9ea6 zshaohui

1.虚拟仓

2.工单出库修改
1 个父辈 3be0048e
......@@ -312,7 +312,7 @@ public class DataInitManager {
addNewFunctionMenu(133,null,"outVir","虚拟仓出库","outVir","outers/outVir/index","index",functionMenuMap);
//内仓线外入库
addNewFunctionMenu(134,null,"virWarehous","虚拟仓","virWarehous","virWarehous/virWarehous/index","feeding",functionMenuMap);
addNewFunctionMenu(134,null,"bcVirWarehous","虚拟仓","bcVirWarehous","virWarehous/virWarehous/index","feeding",functionMenuMap);
//内外仓电子看板
//addNewFunctionMenu(1,null,"elecKanban", "电子看板","elecKanban", "elecKanban/index","kanban",functionMenuMap);
......
......@@ -414,57 +414,6 @@ public class LiteOrderCache {
* 锁定物料
*/
public synchronized String checkOutLiteOrder(String orderNo, boolean outBom) {
List<String> freeStorageIds = new ArrayList<>();
//判断是否有空闲料仓
List<String> storageIds = dataCache.getAvailableStorageIds();
for (String storageId : storageIds) {
boolean hasOutTask = false;
Storage storage = dataCache.getStorageById(storageId);
if (!storage.isType(new DeviceType[]{DeviceType.SMD_XLR})) {
continue;
}
//判断当前料仓,状态是否正常
StatusBean statusBean = DevicesStatusUtil.getStatusBean(storage.getCid());
if (statusBean == null || statusBean.getStatus() != BOX_STATUS.READY) {
continue;
}
List<DataLog> allTasksByCid = taskService.getAllTasksByCid(storage.getCid());
for (DataLog task : allTasksByCid) {
if (!task.isFinished()
&& !task.isCancel()
&& !task.isToBox()
&& task.isCheckOutTask()
&& StringUtils.isNotBlank(task.getSourceId())
)
if (task.isCheckOutTask() && StringUtils.isNotBlank(task.getSourceId()) && (task.isExecuting() || task.isWait())){
hasOutTask = true;
break;
}
}
if (!hasOutTask) {
//log.info("空闲料仓:" + storage.getName());
freeStorageIds.add(storageId);
}
}
if (freeStorageIds == null || freeStorageIds.isEmpty()) {
return orderNo + "没有可用料仓";
}
//判断当前工单的任务数,是否大于2
/*int executingCount = 0;
if (liteOrderMap != null){
for (LiteOrder order : liteOrderMap.values()) {
if (order.isOutTails()){
executingCount ++;
}
}
}
if (executingCount >= 2){
return "正在执行的工单超过2个,跳过";
}*/
LiteOrder cacheOrder = liteOrderMap.get(orderNo);
if (cacheOrder == null) {
cacheOrder = liteOrderManager.findByOrderNo(orderNo);
......@@ -475,30 +424,18 @@ public class LiteOrderCache {
}
if (!cacheOrder.isTaskFinished() && !cacheOrder.isNew()) {
log.info("工单[" + orderNo + "]正在执行");
//log.info("工单[" + orderNo + "]正在执行");
return "smfcore.order.out.executing";
}
if (cacheOrder.isClosed()) {
log.info("工单[" + orderNo + "]已关闭,无法出库");
//log.info("工单[" + orderNo + "]已关闭,无法出库");
return "smfcore.order.hasClose";
}
/*ORDER_COLOR nextColor = getNextColor();
if (nextColor == null) {
log.info("执行工单[" + orderNo + "] outBom=" + outBom + "时,已达最大可执行工单数");
return "smfcore.order.out.maxOrder";
}*/
//先查找是否已经锁定过库位,如果已经锁定过,出锁定的库位
List<StoragePos> lockPosList = storagePosManager.findLockPos(cacheOrder.getOrderNo());
if (lockPosList != null && lockPosList.size() > 0) {
return checkOutOrder(cacheOrder).getMsgKey();
}
//获取是否有出料口
String exportStr = StorageExportUtil.getExportByOrderNo(cacheOrder.getOrderNo(),true,cacheOrder.isMaiZheng());
if (StringUtils.isBlank(exportStr)) {
log.info(cacheOrder.getOrderNo() + "没有空闲的出料口");
//log.info(cacheOrder.getOrderNo() + "没有空闲的出料口");
return "没有空闲的出料口";
}
......@@ -514,10 +451,13 @@ public class LiteOrderCache {
//liteOrderMap.put(cacheOrder.getOrderNo(), cacheOrder);
int taskReelCount = 0;
CHECKOUT_TYPE checkoutType = dataCache.getCheckOutType();
List<String> availableStorageIds = new ArrayList<>();
for (Storage storage : dataCache.getAllStorage().values()) {
List<String> storageIdList = new ArrayList<>();
List<String> availableStorageIds = dataCache.getAvailableStorageIds();
for (String availableStorageId : availableStorageIds) {
Storage storage = dataCache.getStorageById(availableStorageId);
if (!storage.isVirtual()){
availableStorageIds.add(storage.getId());
storageIdList.add(availableStorageId);
}
}
......@@ -560,45 +500,16 @@ public class LiteOrderCache {
} else {
//PN
do {
//首先按空闲料仓进行出库
List<StoragePos> storagePosList = storagePosManager.findPartNumberListInStorages(freeStorageIds, partNumber, excludePosIds, checkoutType, orderItem.getBrand());
//如果为空的话,则出全部的
if (storagePosList == null || storagePosList.isEmpty()) {
storagePosList = storagePosManager.findPartNumberListInStorages(availableStorageIds, partNumber, excludePosIds, checkoutType, orderItem.getBrand());
}
//排序找到最早的
if (storagePosList != null && !storagePosList.isEmpty()) {
List<Barcode> barcodeList = new ArrayList<>();
for (StoragePos storagePos : storagePosList) {
barcodeList.add(storagePos.getBarcode());
}
if (barcodeList != null && !barcodeList.isEmpty()) {
barcodeList = barcodeList.stream().sorted(Comparator.comparing(Barcode::getAmount)
.thenComparing(Barcode::getExpireDate, Comparator.nullsFirst(Date::compareTo))
.thenComparing(Barcode::getCreateDate)).collect(Collectors.toList());
Barcode barcode = barcodeList.get(0);
for (StoragePos storagePos : storagePosList) {
if (storagePos.getBarcode().getBarcode().equals(barcode.getBarcode())) {
pos = storagePos;
break;
}
}
}
}
pos = storagePosManager.findPartNumberInStorages(storageIdList, partNumber, excludePosIds, checkoutType, orderItem.getBrand());
if (pos == null) {
break;
}
try {
smfApi.canPutInAfterResolve(pos.getBarcode());
} catch (ValidateException e) {
e.printStackTrace();
log.error("工单号:" + orderNo + "唯一码:" + pos.getBarcode().getBarcode() + ":" + e.getMessage());
pos = null;
break;
excludePosIds.add(pos.getId());
}
} while (pos == null);
}
......
package com.neotel.smfcore.custom.lizhen;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ApiException;
import com.neotel.smfcore.common.utils.Constants;
......@@ -35,6 +36,9 @@ import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
import java.util.*;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@Slf4j
@RestController
......@@ -186,6 +190,49 @@ public class LizhenController {
}
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(1);
@PostConstruct
void warningItem() {
scheduledThreadPool.scheduleAtFixedRate(() -> {
if (!isSend) {
try {
isSend = true;
sendWarningItem();
} catch (Exception e) {
e.printStackTrace();
} finally {
isSend = false;
}
}
}, 10, 10, TimeUnit.SECONDS);
}
private static boolean isSend = false;
private static Map<String,Map<String, String>> warningItemMap = Maps.newConcurrentMap();
public void sendWarningItem() {
if (warningItemMap != null && !warningItemMap.isEmpty()) {
Collection<Map<String, String>> values = warningItemMap.values();
List<Map<String, String>> itemList = new ArrayList<>(values);
for (Map<String, String> param : itemList) {
try {
String id = param.get("ID");
String line = param.get("LINE");
String forwardUrl = getForwardUrl(line);
log.info("Mes缺料预警---" + JSONObject.toJSONString(param) + ",地址为:" + forwardUrl);
String result = HttpHelper.postJson(forwardUrl, param);
log.info(id + "缺料预警转发结果为:" + result);
warningItemMap.remove(id);
} catch (ApiException e) {
log.error("缺料预警转发失败---" + e.getMessage());
}
}
}
}
@ApiOperation("内仓:机台叫料")
@PostMapping("/mPickingList")
@AnonymousAccess
......@@ -196,18 +243,16 @@ public class LizhenController {
for (Map<String, String> param : params) {
String line = param.get("LINE");
String forwardUrl = getForwardUrl(line);
log.info("Mes缺料预警---" + JSONObject.toJSONString(param) + ",地址为:" + forwardUrl);
if (StringUtils.isBlank(forwardUrl)){
log.info(line+"没有对应的地址,跳过");
continue;
}
String id = param.get("ID");
try {
String result = HttpHelper.postJson(forwardUrl, param);
//log.info(id + "机台叫料结果为--" + result);
} catch (ApiException e) {
e.printStackTrace();
log.info(id + "机台叫料转发失败---" + e.getMessage());
if (!warningItemMap.containsKey(id)) {
warningItemMap.put(id, param);
}
}
return ResultBean.newOkResult("");
......@@ -220,7 +265,7 @@ public class LizhenController {
public ResultBean machineCallMaterial(@RequestBody Map<String, String> data) {
boolean startJob = dataCache.getCache(Constants.CACHE_StartJob);
if (!startJob) {
return ResultBean.newErrorResult(-1, "", "定时任务未开启");
return ResultBean.newErrorResult(-1, "", "定时任务未开启",new String[]{},false);
}
//log.info("Mes缺料预警---" + JSONObject.toJSONString(data));
PreWarningItem item = new PreWarningItem();
......
......@@ -212,7 +212,7 @@ public class PreWarningItemCache {
liteOrder.setTaskReelCount(orderItems.size());
liteOrder.setMaiZheng(maiZheng);
liteOrder = liteOrderManager.createWithItems(liteOrder);
log.info("生成工单信息为:" + liteOrder.getOrderNo());
log.info("生成工单信息为:" + liteOrder.getOrderNo()+"数量为:"+orderItems.size()+"线体名称为:"+liteOrder.getLine());
liteOrderCache.addOrderToMap(liteOrder);
}
//工单生成后,从缓存中清除
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!