Commit c0583e42 zshaohui

1.增加 获取出库信息 根据barcode

2.料箱离开工位,bug修改
1 个父辈 1b368d99
......@@ -179,7 +179,7 @@ public class LiteOrderCache {
String msg = MessageUtils.getText(result, MessageUtils.getDefaultLocal(), "");
log.info("自动执行工单 【" + order.getOrderNo() + "】 失败:" + msg);
} else {
log.info("自动执行工单 【" + order.getOrderNo() + "】 成功");
//log.info("自动执行工单 【" + order.getOrderNo() + "】 成功");
break;
}
}
......@@ -440,7 +440,7 @@ public class LiteOrderCache {
}
}
if (!hasOutTask) {
log.info("空闲料仓:" + storage.getName());
//log.info("空闲料仓:" + storage.getName());
freeStorageIds.add(storageId);
}
}
......@@ -661,6 +661,7 @@ public class LiteOrderCache {
return "smfcore.order.out.noTask";
}
log.info(cacheOrder.getOrderNo()+"分配出料口为:"+exportStr+"line为:"+cacheOrder.getLine()+"剩余任务数为:"+taskReelCount);
StorageExportUtil.updateExport(exportStr, cacheOrder.getOrderNo(), cacheOrder.getLine(), taskReelCount);
return "";
......
......@@ -20,4 +20,6 @@ public interface IDataLogManager extends IBaseManager<DataLog> {
int countBySourceName(String barcodeStr, String orderNo);
int countByQuery(Query subSourceId);
DataLog getOutReelInfo(String barcode);
}
......@@ -5,6 +5,7 @@ import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.system.service.dao.IDataLogDao;
import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
......@@ -13,6 +14,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
......@@ -129,4 +131,12 @@ public class DataLogManagerImpl implements IDataLogManager {
public int countByQuery(Query query) {
return dataLogDao.countByQuery(query);
}
@Override
public DataLog getOutReelInfo(String barcode) {
Query query = new Query();
query.addCriteria(Criteria.where("barcode").is(barcode).and("status").is(OP_STATUS.FINISHED.name()).and("type").is(OP.CHECKOUT).and("subSourceId").exists(true).ne(""));
query.with(Sort.by(Sort.Direction.DESC, "createDate", "updateDate"));
return dataLogDao.findOne(query);
}
}
......@@ -32,7 +32,9 @@ import com.neotel.smfcore.core.system.bean.MSDAppendInfo;
import com.neotel.smfcore.core.system.service.dao.IDataLogDao;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.custom.lizhen.LizhenApi;
import com.neotel.smfcore.custom.lizhen.innerBox.bean.StorageExport;
import com.neotel.smfcore.custom.lizhen.innerBox.enums.ExtendType;
import com.neotel.smfcore.custom.lizhen.innerBox.util.StorageExportUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......
......@@ -81,7 +81,7 @@ public class LizhenApi extends DefaultSmfApiListener {
werks = dataCache.getConfigCache("werks",werks);
outNotifyUrlPK = dataCache.getConfigCache("api.outNotifyUrlPK",outNotifyUrlPK);
batchCheckUrl = dataCache.getConfigCache("api.batchCheckUrl",batchCheckUrl);
checkReelMeasureUrl = dataCache.getConfigCache("api.checkReelMeasure",checkReelMeasureUrl);
//checkReelMeasureUrl = dataCache.getConfigCache("api.checkReelMeasure",checkReelMeasureUrl);
}
/**
......
package com.neotel.smfcore.custom.lizhen;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ApiException;
......@@ -8,17 +7,25 @@ import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.HttpHelper;
import com.neotel.smfcore.common.utils.JsonUtil;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.barcode.bean.CodeBean;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.enums.LITEORDER_SOURCE;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderItemManager;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
import com.neotel.smfcore.core.system.service.po.DataLog;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
......@@ -43,6 +50,15 @@ public class LizhenController {
@Autowired
private DataCache dataCache;
@Autowired
private IDataLogManager dataLogManager;
@Autowired
private ILiteOrderItemManager liteOrderItemManager;
@Autowired
private CodeResolve codeResolve;
@Value("${lizhen.F2.line}")
private String F2Line;
......@@ -188,7 +204,7 @@ public class LizhenController {
String id = param.get("ID");
try {
String result = HttpHelper.postJson(forwardUrl, param);
log.info(id + "机台叫料结果为--" + result);
//log.info(id + "机台叫料结果为--" + result);
} catch (ApiException e) {
e.printStackTrace();
log.info(id + "机台叫料转发失败---" + e.getMessage());
......@@ -203,10 +219,10 @@ public class LizhenController {
@AnonymousAccess
public ResultBean machineCallMaterial(@RequestBody Map<String, String> data) {
boolean startJob = dataCache.getCache(Constants.CACHE_StartJob);
if (!startJob){
return ResultBean.newErrorResult(-1,"","定时任务未开启");
if (!startJob) {
return ResultBean.newErrorResult(-1, "", "定时任务未开启");
}
log.info("Mes缺料预警---" + JSONObject.toJSONString(data));
//log.info("Mes缺料预警---" + JSONObject.toJSONString(data));
PreWarningItem item = new PreWarningItem();
item.setMachinename(data.get("MACHINENAME"));
item.setStation(data.get("STATION"));
......@@ -224,6 +240,43 @@ public class LizhenController {
}
/**
* 根据唯一码,查找最近的一次工单信息
*
* @param barcodeStr
* @return
*/
@RequestMapping("/getOutReelInfo")
@AnonymousAccess
public ResultBean getOutReelInfo(String barcodeStr) {
CodeBean codeBean = codeResolve.resolveSingleCode(barcodeStr);
Barcode barcode = codeBean.getBarcode();
if (barcode != null) {
DataLog dataLog = dataLogManager.getOutReelInfo(barcode.getBarcode());
if (dataLog != null) {
LiteOrderItem orderItem = liteOrderItemManager.get(dataLog.getSubSourceId());
if (orderItem != null) {
Map<String, String> resultMap = new HashMap<>();
resultMap.put("barcode", dataLog.getBarcode());
resultMap.put("orderNo", orderItem.getOrderNo());
resultMap.put("line", orderItem.getLine());
resultMap.put("side", orderItem.getSide());
resultMap.put("vendor", orderItem.getBrand());
resultMap.put("partNumber", dataLog.getPartNumber());
resultMap.put("slot", orderItem.getSlot());
resultMap.put("subSlot", orderItem.getSubSlot());
resultMap.put("station", orderItem.getTableNo());
resultMap.put("machinename", orderItem.getMachineName());
return ResultBean.newOkResult(resultMap);
}
}
}
return ResultBean.newErrorResult(-1,"","未找到相关信息");
}
private String getForwardUrl(String line) {
String url = "";
for (Map.Entry<String, String> lineUrlEntry : lineUrlMap.entrySet()) {
......
package com.neotel.smfcore.custom.lizhen.innerBox.rest;
import com.alibaba.fastjson.JSON;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.common.utils.ReelLockPosUtil;
......@@ -145,13 +146,16 @@ public class InnerBoxRestController {
int remainTaskCount = 0;
List<DataLog> dataLogList = taskService.getAllTasks();
for (DataLog dataLog : dataLogList) {
if (dataLog.getSourceId().equals(opTask.getSourceId())){
if (!dataLog.isFinished()){
remainTaskCount ++;
if(StringUtils.isNotBlank(dataLog.getSourceId())){
if (dataLog.getSourceId().equals(opTask.getSourceId())){
if (!dataLog.isFinished()){
remainTaskCount ++;
}
}
}
}
storageExport.setRemainTaskCount(remainTaskCount);
log.info(opTask.getBarcode()+"任务完成,更新出料口信息:"+ JSON.toJSONString(storageExport));
StorageExportUtil.updateExport(outlet,storageExport);
}
}
......@@ -236,7 +240,7 @@ public class InnerBoxRestController {
if (codeBean.getBarcode() != null) {
Collection<DataLog> dataLogs = taskService.getAllTasks();
for (DataLog dataLog : dataLogs) {
if (dataLog.getBarcode().equals(codeBean.getBarcode().getBarcode())) {
if (dataLog.isCheckOutTask() && dataLog.getBarcode().equals(codeBean.getBarcode().getBarcode())) {
if (!dataLog.isCancel() && !dataLog.isFinished()) {
LiteOrder liteOrder = liteOrderManager.get(dataLog.getSourceId());
LiteOrderItem liteOrderItem = liteOrderItemManager.get(dataLog.getSubSourceId());
......@@ -439,10 +443,21 @@ public class InnerBoxRestController {
if (codeBean.getBarcode() != null) {
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog dataLog : allTasks) {
if (dataLog.getBarcode().equals(codeBean.getBarcode().getBarcode())) {
if (dataLog.isCheckOutTask() && dataLog.getBarcode().equals(codeBean.getBarcode().getBarcode())) {
resultMap.put("export", "");
//如果sourceName和subSourceId都不为空时,则返回目标位置
String sourceName = dataLog.getSourceName();
String export = StorageExportUtil.getExportByOrderNo(sourceName);
resultMap.put("export", export);
String sourceId = dataLog.getSourceId();
if (StringUtils.isNotBlank(sourceId) && StringUtils.isNotBlank(sourceName)) {
String export = StorageExportUtil.getExportByOrderNo(sourceName);
log.info(dataLog.getBarcode() + "获取出料口信息为:" + export);
resultMap.put("export", export);
} else {
String export = StorageExportUtil.getExportByOrderNo("");
log.info(dataLog.getBarcode() + "手动出库获取出料口信息为:" + export);
resultMap.put("export", export);
}
resultMap.put("height", codeBean.getBarcode().getHeight());
resultMap.put("plateSize", codeBean.getBarcode().getPlateSize());
resultMap.put("barcode", codeBean.getBarcode().getBarcode());
......@@ -465,8 +480,9 @@ public class InnerBoxRestController {
@ApiOperation("清空出料口缓存信息")
@RequestMapping("/clearExport")
@AnonymousAccess
public ResultBean clearExport(String export){
StorageExportUtil.clearExport(export);
public ResultBean clearExport(String export) {
log.info("开始清空出料口信息:" + export);
StorageExportUtil.clearExport(export + StorageExportUtil.OUT_STATION);
return ResultBean.newOkResult("");
}
......@@ -475,9 +491,55 @@ public class InnerBoxRestController {
@AnonymousAccess
public ResultBean getExport(String export) {
StorageExport storageExport = StorageExportUtil.getExport(export);
if (StringUtils.isNotBlank(storageExport.getHSerial())){
int remainTaskCount = 0;
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog dataLog : allTasks) {
if (dataLog.isCheckOutTask() && storageExport.getHSerial().equals(dataLog.getSourceName())){
if (!dataLog.isFinished() && !dataLog.isCancel()){
remainTaskCount ++;
}
}
}
storageExport.setRemainTaskCount(remainTaskCount);
StorageExportUtil.updateExport(export,storageExport);
}
return ResultBean.newOkResult(storageExport);
}
@ApiOperation("agv获取目的地")
@RequestMapping("/getAgvLine")
@AnonymousAccess
public ResultBean getAgvLine(String export) {
StorageExport storageExport = StorageExportUtil.getExport(export + StorageExportUtil.OUT_STATION);
if (storageExport == null || StringUtils.isBlank(storageExport.getHSerial())) {
storageExport = StorageExportUtil.getExport(export);
}
log.info(export + "获取目的地信息:" + JSON.toJSONString(storageExport));
return ResultBean.newOkResult(storageExport);
}
@ApiOperation("料箱离开工位")
@RequestMapping("/boxOutStation")
@AnonymousAccess
public ResultBean boxOutStation(String export) {
StorageExport storageExport = StorageExportUtil.getExport(export);
String hSerial = storageExport.getHSerial();
if (StringUtils.isNotBlank(hSerial)) {
LiteOrder order = liteOrderCache.getOrderSortItems(hSerial);
if (order != null) {
if (!order.isClosed() && !order.isTaskFinished()) {
return ResultBean.newErrorResult(-1, "", export + "工位任务未完成,暂不离开");
}
}
}
StorageExportUtil.clearExport(export);
StorageExportUtil.updateExport(export + StorageExportUtil.OUT_STATION, storageExport);
log.info(export + StorageExportUtil.OUT_STATION + "料箱离开工位,信息为:" + JSON.toJSONString(storageExport));
return ResultBean.newOkResult(storageExport);
}
/*@ApiOperation("手动发料")
@PostMapping("/manualFeeding")
@AnonymousAccess
......
package com.neotel.smfcore.custom.lizhen.innerBox.util;
import com.alibaba.fastjson.JSON;
import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.LiteOrderCache;
......@@ -172,7 +173,7 @@ public class PreWarningItemCache {
for (PreWarningItem item : queueItemList) {
if (preWarningItem.getItemId().equals(item.getItemId())) {
newItems = newItems.stream().filter(t -> !t.getItemId().equals(item.getItemId())).collect(Collectors.toList());
log.info("Mes缺料预警重复物料:" + item.getItemId() + "PN为:" + item.getPartnumber());
//log.info("Mes缺料预警重复物料:" + item.getItemId() + "PN为:" + item.getPartnumber());
break;
}
}
......@@ -186,7 +187,7 @@ public class PreWarningItemCache {
List<LiteOrderItem> orderItems = liteOrderItemManager.findByQuery(q.addCriteria(c));
if (orderItems != null && !orderItems.isEmpty()) {
newItems = newItems.stream().filter(t -> !t.getItemId().equals(item.getItemId())).collect(Collectors.toList());
log.info("Mes缺料预警已经生成工单:" + item.getItemId() + "PN为:" + item.getPartnumber());
//log.info("Mes缺料预警已经生成工单:" + item.getItemId() + "PN为:" + item.getPartnumber());
}
}
if (queueItemList == null || queueItemList.isEmpty()) {
......@@ -195,6 +196,7 @@ public class PreWarningItemCache {
queueItemList.addAll(newItems);
}
for (PreWarningItem item : newItems) {
log.info("mes缺料预警信息为:"+ JSON.toJSONString(item));
preWarningItemManager.save(item);
}
}
......
package com.neotel.smfcore.custom.lizhen.innerBox.util;
import com.alibaba.fastjson.JSON;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.custom.lizhen.innerBox.bean.StorageExport;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
......@@ -11,6 +13,7 @@ import javax.annotation.PostConstruct;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
@Component
public class StorageExportUtil {
......@@ -21,6 +24,7 @@ public class StorageExportUtil {
dataCache = cache;
}
public static final String OUT_STATION = "_outStation";
private static String disableExport = "";
......@@ -31,8 +35,19 @@ public class StorageExportUtil {
}
}
private static String manualCheckoutExport = "";
@Value("${manualcheckout.export}")
void setManualCheckoutExport(String export) {
if (StringUtils.isNotBlank(export)) {
manualCheckoutExport = export;
}
}
//出料口名称
private final String[] exportStr = new String[]{"MU1_1", "MU1_2", "MU2_1", "MU4_1", "MU4_2", "MU5_1", "MU5_2"};
private final static String[] exportStr = new String[]{"MU1_1", "MU1_2", "MU2_1", "MU4_1", "MU4_2", "MU5_1", "MU5_2"};
//料仓前缀
private static final String EXPORT_PREFIX = "Storage_Export";
......@@ -49,13 +64,14 @@ public class StorageExportUtil {
storageExport = new StorageExport();
}
exportMap.put(export, storageExport);
dataCache.updateCache(EXPORT_PREFIX+"_"+export,storageExport);
}
}
//根据工单号,获取目的地信息
public static synchronized String getExportByOrderNo(String orderNo) {
if (StringUtils.isBlank(orderNo)) {
return "";
return manualCheckoutExport;
}
String exportStr = "";
//判断是否有相同工单
......@@ -70,13 +86,16 @@ public class StorageExportUtil {
if (StringUtils.isBlank(exportStr)) {
for (Map.Entry<String, StorageExport> entry : exportMap.entrySet()) {
//判断是否有禁用工位信息
if (StringUtils.isNotBlank(disableExport)){
if (disableExport.contains(entry.getKey())){
if (StringUtils.isNotBlank(disableExport)) {
if (disableExport.contains(entry.getKey())) {
continue;
}
}
if (entry.getKey().contains(StorageExportUtil.OUT_STATION)) {
continue;
}
StorageExport export = entry.getValue();
if (StringUtils.isBlank(export.getHSerial())){
if (StringUtils.isBlank(export.getHSerial())) {
exportStr = entry.getKey();
break;
}
......@@ -89,21 +108,41 @@ public class StorageExportUtil {
//清空出料口信息
public static void clearExport(String key) {
if (exportMap.get(key) != null) {
log.info("清除出料口信息为:" + JSON.toJSONString(exportMap.get(key)));
StorageExport storageExport = new StorageExport();
exportMap.put(key, storageExport);
dataCache.updateCache(EXPORT_PREFIX + "_" + key, storageExport);
}
}
public static void updateExport(String outlet, StorageExport storageExport){
exportMap.put(outlet,storageExport);
dataCache.updateCache(EXPORT_PREFIX + "_" + outlet, storageExport);
public static void updateExport(String outlet, StorageExport storageExport) {
boolean hasOutLet = false;
for (String export : exportStr) {
if (outlet.startsWith(export)) {
hasOutLet = true;
break;
}
}
if (hasOutLet) {
exportMap.put(outlet, storageExport);
dataCache.updateCache(EXPORT_PREFIX + "_" + outlet, storageExport);
}
}
//更新出料口信息
public static void updateExport(String key, String hSerial, String line, int remainTaskCount) {
StorageExport storageExport = exportMap.get(key);
if (storageExport != null) {
boolean hasOutLet = false;
for (String export : exportStr) {
if (export.equals(key)) {
hasOutLet = true;
break;
}
}
if (hasOutLet) {
StorageExport storageExport = exportMap.get(key);
if (storageExport == null) {
storageExport = new StorageExport();
}
if (StringUtils.isNotBlank(hSerial)) {
storageExport.setHSerial(hSerial);
}
......@@ -111,7 +150,8 @@ public class StorageExportUtil {
storageExport.setLine(line);
}
storageExport.setRemainTaskCount(remainTaskCount);
exportMap.put(key,storageExport);
//storageExport.setRemainTaskCount(100);
exportMap.put(key, storageExport);
dataCache.updateCache(EXPORT_PREFIX + "_" + key, storageExport);
}
}
......
......@@ -3,11 +3,13 @@
<Properties>
<Property name="LOG_HOME">D:/Smflogs</Property>
<Property name="LOG_NAME">smf.txt</Property>
<Property name="LOG_MES">mes.txt</Property>
</Properties>
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss:SSS} %-5level [%file:%line] - %msg%n"/>
</Console>
<RollingFile name="log" fileName="${LOG_HOME}/${LOG_NAME}" filePattern="${LOG_HOME}/%d{yyyy-MM-dd}.${LOG_NAME}" append="true">
<PatternLayout charset="GB18030" pattern="%d{yyyy-MM-dd HH:mm:ss:SSS} %-5level [%file:%line] - %msg%n" />
<Policies>
......@@ -15,8 +17,27 @@
</Policies>
<DefaultRolloverStrategy max="180" />
</RollingFile>
<RollingFile name="lizhen" fileName="${LOG_HOME}/${LOG_MES}"
filePattern="${LOG_HOME}/%d{yyyy-MM-dd}.${LOG_NAME}" append="true">
<PatternLayout charset="GB18030" pattern="%d{yyyy-MM-dd HH:mm:ss:SSS} %-5level [%file:%line] - %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
</Policies>
<DefaultRolloverStrategy max="180"/>
</RollingFile>
</appenders>
<loggers>
<logger name="com.neotel.smfcore.custom.lizhen.LizhenController" level="INFO" additivity="false">
<appender-ref ref="Console"/>
<appender-ref ref="lizhen"/>
</logger>
<logger name="org" level="WARN">
</logger>
<logger name="ro" level="WARN">
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!