Commit 79d627a9 孙克

Merge remote-tracking branch 'origin/smf-core-21088-3f' into smf-core-21088-3f

# Conflicts:
#	src/main/java/com/neotel/smfcore/core/system/util/TaskService.java
2 个父辈 a4eca56d 171f4f68
...@@ -196,6 +196,11 @@ public class DeviceController { ...@@ -196,6 +196,11 @@ public class DeviceController {
throw new ValidateException("smfcore.error.barcode.expired", "物料已过期,无法入库."); throw new ValidateException("smfcore.error.barcode.expired", "物料已过期,无法入库.");
} }
} }
//料号为335S00571不允许入库
if ("335S00571".equals(barcode.getPartNumber())){
throw new ValidateException("", "335S00571的料号不允许入到智能仓");
}
//判断库别是否为空 //判断库别是否为空
/*Barcode reelBarcode = lizhenApi.fetchReel(barcode); /*Barcode reelBarcode = lizhenApi.fetchReel(barcode);
......
...@@ -347,15 +347,21 @@ public class StoragePosController { ...@@ -347,15 +347,21 @@ public class StoragePosController {
Storage storage = dataCache.getStorageById(pos.getStorageId()); Storage storage = dataCache.getStorageById(pos.getStorageId());
map.put("设备名称", storage.getName()); map.put("设备名称", storage.getName());
map.put("库位号", pos.getPosName()); map.put("库位号", pos.getPosName());
map.put("库位(宽)", pos.getW());
map.put("库位(高)", pos.getH());
map.put("是否可用", pos.isEnabled() ? "是" : "否"); map.put("是否可用", pos.isEnabled() ? "是" : "否");
map.put("条码", null); map.put("条码", null);
map.put("料件编号", null); map.put("料件编号", null);
map.put("物料(宽)", null);
map.put("物料(高)", null);
boolean isLock = ReelLockPosUtil.posIsLock(pos.getPosName()); boolean isLock = ReelLockPosUtil.posIsLock(pos.getPosName());
map.put("是否锁定", isLock ? "是" : "否"); map.put("是否锁定", isLock ? "是" : "否");
Barcode barcode = pos.getBarcode(); Barcode barcode = pos.getBarcode();
if (barcode != null) { if (barcode != null) {
map.put("条码", barcode.getBarcode()); map.put("条码", barcode.getBarcode());
map.put("料件编号", barcode.getPartNumber()); map.put("料件编号", barcode.getPartNumber());
map.put("物料(宽)", barcode.getPlateSize());
map.put("物料(高)", barcode.getHeight());
} }
list.add(map); list.add(map);
} }
......
...@@ -120,6 +120,7 @@ public class TaskController { ...@@ -120,6 +120,7 @@ public class TaskController {
headerList.add(Lists.newArrayList("Slot")); headerList.add(Lists.newArrayList("Slot"));
headerList.add(Lists.newArrayList("Subslot")); headerList.add(Lists.newArrayList("Subslot"));
headerList.add(Lists.newArrayList("面别")); headerList.add(Lists.newArrayList("面别"));
headerList.add(Lists.newArrayList("出料口"));
headerList.add(Lists.newArrayList("状态")); headerList.add(Lists.newArrayList("状态"));
headerList.add(Lists.newArrayList("操作人")); headerList.add(Lists.newArrayList("操作人"));
headerList.add(Lists.newArrayList("创建时间")); headerList.add(Lists.newArrayList("创建时间"));
...@@ -145,8 +146,9 @@ public class TaskController { ...@@ -145,8 +146,9 @@ public class TaskController {
result.add(dataLog.getSlot()); result.add(dataLog.getSlot());
result.add(dataLog.getSubSlot()); result.add(dataLog.getSubSlot());
result.add(dataLog.getSide()); result.add(dataLog.getSide());
result.add(dataLog.getExport());
result.add(dataLog.getStatus()); result.add(dataLog.getStatus());
result.add(dataLog.getCreator()); result.add(dataLog.getOperator());
result.add(dataLog.getCreateDate()); result.add(dataLog.getCreateDate());
result.add(dataLog.getUpdateDate()); result.add(dataLog.getUpdateDate());
dataList.add(result); dataList.add(result);
......
...@@ -102,11 +102,11 @@ public class TaskService { ...@@ -102,11 +102,11 @@ public class TaskService {
*/ */
public static Map<String, String> exportMap = Maps.newConcurrentMap(); public static Map<String, String> exportMap = Maps.newConcurrentMap();
/** // public TaskService(List<ITaskListener> listenerList){
* 某个料仓上一盘任务的所属工单 // for (ITaskListener taskListener: listenerList) {
*/ // taskListenerList.add(taskListener);
private static Map<String,String> sourceIdMap = Maps.newConcurrentMap(); // }
// }
/** /**
* 条码入库,加入要执行的任务 * 条码入库,加入要执行的任务
...@@ -552,9 +552,9 @@ public class TaskService { ...@@ -552,9 +552,9 @@ public class TaskService {
if (outTask != null) { if (outTask != null) {
log.info(outTask.getSourceName()+" barcode为:"+outTask.getBarcode()+"面别为:"+outTask.getSide()); log.info(outTask.getSourceName()+"barcode为:"+outTask.getBarcode()+"面别为:"+outTask.getSide()+"出料口为:"+outTask.getExport());
if(StringUtils.isNotBlank(outTask.getSide())) { if(StringUtils.isNotBlank(outTask.getExport())) {
exportMap.put(cid, outTask.getExport()); exportMap.put(cid, outTask.getExport());
} }
} }
...@@ -613,137 +613,6 @@ public class TaskService { ...@@ -613,137 +613,6 @@ public class TaskService {
} }
/**
* 获取料仓的下一个出库任务(与上一个工单号不同,先找大盘,再找小盘)
* @param cid
* @return
*/
public DataLog getNextTaskInStorage(String cid){
DataLog needOutTask = null;
String sourceId = sourceIdMap.get(cid);
List<String> taskSourceIds = getTaskSourceIds(cid);
int startSourceIdIndex = 0;
if(sourceId != null && taskSourceIds.contains(sourceId)){
startSourceIdIndex = taskSourceIds.indexOf(sourceId) + 1;
//如果要优先出最早的工单,去掉这里的注释
//if(startSourceIdIndex > 1){
// startSourceIdIndex = 0;
//}
}
for (int i = startSourceIdIndex; i < taskSourceIds.size(); i++) {
String needOutSourceId = taskSourceIds.get(i);
needOutTask = findBigReelTask(cid,needOutSourceId);
if(needOutTask == null){
needOutTask = findSmallReelTask(cid,needOutSourceId);
}
if(needOutTask != null){
sourceIdMap.put(cid, needOutSourceId);
log.info("当前料仓所有工单为: " + String.join(",",taskSourceIds) + ", 上一盘工单ID为:" + sourceId +" 找到出库物料["+needOutTask.getBarcode()+"]工单["+needOutTask.getSourceName()+"]ID为:" + needOutSourceId);
return needOutTask;
}
}
if(needOutTask == null){
//如果没找到, 从第一个工单重新找
for (String needOutSourceId : taskSourceIds) {
needOutTask = findBigReelTask(cid,needOutSourceId);
if(needOutTask == null){
needOutTask = findSmallReelTask(cid,needOutSourceId);
}
if(needOutTask != null){
sourceIdMap.put(cid, needOutSourceId);
log.info("当前料仓所有工单为: " + String.join(",",taskSourceIds) + ", 上一盘工单ID为:" + sourceId +" 第二轮找到出库物料["+needOutTask.getBarcode()+"]工单["+needOutTask.getSourceName()+"]ID为:" + needOutSourceId);
return needOutTask;
}
}
}
return needOutTask;
}
/**
* 获取料仓指定工单的大盘任务
* @param cid
* @param sourceId
* @return
*/
private DataLog findBigReelTask(String cid, String sourceId){
List<DataLog> allTasks = getAllTasks();
for (DataLog task : allTasks) {
if (cid.equals(task.getCid()) && task.isCheckOutTask() && task.isWait()) {
if(task.getPlateSize() > 7){
String taskSourceId = task.getSourceId();
if(taskSourceId == null){
taskSourceId = "";
}
if(taskSourceId.equals(sourceId)){
return task;
}
}
}
}
return null;
}
/**
* 获取料仓的所有未执行任务的工单ID(按时间排序)
* @param cid
* @return
*/
private List<String> getTaskSourceIds(String cid){
List<DataLog> allTasks = getAllTasks();
allTasks.sort(new Comparator<DataLog>() {
@Override
public int compare(DataLog o1, DataLog o2) {
return o1.getCreateDate().compareTo(o2.getCreateDate());
}
});
List<String> sourceIds = new ArrayList<>();
for (DataLog task : allTasks) {
if (cid.equals(task.getCid()) && task.isCheckOutTask() && task.isWait()) {
String sourceId = task.getSourceId();
if(!Strings.isNullOrEmpty(sourceId) && !sourceIds.contains(sourceId)){
sourceIds.add(sourceId);
}
}
}
return sourceIds;
}
/**
* 查找料仓指定工单的小盘任务(如果其他料仓有大料盘未出,优先出)
* @param cid
* @param sourceId
* @return
*/
private DataLog findSmallReelTask(String cid, String sourceId){
List<DataLog> allTasks = getAllTasks();
boolean otherStorageHasBigReel = otherStorageHasBigReel(allTasks, sourceId);
String limitSide = "";
if(otherStorageHasBigReel){
//其他仓有大料盘未出,限制T面出库(即出B面的小盘)
limitSide = "T";
}
for (DataLog task : allTasks) {
if (cid.equals(task.getCid()) && task.isCheckOutTask() && task.isWait()) {
if(task.getPlateSize() <= 7){
String taskSourceId = task.getSourceId();
if(taskSourceId == null){
taskSourceId = "";
}
String side = task.getSide();
if(side == null){
side = "";
}
if(taskSourceId.equals(sourceId) && !limitSide.equals(side)){
return task;
}
}
}
}
return null;
}
public DataLog getNeedOutTask(Collection<DataLog> allTasks, String exportStr, String cid, boolean hasExport) { public DataLog getNeedOutTask(Collection<DataLog> allTasks, String exportStr, String cid, boolean hasExport) {
DataLog outTask = null; DataLog outTask = null;
......
...@@ -581,7 +581,7 @@ public class InnerBoxRestController { ...@@ -581,7 +581,7 @@ public class InnerBoxRestController {
} }
//2.如果当前出料口的数量不等于0 //2.如果当前出料口的数量不等于0
if (remainTaskCount > 0) { if (remainTaskCount > 0 && !export.equals(StorageExportUtil.getMaizhengExport())) {
//3.判断是否要补工单 //3.判断是否要补工单
Integer ordrRemainingQty = dataCache.getCache(Constants.CACHE_ordrRemainingQty); Integer ordrRemainingQty = dataCache.getCache(Constants.CACHE_ordrRemainingQty);
if (ordrRemainingQty == null) { if (ordrRemainingQty == null) {
......
package com.neotel.smfcore.custom.lizhen.report;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.barcode.rest.bean.mapstruct.BarcodeMapper;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
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.rest.bean.dto.OrderItemDto;
import com.neotel.smfcore.core.order.rest.bean.mapstruct.OrderItemMapper;
import com.neotel.smfcore.core.order.rest.bean.mapstruct.OrderMapper;
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.storage.bean.InventoryItem;
import com.neotel.smfcore.core.storage.rest.mapstruct.StoragePosMapper;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
import com.neotel.smfcore.custom.lizhen.innerBox.service.manager.IVirImportLogManager;
import com.neotel.smfcore.custom.lizhen.report.bean.query.ReportQueryCondition;
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.beans.factory.annotation.Value;
import org.springframework.data.domain.Pageable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.*;
@Slf4j
@ApiOperation("内仓报表")
@RequestMapping("/inner/report")
@RestController
public class InnerReportController {
@Value("${lizhen.F2.name}")
private String F2;
@Value("${lizhen.F3.name}")
private String F3;
@Value("${lizhen.F5.name}")
private String F5;
@Autowired
private ILiteOrderManager liteOrderManager;
@Autowired
private ILiteOrderItemManager liteOrderItemManager;
@Autowired
private OrderItemMapper orderItemMapper;
@Autowired
private OrderMapper orderMapper;
@Autowired
private DataCache dataCache;
@Autowired
private IStoragePosManager storagePosManager;
@Autowired
private StoragePosMapper storagePosMapper;
@Autowired
private IDataLogManager dataLogManager;
@Autowired
private LiteOrderCache liteOrderCache;
@Autowired
private IBarcodeManager barcodeManager;
@Autowired
private BarcodeMapper barcodeMapper;
@Autowired
private CodeResolve codeResolve;
@Autowired
private IVirImportLogManager virImportLogManager;
@ApiOperation("缺料")
@RequestMapping("/lackPicking")
@AnonymousAccess
public PageData lackPicking(ReportQueryCondition queryCondition, Pageable pageable) {
List<OrderItemDto> dtoList = new ArrayList<>();
String floor = dataCache.getCache(Constants.CACHE_floor);
List<LiteOrderItem> lackItems = getLackItems(liteOrderCache.getAllLiteOrder(), queryCondition);
for (LiteOrderItem orderItem : lackItems) {
orderItem.setFloor(floor);
orderItem.setLackReel(1);
orderItem.setLackNum(1);
orderItem.setPreWarningTime(DateUtil.between(orderItem.getCreateDate(), new Date(), DateUnit.MINUTE));
}
dtoList.addAll(orderItemMapper.toDto(lackItems));
return new PageData(dtoList, dtoList.size());
}
@ApiOperation("缺料导出")
@RequestMapping("/lackPicking/download")
@AnonymousAccess
public void lackPickingDownload(ReportQueryCondition queryCondition, Pageable pageable, HttpServletResponse response) throws IOException {
String floor = dataCache.getCache(Constants.CACHE_floor);
List<List<String>> headers = new ArrayList<>();
headers.add(Arrays.asList("楼层"));
headers.add(Arrays.asList("线别"));
headers.add(Arrays.asList("料号"));
headers.add(Arrays.asList("机台"));
headers.add(Arrays.asList("面别"));
headers.add(Arrays.asList("需求站位"));
headers.add(Arrays.asList("需求数量"));
headers.add(Arrays.asList("需求卷数"));
headers.add(Arrays.asList("需求时间"));
headers.add(Arrays.asList("发料数量"));
headers.add(Arrays.asList("发料卷数"));
headers.add(Arrays.asList("发料时间"));
headers.add(Arrays.asList("缺料数量"));
headers.add(Arrays.asList("缺料卷数"));
headers.add(Arrays.asList("累计预警时间(分钟)"));
List<List<Object>> datas = new ArrayList<>();
List<LiteOrderItem> orderItems = getLackItems(liteOrderCache.getAllLiteOrder(), queryCondition);
for (LiteOrderItem orderItem : orderItems) {
List<Object> dataList = new ArrayList<>();
dataList.add(floor);
dataList.add(orderItem.getLine());
dataList.add(orderItem.getPn());
dataList.add(orderItem.getMachineName());
dataList.add(orderItem.getSide());
dataList.add(orderItem.getSlot());
dataList.add(orderItem.getNeedNum());
dataList.add(orderItem.getNeedReelCount());
dataList.add(orderItem.getCreateDate());
dataList.add(0);
dataList.add(0);
dataList.add("");
dataList.add(orderItem.getNeedNum());
dataList.add(orderItem.getNeedReelCount());
dataList.add(DateUtil.between(orderItem.getCreateDate(), new Date(), DateUnit.MINUTE));
datas.add(dataList);
}
FileUtil.downloadExcel(headers, datas, response);
}
private List<LiteOrderItem> getLackItems(Collection<LiteOrder> liteOrders, ReportQueryCondition queryCondition) {
List<LiteOrderItem> lackItems = new ArrayList<>();
//排除虚拟仓的
List<String> storageIds = new ArrayList<>();
for (Storage storage : dataCache.getAllStorage().values()) {
//if (!storage.isVirtual()) {
storageIds.add(storage.getId());
//}
}
//得到库存信息
Map<String, InventoryItem> inventoryMap = dataCache.getAllInventory(storageIds, null);
if (inventoryMap != null) {
for (LiteOrder liteOrder : liteOrders) {
//状态是未关闭的,未出库的
if (!liteOrder.isClosed()) {
List<LiteOrderItem> items = liteOrder.getOrderItems();
for (LiteOrderItem orderItem : items) {
if (orderItem.getOutReelCount() < orderItem.getNeedReelCount()) {
//判断线别是否相等
String line = queryCondition.getLine();
if (StringUtils.isNotBlank(line)) {
if (!orderItem.getLine().contains(line)) {
continue;
}
}
//判断工单号是否一致
String orderNo = queryCondition.getOrderNo();
if (StringUtils.isNotBlank(orderNo)) {
if (!orderItem.getOrderNo().contains(orderNo)) {
continue;
}
}
//判断料号是否一致
String pn = queryCondition.getPn();
if (StringUtils.isNotBlank(pn)) {
if (!orderItem.getPn().contains(pn)) {
continue;
}
}
InventoryItem inventoryItem = inventoryMap.get(orderItem.getPn());
if (inventoryItem != null) {
if (inventoryItem.getStockReel() /*- inventoryItem.getLockReel()*/ - inventoryItem.getBindReel() > 0) {
inventoryItem.setBindReel(inventoryItem.getBindReel() + 1);
} else {
lackItems.add(orderItem);
}
inventoryMap.put(orderItem.getPn(), inventoryItem);
} else {
lackItems.add(orderItem);
}
}
}
}
}
}
return lackItems;
}
private Object getData(Object data) {
return data == null ? "" : data;
}
}
package com.neotel.smfcore.custom.lizhen.report.bean.query;
import com.neotel.smfcore.common.annotation.QueryCondition;
import com.neotel.smfcore.common.bean.BetweenData;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import java.util.List;
@Data
@ApiModel("查询条件")
public class ReportQueryCondition {
@QueryCondition(blurry = "pn,partNumber,barcode.partNumber")
@ApiModelProperty("料号")
private String pn;
@QueryCondition(blurry = "pn,partNumber,barcode.partNumber")
@ApiModelProperty("料号")
private String partNumber;
@QueryCondition(blurry = "orderNo,sourceName")
@ApiModelProperty("挑料单号")
private String orderNo;
@QueryCondition(type = QueryCondition.Type.IN, propName = "orderNo")
@ApiModelProperty("挑料单号集合")
private List<String> orderNoList;
@QueryCondition(propName = "mo")
@ApiModelProperty("工单号")
private String mo;
@QueryCondition(type = QueryCondition.Type.BETWEEN, propName = "updateDate")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private BetweenData<Date> updateDate;
@QueryCondition(type = QueryCondition.Type.BETWEEN, propName = "updateDate")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
private BetweenData<Date> updateDateHHmm;
@QueryCondition
@ApiModelProperty("厂别")
private String plantCode;
@QueryCondition
@ApiModelProperty("库别")
private String warehouse;
@ApiModelProperty("唯一码")
@QueryCondition(blurry = "barcode.barcode,barcode")
private String barcode;
@QueryCondition(blurry = "posName")
@ApiModelProperty("库位")
private String posName;
@QueryCondition(blurry = "batch")
@ApiModelProperty("批次")
private String batch;
@ApiModelProperty("线别")
@QueryCondition(propName = "line")
private String line;
@ApiModelProperty("厂商")
@QueryCondition(blurry = "barcode.provider,provider")
private String provider;
@ApiModelProperty("日期代码")
@QueryCondition(blurry = "dateCode")
private String dateCode;
@ApiModelProperty("料仓id")
@QueryCondition(type = QueryCondition.Type.IN, propName = "storageId")
private List<String> storageIdList;
@ApiModelProperty("库别")
@QueryCondition(blurry = "warehouseCode")
private String warehouseCode;
@ApiModelProperty("储位")
@QueryCondition(blurry = "posName")
private String storagePosName;
@ApiModelProperty("隔口")
@QueryCondition(blurry = "boxPartition")
private String boxPartition;
@ApiModelProperty("是否匹配")
@QueryCondition(type = QueryCondition.Type.EQ, propName = "isMatch")
private Boolean match;
@ApiModelProperty("状态")
@QueryCondition(blurry = "status")
private String status;
@ApiModelProperty("盘点批次")
@QueryCondition(blurry = "inventoryBatch")
private String inventoryBatch;
//楼层
private String floor;
//过期状态
private String expireStatus;
private int page;
private int size;
private String sort;
}
...@@ -230,6 +230,46 @@ public class LizhenController { ...@@ -230,6 +230,46 @@ public class LizhenController {
} }
//机台叫料转发的地址
@PostMapping("/maiZhengMachineCallMaterial")
@AnonymousAccess
public ResultBean maiZhengMachineCallMaterial(@RequestBody List<Map<String, String>> dataList) {
boolean startJob = dataCache.getCache(Constants.CACHE_StartJob);
if (!startJob) {
return ResultBean.newErrorResult(-1, "", "定时任务未开启",new String[]{},false);
}
log.info("收到迈征缺料预警信息---" + JSONObject.toJSONString(dataList));
for (Map<String, String> data : dataList) {
PreWarningItem item = new PreWarningItem();
item.setMachinename(data.get("MACHINENAME"));
item.setStation(data.get("STATION"));
item.setSide(data.get("SIDE"));
item.setSlot(data.get("SLOT"));
item.setSubslot(data.get("SUBSLOT"));
item.setPartnumber(data.get("PARTNUMBER"));
item.setLine(data.get("LINE"));
item.setItemId(data.get("ID"));
item.setPickingId(data.get("PICKING_ID"));
try {
item.setItemNo(Integer.valueOf(data.get("ITEM_NO")));
item.setPriority(Integer.valueOf(data.get("PRIORITY")));
} catch (NumberFormatException e) {
e.printStackTrace();
item.setPriority(0);
item.setItemNo(1);
}
item.setReel(data.get("REEL"));
String brand = data.get("VENDOR");
item.setBrand(brand);
if (StringUtils.isBlank(item.getSide())){
log.info("缺料预警id:"+item.getItemId()+"面别为空,忽略");
//return ResultBean.newErrorResult(-1,"","side为空");
}
PreWarningItemCache.addItems(Arrays.asList(item));
}
return ResultBean.newOkResult("");
}
/** /**
* 根据唯一码,查找最近的一次工单信息 * 根据唯一码,查找最近的一次工单信息
* *
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!