Commit 4864f134 zshaohui

1.库位管理增加是否锁定信息

2.增加msd管控料仓配置
1 个父辈 74643c1d
......@@ -124,6 +124,18 @@ public class ReelLockPosUtil {
return lockPosIds;
}
public static void removeLockPosId(String lockPosId){
String barcode = "";
for (ReelLockPosInfo reelLockPosInfo : reelLocKPosMap.values()) {
if (lockPosId.equals(reelLockPosInfo.getLockPosId())){
barcode = reelLockPosInfo.getBarcode();
break;
}
}
if (StringUtils.isNotEmpty(barcode)){
removeReelLockPosInfo(barcode);
}
}
private static String processBarcode(String str) {
if (ObjectUtil.isEmpty(str)) {
......
......@@ -179,6 +179,13 @@ public class Barcode extends BasePo implements Serializable {
private String orderNo = "";
private String feederInfo = "";
/**
* 分盘的barcode
*/
private String traySeparationBarcode = "";
/**
* 是否是锡膏
*/
......@@ -243,6 +250,8 @@ public class Barcode extends BasePo implements Serializable {
*/
private Date sluggishTime;
private String orderItemId = "";
/**
* 自定义的附加信息
*/
......
......@@ -357,7 +357,7 @@ public class XLRBoxHandler extends BaseDeviceHandler {
}
String lastExport = lastOutExportMap.get(cid);
log.info(cid+"对应的上一次出料口为:"+lastExport);
//log.info(cid+"对应的上一次出料口为:"+lastExport);
//查找下一出口的任务, 出口顺序为13572468, 桶的顺序为3,2,1
DataLog orderTask = findNextTask(boxTaskListToExecute, lastExport);
......
......@@ -31,6 +31,7 @@ import com.neotel.smfcore.core.storage.service.manager.IStorageManager;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.service.dao.IAlarmInfoDao;
import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
import com.neotel.smfcore.core.system.service.po.AlarmInfo;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
......@@ -83,6 +84,9 @@ public class DeviceController {
@Autowired
private IBarcodeManager barcodeManager;
@Autowired
private IDataLogManager dataLogManager;
/**
* 权限验证API列表
*/
......@@ -1083,7 +1087,7 @@ public class DeviceController {
needMovePosTask.setOperator("admin-move");
needMovePosTask.setType(OP.CHECKOUT);
needMovePosTask.setStatus(OP_STATUS.FINISHED.name());
taskService.updateFinishedTask(needMovePosTask);
dataLogManager.save(needMovePosTask);
needMovePos.setBarcode(null);
needMovePos.setUsed(false);
storagePosManager.save(needMovePos);
......@@ -1100,7 +1104,7 @@ public class DeviceController {
targetPosTask.setOperator("admin-move");
targetPosTask.setType(OP.PUT_IN);
targetPosTask.setStatus(OP_STATUS.FINISHED.name());
taskService.updateFinishedTask(targetPosTask);
dataLogManager.save(targetPosTask);
targetPos.setBarcode(barcode);
targetPos.setUsed(true);
targetPos.setCanCheckOutTime(System.currentTimeMillis());
......
......@@ -23,6 +23,7 @@ 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.enums.CHECKOUT_TYPE;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Storage;
......@@ -962,7 +963,7 @@ public class LiteOrderCache {
int appendNum = 0;
int pitch = partNumberManager.getPitchByJkemPartNumber(orderItem.getPn());
if (pitch == 2 || pitch == 4) {
appendNum = 300;
appendNum = 150;
}
log.info("工单号为:" + orderNo + ",料号为:" + orderItem.getPn() + ",找到的pitch为:" + pitch + ".需要增加的数量为:" + appendNum);
//判断剩余要出的数量和盘数
......@@ -986,13 +987,85 @@ public class LiteOrderCache {
if (StringUtils.isEmpty(putInExport)){
break;
}
//统计任务数
Map<String, Integer> taskPosIdMap = new HashMap<>();
for (String storageId : availableStorageIds) {
taskPosIdMap.put(storageId,0);
}
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog task : allTasks) {
if (!task.isFinished() && !task.isCancel() && task.isCheckOutTask()){
if (StringUtils.isNotEmpty(task.getStorageId())){
Integer count = taskPosIdMap.get(task.getStorageId());
if (count == null){
continue;
} else {
count = count + 1;
taskPosIdMap.put(task.getStorageId(),count);
}
}
}
}
//任务数最少得进行排序
taskPosIdMap = taskPosIdMap.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(oldValue, newValue) -> oldValue, // 合并函数,处理键冲突
LinkedHashMap::new // 保持排序顺序
));
StoragePos pos = null;
for (String storageId : taskPosIdMap.keySet()) {
try {
log.info("休眠100毫秒");
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
StoragePos pos = storagePosManager.findPartNumberInStorages(availableStorageIds, partNumber, excludePosIds, checkoutType);
//判断当前库存中,有没有可用的料盘信息,没有直接跳过
Map<String, InventoryItem> allInventory = dataCache.getAllInventory(Arrays.asList(storageId), null);
if (allInventory == null || allInventory.isEmpty()){
log.info(storageId+"没有可用的库存,跳过");
continue;
} else {
InventoryItem inventoryItem = allInventory.get(partNumber);
if (inventoryItem == null){
log.info(storageId+"没有可用的库存,跳过,对应的PartNumber为:"+partNumber);
continue;
}
}
pos = storagePosManager.findPartNumberInStorages(Arrays.asList(storageId), partNumber, excludePosIds, checkoutType);
if (pos != null){
Barcode barcode = pos.getBarcode();
if (barcode != null){
boolean hasTask = false;
String barcodeStr = barcode.getBarcode();
List<DataLog> dataLogList = taskService.getAllTasks();
for (DataLog dataLog : dataLogList) {
if (barcodeStr.equals(dataLog.getBarcode())){
if (!dataLog.isFinished() && !dataLog.isCancel()){
hasTask = true;
break;
}
}
}
if (hasTask){
pos = null;
}
}
}
if (pos != null){
break;
}
}
if (pos == null) {
log.info(orderNo + "未找到可以出库的物料,料号为:" + partNumber + ",站位号为:" + feederInfo);
//物料为空,同步更新出料口信息
if (countTask < 1) {
StorageExportUtil.updateExportByOrder(putInExport, "", feederInfo, orderNo, OP_STATUS.NONE.name(), partNumber, countTask > 1);
StorageExportUtil.updateExportByOrder(putInExport, "", feederInfo, orderNo, OP_STATUS.NONE.name(), partNumber, countTask > 1,true);
}
break;
}
......@@ -1020,10 +1093,16 @@ public class LiteOrderCache {
barcode.setCheckingAmount(checkingAmount);
barcode.setOrderId(cacheOrder.getId());
barcode.setOrderNo(orderNo);
barcode.setOrderItemId(orderItem.getId());
barcode.setMpn(orderItem.getMpn());
barcode.setFeederInfo(orderItem.getFeederInfo());
} else {
barcode.setCheckingAmount(barcode.getAmount());
barcode.setOrderId(cacheOrder.getId());
barcode.setOrderNo(orderNo);
barcode.setOrderItemId(orderItem.getId());
barcode.setMpn(orderItem.getMpn());
barcode.setFeederInfo(orderItem.getFeederInfo());
}
barcodeManager.save(barcode);
pos.setBarcode(barcode);
......@@ -1066,7 +1145,7 @@ public class LiteOrderCache {
//先更新出料口,再更新任务
if (!barcode.isBox()) {
log.info(barcode.getBarcode()+"为非料盒信息,需要更改出料口信息");
StorageExportUtil.updateExportByOrder(putInExport, barcode.getBarcode(), feederInfo, orderNo, task.getStatus(),task.getPartNumber(),countTask>1);
StorageExportUtil.updateExportByOrder(putInExport, barcode.getBarcode(), feederInfo, orderNo, task.getStatus(),task.getPartNumber(),countTask>1,hasReel);
}
taskService.addTaskToExecute(task);
}
......
......@@ -7,9 +7,7 @@ import com.neotel.smfcore.common.base.IExcelDownLoad;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.common.utils.*;
import com.neotel.smfcore.core.barcode.bean.CodeBean;
import com.neotel.smfcore.core.barcode.rest.bean.dto.BarcodeDto;
import com.neotel.smfcore.core.barcode.rest.bean.dto.CodeDto;
......@@ -107,10 +105,14 @@ public class StoragePosController {
PageData<StoragePos> pages = storagePosManager.findByPage(query, pageable);
List<StoragePosDto> StoragePosDtos = storagePosMapper.toDto(pages.getContent());
for (int i=0;i<StoragePosDtos.size();i++){
Set<String> allLockPosIds = ReelLockPosUtil.getAllLockPosIds();
for (int i=0;i<StoragePosDtos.size();i++){
Storage storage=dataCache.getStorageById(StoragePosDtos.get(i).getStorageId());
if(storage!=null){
StoragePosDtos.get(i).setStorageName(storage.getName());
if (allLockPosIds.contains(StoragePosDtos.get(i).getId())){
StoragePosDtos.get(i).setLock(true);
}
}
}
return new PageData(StoragePosDtos, pages.getTotalElements());
......@@ -333,6 +335,15 @@ public class StoragePosController {
return new ResponseEntity<>(HttpStatus.OK);
}
@ApiOperation("解除锁定库位")
@RequestMapping("/removeLockPosId")
public ResultBean removeLockPosId(String posId) {
if (StringUtils.isNotEmpty(posId)) {
ReelLockPosUtil.removeLockPosId(posId);
}
return ResultBean.newOkResult("");
}
private Query getPosFindCriteria(StoragePosFindCriteria criteria){
if (ObjectUtil.isNotEmpty(criteria.getStorageId()) && criteria.getStorageId().equals("0")) {
criteria.setStorageId(null);
......
......@@ -68,4 +68,6 @@ public class StorageDto implements Serializable {
@ApiModelProperty("是否可以合并库位")
private boolean mergePos=false;
private boolean msdControl = false;
}
......@@ -78,5 +78,6 @@ public class StoragePosDto implements Serializable {
@ApiModelProperty("组名称")
private String groupName = "";
@ApiModelProperty("是否锁定")
private boolean lock = false;
}
......@@ -80,6 +80,10 @@ public class Storage extends BasePo implements Serializable {
*/
private boolean mergePos=false;
/**
* 是否为msd管控的物料
*/
private boolean msdControl = false;
// /**
// * 是否是上下层的在线料仓
......
......@@ -174,6 +174,7 @@ public class TaskService {
if (isBox == null){
isBox = false;
}
log.info(task.getBarcode()+"找到的出料口为:"+export+",是否有料箱为:"+isBox);
if (StringUtils.isNotEmpty(export) && !isBox) {
StorageExportUtil.updateExportByTask(export, task.getBarcode(), task.getAppendData("feederInfo"), task.getSourceName(), task.getStatus(),task.getPartNumber());
}
......
......@@ -353,7 +353,7 @@ public class StorageExportUtil {
}
public static synchronized void updateExportByOrder(String export, String barcode, String feederInfo, String orderNo, String status, String partNumber, boolean countTask) {
public static synchronized void updateExportByOrder(String export, String barcode, String feederInfo, String orderNo, String status, String partNumber, boolean countTask,boolean hasReel) {
log.info("修改出料口:" + export + "barcode为:" + barcode + ",站位信息为:" + feederInfo + "工单号为:" + orderNo + ",状态为:" + status + ",partNumber为:" + partNumber);
String exportFeederInfo = FeederInfoUtil.getOriginalFeeder(feederInfo);
......@@ -378,6 +378,7 @@ public class StorageExportUtil {
detail.setStatus(status);
detail.setLastStatus(status);
detail.setOrderFeederInfo(orderFeederInfo);
detail.setHasReel(hasReel);
hasFeederInfo = true;
break;
}
......@@ -391,6 +392,7 @@ public class StorageExportUtil {
detail.setStatus(status);
detail.setFeederInfo(exportFeederInfo);
detail.setOrderFeederInfo(orderFeederInfo);
detail.setHasReel(hasReel);
detailList.add(detail);
}
storageExport.setDetailList(detailList);
......
......@@ -14,6 +14,8 @@ spring:
database: smf # 数据库
username:
password:
maxConSize: 600
minConsize: 300
#备份数据库,如果有,则开启,注意:如果主数据库设置了用户名和密码,备份服务器必须设置用户名和密码!!
#西门子的正式和备份数据库,用户名和密码都是Siemens
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!