Commit c833ac2b sunke

扫码料架入库推荐库位

添加日语
尾料先出改为数量小的先出
清理库位时更新库存
1 个父辈 5dabe5bb
package com.myproject.bean;
import org.mockito.cglib.core.Local;
import java.util.Locale;
/**
......@@ -12,6 +14,8 @@ public enum Language {
ENGLISH("en","English"),
//zh_CN 中文
ZH_CN("zh-CN","中文"),
//日语
Japan("jp","日本語"),
;
......@@ -39,18 +43,22 @@ public enum Language {
this.value = value;
}
public Locale getLocale(){
public static Locale getLocale(String langueLabel){
Locale preferredLocale = null;
if (label != null && !label.isEmpty()) {
int indexOfUnderscore = label.indexOf('-');
if (langueLabel != null && !langueLabel.isEmpty()) {
int indexOfUnderscore = langueLabel.indexOf('-');
if (indexOfUnderscore != -1) {
String language = label.substring(0, indexOfUnderscore);
String country = label.substring(indexOfUnderscore + 1);
String language = langueLabel.substring(0, indexOfUnderscore);
String country = langueLabel.substring(indexOfUnderscore + 1);
preferredLocale = new Locale(language, country);
} else {
preferredLocale = new Locale(label);
preferredLocale = new Locale(langueLabel);
}
}
return preferredLocale;
}
public Locale getLocale(){
return getLocale(label);
}
}
package com.myproject.bean.utils;
import com.google.common.base.Strings;
import com.myproject.bean.Language;
import com.myproject.bean.update.AlarmInfo;
import com.myproject.util.StorageConstants;
......@@ -39,6 +40,11 @@ public class StatusBean {
//服务器默认这些按钮都为不可用状态,只有收到对应的enable时,按钮才可以进行点击
private Map<String, String> data = new HashMap<>();
/**
* 提示消息,key为en, zh_CN, jp等,消息为对应语言的消息
*/
private Map<String, String> msgData = new HashMap<>();
/// <summary>
/// 整体料仓状态
/// 1=正常运行中
......@@ -60,16 +66,6 @@ public class StatusBean {
* 英文提示消息
*/
public String msgEn = "";
/**
* 提示消息类型
*/
public String msgCode="";
/**
* 消息参数
*/
public String[] msgParam;
/// <summary>
/// 包含的多个 BOX 的状态信息
/// </summary>
......@@ -321,20 +317,17 @@ public class StatusBean {
this.msg = msg;
}
public String getMsgCode() {
return msgCode;
}
public void setMsgCode(String msgCode) {
this.msgCode = msgCode;
}
public String[] getMsgParam() {
return msgParam;
}
public void setMsgParam(String[] msgParam) {
this.msgParam = msgParam;
public void setShowMsg(Locale local){
String lang = local.getLanguage();
String showMsg = msgData.get(lang);
if(showMsg == null){
if(Language.ENGLISH.getLabel().contains(lang)){
showMsg = msgEn;
}else{
showMsg = msg;
}
}
this.msg = showMsg;
}
public Map<Integer, BoxStatusBean> getBoxStatus() {
......@@ -436,4 +429,20 @@ public class StatusBean {
public void setMsgEn(String msgEn) {
this.msgEn = msgEn;
}
public Map<String, String> getMsgData() {
return msgData;
}
public void setMsgData(Map<String, String> msgData) {
this.msgData = msgData;
}
public String getDoorReelSingnal() {
String doorReelSignal = getFromData("doorReelSignal");
if(Strings.isNullOrEmpty(doorReelSignal)){
doorReelSignal = "-1";
}
return doorReelSignal;
}
}
......@@ -414,7 +414,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
}else if(StorageConstants.CHECKOUT_TYPE.FIFO.equals(checkoutType)){//严格的先进先出
sort = new Sort(Sort.Direction.ASC, "canCheckOutTime").and(new Sort(Sort.Direction.DESC, "barcode.usedCount"));
}else if(StorageConstants.CHECKOUT_TYPE.USED_FIRST.equals(checkoutType)){//尾料优先
sort = new Sort(Sort.Direction.DESC, "barcode.usedCount").and(new Sort(Sort.Direction.ASC, "canCheckOutTime"));
sort = new Sort(Sort.Direction.ASC, "barcode.amount").and(new Sort(Sort.Direction.ASC, "canCheckOutTime"));
}else if(StorageConstants.CHECKOUT_TYPE.PRODUCE_DATE.equals(checkoutType)){
//先生产先出
sort = new Sort(Sort.Direction.ASC, "barcode.produceDate").and(new Sort(Sort.Direction.ASC, "canCheckOutTime"));
......
......@@ -79,6 +79,9 @@ public class BarcodeRule {
}
log.info("分割符为:"+newRule.separator+"长度为:"+tempArr.length);
if(tempArr.length == 0){
tempArr = new String[]{ruleStr};
}
for (int i=0; i<tempArr.length; i++) {
String fieldValue = tempArr[i];
......@@ -126,15 +129,19 @@ public class BarcodeRule {
}
}
if(!newRule.expireYear_item.hasThisField() && !newRule.expireMonth_item.hasThisField() && !newRule.expireDay_item.hasThisField()&& !newRule.expireDate_item.hasThisField()){
if(!newRule.expireDate_item.matchRule(fieldValue,i)){
if(newRule.expireDate_item.matchRule(fieldValue,i)){
log.info("expireDate: 为" + newRule.expireDate_item.toString());
}
}
if(!newRule.expireYear_item.hasThisField() && !newRule.expireMonth_item.hasThisField() && !newRule.expireDay_item.hasThisField()){
if(newRule.expireYear_item.matchRule(fieldValue,i)){
log.info("expireYear: 为" + newRule.expireYear_item.toString());
}else if(newRule.expireMonth_item.matchRule(fieldValue,i)){
log.info("expireMonth: 为" + newRule.expireMonth_item.toString());
}else if(newRule.expireDay_item.matchRule(fieldValue,i)){
log.info("expireDay: 为" + newRule.expireDay_item.toString());
}else if(newRule.expireDate_item.matchRule(fieldValue,i)){
log.info("expireDate: 为" + newRule.expireDate_item.toString());
}
}
}
......@@ -198,11 +205,11 @@ public class BarcodeRule {
private int prefix = -1;
/**
*长度,0表示为变长,正值表示从前面截取,负值表示从后面开始截取,前缀和后缀及长度都有效时,需要验证字串总长度
* 例一: QTY[-1,5,-1]取前5位作为数量
* 例二: QTY[-1,-5,-1]取后5位作为数量
* 例三: QTY[1,5,-1]去除前面第1位后,取前5位作为数量
* 例四: QTY[-1,-5,1]去除后面第1位后,取后5位作为数量
* 例五: QTY[1,0,-1]去除前面1位后,剩余的作为数量
* 例一: QTY[0,5,0]取前5位作为数量
* 例二: QTY[0,-5,0]取后5位作为数量
* 例三: QTY[1,5,0]去除前面第1位后,取前5位作为数量
* 例四: QTY[0,-5,1]去除后面第1位后,取后5位作为数量
* 例五: QTY[1,0,0]去除前面1位后,剩余的作为数量
* 例六: QTY[0,5,3]去除前面0位和后面3位,剩余的5位作为数量,也就是说只能为8位
*/
private int length = 0;
......@@ -279,6 +286,9 @@ public class BarcodeRule {
try{
if(index != -1){
String codeValue = codeArr[index];
if(codeValue.length() < prefix + suffix){
return null;
}
//如果有前缀和后缀
if(prefix > 0){
codeValue = codeValue.substring(prefix);
......@@ -408,16 +418,20 @@ public class BarcodeRule {
codeBean.setError("error.barcode.noRule","解析规则未定义");
return codeBean;
}
String[] codeArr = codeStr.split(separator);
//条码与规则长度对应不上
if(codeArr.length != length){
log.info("条码["+codeStr+"]与规则【"+ruleStr+"】长度不同");
codeBean.setError("error.barcode.wrongLength",new String[]{}, "条码["+codeStr+"]长度错误");
return codeBean;
}else{
codeArr = codeStr.split(separator,length);
String[] codeArr = new String[]{codeStr};
if(!Strings.isNullOrEmpty(separator)){
codeArr = codeStr.split(separator);
//条码与规则长度对应不上
if(codeArr.length != length){
log.info("条码["+codeStr+"]与规则【"+ruleStr+"】长度不同");
codeBean.setError("error.barcode.wrongLength",new String[]{}, "条码["+codeStr+"]长度错误");
return codeBean;
}else{
codeArr = codeStr.split(separator,length);
}
}
Barcode b = new Barcode();
String reelId = "";
......@@ -555,12 +569,16 @@ public class BarcodeRule {
// codeStr = "=1+0x0-0x0=A0002";
//阳光电源
rule = "[RI]_PN_3_QTYxxxx";
//rule = "[RI]_PN_PRODATEyyMMdd_QTY[0:5:4]";
rule = "[RI]_PN_PRODATEyyMMdd_QTY[0:5:4]";
codeStr = "4500065747_CS000069_180101_030000041";
codeStr = "4500089600_DC000045_190528_003000006";
//佳世达
//rule ="BATCH;PRODATEyyyyMMdd[1:8:-1]EXPD[-1:-4:-1];PN[1:12:-1]SP[13:5:-1]QTY[-1:-5:-1];RI";
//codeStr = "L00002019090199951797;E20190901 0365;B8C.R2003.V81506072019090103000;R506072019102200356";
//博郎 QR = [VEE PN] + [Quantity] + [UID] + [Expire date] + [MSD level] + [Light class] + [Color class] + [Forward voltage] + [00000000]
// codeStr = "001967370080049250852020112000010P130BT200MH00000000";
//
// rule = "PN[0:8:-1]QTY[8:5:-1]RI[13:7:-1]EXPDATEyyyyMMdd[20:8:-1]MSL[28:4:-1]BATCH[32:4:-1]SP[36:4:-1]";
// //佳世达
// rule ="BATCH;PRODATEyyyyMMdd[1:8:-1]EXPD[-1:-4:-1];PN[1:12:-1]SP[13:5:-1]QTY[-1:-5:-1];RI";
// codeStr = "L00002019090199951797;E20190901 0365;B8C.R2003.V81506072019090103000;R506072019102200356";
BarcodeRule br = BarcodeRule.newRule(rule);
Barcode b = br.toCodeBean(codeStr).getBarcode();
if(b != null){
......@@ -570,13 +588,12 @@ public class BarcodeRule {
System.out.println("BATCH:"+b.getBatch());
System.out.println("MSL:"+b.getMsl());
System.out.println("EXPDATE:"+b.getExpireDate());
System.out.println("Supllier:"+b.getProvider());
}else{
log.info("解析失败");
}
System.out.println(String.format("%08d", Long.valueOf("002")));
// URI uri = new URI("smb://materialtower:Flextronics1@10.222.42.48/materialtower/re20190822161258_result.txt");
// String smbFileName = uri.getScheme() + "://" + uri.getHost() + "" + uri.getPath() + "abc.txt";
......
......@@ -72,7 +72,8 @@ public class StoragePosUpdateController extends BaseUpdateController {
barcodeManager.save(barcode);
storagePos.setBarcode(null);
storagePos.setUsed(false);
storagePosManager.save(storagePos);
storagePos = storagePosManager.save(storagePos);
dataCache.updateInventory(storagePos,barcode);
}
return "";
......
......@@ -5,6 +5,8 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.myproject.bean.CodeBean;
import com.myproject.bean.Language;
import com.myproject.bean.json.UsageItem;
import com.myproject.bean.update.*;
import com.myproject.bean.utils.BoxStatusBean;
import com.myproject.bean.utils.StatusBean;
......@@ -16,6 +18,7 @@ import com.myproject.manager.IStoragePosManager;
import com.myproject.util.DateUtil;
import com.myproject.util.StorageConstants;
import com.myproject.webapp.controller.storage.BaseController;
import com.myproject.webapp.filter.LocaleFilter;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.util.Integers;
......@@ -355,9 +358,21 @@ public class MesApiController extends BaseController {
@RequestMapping(value = "/status")
@ResponseBody
public Map<String,Object> status(HttpServletRequest request) {
Map<String,Object> results = Maps.newHashMap();
for (Storage storage : dataCache.getAllStorage().values()){
public List<Map<String,Object>> status(HttpServletRequest request) {
String cid = request.getParameter("cid");
Locale localeZh = Language.ZH_CN.getLocale();
Locale localeEn = Language.ENGLISH.getLocale();
Collection<Storage> storageList = Lists.newArrayList();
if(Strings.isNullOrEmpty(cid)){
storageList.addAll(dataCache.getAllStorage().values());
}else{
Storage storage = dataCache.getStorage(cid);
storageList.add(storage);
}
List<Map<String,Object>> results = Lists.newArrayList();
for (Storage storage : storageList){
StatusBean statusBean = taskService.getStatus(storage.getCid());
Map<Integer, BoxStatusBean> boxStatusMap = statusBean.getBoxStatus();
int status = -1;
......@@ -366,18 +381,50 @@ public class MesApiController extends BaseController {
if(boxStatusBean != null){
status = boxStatusBean.getStatus();
}
}
int storageStatus = status;
if(status == StorageConstants.STATUS.OFFLINE || statusBean.timeOut()){
//离线
storageStatus = -1;
}
results.put(storage.getName(), storageStatus);
String msg = statusBean.getMsg();
String msgEn = statusBean.getMsgEn();
Exception e = taskService.getServerException(storage.getCid());
if(e != null){
if(e instanceof ValidateException){
msg = getText(e.getMessage(),((ValidateException) e).getParams(), localeZh ,e.getMessage());
msgEn = getText(e.getMessage(),((ValidateException) e).getParams(), localeEn ,e.getMessage());
}else{
msg = e.getMessage();
msgEn = e.getMessage();
}
}
Map<String,Object> itemMap = new HashMap<>();
itemMap.put("cid", storage.getCid());
itemMap.put("name", storage.getName());
itemMap.put("status",storageStatus);
itemMap.put("msg",msg);
itemMap.put("msgEn",msgEn);
itemMap.put("doorReelSignal",statusBean.getDoorReelSingnal());
Map<String,Object> emptySlotMap = Maps.newHashMap();
Map<String,Object> totalSlotMap = Maps.newHashMap();
Map<String, UsageItem> usageMap = storage.getUsageMap();
for (UsageItem usageItem : usageMap.values()) {
String sizeStr = usageItem.getSizeStr();
int total = usageItem.getTotalCount();
int used = usageItem.getUsedCount();
totalSlotMap.put(sizeStr,total);
emptySlotMap.put(sizeStr,total - used);
}
itemMap.put("emptySlot",emptySlotMap);
itemMap.put("totalSlot",totalSlotMap);
results.add(itemMap);
}
return results;
}
private Date toDate(String dateStr){
try {
return DateUtil.toDate(dateStr,"yyyyMMddHHmmss");
......
......@@ -50,7 +50,7 @@ public class StatusController extends BaseController{
private StatusBean getStatus(String cid, HttpServletRequest request){
StatusBean statusBean = taskService.getStatus(cid);
statusBean.setShowMsg(request.getLocale());
Exception e = taskService.getServerException(cid);
if(e != null){
if(e instanceof ValidateException){
......@@ -63,6 +63,7 @@ public class StatusController extends BaseController{
}
}
//log.debug("Get cid: " + cid + " status: " + statusBean.getStatus() + " and error: " + statusBean.getError());
return statusBean;
}
......
......@@ -2,6 +2,7 @@ package com.myproject.webapp.filter;
import com.google.common.base.Strings;
import com.myproject.Constants;
import com.myproject.bean.Language;
import com.myproject.model.User;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.security.core.Authentication;
......@@ -40,7 +41,7 @@ public class LocaleFilter extends OncePerRequestFilter {
String locale = request.getParameter("locale");
Locale preferredLocale = getPreFerredLocale(locale);
Locale preferredLocale = Language.getLocale(locale);
SecurityContextImpl securityContextImpl = (SecurityContextImpl) request
.getSession().getAttribute("SPRING_SECURITY_CONTEXT");
......@@ -83,7 +84,7 @@ public class LocaleFilter extends OncePerRequestFilter {
if(preferredLocale == null){//没有设置过,使用用户设置的 Locale
if(loginUser != null){
preferredLocale = getPreFerredLocale(loginUser.getLanguage());
preferredLocale = Language.getLocale(loginUser.getLanguage());
}
}
......@@ -109,19 +110,4 @@ public class LocaleFilter extends OncePerRequestFilter {
// Reset thread-bound LocaleContext.
LocaleContextHolder.setLocaleContext(null);
}
private Locale getPreFerredLocale(String locale){
Locale preferredLocale = null;
if (locale != null && !locale.isEmpty()) {
int indexOfUnderscore = locale.indexOf('-');
if (indexOfUnderscore != -1) {
String language = locale.substring(0, indexOfUnderscore);
String country = locale.substring(indexOfUnderscore + 1);
preferredLocale = new Locale(language, country);
} else {
preferredLocale = new Locale(locale);
}
}
return preferredLocale;
}
}
......@@ -332,44 +332,10 @@ alarm.expire.title=Expire Alarm
alarm.expire.msg=The amount of expire material is [{0}]
client.inSuddenStop=Emergency Stop
client.NoAIr=No air signal
client.PreConnectFail=Startup failure\uFF1Apress Axis connect failed.
client.CloseError=Lock failed\uFF1Athe put in device is not closed.
client.startFail=Startup failure: emergency stop is not opened
client.startFailAir=Startup failure: no air pressure signal
client.InoutAlarm=The in out axis is alarm!
client.OpenAxisFail=Failed to open axis {0}
client.AutoReset=Resetting
client.AxisAlarm=Motion axis {0} alarm
client.OutStoreError=Providing format error{0}
client.WaitSingleTimeOut=Wait signal {0}={1} timeout
client.AxisHomeMoveAlarm=The movement {0} axis {1} receives the origin completion signal, the current position [{2}], the error is too large
client.AxisMoveAlarm=Movement {0} axis {1} target position [{2}] current position {3} error is too large
client.MoveTimeOut=[{0}]Timeout{1}[{2}]
client.XiLiaoError=Sucker suction failure
client.InStoreError=put in format error[barcode:{0}] pos:[{1}]
client.InStoreNoPosition=no pos found\uFF1Abarcode:[{0}] pos:[{1}]
client.WaitInstoreTimeOut=[{0}] timeout [wait to store][{1} seconds]
client.HasWare=there is a reel on the fork
client.NoCodeMsg=No barcode is found, please check the reel
client.InStoreNoCode=No barcode is found, send the reel out
client.MoveTimeOut_01=[{0}][motion]timeout\uFF0C{1} seconds waited
client.MoveTimeOut_02=[{0}][waiting IO signal]timeout\uFF0C{1} seconds waited
client.MoveTimeOut_03=[{0}][waiting time]timeout\uFF0C{1} seconds waited
client.MoveTimeOut_04=[{0}][target pos]timeout\uFF0C{1} seconds waited
client.MoveTimeOut_05=[{0}][press axis motion]timeout\uFF0C{1} seconds waited
client.MoveTimeOut_06=[{0}][origin signal]timeout\uFF0C{1} seconds waited
client.MoveTimeOut_07=[{0}][get height]timeout\uFF0C{1} seconds waited
client.MoveTimeOut_08=[{0}][waiting axis limit signal]timeout\uFF0C{1} seconds waited
client.MoveTimeOut_09=[{0}][waiting axis positive limit signal]timeout\uFF0C{1} seconds waited
client.MoveTimeOut_10=[{0}][loading axis stopping]timeout\uFF0C{1} seconds waited
client.MoveTimeOut_11=[{0}][scanning]timeout\uFF0C{1} seconds waited
client.MoveTimeOut_12=[{0}][putting/taking reel]timeout\uFF0C{1} seconds waited
client.MoveTimeOut_13=[{0}][send reel]timeout\uFF0C{1} seconds waited
settings.api.checkBarcode=Check Barcode
settings.api.orderFileDir=Order File Folder
settings.remind.title=Remind Setting
settings.remind.deadday=days dead metiral remind
shelf.btn.closeAll=Close All Lights
shelf.btn.posCheck=Database Check
......@@ -382,6 +348,13 @@ shelf.msg.noTask=Failed\: the material is in [{0}], but no task for it.
shelf.msg.outError=No material is found.
shelf.msg.inOk=Please put the material in the location [{0}]
shelf.msg.inError=No suitable location for [{0}] is found.
shelf.msg.hasReel=There position [{0}] already has material
shelf.msg.tipScanReel=Please scan the material to put in [{0}]
shelf.msg.fastop=Barcode operate is too fast
shelf.msg.scanPos=Please scan the position code
shelf.nextPos.hasTask=Next Position [{0}] already has task, please scan a new position code.
shelf.nextPos.hasReel=Next Position [{0}] already has material, please scan a new position code.
shelf.nextPos.wrongSize=Next Position [{0}] size [{1}] is different from material size [{2}] please scan a new position code.
order.out.set=set of materials
order.out.surplus=surplus material
......@@ -431,4 +404,5 @@ error.barcode.wrongPn=The partnumber is wrong
error.barcode.pnNotExist=x Component {0} does not exist
error.barcode.errorSize=x The reel has no size.
error.storage.noPosFind=No availble position is found.
msg.line.putIn=Put [{0}] into [{1}]
\ No newline at end of file
msg.line.putIn=Put [{0}] into [{1}]
delete.confirm=Are you sure to delete?
\ No newline at end of file
......@@ -320,42 +320,6 @@ batch.btn.singleIn=Single In
batch.btn.closeDoor=Close Door
client.inSuddenStop=Emergency Stop
client.NoAIr=No air signal
client.PreConnectFail=Startup failure\uFF1Apress Axis connect failed.
client.CloseError=Lock failed\uFF1Athe put in device is not closed.
client.startFail=Startup failure: emergency stop is not opened
client.startFailAir=Startup failure: no air pressure signal
client.InoutAlarm=The in out axis is alarm!
client.OpenAxisFail=Failed to open axis {0}
client.AutoReset=Resetting
client.AxisAlarm=Motion axis {0} alarm
client.OutStoreError=Providing format error{0}
client.WaitSingleTimeOut=Wait signal {0}={1} timeout
client.AxisHomeMoveAlarm=The movement {0} axis {1} receives the origin completion signal, the current position [{2}], the error is too large
client.AxisMoveAlarm=Movement {0} axis {1} target position [{2}] current position {3} error is too large
client.MoveTimeOut=[{0}]Timeout{1}[{2}]
client.XiLiaoError=Sucker suction failure
client.InStoreError=put in format error[barcode:{0}] pos:[{1}]
client.InStoreNoPosition=no pos found\uFF1Abarcode:[{0}] pos:[{1}]
client.WaitInstoreTimeOut=[{0}] timeout [wait to store][{1} seconds]
client.HasWare=there is a reel on the fork
client.NoCodeMsg=No barcode is found, please check the reel
client.InStoreNoCode=No barcode is found, send the reel out
client.MoveTimeOut_01=[{0}][motion]timeout\uFF0C{1} seconds waited
client.MoveTimeOut_02=[{0}][waiting IO signal]timeout\uFF0C{1} seconds waited
client.MoveTimeOut_03=[{0}][waiting time]timeout\uFF0C{1} seconds waited
client.MoveTimeOut_04=[{0}][target pos]timeout\uFF0C{1} seconds waited
client.MoveTimeOut_05=[{0}][press axis motion]timeout\uFF0C{1} seconds waited
client.MoveTimeOut_06=[{0}][origin signal]timeout\uFF0C{1} seconds waited
client.MoveTimeOut_07=[{0}][get height]timeout\uFF0C{1} seconds waited
client.MoveTimeOut_08=[{0}][waiting axis limit signal]timeout\uFF0C{1} seconds waited
client.MoveTimeOut_09=[{0}][waiting axis positive limit signal]timeout\uFF0C{1} seconds waited
client.MoveTimeOut_10=[{0}][loading axis stopping]timeout\uFF0C{1} seconds waited
client.MoveTimeOut_11=[{0}][scanning]timeout\uFF0C{1} seconds waited
client.MoveTimeOut_12=[{0}][putting/taking reel]timeout\uFF0C{1} seconds waited
client.MoveTimeOut_13=[{0}][send reel]timeout\uFF0C{1} seconds waited
settings.api.checkBarcode=Check Barcode
settings.api.orderFileDir=Order File Folder
user.cabinetAssign=Cabinet Assign
......@@ -427,4 +391,13 @@ error.barcode.pnNotExist=x Component {0} does not exist
error.barcode.errorSize=x The reel has no size.
error.storage.noStorage=There is no storage can use.
error.storage.noPosFind=No availble position is found.
msg.line.putIn=Put [{0}] into [{1}]
\ No newline at end of file
msg.line.putIn=Put [{0}] into [{1}]
shelf.msg.hasReel=There position [{0}] already has material
shelf.msg.tipScanReel=Please scan the material to put in [{0}]
shelf.msg.fastop=Barcode operate is too fast
shelf.msg.scanPos=Please scan the position code
shelf.nextPos.hasTask=Next Position [{0}] already has task, please scan a new position code.
shelf.nextPos.wrongSize=Next Position [{0}] size [{1}] is different from material size [{2}] please scan a new position code.
shelf.nextPos.hasReel=Next Position [{0}] already has material, please scan a new position code.
settings.remind.title=Remind Setting
settings.remind.deadday=days dead metiral remind
......@@ -317,42 +317,6 @@ batch.btn.batchOut=\u6279\u91CF\u51FA\u5E93
batch.btn.singleIn=\u5355\u76D8\u5165\u5E93
batch.btn.closeDoor=\u5173\u95ED\u4ED3\u95E8
client.inSuddenStop=\u6536\u5230\u6025\u505C\u4FE1\u53F7,\u62A5\u8B66\u6025\u505C
client.NoAIr=\u672A\u68C0\u6D4B\u5230\u6C14\u538B\u4FE1\u53F7
client.PreConnectFail=\u542F\u52A8\u5931\u8D25\uFF1A\u538B\u7D27\u8F74\u8FDE\u63A5\u5931\u8D25
client.CloseError=\u9501\u95E8\u5931\u8D25\uFF1A\u8BF7\u5148\u5173\u95ED\u4E0A\u6599\u673A\u6784
client.startFail=\u542F\u52A8\u5931\u8D25\uFF1A\u6025\u505C\u672A\u5F00
client.startFailAir=\u542F\u52A8\u5931\u8D25:\u6CA1\u6709\u6C14\u538B\u4FE1\u53F7
client.InoutAlarm=\u8FDB\u51FA\u8F74\u62A5\u8B66\uFF01\u590D\u4F4D\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5!
client.OpenAxisFail=\u6253\u5F00\u8F74{0}\u5931\u8D25
client.AutoReset=\u6536\u5230\u590D\u4F4D\u4FE1\u53F7\uFF0C\u81EA\u52A8\u590D\u4F4D
client.AxisAlarm=\u8FD0\u52A8\u8F74{0}\u62A5\u8B66
client.OutStoreError=\u51FA\u5E93\u683C\u5F0F\u9519\u8BEF{0}
client.WaitSingleTimeOut=\u7B49\u5F85\u4FE1\u53F7{0}={1}\u8D85\u65F6
client.AxisHomeMoveAlarm=\u8FD0\u52A8{0}\u8F74{1}\u6536\u5230\u539F\u70B9\u5B8C\u6210\u4FE1\u53F7\uFF0C\u5F53\u524D\u4F4D\u7F6E[{2}]\uFF0C\u8BEF\u5DEE\u8FC7\u5927\uFF0C\u9700\u8981\u62A5\u8B66
client.AxisMoveAlarm=\u8FD0\u52A8{0}\u8F74{1}\u76EE\u6807\u4F4D\u7F6E[{2}]\u5F53\u524D\u4F4D\u7F6E{3}\u8BEF\u5DEE\u8FC7\u5927\uFF0C\u9700\u8981\u62A5\u8B66
client.MoveTimeOut=[{0}]\u8D85\u65F6{1}[{2}]\u79D2
client.XiLiaoError=\u5438\u76D8\u5438\u6599\u5931\u8D25
client.InStoreError=\u5165\u5E93\u5E93\u4F4D\u683C\u5F0F\u9519\u8BEF\uFF1A\u6761\u7801[{0}]\u5E93\u4F4D\u53F7[{1}]
client.InStoreNoPosition=\u5165\u5E93\u672A\u627E\u5230\u5E93\u4F4D\uFF1A\u6761\u7801[{0}]\u5E93\u4F4D\u53F7[{1}]
client.WaitInstoreTimeOut[{0}]\u8D85\u65F6[\u7B49\u5F85\u53EF\u4EE5\u5165\u5E93][{1}\u79D2]
client.HasWare=\u53C9\u5B50\u6599\u76D8\u68C0\u6D4B\u6709\u6599\uFF0C\u8BF7\u68C0\u67E5
client.NoCodeMsg=\u672A\u626B\u5230\u4E8C\u7EF4\u7801\uFF0C\u8BF7\u91CD\u65B0\u653E\u5165\u6599\u76D8
client.InStoreNoCode=\u672A\u626B\u5230\u4E8C\u7EF4\u7801\uFF0C\u9700\u8981\u5C06\u6599\u76D8\u9001\u51FA
client.MoveTimeOut_01=[{0}][\u4F3A\u670D\u8FD0\u52A8]\u8D85\u65F6\uFF0C\u5DF2\u7B49\u5F85{1}\u79D2
client.MoveTimeOut_02=[{0}][IO\u4FE1\u53F7\u7B49\u5F85]\u8D85\u65F6\uFF0C\u5DF2\u7B49\u5F85{1}\u79D2
client.MoveTimeOut_03=[{0}][\u65F6\u95F4\u7B49\u5F85]\u8D85\u65F6\uFF0C\u5DF2\u7B49\u5F85{1}\u79D2
client.MoveTimeOut_04=[{0}][\u7535\u94A2\u76EE\u6807\u4F4D\u7F6E]\u8D85\u65F6\uFF0C\u5DF2\u7B49\u5F85{1}\u79D2
client.MoveTimeOut_05=[{0}][\u538B\u7D27\u8F74\u8FD0\u52A8]\u8D85\u65F6\uFF0C\u5DF2\u7B49\u5F85{1}\u79D2
client.MoveTimeOut_06=[{0}][\u8F74\u539F\u70B9\u4FE1\u53F7\u4EAE]\u8D85\u65F6\uFF0C\u5DF2\u7B49\u5F85{1}\u79D2
client.MoveTimeOut_07=[{0}][\u83B7\u53D6\u6599\u76D8\u9AD8\u5EA6]\u8D85\u65F6\uFF0C\u5DF2\u7B49\u5F85{1}\u79D2
client.MoveTimeOut_08=[{0}][\u7B49\u5F85\u4F3A\u670D\u8D1F\u9650\u4F4D]\u8D85\u65F6\uFF0C\u5DF2\u7B49\u5F85{1}\u79D2
client.MoveTimeOut_09=[{0}][\u7B49\u5F85\u4F3A\u670D\u6B63\u9650\u4F4D]\u8D85\u65F6\uFF0C\u5DF2\u7B49\u5F85{1}\u79D2
client.MoveTimeOut_10=[{0}][\u4E0A\u6599\u8F74\u8FD0\u52A8\u505C\u6B62]\u8D85\u65F6\uFF0C\u5DF2\u7B49\u5F85{1}\u79D2
client.MoveTimeOut_11=[{0}][\u626B\u7801\u7ED3\u675F]\u8D85\u65F6\uFF0C\u5DF2\u7B49\u5F85{1}\u79D2
client.MoveTimeOut_12=[{0}][\u64CD\u4F5C\u4EBA\u5458\u653E\u5165/\u62FF\u8D70\u6599\u76D8]\u8D85\u65F6\uFF0C\u5DF2\u7B49\u5F85{1}\u79D2
client.MoveTimeOut_13=[{0}][\u7B49\u5F85\u9001\u6599\u7ED3\u675F]\u8D85\u65F6\uFF0C\u5DF2\u7B49\u5F85{1}\u79D2
settings.api.checkBarcode=\u6761\u7801\u68C0\u67E5 API
settings.api.orderFileDir=\ \u5DE5\u5355\u6587\u4EF6\u5939
user.cabinetAssign=\u6599\u67DC\u5206\u914D
......@@ -423,4 +387,13 @@ error.barcode.wrongPn=PartNumber\u4E0D\u4E00\u81F4
error.barcode.pnNotExist=x\u6863\u6848 {0} \u4E0D\u5B58\u5728
error.barcode.errorSize=x \u6599\u76D8\u672A\u8BBE\u7F6E\u5C3A\u5BF8
error.storage.noStorage=\u65E0\u53EF\u7528\u7684\u6599\u4ED3
msg.line.putIn=[{0}]\u51C6\u5907\u5165\u5E93\u5230[{1}]
\ No newline at end of file
msg.line.putIn=[{0}]\u51C6\u5907\u5165\u5E93\u5230[{1}]
shelf.msg.hasReel=\u5E93\u4F4D[{0}]\u4E2D\u5DF2\u6709\u7269\u6599
shelf.msg.tipScanReel=\u5E93\u4F4D[{0}]\u64CD\u4F5C\u6210\u529F,\u8BF7\u626B\u63CF\u8981\u653E\u5165\u7684\u7269\u6599
shelf.msg.fastop=\u6761\u7801\u64CD\u4F5C\u9891\u7E41,\u8BF7\u7A0D\u540E\u518D\u8BD5
shelf.msg.scanPos=\u8BF7\u5148\u626B\u63CF\u5E93\u4F4D\u7801
shelf.nextPos.hasTask=\u4E0B\u4E00\u5E93\u4F4D[{0}]\u5DF2\u6709\u4EFB\u52A1,\u8BF7\u91CD\u65B0\u626B\u63CF\u5E93\u4F4D\u7801
shelf.nextPos.wrongSize=\u4E0B\u4E00\u5E93\u4F4D[{0}]\u5C3A\u5BF8[{1}]\u4E0E\u6599\u76D8\u5C3A\u5BF8[{2}]\u4E0D\u7B26,\u8BF7\u91CD\u65B0\u626B\u63CF\u5E93\u4F4D\u7801
shelf.nextPos.hasReel=\u4E0B\u4E00\u5E93\u4F4D[{0}]\u5DF2\u6709\u7269\u6599,\u8BF7\u91CD\u65B0\u626B\u63CF\u5E93\u4F4D\u7801
settings.remind.title=\u63D0\u9192\u8BBE\u7F6E
settings.remind.deadday=\u5929\u524D\u5446\u6EDE\u7269\u6599\u63D0\u9192
\ No newline at end of file
......@@ -654,7 +654,7 @@
var options = {};
//入库
var showStr = partNumber + "["+barcode+"]${in_label}"+posStr;
var showStr = partNumber + " ["+barcode+"] ${in_label}" + posStr;
var status = data[item].status.toLowerCase();
......@@ -667,7 +667,7 @@
options['icon']='fa fa-database';
if(data[item].type == 2){//出库
options['icon']='fa fa-sign-out';
showStr = partNumber + "["+barcode+"]${out_label}"+posStr;
showStr = partNumber + "["+barcode+"]${out_label}" + posStr;
}else{
options['onClick']= modifyClick;
}
......@@ -701,7 +701,7 @@
if(data[item].sourceName){
sourceStr = "<br/>${source_label} " + data[item].sourceStr;
}
options['msg']= showStr + statusMsg + data[item].locInfo + sourceStr;
options['msg']= showStr + statusMsg + sourceStr;
var task = cidTasks[taskId];
if(!task){
......
......@@ -101,14 +101,14 @@
<div class="portlet-title">
<div class="caption">
<i class="icon-bell font-green-haze"></i>
<span class="caption-subject bold uppercase font-green-haze"><fmt:message key="提醒设置"/></span>
<span class="caption-subject bold uppercase font-green-haze"><fmt:message key="settings.remind.title"/></span>
</div>
</div>
<div class="portlet-body" style="padding-left: 30px;">
<div class="form-group form-inline">
<div class="input-group margin-top-10">
<form:input path="inactionDay" cssClass="form-control input-small"/>
<span class="input-group-addon"><fmt:message key="天前呆滞物料提醒"/></span>
<span class="input-group-addon"><fmt:message key="settings.remind.deadday"/></span>
</div>
</div>
<%--<div class="form-group form-inline">--%>
......
......@@ -12,67 +12,69 @@
<div class="row">
<div class="col-md-12">
<ul class="timeline">
<li class="timeline-green">
<div class="timeline-time">
<span class="date">
2017 </span>
<span class="time">
05-27 </span>
</div>
<div class="timeline-icon">
<i class="fa fa-clock-o"></i>
</div>
<div class="timeline-body">
<div class="timeline-content">
<ul>
<li>二维码纸张大小系统设置</li>
<li>出库贵重物料(半自动仓中的物料和添加料件档案时勾选了贵重物料选项的料)时需输入授权码.用户是否有贵重物料出库权限需要在角色中配置,同一站位列表或批次只需输入一次授权</li>
</ul>
</div>
</div>
</li>
<li class="timeline-blue">
<div class="timeline-time">
<span class="date">
2017 </span>
<span class="time">
05-11 </span>
</div>
<div class="timeline-icon">
<i class="fa fa-clock-o"></i>
</div>
<div class="timeline-body">
<div class="timeline-content">
<ul>
<li>报警信息记录统计</li>
<li>每日吞吐量统计图表</li>
<li>增加出库方式的系统设置:效率优先/先进先出/尾料优先</li>
</ul>
</div>
</div>
</li>
<li class="timeline-yellow timeline-noline">
<div class="timeline-time">
<span class="date">
2017 </span>
<span class="time">
04-20 </span>
</div>
<div class="timeline-icon">
<i class="fa fa-clock-o"></i>
</div>
<div class="timeline-body">
<div class="timeline-content">
<ul>
<li>指定批次页面描述信息修改</li>
<li>扫码显示站位列表时添加线体信息</li>
<li>库存预警详情打印</li>
<li>自动生成条码信息及条码打印优化</li>
<li>云仓库监控页面扫码获取站位列表字体大小调整</li>
</ul>
</div>
</div>
</li>
<%--<li class="timeline-green">--%>
<%--<div class="timeline-time">--%>
<%--<span class="date">--%>
<%--2020 </span>--%>
<%--<span class="time">--%>
<%--06-24 </span>--%>
<%--</div>--%>
<%--<div class="timeline-icon">--%>
<%--<i class="fa fa-clock-o"></i>--%>
<%--</div>--%>
<%--<div class="timeline-body">--%>
<%--<div class="timeline-content">--%>
<%--<ul>--%>
<%--<li>版本 V20200624</li>--%>
<%--<li>尾料先出按数量计算尾料</li>--%>
<%--<li>扫码料架会自动查找一下个库位,如果下一个库位已有物料或者尺寸不合适时,需要重新扫库位码</li>--%>
<%--<li>SISO料仓门口料盘信号提供给机器人</li>--%>
<%--</ul>--%>
<%--</div>--%>
<%--</div>--%>
<%--</li>--%>
<%--<li class="timeline-blue">--%>
<%--<div class="timeline-time">--%>
<%--<span class="date">--%>
<%--2017 </span>--%>
<%--<span class="time">--%>
<%--05-11 </span>--%>
<%--</div>--%>
<%--<div class="timeline-icon">--%>
<%--<i class="fa fa-clock-o"></i>--%>
<%--</div>--%>
<%--<div class="timeline-body">--%>
<%--<div class="timeline-content">--%>
<%--<ul>--%>
<%--<li>报警信息记录统计</li>--%>
<%--<li>每日吞吐量统计图表</li>--%>
<%--<li>增加出库方式的系统设置:效率优先/先进先出/尾料优先</li>--%>
<%--</ul>--%>
<%--</div>--%>
<%--</div>--%>
<%--</li>--%>
<%--<li class="timeline-yellow timeline-noline">--%>
<%--<div class="timeline-time">--%>
<%--<span class="date">--%>
<%--2017 </span>--%>
<%--<span class="time">--%>
<%--04-20 </span>--%>
<%--</div>--%>
<%--<div class="timeline-icon">--%>
<%--<i class="fa fa-clock-o"></i>--%>
<%--</div>--%>
<%--<div class="timeline-body">--%>
<%--<div class="timeline-content">--%>
<%--<ul>--%>
<%--<li>指定批次页面描述信息修改</li>--%>
<%--<li>扫码显示站位列表时添加线体信息</li>--%>
<%--<li>库存预警详情打印</li>--%>
<%--<li>自动生成条码信息及条码打印优化</li>--%>
<%--<li>云仓库监控页面扫码获取站位列表字体大小调整</li>--%>
<%--</ul>--%>
<%--</div>--%>
<%--</div>--%>
<%--</li>--%>
<%--<li class="timeline-green">
<div class="timeline-time">
<span class="date">
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!