Commit 63d17b7d zshaohui

1.修改工单信息 锁优化

1 个父辈 77f70e42
......@@ -149,7 +149,7 @@ public class LiteOrderCache {
public void onTaskStatusChange(DataLog task) {
try {
//只有任务完成或取消时才处理,任务未完成直接返回
if (task.isFinished() || task.isCancel()) {
if ((task.isFinished() || task.isCancel()) && task.isCheckOutTask()) {
finishedOrderTask(task);
}
} catch (Exception e) {
......@@ -284,10 +284,12 @@ public class LiteOrderCache {
smfApi.onOrderStatusChange(liteOrder);
}
private Map<String,String> cacheOrderMap = new ConcurrentHashMap<>();
/**
* 更新工单状态信息
*/
private synchronized void finishedOrderTask(DataLog task) throws ValidateException {
private void finishedOrderTask(DataLog task) throws ValidateException {
String barcode = task.getBarcode();
if (barcode.startsWith("CS") || barcode.startsWith("CM") || barcode.startsWith("CB")){
return;
......@@ -297,168 +299,176 @@ public class LiteOrderCache {
//更新工单状态
String orderNo = task.getSourceName();
if (!Strings.isNullOrEmpty(orderNo)) {
LiteOrder order = liteOrderMap.get(orderNo);
//LiteOrder order = null;
if (order == null) {
log.info("缓存中未找到[" + orderNo + "],从数据库中重新加载");
order = liteOrderManager.findByOrderNo(orderNo);
if(order != null){
List<LiteOrderItem> items = liteOrderItemManager.findOrderItems(order.getId());
order.setOrderItems(items);
}
String lockObj = cacheOrderMap.get(orderNo);
if (StringUtils.isEmpty(lockObj)) {
lockObj = orderNo;
cacheOrderMap.put(orderNo, lockObj);
}
if (order != null) {
//任务是取消的,需要将总待出库数量-1
if (task.isCancel()) {
order.setTaskReelCount(order.getTaskReelCount() - 1);
//order.setTotalTaskReelCount(order.getTotalTaskReelCount()-1);
log.info("工单[" + orderNo + "]的任务" + task.getPartNumber() + "[" + task.getBarcode() + "]已取消,任务数-1=" + order.getFinishedReelCount() + "/" + order.getTaskReelCount());
if (order.getFinishedReelCount() == 0 && order.getTaskReelCount() == 0){
if (StringUtils.isNotBlank(task.getExport())){
StorageExportUtil.clearExport(task.getExport());
}
synchronized (cacheOrderMap.get(orderNo)) {
LiteOrder order = liteOrderMap.get(orderNo);
//LiteOrder order = null;
if (order == null) {
log.info("缓存中未找到[" + orderNo + "],从数据库中重新加载");
order = liteOrderManager.findByOrderNo(orderNo);
if (order != null) {
List<LiteOrderItem> items = liteOrderItemManager.findOrderItems(order.getId());
order.setOrderItems(items);
}
}
else if (task.isFinished()) {
order.setTotalFinishedReelCount(order.getTotalFinishedReelCount() + 1);
if (task.getExtendType() != ExtendType.MANUAL_FEEDING) {
order.setFinishedReelCount(order.getFinishedReelCount() + 1);
}
String orderItemId = task.getSubSourceId();
List<LiteOrderItem> orderItems = order.getOrderItems();
List<LiteOrderItem> liteOrderItems = new ArrayList<>();
if (LITEORDER_SOURCE.OUTTER.name().equals(order.getSource())) {
if (order != null) {
//任务是取消的,需要将总待出库数量-1
if (task.isCancel()) {
order.setTaskReelCount(order.getTaskReelCount() - 1);
//order.setTotalTaskReelCount(order.getTotalTaskReelCount()-1);
log.info("工单[" + orderNo + "]的任务" + task.getPartNumber() + "[" + task.getBarcode() + "]已取消,任务数-1=" + order.getFinishedReelCount() + "/" + order.getTaskReelCount());
if (order.getFinishedReelCount() == 0 && order.getTaskReelCount() == 0) {
if (StringUtils.isNotBlank(task.getExport())) {
StorageExportUtil.clearExport(task.getExport());
}
}
} else if (task.isFinished()) {
order.setTotalFinishedReelCount(order.getTotalFinishedReelCount() + 1);
log.info("更新任务盘数:"+order.getTaskReelCount()+",已完成的数量:"+order.getFinishedReelCount());
if (orderItems != null && !orderItems.isEmpty()) {
for (LiteOrderItem liteOrderItem : orderItems) {
if (liteOrderItem.getId().equals(orderItemId)) {
//判断是否超发,如果是超发,则赋值
if (order.isExcess()){
if (!liteOrderItem.isOutFinished()) {
liteOrderItem.setOutNum(liteOrderItem.getOutNum() + task.getNum());
liteOrderItem.setTotalReelCountByOutNum(liteOrderItem.getTotalReelCountByOutNum() + 1);
} else {
liteOrderItem.setOutReelCount(liteOrderItem.getOutReelCount() + 1);
if (task.getExtendType() != ExtendType.MANUAL_FEEDING) {
order.setFinishedReelCount(order.getFinishedReelCount() + 1);
}
String orderItemId = task.getSubSourceId();
List<LiteOrderItem> orderItems = order.getOrderItems();
List<LiteOrderItem> liteOrderItems = new ArrayList<>();
if (LITEORDER_SOURCE.OUTTER.name().equals(order.getSource())) {
order.setTotalFinishedReelCount(order.getTotalFinishedReelCount() + 1);
log.info("更新任务盘数:" + order.getTaskReelCount() + ",已完成的数量:" + order.getFinishedReelCount());
if (orderItems != null && !orderItems.isEmpty()) {
for (LiteOrderItem liteOrderItem : orderItems) {
if (liteOrderItem.getId().equals(orderItemId)) {
//判断是否超发,如果是超发,则赋值
if (order.isExcess()) {
if (!liteOrderItem.isOutFinished()) {
liteOrderItem.setOutNum(liteOrderItem.getOutNum() + task.getNum());
liteOrderItem.setTotalReelCountByOutNum(liteOrderItem.getTotalReelCountByOutNum() + 1);
} else {
liteOrderItem.setOutReelCount(liteOrderItem.getOutReelCount() + 1);
}
}
liteOrderItem.setTotalOutNum(liteOrderItem.getTotalOutNum() + task.getNum());
liteOrderItem.setTotalOutReelCount(liteOrderItem.getTotalOutReelCount() + 1);
liteOrderItem = liteOrderItemManager.save(liteOrderItem);
}
liteOrderItem.setTotalOutNum(liteOrderItem.getTotalOutNum() + task.getNum());
liteOrderItem.setTotalOutReelCount(liteOrderItem.getTotalOutReelCount() + 1);
liteOrderItem = liteOrderItemManager.save(liteOrderItem);
liteOrderItems.add(liteOrderItem);
}
liteOrderItems.add(liteOrderItem);
}
}
order.setOrderItems(liteOrderItems);
} else {
if (orderItems != null && !orderItems.isEmpty()) {
for (LiteOrderItem liteOrderItem : orderItems) {
if (liteOrderItem.getId().equals(orderItemId)) {
log.info("工单[" + orderNo + "]的任务" + task.getPartNumber() + "[" + task.getBarcode() + "]出库完成,已完成数量+1=" + order.getFinishedReelCount() + "/" + order.getTaskReelCount());
//更新对应条目的已出库数量和出库盘数
liteOrderItem.setOutNum(liteOrderItem.getOutNum() + task.getNum());
liteOrderItem.setOutReelCount(liteOrderItem.getOutReelCount() + 1);
liteOrderItem.setTotalOutNum(liteOrderItem.getTotalOutNum() + task.getNum());
liteOrderItem.setTotalOutReelCount(liteOrderItem.getTotalOutReelCount() + 1);
liteOrderItem.setOutReelList(task.getBarcode());
//同时设置详情
ItemOutDetail detail = new ItemOutDetail();
detail.setReelNew(task.getBarcode());
detail.setReelNewLong(task.getFullCode());
detail.setX(task.getX());
detail.setY(task.getY());
detail.setPartNumber(task.getPartNumber());
liteOrderItem.setOutDetailList(detail);
liteOrderItem.setPositionList(task.getPosName());
liteOrderItem = liteOrderItemManager.save(liteOrderItem);
order.setOrderItems(liteOrderItems);
} else {
if (orderItems != null && !orderItems.isEmpty()) {
for (LiteOrderItem liteOrderItem : orderItems) {
if (liteOrderItem.getId().equals(orderItemId)) {
log.info("工单[" + orderNo + "]的任务" + task.getPartNumber() + "[" + task.getBarcode() + "]出库完成,已完成数量+1=" + order.getFinishedReelCount() + "/" + order.getTaskReelCount());
//更新对应条目的已出库数量和出库盘数
liteOrderItem.setOutNum(liteOrderItem.getOutNum() + task.getNum());
liteOrderItem.setOutReelCount(liteOrderItem.getOutReelCount() + 1);
liteOrderItem.setTotalOutNum(liteOrderItem.getTotalOutNum() + task.getNum());
liteOrderItem.setTotalOutReelCount(liteOrderItem.getTotalOutReelCount() + 1);
liteOrderItem.setOutReelList(task.getBarcode());
//同时设置详情
ItemOutDetail detail = new ItemOutDetail();
detail.setReelNew(task.getBarcode());
detail.setReelNewLong(task.getFullCode());
detail.setX(task.getX());
detail.setY(task.getY());
detail.setPartNumber(task.getPartNumber());
liteOrderItem.setOutDetailList(detail);
liteOrderItem.setPositionList(task.getPosName());
liteOrderItem = liteOrderItemManager.save(liteOrderItem);
}
liteOrderItems.add(liteOrderItem);
}
liteOrderItems.add(liteOrderItem);
}
//log.info(order.getOrderNo() + "更新工单详情:" + JsonUtil.toJsonStr(liteOrderItems));
order.setOrderItems(liteOrderItems);
/* liteOrderManager.createWithItems(order);*/
}
//log.info(order.getOrderNo() + "更新工单详情:" + JsonUtil.toJsonStr(liteOrderItems));
order.setOrderItems(liteOrderItems);
/* liteOrderManager.createWithItems(order);*/
} else {
log.error("工单[" + orderNo + "]的任务[" + task.getBarcode() + "]完成时,状态为:" + task.getStatus());
}
} else {
log.error("工单[" + orderNo + "]的任务[" + task.getBarcode() + "]完成时,状态为:" + task.getStatus());
}
if (LITEORDER_SOURCE.OUTTER.name().equals(order.getSource())){
if (!order.isClosed()) {
//工单未关闭的话,检查状态,全部都出完进行关闭
boolean closed = true;
for (LiteOrderItem liteOrderItem : order.getOrderItems()) {
if (order.isExcess()){
if (liteOrderItem.getOutNum() < liteOrderItem.getNeedNum() || liteOrderItem.getOutReelCount() < liteOrderItem.getNeedReelCount()){
closed = false;
break;
}
} else {
if (liteOrderItem.getTotalOutNum() < liteOrderItem.getNeedNum() || liteOrderItem.getTotalOutReelCount() < liteOrderItem.getNeedReelCount()){
closed = false;
break;
if (LITEORDER_SOURCE.OUTTER.name().equals(order.getSource())) {
if (!order.isClosed()) {
//工单未关闭的话,检查状态,全部都出完进行关闭
boolean closed = true;
for (LiteOrderItem liteOrderItem : order.getOrderItems()) {
if (order.isExcess()) {
if (liteOrderItem.getOutNum() < liteOrderItem.getNeedNum() || liteOrderItem.getOutReelCount() < liteOrderItem.getNeedReelCount()) {
closed = false;
break;
}
} else {
if (liteOrderItem.getTotalOutNum() < liteOrderItem.getNeedNum() || liteOrderItem.getTotalOutReelCount() < liteOrderItem.getNeedReelCount()) {
closed = false;
break;
}
}
}
}
if (closed) {
order.setClosed(closed);
}
}
} else {
if (!order.isClosed()) {
//工单未关闭的话,检查状态,全部都出完进行关闭
boolean closed = true;
for (LiteOrderItem liteOrderItem : order.getOrderItems()) {
if (!liteOrderItem.isOutFinished()) {
closed = false;
break;
if (closed) {
order.setClosed(closed);
}
}
if (closed) {
Boolean ignoreLineCheck = dataCache.getCache(Constants.CACHE_ignoreLineCheck);
if (ignoreLineCheck == null){
ignoreLineCheck = false;
} else {
if (!order.isClosed()) {
//工单未关闭的话,检查状态,全部都出完进行关闭
boolean closed = true;
for (LiteOrderItem liteOrderItem : order.getOrderItems()) {
if (!liteOrderItem.isOutFinished()) {
closed = false;
break;
}
}
if (ignoreLineCheck) {
log.info("ignoreLineCheck为:" + ignoreLineCheck + "清空出料口信息:" + task.getExport() + ",工单号为:" + task.getSourceName());
if (StringUtils.isNotBlank(task.getExport())){
StorageExport export = StorageExportUtil.getExport(task.getExport());
if (StringUtils.isNotBlank(export.getHSerial())) {
StorageExportUtil.clearExport(task.getExport());
//StorageExportUtil.updateExport(task.getExport() + StorageExportUtil.OUT_STATION, export);
if (closed) {
Boolean ignoreLineCheck = dataCache.getCache(Constants.CACHE_ignoreLineCheck);
if (ignoreLineCheck == null) {
ignoreLineCheck = false;
}
if (ignoreLineCheck) {
log.info("ignoreLineCheck为:" + ignoreLineCheck + "清空出料口信息:" + task.getExport() + ",工单号为:" + task.getSourceName());
if (StringUtils.isNotBlank(task.getExport())) {
StorageExport export = StorageExportUtil.getExport(task.getExport());
if (StringUtils.isNotBlank(export.getHSerial())) {
StorageExportUtil.clearExport(task.getExport());
//StorageExportUtil.updateExport(task.getExport() + StorageExportUtil.OUT_STATION, export);
}
}
}
order.setClosed(closed);
}
order.setClosed(closed);
}
}
}
if (order.getFinishedReelCount() >= order.getTaskReelCount()) {
log.info("工单[" + orderNo + "]的出库任务已完成,共出库:" + order.getFinishedReelCount() + " 盘");
order.setFinishDate(new Date());
Boolean ignoreLineCheck = dataCache.getCache(Constants.CACHE_ignoreLineCheck);
if (ignoreLineCheck == null){
ignoreLineCheck = false;
}
if (ignoreLineCheck) {
log.info("ignoreLineCheck为:" + ignoreLineCheck + "清空出料口信息:" + task.getExport() + ",工单号为:" + task.getSourceName());
if (StringUtils.isNotBlank(task.getExport())){
StorageExport export = StorageExportUtil.getExport(task.getExport());
if (StringUtils.isNotBlank(export.getHSerial())) {
StorageExportUtil.clearExport(task.getExport());
//StorageExportUtil.updateExport(task.getExport() + StorageExportUtil.OUT_STATION, export);
if (order.getFinishedReelCount() >= order.getTaskReelCount()) {
log.info("工单[" + orderNo + "]的出库任务已完成,共出库:" + order.getFinishedReelCount() + " 盘");
order.setFinishDate(new Date());
Boolean ignoreLineCheck = dataCache.getCache(Constants.CACHE_ignoreLineCheck);
if (ignoreLineCheck == null) {
ignoreLineCheck = false;
}
if (ignoreLineCheck) {
log.info("ignoreLineCheck为:" + ignoreLineCheck + "清空出料口信息:" + task.getExport() + ",工单号为:" + task.getSourceName());
if (StringUtils.isNotBlank(task.getExport())) {
StorageExport export = StorageExportUtil.getExport(task.getExport());
if (StringUtils.isNotBlank(export.getHSerial())) {
StorageExportUtil.clearExport(task.getExport());
//StorageExportUtil.updateExport(task.getExport() + StorageExportUtil.OUT_STATION, export);
}
}
}
finishedOrderTasks(order);
}
finishedOrderTasks(order);
liteOrderManager.save(order);
liteOrderMap.put(orderNo, order);
} else {
log.error("完成任务时,未找到工单[" + orderNo + "]信息");
}
liteOrderManager.save(order);
liteOrderMap.put(orderNo, order);
} else {
log.error("完成任务时,未找到工单[" + orderNo + "]信息");
}
}
}
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!