Commit e8bc9ea6 zshaohui

1.虚拟仓

2.工单出库修改
1 个父辈 3be0048e
...@@ -312,7 +312,7 @@ public class DataInitManager { ...@@ -312,7 +312,7 @@ public class DataInitManager {
addNewFunctionMenu(133,null,"outVir","虚拟仓出库","outVir","outers/outVir/index","index",functionMenuMap); 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); //addNewFunctionMenu(1,null,"elecKanban", "电子看板","elecKanban", "elecKanban/index","kanban",functionMenuMap);
......
...@@ -414,57 +414,6 @@ public class LiteOrderCache { ...@@ -414,57 +414,6 @@ public class LiteOrderCache {
* 锁定物料 * 锁定物料
*/ */
public synchronized String checkOutLiteOrder(String orderNo, boolean outBom) { 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); LiteOrder cacheOrder = liteOrderMap.get(orderNo);
if (cacheOrder == null) { if (cacheOrder == null) {
cacheOrder = liteOrderManager.findByOrderNo(orderNo); cacheOrder = liteOrderManager.findByOrderNo(orderNo);
...@@ -475,30 +424,18 @@ public class LiteOrderCache { ...@@ -475,30 +424,18 @@ public class LiteOrderCache {
} }
if (!cacheOrder.isTaskFinished() && !cacheOrder.isNew()) { if (!cacheOrder.isTaskFinished() && !cacheOrder.isNew()) {
log.info("工单[" + orderNo + "]正在执行"); //log.info("工单[" + orderNo + "]正在执行");
return "smfcore.order.out.executing"; return "smfcore.order.out.executing";
} }
if (cacheOrder.isClosed()) { if (cacheOrder.isClosed()) {
log.info("工单[" + orderNo + "]已关闭,无法出库"); //log.info("工单[" + orderNo + "]已关闭,无法出库");
return "smfcore.order.hasClose"; 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()); String exportStr = StorageExportUtil.getExportByOrderNo(cacheOrder.getOrderNo(),true,cacheOrder.isMaiZheng());
if (StringUtils.isBlank(exportStr)) { if (StringUtils.isBlank(exportStr)) {
log.info(cacheOrder.getOrderNo() + "没有空闲的出料口"); //log.info(cacheOrder.getOrderNo() + "没有空闲的出料口");
return "没有空闲的出料口"; return "没有空闲的出料口";
} }
...@@ -514,10 +451,13 @@ public class LiteOrderCache { ...@@ -514,10 +451,13 @@ public class LiteOrderCache {
//liteOrderMap.put(cacheOrder.getOrderNo(), cacheOrder); //liteOrderMap.put(cacheOrder.getOrderNo(), cacheOrder);
int taskReelCount = 0; int taskReelCount = 0;
CHECKOUT_TYPE checkoutType = dataCache.getCheckOutType(); 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()){ if (!storage.isVirtual()){
availableStorageIds.add(storage.getId()); storageIdList.add(availableStorageId);
} }
} }
...@@ -560,45 +500,16 @@ public class LiteOrderCache { ...@@ -560,45 +500,16 @@ public class LiteOrderCache {
} else { } else {
//PN //PN
do { do {
//首先按空闲料仓进行出库 pos = storagePosManager.findPartNumberInStorages(storageIdList, partNumber, excludePosIds, checkoutType, orderItem.getBrand());
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;
}
}
}
}
if (pos == null) { if (pos == null) {
break; break;
} }
try { try {
smfApi.canPutInAfterResolve(pos.getBarcode()); smfApi.canPutInAfterResolve(pos.getBarcode());
} catch (ValidateException e) { } catch (ValidateException e) {
e.printStackTrace(); e.printStackTrace();
log.error("工单号:" + orderNo + "唯一码:" + pos.getBarcode().getBarcode() + ":" + e.getMessage()); log.error("工单号:" + orderNo + "唯一码:" + pos.getBarcode().getBarcode() + ":" + e.getMessage());
pos = null; excludePosIds.add(pos.getId());
break;
} }
} while (pos == null); } while (pos == null);
} }
......
package com.neotel.smfcore.custom.lizhen; package com.neotel.smfcore.custom.lizhen;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import com.neotel.smfcore.common.bean.ResultBean; import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ApiException; import com.neotel.smfcore.common.exception.ApiException;
import com.neotel.smfcore.common.utils.Constants; import com.neotel.smfcore.common.utils.Constants;
...@@ -35,6 +36,9 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -35,6 +36,9 @@ import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import java.util.*; import java.util.*;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@Slf4j @Slf4j
@RestController @RestController
...@@ -186,6 +190,49 @@ public class LizhenController { ...@@ -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("内仓:机台叫料") @ApiOperation("内仓:机台叫料")
@PostMapping("/mPickingList") @PostMapping("/mPickingList")
@AnonymousAccess @AnonymousAccess
...@@ -196,18 +243,16 @@ public class LizhenController { ...@@ -196,18 +243,16 @@ public class LizhenController {
for (Map<String, String> param : params) { for (Map<String, String> param : params) {
String line = param.get("LINE"); String line = param.get("LINE");
String forwardUrl = getForwardUrl(line); String forwardUrl = getForwardUrl(line);
log.info("Mes缺料预警---" + JSONObject.toJSONString(param) + ",地址为:" + forwardUrl);
if (StringUtils.isBlank(forwardUrl)){ if (StringUtils.isBlank(forwardUrl)){
log.info(line+"没有对应的地址,跳过"); log.info(line+"没有对应的地址,跳过");
continue; continue;
} }
String id = param.get("ID"); String id = param.get("ID");
try {
String result = HttpHelper.postJson(forwardUrl, param); if (!warningItemMap.containsKey(id)) {
//log.info(id + "机台叫料结果为--" + result); warningItemMap.put(id, param);
} catch (ApiException e) {
e.printStackTrace();
log.info(id + "机台叫料转发失败---" + e.getMessage());
} }
} }
return ResultBean.newOkResult(""); return ResultBean.newOkResult("");
...@@ -220,7 +265,7 @@ public class LizhenController { ...@@ -220,7 +265,7 @@ public class LizhenController {
public ResultBean machineCallMaterial(@RequestBody Map<String, String> data) { public ResultBean machineCallMaterial(@RequestBody Map<String, String> data) {
boolean startJob = dataCache.getCache(Constants.CACHE_StartJob); boolean startJob = dataCache.getCache(Constants.CACHE_StartJob);
if (!startJob) { if (!startJob) {
return ResultBean.newErrorResult(-1, "", "定时任务未开启"); return ResultBean.newErrorResult(-1, "", "定时任务未开启",new String[]{},false);
} }
//log.info("Mes缺料预警---" + JSONObject.toJSONString(data)); //log.info("Mes缺料预警---" + JSONObject.toJSONString(data));
PreWarningItem item = new PreWarningItem(); PreWarningItem item = new PreWarningItem();
......
...@@ -212,7 +212,7 @@ public class PreWarningItemCache { ...@@ -212,7 +212,7 @@ public class PreWarningItemCache {
liteOrder.setTaskReelCount(orderItems.size()); liteOrder.setTaskReelCount(orderItems.size());
liteOrder.setMaiZheng(maiZheng); liteOrder.setMaiZheng(maiZheng);
liteOrder = liteOrderManager.createWithItems(liteOrder); liteOrder = liteOrderManager.createWithItems(liteOrder);
log.info("生成工单信息为:" + liteOrder.getOrderNo()); log.info("生成工单信息为:" + liteOrder.getOrderNo()+"数量为:"+orderItems.size()+"线体名称为:"+liteOrder.getLine());
liteOrderCache.addOrderToMap(liteOrder); liteOrderCache.addOrderToMap(liteOrder);
} }
//工单生成后,从缓存中清除 //工单生成后,从缓存中清除
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!