Commit 94b98a50 LN

1. 增加配置,当仅为mimo料仓使用时,不显示入库单,料架设置等菜单。

2. 元器件供应商改为在列表中可以并可以编辑。
3. mimo料仓增加单盘出库查找功能。
4.提示消息bug修改
1 个父辈 ccfa0e3c
......@@ -57,10 +57,16 @@ public class DataInitManager {
@Value("${app.version}")
private String version;
/**
* 是否是mimo专用版本
*/
@Value("${app.type}")
private String appType="";
@PostConstruct
public void DataInit() {
try {
log.info("smfcore版本号:["+version+"]。初始化环境...");
log.info("smfcore版本号:["+version+"],类型["+appType+"]。初始化环境...");
//查询admin的用户是否存在
String userName = Constants.SUPER_USERNAME;
User admin = userManager.findByUserName(userName);
......@@ -180,6 +186,7 @@ public class DataInitManager {
private Set<String> MenuInitNew() {
boolean isMimo=appType.equals("mimo");
List<Menu> menus = new ArrayList<Menu>();
//设备看板
Menu menukanban = new Menu(new ArrayList<Menu>(), 1, "boxkanban", "设备看板", 1, "lockMaterial", "lockMaterial/material/index", "", 0, "kanban");
......@@ -221,6 +228,8 @@ public class DataInitManager {
posOut.setHidden(true);
zhuanruMenu.setHidden(true);
singleMenu.setHidden(true);
inOrderMenu.setHidden(isMimo);
putinMenu.setHidden(isMimo);
// orderSet.setHidden(true);
menus.addAll(createMenus(poutOut, menuOrder, out,posOut,groupOut,materialBox,outSet,inOrderMenu,putinMenu,zhuanruMenu,singleMenu,sluggishMaterials,safetyInventory));
......@@ -278,6 +287,7 @@ public class DataInitManager {
Menu pMenuWulian = Menu.CreatePMenu("物联网", 30, "internet", 2, "interMenu");
Menu orderSet = new Menu(new ArrayList<Menu>(), 1, "orderSetting", "共享文件夹", 1, "orderSetting", "system/orderSetting/index", "", 0, "sysSet");
orderSet.setHidden(true);
pMenuWulian.setHidden(true);
menus.addAll(createMenus(pMenuWulian, orderSet));
......@@ -297,6 +307,7 @@ public class DataInitManager {
// orderSet.setHidden(true);
menuMenu.setHidden(true);
translationSet.setHidden(true);
shelfMenu.setHidden(isMimo);
menus.addAll(createMenus(poutSet, menuStorage, menuStoragePos, menuMenu,sysSet,translationSet,shelfMenu));
......
......@@ -55,13 +55,12 @@ public class StatusBean {
*/
private Map<String, String> msgData = new HashMap<>();
/// <summary>
/// 整体料仓状态
/// 1=正常运行中
/// 2=急停中
/// 3=故障(气压检测不到等,用msg发送详细故障说明)
/// 4=警告(用msg发送提醒,如出库到达工位但是没有工人操作)
/// </summary>
/**
* 0=离线,1=正常运行中, 2=急停,
* 3=故障(气压检测不到等,用msg发送详细故障说明)
* ,4=警告(用msg发送提醒,如出库到达工位但是没有工人操作)
* 5=调试中,6入库执行中,7入仓位完成,8入库失败, 9出库执行中,10出仓位完成,11出库失败,12移栽出库,13 重置中,14 扫码入库失败
*/
private int status;
/// <summary>
/// 提示消息
......
package com.neotel.smfcore.core.device.handler.impl;
import cn.hutool.core.util.ObjectUtil;
import com.google.common.base.Strings;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.core.device.api.IOpAuthApi;
import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.storage.bean.InventoryItem;
import com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE;
import com.neotel.smfcore.core.storage.enums.DeviceType;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* Created by sunke on 2021/7/12.
*/
@Service
@Api(tags = "MIMO: 批量料仓")
@RestController
@Slf4j
public class MimoBoxHandler extends BaseDeviceHandler {
......@@ -59,6 +71,66 @@ public class MimoBoxHandler extends BaseDeviceHandler {
return statusBean;
}
@ApiOperation("单盘出库获取库存的PN")
@PostMapping("/api/mimo/getInventory")
@PreAuthorize("@el.check('storagePos')")
public List<String> getInventory(@RequestBody Map<String, String> mapValues, HttpServletRequest request) {
String storageId = mapValues.get("storageId");
String blurry = mapValues.get("blurry");
Storage storage = dataCache.getStorageById(storageId);
if (storage == null) {
throw new ValidateException("smfcore.storage.error.notExist", "未找到料仓{0}", new String[]{storageId});
}
Map<String, InventoryItem> inventoryItemMap = dataCache.getStorageInventory(storageId, blurry);
List<String> list = new ArrayList<>();
for (InventoryItem item :
inventoryItemMap.values()) {
list.add(item.getPartNumber());
}
return list;
}
@ApiOperation("根据PN单盘出库")
@PostMapping("/api/mimo/singleOut")
@PreAuthorize("@el.check('storagePos')")
public ResultBean singleOut(@RequestBody Map<String, String> mapValues, HttpServletRequest request) {
String storageId = mapValues.get("storageId");
String pn = mapValues.get("pn");
if (ObjectUtil.isEmpty(pn)) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"PN"});
}
Storage storage = dataCache.getStorageById(storageId);
if (storage == null) {
throw new ValidateException("smfcore.storage.error.notExist", "未找到料仓{0}", new String[]{storageId});
}
Collection<String> excludePosIds = taskService.excludePosIds();
CHECKOUT_TYPE checkoutType = dataCache.getCheckOutType();
List<String> ids = new ArrayList<>();
ids.add(storageId);
//查找一盘料单盘出库
StoragePos pos = storagePosManager.findPartNumberInStorages(ids, pn, excludePosIds, checkoutType);
if (pos == null) {
throw new ValidateException("smfcore.error.mimo.outFial", "未找到可出库的物料", new String[]{storageId});
} else {
log.info("根据PN单盘出库:【" + storage.getName() + "_" + storage.getCid() + "】位置仓位【" + pos.getPosName() + "】");
String outResult = taskService.checkout(storage, pos, true, SecurityUtils.getCurrentUsername());
if (!Strings.isNullOrEmpty(outResult)) {
throw new ValidateException("smfcore.error", outResult);
}
}
return ResultBean.newOkResult("");
}
@Override
public DeviceType getDeviceType() {
return DeviceType.BATCH;
......
......@@ -474,7 +474,63 @@ public class DataCache {
}
return resultMap;
}
/**
* 获取库存信息,key 为 PN
*/
public Map<String,InventoryItem> getStorageInventory(String storageId, String blurry) {
Map<String, Storage> allStorages = getAllStorage();
List<Storage> storages = Lists.newArrayList();
for (Storage storage :
allStorages.values()) {
if (ObjectUtil.isNotEmpty(storageId) && storageId.equals(storage.getId())) {
storages.add(storage);
}
}
Map<String, InventoryItem> map = getInventory(storages);
if (ObjectUtil.isEmpty(blurry)) {
return map;
}
Map<String, InventoryItem> resultMap = new HashMap<>();
for (InventoryItem item :
map.values()) {
boolean blurryOk = false;
if (ObjectUtil.isNotEmpty(blurry)) {
String[] blurrys = blurry.split(",");
String[] valueArray = new String[]{item.getPartNumber()};
for (String s : blurrys) {
if (ObjectUtil.isNotEmpty(s)) {
String v = item.getPartNumber();
if (ObjectUtil.isEmpty(v)) {
continue;
}
try {
Pattern pattern = Pattern.compile(QueryHelp.escapeExprSpecialWord(s), Pattern.CASE_INSENSITIVE);
Matcher m = pattern.matcher(v);
while (m.find()) {
blurryOk = true;
break;
}
if (blurryOk) break;
} catch (Exception ex) {
log.error(ex.toString());
}
if (blurryOk) break;
} else {
blurryOk = true;
}
}
} else {
blurryOk = true;
}
if (blurryOk) {
resultMap.put(item.getPartNumber(), item);
}
}
return resultMap;
}
/**
* 获取某些料仓的库存信息
*/
......
......@@ -29,7 +29,7 @@ public class BoxStatusDto {
@ApiModelProperty("是否在线")
private boolean onLine=false;
@ApiModelProperty("单台BOX状态,0=离线,1=正常运行中, 2=急停,3=故障,4=警告,5=调试中,6入库执行中,7入仓位完成,8入库失败, 9出库执行中,10出仓位完成,11出库失败")
@ApiModelProperty("单台BOX状态,0=离线,1=正常运行中, 2=急停,3=故障,4=警告,5=调试中,6入库执行中,7入仓位完成,8入库失败, 9出库执行中,10出仓位完成,11出库失败,12移栽出库,13 重置中,14 扫码入库失败 ")
private int status=0;
@ApiModelProperty("温度")
private String temperature;
......
......@@ -62,14 +62,22 @@ public class DevicesStatusUtil {
clientMsg = "";
clientMsgEn = "";
}
if(msgCode==null){
msgCode="";
}
if(clientMsg==null){
clientMsg="";
}
//判断消息是否有内容
if(ObjectUtil.isNotEmpty(msgCode)||ObjectUtil.isNotEmpty(clientMsg)){
boolean newMsg=true;
//和上个消息是否一样
StatusBean msgBean=clientMsgs.get(cid);
if(msgBean!=null){
if(msgBean.getMsgCode().equals(msgCode)&&msgBean.getMsg().equals(clientMsg)){
newMsg=false;
if(msgBean!=null) {
if (msgBean.msgTimeOut()) {
newMsg = true;
} else if (msgBean.getMsgCode().equals(msgCode) && msgBean.getMsg().equals(clientMsg)) {
newMsg = false;
}
}
if(newMsg){
......@@ -78,6 +86,7 @@ public class DevicesStatusUtil {
}
StatusBean statusBean = new StatusBean();
statusBean.setCid(cid);
statusBean.setLastSaveTime(System.currentTimeMillis());
statusBean.setMsg(clientMsg);
statusBean.setMsgEn(clientMsgEn);
......
......@@ -34,4 +34,5 @@ rsa:
app:
version: '1.23.0211'
\ No newline at end of file
version: '1.25.0517'
type: ""
\ No newline at end of file
......@@ -255,6 +255,7 @@ smfcore.equipmentView=\u8BBE\u5907\u4E92\u8054
smfcore.greaterThanZero=\u6570\u91CF\u5FC5\u987B\u5927\u4E8E0
smfcore.error.virtualOut.num=\u6570\u91CF\u4E0D\u80FD\u8D85\u8FC7{0}
smfcore.error.virtualOut.noItem=\u5DE5\u5355{0}\u4E2D\u672A\u627E\u5230\u5BF9\u5E94\u7684PN\u6216\u7269\u6599\u7F16\u53F7
smfcore.error.mimo.outFial=\u672A\u627E\u5230\u53EF\u51FA\u5E93\u7684\u7269\u6599
#smfclient.nlp.onlyOneTray=\u4E0D\u53EF\u540C\u65F6\u653E\u5165\u591A\u76D8\u7269\u6599:{0}
#smfclient.nlp.cannotFindPos={0}\u672A\u627E\u5230\u5E93\u4F4D:{1}
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!