Commit 171f4f68 zshaohui

1.增加迈征缺料预警转发

2.库位,物料日志 导出 增加字段信息
1 个父辈 b0a3ac6e
......@@ -196,6 +196,11 @@ public class DeviceController {
throw new ValidateException("smfcore.error.barcode.expired", "物料已过期,无法入库.");
}
}
//料号为335S00571不允许入库
if ("335S00571".equals(barcode.getPartNumber())){
throw new ValidateException("", "335S00571的料号不允许入到智能仓");
}
//判断库别是否为空
/*Barcode reelBarcode = lizhenApi.fetchReel(barcode);
......
......@@ -347,15 +347,21 @@ public class StoragePosController {
Storage storage = dataCache.getStorageById(pos.getStorageId());
map.put("设备名称", storage.getName());
map.put("库位号", pos.getPosName());
map.put("库位(宽)", pos.getW());
map.put("库位(高)", pos.getH());
map.put("是否可用", pos.isEnabled() ? "是" : "否");
map.put("条码", null);
map.put("料件编号", null);
map.put("物料(宽)", null);
map.put("物料(高)", null);
boolean isLock = ReelLockPosUtil.posIsLock(pos.getPosName());
map.put("是否锁定", isLock ? "是" : "否");
Barcode barcode = pos.getBarcode();
if (barcode != null) {
map.put("条码", barcode.getBarcode());
map.put("料件编号", barcode.getPartNumber());
map.put("物料(宽)", barcode.getPlateSize());
map.put("物料(高)", barcode.getHeight());
}
list.add(map);
}
......
......@@ -120,6 +120,7 @@ public class TaskController {
headerList.add(Lists.newArrayList("Slot"));
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("创建时间"));
......@@ -145,8 +146,9 @@ public class TaskController {
result.add(dataLog.getSlot());
result.add(dataLog.getSubSlot());
result.add(dataLog.getSide());
result.add(dataLog.getExport());
result.add(dataLog.getStatus());
result.add(dataLog.getCreator());
result.add(dataLog.getOperator());
result.add(dataLog.getCreateDate());
result.add(dataLog.getUpdateDate());
dataList.add(result);
......
......@@ -533,11 +533,11 @@ public class TaskService {
}
//8.如果其他仓没有大盘料,则优先出T面
else {
log.info(outTask.getSourceName()+"当前工单中,其他料仓没有大盘料,优先出T面料");
task = getOutTaskBySide(allTasks, cid, "T");
log.info(outTask.getSourceName()+"当前工单中,其他料仓没有大盘料,出最早的任务");
task = getOutTaskBySide(allTasks, cid, "");
if (task == null) {
log.info(outTask.getSourceName()+"当前工单中,其他料仓没有大盘料,T面料没有,出B面料");
task = getOutTaskBySide(allTasks, cid, "B");
//log.info(outTask.getSourceName()+"当前工单中,其他料仓没有大盘料,T面料没有,出B面料");
task = getOutTaskBySide(allTasks, cid, "");
}
}
if (task != null) {
......@@ -552,9 +552,9 @@ public class TaskService {
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());
}
}
......@@ -901,14 +901,14 @@ public class TaskService {
throw new ValidateException("smfcore.noValidStorage", "料仓列表中未找到可用的料仓");
}
availbleStorageList.sort(new Comparator<Storage>() {
/*availbleStorageList.sort(new Comparator<Storage>() {
@Override
public int compare(Storage o1, Storage o2) {
Integer taskCount1 = storageTaskCountMap.get(o1.getId());
Integer taskCount2 = storageTaskCountMap.get(o2.getId());
return taskCount1.compareTo(taskCount2);
}
});
});*/
return findEmptyPosInStorages(barcode, availbleStorageList, storageTaskCountMap, lastPosId);
}
......
......@@ -581,7 +581,7 @@ public class InnerBoxRestController {
}
//2.如果当前出料口的数量不等于0
if (remainTaskCount > 0) {
if (remainTaskCount > 0 && !export.equals(StorageExportUtil.getMaizhengExport())) {
//3.判断是否要补工单
Integer ordrRemainingQty = dataCache.getCache(Constants.CACHE_ordrRemainingQty);
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 {
}
//机台叫料转发的地址
@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!