Commit f9bf1e74 孙克

Merge remote-tracking branch 'origin/master'

2 个父辈 5a6d6a8c 4b410f44
正在显示 106 个修改的文件 包含 3349 行增加410 行删除
...@@ -89,7 +89,7 @@ public class DataInitManager { ...@@ -89,7 +89,7 @@ public class DataInitManager {
operator = roleManager.save(operator); operator = roleManager.save(operator);
log.info("创建默认角色:" + operator.toString()); log.info("创建默认角色:" + operator.toString());
admin = new User(userName, "admin@neotel.tech", "zh-CN", role.getId(), "$2a$10$Egp1/gvFlt7zhlXVfEFw4OfWQCGPw0ClmMcc6FjTnvXNRVf9zdMRa", true, true, new Date(), groupIds, ""); admin = new User(userName, "admin@neotel.tech", "zh-CN", role.getId(), "$2a$10$Egp1/gvFlt7zhlXVfEFw4OfWQCGPw0ClmMcc6FjTnvXNRVf9zdMRa", true, true, new Date(), groupIds, "","");
admin = userManager.save(admin); admin = userManager.save(admin);
log.info("创建默认用户:" + admin.toString()); log.info("创建默认用户:" + admin.toString());
......
...@@ -121,7 +121,7 @@ public class MenuInit { ...@@ -121,7 +121,7 @@ public class MenuInit {
//addDefaultFunctionMenu(-1,null,"Neo Ai","neoai","neoai/index","neoai"); //addDefaultFunctionMenu(-1,null,"Neo Ai","neoai","neoai/index","neoai");
//Mimo看板 //Mimo看板
//addDefaultFunctionMenu(0,null,"SMD BOX MIMO","SMDBOXMIMO", "smdBoxMimo/index","smdMimo"); addDefaultFunctionMenu(0,null,"SMD BOX MIMO","SMDBOXMIMO", "smdBoxMimo/index","smdMimo");
Menu boardMap = Menu.CreatePMenu("仪表盘", 0, "dashBoard", "kanban", null); Menu boardMap = Menu.CreatePMenu("仪表盘", 0, "dashBoard", "kanban", null);
...@@ -150,11 +150,11 @@ public class MenuInit { ...@@ -150,11 +150,11 @@ public class MenuInit {
addDefaultFunctionMenu(2, poutOut,"PN出库", "tacticsOuput", "neolight/tacticsOuput/index", "tacticsOuput",DEFAULT_SHOW_MENU); addDefaultFunctionMenu(2, poutOut,"PN出库", "tacticsOuput", "neolight/tacticsOuput/index", "tacticsOuput",DEFAULT_SHOW_MENU);
addDefaultFunctionMenu(3,poutOut,"工单出库","workOrder", "neolight/workOrder/index","orderOut",DEFAULT_SHOW_MENU); addDefaultFunctionMenu(3,poutOut,"工单出库","workOrder", "neolight/workOrder/index","orderOut",DEFAULT_SHOW_MENU);
addDefaultFunctionMenu(4,poutOut,"工单","orderkanban", "orderkanban/index","kanban"); // addDefaultFunctionMenu(4,poutOut,"工单","orderkanban", "orderkanban/index","kanban");
addDefaultFunctionMenu(5,poutOut,"库位出库", "posOutput", "system/posOutput/index", "swagger"); addDefaultFunctionMenu(5,poutOut,"库位出库", "posOutput", "system/posOutput/index", "swagger");
addDefaultFunctionMenu(6, poutOut, "物料标签", "labelOuput", "neolight/labelOuput/index", "mgroup"); addDefaultFunctionMenu(6, poutOut, "物料标签", "labelOuput", "neolight/labelOuput/index", "mgroup");
addDefaultFunctionMenu(7, poutOut, "料盒操作", "materialBox", "neolight/materialBox/index", "mIbox"); addDefaultFunctionMenu(7, poutOut, "料盒操作", "materialBox", "neolight/materialBox/index", "mIbox");
addDefaultFunctionMenu(8, poutOut, "出库策略", "outSetting", "system/outSetting/index", "outSet",DEFAULT_SHOW_MENU); // addDefaultFunctionMenu(8, poutOut, "出库策略", "outSetting", "system/outSetting/index", "outSet",DEFAULT_SHOW_MENU);
// Menu orderSet = new Menu(, "orderSetting", "工单设置", "orderSetting", "system/orderSetting/index", "sysSet"); // Menu orderSet = new Menu(, "orderSetting", "工单设置", "orderSetting", "system/orderSetting/index", "sysSet");
addDefaultFunctionMenu(9, poutOut, "入库单", "inList", "system/inList/index", "headIcon"); addDefaultFunctionMenu(9, poutOut, "入库单", "inList", "system/inList/index", "headIcon");
addDefaultFunctionMenu(10, poutOut, "物料入库", "putIn", "system/putIn/index", "headIcon"); addDefaultFunctionMenu(10, poutOut, "物料入库", "putIn", "system/putIn/index", "headIcon");
...@@ -163,7 +163,7 @@ public class MenuInit { ...@@ -163,7 +163,7 @@ public class MenuInit {
// addDefaultFunctionMenu(12, poutOut, "单盘入库", "singleDiskWarehousing", "system/singleDiskWarehousing/index", "headIcon"); // addDefaultFunctionMenu(12, poutOut, "单盘入库", "singleDiskWarehousing", "system/singleDiskWarehousing/index", "headIcon");
addDefaultFunctionMenu(13, poutOut, "呆滞物料", "sluggishMaterials", "system/sluggishMaterials/index", "sMaterial"); addDefaultFunctionMenu(13, poutOut, "呆滞物料", "sluggishMaterials", "system/sluggishMaterials/index", "sMaterial");
//addDefaultFunctionMenu(16, poutOut,"生成工单", "createOrder", "system/createOrder/index", "createOrder"); //addDefaultFunctionMenu(16, poutOut,"生成工单", "createOrder", "system/createOrder/index", "createOrder");
addDefaultFunctionMenu(91,poutOut, "共享文件夹", "orderSetting", "system/orderSetting/index", "sysSet",DEFAULT_SHOW_MENU); // addDefaultFunctionMenu(91,poutOut, "共享文件夹", "orderSetting", "system/orderSetting/index", "sysSet",DEFAULT_SHOW_MENU);
//MSD管理:MSD库存.MSD追溯性.MSD设置 //MSD管理:MSD库存.MSD追溯性.MSD设置
...@@ -181,6 +181,7 @@ public class MenuInit { ...@@ -181,6 +181,7 @@ public class MenuInit {
addDefaultFunctionMenu(34,solderPaste, "设置", "solderPasteSetting", "neolight/solderPasteSetting/index","system",SP_SHOW_MENU); addDefaultFunctionMenu(34,solderPaste, "设置", "solderPasteSetting", "neolight/solderPasteSetting/index","system",SP_SHOW_MENU);
addDefaultFunctionMenu(35,solderPaste, "过期锡膏", "expireSolderPaste", "neolight/expireSolderPaste/index","sMaterial",SP_SHOW_MENU); addDefaultFunctionMenu(35,solderPaste, "过期锡膏", "expireSolderPaste", "neolight/expireSolderPaste/index","sMaterial",SP_SHOW_MENU);
addDefaultFunctionMenu(73, solderPaste,"温湿度", "spHumiture", "humiture/spHumitureReport/index", "humiture");
//档案管理:元器件 //档案管理:元器件
Menu pMenuWl = Menu.CreatePMenu("档案管理", 6, "materiel ", "BOM",null); Menu pMenuWl = Menu.CreatePMenu("档案管理", 6, "materiel ", "BOM",null);
...@@ -189,13 +190,16 @@ public class MenuInit { ...@@ -189,13 +190,16 @@ public class MenuInit {
//条形码:条码管理,条码设置 //条形码:条码管理,条码设置
Menu pMenuBarcode = Menu.CreatePMenu("条形码", 7, "barcodes", "barcodeMenu",null); Menu pMenuBarcode = Menu.CreatePMenu("条形码", 7, "barcodes", "barcodeMenu",null);
addDefaultFunctionMenu(51,pMenuBarcode, "条码管理", "barcode", "barcode/barcode/index","chart",DEFAULT_SHOW_MENU); addDefaultFunctionMenu(51,pMenuBarcode, "条码管理", "barcode", "barcode/barcode/index","chart",DEFAULT_SHOW_MENU);
addDefaultFunctionMenu(52, pMenuBarcode, "条码设置","barcodeSetting", "system/barcodeSetting/index", "barcode",DEFAULT_SHOW_MENU); addDefaultFunctionMenu(52, pMenuBarcode, "条码规则","barcodeSetting", "system/barcodeSetting/index", "barcode",DEFAULT_SHOW_MENU);
//日志管理:物料日志 //日志管理:物料日志
Menu pMenuLog = Menu.CreatePMenu("日志管理", 8, "log","log",null); Menu pMenuLog = Menu.CreatePMenu("日志管理", 8, "log","log",null);
addDefaultFunctionMenu(61, pMenuLog, "物料日志", "taskLog", "neolight/taskLog/index", "education",DEFAULT_SHOW_MENU); addDefaultFunctionMenu(61, pMenuLog, "物料日志", "taskLog", "neolight/taskLog/index", "education",DEFAULT_SHOW_MENU);
addDefaultFunctionMenu(62, pMenuLog, "消息查询", "message", "neolight/message/index", "messagefind",DEFAULT_SHOW_MENU); addDefaultFunctionMenu(62, pMenuLog, "消息查询", "message", "neolight/message/index", "messagefind",DEFAULT_SHOW_MENU);
addDefaultFunctionMenu(63, pMenuLog, "接口异常", "interfaceException", "neolight/interfaceException/index", "messagefind"); addDefaultFunctionMenu(63, pMenuLog, "日志监控", "logMonitor", "neolight/logMonitor/index", "logMonitor");
addDefaultFunctionMenu(64, pMenuLog, "物料追溯", "materialTrace", "neolight/materialTrace/index", "trace");
//暂未找到页面
// addDefaultFunctionMenu(63, pMenuLog, "接口异常", "interfaceException", "neolight/interfaceException/index", "messagefind");
//报表:出入库、库存 //报表:出入库、库存
Menu pMenuReport = Menu.CreatePMenu("报表", 9, "report","inOutData",null); Menu pMenuReport = Menu.CreatePMenu("报表", 9, "report","inOutData",null);
...@@ -205,7 +209,7 @@ public class MenuInit { ...@@ -205,7 +209,7 @@ public class MenuInit {
addDefaultFunctionMenu(71, pMenuReport, "出入库", "inOutDataCount", "neolight/inOutDataCount/index", "outPut",DEFAULT_SHOW_MENU); addDefaultFunctionMenu(71, pMenuReport, "出入库", "inOutDataCount", "neolight/inOutDataCount/index", "outPut",DEFAULT_SHOW_MENU);
addDefaultFunctionMenu(72, pMenuReport,"库存", "inventory", "neolight/inventory/index", "inventory"); addDefaultFunctionMenu(72, pMenuReport,"库存", "inventory", "neolight/inventory/index", "inventory");
addDefaultFunctionMenu(73, pMenuReport,"温湿度", "humiture", "humiture/humitureReport/index", "humiture"); addDefaultFunctionMenu(73, pMenuReport,"温湿度", "humiture", "humiture/humitureReport/index", "humiture");
addDefaultFunctionMenu(73, pMenuReport,"温湿度", "spHumiture", "humiture/spHumitureReport/index", "humiture"); // addDefaultFunctionMenu(73, pMenuReport,"温湿度", "spHumiture", "humiture/spHumitureReport/index", "humiture");
addDefaultFunctionMenu(74,pMenuReport, "安全库存", "safetyInventory", "system/safetyInventory/index", "safeInventory"); addDefaultFunctionMenu(74,pMenuReport, "安全库存", "safetyInventory", "system/safetyInventory/index", "safeInventory");
addDefaultFunctionMenu(75, pMenuReport,"过期物料", "expireMaterials", "system/expireMaterials/index", "sMaterial"); addDefaultFunctionMenu(75, pMenuReport,"过期物料", "expireMaterials", "system/expireMaterials/index", "sMaterial");
addDefaultFunctionMenu(81,pMenuReport, "物料追踪", "materialChart", "neolight/materialChart/index", "maChart"); addDefaultFunctionMenu(81,pMenuReport, "物料追踪", "materialChart", "neolight/materialChart/index", "maChart");
...@@ -229,11 +233,14 @@ public class MenuInit { ...@@ -229,11 +233,14 @@ public class MenuInit {
addDefaultFunctionMenu(103, poutSet, "菜单管理", "menu", "system/menu/index", "menu"); addDefaultFunctionMenu(103, poutSet, "菜单管理", "menu", "system/menu/index", "menu");
// Menu sysSetting = new Menu(, "barcode", "条码设置", "barcodeSetting", "system/barcodeSetting/index", "database"); // Menu sysSetting = new Menu(, "barcode", "条码设置", "barcodeSetting", "system/barcodeSetting/index", "database");
// Menu outSet = new Menu(, "outSetting", "出库策略", "outSetting", "system/outSetting/index", "outSet"); // Menu outSet = new Menu(, "outSetting", "出库策略", "outSetting", "system/outSetting/index", "outSet");
addDefaultFunctionMenu(104,poutSet, "系统设置", "sysSetting", "system/sysSetting/index", "sysSet",DEFAULT_SHOW_MENU); addDefaultFunctionMenu(104,poutSet, "系统设置", "sysSetting", "system/sysSetting/index", "sysSet",DEFAULT_SHOW_MENU);
addDefaultFunctionMenu(105,poutSet, "资源翻译", "translation", "system/translation/index", "translation"); addDefaultFunctionMenu(105,poutSet, "资源翻译", "translation", "system/translation/index", "translation");
// Menu orderSet = new Menu(, "orderSetting", "工单设置", "orderSetting", "system/orderSetting/index", "sysSet"); // Menu orderSet = new Menu(, "orderSetting", "工单设置", "orderSetting", "system/orderSetting/index", "sysSet");
addDefaultFunctionMenu(106,poutSet, "料架设置", "shelfSetting", "system/shelfSetting/index", "translation",NL_SHOW_MENU); addDefaultFunctionMenu(106,poutSet, "料架设置", "shelfSetting", "system/shelfSetting/index", "translation",NL_SHOW_MENU);
addDefaultFunctionMenu(107,poutSet, "其他设备", "storageOther", "storage/storageOther/index", "storageOther"); addDefaultFunctionMenu(107,poutSet, "其他设备", "storageOther", "storage/storageOther/index", "storageOther");
addDefaultFunctionMenu(108, poutSet, "出库策略", "outSetting", "system/outSetting/index", "outSet",DEFAULT_SHOW_MENU);
addDefaultFunctionMenu(109,poutSet, "工单设置", "orderSetting", "system/orderSetting/index", "sysSet",DEFAULT_SHOW_MENU);
Menu helpAbout = Menu.CreatePMenu("帮助", 9999, "help", "help",null); Menu helpAbout = Menu.CreatePMenu("帮助", 9999, "help", "help",null);
addDefaultFunctionMenu(99991, helpAbout, "说明书", "instruction", "system/instruction/index","aboutBook"); addDefaultFunctionMenu(99991, helpAbout, "说明书", "instruction", "system/instruction/index","aboutBook");
......
...@@ -169,6 +169,12 @@ public class Constants { ...@@ -169,6 +169,12 @@ public class Constants {
public static final String CACHE_spSettings="spSettings"; public static final String CACHE_spSettings="spSettings";
/** /**
*锡膏料仓回温完成后自动搅拌,默认=false,需要手动点按钮开始搅拌。true=自动开始搅拌
*/
public static final String CACHE_SP_AUTO_START_MIXED="CACHE_SP_AUTO_START_MIXED";
/**
* 缺料不自动关闭工单 * 缺料不自动关闭工单
*/ */
public static final String CACHE_closeWorkOrder = "CACHE_closeWorkOrder"; public static final String CACHE_closeWorkOrder = "CACHE_closeWorkOrder";
......
...@@ -28,6 +28,7 @@ import org.apache.logging.log4j.util.Strings; ...@@ -28,6 +28,7 @@ import org.apache.logging.log4j.util.Strings;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.io.*; import java.io.*;
import java.net.InetAddress;
import java.net.URI; import java.net.URI;
import java.net.URL; import java.net.URL;
import java.net.URLConnection; import java.net.URLConnection;
...@@ -148,6 +149,9 @@ public class HttpHelper { ...@@ -148,6 +149,9 @@ public class HttpHelper {
return postJsonWithAuth(url, params, null); return postJsonWithAuth(url, params, null);
} }
public static String postJsonWithAuth(String url, Object params, String auth) throws ApiException { public static String postJsonWithAuth(String url, Object params, String auth) throws ApiException {
return postJsonWithAuth(url,params,auth,CONNECTION_TIMEOUT,READ_DATA_TIMEOUT);
}
public static String postJsonWithAuth(String url, Object params, String auth,int conTimeout,int socketTimeout) throws ApiException {
String requestBody = ""; String requestBody = "";
// 设置请求参数 // 设置请求参数
...@@ -171,6 +175,16 @@ public class HttpHelper { ...@@ -171,6 +175,16 @@ public class HttpHelper {
if (auth != null && !auth.isEmpty()) { if (auth != null && !auth.isEmpty()) {
httpPost.addHeader("Authorization", auth); httpPost.addHeader("Authorization", auth);
} }
if(conTimeout>0&&socketTimeout>0){
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(conTimeout) // 设置连接超时时间为3秒
.setSocketTimeout(socketTimeout) // 设置请求超时时间为3秒
.build();
httpPost.setConfig(requestConfig);
}
httpPost.setEntity(new StringEntity(requestBody, CONTENT_CHARSET)); httpPost.setEntity(new StringEntity(requestBody, CONTENT_CHARSET));
httpClient = HttpClients.createDefault(); httpClient = HttpClients.createDefault();
response = httpClient.execute(httpPost); response = httpClient.execute(httpPost);
...@@ -452,6 +466,59 @@ public class HttpHelper { ...@@ -452,6 +466,59 @@ public class HttpHelper {
} }
} }
public static Map<String,Object> getJsonResult(String url, Object params,int timeoutMS) throws ApiException {
// 设置请求参数
if (params != null) {
try {
ObjectMapper mapper = new ObjectMapper();
String requestBody = mapper.writeValueAsString(params);
List<NameValuePair> nameValuePairs = new LinkedList<>();
nameValuePairs.add(new BasicNameValuePair("JSON", requestBody));
String paramStr = EntityUtils.toString(new UrlEncodedFormEntity(nameValuePairs));
url = appendString(url, paramStr);
// url=url+"?JSON="+requestBody;
} catch (Exception e) {
throw new ApiException("getJson append params to [" + url + "] exception:" + e.getMessage());
}
}
CloseableHttpClient httpClient = null;
CloseableHttpResponse response = null;
try {
HttpGet httpGet = new HttpGet(url);
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(timeoutMS).build();
httpGet.setConfig(requestConfig);
httpGet.addHeader("Content-Type", "application/json;charset=utf-8");
httpClient = HttpClients.createDefault();
response = httpClient.execute(httpGet);
int code = response.getStatusLine().getStatusCode();
HttpEntity entity = response.getEntity();
String responseContent = EntityUtils.toString(entity, CONTENT_CHARSET);
Map<String,Object> resultMap=new HashMap<>();
resultMap.put("code",code);
resultMap.put("responseContent",responseContent);
return resultMap;
//response.close();
//httpClient.close();
// return responseContent;
} catch (Exception e) {
throw new ApiException("Request to [" + url + "] failed:" + e.getMessage());
} finally {
try {
if (response != null) {
response.close();
}
if (httpClient != null) {
httpClient.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static String getJson(String url, Object params) throws ApiException { public static String getJson(String url, Object params) throws ApiException {
// 设置请求参数 // 设置请求参数
if (params != null) { if (params != null) {
...@@ -637,5 +704,17 @@ public class HttpHelper { ...@@ -637,5 +704,17 @@ public class HttpHelper {
stringBuffer.append(paramStr); stringBuffer.append(paramStr);
return stringBuffer.toString(); return stringBuffer.toString();
} }
public static boolean pingIP(String ipAddress, int timeout) {
try {
InetAddress address = InetAddress.getByName(ipAddress);
if (address.isReachable(timeout)) {
return true;
}
} catch (Exception e) {
log.error(e.toString());
}
return false;
}
} }
...@@ -6,21 +6,20 @@ import com.neotel.smfcore.common.exception.ValidateException; ...@@ -6,21 +6,20 @@ import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.security.service.po.User; import com.neotel.smfcore.security.service.po.User;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList; import java.util.*;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
@Slf4j @Slf4j
public class UserCodeUtil { public class UserCodeUtil {
public static void main(String[] args) { public static void main(String[] args)
{
// FilePro(); // FilePro();
CreateUserCode( ); CreateUserCode( );
} }
public static void CreateUserCode( ) { public static void CreateUserCode( ) {
try { try {
String filePath = "F:\\"; String filePath = "F:\\";
String fileName="用户.csv"; String fileName="2024-11-20 09_24_35-.csv";
List<User> list = ReadFile(filePath+fileName); List<User> list = ReadFile(filePath+fileName);
//创建验证码 //创建验证码
for (int i = 0; i < list.size(); i++ for (int i = 0; i < list.size(); i++
...@@ -29,7 +28,7 @@ public class UserCodeUtil { ...@@ -29,7 +28,7 @@ public class UserCodeUtil {
list.get(i).setCheckCode(code); list.get(i).setCheckCode(code);
} }
String targetFile=filePath+"更新后_"+fileName; String targetFile=filePath+"New_"+fileName;
if(FileUtil.exist(targetFile)){ if(FileUtil.exist(targetFile)){
FileUtil.del(targetFile); FileUtil.del(targetFile);
} }
...@@ -43,7 +42,9 @@ public class UserCodeUtil { ...@@ -43,7 +42,9 @@ public class UserCodeUtil {
// //
// writer.writeRecord(userStr); // writer.writeRecord(userStr);
// } // }
String[] headers=new String[]{"用户ID","用户名", "状态", "创建日期","启用码"}; // String[] headers=new String[]{"用户ID","用户名", "状态", "创建日期","启用码"};
//ID User Name Satus Create Time Enable Code
String[] headers=new String[]{"ID","User Name", "Satus", "Create Time","Enable Code"};
writer.writeRecord(headers); writer.writeRecord(headers);
for (User user : for (User user :
list) { list) {
...@@ -69,6 +70,9 @@ public class UserCodeUtil { ...@@ -69,6 +70,9 @@ public class UserCodeUtil {
} }
protected static List<User> ReadFile(String fileURL ) throws Exception protected static List<User> ReadFile(String fileURL ) throws Exception
{ {
// ID UserName Enable CreateDate CheckCode
String[] headers=new String[]{"ID","User Name", "Satus", "Create Time","Enable Code"};
List<User> list=new ArrayList<User>(); List<User> list=new ArrayList<User>();
CsvReader csvRead = CsvReader.newReader(fileURL,"用户ID","ID"); CsvReader csvRead = CsvReader.newReader(fileURL,"用户ID","ID");
...@@ -107,7 +111,7 @@ public class UserCodeUtil { ...@@ -107,7 +111,7 @@ public class UserCodeUtil {
String langu=""; String langu="";
String roleId=""; String roleId="";
User user=new User(username,email,langu,roleId,"",true User user=new User(username,email,langu,roleId,"",true
,false,new Date(),new HashSet<>(),""); ,false,new Date(),new HashSet<>(),"","");
user.setId(id); user.setId(id);
user.setCreateDate(createData); user.setCreateDate(createData);
list.add(user); list.add(user);
......
package com.neotel.smfcore.core.apiInteraction.bean.query; package com.neotel.smfcore.core.apiInteraction.bean.query;
import com.neotel.smfcore.common.annotation.QueryCondition;
import com.neotel.smfcore.common.bean.BetweenData;
import com.neotel.smfcore.core.apiInteraction.enums.ApiInteraction_Status; import com.neotel.smfcore.core.apiInteraction.enums.ApiInteraction_Status;
import lombok.Data; import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date; import java.util.Date;
@Data @Data
public class ApiInteractionQuery { public class ApiInteractionQuery {
@QueryCondition(blurry = "url,param,result")
private String blurry;
@QueryCondition(type = QueryCondition.Type.BETWEEN, propName = "createDate")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private BetweenData<Date> createDate;
@QueryCondition
private Date requestDate; private Date requestDate;
//private String url; //private String url;
...@@ -15,7 +25,9 @@ public class ApiInteractionQuery { ...@@ -15,7 +25,9 @@ public class ApiInteractionQuery {
//private String param; //private String param;
//private String result; //private String result;
@QueryCondition
private String status = ApiInteraction_Status.OK; private String status ="";
@QueryCondition
private String type="";
} }
package com.neotel.smfcore.core.apiInteraction.controller; package com.neotel.smfcore.core.apiInteraction.controller;
import com.google.common.collect.Lists;
import com.neotel.smfcore.common.base.IExcelDownLoad;
import com.neotel.smfcore.common.bean.PageData; import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.common.utils.QueryHelp; import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.core.apiInteraction.bean.query.ApiInteractionQuery; import com.neotel.smfcore.core.apiInteraction.bean.query.ApiInteractionQuery;
import com.neotel.smfcore.core.apiInteraction.service.manager.IApiInteractionManager; import com.neotel.smfcore.core.apiInteraction.service.manager.IApiInteractionManager;
import com.neotel.smfcore.core.apiInteraction.service.po.ApiInteraction;
import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.security.annotation.AnonymousAccess; import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -13,6 +19,13 @@ import org.springframework.data.mongodb.core.query.Query; ...@@ -13,6 +19,13 @@ import org.springframework.data.mongodb.core.query.Query;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
@Slf4j @Slf4j
@RequestMapping("/apiInteraction") @RequestMapping("/apiInteraction")
@RestController @RestController
...@@ -26,7 +39,45 @@ public class ApiInteractionController { ...@@ -26,7 +39,45 @@ public class ApiInteractionController {
@AnonymousAccess @AnonymousAccess
public PageData list(ApiInteractionQuery query, Pageable pageable){ public PageData list(ApiInteractionQuery query, Pageable pageable){
Query q = QueryHelp.getQuery(query); Query q = QueryHelp.getQuery(query);
return apiInteractionManager.findByPage(q,pageable); PageData<ApiInteraction> result= apiInteractionManager.findByPage(q,pageable);
return result;
}
@ApiOperation("接口记录导出")
@RequestMapping("/download")
@AnonymousAccess
public void download(ApiInteractionQuery query, Pageable pageable, HttpServletResponse response, HttpServletRequest request)throws IOException {
Query q = QueryHelp.getQuery(query);
FileUtil.downloadExcel(q, pageable, response, new IExcelDownLoad() {
@Override
public List<List<String>> getHeader() {
List<List<String>> header = new ArrayList<>();
Locale locale = request.getLocale();
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.equipApiMsg.updateTime", locale, "时间")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.equipApiMsg.request", locale, "参数")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.equipApiMsg.response", locale, "结果")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.equipApiMsg.url", locale, "地址")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.equipApiMsg.state", locale, "状态")));
return header;
} }
@Override
public List<List<Object>> getPageData(Query query, Pageable pageable) {
PageData<ApiInteraction> apiInfoList = apiInteractionManager.findByPage(q,pageable);
List<List<Object>> dataList = new ArrayList<>();
for (ApiInteraction obj : apiInfoList.getContent()) {
List<Object> data = new ArrayList<>();
data.add(DateUtil.toDateString(obj.getRequestDate()));
data.add(obj.getParam());
data.add(obj.getResult());
data.add(obj.getUrl());
data.add(obj.getStatus());
dataList.add(data);
}
return dataList;
}
});
}
} }
...@@ -2,6 +2,7 @@ package com.neotel.smfcore.core.apiInteraction.service.po; ...@@ -2,6 +2,7 @@ package com.neotel.smfcore.core.apiInteraction.service.po;
import com.neotel.smfcore.common.base.BasePo; import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.core.apiInteraction.enums.ApiInteraction_Status; import com.neotel.smfcore.core.apiInteraction.enums.ApiInteraction_Status;
import com.neotel.smfcore.core.equipment.enums.EquipmentType;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
...@@ -14,6 +15,17 @@ import java.util.Date; ...@@ -14,6 +15,17 @@ import java.util.Date;
@NoArgsConstructor @NoArgsConstructor
public class ApiInteraction extends BasePo implements Serializable { public class ApiInteraction extends BasePo implements Serializable {
public ApiInteraction(Date date,String url,String param,String result,String status){
this.requestDate=date;
this.url=url;
this.param=param;
this.result=result;
this.status=status;
this.type=EquipmentType.NEXIM.name();
}
private Date requestDate; private Date requestDate;
private String url; private String url;
...@@ -23,4 +35,7 @@ public class ApiInteraction extends BasePo implements Serializable { ...@@ -23,4 +35,7 @@ public class ApiInteraction extends BasePo implements Serializable {
private String result; private String result;
private String status = ApiInteraction_Status.OK; private String status = ApiInteraction_Status.OK;
//设备类型,nexim,hanwa,pancim
private String type="";
} }
package com.neotel.smfcore.core.barcode.bean;
import lombok.Data;
@Data
public class BarcodeRuleDetail {
private String id;
private String ruleName;
private String rule;
}
package com.neotel.smfcore.core.barcode.rest; package com.neotel.smfcore.core.barcode.rest;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.neotel.smfcore.common.bean.PageData; import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.bean.ResultBean; import com.neotel.smfcore.common.bean.ResultBean;
...@@ -7,9 +9,12 @@ import com.neotel.smfcore.common.csv.CsvReader; ...@@ -7,9 +9,12 @@ import com.neotel.smfcore.common.csv.CsvReader;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.FileUtil; import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.common.utils.QueryHelp; import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.barcode.bean.BarcodeRule; import com.neotel.smfcore.core.barcode.bean.BarcodeRule;
import com.neotel.smfcore.core.barcode.bean.BarcodeRuleDetail;
import com.neotel.smfcore.core.barcode.bean.CodeBean; 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.BarcodeDto;
import com.neotel.smfcore.core.barcode.rest.bean.dto.BarcodeRuleDetailDto;
import com.neotel.smfcore.core.barcode.rest.bean.dto.BarcodeRuleDto; import com.neotel.smfcore.core.barcode.rest.bean.dto.BarcodeRuleDto;
import com.neotel.smfcore.core.barcode.rest.bean.mapstruct.BarcodeMapper; import com.neotel.smfcore.core.barcode.rest.bean.mapstruct.BarcodeMapper;
import com.neotel.smfcore.core.barcode.rest.bean.query.BarcodeQueryCriteria; import com.neotel.smfcore.core.barcode.rest.bean.query.BarcodeQueryCriteria;
...@@ -39,10 +44,7 @@ import org.springframework.web.multipart.MultipartFile; ...@@ -39,10 +44,7 @@ import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Slf4j @Slf4j
@RestController @RestController
...@@ -123,9 +125,34 @@ public class BarcodeController { ...@@ -123,9 +125,34 @@ public class BarcodeController {
public BarcodeRuleDto getRules() { public BarcodeRuleDto getRules() {
Settings settings = dataCache.getSettings(); Settings settings = dataCache.getSettings();
BarcodeRuleDto ruleDto = new BarcodeRuleDto(); BarcodeRuleDto ruleDto = new BarcodeRuleDto();
ruleDto.setCodeRuleList(settings.getCodeRuleList()); List<String> codeRuleList = settings.getCodeRuleList();
ruleDto.setCodeRuleList(codeRuleList);
ruleDto.setPageHeight(settings.getPageHeight()); ruleDto.setPageHeight(settings.getPageHeight());
ruleDto.setPageWidth(settings.getPageWidth()); ruleDto.setPageWidth(settings.getPageWidth());
//兼容以前的
Map<String, BarcodeRuleDetail> barcodeRuleMap = settings.getBarcodeRuleMap();
if (barcodeRuleMap.isEmpty()) {
if (codeRuleList != null && !codeRuleList.isEmpty()) {
for (String codeRule : codeRuleList) {
BarcodeRuleDetail detail = new BarcodeRuleDetail();
detail.setId(RandomUtil.randomString(10));
detail.setRule(codeRule);
barcodeRuleMap.put(detail.getId(),detail);
}
}
settings.setBarcodeRuleMap(barcodeRuleMap);
dataCache.updateSettings(settings);
}
List<BarcodeRuleDetailDto> detailList = new ArrayList<>();
for (BarcodeRuleDetail detail : barcodeRuleMap.values()) {
BarcodeRuleDetailDto dto = new BarcodeRuleDetailDto();
dto.setId(detail.getId());
dto.setRule(detail.getRule());
dto.setRuleName(detail.getRuleName());
detailList.add(dto);
}
ruleDto.setCodeRuleDetailList(detailList);
return ruleDto; return ruleDto;
} }
...@@ -152,6 +179,25 @@ public class BarcodeController { ...@@ -152,6 +179,25 @@ public class BarcodeController {
settings.setCodeRuleList(params.getCodeRuleList()); settings.setCodeRuleList(params.getCodeRuleList());
settings.setPageHeight(params.getPageHeight()); settings.setPageHeight(params.getPageHeight());
settings.setPageWidth(params.getPageWidth()); settings.setPageWidth(params.getPageWidth());
Map<String, BarcodeRuleDetail> barcodeRuleMap = new HashMap<>();
List<BarcodeRuleDetailDto> codeRuleDetailList = params.getCodeRuleDetailList();
if(codeRuleDetailList != null && !codeRuleDetailList.isEmpty()) {
for (BarcodeRuleDetailDto detailDto : codeRuleDetailList) {
String id = detailDto.getId();
if (StringUtils.isEmpty(id)) {
id = RandomUtil.randomString(10);
}
BarcodeRuleDetail detail = new BarcodeRuleDetail();
detail.setRule(detailDto.getRule());
detail.setRuleName(detailDto.getRuleName());
detail.setId(detailDto.getId());
barcodeRuleMap.put(id, detail);
}
}
settings.setBarcodeRuleMap(barcodeRuleMap);
dataCache.updateSettings(settings); dataCache.updateSettings(settings);
//修改设置 //修改设置
return new ResponseEntity<>(HttpStatus.OK); return new ResponseEntity<>(HttpStatus.OK);
...@@ -189,9 +235,12 @@ public class BarcodeController { ...@@ -189,9 +235,12 @@ public class BarcodeController {
@ApiOperation("根据条码信息获取条码规则") @ApiOperation("根据条码信息获取条码规则")
@PostMapping(value = "getBarcodeRule") @PostMapping(value = "getBarcodeRule")
@AnonymousAccess //@AnonymousAccess
public ResultBean getBarcodeRule(@RequestBody Map<String, String> paramMap) { public ResultBean getBarcodeRule(@RequestBody Map<String, String> paramMap) {
String codeStr = paramMap.get("codeStr"); String codeStr = paramMap.get("codeStr");
if(ObjectUtil.isEmpty(codeStr)){
throw new ValidateException("smfcore.valueCanotNull","{0}不能为空",new String[]{"codeStr"} );
}
paramMap.remove("codeStr"); paramMap.remove("codeStr");
String ruleStr = BarcodeRule.toCodeRule(codeStr, paramMap); String ruleStr = BarcodeRule.toCodeRule(codeStr, paramMap);
return ResultBean.newOkResult(ruleStr); return ResultBean.newOkResult(ruleStr);
...@@ -200,18 +249,52 @@ public class BarcodeController { ...@@ -200,18 +249,52 @@ public class BarcodeController {
@ApiOperation("获取条码内容") @ApiOperation("获取条码内容")
@PostMapping("/getBarCodeInfo") @PostMapping("/getBarCodeInfo")
@AnonymousAccess //@AnonymousAccess
public ResultBean getBarCodeInfo(@RequestBody Map<String, String> paramMap) { public ResultBean getBarCodeInfo(@RequestBody Map<String, String> paramMap) {
//获取条码内容 //获取条码内容
String codeStr = paramMap.get("code"); String codeStr = paramMap.get("code");
List<BarcodeRule> barcodeRuleList = codeResolve.getBarcodeRuleList(); if (ObjectUtil.isEmpty(codeStr)) {
if (barcodeRuleList != null && !barcodeRuleList.isEmpty()) { codeStr = "";
for (BarcodeRule barcodeRule : barcodeRuleList) { }
Settings settings = dataCache.getSettings();
Map<String, BarcodeRuleDetail> barcodeRuleMap = settings.getBarcodeRuleMap();
if (barcodeRuleMap != null && !barcodeRuleMap.isEmpty()) {
for (BarcodeRuleDetail detail : barcodeRuleMap.values()) {
String rule = detail.getRule();
if (StringUtils.isNotEmpty(rule)) {
BarcodeRule barcodeRule = BarcodeRule.newRule(rule);
CodeBean codeBean = barcodeRule.toCodeBean(codeStr); CodeBean codeBean = barcodeRule.toCodeBean(codeStr);
if (codeBean.getBarcode() != null) { if (codeBean.getBarcode() != null) {
return ResultBean.newOkResult(codeBean.getBarcode()); Barcode barcode = codeBean.getBarcode();
BarcodeDto barcodeDto = barcodeMapper.toDto(barcode);
barcodeDto.setOtherField1(detail.getRuleName());
return ResultBean.newOkResult(barcodeDto);
} }
} }
}
} else {
return ResultBean.newErrorResult(1, "smfcore.error.barcode.noRules", "解析规则未定义");
}
return ResultBean.newErrorResult(1, "smfcore.error.barcode.invalid", "未找到有效条码");
}
@ApiOperation("获取条码内容(传入条码规则)")
@PostMapping("/getBarCodeInfoByRule")
@AnonymousAccess
public ResultBean getBarCodeInfoByRule(@RequestBody Map<String, String> paramMap) {
//获取条码内容
String codeStr = paramMap.get("code");
if(ObjectUtil.isEmpty(codeStr)){
codeStr="";
}
//传入的条码规则
String ruleStr = paramMap.get("rule");
BarcodeRule barcodeRule = BarcodeRule.newRule(ruleStr);
if (barcodeRule.isValidRule()){
CodeBean codeBean = barcodeRule.toCodeBean(codeStr);
if (codeBean.getBarcode() != null) {
return ResultBean.newOkResult(codeBean.getBarcode());
}
} else { } else {
return ResultBean.newErrorResult(1, "smfcore.error.barcode.noRules", "解析规则未定义"); return ResultBean.newErrorResult(1, "smfcore.error.barcode.noRules", "解析规则未定义");
} }
......
package com.neotel.smfcore.core.barcode.rest.bean.dto;
import com.neotel.smfcore.core.barcode.bean.BarcodeRuleDetail;
import lombok.Data;
@Data
public class BarcodeRuleDetailDto extends BarcodeRuleDetail {
}
...@@ -22,4 +22,7 @@ public class BarcodeRuleDto implements Serializable { ...@@ -22,4 +22,7 @@ public class BarcodeRuleDto implements Serializable {
@ApiModelProperty("打印条码的纸张高度") @ApiModelProperty("打印条码的纸张高度")
private int pageHeight = 160; private int pageHeight = 160;
@ApiModelProperty("具体规则详情")
private List<BarcodeRuleDetailDto> codeRuleDetailList = Lists.newArrayList();
} }
...@@ -763,6 +763,9 @@ public class StatusBean { ...@@ -763,6 +763,9 @@ public class StatusBean {
} else if (msg.startsWith("W=")) { } else if (msg.startsWith("W=")) {
msgType = MessageType.WARNING.name(); msgType = MessageType.WARNING.name();
msg = msg.substring(2); msg = msg.substring(2);
} else if (msg.startsWith("C=")){
msgType = MessageType.CRITICAL.name();
msg = msg.substring(2);
} }
if (msgArray.length == 1) { if (msgArray.length == 1) {
......
...@@ -31,6 +31,7 @@ import com.neotel.smfcore.core.storage.service.manager.IStorageManager; ...@@ -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.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.StoragePos; 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.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.AlarmInfo;
import com.neotel.smfcore.core.system.service.po.DataLog; import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil; import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
...@@ -82,6 +83,9 @@ public class DeviceController { ...@@ -82,6 +83,9 @@ public class DeviceController {
@Autowired @Autowired
private IBarcodeManager barcodeManager; private IBarcodeManager barcodeManager;
@Autowired
private IDataLogManager dataLogManager;
/** /**
* 权限验证API列表 * 权限验证API列表
*/ */
...@@ -423,9 +427,15 @@ public class DeviceController { ...@@ -423,9 +427,15 @@ public class DeviceController {
boolean cancelResult = taskService.cancelTask(task.getId()); boolean cancelResult = taskService.cancelTask(task.getId());
log.info("客户端取消["+codeStr+"]的未执行完成的出库任务结果:" + cancelResult); log.info("客户端取消["+codeStr+"]的未执行完成的出库任务结果:" + cancelResult);
return ResultBean.newOkResult(cancelResult); return ResultBean.newOkResult(cancelResult);
}else{ } else {
if (!task.isFinished() && !task.isCancel()) {
return ResultBean.newErrorResult(2005, "smfcore.cancelOutTask.taskHasEnd","客户端取消入库任务[{0}]失败:任务已结束或已取消", new String[]{codeStr }); log.info(task.getBarcode()+",库位号为:"+task.getPosName()+",状态为:"+task.getStatus()+"改成关闭状态");
task.setClosed(true);
dataLogManager.save(task);
taskService.removeFinishedTask(task);
} else {
return ResultBean.newErrorResult(2005, "smfcore.cancelOutTask.taskHasEnd", "客户端取消入库任务[{0}]失败:任务已结束或已取消", new String[]{codeStr});
}
} }
// else{ // else{
// //禁用库位 // //禁用库位
......
package com.neotel.smfcore.core.equipment.enums; package com.neotel.smfcore.core.equipment.enums;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.neotel.smfcore.core.storage.enums.DeviceType;
import java.util.List; import java.util.List;
...@@ -16,31 +15,35 @@ public enum EquipmentType { ...@@ -16,31 +15,35 @@ public enum EquipmentType {
AUTO(), AUTO(),
/** /**
* 1 扫码贴标 * 扫码贴标
*/ */
@Deprecated
NEOSCAN(), NEOSCAN(),
NS100(),
/** /**
* NS200 * NS200
*/ */
NS200(), NS200(),
/** /**
* 2 点料机 * 点料机
*/ */
COUNTING(), // COUNTING(),
NEOCOUNTER(),
/** /**
* 3 插件机 * 插件机
*/ */
NEOSTATION(), NEOSTATION(),
/** // /**
* 4 FUJINEOLINK // * 4 FUJINEOLINK
*/ // */
FUJINEOLINK(), // FUJINEOLINK(),
/** /**
* 5 PANACIMNEOLINK * 5 PANACIMNEOLINK
...@@ -55,7 +58,7 @@ public enum EquipmentType { ...@@ -55,7 +58,7 @@ public enum EquipmentType {
/** /**
* 韩华 * 韩华
*/ */
HANWHA(), T_SOLUTION(),
/** /**
* NEXIM * NEXIM
...@@ -64,6 +67,16 @@ public enum EquipmentType { ...@@ -64,6 +67,16 @@ public enum EquipmentType {
public static List<EquipmentType> availableTypeList(){ public static List<EquipmentType> availableTypeList(){
return Lists.newArrayList(AUTO,NEOSCAN,NS200,COUNTING,NEOSTATION,FUJINEOLINK,PANACIMNEOLINK,AGV,HANWHA,NEXIM); return Lists.newArrayList(AUTO,NS100,NS200,NEOCOUNTER,PANACIMNEOLINK,AGV,T_SOLUTION,NEXIM);
}
public static List<String> apiTypeList(){
return Lists.newArrayList(T_SOLUTION.name(),PANACIMNEOLINK.name(),NEXIM.name());
}
public static List<String> nsList(){
return Lists.newArrayList(NS100.name(),NS200.name());
} }
} }
package com.neotel.smfcore.core.equipment.rest;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.HttpHelper;
import com.neotel.smfcore.core.equipment.enums.EquipmentType;
import com.neotel.smfcore.core.equipment.rest.dto.EquipConfigInfoDto;
import com.neotel.smfcore.core.equipment.rest.mapstruct.EquipConfigInfoMapper;
import com.neotel.smfcore.core.equipment.util.EquipConfigUtil;
import com.neotel.smfcore.core.equipment.util.bean.EquipConfigInfo;
import com.neotel.smfcore.custom.hanwha.handler.TMSApis;
import com.neotel.smfcore.custom.hanwha.handler.TMSCommunicator;
import com.neotel.smfcore.custom.panacim.PanaApiController;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@Slf4j
@RestController
@RequestMapping("/equipConfig")
public class EquipConfigController {
@Autowired
private EquipConfigInfoMapper equipConfigInfoMapper;
@Autowired
private EquipConfigUtil equipConfigUtil;
@Autowired
private PanaApiController panaApiController;
@Autowired
private TMSApis tmsApis;
@Autowired
private TMSCommunicator tmsCommunicator;
@ApiOperation("获取配置信息")
@GetMapping("/getConfig")
public ResultBean getCacheConfig(String equipType) {
EquipConfigInfo configInfo= equipConfigUtil.getConfigCache(equipType);
return ResultBean.newOkResult(equipConfigInfoMapper.toDto(configInfo));
}
@ApiOperation("更改配置信息")
@PostMapping("/updateConfig")
public ResultBean updateConfig(@RequestBody EquipConfigInfo cacheConfig) {
if (ObjectUtil.isEmpty(cacheConfig.getEquipType())) {
return ResultBean.newErrorResult(1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"equipType"});
}
equipConfigUtil.updateConfigCache(cacheConfig);
return ResultBean.newOkResult("");
}
@ApiOperation("测试接口是否连通")
@PostMapping("/apiTest")
public ResultBean apiTest(@RequestBody EquipConfigInfoDto configInfoDto) {
if (ObjectUtil.isEmpty(configInfoDto.getEquipType())) {
return ResultBean.newErrorResult(1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"equipType"});
}
//判断测试哪个接口
boolean result = false;
if (configInfoDto.equipType.equals(EquipmentType.T_SOLUTION.name())) {
EquipConfigInfo config = equipConfigInfoMapper.toEntity(configInfoDto);
String ip = config.GetConfigValue("host", "");
if (ObjectUtil.isEmpty(ip)) {
return ResultBean.newErrorResult(1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"host"});
}
if (configInfoDto.apiTestKey.equals("webPort")) {
int webPort = config.GetConfigValue("webPort", 0);
String webUrl = String.format("ws://%s:%d/", ip, webPort);
if (ObjectUtil.isEmpty(webPort) || webPort == 0) {
return ResultBean.newErrorResult(1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"webPort"});
}
if (TMSCommunicator.wsURL.equals(webUrl)) {
result = tmsCommunicator.isConnected();
} else {
result = tmsApis.TestWebSocket(ip, webPort);
}
} else if (configInfoDto.apiTestKey.equals("host")) {
result = HttpHelper.pingIP(ip, 1000);
} else {
int apiPort = config.GetConfigValue("apiPort", 0);
if (ObjectUtil.isEmpty(apiPort) || apiPort == 0) {
return ResultBean.newErrorResult(1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"apiPort"});
}
result = tmsApis.TestApi(ip, apiPort);
}
} else if (configInfoDto.equipType.equals(EquipmentType.PANACIMNEOLINK.name())) {
if (configInfoDto.apiTestKey.equals(Constants.Cache_PanaCIMIP)) {
result = panaApiController.TestIp(1000);
} else {
result = panaApiController.TestApi();
}
}
if (result) {
return ResultBean.newOkResult("OK");
} else {
return ResultBean.newErrorResult(-1, "smfcore.equipconfig.connectTimeout", "连接超时");
}
}
}
...@@ -5,12 +5,15 @@ import com.neotel.smfcore.core.dashboard.bean.dto.box.MesInfoDto; ...@@ -5,12 +5,15 @@ import com.neotel.smfcore.core.dashboard.bean.dto.box.MesInfoDto;
import com.neotel.smfcore.core.device.bean.StatusBean; import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.util.DataCache; import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.equipment.enums.EquipmentType; import com.neotel.smfcore.core.equipment.enums.EquipmentType;
import com.neotel.smfcore.core.equipment.rest.dto.EquipGroupDto;
import com.neotel.smfcore.core.equipment.rest.dto.EquipKanbanDto;
import com.neotel.smfcore.core.equipment.rest.dto.NsViewDto; import com.neotel.smfcore.core.equipment.rest.dto.NsViewDto;
import com.neotel.smfcore.core.equipment.util.EquipmentCache; import com.neotel.smfcore.core.equipment.util.EquipmentCache;
import com.neotel.smfcore.core.equipment.bean.EquipMsg; import com.neotel.smfcore.core.equipment.bean.EquipMsg;
import com.neotel.smfcore.core.equipment.bean.EquipStatusBean; import com.neotel.smfcore.core.equipment.bean.EquipStatusBean;
import com.neotel.smfcore.core.equipment.rest.dto.EquipStatusDto; import com.neotel.smfcore.core.equipment.rest.dto.EquipStatusDto;
import com.neotel.smfcore.core.equipment.service.po.Equipment; import com.neotel.smfcore.core.equipment.service.po.Equipment;
import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.core.message.enums.MessageType; import com.neotel.smfcore.core.message.enums.MessageType;
import com.neotel.smfcore.core.storage.enums.DeviceType; 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.Storage;
...@@ -19,6 +22,7 @@ import com.neotel.smfcore.core.system.util.EquipStatusUtil; ...@@ -19,6 +22,7 @@ import com.neotel.smfcore.core.system.util.EquipStatusUtil;
import com.neotel.smfcore.custom.fuji.bean.FujiConfig; import com.neotel.smfcore.custom.fuji.bean.FujiConfig;
import com.neotel.smfcore.custom.fuji.config.FujiCacheConfig; import com.neotel.smfcore.custom.fuji.config.FujiCacheConfig;
import com.neotel.smfcore.custom.hanwha.handler.TMSCommunicator; import com.neotel.smfcore.custom.hanwha.handler.TMSCommunicator;
import com.neotel.smfcore.custom.panacim.PanaApiController;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
...@@ -31,6 +35,7 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -31,6 +35,7 @@ import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
@Slf4j @Slf4j
...@@ -49,10 +54,74 @@ public class EquipViewController { ...@@ -49,10 +54,74 @@ public class EquipViewController {
@Autowired @Autowired
private TMSCommunicator tmsCommunicator; private TMSCommunicator tmsCommunicator;
// @ApiOperation("获取看板数据")
// @GetMapping
// @PreAuthorize("@el.check('equipmentView:info')")
// public List<EquipStatusDto> info(HttpServletRequest servletRequest) {
//
// Locale locale=servletRequest.getLocale();
// List<EquipStatusDto> resultList=new ArrayList<>();
// Map<String,Equipment> allEquipList= equipmentCache.getAllEquipment();
// for (Equipment equip :
// allEquipList.values()) {
// EquipStatusDto dto=new EquipStatusDto(equip.getId(),equip.getName(),equip.getCid(),false,0,"",equip.getType(),false);
// if((!equip.isAPIEquip())|| (equip.isActivate())){
// dto.setActivate(true);
// }
// EquipStatusBean bean= EquipStatusUtil.getStatusBean(equip.getCid());
// if(bean!=null){
// if(bean.timeOut()){
// dto.setOnLine(false);
// }else{
// dto.setOnLine(true);
// dto.setStatus(bean.getStatus());
// dto.setMsg(bean.getShowMsg(locale));
// }
// }
//
// if(equip.getType().equalsIgnoreCase(EquipmentType.T_SOLUTION.name())){
// if(tmsCommunicator.isConnected()){
// dto.setOnLine(true);
// dto.setStatus(1);
// }
// } else if (equip.getType().equalsIgnoreCase(EquipmentType.NEXIM.name())){
// if(dto.isActivate()) {
// //配置了且激活就显示在线
// FujiConfig config = dataCache.getCache(FujiCacheConfig.FujiConfig_Cache_Name);
// if (config != null) {
//// dto.setStatus(1);
// }
// }
// }
//
// resultList.add(dto);
// }
//
// //再把NLL加进去
// Collection<Storage> storages = dataCache.getAllStorage().values();
// for (Storage storage : storages) {
// if (storage.getType().equals(DeviceType.NLL.name())){
// EquipStatusDto dto=new EquipStatusDto(storage.getId(),storage.getName(),storage.getCid(),false,0,"",storage.getType(),false);
// StatusBean bean = DevicesStatusUtil.getStatusBean(storage.getCid());
// if (bean == null || bean.timeOut()){
// dto.setOnLine(false);
// dto.setStatus(0);
// } else {
// dto.setOnLine(true);
// dto.setStatus(bean.getStatus());
// }
// resultList.add(dto);
// }
// }
// return resultList;
// }
@ApiOperation("获取看板数据") @ApiOperation("获取看板数据")
@GetMapping @GetMapping
@PreAuthorize("@el.check('equipmentView:info')") @PreAuthorize("@el.check('equipmentView:info')")
public List<EquipStatusDto> info(HttpServletRequest servletRequest) { public EquipKanbanDto info(HttpServletRequest servletRequest) {
Locale locale=servletRequest.getLocale(); Locale locale=servletRequest.getLocale();
List<EquipStatusDto> resultList=new ArrayList<>(); List<EquipStatusDto> resultList=new ArrayList<>();
...@@ -60,6 +129,9 @@ public class EquipViewController { ...@@ -60,6 +129,9 @@ public class EquipViewController {
for (Equipment equip : for (Equipment equip :
allEquipList.values()) { allEquipList.values()) {
EquipStatusDto dto=new EquipStatusDto(equip.getId(),equip.getName(),equip.getCid(),false,0,"",equip.getType(),false); EquipStatusDto dto=new EquipStatusDto(equip.getId(),equip.getName(),equip.getCid(),false,0,"",equip.getType(),false);
if((!equip.isAPIEquip())|| (equip.isActivate())){
dto.setActivate(true);
}
EquipStatusBean bean= EquipStatusUtil.getStatusBean(equip.getCid()); EquipStatusBean bean= EquipStatusUtil.getStatusBean(equip.getCid());
if(bean!=null){ if(bean!=null){
if(bean.timeOut()){ if(bean.timeOut()){
...@@ -71,38 +143,71 @@ public class EquipViewController { ...@@ -71,38 +143,71 @@ public class EquipViewController {
} }
} }
if(equip.getType().equalsIgnoreCase(EquipmentType.HANWHA.name())){ if(equip.getType().equalsIgnoreCase(EquipmentType.T_SOLUTION.name())){
if(tmsCommunicator.isConnected()){ if(tmsCommunicator.isConnected()){
dto.setOnLine(true); dto.setOnLine(true);
dto.setStatus(1); dto.setStatus(1);
} }
} else if (equip.getType().equalsIgnoreCase(EquipmentType.NEXIM.name())){ } else if (equip.getType().equalsIgnoreCase(EquipmentType.NEXIM.name())){
if(dto.isActivate()) {
//配置了且激活就显示在线
FujiConfig config = dataCache.getCache(FujiCacheConfig.FujiConfig_Cache_Name); FujiConfig config = dataCache.getCache(FujiCacheConfig.FujiConfig_Cache_Name);
if (config != null){ if (config != null) {
dto.setActivate(true); // dto.setStatus(1);
}
}
}else if(equip.getType().equalsIgnoreCase(EquipmentType.PANACIMNEOLINK.name())) {
if (PanaApiController.isOnLine()) {
dto.setOnLine(true);
dto.setStatus(1);
} }
} }
resultList.add(dto); resultList.add(dto);
} }
//
// //再把NLL加进去
// Collection<Storage> storages = dataCache.getAllStorage().values();
// for (Storage storage : storages) {
// if (storage.getType().equals(DeviceType.NLL.name())){
// EquipStatusDto dto=new EquipStatusDto(storage.getId(),storage.getName(),storage.getCid(),false,0,"",storage.getType(),false);
// StatusBean bean = DevicesStatusUtil.getStatusBean(storage.getCid());
// if (bean == null || bean.timeOut()){
// dto.setOnLine(false);
// dto.setStatus(0);
// } else {
// dto.setOnLine(true);
// dto.setStatus(bean.getStatus());
// }
// resultList.add(dto);
// }
// }
//再把NLL加进去 // 把 pana,nexim,t-solution放到 Pick and Place Machine 里面
Collection<Storage> storages = dataCache.getAllStorage().values(); // Neo Scan 包括 Neo Scan 和 Scan Plus
for (Storage storage : storages) { List<EquipGroupDto> list=new ArrayList<>();
if (storage.getType().equals(DeviceType.NLL.name())){ //三个组
EquipStatusDto dto=new EquipStatusDto(storage.getId(),storage.getName(),storage.getCid(),false,0,"",storage.getType(),false); List<EquipStatusDto> apiList=resultList.stream().filter(dto->EquipmentType.apiTypeList().contains(dto.getType())).collect(Collectors.toList());
StatusBean bean = DevicesStatusUtil.getStatusBean(storage.getCid()); if(apiList.size()>0){
if (bean == null || bean.timeOut()){ EquipGroupDto dto=new EquipGroupDto(MessageUtils.getText("smfcore.equipment.view.apigroup",locale,"Pick and Place Machine"),apiList);
dto.setOnLine(false); list.add(dto);
dto.setStatus(0);
} else {
dto.setOnLine(true);
dto.setStatus(bean.getStatus());
} }
resultList.add(dto); List<EquipStatusDto> nsList=resultList.stream().filter(dto->EquipmentType.nsList().contains(dto.getType())).collect(Collectors.toList());
if(nsList.size()>0){
EquipGroupDto dto=new EquipGroupDto(MessageUtils.getText("smfcore.equipment.view.nsgroup",locale,"Neo Scan"),nsList);
list.add(dto);
} }
List<String> otherType= new ArrayList<>();
otherType.addAll(EquipmentType.nsList());
otherType.addAll(EquipmentType.apiTypeList() );
List<EquipStatusDto> otherList=resultList.stream().filter(dto->otherType.contains(dto.getType())==false).collect(Collectors.toList());
if(otherList.size()>0){
EquipGroupDto dto=new EquipGroupDto("",otherList);
list.add(dto);
} }
return resultList;
EquipKanbanDto ret= new EquipKanbanDto(list);
return ret;
} }
@ApiOperation("获取NS看板数据") @ApiOperation("获取NS看板数据")
......
package com.neotel.smfcore.core.equipment.rest; package com.neotel.smfcore.core.equipment.rest;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.bean.PageData; 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.exception.ValidateException;
import com.neotel.smfcore.common.utils.QueryHelp; import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.common.utils.SecurityUtils; import com.neotel.smfcore.common.utils.SecurityUtils;
...@@ -22,6 +24,7 @@ import lombok.RequiredArgsConstructor; ...@@ -22,6 +24,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
...@@ -57,6 +60,13 @@ public class EquipmentController { ...@@ -57,6 +60,13 @@ public class EquipmentController {
Query query= QueryHelp.getQuery(criteria); Query query= QueryHelp.getQuery(criteria);
PageData<Equipment> pages = equipmentManager.findByPage(query, pageable); PageData<Equipment> pages = equipmentManager.findByPage(query, pageable);
List<EquipmentDto> equipmentDtos =equipmentMapper.toDto(pages.getContent()); List<EquipmentDto> equipmentDtos =equipmentMapper.toDto(pages.getContent());
for (int i=0;i<equipmentDtos.size();i++){
if(EquipmentType.apiTypeList().contains(equipmentDtos.get(i).getType())){
equipmentDtos.get(i).setAPIEquip(true);
}
}
return new PageData(equipmentDtos,pages.getTotalElements()); return new PageData(equipmentDtos,pages.getTotalElements());
} }
...@@ -82,6 +92,11 @@ public class EquipmentController { ...@@ -82,6 +92,11 @@ public class EquipmentController {
} }
} }
} }
if(equipment.isAPIEquip()){
equipment.setActivate(false);
}else{
equipment.setActivate(true);
}
equipment = equipmentManager.save(equipment); equipment = equipmentManager.save(equipment);
equipmentCache.reloadEquipment(equipment,equipment.getCid()); equipmentCache.reloadEquipment(equipment,equipment.getCid());
return new ResponseEntity<>(HttpStatus.CREATED); return new ResponseEntity<>(HttpStatus.CREATED);
...@@ -104,6 +119,7 @@ public class EquipmentController { ...@@ -104,6 +119,7 @@ public class EquipmentController {
} if(StringUtils.isEmpty(equipment.getType())){ } if(StringUtils.isEmpty(equipment.getType())){
throw new ValidateException("smfcore.valueCanotNull","{0}不能为空",new String[]{"type"} ); throw new ValidateException("smfcore.valueCanotNull","{0}不能为空",new String[]{"type"} );
} }
String oldCid="";
for (Equipment equ : equipmentCache.getAllEquipment().values()) { for (Equipment equ : equipmentCache.getAllEquipment().values()) {
if (!equipment.getId().equals(equ.getId())){ if (!equipment.getId().equals(equ.getId())){
if(equipment.getName().equals(equ.getName())){ if(equipment.getName().equals(equ.getName())){
...@@ -112,10 +128,15 @@ public class EquipmentController { ...@@ -112,10 +128,15 @@ public class EquipmentController {
if(equipment.getCid().equals(equ.getCid())){ if(equipment.getCid().equals(equ.getCid())){
throw new ValidateException("smfcore.valueAlreadyExist","{0}[{1}]已存在",new String[]{"cid",equipment.getCid()}); throw new ValidateException("smfcore.valueAlreadyExist","{0}[{1}]已存在",new String[]{"cid",equipment.getCid()});
} }
}else{
oldCid=equ.getCid();
} }
} }
if(ObjectUtil.isEmpty(oldCid)){
oldCid=equipment.getCid();
}
equipmentManager.save(equipment); equipmentManager.save(equipment);
equipmentCache.reloadEquipment(equipment,equipment.getCid()); equipmentCache.reloadEquipment(equipment,oldCid);
return new ResponseEntity<>(HttpStatus.OK); return new ResponseEntity<>(HttpStatus.OK);
} }
...@@ -153,4 +174,48 @@ public class EquipmentController { ...@@ -153,4 +174,48 @@ public class EquipmentController {
return allList; return allList;
} }
@RequestMapping(value = "/activation")
@AnonymousAccess
public ResultBean activation( @RequestParam String cid) {
Criteria c = Criteria.where("cid").is(cid);
List<Equipment> equipmentList = equipmentManager.findByQuery(new Query(c));
if (equipmentList == null || equipmentList.size() < 0) {
return ResultBean.newErrorResult(1, "smfcore.msg.noCid", "操作失败,未找到CID");
}
Equipment equipment = equipmentList.get(0);
if (equipment.isActivate()) {
return ResultBean.newOkResult("OK");
}
equipment.setActivate(true);
equipmentManager.save(equipment);
equipmentCache.reloadEquipment(equipment, equipment.getCid());
log.info("设备cid=" + cid + ", equipType=" + equipment.getType() + " setActivate(true)成功");
return ResultBean.newOkResult("OK");
}
@RequestMapping(value = "/deactivation")
@AnonymousAccess
public ResultBean deactivation( @RequestParam String cid) {
Criteria c = Criteria.where("cid").is(cid);
List<Equipment> equipmentList = equipmentManager.findByQuery(new Query(c));
if (equipmentList == null || equipmentList.size() < 0) {
return ResultBean.newErrorResult(1, "smfcore.msg.noCid", "操作失败,未找到CID");
}
Equipment equipment = equipmentList.get(0);
if(!equipment.isAPIEquip()){
return ResultBean.newErrorResult(1, "smfcore.operationFailure", "操作失败");
}
if (!equipment.isActivate()) {
return ResultBean.newOkResult("OK");
}
equipment.setActivate(false);
equipmentManager.save(equipment);
equipmentCache.reloadEquipment(equipment, equipment.getCid());
log.info("设备cid=" + cid + ", equipType=" + equipment.getType() + " setActivate(false)成功");
return ResultBean.newOkResult("OK");
}
} }
package com.neotel.smfcore.core.equipment.rest.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.LinkedHashMap;
@Data
public class EquipConfigInfoDto {
@ApiModelProperty("设备类型")
public String equipType = "";
@ApiModelProperty("启用API连接 默认不启用")
public boolean enableApi;
@ApiModelProperty("配置列表")
public LinkedHashMap<String, Object> apiConfigMap;
@ApiModelProperty("测试连接的Key")
public String apiTestKey;
}
package com.neotel.smfcore.core.equipment.rest.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Getter
@Setter
@AllArgsConstructor
public class EquipGroupDto {
@ApiModelProperty("组名称")
private String groupName;
@ApiModelProperty("设备列表")
private List<EquipStatusDto> equipList;
// @ApiModelProperty("ID")
// private String groupId;
// @ApiModelProperty("组类型:=1时点击组名称进入料架分组界面")
// private int groupType;
}
\ No newline at end of file \ No newline at end of file
package com.neotel.smfcore.core.equipment.rest.dto;
import com.neotel.smfcore.core.kanban.rest.bean.dto.GroupStatusDto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class EquipKanbanDto {
@ApiModelProperty("组列表")
private List<EquipGroupDto> groupList;
}
...@@ -20,6 +20,10 @@ public class EquipmentDto { ...@@ -20,6 +20,10 @@ public class EquipmentDto {
@ApiModelProperty("是否可用") @ApiModelProperty("是否可用")
private boolean available = true; private boolean available = true;
@ApiModelProperty("是否激活")
private boolean activate=true;
@ApiModelProperty("是否是第三方对接设备")
private boolean aPIEquip=false;
private String id; private String id;
} }
package com.neotel.smfcore.core.equipment.rest.mapstruct;
import com.neotel.smfcore.common.base.BaseMapper;
import com.neotel.smfcore.core.equipment.rest.dto.EquipConfigInfoDto;
import com.neotel.smfcore.core.equipment.util.bean.EquipConfigInfo;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
@Mapper(componentModel = "spring" ,unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface EquipConfigInfoMapper extends BaseMapper<EquipConfigInfoDto, EquipConfigInfo> {
}
...@@ -27,7 +27,25 @@ public class Equipment extends BasePo implements Serializable { ...@@ -27,7 +27,25 @@ public class Equipment extends BasePo implements Serializable {
*/ */
private boolean available = true; private boolean available = true;
/**
* 是否激活
*/
private boolean activate=true;
public boolean isNEOSCAN() { public boolean isNEOSCAN() {
return EquipmentType.NEOSCAN.name().equals(type)||EquipmentType.NS200.name().equals(type); return EquipmentType.NEOSCAN.name().equals(type)||EquipmentType.NS200.name().equals(type)||EquipmentType.NS100.name().equals(type);
}
/**
* 是否是接口设备
* @return
*/
public boolean isAPIEquip() {
if(EquipmentType.apiTypeList().contains(type)){
return true;
}
return false;
} }
} }
package com.neotel.smfcore.core.equipment.util;
import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.JsonUtil;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.equipment.enums.EquipmentType;
import com.neotel.smfcore.core.equipment.util.bean.EquipConfigInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.LinkedHashMap;
@Slf4j
@Service
public class EquipConfigUtil {
@Autowired
private DataCache dataCache;
private static final String Equip_Config_Cache = "Equip_Config_Cache";
public static String CacheStr(String equipType){
return Equip_Config_Cache+"_"+equipType;
}
public void updateConfigCache(EquipConfigInfo cacheConfig) {
String key=CacheStr(cacheConfig.getEquipType());
EquipConfigInfo configInfo = getConfigCache(cacheConfig.getEquipType());
configInfo.setEnableApi(cacheConfig.isEnableApi());
configInfo.setApiConfigMap(cacheConfig.getApiConfigMap());
dataCache.updateCache(key, configInfo);
log.info("updateConfigCache [" + key + "=" + JsonUtil.toJsonStr(configInfo) + "]");
}
public EquipConfigInfo getConfigCache(String equipType) {
String key=CacheStr(equipType);
EquipConfigInfo configInfo = dataCache.getCache(key);
if (configInfo == null) {
configInfo = new EquipConfigInfo();
configInfo.setEquipType(equipType);
configInfo.setEnableApi(false);
if(equipType.equals(EquipmentType.T_SOLUTION.name())){
LinkedHashMap<String,Object> defMap=new LinkedHashMap<>();
defMap.put("host","");
defMap.put("webPort",1337);
defMap.put("apiPort",8082);
defMap.put("singleOrder",true);
configInfo.setApiConfigMap(defMap);
}else if(equipType.equals(EquipmentType.PANACIMNEOLINK.name())){
//默认启用
configInfo.setEnableApi(true);
}
}
if(equipType.equals(EquipmentType.PANACIMNEOLINK.name())) {
//增加配置
LinkedHashMap<String, Object> defMap = new LinkedHashMap<>();
String ip=dataCache.getCache(Constants.Cache_PanaCIMIP);
if(ip==null){
ip="";
}
String port=dataCache.getCache(Constants.Cache_PanaCIMPort);
if(port==null){
port="";
}
defMap.put("PanaCIMIP", ip);
defMap.put("PanaCIMPort", port);
configInfo.setApiConfigMap(defMap);
}
return configInfo;
}
}
package com.neotel.smfcore.core.equipment.util.bean;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.util.LinkedHashMap;
import java.util.Map;
@Data
@Slf4j
public class EquipConfigInfo {
public String equipType = "";
/**
* 启用API连接 默认不启用
*/
public boolean enableApi;
/**
* 配置列表
*/
public LinkedHashMap<String, Object> apiConfigMap;
//韩华配置key: host ,webPort, apiPort,singleOrder
public <T> T GetConfigValue(String key,Object defValue) {
try {
if (apiConfigMap != null) {
Object result = apiConfigMap.get(key);
if (result instanceof String && defValue instanceof Integer) {
return (T) (Integer) Integer.parseInt((String) result);
}
else if (result != null) {
return (T) result;
}
}
} catch (Exception exception) {
log.error("GetConfigValue 出错: type=" + equipType + ",key=" + key + ", error =" + exception.toString());
}
if (defValue != null) {
return (T) defValue;
}
return null;
}
}
...@@ -139,7 +139,11 @@ public class HumitureController { ...@@ -139,7 +139,11 @@ public class HumitureController {
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.humiture.cid", locale, "CID"))); header.add(Lists.newArrayList(MessageUtils.getText("smfcore.humiture.cid", locale, "CID")));
if (isSpStorage) { if (isSpStorage) {
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.humiture.ntemperature", locale, "冷藏温度"))); header.add(Lists.newArrayList(MessageUtils.getText("smfcore.humiture.ntemperature", locale, "冷藏温度")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.humiture.ntemperature2", locale, "冷藏温度2")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.humiture.ntemperature3", locale, "冷藏温度3")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.humiture.codetemperature", locale, "制冷温度"))); header.add(Lists.newArrayList(MessageUtils.getText("smfcore.humiture.codetemperature", locale, "制冷温度")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.humiture.codetemperature2", locale, "制冷温度2")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.humiture.wtemperature", locale, "回温温度")));
}else{ }else{
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.humiture.temperature", locale, "温度"))); header.add(Lists.newArrayList(MessageUtils.getText("smfcore.humiture.temperature", locale, "温度")));
} }
...@@ -147,6 +151,7 @@ public class HumitureController { ...@@ -147,6 +151,7 @@ public class HumitureController {
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.humiture.createDate", locale, "时间"))); header.add(Lists.newArrayList(MessageUtils.getText("smfcore.humiture.createDate", locale, "时间")));
// header.add(Lists.newArrayList(MessageUtils.getText("smfcore.humiture.updateDate", locale, "更新时间"))); // header.add(Lists.newArrayList(MessageUtils.getText("smfcore.humiture.updateDate", locale, "更新时间")));
return header; return header;
} }
...@@ -164,12 +169,18 @@ public class HumitureController { ...@@ -164,12 +169,18 @@ public class HumitureController {
data.add(humiture.getCid()); data.add(humiture.getCid());
data.add(humiture.getTemperature()); data.add(humiture.getTemperature());
if (isSpStorage) { if (isSpStorage) {
data.add(humiture.getTemperature2());
data.add(humiture.getTemperature3());
data.add(humiture.getCodeAirTemp()); data.add(humiture.getCodeAirTemp());
data.add(humiture.getCodeAirTemp2() );
data.add(humiture.getWTemp());
} }
data.add(humiture.getHumidity()); data.add(humiture.getHumidity());
data.add(createDate); data.add(createDate);
// data.add(updateDate); // data.add(updateDate);
dataList.add(data); dataList.add(data);
} }
return dataList; return dataList;
} }
......
...@@ -21,10 +21,8 @@ import org.springframework.security.access.prepost.PreAuthorize; ...@@ -21,10 +21,8 @@ import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.ArrayList; import javax.servlet.http.HttpServletRequest;
import java.util.List; import java.util.*;
import java.util.Map;
import java.util.Set;
@Slf4j @Slf4j
@RestController @RestController
...@@ -36,22 +34,30 @@ public class LanguageSetController { ...@@ -36,22 +34,30 @@ public class LanguageSetController {
@Autowired @Autowired
DataCache dataCache; DataCache dataCache;
public List<LanguageInfo> getAllLanList() { public List<LanguageInfo> getAllLanList( ) {
return getAllLanList(MessageUtils.getDefaultLocal());
}
public List<LanguageInfo> getAllLanList(Locale locale) {
if(locale==null){
locale= MessageUtils.getDefaultLocal();
}
// List<LanguageInfo> lanList = dataCache.getCache(Constants.CACHE_languageType); List<LanguageInfo> lanList = dataCache.getLanguageList();
// if (lanList == null || lanList.size() <= 0) {
// lanList = MessageUtils.getDefaultLanList(); //没有缩写的加上
// dataCache.updateCache(Constants.CACHE_languageType, lanList); for (int i = 0; i < lanList.size(); i++) {
// } String disName = MessageUtils.getText("smfcore.language.displayLanName." + lanList.get(i).getLanCode(), locale, "");
return dataCache.getLanguageList(); lanList.get(i).setDisplayLanName(disName);
}
return lanList;
} }
@ApiOperation("获取语言列表") @ApiOperation("获取语言列表")
@GetMapping @GetMapping
@AnonymousAccess @AnonymousAccess
// @PreAuthorize("@el.check('translation')") // @PreAuthorize("@el.check('translation')")
public List<LanguageInfo> getList(){ public List<LanguageInfo> getList(HttpServletRequest request){
return getAllLanList(); return getAllLanList(request.getLocale());
} }
@ApiOperation("新增语言") @ApiOperation("新增语言")
@PostMapping @PostMapping
......
...@@ -24,6 +24,12 @@ public class LanguageInfo implements Serializable { ...@@ -24,6 +24,12 @@ public class LanguageInfo implements Serializable {
private String lanName; private String lanName;
/** /**
* 登录界面显示的语言名称,简写
*/
@ApiModelProperty("登录界面显示文本:CN,EN 等")
private String displayLanName;
/**
* 语言图标 * 语言图标
*/ */
@ApiModelProperty("语言图标") @ApiModelProperty("语言图标")
......
...@@ -85,6 +85,8 @@ public class MessageUtils { ...@@ -85,6 +85,8 @@ public class MessageUtils {
public static final String ZH_TW = "zh-TW"; public static final String ZH_TW = "zh-TW";
public static final String EN_US = "en-US"; public static final String EN_US = "en-US";
public static final String JA_JP = "ja-JP"; public static final String JA_JP = "ja-JP";
public static final String FR_FR="fr-FR";
public static final String DE_DE="de-DE";
//服务器type //服务器type
public static final String smfcore="smfcore"; public static final String smfcore="smfcore";
...@@ -227,10 +229,12 @@ public class MessageUtils { ...@@ -227,10 +229,12 @@ public class MessageUtils {
List<LanguageInfo> lanList = new ArrayList<>(); List<LanguageInfo> lanList = new ArrayList<>();
if (lanList == null || lanList.size() <= 0) { if (lanList == null || lanList.size() <= 0) {
lanList=new ArrayList<>(); lanList=new ArrayList<>();
lanList.add(new LanguageInfo(MessageUtils.ZH_CN,"简体中文","")); lanList.add(new LanguageInfo(MessageUtils.ZH_CN,"简体中文","CN",""));
lanList.add(new LanguageInfo(MessageUtils.ZH_TW,"繁体中文","")); lanList.add(new LanguageInfo(MessageUtils.ZH_TW,"繁体中文","TC",""));
lanList.add(new LanguageInfo(MessageUtils.EN_US,"English","")); lanList.add(new LanguageInfo(MessageUtils.EN_US,"English","EN",""));
lanList.add(new LanguageInfo(MessageUtils.JA_JP,"日本语","")); lanList.add(new LanguageInfo(MessageUtils.JA_JP,"日本語","JP",""));
lanList.add(new LanguageInfo(MessageUtils.FR_FR,"Français","FR",""));
lanList.add(new LanguageInfo(MessageUtils.DE_DE,"Deutsch","DE",""));
} }
return lanList; return lanList;
} }
......
...@@ -25,4 +25,9 @@ public enum MessageType { ...@@ -25,4 +25,9 @@ public enum MessageType {
* 4 显示数据,仅显示不保存 * 4 显示数据,仅显示不保存
*/ */
SHOW, SHOW,
/**
* 5 需要人员立即操作的
*/
CRITICAL
} }
package com.neotel.smfcore.core.message.rest; package com.neotel.smfcore.core.message.rest;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.neotel.smfcore.common.base.IExcelDownLoad; import com.neotel.smfcore.common.base.IExcelDownLoad;
import com.neotel.smfcore.common.bean.BetweenData;
import com.neotel.smfcore.common.bean.PageData; import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.FileUtil; import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.common.utils.QueryHelp; import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.core.language.util.MessageUtils; import com.neotel.smfcore.core.language.util.MessageUtils;
...@@ -32,9 +36,7 @@ import javax.servlet.http.HttpServletResponse; ...@@ -32,9 +36,7 @@ import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Locale;
@Slf4j @Slf4j
@RestController @RestController
...@@ -89,6 +91,8 @@ public class MessageController { ...@@ -89,6 +91,8 @@ public class MessageController {
return getMsgReportList(criteria, request.getLocale()); return getMsgReportList(criteria, request.getLocale());
} }
private List<MsgCountDto> getMsgReportList(MessageCriteria criteria,Locale locale) { private List<MsgCountDto> getMsgReportList(MessageCriteria criteria,Locale locale) {
Criteria c = Criteria.where("type").is("ERROR"); Criteria c = Criteria.where("type").is("ERROR");
if (ObjectUtil.isNotEmpty(criteria.getDeviceName())) { if (ObjectUtil.isNotEmpty(criteria.getDeviceName())) {
...@@ -147,5 +151,50 @@ public class MessageController { ...@@ -147,5 +151,50 @@ public class MessageController {
log.info("msgReportCount 导出完成"); log.info("msgReportCount 导出完成");
} }
@ApiOperation("根据type汇总总数量")
@GetMapping("/typeTotalByDate")
@AnonymousAccess
public ResultBean typeTotalByDate(MessageCriteria criteria, HttpServletRequest request) {
//默认取7天的,如果客户端传的有,就用客户端的
Date endDate = new Date();
Date startDate = DateUtil.offsetDay(endDate, -7);
BetweenData<Date> updateDate = criteria.getUpdateDate();
if (updateDate != null && !updateDate.isEmpty()) {
Date from = updateDate.getFrom();
Date to = updateDate.getTo();
if (from != null) {
startDate = from;
}
if (to != null) {
endDate = to;
}
}
List<Message> messageList = messageManager.findByUpdateAndFileds(startDate, endDate, "");
Map<String, List<MessageDto>> resultMap = Maps.newConcurrentMap();
resultMap.put("INFO", new ArrayList<>());
resultMap.put("WARNING", new ArrayList<>());
resultMap.put("ERROR", new ArrayList<>());
resultMap.put("CRITICAL", new ArrayList<>());
if (messageList != null && !messageList.isEmpty()) {
for (Message message : messageList) {
MessageDto dto = messageMapper.toDto(message);
String type = message.getType();
if (ObjectUtil.isNotEmpty(dto.getMsgCode())) {
dto.setMsg(MessageUtils.getText(dto.getMsgCode(), dto.getMsgParams(), request.getLocale(), dto.getMsg()));
}
List<MessageDto> list = resultMap.get(type);
if (list == null) {
list = new ArrayList<>();
}
list.add(dto);
resultMap.put(type, list);
}
}
return ResultBean.newOkResult(resultMap);
}
} }
...@@ -7,6 +7,7 @@ import lombok.Data; ...@@ -7,6 +7,7 @@ import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date; import java.util.Date;
import java.util.List;
@Data @Data
public class MessageCriteria { public class MessageCriteria {
...@@ -18,7 +19,7 @@ public class MessageCriteria { ...@@ -18,7 +19,7 @@ public class MessageCriteria {
private BetweenData<Date> createDate; private BetweenData<Date> createDate;
@QueryCondition(type = QueryCondition.Type.BETWEEN, propName = "updateDate") @QueryCondition(type = QueryCondition.Type.BETWEEN, propName = "updateDate")
@DateTimeFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private BetweenData<Date> updateDate; private BetweenData<Date> updateDate;
@QueryCondition @QueryCondition
...@@ -36,4 +37,8 @@ public class MessageCriteria { ...@@ -36,4 +37,8 @@ public class MessageCriteria {
@QueryCondition @QueryCondition
@ApiModelProperty("类型") @ApiModelProperty("类型")
private String type; private String type;
@QueryCondition(type = QueryCondition.Type.IN,propName = "type")
@ApiModelProperty("多个类型")
private List<String> typeList;
} }
...@@ -7,6 +7,7 @@ import org.springframework.data.mongodb.core.query.Criteria; ...@@ -7,6 +7,7 @@ import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
...@@ -18,4 +19,6 @@ public interface IMessageManager extends IBaseManager<Message> { ...@@ -18,4 +19,6 @@ public interface IMessageManager extends IBaseManager<Message> {
Message findOne(Query query); Message findOne(Query query);
List<MsgCountDto> getMsgCountList(Criteria criteria); List<MsgCountDto> getMsgCountList(Criteria criteria);
List<Message> findByUpdateAndFileds(Date startDate, Date endDate, String field);
} }
...@@ -5,6 +5,7 @@ import com.neotel.smfcore.common.bean.PageData; ...@@ -5,6 +5,7 @@ import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.DateUtil; import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.common.utils.FileUtil; import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.language.service.nanager.impl.LanguageMsgManagerImpl; import com.neotel.smfcore.core.language.service.nanager.impl.LanguageMsgManagerImpl;
import com.neotel.smfcore.core.language.service.po.LanguageMsg; import com.neotel.smfcore.core.language.service.po.LanguageMsg;
import com.neotel.smfcore.core.language.util.MessageUtils; import com.neotel.smfcore.core.language.util.MessageUtils;
...@@ -16,6 +17,7 @@ import com.neotel.smfcore.core.message.service.po.Message; ...@@ -16,6 +17,7 @@ import com.neotel.smfcore.core.message.service.po.Message;
import com.neotel.smfcore.security.service.po.User; import com.neotel.smfcore.security.service.po.User;
import lombok.Data; import lombok.Data;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.poi.util.StringUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.aggregation.Aggregation;
...@@ -131,6 +133,17 @@ public class MessageManagerImpl implements IMessageManager { ...@@ -131,6 +133,17 @@ public class MessageManagerImpl implements IMessageManager {
return messageDao.getMsgCountList(criteria) ; return messageDao.getMsgCountList(criteria) ;
} }
@Override
public List<Message> findByUpdateAndFileds(Date startDate, Date endDate, String field) {
Query q = new Query();
Criteria c = Criteria.where("updateDate").gte(startDate).lt(endDate);
q.addCriteria(c);
if (StringUtils.isNotEmpty(field)) {
q.fields().include(field);
}
return messageDao.findByQuery(q);
}
@Data @Data
private class MsgDeviceName { private class MsgDeviceName {
private String deviceName; private String deviceName;
......
...@@ -97,7 +97,7 @@ public class DeviceMessageUtil { ...@@ -97,7 +97,7 @@ public class DeviceMessageUtil {
if(result){ if(result){
messageManager.save(message); messageManager.save(message);
} }
messageManager.save(message); // messageManager.save(message);
} }
} }
public static void addDeviceMessage(String cid,String msgType, String moudle, String msgCode, String msg, String[] msgParam,String almType,String almCode) { public static void addDeviceMessage(String cid,String msgType, String moudle, String msgCode, String msg, String[] msgParam,String almType,String almCode) {
...@@ -114,7 +114,7 @@ public class DeviceMessageUtil { ...@@ -114,7 +114,7 @@ public class DeviceMessageUtil {
if(result){ if(result){
messageManager.save(message); messageManager.save(message);
} }
messageManager.save(message); // messageManager.save(message);
} }
} }
......
...@@ -60,11 +60,11 @@ public class LiteOrderCache { ...@@ -60,11 +60,11 @@ public class LiteOrderCache {
@Autowired @Autowired
private SmfApi smfApi; private SmfApi smfApi;
//最大工单数 // //最大工单数
public int MaxOrderCount=1; // public int MaxOrderCount=1;
public boolean SingleOrderMode(){ // public boolean SingleOrderMode(){
return MaxOrderCount==1; // return MaxOrderCount==1;
} // }
/** /**
...@@ -496,6 +496,7 @@ public class LiteOrderCache { ...@@ -496,6 +496,7 @@ public class LiteOrderCache {
} }
List<String> availableStorageIds = dataCache.getAvailableStorageIds(cidList); List<String> availableStorageIds = dataCache.getAvailableStorageIds(cidList);
boolean shortage=false;
//其他出库模式一次性全部生成任务 //其他出库模式一次性全部生成任务
for (LiteOrderItem orderItem : cacheOrder.getOrderItems()) { for (LiteOrderItem orderItem : cacheOrder.getOrderItems()) {
orderItem.setOutNum(0); orderItem.setOutNum(0);
...@@ -533,6 +534,7 @@ public class LiteOrderCache { ...@@ -533,6 +534,7 @@ public class LiteOrderCache {
break; break;
} }
}else{ }else{
shortage=true;
log.info("工单[" + orderNo + "]RI出库时,库存中未找到料盘["+reelId+"]"); log.info("工单[" + orderNo + "]RI出库时,库存中未找到料盘["+reelId+"]");
} }
}else if (Strings.isNullOrEmpty(reelId) && !Strings.isNullOrEmpty(partNumber)){ }else if (Strings.isNullOrEmpty(reelId) && !Strings.isNullOrEmpty(partNumber)){
...@@ -543,6 +545,7 @@ public class LiteOrderCache { ...@@ -543,6 +545,7 @@ public class LiteOrderCache {
} }
if (pos == null) { if (pos == null) {
// log.error("未找到可以出库的物料[" + partNumber + "]"); // log.error("未找到可以出库的物料[" + partNumber + "]");
shortage=true;
break; break;
} else { } else {
assignNum = assignNum + pos.getBarcode().getAmount(); assignNum = assignNum + pos.getBarcode().getAmount();
...@@ -572,6 +575,11 @@ public class LiteOrderCache { ...@@ -572,6 +575,11 @@ public class LiteOrderCache {
} }
if(shortage){
cacheOrder.addAppendDate("shortage","true");
}else{
cacheOrder.addAppendDate("shortage","false");
}
cacheOrder.setTaskReelCount(taskReelCount); cacheOrder.setTaskReelCount(taskReelCount);
cacheOrder.setTotalTaskReelCount(cacheOrder.getTotalTaskReelCount()+taskReelCount); cacheOrder.setTotalTaskReelCount(cacheOrder.getTotalTaskReelCount()+taskReelCount);
log.info("工单[" + orderNo + "]任务分配结束,任务数[" + taskReelCount + "]"); log.info("工单[" + orderNo + "]任务分配结束,任务数[" + taskReelCount + "]");
...@@ -679,6 +687,7 @@ public class LiteOrderCache { ...@@ -679,6 +687,7 @@ public class LiteOrderCache {
} }
if(shortReel){ if(shortReel){
cacheOrder.addAppendDate("shortage","true");
cacheOrder.setClosed(true); cacheOrder.setClosed(true);
cacheOrder.setStatus(LITEORDER_STATUS.CLOSED); cacheOrder.setStatus(LITEORDER_STATUS.CLOSED);
liteOrderManager.save(cacheOrder); liteOrderManager.save(cacheOrder);
...@@ -847,6 +856,7 @@ public class LiteOrderCache { ...@@ -847,6 +856,7 @@ public class LiteOrderCache {
cacheOrder.setTaskReelCount(outCount); cacheOrder.setTaskReelCount(outCount);
cacheOrder.setTaskFinishedTime(-1); cacheOrder.setTaskFinishedTime(-1);
cacheOrder.setFinishedReelCount(0); cacheOrder.setFinishedReelCount(0);
cacheOrder.setStatus(LITEORDER_STATUS.ONE);
liteOrderManager.save(cacheOrder); liteOrderManager.save(cacheOrder);
liteOrderMap.put(cacheOrder.getOrderNo(), cacheOrder); liteOrderMap.put(cacheOrder.getOrderNo(), cacheOrder);
......
package com.neotel.smfcore.core.order.enums;
public class LITEORDER_STYPE {
/**手动创建的工单*/
public static int MANUAL =0;
/**共享文件夹工单*/
public static int SHAREDFOLDER =1;
/**系统对接的 工单*/
public static int API =2;
}
...@@ -37,7 +37,7 @@ public class DefaultOrderFileListener implements IOrderFileListener { ...@@ -37,7 +37,7 @@ public class DefaultOrderFileListener implements IOrderFileListener {
protected LiteOrderCache liteOrderCache; protected LiteOrderCache liteOrderCache;
@Override @Override
public boolean handleOrderFile(File orderFile) { public boolean handleOrderFile(File orderFile,int sourceType) {
String fileName = orderFile.getName(); String fileName = orderFile.getName();
//String backupFileName = fileName +"_" + System.currentTimeMillis(); //String backupFileName = fileName +"_" + System.currentTimeMillis();
//看数据库是否已有此工单 //看数据库是否已有此工单
...@@ -64,6 +64,7 @@ public class DefaultOrderFileListener implements IOrderFileListener { ...@@ -64,6 +64,7 @@ public class DefaultOrderFileListener implements IOrderFileListener {
LiteOrder liteOrder = new LiteOrder(so, liteOrderItems); LiteOrder liteOrder = new LiteOrder(so, liteOrderItems);
liteOrder.setSource(fileName); liteOrder.setSource(fileName);
liteOrder.setSourceType(sourceType);//0=手动创建,1=共享文件夹
LiteOrder dbOrder = liteOrderManager.findByOrderNo(liteOrder.getOrderNo()); LiteOrder dbOrder = liteOrderManager.findByOrderNo(liteOrder.getOrderNo());
if (dbOrder != null) { if (dbOrder != null) {
......
...@@ -7,6 +7,6 @@ import java.io.File; ...@@ -7,6 +7,6 @@ import java.io.File;
*/ */
public interface IOrderFileListener { public interface IOrderFileListener {
boolean handleOrderFile(File orderFile); boolean handleOrderFile(File orderFile,int sourceType);
} }
...@@ -3,7 +3,6 @@ package com.neotel.smfcore.core.order.rest; ...@@ -3,7 +3,6 @@ package com.neotel.smfcore.core.order.rest;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.neotel.smfcore.common.base.IExcelDownLoad;
import com.neotel.smfcore.common.bean.PageData; import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.bean.ResultBean; import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
...@@ -21,8 +20,10 @@ import com.neotel.smfcore.core.device.util.DataCache; ...@@ -21,8 +20,10 @@ import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.language.util.MessageUtils; import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.core.order.LiteOrderCache; import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS; import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS;
import com.neotel.smfcore.core.order.enums.LITEORDER_STYPE;
import com.neotel.smfcore.core.order.rest.bean.dto.OrderDto; import com.neotel.smfcore.core.order.rest.bean.dto.OrderDto;
import com.neotel.smfcore.core.order.rest.bean.dto.OrderItemDto; import com.neotel.smfcore.core.order.rest.bean.dto.OrderItemDto;
import com.neotel.smfcore.core.order.rest.bean.dto.OrderKanbanDto;
import com.neotel.smfcore.core.order.rest.bean.mapstruct.OrderItemMapper; 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.rest.bean.mapstruct.OrderMapper;
import com.neotel.smfcore.core.order.rest.bean.query.OrderQueryCondition; import com.neotel.smfcore.core.order.rest.bean.query.OrderQueryCondition;
...@@ -38,7 +39,6 @@ import com.neotel.smfcore.core.system.service.po.DataLog; ...@@ -38,7 +39,6 @@ import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService; import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.security.annotation.AnonymousAccess; import com.neotel.smfcore.security.annotation.AnonymousAccess;
import com.neotel.smfcore.security.bean.FileProperties; import com.neotel.smfcore.security.bean.FileProperties;
import com.neotel.smfcore.security.rest.bean.query.UserQueryCriteria;
import com.neotel.smfcore.security.service.manager.IGroupManager; import com.neotel.smfcore.security.service.manager.IGroupManager;
import com.neotel.smfcore.security.service.manager.IUserManager; import com.neotel.smfcore.security.service.manager.IUserManager;
import com.neotel.smfcore.security.service.po.Group; import com.neotel.smfcore.security.service.po.Group;
...@@ -51,23 +51,16 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -51,23 +51,16 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor; import java.beans.PropertyDescriptor;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
...@@ -144,7 +137,7 @@ public class OrderController { ...@@ -144,7 +137,7 @@ public class OrderController {
} }
File folder = new File(properties.getPath(), "pos"); File folder = new File(properties.getPath(), "pos");
File localFile = FileUtil.upload(orderFile, folder.getAbsolutePath()); File localFile = FileUtil.upload(orderFile, folder.getAbsolutePath());
boolean result = orderFileWatch.handleOrderFile(localFile); boolean result = orderFileWatch.handleOrderFile(localFile, LITEORDER_STYPE.MANUAL);
if (result) { if (result) {
return ResultBean.newOkResult("smfcore.order.uploadOK", "工单上传成功"); return ResultBean.newOkResult("smfcore.order.uploadOK", "工单上传成功");
} else { } else {
...@@ -258,6 +251,14 @@ public class OrderController { ...@@ -258,6 +251,14 @@ public class OrderController {
query.addCriteria(Criteria.where("status").is(LITEORDER_STATUS.CLOSED)); query.addCriteria(Criteria.where("status").is(LITEORDER_STATUS.CLOSED));
} else if (criteria.getStatus() == 2) { } else if (criteria.getStatus() == 2) {
query.addCriteria(Criteria.where("status").ne(LITEORDER_STATUS.CLOSED)); query.addCriteria(Criteria.where("status").ne(LITEORDER_STATUS.CLOSED));
}else if(criteria.getStatus()==3){
//进行中
query.addCriteria(Criteria.where("status").nin(LITEORDER_STATUS.CLOSED,LITEORDER_STATUS.NEW));
}else if(criteria.getStatus()==4){
query.addCriteria(Criteria.where("status").is(LITEORDER_STATUS.NEW));
}else if(criteria.getStatus()==5){
query.addCriteria(Criteria.where("status").is(LITEORDER_STATUS.CLOSED)
.and("appendData.shortage").is("true"));
} }
} }
PageData<LiteOrder> orderList = liteOrderManager.findByPage(query, pageable); PageData<LiteOrder> orderList = liteOrderManager.findByPage(query, pageable);
...@@ -769,4 +770,32 @@ public class OrderController { ...@@ -769,4 +770,32 @@ public class OrderController {
return ResultBean.newOkResult(""); return ResultBean.newOkResult("");
} }
@ApiOperation("获取工单看板信息")
@GetMapping("/kanban")
@PreAuthorize("@el.check('workOrder')")
public OrderKanbanDto orderKanban() {
int allCount = liteOrderManager.countByQuery(new Query(Criteria.where("orderNo").exists(true)));
int endCount = liteOrderManager.countByQuery(new Query(Criteria.where("status").is(LITEORDER_STATUS.CLOSED)));
Criteria c = new Criteria();
c.and("status").nin(LITEORDER_STATUS.CLOSED, LITEORDER_STATUS.NEW);
Query query = new Query(c);
int exeCount = liteOrderManager.countByQuery(query);
Query query1=new Query();
query1.addCriteria(Criteria.where("status").is(LITEORDER_STATUS.CLOSED)
.and("appendData.shortage").is("true"));
int abCount = liteOrderManager.countByQuery(query1);
int waitCount = liteOrderManager.countByQuery(new Query(Criteria.where("status").is(LITEORDER_STATUS.NEW)));
OrderKanbanDto dto = new OrderKanbanDto(allCount, endCount, exeCount, abCount, waitCount);
return dto;
}
@ApiOperation("返回全部线别")
@GetMapping(value = "/getAllLines")
@PreAuthorize("@el.check('workOrder')")
public List<String> getAllLines() {
List<String> allLineList = liteOrderManager.findAllLines();
return allLineList;
}
} }
package com.neotel.smfcore.core.order.rest.bean.dto; package com.neotel.smfcore.core.order.rest.bean.dto;
import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS; import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem; import com.neotel.smfcore.core.order.enums.LITEORDER_STYPE;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
...@@ -69,6 +69,8 @@ public class OrderDto implements Serializable { ...@@ -69,6 +69,8 @@ public class OrderDto implements Serializable {
@ApiModelProperty("工单来源") @ApiModelProperty("工单来源")
private String source = ""; private String source = "";
@ApiModelProperty("工单来源类型,0=手动创建,1=共享文件夹,2=系统对接")
private int sourceType = LITEORDER_STYPE.MANUAL;
@ApiModelProperty("任务完成时间(用于关闭页面显示)") @ApiModelProperty("任务完成时间(用于关闭页面显示)")
@Transient @Transient
......
package com.neotel.smfcore.core.order.rest.bean.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class OrderKanbanDto {
@ApiModelProperty("全部工单数")
private int orderCount;
@ApiModelProperty("已完成工单数")
private int endOrderCount;
@ApiModelProperty("执行中工单")
private int executingOrderCount;
@ApiModelProperty("异常工单")
private int abnormalOrderCount;
@ApiModelProperty("等待工单数")
private int waitOrderCount;
}
...@@ -4,6 +4,7 @@ package com.neotel.smfcore.core.order.rest.bean.query; ...@@ -4,6 +4,7 @@ package com.neotel.smfcore.core.order.rest.bean.query;
import com.neotel.smfcore.common.annotation.QueryCondition; import com.neotel.smfcore.common.annotation.QueryCondition;
import com.neotel.smfcore.common.bean.BetweenData; import com.neotel.smfcore.common.bean.BetweenData;
import lombok.Data; import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
...@@ -11,10 +12,14 @@ import java.util.List; ...@@ -11,10 +12,14 @@ import java.util.List;
@Data @Data
public class OrderQueryCondition { public class OrderQueryCondition {
@QueryCondition(blurry = "orderNo") @QueryCondition(blurry = "orderNo,so,soId,source,line")
private String blurry; private String blurry;
@QueryCondition(blurry = "orderNo")
private String orderNo = "";
@QueryCondition(type = QueryCondition.Type.BETWEEN) @QueryCondition(type = QueryCondition.Type.BETWEEN)
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private BetweenData<Date> createDate; private BetweenData<Date> createDate;
@QueryCondition(type = QueryCondition.Type.IN, propName = "source") @QueryCondition(type = QueryCondition.Type.IN, propName = "source")
...@@ -22,8 +27,12 @@ public class OrderQueryCondition { ...@@ -22,8 +27,12 @@ public class OrderQueryCondition {
@QueryCondition(type = QueryCondition.Type.NIN, propName = "source") @QueryCondition(type = QueryCondition.Type.NIN, propName = "source")
private List<String> excludeSourceList; private List<String> excludeSourceList;
//状态,0=所有,1=已关闭,2=未关闭 //状态,0=所有,1=已关闭,2=未关闭,3=进行中,4=等待中
private Integer status; private Integer status;
@QueryCondition(blurry = "line")
private String line;
// //
// @QueryCondition(type=QueryCondition.Type.IN,propName = "status") // @QueryCondition(type=QueryCondition.Type.IN,propName = "status")
// private List<Integer> statusList ; // private List<Integer> statusList ;
......
...@@ -2,5 +2,8 @@ package com.neotel.smfcore.core.order.service.dao; ...@@ -2,5 +2,8 @@ package com.neotel.smfcore.core.order.service.dao;
import com.neotel.smfcore.common.base.IBaseDao; import com.neotel.smfcore.common.base.IBaseDao;
import java.util.List;
public interface ILiteOrderDao extends IBaseDao { public interface ILiteOrderDao extends IBaseDao {
List<String> findAllLines();
} }
package com.neotel.smfcore.core.order.service.dao.impl; package com.neotel.smfcore.core.order.service.dao.impl;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.base.AbstractBaseDao; import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.core.order.service.dao.ILiteOrderDao; import com.neotel.smfcore.core.order.service.dao.ILiteOrderDao;
import com.neotel.smfcore.core.order.service.po.LiteOrder; import com.neotel.smfcore.core.order.service.po.LiteOrder;
import lombok.Data;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@Service @Service
public class LiteOrderDaoImpl extends AbstractBaseDao implements ILiteOrderDao { public class LiteOrderDaoImpl extends AbstractBaseDao implements ILiteOrderDao {
@Override @Override
public Class getEntityClass() { public Class getEntityClass() {
return LiteOrder.class; return LiteOrder.class;
} }
@Override
public List<String> findAllLines() {
Criteria criteria = Criteria.where("line").exists(true).ne(null);
Aggregation agg = Aggregation.newAggregation(
Aggregation.match(criteria),
Aggregation.group("line")
);
AggregationResults<LineInfo> results = getMongoTemplate().aggregate(agg, getEntityClass(), LineInfo.class);
List<LineInfo> selList = results.getMappedResults();
List<String> result = new ArrayList<>();
for (LineInfo lineInfo : selList
) {
if (ObjectUtil.isEmpty(lineInfo._id)) {
continue;
}
result.add(lineInfo._id);
}
return result;
}
@Data
private class LineInfo implements Serializable {
private String _id;
}
} }
...@@ -4,6 +4,7 @@ import com.neotel.smfcore.common.base.IBaseManager; ...@@ -4,6 +4,7 @@ import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.barcode.service.po.Barcode; import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.order.service.po.LiteOrder; import com.neotel.smfcore.core.order.service.po.LiteOrder;
import org.springframework.data.mongodb.core.query.Query;
import java.util.List; import java.util.List;
...@@ -12,9 +13,13 @@ public interface ILiteOrderManager extends IBaseManager<LiteOrder> { ...@@ -12,9 +13,13 @@ public interface ILiteOrderManager extends IBaseManager<LiteOrder> {
int countByCondition(String field, String value); int countByCondition(String field, String value);
int countByQuery(Query query);
LiteOrder createWithItems(LiteOrder liteOrder) throws ValidateException; LiteOrder createWithItems(LiteOrder liteOrder) throws ValidateException;
List<LiteOrder> findUnEndOrdersList(); List<LiteOrder> findUnEndOrdersList();
LiteOrder findBySource(String source); LiteOrder findBySource(String source);
List<String> findAllLines();
} }
...@@ -51,6 +51,13 @@ public class LiteOrderManagerImpl implements ILiteOrderManager { ...@@ -51,6 +51,13 @@ public class LiteOrderManagerImpl implements ILiteOrderManager {
} }
@Override @Override
public int countByQuery(Query query) {
if(query==null){
return (int)liteOrderDao.count();
}
return liteOrderDao.countByQuery(query);
}
@Override
public LiteOrder get(String id) { public LiteOrder get(String id) {
LiteOrder order= liteOrderDao.findOneById(id); LiteOrder order= liteOrderDao.findOneById(id);
if(order!=null&& order.getOrderItems()==null){ if(order!=null&& order.getOrderItems()==null){
...@@ -111,6 +118,11 @@ public class LiteOrderManagerImpl implements ILiteOrderManager { ...@@ -111,6 +118,11 @@ public class LiteOrderManagerImpl implements ILiteOrderManager {
} }
@Override @Override
public List<String> findAllLines() {
return liteOrderDao.findAllLines();
}
@Override
public PageData<LiteOrder> findByPage(Query query, Pageable pageable) { public PageData<LiteOrder> findByPage(Query query, Pageable pageable) {
int totalCount = liteOrderDao.countByQuery(query); int totalCount = liteOrderDao.countByQuery(query);
List<LiteOrder> list = liteOrderDao.findByQuery(query, pageable); List<LiteOrder> list = liteOrderDao.findByQuery(query, pageable);
......
package com.neotel.smfcore.core.order.service.po; package com.neotel.smfcore.core.order.service.po;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.base.BasePo; import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.common.utils.StorageConstants;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS; import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS;
import com.neotel.smfcore.core.order.enums.LITEORDER_STYPE;
import com.neotel.smfcore.core.storage.service.po.StoragePos; import com.neotel.smfcore.core.storage.service.po.StoragePos;
import lombok.Data; import lombok.Data;
import org.springframework.data.annotation.Transient; import org.springframework.data.annotation.Transient;
...@@ -66,6 +66,11 @@ public class LiteOrder extends BasePo implements Serializable { ...@@ -66,6 +66,11 @@ public class LiteOrder extends BasePo implements Serializable {
private boolean closed = false; private boolean closed = false;
/**
* 工单来源类型,0=手动创建,1=共享文件夹,2=系统对接
*/
private int sourceType = LITEORDER_STYPE.MANUAL;
/** /**
* 工单来源 * 工单来源
...@@ -113,6 +118,26 @@ public class LiteOrder extends BasePo implements Serializable { ...@@ -113,6 +118,26 @@ public class LiteOrder extends BasePo implements Serializable {
} }
} }
public void setStatus(int s) {
this.status = s;
if(s>LITEORDER_STATUS.NEW&&s<LITEORDER_STATUS.CLOSED){
String lastOutType = getAppend("outType");
int outtype =0;
if (ObjectUtil.isNotEmpty(lastOutType)) {
try {
outtype = Convert.toInt(lastOutType);
} catch (Exception exception) {
}
}
if (outtype < s) {
outtype=s;
addAppendDate("outType", outtype + "");
}
}
}
/** /**
* 是否正在出首套料 * 是否正在出首套料
* @return * @return
......
package com.neotel.smfcore.core.order.util; package com.neotel.smfcore.core.order.util;
import cn.hutool.core.util.ObjectUtil;
import com.google.common.collect.Lists;
import com.neotel.smfcore.common.csv.CsvReader;
import com.neotel.smfcore.common.utils.SmbUtil; import com.neotel.smfcore.common.utils.SmbUtil;
import com.neotel.smfcore.core.device.util.DataCache; import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.LiteOrderCache; import com.neotel.smfcore.core.order.enums.LITEORDER_STYPE;
import com.neotel.smfcore.core.order.listener.IOrderFileListener; import com.neotel.smfcore.core.order.listener.IOrderFileListener;
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.system.bean.OrderSetting;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings; import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.activation.MimeType;
import java.io.File; import java.io.File;
import java.io.FileFilter; import java.io.FileFilter;
import java.nio.file.Files;
import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
...@@ -88,7 +78,7 @@ public class OrderFileWatch { ...@@ -88,7 +78,7 @@ public class OrderFileWatch {
} }
}; };
for (File file : orderFolder.listFiles(fileFilter)) { for (File file : orderFolder.listFiles(fileFilter)) {
boolean handled = handleOrderFile(file); boolean handled = handleOrderFile(file, LITEORDER_STYPE.SHAREDFOLDER);
String backupFileName = file.getName() +"_" + System.currentTimeMillis(); String backupFileName = file.getName() +"_" + System.currentTimeMillis();
File resultFile = null; File resultFile = null;
...@@ -114,11 +104,11 @@ public class OrderFileWatch { ...@@ -114,11 +104,11 @@ public class OrderFileWatch {
* @param orderFile * @param orderFile
* @return * @return
*/ */
public boolean handleOrderFile(File orderFile){ public boolean handleOrderFile(File orderFile,int sourceType){
log.info("开始处理Order文件:" + orderFile.getAbsolutePath()); log.info("开始处理Order文件:" + orderFile.getAbsolutePath());
for (IOrderFileListener orderFileListener : orderFileListenerList) { for (IOrderFileListener orderFileListener : orderFileListenerList) {
boolean result = orderFileListener.handleOrderFile(orderFile); boolean result = orderFileListener.handleOrderFile(orderFile,sourceType);
if(result){ if(result){
return true; return true;
} }
......
...@@ -136,6 +136,11 @@ public class SpSolderController { ...@@ -136,6 +136,11 @@ public class SpSolderController {
SpSettingsDto dto = mapper.toDto(spSettings); SpSettingsDto dto = mapper.toDto(spSettings);
dto.setMinTemperature(msdSettiings.getMinTemperature()); dto.setMinTemperature(msdSettiings.getMinTemperature());
dto.setMaxTemperature(msdSettiings.getMaxTemperature()); dto.setMaxTemperature(msdSettiings.getMaxTemperature());
Boolean autoStartMixed=dataCache.getCache(Constants.CACHE_SP_AUTO_START_MIXED);
if(autoStartMixed==null){
autoStartMixed=false;
}
dto.setAutoStartMixed(autoStartMixed);
return dto; return dto;
} }
...@@ -161,6 +166,10 @@ public class SpSolderController { ...@@ -161,6 +166,10 @@ public class SpSolderController {
msdSettiings.setMaxTemperature(dto.getMaxTemperature()); msdSettiings.setMaxTemperature(dto.getMaxTemperature());
dataCache.updateCache(Constants.CACHE_msdSetting, msdSettiings); dataCache.updateCache(Constants.CACHE_msdSetting, msdSettiings);
log.info("更改MSD:CACHE_msdSetting=" + msdSettiings.toString()); log.info("更改MSD:CACHE_msdSetting=" + msdSettiings.toString());
dataCache.updateCache(Constants.CACHE_SP_AUTO_START_MIXED,dto.isAutoStartMixed());
log.info("更改锡膏料仓 CACHE_SP_AUTO_START_MIXED="+dto.isAutoStartMixed());
return ResultBean.newOkResult("保存成功"); return ResultBean.newOkResult("保存成功");
} }
......
...@@ -24,4 +24,7 @@ public class SpSettingsDto { ...@@ -24,4 +24,7 @@ public class SpSettingsDto {
@ApiModelProperty("最高温度") @ApiModelProperty("最高温度")
private float maxTemperature = 38.0F; private float maxTemperature = 38.0F;
@ApiModelProperty("回温完成自动开始搅拌")
private boolean autoStartMixed=false;
} }
...@@ -2,6 +2,7 @@ package com.neotel.smfcore.core.solder.util; ...@@ -2,6 +2,7 @@ package com.neotel.smfcore.core.solder.util;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.core.barcode.enums.SOLDER_STATUS; import com.neotel.smfcore.core.barcode.enums.SOLDER_STATUS;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager; import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode; import com.neotel.smfcore.core.barcode.service.po.Barcode;
...@@ -141,10 +142,24 @@ public class SolderBoxCache { ...@@ -141,10 +142,24 @@ public class SolderBoxCache {
log.info(barcode.getBarcode() + "到达回温时间,搅拌时间为0,修改状态为待出库"); log.info(barcode.getBarcode() + "到达回温时间,搅拌时间为0,修改状态为待出库");
barcode.setSolderStatus(SOLDER_STATUS.TO_BE_OUT.name()); barcode.setSolderStatus(SOLDER_STATUS.TO_BE_OUT.name());
}else{ }else{
//判断是否自动开始搅拌
Boolean autoStartMixed=dataCache.getCache(Constants.CACHE_SP_AUTO_START_MIXED);
if(autoStartMixed==null){
autoStartMixed=false;
}
if(autoStartMixed){
log.info(barcode.getBarcode() + "到达回温时间,已配置CACHE_SP_AUTO_START_MIXED=true,自动开始搅拌,修改状态=TO_BE_MIXED");
barcode.setSolderStatus(SOLDER_STATUS.TO_BE_MIXED.name());
}else{
log.info(barcode.getBarcode() + "到达回温时间,修改状态为等待搅拌,待手动开始搅拌后再开始搅拌"); log.info(barcode.getBarcode() + "到达回温时间,修改状态为等待搅拌,待手动开始搅拌后再开始搅拌");
barcode.setSolderStatus(SOLDER_STATUS.WAIT_MIXED.name()); barcode.setSolderStatus(SOLDER_STATUS.WAIT_MIXED.name());
} }
}
barcode = barcodeManager.save(barcode); barcode = barcodeManager.save(barcode);
storagePos.setBarcode(barcode); storagePos.setBarcode(barcode);
storagePosManager.save(storagePos); storagePosManager.save(storagePos);
......
package com.neotel.smfcore.core.storage.rest; package com.neotel.smfcore.core.storage.rest;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.neotel.smfcore.common.bean.PageData; import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.bean.ResultBean; import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ApiException;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.*; import com.neotel.smfcore.common.utils.*;
import com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE; import com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager; import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode; import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.util.DataCache; import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.language.util.MessageUtils; import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.core.storage.bean.InventoryItem; import com.neotel.smfcore.core.storage.bean.InventoryItem;
import com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE;
import com.neotel.smfcore.core.storage.rest.dto.*; import com.neotel.smfcore.core.storage.rest.dto.*;
import com.neotel.smfcore.core.storage.rest.mapstruct.InventoryItemMapper; import com.neotel.smfcore.core.storage.rest.mapstruct.InventoryItemMapper;
import com.neotel.smfcore.core.storage.rest.mapstruct.StoragePosMapper; import com.neotel.smfcore.core.storage.rest.mapstruct.StoragePosMapper;
...@@ -77,6 +82,9 @@ public class MaterialController { ...@@ -77,6 +82,9 @@ public class MaterialController {
@Autowired @Autowired
private final IGroupManager groupManager; private final IGroupManager groupManager;
@Autowired
private CodeResolve codeResolve;
@ApiOperation("导出库存列表") @ApiOperation("导出库存列表")
@GetMapping(value = "/inventory/download") @GetMapping(value = "/inventory/download")
@PreAuthorize("@el.check('tacticsOuput')") @PreAuthorize("@el.check('tacticsOuput')")
...@@ -388,4 +396,37 @@ public class MaterialController { ...@@ -388,4 +396,37 @@ public class MaterialController {
} }
} }
@ApiOperation("扫描空盘直接出库")
@RequestMapping("/scanEmptyPallet")
public ResultBean scanEmptyPallet(@RequestBody Map<String, String> paramMap) {
String code = paramMap.get("code");
log.info("扫描空盘直接出库,信息为:" + code);
if (StringUtils.isEmpty(code)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"code"});
}
Barcode barcode = codeResolve.resolveOneValideBarcode("=1x1=" + code);
if (barcode == null) {
return ResultBean.newErrorResult(-1, "smfcore.error.barcode.noValidCode", "无效的条码");
}
List<String> availableStorageIds = dataCache.getAvailableStorageIds();
String partNumber = barcode.getPartNumber();
Collection<String> excludePosIds = taskService.excludePosIds();
CHECKOUT_TYPE checkOutType = dataCache.getCheckOutType();
StoragePos pos = storagePosManager.findPartNumberInStorages(availableStorageIds, partNumber, excludePosIds, checkOutType);
if (pos == null) {
return ResultBean.newErrorResult(-1, "smfcore.label.noReel", "未找到可出库的物料");
}
log.info("扫描空盘出库,对应的partNumber为:" + barcode.getPartNumber() + ",对应的库位:" + pos.getPosName() + ",进行出库");
Storage storage = dataCache.getStorageById(pos.getStorageId());
DataLog task = new DataLog(storage,pos.getBarcode(),pos);
task.setType(OP.CHECKOUT);
task.setOperator(SecurityUtils.getCurrentUsername());
task.setSingleOut(true);
task.setSourceId(null);
task.setSourceName("PN");
taskService.addTaskToExecute(task);
return ResultBean.newOkResult("");
}
} }
...@@ -34,6 +34,8 @@ public class OrderSetting implements Serializable { ...@@ -34,6 +34,8 @@ public class OrderSetting implements Serializable {
*/ */
public Map<String,String> appendData = new HashMap<>(); public Map<String,String> appendData = new HashMap<>();
@ApiModelProperty("缺料不自动关闭工单")
private boolean closeWorkOrder = false;
/** /**
* 是否显示料架亮灯方式 * 是否显示料架亮灯方式
*/ */
......
package com.neotel.smfcore.core.system.rest;
import com.google.common.collect.Lists;
import com.neotel.smfcore.common.base.IExcelDownLoad;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.core.system.rest.bean.dto.MaterialTraceDto;
import com.neotel.smfcore.core.system.rest.bean.mapstruct.MaterialTraceMapper;
import com.neotel.smfcore.core.system.rest.bean.query.MaterialTraceQueryCondition;
import com.neotel.smfcore.core.system.service.manager.IMaterialTraceManager;
import com.neotel.smfcore.core.system.service.po.MaterialTrace;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
@Slf4j
@Api(tags = "物料追溯管理")
@RestController
@RequestMapping("/api/materialTrace")
@RequiredArgsConstructor
public class MaterialTraceController {
@Autowired
private IMaterialTraceManager materialTraceManager;
@Autowired
private MaterialTraceMapper materialTraceMapper;
@ApiOperation("查询物料追溯信息")
@GetMapping("/history")
@PreAuthorize("@el.check('materialTrace')")
@AnonymousAccess
public PageData<MaterialTraceDto> query(MaterialTraceQueryCondition criteria, Pageable pageable) {
Query query = getQuery(criteria);
PageData<MaterialTrace> materialTraceList = materialTraceManager.findByPage(query, pageable);
PageData<MaterialTraceDto> result = materialTraceMapper.toDto(materialTraceList);
return result;
}
@ApiOperation("导出物料追溯日志")
@GetMapping(value = "/history/download")
@PreAuthorize("@el.check('taskLog')")
@AnonymousAccess
public void download(HttpServletResponse response, MaterialTraceQueryCondition criteria, Pageable pageable, HttpServletRequest request) throws IOException {
Query query = getQuery(criteria);
Locale locale = request.getLocale();
log.info("开始导出物料追溯日志");
FileUtil.downloadExcel(query, pageable, response, new IExcelDownLoad() {
@Override
public List<List<String>> getHeader() {
List<List<String>> header = new ArrayList<>();
header.add(Lists.newArrayList(MessageUtils.getSmfClientMsg("smfclient.NeoLight.barcode",locale,"条码编号")));
header.add(Lists.newArrayList(MessageUtils.getSmfClientMsg("smfclient.NeoLight.partNumber",locale,"料件编号")));
header.add(Lists.newArrayList(MessageUtils.getSmfClientMsg("smfclient.NeoLight.posName",locale,"料仓名称")));
header.add(Lists.newArrayList(MessageUtils.getSmfClientMsg("smfclient.NeoLight.amount",locale,"数量")));
header.add(Lists.newArrayList(MessageUtils.getSmfClientMsg("smfclient.NeoLight.type",locale,"类型")));
header.add(Lists.newArrayList(MessageUtils.getSmfClientMsg("smfclient.NeoLight.orderSource",locale,"来源")));
header.add(Lists.newArrayList(MessageUtils.getSmfClientMsg("smfclient.NeoLight.status",locale,"状态")));
header.add(Lists.newArrayList(MessageUtils.getSmfClientMsg("smfclient.NeoLight.operator",locale,"操作人")));
header.add(Lists.newArrayList(MessageUtils.getSmfClientMsg("smfclient.NeoLight.createDate",locale,"创建时间")));
header.add(Lists.newArrayList(MessageUtils.getSmfClientMsg("smfclient.NeoLight.updateDate",locale,"更新时间")));
return header;
}
@Override
public List<List<Object>> getPageData(Query query, Pageable pageable) {
List<List<Object>> dataList = new ArrayList<>();
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
List<MaterialTrace> materialTraceList = materialTraceManager.findByQuery(query,pageable);
for (MaterialTrace materialTrace : materialTraceList) {
String createDate = dateFormat.format(materialTrace.getCreateDate());
String updateDate = dateFormat.format(materialTrace.getUpdateDate());
List<Object> data = new ArrayList<>();
data.add(materialTrace.getBarcode());
data.add(materialTrace.getPartNumber());
data.add(materialTrace.getPosName() + " " + materialTrace.getStorageName());
data.add(materialTrace.getNum());
String typeKey = "NeoLight.logType." + materialTrace.getType();
String typeMsg = MessageUtils.getSmfClientMsg(typeKey,locale,typeKey);
data.add(typeMsg);
data.add(materialTrace.getSourceName());
String status = materialTrace.getStatus().toLowerCase();
String statusKey = "NeoLight.logStatus." + status;
String statusMsg = MessageUtils.getSmfClientMsg(statusKey,locale,statusKey);
data.add(statusMsg);
data.add(materialTrace.getOperator());
data.add(createDate);
data.add(updateDate);
dataList.add(data);
}
return dataList;
}
});
log.info("物料追溯日志导出完成");
}
private Query getQuery(MaterialTraceQueryCondition criteria){
String un_End = "UN_END";
boolean unEnd = false;
boolean finished=false;
if (criteria.getStatus()!=null&& criteria.getStatus().equals(un_End)) {
criteria.setStatus(null);
unEnd = true;
}else if(criteria.getStatus()!=null&&criteria.getStatus().equals(OP_STATUS.FINISHED.name())){
criteria.setStatus(null);
finished=true;
}
/*if (StringUtils.isBlank(criteria.getStorageId())){
criteria.setStorageIdList(SecurityUtils.getUserGroupStorageId());
}*/
Query query = QueryHelp.getQuery(criteria);
if (unEnd) {
query.addCriteria(Criteria.where("status").nin(OP_STATUS.END.name(), OP_STATUS.FINISHED.name()));
}else if(finished){
query.addCriteria(Criteria.where("status").in(OP_STATUS.END.name(), OP_STATUS.FINISHED.name()));
}
return query;
}
}
...@@ -151,6 +151,10 @@ public class SettingsController { ...@@ -151,6 +151,10 @@ public class SettingsController {
break; break;
} }
} }
Boolean closeWorkOrder = dataCache.getCache(Constants.CACHE_closeWorkOrder);
if(closeWorkOrder!=null){
orderSetting.setCloseWorkOrder(closeWorkOrder);
}
return orderSetting; return orderSetting;
} }
...@@ -208,6 +212,7 @@ public class SettingsController { ...@@ -208,6 +212,7 @@ public class SettingsController {
} }
dataCache.updateCache(Constants.CACHE_OrderSetting, orderSetting); dataCache.updateCache(Constants.CACHE_OrderSetting, orderSetting);
dataCache.updateCache(Constants.CACHE_closeWorkOrder,orderSetting.isCloseWorkOrder());
log.info("更改工单设置:"+Constants.CACHE_OrderSetting+"=" + orderSetting.toString()); log.info("更改工单设置:"+Constants.CACHE_OrderSetting+"=" + orderSetting.toString());
return ResultBean.newOkResult("保存成功"); return ResultBean.newOkResult("保存成功");
......
package com.neotel.smfcore.core.system.rest.bean.dto;
import lombok.Data;
@Data
public class MaterialTraceDto extends TaskDto {
}
package com.neotel.smfcore.core.system.rest.bean.mapstruct;
import com.neotel.smfcore.common.base.BaseMapper;
import com.neotel.smfcore.core.system.rest.bean.dto.MaterialTraceDto;
import com.neotel.smfcore.core.system.service.po.MaterialTrace;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
@Mapper(componentModel = "spring",unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface MaterialTraceMapper extends BaseMapper<MaterialTraceDto, MaterialTrace> {
}
package com.neotel.smfcore.core.system.rest.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 MaterialTraceQueryCondition {
@QueryCondition(blurry = "barcode,partNumber,posName,sourceName,subSourceInfo,memo")
@ApiModelProperty("模糊搜索")
private String blurry;
@QueryCondition
@ApiModelProperty("条码编号")
private String barcode;
@QueryCondition(type = QueryCondition.Type.BETWEEN, propName = "updateDate")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private BetweenData<Date> updateDate;
@QueryCondition
@ApiModelProperty("來源ID")
private String sourceId;
@QueryCondition
@ApiModelProperty("任务状态")
private String status;
@QueryCondition(isDBId =true)
@ApiModelProperty("料仓Id")
private String storageId;
@QueryCondition(type = QueryCondition.Type.IN, propName = "storageId")
private List<String> storageIdList;
@QueryCondition
@ApiModelProperty("出入库类型")
private Integer type;
@ApiModelProperty("分组ID")
private String groupId;
@ApiModelProperty("CID数组")
private String[] cids;
@QueryCondition
@ApiModelProperty("来源名称")
private String sourceName;
@QueryCondition
@ApiModelProperty("出入库类型")
private String inOutType;
@QueryCondition
@ApiModelProperty("操作人")
private String operator;
}
package com.neotel.smfcore.core.system.service.dao;
import com.neotel.smfcore.common.base.IBaseDao;
public interface IMaterialTraceDao extends IBaseDao {
}
package com.neotel.smfcore.core.system.service.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.core.system.service.dao.IMaterialTraceDao;
import com.neotel.smfcore.core.system.service.po.MaterialTrace;
import org.springframework.stereotype.Service;
@Service
public class MaterialTraceDaoImpl extends AbstractBaseDao implements IMaterialTraceDao {
@Override
public Class getEntityClass() {
return MaterialTrace.class;
}
}
package com.neotel.smfcore.core.system.service.manager;
import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.core.system.service.po.MaterialTrace;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Query;
import java.util.List;
public interface IMaterialTraceManager extends IBaseManager<MaterialTrace> {
//List<MaterialTrace> dataLogs = materialTraceManager.findByQuery(query,pageable);
List<MaterialTrace> findByQuery(Query query, Pageable pageable);
}
...@@ -63,6 +63,7 @@ public class DataLogManagerImpl implements IDataLogManager { ...@@ -63,6 +63,7 @@ public class DataLogManagerImpl implements IDataLogManager {
Calendar calendar = Calendar.getInstance(); Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.HOUR_OF_DAY,-48); calendar.add(Calendar.HOUR_OF_DAY,-48);
c.and("updateDate").gte(calendar.getTime()); c.and("updateDate").gte(calendar.getTime());
c.and("closed").is(false);
Query query = Query.query(c); Query query = Query.query(c);
List<DataLog> unFinishedTasks = findByQuery(query); List<DataLog> unFinishedTasks = findByQuery(query);
if(unFinishedTasks == null){ if(unFinishedTasks == null){
......
package com.neotel.smfcore.core.system.service.manager.impl;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.system.service.dao.IMaterialTraceDao;
import com.neotel.smfcore.core.system.service.manager.IMaterialTraceManager;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.service.po.MaterialTrace;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class MaterialTraceManagerImpl implements IMaterialTraceManager {
@Autowired
private IMaterialTraceDao materialTraceDao;
@Override
public MaterialTrace get(String id) {
return null;
}
@Override
public MaterialTrace save(MaterialTrace object) throws ValidateException {
return materialTraceDao.save(object);
}
@Override
public void delete(MaterialTrace object) throws ValidateException {
}
@Override
public PageData<MaterialTrace> findByPage(Query query, Pageable pageable) {
int totalCount = materialTraceDao.countByQuery(query);
List<MaterialTrace> list = materialTraceDao.findByQuery(query, pageable);
return new PageData<MaterialTrace>(list, totalCount);
}
@Override
public List<MaterialTrace> findByQuery(Query query) {
return null;
}
@Override
public List<MaterialTrace> findByQuery(Query query, Pageable pageable) {
return materialTraceDao.findByQuery(query,pageable);
}
}
...@@ -249,6 +249,10 @@ public class DataLog extends BasePo implements Serializable ,Comparable<DataLog> ...@@ -249,6 +249,10 @@ public class DataLog extends BasePo implements Serializable ,Comparable<DataLog>
private String line = ""; private String line = "";
//是否关闭
private boolean closed = false;
public String getBarcode() { public String getBarcode() {
if(barcode == null){ if(barcode == null){
return ""; return "";
......
package com.neotel.smfcore.core.system.service.po;
import lombok.Data;
/**
* 物料追溯(字段和datalog一样,直接继承使用)
*/
@Data
public class MaterialTrace extends DataLog {
}
...@@ -2,11 +2,14 @@ package com.neotel.smfcore.core.system.service.po; ...@@ -2,11 +2,14 @@ package com.neotel.smfcore.core.system.service.po;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.neotel.smfcore.common.base.BasePo; import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.core.barcode.bean.BarcodeRuleDetail;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
@Data @Data
public class Settings extends BasePo implements Serializable { public class Settings extends BasePo implements Serializable {
...@@ -181,4 +184,9 @@ public class Settings extends BasePo implements Serializable { ...@@ -181,4 +184,9 @@ public class Settings extends BasePo implements Serializable {
private String notIntoCids = ""; private String notIntoCids = "";
private boolean checkLineShelf = false; private boolean checkLineShelf = false;
/**
* 具体规则详情
*/
private Map<String, BarcodeRuleDetail> barcodeRuleMap = new HashMap<>();
} }
package com.neotel.smfcore.core.system.util;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.neotel.smfcore.core.system.bean.MSDAppendInfo;
import com.neotel.smfcore.core.system.service.manager.IMaterialTraceManager;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.service.po.MaterialTrace;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
@Slf4j
@Service
public class MaterialTraceUtil {
@Autowired
private IMaterialTraceManager materialTraceManager;
//把task每个状态都拆分出来 重新保存一张表
public void onTaskStatusChange(DataLog task) {
try {
MaterialTrace materialTrace = dataLogToMaterialTrace(task);
materialTrace.setId("");
materialTrace.setCreateDate(new Date());
materialTrace.setUpdateDate(new Date());
materialTraceManager.save(materialTrace);
} catch (Exception e) {
e.printStackTrace();
}
}
private MaterialTrace dataLogToMaterialTrace(DataLog task) throws JsonProcessingException {
MaterialTrace materialTrace = new MaterialTrace();
materialTrace.setSingleOut(task.isSingleOut());
materialTrace.setStorageName(task.getStorageName());
materialTrace.setCid(task.getCid());
materialTrace.setStorageId(task.getStorageId());
materialTrace.setGroupId(task.getGroupId());
materialTrace.setSourceId(task.getSourceId());
materialTrace.setPosId(task.getPosId());
materialTrace.setPosName(task.getPosName());
materialTrace.setBarcode(task.getBarcode());
materialTrace.setW(task.getW());
materialTrace.setH(task.getH());
materialTrace.setCutReel(task.isCutReel());
materialTrace.setUrgentReel(task.isUrgentReel());
materialTrace.setLessSendReel(task.isLessSendReel());
materialTrace.setNgReel(task.isNgReel());
materialTrace.setPackageReel(task.isPackageReel());
materialTrace.setPartNumber(task.getPartNumber());
materialTrace.setNum(task.getNum());
materialTrace.setType(task.getType());
materialTrace.setStatus(task.getStatus());
materialTrace.setBatchId(task.getBatchId());
materialTrace.setBatchInfo(task.getBatchInfo());
materialTrace.setSourceType(task.getSourceType());
materialTrace.setSourceId(task.getSourceId());
materialTrace.setSourceName(task.getSourceName());
materialTrace.setSubSourceId(task.getSubSourceId());
materialTrace.setSubSourceInfo(task.getSubSourceInfo());
materialTrace.setCreator(task.getCreator());
materialTrace.setOperator(task.getOperator());
materialTrace.setRelationCodes(task.getRelationCodes());
materialTrace.setMemo(task.getMemo());
materialTrace.setMixTime(task.getMixTime());
materialTrace.setLightColor(task.getLightColor());
materialTrace.setExecuteTime(task.getExecuteTime());
materialTrace.setInStoreTime(task.getInStoreTime());
materialTrace.setPutInDate(task.getPutInDate());
materialTrace.setLocInfo(task.getLocInfo());
materialTrace.setInOutType(task.getInOutType());
materialTrace.setProviderNumber(task.getProviderNumber());
materialTrace.setMsdAppendInfo(task.getMsdAppendInfo());
materialTrace.setPriority(task.getPriority());
materialTrace.setLine(task.getLine());
materialTrace.setClosed(task.isClosed());
return materialTrace;
}
}
...@@ -56,6 +56,10 @@ public class TaskService { ...@@ -56,6 +56,10 @@ public class TaskService {
@Autowired @Autowired
protected SelfAuditUtil selfAuditUtil; protected SelfAuditUtil selfAuditUtil;
@Autowired
private MaterialTraceUtil materialTraceUtil;
@Autowired @Autowired
private SmfApi smfApi; private SmfApi smfApi;
...@@ -165,6 +169,7 @@ public class TaskService { ...@@ -165,6 +169,7 @@ public class TaskService {
liteOrderCache.onTaskStatusChange(task); liteOrderCache.onTaskStatusChange(task);
smfApi.onTaskStatusChange(task); smfApi.onTaskStatusChange(task);
selfAuditUtil.onTaskStatusChange(task); selfAuditUtil.onTaskStatusChange(task);
materialTraceUtil.onTaskStatusChange(task);
} }
/** /**
......
...@@ -7,6 +7,7 @@ import com.neotel.smfcore.common.utils.JsonUtil; ...@@ -7,6 +7,7 @@ import com.neotel.smfcore.common.utils.JsonUtil;
import com.neotel.smfcore.core.api.bean.CodeValidateParam; import com.neotel.smfcore.core.api.bean.CodeValidateParam;
import com.neotel.smfcore.core.api.listener.BaseSmfApiListener; import com.neotel.smfcore.core.api.listener.BaseSmfApiListener;
import com.neotel.smfcore.core.barcode.service.po.Barcode; import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.order.enums.LITEORDER_STYPE;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderItemManager; import com.neotel.smfcore.core.order.service.manager.ILiteOrderItemManager;
import com.neotel.smfcore.core.order.service.po.LiteOrder; import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem; import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
...@@ -370,6 +371,7 @@ public class AdvantechApi extends BaseSmfApiListener { ...@@ -370,6 +371,7 @@ public class AdvantechApi extends BaseSmfApiListener {
liteOrder.setSoId(wip_no); liteOrder.setSoId(wip_no);
liteOrder.setLine(line_desc); liteOrder.setLine(line_desc);
liteOrder.setSource(line_id); liteOrder.setSource(line_id);
liteOrder.setSourceType(LITEORDER_STYPE.API);
liteOrder.setSo(model_no); liteOrder.setSo(model_no);
} }
......
...@@ -22,8 +22,9 @@ public class FujiMenu { ...@@ -22,8 +22,9 @@ public class FujiMenu {
String menuLabel = "fuji"; String menuLabel = "fuji";
Menu nexim = Menu.CreatePMenu("Nexim", 3, "nexim", "nexim", null); // Menu nexim = Menu.CreatePMenu("Nexim", 3, "nexim", "nexim", null);
MenuInit.addMenu(menuLabel,nexim,3, "Nexim 工单","neximWorkOrder", "neolight/neximWorkOrder/index","neximWorkOrder"); Menu poutOut = Menu.CreatePMenu("物料管理", 3, "order", "workOrder", null);
MenuInit.addMenu(menuLabel,poutOut,3, "Nexim 工单","neximWorkOrder", "neolight/neximWorkOrder/index","neximWorkOrder");
String apiName = smfApi.getApiName(); String apiName = smfApi.getApiName();
if(Strings.isNotBlank(apiName) && apiName.equals(menuLabel)){ if(Strings.isNotBlank(apiName) && apiName.equals(menuLabel)){
......
package com.neotel.smfcore.custom.fuji.bean.dto;
import com.neotel.smfcore.custom.fuji.bean.FujiConfig;
import lombok.Data;
import java.util.Date;
@Data
public class FujiConfigDto extends FujiConfig {
private String etoUpdateDateStr;
private String etnUpdateDateStr;
}
...@@ -11,6 +11,7 @@ import com.neotel.smfcore.core.order.service.po.LiteOrder; ...@@ -11,6 +11,7 @@ import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem; import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.custom.fuji.FujiApi; import com.neotel.smfcore.custom.fuji.FujiApi;
import com.neotel.smfcore.custom.fuji.bean.FujiConfig; import com.neotel.smfcore.custom.fuji.bean.FujiConfig;
import com.neotel.smfcore.custom.fuji.bean.dto.FujiConfigDto;
import com.neotel.smfcore.custom.fuji.config.FujiCacheConfig; import com.neotel.smfcore.custom.fuji.config.FujiCacheConfig;
import com.neotel.smfcore.custom.fuji.order.service.JobService; import com.neotel.smfcore.custom.fuji.order.service.JobService;
import com.neotel.smfcore.security.annotation.AnonymousAccess; import com.neotel.smfcore.security.annotation.AnonymousAccess;
...@@ -21,6 +22,8 @@ import org.springframework.web.bind.annotation.RequestBody; ...@@ -21,6 +22,8 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -71,7 +74,19 @@ public class FujiController { ...@@ -71,7 +74,19 @@ public class FujiController {
if (config == null) { if (config == null) {
config = new FujiConfig(); config = new FujiConfig();
} }
return ResultBean.newOkResult(config); FujiConfigDto dto = new FujiConfigDto();
dto.setAuthUrl(config.getAuthUrl());
dto.setGetDidInfoUrl(config.getGetDidInfoUrl());
dto.setRegisterDidInfoUrl(config.getRegisterDidInfoUrl());
dto.setResult(config.getResult());
dto.setLastUpdateTime(config.getLastUpdateTime());
dto.setInputEto(config.getInputEto());
dto.setOutputEtn(config.getOutputEtn());
dto.setTime(config.getTime());
dto.setEtnUpdateDateStr(getUpdateDate(config.getOutputEtn()));
dto.setEtoUpdateDateStr(getUpdateDate(config.getInputEto()));
return ResultBean.newOkResult(dto);
} }
@ApiOperation("did注册") @ApiOperation("did注册")
...@@ -97,7 +112,7 @@ public class FujiController { ...@@ -97,7 +112,7 @@ public class FujiController {
@ApiOperation("job出库") @ApiOperation("job出库")
@RequestMapping("/jobCheckOut") @RequestMapping("/jobCheckOut")
@AnonymousAccess //@AnonymousAccess
public synchronized ResultBean jobCheckOut(String orderNo) { public synchronized ResultBean jobCheckOut(String orderNo) {
LiteOrder liteOrder = liteOrderCache.getLiteOrder(orderNo); LiteOrder liteOrder = liteOrderCache.getLiteOrder(orderNo);
if (liteOrder == null){ if (liteOrder == null){
...@@ -117,7 +132,7 @@ public class FujiController { ...@@ -117,7 +132,7 @@ public class FujiController {
@ApiOperation("获取需要出库/正在执行中的job任务") @ApiOperation("获取需要出库/正在执行中的job任务")
@RequestMapping("/jobInfo") @RequestMapping("/jobInfo")
@AnonymousAccess //@AnonymousAccess
public ResultBean getJobInfo() { public ResultBean getJobInfo() {
List<Map<String, Object>> resultList = new ArrayList<>(); List<Map<String, Object>> resultList = new ArrayList<>();
Collection<LiteOrder> allLiteOrder = liteOrderCache.getAllLiteOrder(); Collection<LiteOrder> allLiteOrder = liteOrderCache.getAllLiteOrder();
...@@ -172,4 +187,41 @@ public class FujiController { ...@@ -172,4 +187,41 @@ public class FujiController {
} }
return ResultBean.newOkResult(resultList); return ResultBean.newOkResult(resultList);
} }
@ApiOperation("获取文件修改时间")
@RequestMapping("/getFileUpdateDate")
//@AnonymousAccess
public ResultBean getFileUpdateDate(String param) {
FujiConfig config = dataCache.getCache(FujiCacheConfig.FujiConfig_Cache_Name);
if (config == null) {
config = new FujiConfig();
}
String updateStr = "";
String fileName = "";
if (param.contains("eto")) {
fileName = config.getInputEto();
updateStr = getUpdateDate(config.getInputEto());
} else if (param.contains("etn")) {
fileName = config.getOutputEtn();
updateStr = getUpdateDate(config.getOutputEtn());
}
Map<String, String> resultMap = new HashMap<>();
resultMap.put("updateDate", updateStr);
resultMap.put("fileName", fileName);
return ResultBean.newOkResult(resultMap);
}
private String getUpdateDate(String fileName) {
if (StringUtils.isNotEmpty(fileName)) {
File file = new File(fileName);
if (file.exists()) {
long lastModified = file.lastModified();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(new Date(lastModified));
}
}
return "";
}
} }
...@@ -8,6 +8,7 @@ import com.neotel.smfcore.core.device.enums.OP; ...@@ -8,6 +8,7 @@ import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.util.DataCache; import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.LiteOrderCache; import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS; import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS;
import com.neotel.smfcore.core.order.enums.LITEORDER_STYPE;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderItemManager; 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.manager.ILiteOrderManager;
import com.neotel.smfcore.core.order.service.po.LiteOrder; import com.neotel.smfcore.core.order.service.po.LiteOrder;
...@@ -192,6 +193,7 @@ public class JobService { ...@@ -192,6 +193,7 @@ public class JobService {
//设置工单名和额外字段 //设置工单名和额外字段
liteOrder.setOrderNo(jobName + "_" + fileName); liteOrder.setOrderNo(jobName + "_" + fileName);
liteOrder.setSource("nexim"); liteOrder.setSource("nexim");
liteOrder.setSourceType(LITEORDER_STYPE.API);
liteOrder.addAppendDate("jobState", jobState); liteOrder.addAppendDate("jobState", jobState);
liteOrder.addAppendDate("jobName", jobName); liteOrder.addAppendDate("jobName", jobName);
liteOrder.addAppendDate("fileName", fileName); liteOrder.addAppendDate("fileName", fileName);
......
package com.neotel.smfcore.custom.haierIndiaSp1560;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.exception.ApiException;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.common.utils.HttpHelper;
import com.neotel.smfcore.common.utils.JsonUtil;
import com.neotel.smfcore.core.api.listener.BaseSmfApiListener;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
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.po.DataLog;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
@Service
@Slf4j
public class HaierIndiaSpApi extends BaseSmfApiListener {
// api:
// name: sp1560
// outNotifyUrl: http://xxxxxxxx/interface/fridge
// inNotifyUrl: http://xxxxxxxx/interface/fridge
// taskNotifyUrl: http://xxxxxxxx/interface/fridge
@Autowired
private IStoragePosManager storagePosManager;
@Override
public boolean isForThisApi(String apiName) {
return apiName != null && apiName.equalsIgnoreCase("sp1560");
}
@Override
public void inTaskStatusChange(String inNotifyUrl, DataLog task){
TaskStatusChange(inNotifyUrl,task);
}
@Override
public void outTaskStatusChange(String outNotifyUrl, DataLog task){
TaskStatusChange(outNotifyUrl,task);
}
@Override
public void otherTaskStatusChange(String taskNotifyUrl, DataLog task) {
TaskStatusChange(taskNotifyUrl,task);
}
public boolean TaskStatusChange(String url, DataLog task ) {
if (ObjectUtil.isEmpty(url)) {
return false;
}
// 参数名 参数类型 备注
// data JSON 提交JSON数据集
// 参数名 参数类型 备注
// STATUS STRING 操作类型,0出冰箱 1入冰箱 2回温 3 搅拌 4领用5 回收 必填
// ITEM_SN STRING 锡膏SN,必填
// EMP STRING 操作员工号,选填
// OP_TIME STRING 操作时间,必填,格式:yyyy-MM-dd HH:mm:ss
Barcode barcode = barcodeManager.get(task.getBarcode());
int opType = -1;
if (task.isCheckOutTask()) {
//4领用
opType = 4;
} else if (task.isPutInTask()) {
StoragePos pos = storagePosManager.getByPosName(task.getPosName());
if (!pos.isWarmPos()) {
//入库到冷藏区, 1入冰箱
opType = 1;
}
} else if (task.isRewarmTakingTask()) {
//回温取料, 0出冰箱
opType = 0;
} else if (task.isRewarmPuttingTask()) {
//回温放料,2 回温
opType = 2;
}
if (opType == -1) {
return false;
}
try {
Map<String, Object> param = new HashMap<>();
Map<String, String> dataMap = new HashMap<>();
dataMap.put("STATUS", opType + "");
dataMap.put("ITEM_SN", barcode.getBarcode());
String time = DateUtil.toDateString(task.getUpdateDate(), DateUtil.DATE_PATTERN);
dataMap.put("OP_TIME", time);
param.put("date", dataMap);
log.info("TaskStatusChange,url=" + url + ",发送数据=" + JsonUtil.toJsonStr(param) );
String result = HttpHelper.postJson(url, param);
log.info("TaskStatusChange,url=" + url + ",收到数据=" + result);
return true;
} catch (ApiException apiException) {
log.info("TaskStatusChange,url=" + url + " apiException " + apiException.toString());
} catch (Exception exception) {
log.info("TaskStatusChange,url=" + url + " apiException " + exception.toString());
}
return false;
}
}
...@@ -24,7 +24,7 @@ public class HamanOrderFileListener extends DefaultOrderFileListener { ...@@ -24,7 +24,7 @@ public class HamanOrderFileListener extends DefaultOrderFileListener {
protected IHamanBinPosDao hamanBinPosDao; protected IHamanBinPosDao hamanBinPosDao;
@Override @Override
public boolean handleOrderFile(File orderFile) { public boolean handleOrderFile(File orderFile,int sourceType) {
String fileName = orderFile.getName(); String fileName = orderFile.getName();
if(isFileType(fileName,"csv")){ if(isFileType(fileName,"csv")){
......
package com.neotel.smfcore.custom.hanwha.controller;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.custom.hanwha.util.HanwhaApiInfoUtil;
import com.neotel.smfcore.custom.hanwha.util.bean.HanwhaApiInfo;
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.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Slf4j
@RestController
@RequestMapping("/hanwhaApiInfo")
public class HanwhaApiInfoController {
@Autowired
private HanwhaApiInfoUtil hanwhaApiInfoUtil;
@ApiOperation("获取列表")
@RequestMapping("/getApiInfoList")
public ResultBean getApiInfoList(){
List<HanwhaApiInfo> apiInfoList = hanwhaApiInfoUtil.getApiInfoList();
return ResultBean.newOkResult(apiInfoList);
}
}
package com.neotel.smfcore.custom.hanwha.controller;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.custom.hanwha.util.HanwhaCacheUtil;
import com.neotel.smfcore.custom.hanwha.util.bean.HanwhaCacheConfig;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping("/hanwhaConfig")
public class HanwhaConfigController {
@Autowired
private HanwhaCacheUtil hanwhaCacheUtil;
@ApiOperation("获取ip和端口号")
@RequestMapping("/getCacheConfig")
public ResultBean getCacheConfig(){
return ResultBean.newOkResult(hanwhaCacheUtil.getHostAndPortCache());
}
@ApiOperation("修改ip和端口号")
@RequestMapping("/updateCacheConfig")
public ResultBean updateCacheConfig(@RequestBody HanwhaCacheConfig cacheConfig) {
String host = cacheConfig.getHost();
String apiPort = cacheConfig.getApiPort();
String webPort = cacheConfig.getWebPort();
log.info("收到修改ip和端口号,host为[{}],apiPort为[{}],webPort为[{}]",host,apiPort,webPort);
if (StringUtils.isEmpty(host)){
return ResultBean.newErrorResult(1,"smfcore.valueCanotNull", "{0}不能为空", new String[]{"host"});
}
if (StringUtils.isEmpty(webPort)){
return ResultBean.newErrorResult(1,"smfcore.valueCanotNull", "{0}不能为空", new String[]{"webPort"});
}
if (StringUtils.isEmpty(apiPort)){
return ResultBean.newErrorResult(1,"smfcore.valueCanotNull", "{0}不能为空", new String[]{"apiPort"});
}
hanwhaCacheUtil.updateHostAndPort(cacheConfig);
return ResultBean.newOkResult("");
}
}
...@@ -13,10 +13,7 @@ import io.swagger.annotations.ApiOperation; ...@@ -13,10 +13,7 @@ import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List; import java.util.List;
...@@ -45,15 +42,16 @@ public class HanwhaController { ...@@ -45,15 +42,16 @@ public class HanwhaController {
@ApiOperation("更新最大工单数") @ApiOperation("更新最大工单数")
@GetMapping("/UpdateOrderMode") @PostMapping("/UpdateOrderMode")
@AnonymousAccess @AnonymousAccess
public ResultBean UpdateOrderMode(@RequestParam Integer maxOrderCount) { public ResultBean UpdateOrderMode(@RequestParam Integer maxOrderCount) {
if(ObjectUtil.isEmpty(maxOrderCount)){ // if(ObjectUtil.isEmpty(maxOrderCount)){
return ResultBean.newErrorResult(-1,"Error","Error"); // return ResultBean.newErrorResult(-1,"Error","Error");
} // }
liteOrderCache.MaxOrderCount=maxOrderCount; // liteOrderCache.MaxOrderCount=maxOrderCount;
log.info("UpdateOrderMode 设置 liteOrderCache.MaxOrderCount="+liteOrderCache.MaxOrderCount); // log.info("UpdateOrderMode 设置 liteOrderCache.MaxOrderCount="+liteOrderCache.MaxOrderCount);
return ResultBean.newOkResult(maxOrderCount); // return ResultBean.newOkResult(maxOrderCount);
return ResultBean.newOkResult("");
} }
} }
...@@ -5,15 +5,31 @@ import com.neotel.smfcore.common.exception.ApiException; ...@@ -5,15 +5,31 @@ import com.neotel.smfcore.common.exception.ApiException;
import com.neotel.smfcore.common.utils.DateUtil; import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.common.utils.HttpHelper; import com.neotel.smfcore.common.utils.HttpHelper;
import com.neotel.smfcore.common.utils.JsonUtil; import com.neotel.smfcore.common.utils.JsonUtil;
import com.neotel.smfcore.core.apiInteraction.enums.ApiInteraction_Status;
import com.neotel.smfcore.core.apiInteraction.service.manager.IApiInteractionManager;
import com.neotel.smfcore.core.apiInteraction.service.po.ApiInteraction;
import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.equipment.enums.EquipmentType;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import com.neotel.smfcore.custom.hanwha.client.MyWebSocketClient;
import com.neotel.smfcore.custom.hanwha.handler.bean.*; import com.neotel.smfcore.custom.hanwha.handler.bean.*;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.net.URI;
import java.util.*; import java.util.*;
@Service @Service
@Slf4j @Slf4j
public class TMSApis { public class TMSApis {
@Autowired
private IApiInteractionManager apiInteractionManager;
@Autowired
private DataCache dataCache;
/** /**
* 3.16 RequestGetPartInfo * 3.16 RequestGetPartInfo
* Request part information of given ReelCode to TMS (when the Rack needs it). * Request part information of given ReelCode to TMS (when the Rack needs it).
...@@ -473,10 +489,113 @@ public class TMSApis { ...@@ -473,10 +489,113 @@ public class TMSApis {
private String PostJson(String url,Map<String,Object> sendData) throws ApiException { private String PostJson(String url,Map<String,Object> sendData) throws ApiException {
String requestParam = JsonUtil.toJsonStr(sendData);
try {
String responseStr = HttpHelper.postJsonWithAuth(url, sendData, null, 3000, 10000);
String responseStr = HttpHelper.postJson(url, sendData); log.info("PostJson, url=[" + url + "],send=[" + requestParam + "],response=[" + responseStr + "]");
log.info("PostJson, url=["+url+"],send=["+JsonUtil.toJsonStr(sendData)+"],response=["+responseStr+"]"); apiInteractionManager.save(new ApiInteraction(new Date(), url, requestParam, responseStr, ApiInteraction_Status.OK, EquipmentType.T_SOLUTION.name()));
return responseStr; return responseStr;
} catch (ApiException ex) {
log.error(ex.toString());
apiInteractionManager.save(new ApiInteraction(new Date(), url, requestParam, ex.toString(), ApiInteraction_Status.ERROE, EquipmentType.T_SOLUTION.name()));
throw ex;
}
}
public boolean TestApi(String ip,int apiPort ) {
try {
List<String> cids = new ArrayList<>(dataCache.getAllStorage().keySet());
Integer[] statusList= new Integer[0];
List<String> storageIds = new ArrayList<>();
List<String> storageTypes = new ArrayList<>();
List<Integer> isConns = new ArrayList<>();
int i = 0;
for (String cid : cids) {
Storage storage = dataCache.getStorage(cid);
if (storage == null) {
continue;
}
String type = "Storage";
if (storage.isNLShelf() || storage.isNLPShelf() || storage.isNLMShelf() || storage.isShelf()) {
type = "Rack";
} }
int status = -1;
if (statusList != null && statusList.length > i) {
status = statusList[i];
} else {
StatusBean bean = DevicesStatusUtil.getStatusBean(storage.getCid());
if (bean == null || bean.timeOut()) {
status = -1;
} else {
status = bean.getStatus();
}
}
String conCode = "0";
if(status>=1){
conCode="2";
}
storageIds.add(storage.getCid());
storageTypes.add(type);
isConns.add(Integer.parseInt(conCode));
i++;
break;
}
String RequestID="0";
String url = String.format("http://%s:%d/", ip, apiPort) + "webservice/RequestUpdateStorageConnectionInfo";
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("RequestID", RequestID);
dataMap.put("Indate", getInDataStr());
dataMap.put("StorageID", storageIds);
dataMap.put("StorageType", storageTypes);
dataMap.put("IsConn", isConns);
Map<String, Object> sendData = new HashMap<>();
sendData.put("data", dataMap);
String responseStr = PostJson(url, sendData);
return true;
} catch (Exception ex) {
return false;
}
}
public boolean TestWebSocket( String ip ,int webPort) {
try {
String webUrl = String.format("ws://%s:%d/", ip, webPort);
MyWebSocketClient websocket = new MyWebSocketClient(new URI(webUrl), null );
websocket.setConnectionLostTimeout(3000);
try {
// 设置连接超时时间为3秒
websocket.connect();
//等待3秒看是否连接
for (int i=0;i<100;i++){
Thread.sleep(30);
if(websocket.isOpen()){
log.info("TestWebSocket "+webUrl+" 已连接");
return true;
}
}
} catch (Exception e) {
return false;
} finally {
try {
websocket.close();
} catch (Exception e) {
log.info(e.toString());
}
}
} catch (Exception ex) {
log.info(ex.toString());
}
return false;
}
} }
...@@ -14,25 +14,21 @@ import java.util.concurrent.TimeUnit; ...@@ -14,25 +14,21 @@ import java.util.concurrent.TimeUnit;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.exception.ApiException; import com.neotel.smfcore.common.exception.ApiException;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.DateUtil; import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.common.utils.JsonUtil; import com.neotel.smfcore.common.utils.JsonUtil;
import com.neotel.smfcore.core.api.SmfApi;
import com.neotel.smfcore.core.barcode.service.manager.IComponentManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode; import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.service.po.Component;
import com.neotel.smfcore.core.device.bean.StatusBean; import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.util.DataCache; import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.equipment.enums.EquipmentType;
import com.neotel.smfcore.core.equipment.util.EquipConfigUtil;
import com.neotel.smfcore.core.equipment.util.bean.EquipConfigInfo;
import com.neotel.smfcore.core.order.LiteOrderCache; import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager; 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.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem; import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.storage.bean.InventoryItem;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager; import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Storage; import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos; import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
import com.neotel.smfcore.core.system.service.po.DataLog; import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil; import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import com.neotel.smfcore.core.system.util.TaskService; import com.neotel.smfcore.core.system.util.TaskService;
...@@ -55,28 +51,30 @@ public class TMSCommunicator implements WsMsgReceivedListener { ...@@ -55,28 +51,30 @@ public class TMSCommunicator implements WsMsgReceivedListener {
public static String wsURL; public static String wsURL;
public static String apiURL; public static String apiURL;
private static boolean enableApi=false;//是否启用api
private static String host = ""; private static String host = "";
private static int webPort = 8082; private static int webPort = 8082;
private static int apiPort = 1337 ; private static int apiPort = 1337 ;
private static String configWebPort = ""; // private static String configWebPort = "";
private static String configApiPort = ""; // private static String configApiPort = "";
private static String clientType = "NEOTEL"; private static String clientType = "NEOTEL";
private static String clientSubType = "Rack01"; private static String clientSubType = "Rack01";
@Value("${hanwha.host:}") // @Value("${hanwha.host:}")
public void setHost(String host) { // public void setHost(String host) {
TMSCommunicator.host = host; // TMSCommunicator.host = host;
} // }
//
@Value("${hanwha.webPort:}") // @Value("${hanwha.webPort:}")
public void setWebPort(String configPort) { // public void setWebPort(String configPort) {
TMSCommunicator.configWebPort = configPort; // TMSCommunicator.configWebPort = configPort;
} // }
//
@Value("${hanwha.apiPort:}") // @Value("${hanwha.apiPort:}")
public void setApiPort(String configPort) { // public void setApiPort(String configPort) {
TMSCommunicator.configApiPort = configPort; // TMSCommunicator.configApiPort = configPort;
} // }
/** /**
* API名称 * API名称
*/ */
...@@ -86,6 +84,9 @@ public class TMSCommunicator implements WsMsgReceivedListener { ...@@ -86,6 +84,9 @@ public class TMSCommunicator implements WsMsgReceivedListener {
private DataCache dataCache; private DataCache dataCache;
@Autowired @Autowired
private EquipConfigUtil equipConfigUtil;
@Autowired
private ILiteOrderManager liteOrderManager; private ILiteOrderManager liteOrderManager;
@Autowired @Autowired
...@@ -97,40 +98,37 @@ public class TMSCommunicator implements WsMsgReceivedListener { ...@@ -97,40 +98,37 @@ public class TMSCommunicator implements WsMsgReceivedListener {
@Autowired @Autowired
private IStoragePosManager storagePosManager; private IStoragePosManager storagePosManager;
// @Autowired
// private IDataLogManager dataLogManager;
@Autowired
private IComponentManager componentManager;
@Autowired @Autowired
private TMSUtil tmsUtil; private TMSUtil tmsUtil;
private static int gRequestID = 1000;
public static int GetRequestID()
{
return gRequestID++;
}
private boolean needCheck=false; private boolean needCheck=false;
@PostConstruct @PostConstruct
public void init() { public void init() {
host = dataCache.getConfigCache("hanwha.host", host); EquipConfigInfo equipConfigInfo = equipConfigUtil.getConfigCache(EquipmentType.T_SOLUTION.name());
String webPortStr = dataCache.getConfigCache("hanwha.webPort", configWebPort); // host = dataCache.getConfigCache("hanwha.host", host);
String apiPortStr = dataCache.getConfigCache("hanwha.apiPort", configApiPort); // String webPortStr = dataCache.getConfigCache("hanwha.webPort", configWebPort);
apiName = dataCache.getConfigCache("api.name",apiName); // String apiPortStr = dataCache.getConfigCache("hanwha.apiPort", configApiPort);
boolean enable= apiName != null && apiName.equalsIgnoreCase("hanwha") ; host = equipConfigInfo.GetConfigValue("host", "");
if(!enable){ webPort = equipConfigInfo.GetConfigValue("webPort", 0);
log.info("apiName:" + apiName+",不需要连接"); apiPort = equipConfigInfo.GetConfigValue("apiPort", 0);
} enableApi = equipConfigInfo.isEnableApi();
else if (ObjectUtil.isEmpty(host) || ObjectUtil.isEmpty(webPortStr) || ObjectUtil.isEmpty((apiPortStr))) { apiName = dataCache.getConfigCache("api.name", apiName);
updateServerInfo(host, webPort, apiPort,enableApi);
boolean enable = apiName != null && apiName.equalsIgnoreCase("hanwha");
if (!enable) {
log.info("apiName=" + apiName + ",不需要连接");
} else if (!enableApi) {
log.info("enableApi=" + enableApi + ",不需要连接");
} else if (ObjectUtil.isEmpty(host) || webPort == 0 || apiPort == 0) {
// else if (ObjectUtil.isEmpty(host) || ObjectUtil.isEmpty(webPortStr) || ObjectUtil.isEmpty((apiPortStr))) {
log.info("配置不完整,不需要连接"); log.info("配置不完整,不需要连接");
} else { } else {
webPort = Integer.parseInt(webPortStr); // webPort = Integer.parseInt(webPortStr);
apiPort = Integer.parseInt(apiPortStr); // apiPort = Integer.parseInt(apiPortStr);
String apiName = dataCache.getConfigCache("api.name", ""); String apiName = dataCache.getConfigCache("api.name", "");
if (apiName != null && apiName.equalsIgnoreCase("hanwha")) { if (apiName != null && apiName.equalsIgnoreCase("hanwha")) {
updateServerInfo(host, webPort, apiPort);
Thread closeTask = new Thread(new Runnable() { Thread closeTask = new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
...@@ -138,38 +136,117 @@ public class TMSCommunicator implements WsMsgReceivedListener { ...@@ -138,38 +136,117 @@ public class TMSCommunicator implements WsMsgReceivedListener {
Thread.sleep(20000); Thread.sleep(20000);
start(); start();
Thread.sleep(5000); Thread.sleep(5000);
needCheck=true; needCheck = true;
}catch (Exception e){ } catch (Exception e) {
log.error("开始连接webService出错:" + e.getMessage()); log.error("开始连接webService出错:" + e.getMessage());
} }
} }
} ); });
closeTask.start(); closeTask.start();
// StartCheckRun();
}
}
StartCheckRun();
}
private void StartCheckRun() {
ExecutorService executorService = Executors.newSingleThreadExecutor(); ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.execute(new Runnable() { executorService.execute(new Runnable() {
@Override @Override
public void run() { public void run() {
log.info("启动 webService 状态检查"); log.info("启动 webService 状态检查");
while(true) { while (true) {
try { try {
if(waitSync&&System.currentTimeMillis()>syncTime){ if (isEnable() && apiName != null && apiName.equalsIgnoreCase("hanwha")) {
if (waitSync && System.currentTimeMillis() > syncTime) {
SyncData(); SyncData();
} }
TimeUnit.SECONDS.sleep(6); TimeUnit.SECONDS.sleep(6);
if (needCheck) { if (needCheck) {
stateCheck(); stateCheck();
} }
} else {
if (isConnected()) {
//当前需要禁用webSocket连接
close();
}
TimeUnit.SECONDS.sleep(6);
}
EquipConfigInfo equipConfigInfo = equipConfigUtil.getConfigCache(EquipmentType.T_SOLUTION.name());
ResetConfig(equipConfigInfo);
} catch (Exception e) { } catch (Exception e) {
log.error("webService" + e.getMessage()); log.error("webService" + e.getMessage());
} }
} }
} }
}); });
// start();
} }
private void ResetConfig(EquipConfigInfo nconfig) {
try {
//重新设置韩华接口时调用
String nhost = nconfig.GetConfigValue("host", "");
int nwebPort = nconfig.GetConfigValue("webPort", 0);
int napiPort = nconfig.GetConfigValue("apiPort", 0);
if (enableApi == nconfig.enableApi && nhost == host && webPort == nwebPort && napiPort == apiPort) {
return;
}
if (nconfig.enableApi) {
//当前启用
if (enableApi) {
//如果ip端口不一致,需要关闭webSocket重新连接
String nwsURL = String.format("ws://%s:%d/", nhost, nwebPort);
if (!wsURL.equals(nwsURL)) {
log.info("更改韩华配置,wsURL = " + wsURL + ",需要更改为:" + nwsURL + ",关闭webSocket连接重新连接");
updateServerInfo(nhost, nwebPort, napiPort, nconfig.enableApi);
close();
} else {
updateServerInfo(nhost, nwebPort, napiPort, nconfig.enableApi);
}
} else {
//当前禁用
updateServerInfo(nhost, nwebPort, napiPort, nconfig.enableApi);
log.info("更改韩华配置,之前禁用连接,现在启用连接,开始启动webSocket连接");
Thread closeTask = new Thread(new Runnable() {
@Override
public void run() {
if (isEnable()) {
try {
Thread.sleep(5000);
start();
Thread.sleep(5000);
needCheck = true;
} catch (Exception e) {
log.error("开始连接webService出错:" + e.getMessage());
} }
} }
}
});
closeTask.start();
}
} else {
//如果原来启用当前禁用
if (enableApi) {
log.info("更改韩华配置,之前启用连接,现在禁用连接,关闭webSocket连接,更新配置");
updateServerInfo(nhost, nwebPort, napiPort, nconfig.enableApi);
close();//关闭连接
}
}
} catch (Exception exception) {
log.error("ResetConfig error :" + exception.toString());
}
}
private void stateCheck(){ private void stateCheck(){
if(websocket.isOpen()||websocket.isConnecting()){ if(websocket.isOpen()||websocket.isConnecting()){
...@@ -180,15 +257,15 @@ public class TMSCommunicator implements WsMsgReceivedListener { ...@@ -180,15 +257,15 @@ public class TMSCommunicator implements WsMsgReceivedListener {
} }
} }
private void updateServerInfo(String serverHost, int wport, int aport) { private void updateServerInfo(String serverHost, int wport, int aport,boolean enableApiParam) {
host = serverHost; host = serverHost;
webPort = wport; webPort = wport;
apiPort = aport; apiPort = aport;
enableApi=enableApiParam;
wsURL = String.format("ws://%s:%d/", serverHost, wport); wsURL = String.format("ws://%s:%d/", serverHost, wport);
apiURL = String.format("http://%s:%d/", serverHost, aport); apiURL = String.format("http://%s:%d/", serverHost, aport);
log.info("设置webSocketServer:[" + wsURL + "],httpServer:[" + apiURL + "]"); log.info("设置webSocketServer:[" + wsURL + "],httpServer:[" + apiURL + "],enableApi=["+enableApi+"]");
} }
private void start() { private void start() {
...@@ -223,9 +300,13 @@ public class TMSCommunicator implements WsMsgReceivedListener { ...@@ -223,9 +300,13 @@ public class TMSCommunicator implements WsMsgReceivedListener {
} }
public static boolean isEnable() { public static boolean isEnable() {
if (ObjectUtil.isEmpty(host) || ObjectUtil.isEmpty(webPort) || ObjectUtil.isEmpty(apiPort)) { if (ObjectUtil.isEmpty(host) || ObjectUtil.isEmpty(webPort) || ObjectUtil.isEmpty(apiPort)
|| webPort == 0 || apiPort == 0) {
return false; return false;
} else { } else {
if (!enableApi) {
return false;
}
return true; return true;
} }
} }
...@@ -237,8 +318,8 @@ public class TMSCommunicator implements WsMsgReceivedListener { ...@@ -237,8 +318,8 @@ public class TMSCommunicator implements WsMsgReceivedListener {
} }
} }
public boolean isConnected() { public boolean isConnected() {
if(isEnable()){ if(!isEnable()){
return true; return false;
} }
if (websocket != null &&(websocket.isConnecting()||websocket.isOpen()) ) { if (websocket != null &&(websocket.isConnecting()||websocket.isOpen()) ) {
return true; return true;
......
...@@ -7,8 +7,12 @@ import com.neotel.smfcore.core.barcode.service.manager.IComponentManager; ...@@ -7,8 +7,12 @@ import com.neotel.smfcore.core.barcode.service.manager.IComponentManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode; import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.service.po.Component; import com.neotel.smfcore.core.barcode.service.po.Component;
import com.neotel.smfcore.core.device.util.DataCache; import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.equipment.enums.EquipmentType;
import com.neotel.smfcore.core.equipment.util.EquipConfigUtil;
import com.neotel.smfcore.core.equipment.util.bean.EquipConfigInfo;
import com.neotel.smfcore.core.order.LiteOrderCache; import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS; import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS;
import com.neotel.smfcore.core.order.enums.LITEORDER_STYPE;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager; 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.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem; import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
...@@ -57,6 +61,9 @@ public class TMSUtil { ...@@ -57,6 +61,9 @@ public class TMSUtil {
@Autowired @Autowired
private TMSApis tmsApis; private TMSApis tmsApis;
@Autowired
private EquipConfigUtil equipConfigUtil;
public TMSReserve GetOrderInfo(LiteOrder liteOrder) { public TMSReserve GetOrderInfo(LiteOrder liteOrder) {
TMSReserve tmsReserve = new TMSReserve(); TMSReserve tmsReserve = new TMSReserve();
...@@ -161,6 +168,7 @@ public class TMSUtil { ...@@ -161,6 +168,7 @@ public class TMSUtil {
LiteOrder liteOrder = new LiteOrder(orderNo, items); LiteOrder liteOrder = new LiteOrder(orderNo, items);
liteOrder.setSource(requestCmd); liteOrder.setSource(requestCmd);
liteOrder.setSourceType(LITEORDER_STYPE.API);
LiteOrder dbOrder = liteOrderManager.findByOrderNo(liteOrder.getOrderNo()); LiteOrder dbOrder = liteOrderManager.findByOrderNo(liteOrder.getOrderNo());
if (dbOrder != null) { if (dbOrder != null) {
orderNo = orderNo + "-" + requestID; orderNo = orderNo + "-" + requestID;
...@@ -302,7 +310,14 @@ public class TMSUtil { ...@@ -302,7 +310,14 @@ public class TMSUtil {
public boolean HasExeOrder(){ public boolean HasExeOrder(){
if(liteOrderCache.SingleOrderMode()){ EquipConfigInfo config=equipConfigUtil.getConfigCache(EquipmentType.T_SOLUTION.name());
Boolean singleOrderMode= true;
if(config!=null){
singleOrderMode= config.GetConfigValue("singleOrder",true );
}
if(singleOrderMode){
// if(liteOrderCache.SingleOrderMode()){
Query query = new Query(Criteria.where("status").ne(LITEORDER_STATUS.CLOSED)); Query query = new Query(Criteria.where("status").ne(LITEORDER_STATUS.CLOSED));
List<LiteOrder> orderList = liteOrderManager.findByQuery(query); List<LiteOrder> orderList = liteOrderManager.findByQuery(query);
List<LiteOrder> nOder=new ArrayList<>(); List<LiteOrder> nOder=new ArrayList<>();
......
package com.neotel.smfcore.custom.hanwha.util;
import com.google.common.collect.Maps;
import com.neotel.smfcore.custom.hanwha.util.bean.HanwhaApiInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
@Slf4j
@Service
public class HanwhaApiInfoUtil {
//api接口信息,默认返回10条
public static List<HanwhaApiInfo> apiInfoList = new CopyOnWriteArrayList<>();
public void updateApiInfoList(String url, String requestParam, String resultReturn) {
HanwhaApiInfo info = new HanwhaApiInfo();
info.setCreateDate(new Date());
info.setUrl(url);
info.setRequestParam(requestParam);
info.setResultReturn(resultReturn);
apiInfoList.add(info);
if (apiInfoList != null && apiInfoList.size() > 10) {
apiInfoList.remove(0);
}
}
public List<HanwhaApiInfo> getApiInfoList(){
List<HanwhaApiInfo> resultList = new ArrayList<>();
if (apiInfoList != null && !apiInfoList.isEmpty()){
resultList = apiInfoList.stream().sorted(Comparator.comparing(HanwhaApiInfo::getCreateDate).reversed()).collect(Collectors.toList());
}
return resultList;
}
}
package com.neotel.smfcore.custom.hanwha.util;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.custom.hanwha.util.bean.HanwhaCacheConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class HanwhaCacheUtil {
@Autowired
private DataCache dataCache;
public static final String Cache_Hanwha_HostAndPost = "Cache_Hanwha_HostAndPost";
public void updateHostAndPort(HanwhaCacheConfig cacheConfig) {
HanwhaCacheConfig hanwhaCacheConfig = dataCache.getCache(Cache_Hanwha_HostAndPost);
if (hanwhaCacheConfig == null) {
hanwhaCacheConfig = new HanwhaCacheConfig();
}
hanwhaCacheConfig.setHost(cacheConfig.getHost());
hanwhaCacheConfig.setWebPort(cacheConfig.getWebPort());
hanwhaCacheConfig.setApiPort(cacheConfig.getApiPort());
hanwhaCacheConfig.setSingleOrder(cacheConfig.isSingleOrder());
dataCache.updateCache(Cache_Hanwha_HostAndPost, hanwhaCacheConfig);
}
public HanwhaCacheConfig getHostAndPortCache(){
HanwhaCacheConfig hostAndPortCache = dataCache.getCache(Cache_Hanwha_HostAndPost);
if (hostAndPortCache == null) {
hostAndPortCache = new HanwhaCacheConfig();
}
return hostAndPortCache;
}
}
package com.neotel.smfcore.custom.hanwha.util.bean;
import lombok.Data;
import java.util.Date;
@Data
public class HanwhaApiInfo {
private String url;
private String requestParam;
private String resultReturn;
private Date createDate;
}
package com.neotel.smfcore.custom.hanwha.util.bean;
import lombok.Data;
@Data
public class HanwhaCacheConfig {
private String host;
private String webPort;
private String apiPort;
private boolean singleOrder = false;
}
...@@ -16,6 +16,7 @@ import com.neotel.smfcore.core.device.enums.OP; ...@@ -16,6 +16,7 @@ import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.enums.OP_STATUS; import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.device.util.DataCache; import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.LiteOrderCache; import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.enums.LITEORDER_STYPE;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager; 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.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem; import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
...@@ -465,6 +466,7 @@ public class HellaServiceHandler extends BaseSmfApiListener implements IoHandler ...@@ -465,6 +466,7 @@ public class HellaServiceHandler extends BaseSmfApiListener implements IoHandler
} }
liteOrder = new LiteOrder(workorderNumber,items); liteOrder = new LiteOrder(workorderNumber,items);
liteOrder.setSource(groupName); liteOrder.setSource(groupName);
liteOrder.setSourceType(LITEORDER_STYPE.API);
log.info("新增加订单:" + liteOrder.getOrderNo()+",设备组名称["+groupName+"],标签名称["+labelName+"]"); log.info("新增加订单:" + liteOrder.getOrderNo()+",设备组名称["+groupName+"],标签名称["+labelName+"]");
liteOrder = liteOrderManager.createWithItems(liteOrder); liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderCache.addOrderToMap(liteOrder); liteOrderCache.addOrderToMap(liteOrder);
......
package com.neotel.smfcore.custom.keboda1335;
import com.neotel.smfcore.custom.neotel.NeotelApi;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
@Service
public class KebodaApi extends NeotelApi {
@Override
public boolean isForThisApi(String apiName) {
return apiName != null && apiName.equalsIgnoreCase("kbd");
}
}
...@@ -135,6 +135,7 @@ public class KebodaController { ...@@ -135,6 +135,7 @@ public class KebodaController {
//已经在任务当中,返回对应的信息 //已经在任务当中,返回对应的信息
if (dataLog.getBarcode().equals(barcode.getBarcode())) { if (dataLog.getBarcode().equals(barcode.getBarcode())) {
if (dataLog.isPutInTask()) { if (dataLog.isPutInTask()) {
if (cidList.contains(dataLog.getCid())) {
//已有入库任务 //已有入库任务
errorMsg = "物料[" + dataLog.getBarcode() + "]已有入库任务,需继续执行入库动作"; errorMsg = "物料[" + dataLog.getBarcode() + "]已有入库任务,需继续执行入库动作";
resultMap.put("pos", dataLog.getPosName()); resultMap.put("pos", dataLog.getPosName());
...@@ -142,6 +143,9 @@ public class KebodaController { ...@@ -142,6 +143,9 @@ public class KebodaController {
resultMap.put("cid", dataLog.getCid()); resultMap.put("cid", dataLog.getCid());
return resultMap; return resultMap;
} else { } else {
throw new ValidateException("smfcore.error.barcode.taskNotEnd", "料盘[{0}}]的操作未完成,无法执行入库操作", new String[]{barcode.getBarcode()});
}
} else {
//已有出库任务 //已有出库任务
errorMsg = "物料[" + dataLog.getBarcode() + "]已有出库任务,需继续执行出库动作"; errorMsg = "物料[" + dataLog.getBarcode() + "]已有出库任务,需继续执行出库动作";
resultMap.put("result", "98"); resultMap.put("result", "98");
...@@ -371,7 +375,9 @@ public class KebodaController { ...@@ -371,7 +375,9 @@ public class KebodaController {
private StoragePos findBestFixPos(List<Storage> storageList,Barcode barcode, String rfid, String lastPosId){ private StoragePos findBestFixPos(List<Storage> storageList,Barcode barcode, String rfid, String lastPosId){
StoragePos pos = null; StoragePos pos = null;
for (Storage storage : storageList) { for (Storage storage : storageList) {
StoragePos tempPos = taskService.findEmptyPosForPutIn(storageList, barcode, rfid, lastPosId); List<Storage> newStorageList = new ArrayList<>();
newStorageList.add(storage);
StoragePos tempPos = taskService.findEmptyPosForPutIn(newStorageList, barcode, rfid, lastPosId);
if(tempPos != null){ if(tempPos != null){
if(tempPos.getW() == barcode.getPlateSize() && tempPos.getH() == barcode.getHeight()){ if(tempPos.getW() == barcode.getPlateSize() && tempPos.getH() == barcode.getHeight()){
//库位尺寸与料盘尺寸完全一致,直接返回 //库位尺寸与料盘尺寸完全一致,直接返回
......
...@@ -5,12 +5,17 @@ import com.fasterxml.jackson.databind.ObjectMapper; ...@@ -5,12 +5,17 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.neotel.smfcore.common.exception.ApiException;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.Constants; import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.HttpHelper; import com.neotel.smfcore.common.utils.HttpHelper;
import com.neotel.smfcore.common.utils.JsonUtil;
import com.neotel.smfcore.common.utils.StorageConstants; import com.neotel.smfcore.common.utils.StorageConstants;
import com.neotel.smfcore.core.api.bean.CodeValidateParam; import com.neotel.smfcore.core.api.bean.CodeValidateParam;
import com.neotel.smfcore.core.api.listener.BaseSmfApiListener; import com.neotel.smfcore.core.api.listener.BaseSmfApiListener;
import com.neotel.smfcore.core.apiInteraction.enums.ApiInteraction_Status;
import com.neotel.smfcore.core.apiInteraction.service.manager.IApiInteractionManager;
import com.neotel.smfcore.core.apiInteraction.service.po.ApiInteraction;
import com.neotel.smfcore.core.barcode.bean.CodeBean; import com.neotel.smfcore.core.barcode.bean.CodeBean;
import com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE; import com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE;
import com.neotel.smfcore.core.barcode.service.po.Barcode; import com.neotel.smfcore.core.barcode.service.po.Barcode;
...@@ -18,6 +23,9 @@ import com.neotel.smfcore.core.barcode.utils.CodeResolve; ...@@ -18,6 +23,9 @@ import com.neotel.smfcore.core.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.device.enums.OP; import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.enums.OP_STATUS; import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.device.util.DataCache; import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.equipment.enums.EquipmentType;
import com.neotel.smfcore.core.equipment.util.EquipConfigUtil;
import com.neotel.smfcore.core.equipment.util.bean.EquipConfigInfo;
import com.neotel.smfcore.core.order.LiteOrderCache; import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.enums.ORDER_COLOR; import com.neotel.smfcore.core.order.enums.ORDER_COLOR;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager; import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
...@@ -36,8 +44,12 @@ import org.springframework.web.bind.annotation.RequestMapping; ...@@ -36,8 +44,12 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
...@@ -65,6 +77,16 @@ public class PanaApiController extends BaseSmfApiListener { ...@@ -65,6 +77,16 @@ public class PanaApiController extends BaseSmfApiListener {
@Autowired @Autowired
protected CodeResolve codeResolve; protected CodeResolve codeResolve;
private static IApiInteractionManager apiInteractionManager;
@Autowired
public void setApiInteractionManager(IApiInteractionManager interactionManager){
PanaApiController.apiInteractionManager=interactionManager;
}
@Autowired
private EquipConfigUtil equipConfigUtil;
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(1);
@Autowired @Autowired
public void setDataCache(DataCache dataCache) { public void setDataCache(DataCache dataCache) {
PanaApiController.dataCache = dataCache; PanaApiController.dataCache = dataCache;
...@@ -77,8 +99,45 @@ public class PanaApiController extends BaseSmfApiListener { ...@@ -77,8 +99,45 @@ public class PanaApiController extends BaseSmfApiListener {
} }
log.info("从缓存 " + Constants.Cache_PanaCIMIP + " 中读取到PanaCIM 的注册IP【" + ip + ":" + port + "】"); log.info("从缓存 " + Constants.Cache_PanaCIMIP + " 中读取到PanaCIM 的注册IP【" + ip + ":" + port + "】");
} }
//1 分钟之后执行,每20秒钟执行一次
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
if(ObjectUtil.isNotEmpty(PanaCIMIP)){
keepAlive();
}
}
}, 60, 20, TimeUnit.SECONDS);
} }
public boolean keepAlive() {
try {
String apiName = dataCache.getConfigCache("api.name", "");
if (!isForThisApi(apiName)) {
return false;
}
String keepAliveUrl = getkeepAliveUrl();
if (ObjectUtil.isEmpty(keepAliveUrl)) {
log.error("未找到地址 keepAliveUrl,返回false");
return false;
}
Map<String, Object> result = HttpHelper.getJsonResult(keepAliveUrl, new HashMap<>(), 2000);
if (result != null && result.size() == 2) {
int code = (Integer) result.get("code");
String responseContent = result.get("responseContent").toString();
if (code == 200) {
lastKeepAliveTime = System.currentTimeMillis();
return true;
}
}
} catch (Exception ex) {
log.error(ex.toString());
}
return false;
}
@Autowired @Autowired
protected IDataLogDao dataLogDao; protected IDataLogDao dataLogDao;
...@@ -90,6 +149,20 @@ public class PanaApiController extends BaseSmfApiListener { ...@@ -90,6 +149,20 @@ public class PanaApiController extends BaseSmfApiListener {
private static AtomicLong seq = new AtomicLong(0); private static AtomicLong seq = new AtomicLong(0);
//panancim调用keepAlive的时间
private static long lastKeepAliveTime=-1;
public static boolean isOnLine() {
if (lastKeepAliveTime <= -1||ObjectUtil.isEmpty(PanaCIMIP)) {
return false;
}
if ((System.currentTimeMillis() - lastKeepAliveTime) < (60 * 1000)) {
return true;
}
return false;
}
@RequestMapping(value = "/setConfiguration") @RequestMapping(value = "/setConfiguration")
@ResponseBody @ResponseBody
public String setConfiguration(@RequestBody Map<String,String> map) { public String setConfiguration(@RequestBody Map<String,String> map) {
...@@ -134,10 +207,17 @@ public class PanaApiController extends BaseSmfApiListener { ...@@ -134,10 +207,17 @@ public class PanaApiController extends BaseSmfApiListener {
return ""; return "";
} }
private static String getkeepAliveUrl(){
if(!Strings.isNullOrEmpty(PanaCIMIP)){
return "http://"+PanaCIMIP + ":" + PanaCIMPort + "/api/Storage/keepAlive";
}
return "";
}
@RequestMapping(value = "/keepAlive") @RequestMapping(value = "/keepAlive")
@ResponseBody @ResponseBody
public String keepAlive(HttpServletRequest request) { public String keepAlive(HttpServletRequest request) {
lastKeepAliveTime=System.currentTimeMillis();
return "OK"; return "OK";
} }
...@@ -431,7 +511,7 @@ public class PanaApiController extends BaseSmfApiListener { ...@@ -431,7 +511,7 @@ public class PanaApiController extends BaseSmfApiListener {
reqParams.put("TransactionID", nextSeq("PANA")); reqParams.put("TransactionID", nextSeq("PANA"));
reqParams.put("ErrorCode","0"); reqParams.put("ErrorCode","0");
reqParams.put("Reelbarcode",barcode.getBarcode()); reqParams.put("Reelbarcode",barcode.getBarcode());
String result = HttpHelper.postJson(requestReelUrl,reqParams); String result = PostJson(requestReelUrl,reqParams);
log.info("PanaCIM 返回料盘【"+barcode.getBarcode()+"】的信息:"+result); log.info("PanaCIM 返回料盘【"+barcode.getBarcode()+"】的信息:"+result);
if(!Strings.isNullOrEmpty(result)){ if(!Strings.isNullOrEmpty(result)){
ObjectMapper mapper = new ObjectMapper(); ObjectMapper mapper = new ObjectMapper();
...@@ -516,7 +596,7 @@ public class PanaApiController extends BaseSmfApiListener { ...@@ -516,7 +596,7 @@ public class PanaApiController extends BaseSmfApiListener {
params.put("TransactionID", nextSeq("PANA")); params.put("TransactionID", nextSeq("PANA"));
params.put("ErrorCode","0"); params.put("ErrorCode","0");
params.put("Reelbarcode",barcode.getBarcode()); params.put("Reelbarcode",barcode.getBarcode());
String result = HttpHelper.postJson(requestReelUrl,params); String result = PostJson(requestReelUrl,params);
log.info("PanaCIM 返回料盘【"+codebean.getCodeStr()+"】的信息:"+result); log.info("PanaCIM 返回料盘【"+codebean.getCodeStr()+"】的信息:"+result);
if(!Strings.isNullOrEmpty(result)){ if(!Strings.isNullOrEmpty(result)){
ObjectMapper mapper = new ObjectMapper(); ObjectMapper mapper = new ObjectMapper();
...@@ -590,11 +670,27 @@ public class PanaApiController extends BaseSmfApiListener { ...@@ -590,11 +670,27 @@ public class PanaApiController extends BaseSmfApiListener {
@Override @Override
public void outTaskStatusChange(String outNotifyUrl, DataLog task) { public void outTaskStatusChange(String outNotifyUrl, DataLog task) {
if(task.isFinished()){ if (task.isPutInTask()) {
if(task.isPutInTask()){ if (task.isFinished()) {
checkInNotification(task); checkInNotification(task);
}else{ }
} else if (task.isCheckOutTask()) {
if (task.isOutBox()) {
deliverNotification(task);
task.updateAppendData("notify",true);
dataLogDao.save(task);
taskService.moveTaskToFinished(task);
} else if (task.isFinished()){
Boolean notify = task.getAppendData("notify");
if (notify == null){
notify = false;
}
if (!notify) {
deliverNotification(task); deliverNotification(task);
task.updateAppendData("notify", true);
dataLogDao.save(task);
taskService.moveTaskToFinished(task);
}
} }
} }
} }
...@@ -619,7 +715,7 @@ public class PanaApiController extends BaseSmfApiListener { ...@@ -619,7 +715,7 @@ public class PanaApiController extends BaseSmfApiListener {
params.put("Location","0"); params.put("Location","0");
params.put("TowerID",PanaTowerID); params.put("TowerID",PanaTowerID);
log.info("向 PanaCIM["+inNotifyApi+"] 通知料盘【"+task.getBarcode()+"】的入库信息:" + params); log.info("向 PanaCIM["+inNotifyApi+"] 通知料盘【"+task.getBarcode()+"】的入库信息:" + params);
String result = HttpHelper.postJson(inNotifyApi,params); String result = PostJson(inNotifyApi,params);
log.info("Response Of checkInNotification From PanaCIM:"+result); log.info("Response Of checkInNotification From PanaCIM:"+result);
}else{ }else{
log.info("没有配置PanaCIM接口,无需通知"); log.info("没有配置PanaCIM接口,无需通知");
...@@ -630,6 +726,19 @@ public class PanaApiController extends BaseSmfApiListener { ...@@ -630,6 +726,19 @@ public class PanaApiController extends BaseSmfApiListener {
} }
} }
private static String PostJson (String url, Map<String, Object> params)throws ApiException {
try{
String result = HttpHelper.postJson(url,params);
apiInteractionManager.save(new ApiInteraction(new Date(),url, JsonUtil.toJsonStr(params),result,ApiInteraction_Status.OK,EquipmentType.PANACIMNEOLINK.name()));
return result;
}catch (ApiException ex) {
log.error(ex.toString());
apiInteractionManager.save(new ApiInteraction(new Date(), url, JsonUtil.toJsonStr(params), ex.toString(), ApiInteraction_Status.ERROE, EquipmentType.PANACIMNEOLINK.name()));
throw ex;
}
}
/** /**
* 出库完成通知 * 出库完成通知
*/ */
...@@ -651,7 +760,7 @@ public class PanaApiController extends BaseSmfApiListener { ...@@ -651,7 +760,7 @@ public class PanaApiController extends BaseSmfApiListener {
params.put("MsdLevel","1"); params.put("MsdLevel","1");
params.put("Location","0"); params.put("Location","0");
log.info("向 PanaCIM["+outNotifyApi+"] 通知料盘【"+task.getBarcode()+"】的出库信息:" + params); log.info("向 PanaCIM["+outNotifyApi+"] 通知料盘【"+task.getBarcode()+"】的出库信息:" + params);
String result = HttpHelper.postJson(outNotifyApi,params); String result = PostJson(outNotifyApi,params);
log.info("Response Of deliverNotification From PanaCIM:"+result); log.info("Response Of deliverNotification From PanaCIM:"+result);
}else{ }else{
...@@ -664,6 +773,59 @@ public class PanaApiController extends BaseSmfApiListener { ...@@ -664,6 +773,59 @@ public class PanaApiController extends BaseSmfApiListener {
@Override @Override
public boolean isForThisApi(String apiName) { public boolean isForThisApi(String apiName) {
return apiName != null && apiName.equalsIgnoreCase("PanaCIM"); boolean result = apiName != null && apiName.equalsIgnoreCase("PanaCIM");
//判断是否启用,如果未启用不连接
if (result) {
EquipConfigInfo equipConfigInfo = equipConfigUtil.getConfigCache(EquipmentType.PANACIMNEOLINK.name());
if (!equipConfigInfo.enableApi) {
return false;
}
}
return result;
}
/**
* 测试是否可连接
* @return
*/
public static boolean TestApi(){
String keepAliveUrl=getkeepAliveUrl();
try{
if(ObjectUtil.isEmpty(keepAliveUrl)){
log.error("未找到地址 keepAliveUrl,返回false");
return false;
}
Map<String,Object> result = HttpHelper.getJsonResult(keepAliveUrl,new HashMap<>(),3000);
if(result!=null&&result.size()==2){
int code=(Integer)result.get("code");
String responseContent=result.get("responseContent").toString();
if(code==200){
apiInteractionManager.save(new ApiInteraction(new Date(),keepAliveUrl,"",responseContent, ApiInteraction_Status.OK,EquipmentType.PANACIMNEOLINK.name()));
return true;
}
}
}catch (Exception ex){
log.error(keepAliveUrl+" error :"+ex.toString());
apiInteractionManager.save(new ApiInteraction(new Date(),keepAliveUrl,"",ex.toString(), ApiInteraction_Status.ERROE,EquipmentType.PANACIMNEOLINK.name()));
}
return false;
}
public boolean TestIp(int timeout) {
try {
if (timeout <= 0) {
timeout = 1000;
}
InetAddress address = InetAddress.getByName(PanaCIMIP);
if (address.isReachable(timeout)) {
return true;
}
} catch (Exception ex) {
log.error("TestIp" + PanaCIMIP + " error :" + ex.toString());
}
return false;
} }
} }
...@@ -11,6 +11,7 @@ import com.neotel.smfcore.core.device.bean.BoxStatusBean; ...@@ -11,6 +11,7 @@ import com.neotel.smfcore.core.device.bean.BoxStatusBean;
import com.neotel.smfcore.core.device.bean.StatusBean; import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.util.DataCache; import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.LiteOrderCache; import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.enums.LITEORDER_STYPE;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager; 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.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem; import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
...@@ -130,6 +131,7 @@ public class TianTongController { ...@@ -130,6 +131,7 @@ public class TianTongController {
LiteOrder liteOrder = new LiteOrder(); LiteOrder liteOrder = new LiteOrder();
liteOrder.setOrderNo(orderNo); liteOrder.setOrderNo(orderNo);
liteOrder.setSource(source); liteOrder.setSource(source);
liteOrder.setSourceType(LITEORDER_STYPE.API);
liteOrder.setSo(so); liteOrder.setSo(so);
liteOrder.setOrderItems(orderItemList); liteOrder.setOrderItems(orderItemList);
liteOrder = liteOrderManager.createWithItems(liteOrder); liteOrder = liteOrderManager.createWithItems(liteOrder);
......
...@@ -105,7 +105,7 @@ public class AuthorizationController { ...@@ -105,7 +105,7 @@ public class AuthorizationController {
try { try {
long seconds = onlineUserService.properties.getTokenValidityInSeconds() / 1000; long seconds = onlineUserService.properties.getTokenValidityInSeconds() / 1000;
Date exTime= DateUtil.addSeconds(new Date(), new Long(seconds).intValue()); Date exTime= DateUtil.addSeconds(new Date(), new Long(seconds).intValue());
onlineUserDto = new OnlineUserDto(jwtUserDto.getUsername(), browser , ip, address, EncryptUtils.desEncrypt(token), new Date(),exTime); onlineUserDto = new OnlineUserDto(jwtUserDto.getUsername(), browser , ip, address, EncryptUtils.desEncrypt(token), new Date(),exTime,jwtUserDto.getImageStr());
} catch (Exception e) { } catch (Exception e) {
log.error(e.getMessage(),e); log.error(e.getMessage(),e);
} }
......
...@@ -20,6 +20,8 @@ import com.neotel.smfcore.common.bean.ResultBean; ...@@ -20,6 +20,8 @@ import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.csv.CsvReader; import com.neotel.smfcore.common.csv.CsvReader;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.*; import com.neotel.smfcore.common.utils.*;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.language.service.bean.LanguageInfo;
import com.neotel.smfcore.security.bean.FileProperties; import com.neotel.smfcore.security.bean.FileProperties;
import com.neotel.smfcore.security.bean.RsaProperties; import com.neotel.smfcore.security.bean.RsaProperties;
import com.neotel.smfcore.security.rest.bean.dto.UserDto; import com.neotel.smfcore.security.rest.bean.dto.UserDto;
...@@ -68,6 +70,8 @@ public class UserController { ...@@ -68,6 +70,8 @@ public class UserController {
@Autowired @Autowired
private final FileProperties properties; private final FileProperties properties;
@Autowired
private DataCache dataCache;
@ApiOperation("导出用户数据") @ApiOperation("导出用户数据")
@GetMapping(value = "/download") @GetMapping(value = "/download")
...@@ -85,7 +89,17 @@ public class UserController { ...@@ -85,7 +89,17 @@ public class UserController {
Query query = QueryHelp.getQuery(criteria); Query query = QueryHelp.getQuery(criteria);
PageData<User> userPageData = userManager.findByPage(query, pageable); PageData<User> userPageData = userManager.findByPage(query, pageable);
List<UserDto> dtos = userManager.listToDto(userPageData.getContent()); List<UserDto> dtos = userManager.listToDto(userPageData.getContent());
return new PageData<>(dtos,userPageData.getTotalElements()); List<LanguageInfo> lanList = dataCache.getLanguageList();
for (int i = 0; i < dtos.size(); i++) {
String lan=dtos.get(i).getLanguage().replace("_","-");
for (LanguageInfo lang : lanList) {
if (lang.getLanCode().equalsIgnoreCase(dtos.get(i).getLanguage())||lang.getLanCode().equalsIgnoreCase(lan)) {
dtos.get(i).setLanName(lang.getLanName());
break;
}
}
}
return new PageData<>(dtos, userPageData.getTotalElements());
} }
@ApiOperation("新增用户") @ApiOperation("新增用户")
......
...@@ -78,4 +78,10 @@ public class JwtUserDto implements UserDetails { ...@@ -78,4 +78,10 @@ public class JwtUserDto implements UserDetails {
public boolean isEnabled() { public boolean isEnabled() {
return user.getEnabled(); return user.getEnabled();
} }
public String getImageStr(){ return user.getImageStr();}
} }
...@@ -64,5 +64,8 @@ public class OnlineUserDto { ...@@ -64,5 +64,8 @@ public class OnlineUserDto {
*/ */
private Date expiresTime; private Date expiresTime;
/**
* 头像
*/
private String imageStr;
} }
...@@ -52,5 +52,10 @@ public class UserDto implements Serializable { ...@@ -52,5 +52,10 @@ public class UserDto implements Serializable {
@ApiModelProperty("是否已进入调试模式") @ApiModelProperty("是否已进入调试模式")
private Boolean debugModel=false; private Boolean debugModel=false;
@ApiModelProperty("头像")
private String imageStr;
@ApiModelProperty("语言名称:简体中文,繁体中文 等")
private String lanName;
} }
...@@ -100,6 +100,7 @@ public class UserManagerImpl implements IUserManager { ...@@ -100,6 +100,7 @@ public class UserManagerImpl implements IUserManager {
dataUser.setGroups(user.getGroups()); dataUser.setGroups(user.getGroups());
dataUser.setLanguage(user.getLanguage()); dataUser.setLanguage(user.getLanguage());
dataUser.setPwdResetTime(user.getPwdResetTime()); dataUser.setPwdResetTime(user.getPwdResetTime());
dataUser.setImageStr(user.getImageStr());
userDao.save(dataUser); userDao.save(dataUser);
} }
} }
...@@ -114,6 +115,7 @@ public class UserManagerImpl implements IUserManager { ...@@ -114,6 +115,7 @@ public class UserManagerImpl implements IUserManager {
//只能修改邮箱和语言 //只能修改邮箱和语言
dataUser.setEmail(resources.getEmail()); dataUser.setEmail(resources.getEmail());
dataUser.setLanguage(resources.getLanguage()); dataUser.setLanguage(resources.getLanguage());
dataUser.setImageStr(resources.getImageStr());
} }
userDao.save(dataUser); userDao.save(dataUser);
......
...@@ -58,6 +58,12 @@ public class User extends BasePo implements Serializable { ...@@ -58,6 +58,12 @@ public class User extends BasePo implements Serializable {
private String checkCode; private String checkCode;
/**
* 头像
*/
private String imageStr;
public boolean hasGroup(String groupId) { public boolean hasGroup(String groupId) {
if (groupId == null || groupId.equals("") || groupId.equals("-1")) { if (groupId == null || groupId.equals("") || groupId.equals("-1")) {
......
...@@ -76,7 +76,7 @@ smfcore.barcode=\u6761\u7801\u7BA1\u7406 ...@@ -76,7 +76,7 @@ smfcore.barcode=\u6761\u7801\u7BA1\u7406
smfcore.log=\u65E5\u5FD7\u7BA1\u7406 smfcore.log=\u65E5\u5FD7\u7BA1\u7406
smfcore.taskLog=\u7269\u6599\u65E5\u5FD7 smfcore.taskLog=\u7269\u6599\u65E5\u5FD7
smfcore.user=\u7528\u6237\u7BA1\u7406 smfcore.user=\u7528\u6237\u7BA1\u7406
smfcore.peoples=\u7528\u6237\u7BA1\u7406 smfcore.peoples=\u8D26\u53F7\u7BA1\u7406
smfcore.role=\u89D2\u8272\u7BA1\u7406 smfcore.role=\u89D2\u8272\u7BA1\u7406
smfcore.menuNotExist=\u83DC\u5355{0}\u4E0D\u5B58\u5728 smfcore.menuNotExist=\u83DC\u5355{0}\u4E0D\u5B58\u5728
smfcore.noValidStorage=\u6599\u4ED3\u5217\u8868\u4E2D\u672A\u627E\u5230\u53EF\u7528\u7684\u6599\u4ED3 smfcore.noValidStorage=\u6599\u4ED3\u5217\u8868\u4E2D\u672A\u627E\u5230\u53EF\u7528\u7684\u6599\u4ED3
...@@ -403,3 +403,23 @@ smfcore.storagePos.no=\u5426 ...@@ -403,3 +403,23 @@ smfcore.storagePos.no=\u5426
smfcore.dashBoard=\u4EEA\u8868\u76D8 smfcore.dashBoard=\u4EEA\u8868\u76D8
smfcore.spHumiture=\u6E29\u6E7F\u5EA6 smfcore.spHumiture=\u6E29\u6E7F\u5EA6
smfcore.storageOther=\u5176\u4ED6\u8BBE\u5907 smfcore.storageOther=\u5176\u4ED6\u8BBE\u5907
smfcore.humiture.ntemperature2=\u51B7\u85CF\u6E29\u5EA62
smfcore.humiture.ntemperature3=\u51B7\u85CF\u6E29\u5EA63
smfcore.humiture.codetemperature2=\u5236\u51B7\u6E29\u5EA62
smfcore.humiture.wtemperature=\u56DE\u6E29\u6E29\u5EA6
smfcore.equipconfig.connectTimeout=\u8FDE\u63A5\u8D85\u65F6
smfcore.equipApiMsg.url=URL
smfcore.equipApiMsg.request=\u8BF7\u6C42\u4FE1\u606F
smfcore.equipApiMsg.response=\u7ED3\u679C\u4FE1\u606F
smfcore.equipApiMsg.updateTime=\u65F6\u95F4
smfcore.equipApiMsg.state=\u7C7B\u578B
smfcore.equipment.view.nsgroup=Neo Scan
smfcore.equipment.view.apigroup=Pick and Place Machine
smfcore.language.displayLanName.zh-CN=\u4E2D\u6587
smfcore.language.displayLanName.zh-TW=\u7E41\u4F53
smfcore.language.displayLanName.en-US=EN
smfcore.language.displayLanName.ja-JP=\u65E5\u672C\u8A9E
smfcore.language.displayLanName.fr-FR=Fran\u00E7ais
smfcore.language.displayLanName.de-DE=Deutsch
smfcore.logMonitor=\u65E5\u5FD7\u76D1\u63A7
smfcore.materialTrace=\u7269\u6599\u8FFD\u6EAF
\ No newline at end of file \ No newline at end of file
smfcore.valueCanotNull={0} darf nicht leer sein
smfcore.feleFormatError=Dateiformatfehler! Nur {0} - Format wird unterst\u00FCtzt
smfcore.valueAlreadyExist={0}[{1}] existiert bereits
smfcore.valueNotExist={0}[{1}] existiert nicht
smfcore.valueInvalid=[{0}] ist kein g\u00FCltiger Parameter
smfcore.fileToLong=Die Datei \u00FCberschreitet die vorgeschriebene Gr\u00F6\u00DFe
smfcore.fileError=Dateianalyse fehlgeschlagen
smfcore.valueNotFind={0}[{1}] nicht gefunden
smfcore.humidityValueError=Temperaturbereichsdatenfehler
smfcore.humidityShowValueError=Temperaturanzeigebereichsdatenfehler
smfcore.temperatureValueError=Feuchtigkeitsbereichsdatenfehler
smfcore.temperatureShowValueError=Feuchtigkeitsanzeigebereichsdatenfehler
smfcore.notActivated=Konto nicht aktiviert
smfcore.userInfoError=Benutzerinformationen unvollst\u00E4ndig
smfcore.noaccess=Keine Berechtigung, das Men\u00FC dieser Rolle zu \u00E4ndern
smfcore.notSelRole=Bitte w\u00E4hlen Sie die zu \u00E4ndernde Rolle
smfcore.posIsused=Speicherplatz[{0}] des Lagerplatzes[{1}}] hat Material[{2}], L\u00F6schen fehlgeschlagen
smfcore.thePosIsused= Lagerplatz[{0}] hat Material[{1}], kann nicht gel\u00F6scht werden
smfcore.groupWithStorage=Gruppe[{0}] ist mit einem Ger\u00E4t verbunden
smfcore.groupWithUser=Gruppe[{0}] ist mit einem Benutzer verbunden
smfcore.canotDelSelf=L\u00F6schen des Benutzers: Man kann sich selbst nicht l\u00F6schen
smfcore.canotDelUser=L\u00F6schen des Benutzers: Dieser Benutzer kann nicht gel\u00F6scht werden
smfcore.oldPwdError=\u00C4nderung fehlgeschlagen, altes Passwort ist falsch
smfcore.newPwdError=Das neue Passwort darf nicht mit dem alten Passwort \u00FCbereinstimmen
smfcore.pwdError=\u00C4nderung der E-Mail-Adresse fehlgeschlagen, Passwort ist falsch
smfcore.hasNoAccess=Keine Berechtigung, diese Benutzerinformationen zu \u00E4ndern
smfcore.noAccessUpdate=Keine Berechtigung zum L\u00F6schen des Men\u00FCs
smfcore.roleCannotDel=Rolle[{0}] hat {1} Benutzer mit dieser Rolle verbunden, kann nicht gel\u00F6scht werden
smfcore.notFindPos=Lagerplatz nicht gefunden
smfcore.error.barcode.empty=Kein Barcode erkannt
smfcore.error.barcode.many=Mehrere g\u00FCltige Barcodes gefunden, Einlagerung nicht m\u00F6glich
smfcore.error.barcode.expired=Material ist abgelaufen, Einlagerung nicht m\u00F6glich.
smfcore.allBoxView.noReel=Kein Material im Lagerplatz {0}
smfcore.error.barcode.many=Mehrere g\u00FCltige Barcodes gefunden
smfcore.error.barcode.noValidCode=Ung\u00FCltiger Barcode
smfcore.error.barcode.executing=Barcode[{0}}] wird bearbeitet
smfcore.error.pos.notExist=Lagerplatz[{0}] existiert nicht, Einlagerung nicht m\u00F6glich
smfcore.error.pos.wrong=Lagerplatz[{0}] passt nicht zum Lagerhaus[{1}}], Einlagerung nicht m\u00F6glich
smfcore.error.pos.hasReel=Lagerplatz[{0}] hat bereits Material, Einlagerung nicht m\u00F6glich
smfcore.error.pos.sizeNotMatch=Materialgr\u00F6\u00DFe[{0}}] passt nicht zur Lagerplatzgr\u00F6\u00DFe {1}, Einlagerung nicht m\u00F6glich
smfcore.error.storage.offline=Lagerhaus[{0}] ist offline
smfcore.error.barcode.invalid=Kein g\u00FCltiger Barcode gefunden
smfcore.error.barcode.wrongSize=Gr\u00F6\u00DFe[{0}] stimmt nicht \u00FCberein
smfcore.error.barcode.wrongQty=Die Menge des Barcodes[{0}] ist <=0, Wert: {1}
smfcore.error.barcode.taskNotEnd=Die Operation des Materials[{0}] ist noch nicht abgeschlossen, Einlagerung nicht m\u00F6glich
smfcore.error.columnNotExist=Spalte[{0}] muss enthalten sein
smfcore.storage.error.notExist=Lagerhaus {0} nicht gefunden
smfcore.error.barcode.inQueue=QR-Code[{0}] ist bereits in der Warteschlange, Vorgang fehlgeschlagen
smfcore.error.pos.inQueue=Position:[{0}}] ist bereits in der Warteschlange, Vorgang fehlgeschlagen
smfcore.columnNotExist=Spalte[{0}] muss enthalten sein
smfcore.conotUpdate=Benutzername admin kann nicht ge\u00E4ndert werden
smfcore.unfinished=Die Aufgabe des Barcodes[{0}] ist noch nicht abgeschlossen
smfcore.ok=ok
smfcore.shelfNotExist=Das Regal f\u00FCr {0} wurde nicht gefunden
smfcore.inputError=Einlagerungsfehler:{0}
smfcore.checkoutError=Auslagerungsfehler:{0}
smfcore.notask=Bestellung ohne Aufgabe
smfcore.taskCount=Gesamtzahl der Aufgaben :{0}
smfcore.noconnecttion=Nicht verbunden
smfcore.loadMaterialFailed=Materialladefehler:{0}
smfcore.checkNg=Ger\u00E4tepr\u00FCfung fehlgeschlagen:{0}
smfcore.loadMaterialFinished=Materialladung abgeschlossen: {0}
smfcore.lockMaterial=Ger\u00E4tepult
smfcore.lightGroup=Regalgruppierung
smfcore.order=Materialverwaltung
smfcore.workOrder=Arbeitsauftragsauslagerung
smfcore.searchOut=Auslagerung suchen
smfcore.singleOuput=UID-Auslagerung
smfcore.system=Einstellungen
smfcore.bunker=Ger\u00E4teverwaltung
smfcore.storagePos=Lagerplatzverwaltung
smfcore.menu=Men\u00FCverwaltung
smfcore.materiel =Materialarchivverwaltung
smfcore.componentParts=Elektronische Bauteile
smfcore.barcode=Barcodeverwaltung
smfcore.log=Protokollverwaltung
smfcore.taskLog=Materialprotokoll
smfcore.user=Benutzerverwaltung
smfcore.peoples=Kontoverwaltung
smfcore.role=Rollenverwaltung
smfcore.menuNotExist=Men\u00FC{0} existiert nicht
smfcore.noValidStorage=Kein verf\u00FCgbares Lagerhaus in der Lagerhausliste gefunden
smfcore.error.barcode.exist=[{0}}] ist bereits in {1}}[{2}}] vorhanden
smfcore.barcodeSetting=Barcodeeinstellungen
smfcore.posNotExist=Lagerplatz existiert nicht
smfcore.error= Fehler{0}
smfcore.userManager=Benutzerverwaltung
smfcore.cannotRemove=L\u00F6schen des Lagerplatzes fehlgeschlagen, der Lagerplatz[{0}] hat Material
smfcore.nogroupaccess=Keine Berechtigung f\u00FCr die Gruppe[{0}] zur Bearbeitung
smfcore.outSetting=Auslagerungseinstellungen
smfcore.sysSetting=Systemeinstellungen
smfcore.help=Hilfe
smfcore.instruction=Bedienungsanleitung
smfcore.about=\u00DCber
smfcore.tacticsOuput=PN-Auslagerung
smfcore.labelOuput=Materialbezeichnung
smfcore.order.out.executing=Arbeitsauftrag wird bearbeitet
smfcore.order.out.notFound=Arbeitsauftrag nicht gefunden
smfcore.order.out.maxOrder=Maximale Anzahl der ausf\u00FChrbaren Arbeitsauftr\u00E4ge erreicht
smfcore.order.out.noTask=Arbeitsauftrag hat keine ausf\u00FChrbaren Aufgaben
smfcore.cannotUpdateOrderNum=Arbeitsauftrag wurde bereits ausgef\u00FChrt, Menge kann nicht ge\u00E4ndert werden
smfcore.order.close.success=Arbeitsauftrag erfolgreich geschlossen
smfcore.order.close.taskNotEnd=Arbeitsauftrag hat noch nicht abgeschlossene Aufgaben
smfcore.manualOut=Manuelle Auslagerung
smfcore.error.barcode.noRules=Keine Barcodeerkenntnissregeln definiert
smfcore.error.barcode.wrongLength=Barcode[{0}] hat eine falsche L\u00E4nge
smfcore.error.barcode.noField=Barcodeerkenntnis fehlgeschlagen, Feld {0} nicht gefunden
smfcore.error.barcode.pnNotExist=x-Archiv {0} nicht gefunden
smfcore.error.barcode.locked=Lagerplatz[{0}] ist gesperrt
smfcore.error.barcode.authError=Barcodeerkenntnis fehlgeschlagen, bitte wenden Sie sich an den Lieferanten
smfcore.manualOut.ok=Manuelle Auslagerung erfolgreich
smfcore.manualOut.notFound=Keine Materialinformationen in der Lagerverwaltung gefunden
smfcore.order.lineCanotNull=Produktionslinie darf nicht leer sein
smfcore.order.cannotUpdateLine=Arbeitsauftrag wurde bereits ausgef\u00FChrt, Produktionslinie kann nicht ge\u00E4ndert werden
smfcore.order.uploadOK=Arbeitsauftrag erfolgreich hochgeladen
smfcore.order.ameExists=Name der Arbeitsauftrag[{0}] existiert bereits
smfcore.order.hasClose=Arbeitsauftrag wurde bereits geschlossen
smfcore.order.supplementOutFail=Keine auslagerbaren Materialien gefunden
smfcore.materialBox.quantityshort=Materialeinschr\u00E4nkung
smfcore.materialBox.invalid=Keine Materialboxinformationen gefunden {0}
smfcore.materialBox.noReel=Kein entsprechendes Material in der Materialbox gefunden
smfcore.materialBox.boxNoReel=Kein Material in der Materialbox
smfcore.materialBox.inPos=Das Material ist bereits im Lagerplatz {0} vorhanden
smfcore.materialBox.inOtherBox=Das Material ist bereits in der Materialbox {0} vorhanden
smfcore.materialBox=Materialboxbearbeitung
smfcore.shelf.nextPos.hasReel=Der Lagerplatz[{0}] hat bereits Material, bitte scannen Sie den Lagerplatzcode erneut
smfcore.shelf.nextPos.hasTask=Der Lagerplatz[{0}] hat bereits eine Aufgabe, bitte scannen Sie den Lagerplatzcode erneut
smfcore.shelf.notFound=Kein Regal gefunden
smfcore.shelf.pos.notInStorage=Regal[{0}] hat keinen Lagerplatz[{1}] gefunden
smfcore.shelf.pos.notInGroup=Kein Lagerplatz[{0}] in der Gruppe gefunden
smfcore.shelf.msg.hasReel=Der Lagerplatz[{0}] hat bereits Material
smfcore.shelf.msg.tipScanReel=Der Lagerplatz[{0}] wurde erfolgreich bearbeitet, bitte scannen Sie das einzulagernde Material
smfcore.shelf.msg.fastop=Barcodebearbeitung zu schnell, bitte versuchen Sie es sp\u00E4ter erneut
smfcore.shelf.msg.outConfirm=Auslagerung abgeschlossen, der Lagerplatz[{0}] wird ausgeschaltet
smfcore.shelf.msg.noTask=Bearbeitung fehlgeschlagen, keine auslagerbare Aufgabe im Lagerplatz[{0}] gefunden
smfcore.shelf.msg.scanPos=Bitte scannen Sie zuerst den Lagerplatzcode
smfcore.shelf.msg.inOk=Bearbeitung erfolgreich, bitte legen Sie das Material in den Lagerplatz[{0}]
smfcore.label.noReel=Kein auslagerbares Material gefunden
smfcore.msd=MSD-Verwaltung
smfcore.msdManage=MSD-Inventar
smfcore.msdData=MSD-Nachverfolgbarkeit
smfcore.msdSetting=MSD-Einstellungen
smfcore.translation=Ressourcendolmetschung
smfcore.languageCanotNull=Sprachart darf nicht leer sein
smfcore.noLanguageSetAccess=Keine Berechtigung zur Bearbeitung der Spracheinstellungen
smfcore.languageCanotRemoveAll=Alle Spracheneinstellungen k\u00F6nnen nicht entfernt werden
smfcore.solderPaste=Lotverwaltung
smfcore.solderPasteKanban=Ger\u00E4te\u00FCbersicht
smfcore.solderPasteManage=Inventar
smfcore.solderPasteData=Nachverfolgbarkeit
smfcore.solderPasteSetting=Einstellungen
smfcore.orderSetting=Freigegebener Ordner
smfcore.enterCorrectFolder=Bitte geben Sie einen korrekten Ordner ein
smfcore.taskHasEnd=Aufgabe{0} wurde abgebrochen oder ist beendet
smfcore.virtual.notFound=Kein virtueller Lagerplatz gefunden
smfcore.virtual.pos.notInStorage=Kein Lagerplatz[{1}] im virtuellen Lagerplatz[{0}] gefunden
smfcore.virtual.msg.outConfirm=[{0}] wurde erfolgreich ausgelagert
smfcore.cancelPutInTask.fail=Kundenk\u00FCndigung der Einlagerungsaufgabe[{0}] fehlgeschlagen:{1}
smfcore.cancelOutTask.taskHasEnd=Kundenk\u00FCndigung der Auslagerungsaufgabe[{0}] fehlgeschlagen: Aufgabe wurde bereits abgebrochen oder ist beendet
smfcore.cancelOutTask.fail=Kundenk\u00FCndigung der Auslagerungsaufgabe[{0}] fehlgeschlagen:{1}
smfcore.observability=Beobachtbarkeit
smfcore.materialChart=Materialverfolgung
smfcore.report=Berichte
smfcore.inOutData=Ein- und Auslagerung
smfcore.inOutDataCount=Ein- und Auslagerung
smfcore.inventory=Inventar
smfcore.barcodes=Barcodes
smfcore.internet=Internet der Dinge
smfcore.materialBox.qtyError=Bitte geben Sie eine korrekte Menge ein
smfcore.posOutput=Auslagerung des Lagerplatzes
smfcore.posOutput.noFile=Bitte laden Sie zuerst eine Auslagerungsdatei hoch
smfcore.msg.ok=Operation erfolgreich
smfcore.msg.noCid=Operation fehlgeschlagen, keine cid gefunden
smfcore.inList=Einlagerungsliste
smfcore.inlist.ameExists=Einlagerungsliste[{0}] existiert bereits
smfcore.inlist.uploadOK=Einlagerungsliste erfolgreich hochgeladen
smfcore.inlist.notFound=Einlagerungsliste[{0}] nicht gefunden
smfcore.inlist.listOk=Einlagerungsliste[{0}] wurde abgeschlossen
smfcore.inlist.setOk=Einstellungen erfolgreich
smfcore.inlist.pnItemOk=Das Material[{1}] der Einlagerungsliste[{0}] wurde erfolgreich eingelegt
smfcore.inlist.noPn=Kein Einlagerungsbedarf f\u00FCr das Material[{1}] in der Einlagerungsliste[{0}]
smfcore.storagePos.barcode=Barcode
smfcore.storagePos.partNumber=Teilenummer
smfcore.storagePos.proDate=Herstellungsdatum
smfcore.storagePos.expireDate=Ablaufdatum
smfcore.storagePos.posName=Lagerplatzname
smfcore.storagePos.lockName=Arbeitsauftragnummer
smfcore.storagePos.amount=Menge
smfcore.storagePos.putInTime=Erstmalige Einlagerungszeit
smfcore.storagePos.putInDate=Einlagerungsdatum
smfcore.inventory.partNumber=Teilenummer
smfcore.inventory.count=Menge
smfcore.inventory.lockReel=Gesperrt
smfcore.inventory.stockReel=Inventar
smfcore.inventory.storageName=Ger\u00E4t
smfcore.menu.title=Men\u00FCtitel
smfcore.menu.type=Men\u00FCtyp
smfcore.menu.permission=Berechtigungsbezeichnung
smfcore.menu.iframe=Externes Men\u00FC
smfcore.menu.hidden=Men\u00FC sichtbar
smfcore.menu.cache=Men\u00FC cachen
smfcore.menuType.directory=Verzeichnis
smfcore.menuType.menu=Men\u00FC
smfcore.menuType.button=Schaltfl\u00E4che
smfcore.yes=Ja
smfcore.deny=Nein
smfcore.user.id=Benutzer-ID
smfcore.user.name=Benutzername
smfcore.user.enable=Status
smfcore.user.createDate=Erstellungsdatum
smfcore.user.code=Aktivierungscode
smfcore.enable=Aktivieren
smfcore.disabled=Deaktivieren
smfcore.messages.online=Online
smfcore.messages.offline=Offline
smfcore.messages.device=Ger\u00E4t
smfcore.messages.module=Modul
smfcore.messages.type=Typ
smfcore.messages.createDate=Erstellungsdatum
smfcore.messages.msg=Inhalt
smfcore.message.info=Information
smfcore.message.warning=Warnung
smfcore.message.error=Fehler
smfcore.messages.serverStart=Server wurde gestartet
smfcore.message=Nachrichtenabfrage
smfcore.inSuddenStop=Haltesignal empfangen, Alarm ausgel\u00F6st
smfcore.linemsg.update=System wird aktualisiert, Ein- und Auslagerung pausiert
smfcore.linemsg.posLock=[{0}] Lagerplatz[{1}] wurde gesperrt, Einlagerung pausiert
smfcore.task.notExist=Aufgabe nicht vorhanden
smfcore.task.hasEnd=Aufgabe abgeschlossen
smfcore.task.hasCancel=Aufgabe wurde abgebrochen
smfcore.putIn=Material einlagern
smfcore.shelfSetting=Regaleinstellungen
smfcore.noAccess=Keine Berechtigung
smfcore.toDebugModel.ok=Debug-Modus aktiviert
smfcore.exitDebugModel.ok=Debug-Modus deaktiviert
smfcore.pwd.error=Passwortfehler
smfcore.messages.enabledPos=Lagerplatz aktiviert: {0}
smfcore.messages.disabledPos=Lagerplatz deaktiviert: {0}
smfcore.shelf.nlm.notFound=Mobilregal {0} nicht gefunden
smfcore.error.barcode.errorSize=Barcode hat keine Gr\u00F6\u00DFe festgelegt
smfcore.shelf.msg.alreadyInPos=Material bereits im Lagerplatz[{0}]
smfcore.shelf.msg.inMergeOk=Operation erfolgreich, bitte fusionieren Sie den Lagerplatz[{0}] und legen Sie die Palette ein
smfcore.shelf.msg.inError=Kein passender Lagerplatz f\u00FCr [{0}] gefunden
smfcore.dumpWarehousing=Transit-Einlagerung
smfcore.singleDiskWarehousing=Einzellagereinlagerung
smfcore.sluggishMaterials=Stagnierende Materialien
smfcore.safetyInventory=Sicherheitsbestand
smfcore.interfaceException=Schnittstellenfehler
smfcore.safetyInventory.partNumber=Teilenummer
smfcore.safetyInventory.count=Bestandsmenge
smfcore.safetyInventory.stockReel=Bestandsrollen
smfcore.safetyInventory.supplementReel=Erg\u00E4nzungsrollen
smfcore.safetyInventory.amount=Mindestverpackung
smfcore.component.storeError=Bitte geben Sie den korrekten Bestand ein, Mindestbestand <= Sicherheitsbestand <= Maximalbestand
smfcore.equipmentView=Geratevernetzung
smfcore.greaterThanZero=Menge muss gr\u00F6\u00DFer als 0 sein
smfcore.error.virtualOut.num=Menge darf nicht \u00FCber {0} hinausgehen
smfcore.error.virtualOut.noItem=Keine passenden PN oder Materialnummern in Arbeitsauftrag {0} gefunden
smfcore.error.mimo.outFial=Keine auslagerbaren Materialien gefunden
smfcore.error.getMaterialLot.in=Barcode[{0}] Validierung fehlgeschlagen, Einlagerung nicht m\u00F6glich
smfcore.error.getMaterialLot.out=Barcode[{0}] Validierung fehlgeschlagen, Auslagerung nicht m\u00F6glich
smfcore.spKanban=Ger\u00E4te\u00FCbersicht
smfcore.agv=AGV
smfcore.micron.operationFailure=Operation fehlgeschlagen
smfcore.micron.checkoutByPnFail=Keine auslagerbaren Materialien gefunden
smfcore.order.uploadFailure=Hochladen fehlgeschlagen
smfcore.error.storage.outNotEnd=Lagerplatz {0} hat ausstehende Auslagerungsaufgaben, Einlagerung nicht erlaubt
smfcore.order.exception=Ausnahme
smfcore.order.yes=Ja
smfcore.error.barcode.inStorage=[{0}] ist bereits in {1}[{2}]
smfcore.expireMaterials=Abgelaufene Materialien
smfcore.deposit=Depot
smfcore.stabilization=Stabilisierung
smfcore.withdraw=Abheben
smfcore.returnPage=R\u00FCckgabeseite
smfcore.removal=Entfernen
smfcore.humiture=Temperatur und Feuchtigkeit
smfcore.allReport=Alle Berichte
smfcore.movementReport=Materialbewegung
smfcore.inventoryReport=Inventarbericht
smfcore.abnormReport=St\u00F6rfallbericht
smfcore.performanceReport=Leistungsbericht
smfcore.orderReport=Arbeitsauftragsbericht
smfcore.createOrder=Arbeitsauftrag erstellen
smfcore.mlFive=ML5
smfcore.ML5DispatchSelect=ML5 AUSWAHL F\u00DCR DIE VERSANDABFAHRT
smfcore.ML5Loading=ML5 AUSWAHL F\u00DCR DAS LADEN
smfcore.dispatchStatus=STATUS DER VERSANDABFAHRT
smfcore.loadingStatus=STATUS DES LADENS
smfcore.miFive=ML5
smfcore.status1053=Status
smfcore.statePage=Ger\u00E4testatus
smfcore.palletStatus=Pallettenstatus
smfcore.tempLog=Temperaturprotokoll
smfcore.humidityLog=Feuchtigkeitsprotokoll
smfcore.SBSH1=SBSH1
smfcore.SBSH2=SBSH2
smfcore.SBDH1=SBDH1
smfcore.SBDH2=SBDH2
smfcore.SBDH3=SBDH3
smfcore.cl=CI
smfcore.mt=MT
smfcore.ml=MI1
smfcore.ml2=MI2
smfcore.diagnosis=Diagnose
smfcore.helps=Hilfe
smfcore.error.storage.noPos=Das F\u00E4chergitter [{1}] des Silos [{0}] ist voll, es kann keine weiteren Gegenst\u00E4nde aufgenommen werden
smfcore.status=Status
smfcore.storagePos.batch=Batch
smfcore.humiture.cid=CID
smfcore.humiture.temperature=Temperatur
smfcore.humiture.humiture=Feuchtigkeit
smfcore.humiture.createDate=Erstellungsdatum
smfcore.humiture.updateDate=Aktualisierungsdatum
smfcore.order.ri=RI
smfcore.order.pn=PN
smfcore.order.MPN=MPN
smfcore.order.side=Seite
smfcore.order.tableNo=Tischnummer
smfcore.order.feederInfo=Informationen zum F\u00FCtterer
smfcore.order.needReelCount=Ben\u00F6tigte Rollenanzahl
smfcore.order.outReelCount=Ausgelieferte Rollenanzahl
smfcore.order.needNum=Ben\u00F6tigte Menge
smfcore.order.outNum=Ausgelieferte Menge
smfcore.trayLog=Palettenprotokoll
smfcore.utilization=Auslastung
smfcore.errorLog=Fehlerprotokoll
smfcore.errorReport=Fehlerbericht
smfcore.eventLog=Ereignisprotokoll
smfcore.reports=Berichte
smfcore.queryPos.cannotFind=Kann den Positionsnamen [{0}] nicht finden
smfcore.queryPos.posIsEmpty=[{0}] ist leer
smfcore.queryPos.cannotFindBarcode=Kann den Barcode [{0}] im Lager nicht finden
smfcore.storage.notAvailable=Lagerplatz {0} nicht verf\u00FCgbar, kann nicht ausgelagert werden
smfcore.selfAuditManagerment=Inventur
smfcore.selfAudit=Inventur
smfcore.selfAuditLog=Inventurprotokoll
smfcore.selfAudit.preNotEnd=Die letzte Inventur {0} wurde nicht abgeschlossen
smfcore.selfAudit.noStorage=W\u00E4hlen Sie das Ger\u00E4t f\u00FCr die Inventur aus
smfcore.selfAudit.notExist=Keine Inventurinformationen f\u00FCr die Chargennummer [{0}] gefunden
smfcore.selfAudit.hasEnd=Die Inventur f\u00FCr [{0}] wurde abgeschlossen
smfcore.selfAudit.notFind=Keine Inventurinformationen gefunden
smfcore.selfAudit.pause=Die Inventur {0} wurde pausiert
smfcore.shelf.error.orderError=Die Aufgabe stimmt nicht mit dem angegebenen Arbeitsauftrag [{0}] \u00FCberein
smfcore.shelf.error.storageError=Die Aufgabe stimmt nicht mit dem angegebenen Regal [{0}] \u00FCberein
order.error.executing={0} ist bereits in der Aufgabenliste
smfcore.queryPos.solderOutFail=[{0}]checkOut fehlgeschlagen, aktueller Status [{1}]
smfcore.operationFailure=Betriebsfehler
smfcore.hotayi.machineID.error=Inkonsistenz der machineID [{0}] [{1}]
smfcore.selfAudit.noPos=Keine Position gefunden f\u00FCr die Inventur {0}
smfcore.mesApi.inCheck.error=MES-Validierungsfehler: {0}
smfcore.mesApi.loginCheck.fail=MES-Anmeldevalidierung fehlgeschlagen
smfcore.mesApi.loginCheck.error=MES-Anmeldevalidierungsfehler: {0}
smfcore.lockMaterials=Material sperren
smfcore.storage.error.posNameExist=Positionsnamen existiert bereits in einem anderen Silo: {0}
smfcore.selfAudit.hasOutTask=Position [{0}] hat bereits eine Auslagerungsaufgabe
smfcore.order.out.barcode=Ausgangsmaterialdetails
smfcore.mesApi.codeResolveUrl.error=Validierungsfehler: {0}
smfcore.mesApi.codeResolveUrl.paramNull={0} darf nicht leer sein
smfcore.storagePos.weight=Gewicht
smfcore.expireSolderPaste=Abgelaufene Lotpaste
smfcore.spbox.backFail=R\u00FCcklagerungsvalidierung fehlgeschlagen
smfcore.spbox.expireOut=Abgelaufenes Material auslagern
smfcore.humiture.codetemperature=K\u00FChltemperatur
smfcore.humiture.ntemperature=K\u00FChltemperatur
smfcore.cyclecount.executing=Cycle Count wird ausgef\u00FChrt
smfcore.eleckanban=Kanban-Tafel 2
smfcore.agv.already.call=Bereits gerufen
smfcore.agv.pickup=AGV wurde gerufen, um die Fracht abzuholen
smfcore.agv.dispatch=Die Fracht wurde an das Speichersystem gesendet
smfcore.agv.awaitingInstruction=Wartet auf Anweisungen
smfcore.agv.operation=AGV im Betrieb
smfcore.boxmimokanban=Kanban-Tafel 1
smfcore.neoai=Neo Ai
smfcore.duo.offline=Ger\u00E4t {0} ist offline
smfcore.msg.op.fail=Betriebsfehler
smfcore.equip.notExist=Ger\u00E4t nicht vorhanden
smfcore.order.finished=Alle Aufgaben des Arbeitsauftrags [{0}] wurden abgeschlossen
smfcore.spkanban=SP-Kanban-Tafel
smfcore.neximWorkOrder=Nexim Arbeitsauftrag
smfcore.storagePos.plateSize=Palettengr\u00F6\u00DFe
smfcore.storagePos.w=Durchmesser
smfcore.storagePos.h=Dicke
smfcore.storagePos.storageName=Ger\u00E4tename
smfcore.storagePos.column=Spalte
smfcore.storagePos.magazine=Magazin
smfcore.storagePos.layer=Schicht
smfcore.storagePos.slot=Schacht
smfcore.storagePos.available=Verf\u00FCgbarkeit
smfcore.storagePos.yes=Ja
smfcore.storagePos.no=Nein
smfcore.dashBoard=Kanban-Tafel
smfcore.spHumiture=Temperatur und Feuchtigkeit
smfcore.storageOther=Andere Ger\u00E4te
smfcore.humiture.ntemperature2=K\u00FChltemperatur 2
smfcore.humiture.ntemperature3=K\u00FChltemperatur 3
smfcore.humiture.codetemperature2=K\u00FChltemperatur 2
smfcore.humiture.wtemperature=R\u00FCckw\u00E4rmtemperatur
smfcore.equipconfig.connectTimeout=Verbindungszeit\u00FCberschreitung
smfcore.equipApiMsg.url=URL
smfcore.equipApiMsg.request=Anforderungsinformation
smfcore.equipApiMsg.response=Antwortinformation
smfcore.equipApiMsg.updateTime=Zeit
smfcore.equipApiMsg.state=Typ
smfcore.equipment.view.nsgroup=Neo Scan
smfcore.equipment.view.apigroup=Pick and Place Maschine
smfcore.language.displayLanName.zh-CN=\u4E2D\u6587
smfcore.language.displayLanName.zh-TW=\u7E41\u4F53
smfcore.language.displayLanName.en-US=EN
smfcore.language.displayLanName.ja-JP=\u65E5\u672C\u8A9E
smfcore.language.displayLanName.fr-FR=Fran\u00E7ais
smfcore.language.displayLanName.de-DE=Deutsch
smfcore.logMonitor=Log-\u00DCberwachung
smfcore.materialTrace=Materialverfolgung
\ No newline at end of file \ No newline at end of file
...@@ -77,7 +77,7 @@ smfcore.barcode=MA ID Manager ...@@ -77,7 +77,7 @@ smfcore.barcode=MA ID Manager
smfcore.log=Big Data smfcore.log=Big Data
smfcore.taskLog=Material Log smfcore.taskLog=Material Log
smfcore.user=Users smfcore.user=Users
smfcore.peoples=Users smfcore.peoples=Account Management
smfcore.role=Authority smfcore.role=Authority
smfcore.menuNotExist=Menu{0} does not exist smfcore.menuNotExist=Menu{0} does not exist
smfcore.noValidStorage=No available bin found in bin list smfcore.noValidStorage=No available bin found in bin list
...@@ -362,7 +362,7 @@ smfcore.storagePos.weight=Weight ...@@ -362,7 +362,7 @@ smfcore.storagePos.weight=Weight
smfcore.expireSolderPaste=Expired Solder Paste smfcore.expireSolderPaste=Expired Solder Paste
smfcore.spbox.backFail=Back to the library verification failure smfcore.spbox.backFail=Back to the library verification failure
smfcore.spbox.expireOut=Expired solder paste out of storage smfcore.spbox.expireOut=Expired solder paste out of storage
smfcore.humiture.codetemperature=Refrigeration zone temperature smfcore.humiture.codetemperature=Cooling Temperature
smfcore.humiture.ntemperature=Return temperature zone temperature smfcore.humiture.ntemperature=Return temperature zone temperature
smfcore.cyclecount.executing=Cycle Count are being executed smfcore.cyclecount.executing=Cycle Count are being executed
smfcore.eleckanban=Dashboard2 smfcore.eleckanban=Dashboard2
...@@ -394,3 +394,23 @@ smfcore.storagePos.no=No ...@@ -394,3 +394,23 @@ smfcore.storagePos.no=No
smfcore.dashBoard=Dashboard smfcore.dashBoard=Dashboard
smfcore.spHumiture=Temperature & Humidity smfcore.spHumiture=Temperature & Humidity
smfcore.storageOther = Other Devices smfcore.storageOther = Other Devices
smfcore.humiture.ntemperature2=Refrigeration zone temperature 2
smfcore.humiture.ntemperature3=Refrigeration zone temperature 3
smfcore.humiture.codetemperature2=Cooling Temperature 2
smfcore.humiture.wtemperature=Return temperature zone temperature
smfcore.equipconfig.connectTimeout=Connection Timeout
smfcore.equipApiMsg.url=URL/Source
smfcore.equipApiMsg.request=Parameter
smfcore.equipApiMsg.response=Result/Details
smfcore.equipApiMsg.updateTime=Time
smfcore.equipApiMsg.state=Type
smfcore.equipment.view.nsgroup=Neo Scan
smfcore.equipment.view.apigroup=Pick and Place Machine
smfcore.language.displayLanName.zh-CN=\u4E2D\u6587
smfcore.language.displayLanName.zh-TW=\u7E41\u4F53
smfcore.language.displayLanName.en-US=EN
smfcore.language.displayLanName.ja-JP=\u65E5\u672C\u8A9E
smfcore.language.displayLanName.fr-FR=Fran\u00E7ais
smfcore.language.displayLanName.de-DE=Deutsch
smfcore.logMonitor=Log Monitoring
smfcore.materialTrace=Material Trace
\ No newline at end of file \ No newline at end of file
smfcore.valueCanotNull={0} ne peut pas \u00EAtre vide
smfcore.feleFormatError=Erreur de format de fichier !, Seul le format {0} est pris en charge
smfcore.valueAlreadyExist={0}[{1}] existe d\u00E9j\u00E0
smfcore.valueNotExist={0}[{1}] n'existe pas
smfcore.valueInvalid=[{0}] n'est pas un param\u00E8tre valide
smfcore.fileToLong=Le fichier d\u00E9passe la taille autoris\u00E9e
smfcore.fileError=\u00C9chec de l'analyse du fichier
smfcore.valueNotFind={0}[{1}] non trouv\u00E9
smfcore.humidityValueError=Erreur de plage de temp\u00E9rature
smfcore.humidityShowValueError=Erreur de plage d'affichage de temp\u00E9rature
smfcore.temperatureValueError=Erreur de plage d'humidit\u00E9
smfcore.temperatureShowValueError=Erreur de plage d'affichage d'humidit\u00E9
smfcore.notActivated=Le compte n'est pas activ\u00E9
smfcore.userInfoError=Les informations de l'utilisateur sont incompl\u00E8tes
smfcore.noaccess=Pas d'autorisation pour modifier le menu de ce r\u00F4le
smfcore.notSelRole=Veuillez s\u00E9lectionner le r\u00F4le \u00E0 modifier
smfcore.posIsused=Le silo [{0}] et l'emplacement [{1}}] contiennent des mat\u00E9riaux [{2}], impossible de supprimer
smfcore.thePosIsused= L'emplacement [{0}] contient des mat\u00E9riaux [{1}], impossible de supprimer
smfcore.groupWithStorage=Le groupe [{0}] est associ\u00E9 \u00E0 un appareil
smfcore.groupWithUser=Le groupe [{0}] est associ\u00E9 \u00E0 un utilisateur
smfcore.canotDelSelf=Suppression d'utilisateur : impossible de supprimer soi-m\u00EAme
smfcore.canotDelUser=Suppression d'utilisateur : cet utilisateur ne peut pas \u00EAtre supprim\u00E9
smfcore.oldPwdError=\u00C9chec de la modification, ancien mot de passe incorrect
smfcore.newPwdError=Le nouveau mot de passe ne peut pas \u00EAtre identique \u00E0 l'ancien
smfcore.pwdError=\u00C9chec de la modification de l'e-mail, mot de passe incorrect
smfcore.hasNoAccess=Pas d'autorisation pour modifier les informations de cet utilisateur
smfcore.noAccessUpdate=Pas d'autorisation pour supprimer le menu
smfcore.roleCannotDel=Le r\u00F4le [{0}] a {1} utilisateurs associ\u00E9s, impossible de supprimer
smfcore.notFindPos=Emplacement verrouill\u00E9 non trouv\u00E9
smfcore.error.barcode.empty=Aucun code-barres d\u00E9tect\u00E9
smfcore.error.barcode.many=Plusieurs codes-barres valides trouv\u00E9s, impossible d'effectuer l'entr\u00E9e
smfcore.error.barcode.expired=Les mat\u00E9riaux ont expir\u00E9, impossible d'effectuer l'entr\u00E9e.
smfcore.allBoxView.noReel=Aucun mat\u00E9riel dans l'emplacement {0}
smfcore.error.barcode.many=Plusieurs codes-barres valides trouv\u00E9s
smfcore.error.barcode.noValidCode=Code-barres invalide
smfcore.error.barcode.executing=Le code-barres [{0}}] est en cours de traitement
smfcore.error.pos.notExist=L'emplacement [{0}] n'existe pas, impossible d'effectuer l'entr\u00E9e
smfcore.error.pos.wrong=L'emplacement [{0}] ne correspond pas au silo [{1}}], impossible d'effectuer l'entr\u00E9e
smfcore.error.pos.hasReel=L'emplacement [{0}] contient d\u00E9j\u00E0 des mat\u00E9riaux, impossible d'effectuer l'entr\u00E9e
smfcore.error.pos.sizeNotMatch=La taille de la palette [{0}}] ne correspond pas \u00E0 la taille de l'emplacement {1}, impossible d'effectuer l'entr\u00E9e
smfcore.error.storage.offline=Le silo [{0}] est hors ligne
smfcore.error.barcode.invalid=Aucun code-barres valide trouv\u00E9
smfcore.error.barcode.wrongSize=La taille [{0}] ne correspond pas
smfcore.error.barcode.wrongQty=La quantit\u00E9 correspondante au code-barres [{0}] est <=0 : {1}
smfcore.error.barcode.taskNotEnd=La t\u00E2che de la palette [{0}] n'est pas termin\u00E9e, impossible d'effectuer l'op\u00E9ration d'entr\u00E9e
smfcore.error.columnNotExist=La colonne [{0}] doit \u00EAtre incluse
smfcore.storage.error.notExist=Le silo {0} n'a pas \u00E9t\u00E9 trouv\u00E9
smfcore.error.barcode.inQueue=Le code QR [{0}] est d\u00E9j\u00E0 dans la file d'attente, l'op\u00E9ration a \u00E9chou\u00E9
smfcore.error.pos.inQueue=L'emplacement :[{0}}] est d\u00E9j\u00E0 dans la file d'attente, l'op\u00E9ration a \u00E9chou\u00E9
smfcore.columnNotExist=La colonne [{0}] doit \u00EAtre incluse
smfcore.conotUpdate=Le nom d'utilisateur admin ne peut pas \u00EAtre modifi\u00E9
smfcore.unfinished=La t\u00E2che du code-barres [{0}] n'est pas termin\u00E9e
smfcore.ok=ok
smfcore.shelfNotExist=L'emplacement correspondant \u00E0 {0} n'a pas \u00E9t\u00E9 trouv\u00E9
smfcore.inputError=Erreur d'entr\u00E9e :{0}
smfcore.checkoutError=Erreur de sortie :{0}
smfcore.notask=La commande n'a pas de t\u00E2che
smfcore.taskCount=Nombre total de t\u00E2ches :{0}
smfcore.noconnecttion=Non connect\u00E9
smfcore.loadMaterialFailed=\u00C9chec du chargement de l'appareil :{0}
smfcore.checkNg=\u00C9chec de la v\u00E9rification de l'appareil :{0}
smfcore.loadMaterialFinished=Chargement de l'appareil termin\u00E9 : {0}
smfcore.lockMaterial=Tableau de bord de l'appareil
smfcore.lightGroup=Groupement des \u00E9tag\u00E8res
smfcore.order=Gestion des mat\u00E9riaux
smfcore.workOrder=Sortie des commandes
smfcore.searchOut=Recherche de sortie
smfcore.singleOuput=Sortie UID
smfcore.system=Param\u00E8tres
smfcore.bunker=Gestion des appareils
smfcore.storagePos=Gestion des emplacements
smfcore.menu=Gestion des menus
smfcore.materiel=Gestion des archives
smfcore.componentParts=Composants \u00E9lectroniques
smfcore.barcode=Gestion des codes-barres
smfcore.log=Gestion des journaux
smfcore.taskLog=Journal des mat\u00E9riaux
smfcore.user=Gestion des utilisateurs
smfcore.peoples=Gestion de compte
smfcore.role=Gestion des r\u00F4les
smfcore.menuNotExist=Le menu {0} n'existe pas
smfcore.noValidStorage=Aucun silo disponible trouv\u00E9 dans la liste des silos
smfcore.error.barcode.exist=[{0}}] est d\u00E9j\u00E0 dans {1}}[{2}}]
smfcore.barcodeSetting=Param\u00E8tres des codes-barres
smfcore.posNotExist=L'emplacement n'existe pas
smfcore.error=Erreur {0}
smfcore.userManager=Gestion des utilisateurs
smfcore.cannotRemove=\u00C9chec de la suppression de l'emplacement, l'emplacement [{0}] contient des mat\u00E9riaux
smfcore.nogroupaccess=Pas d'autorisation pour le groupe [{0}] pour effectuer cette op\u00E9ration
smfcore.outSetting=Strat\u00E9gie de sortie
smfcore.sysSetting=Param\u00E8tres du syst\u00E8me
smfcore.help=Aide
smfcore.instruction=Manuel d'utilisation
smfcore.about=\u00C0 propos
smfcore.tacticsOuput=Sortie PN
smfcore.labelOuput=\u00C9tiquette de mat\u00E9riel
smfcore.order.out.executing=La commande est en cours d'ex\u00E9cution
smfcore.order.out.notFound=Commande non trouv\u00E9e
smfcore.order.out.maxOrder=Nombre maximal de commandes ex\u00E9cutable atteint
smfcore.order.out.noTask=La commande n'a pas de t\u00E2che ex\u00E9cutable
smfcore.cannotUpdateOrderNum=La commande a d\u00E9j\u00E0 \u00E9t\u00E9 exp\u00E9di\u00E9e, impossible de modifier la quantit\u00E9
smfcore.order.close.success=Commande ferm\u00E9e avec succ\u00E8s
smfcore.order.close.taskNotEnd=La commande a encore des t\u00E2ches en cours
smfcore.manualOut=Sortie manuelle
smfcore.error.barcode.noRules=Aucune r\u00E8gle de d\u00E9codage d\u00E9finie
smfcore.error.barcode.wrongLength=Erreur de longueur du code-barres [{0}]
smfcore.error.barcode.noField=\u00C9chec du d\u00E9codage du code-barres, le champ {0} non trouv\u00E9
smfcore.error.barcode.pnNotExist=Le fichier x {0} n'existe pas
smfcore.error.barcode.locked=L'emplacement [{0}] est verrouill\u00E9
smfcore.error.barcode.authError=\u00C9chec du d\u00E9codage du code-barres, veuillez contacter le fournisseur pour traitement
smfcore.manualOut.ok=Sortie manuelle r\u00E9ussie
smfcore.manualOut.notFound=Aucune information sur la palette trouv\u00E9e dans le stock
smfcore.order.lineCanotNull=Le num\u00E9ro de ligne ne peut pas \u00EAtre vide
smfcore.order.cannotUpdateLine=La commande a d\u00E9j\u00E0 \u00E9t\u00E9 exp\u00E9di\u00E9e, impossible de modifier le num\u00E9ro de ligne
smfcore.order.uploadOK=Commande t\u00E9l\u00E9charg\u00E9e avec succ\u00E8s
smfcore.order.ameExists=Le nom de la commande [{0}] existe d\u00E9j\u00E0
smfcore.order.hasClose=La commande a \u00E9t\u00E9 ferm\u00E9e
smfcore.order.supplementOutFail=Aucun mat\u00E9riel suppl\u00E9mentaire trouv\u00E9 pour l'exp\u00E9dition
smfcore.materialBox.quantityshort=Quantit\u00E9 de mat\u00E9riel insuffisante
smfcore.materialBox.invalid=Aucune information sur la bo\u00EEte de mat\u00E9riel trouv\u00E9e {0}
smfcore.materialBox.noReel=Aucun mat\u00E9riel correspondant trouv\u00E9 dans la bo\u00EEte
smfcore.materialBox.boxNoReel=Aucun mat\u00E9riel dans la bo\u00EEte
smfcore.materialBox.inPos=Le mat\u00E9riel est d\u00E9j\u00E0 dans l'emplacement {0}
smfcore.materialBox.inOtherBox=Le mat\u00E9riel est d\u00E9j\u00E0 dans la bo\u00EEte {0}
smfcore.materialBox=Op\u00E9rations sur la bo\u00EEte de mat\u00E9riel
smfcore.shelf.nextPos.hasReel=L'emplacement [{0}] contient d\u00E9j\u00E0 des mat\u00E9riaux, veuillez rescan le code de l'emplacement
smfcore.shelf.nextPos.hasTask=L'emplacement [{0}] a d\u00E9j\u00E0 une t\u00E2che, veuillez rescan le code de l'emplacement
smfcore.shelf.notFound=Aucune \u00E9tag\u00E8re trouv\u00E9e
smfcore.shelf.pos.notInStorage=L'\u00E9tag\u00E8re [{0}] n'a pas trouv\u00E9 l'emplacement [{1}]
smfcore.shelf.pos.notInGroup=Aucun emplacement [{0}] trouv\u00E9 dans le groupe
smfcore.shelf.msg.hasReel=L'emplacement [{0}] contient d\u00E9j\u00E0 des mat\u00E9riaux
smfcore.shelf.msg.tipScanReel=L'emplacement [{0}] a \u00E9t\u00E9 trait\u00E9 avec succ\u00E8s, veuillez scanner le mat\u00E9riel \u00E0 ins\u00E9rer
smfcore.shelf.msg.fastop=Op\u00E9ration de code-barres trop fr\u00E9quente, veuillez r\u00E9essayer plus tard
smfcore.shelf.msg.outConfirm=Sortie termin\u00E9e, l'emplacement [{0}] s'\u00E9teint
smfcore.shelf.msg.noTask=\u00C9chec de l'op\u00E9ration, aucun t\u00E2che de sortie trouv\u00E9e dans l'emplacement [{0}]
smfcore.shelf.msg.scanPos=Veuillez d'abord scanner le code de l'emplacement
smfcore.shelf.msg.inOk=Op\u00E9ration r\u00E9ussie, veuillez placer le mat\u00E9riel dans l'emplacement [{0}]
smfcore.label.noReel=Aucun mat\u00E9riel trouvable pour la sortie
smfcore.msd=Gestion MSD
smfcore.msdManage=Stock MSD
smfcore.msdData=Tra\u00E7abilit\u00E9 MSD
smfcore.msdSetting=Param\u00E8tres MSD
smfcore.translation=Traduction des ressources
smfcore.languageCanotNull=Le type de langue ne peut pas \u00EAtre vide
smfcore.noLanguageSetAccess=Pas d'autorisation pour \u00E9diter la langue
smfcore.languageCanotRemoveAll=Impossible de supprimer toutes les langues
smfcore.solderPaste=Gestion de la p\u00E2te \u00E0 souder
smfcore.solderPasteKanban=Aper\u00E7u des appareils
smfcore.solderPasteManage=Stock
smfcore.solderPasteData=Tra\u00E7abilit\u00E9
smfcore.solderPasteSetting=Param\u00E8tres
smfcore.orderSetting=Dossier partag\u00E9
smfcore.enterCorrectFolder=Veuillez entrer un dossier correct
smfcore.taskHasEnd=La t\u00E2che {0} a \u00E9t\u00E9 annul\u00E9e ou est termin\u00E9e
smfcore.virtual.notFound=Aucun silo virtuel trouv\u00E9
smfcore.virtual.pos.notInStorage=Aucun emplacement [{1}] trouv\u00E9 dans le silo virtuel [{0}]
smfcore.virtual.msg.outConfirm=[{0}] Sortie termin\u00E9e
smfcore.cancelPutInTask.fail=\u00C9chec de l'annulation de la t\u00E2che d'entr\u00E9e par le client [{0}] : {1}
smfcore.cancelOutTask.taskHasEnd=\u00C9chec de l'annulation de la t\u00E2che de sortie par le client [{0}] : la t\u00E2che est d\u00E9j\u00E0 termin\u00E9e ou annul\u00E9e
smfcore.cancelOutTask.fail=\u00C9chec de l'annulation de la t\u00E2che de sortie par le client [{0}] : {1}
smfcore.observability=Observabilit\u00E9
smfcore.materialChart=Suivi des mat\u00E9riaux
smfcore.report=Rapports
smfcore.inOutData=Entr\u00E9es/Sorties
smfcore.inOutDataCount=Entr\u00E9es/Sorties
smfcore.inventory=Inventaire
smfcore.barcodes=Codes-barres
smfcore.internet=Internet des objets
smfcore.materialBox.qtyError=Veuillez entrer une quantit\u00E9 correcte
smfcore.posOutput=Sortie de l'emplacement
smfcore.posOutput.noFile=Veuillez d'abord t\u00E9l\u00E9charger un fichier de sortie
smfcore.msg.ok=Op\u00E9ration r\u00E9ussie
smfcore.msg.noCid=Op\u00E9ration \u00E9chou\u00E9e, aucun cid trouv\u00E9
smfcore.inList=Bon d'entr\u00E9e
smfcore.inlist.ameExists=Le bon d'entr\u00E9e [{0}] existe d\u00E9j\u00E0
smfcore.inlist.uploadOK=Bon d'entr\u00E9e t\u00E9l\u00E9charg\u00E9 avec succ\u00E8s
smfcore.inlist.notFound=Bon d'entr\u00E9e [{0}] non trouv\u00E9
smfcore.inlist.listOk=Le bon d'entr\u00E9e [{0}] est termin\u00E9
smfcore.inlist.setOk=Param\u00E8tres r\u00E9ussis
smfcore.inlist.pnItemOk=Le mat\u00E9riel [{1}] du bon d'entr\u00E9e [{0}] a \u00E9t\u00E9 mis en stock avec succ\u00E8s
smfcore.inlist.noPn=Le bon d'entr\u00E9e [{0}] n'a pas de besoin d'entr\u00E9e pour le mat\u00E9riel [{1}]
smfcore.storagePos.barcode=Num\u00E9ro de code-barres
smfcore.storagePos.partNumber=Num\u00E9ro de pi\u00E8ce
smfcore.storagePos.proDate=Date de fabrication
smfcore.storagePos.expireDate=Date d'expiration
smfcore.storagePos.posName=Num\u00E9ro d'emplacement
smfcore.storagePos.lockName=Num\u00E9ro de commande
smfcore.storagePos.amount=Quantit\u00E9
smfcore.storagePos.putInTime=Premi\u00E8re mise en stock
smfcore.storagePos.putInDate=Date de mise en stock
smfcore.inventory.partNumber=Num\u00E9ro de pi\u00E8ce
smfcore.inventory.count=Quantit\u00E9
smfcore.inventory.lockReel=Verrouill\u00E9
smfcore.inventory.stockReel=En stock
smfcore.inventory.storageName=Appareil
smfcore.menu.title=Titre du menu
smfcore.menu.type=Type de menu
smfcore.menu.permission=Identifiant de permission
smfcore.menu.iframe=Menu de lien externe
smfcore.menu.hidden=Menu visible
smfcore.menu.cache=Activer le cache
smfcore.menuType.directory=R\u00E9pertoire
smfcore.menuType.menu=Menu
smfcore.menuType.button=Bouton
smfcore.yes=Oui
smfcore.deny=Non
smfcore.user.id=ID utilisateur
smfcore.user.name=Nom d'utilisateur
smfcore.user.enable=\u00C9tat
smfcore.user.createDate=Date de cr\u00E9ation
smfcore.user.code=Code d'activation
smfcore.enable=Activer
smfcore.disabled=D\u00E9sactiver
smfcore.messages.online=En ligne
smfcore.messages.offline=Hors ligne
smfcore.messages.device=Appareil
smfcore.messages.module=Module
smfcore.messages.type=Type
smfcore.messages.createDate=Date de cr\u00E9ation
smfcore.messages.msg=Contenu
smfcore.message.info=Message
smfcore.message.warning=Attention
smfcore.message.error=Erreur
smfcore.messages.serverStart=D\u00E9marrage du serveur
smfcore.message=Requ\u00EAte de message
smfcore.inSuddenStop=Signal d'arr\u00EAt d'urgence re\u00E7u, arr\u00EAt d'urgence
smfcore.linemsg.update=Le syst\u00E8me est mis \u00E0 jour, les op\u00E9rations d'entr\u00E9e-sortie sont suspendues
smfcore.linemsg.posLock=[{0}] L'emplacement [{1}] est verrouill\u00E9, l'entr\u00E9e est suspendue
smfcore.task.notExist=T\u00E2che inexistante
smfcore.task.hasEnd=T\u00E2che termin\u00E9e
smfcore.task.hasCancel=Lors de la mise \u00E0 jour du statut, la t\u00E2che de sortie [{1}] de {0} a \u00E9t\u00E9 annul\u00E9e
smfcore.putIn=Mise en stock du mat\u00E9riel
smfcore.shelfSetting=Param\u00E8tres de l'\u00E9tag\u00E8re
smfcore.noAccess=Aucune autorisation
smfcore.toDebugModel.ok=Mode d\u00E9bogage activ\u00E9
smfcore.exitDebugModel.ok=Mode d\u00E9bogage d\u00E9sactiv\u00E9
smfcore.pwd.error=Erreur de mot de passe
smfcore.messages.enabledPos=Emplacement activ\u00E9 : {0}
smfcore.messages.disabledPos=Emplacement d\u00E9sactiv\u00E9 : {0}
smfcore.shelf.nlm.notFound=Aucune \u00E9tag\u00E8re mobile trouv\u00E9e {0}
smfcore.error.barcode.errorSize=Le code-barres n'a pas de taille d\u00E9finie
smfcore.shelf.msg.alreadyInPos=Le mat\u00E9riel est d\u00E9j\u00E0 dans l'emplacement [{0}]
smfcore.shelf.msg.inMergeOk=Op\u00E9ration r\u00E9ussie, veuillez fusionner l'emplacement [{0}] et placer la palette
smfcore.shelf.msg.inError=Aucun emplacement trouv\u00E9 pour [{0}]
smfcore.dumpWarehousing=Transfert de stock
smfcore.singleDiskWarehousing=Entr\u00E9e de disque unique
smfcore.sluggishMaterials=Mat\u00E9riaux stagnants
smfcore.safetyInventory=Stock de s\u00E9curit\u00E9
smfcore.interfaceException=Exception d'interface
smfcore.safetyInventory.partNumber=Num\u00E9ro de pi\u00E8ce
smfcore.safetyInventory.count=Quantit\u00E9 en stock
smfcore.safetyInventory.stockReel=Nombre de rouleaux en stock
smfcore.safetyInventory.supplementReel=Nombre de rouleaux suppl\u00E9mentaires
smfcore.safetyInventory.amount=Emballage minimum
smfcore.component.storeError=Veuillez saisir le stock correct, stock minimum <= stock de s\u00E9curit\u00E9 <= stock maximum
smfcore.equipmentView=Interconnexion des appareils
smfcore.greaterThanZero=La quantit\u00E9 doit \u00EAtre sup\u00E9rieure \u00E0 0
smfcore.error.virtualOut.num=La quantit\u00E9 ne peut pas d\u00E9passer {0}
smfcore.error.virtualOut.noItem=Aucun num\u00E9ro de PN ou de num\u00E9ro de pi\u00E8ce correspondant trouv\u00E9 dans la commande {0}
smfcore.error.mimo.outFial=Aucun mat\u00E9riel trouv\u00E9 pour la sortie
smfcore.error.getMaterialLot.in=Validation du code-barres [{0}] \u00E9chou\u00E9e, impossible d'effectuer l'entr\u00E9e
smfcore.error.getMaterialLot.out=Validation du code-barres [{0}] \u00E9chou\u00E9e, impossible d'effectuer la sortie
smfcore.spKanban=Aper\u00E7u des appareils
smfcore.agv=AGV
smfcore.micron.operationFailure=\u00C9chec de l'op\u00E9ration
smfcore.micron.checkoutByPnFail=Aucun mat\u00E9riel trouv\u00E9 pour la sortie
smfcore.order.uploadFailure=\u00C9chec du t\u00E9l\u00E9chargement
smfcore.error.storage.outNotEnd=Le silo {0} a une t\u00E2che de sortie en cours, l'entr\u00E9e n'est pas autoris\u00E9e
smfcore.order.exception=Exception
smfcore.order.yes=Oui
smfcore.error.barcode.inStorage=[{0}] est d\u00E9j\u00E0 dans {1}[{2}]
smfcore.expireMaterials=Mat\u00E9riaux p\u00E9rim\u00E9s
smfcore.deposit=D\u00E9p\u00F4t
smfcore.stabilization=Stabilisation
smfcore.withdraw=R\u00E9tractation
smfcore.returnPage=Retour
smfcore.removal=Retrait
smfcore.humiture=Temp\u00E9rature et humidit\u00E9
smfcore.allReport=Tous les rapports
smfcore.movementReport=Mouvement des mat\u00E9riaux
smfcore.inventoryReport=Inventaire
smfcore.abnormReport=Anomalie
smfcore.performanceReport=Performance
smfcore.orderReport=Commande
smfcore.createOrder=Cr\u00E9er une commande
smfcore.mlFive=ML5
smfcore.ML5DispatchSelect=S\u00E9lection de dispatch ML5
smfcore.ML5Loading=S\u00E9lection de chargement ML5
smfcore.dispatchStatus=Statut de dispatch
smfcore.loadingStatus=Statut de chargement
smfcore.miFive=ML5
smfcore.status1053=Statut
smfcore.statePage=Statut de l'\u00E9quipement
smfcore.palletStatus=Statut des palettes
smfcore.tempLog=Journal de temp\u00E9rature
smfcore.humidityLog=Journal d'humidit\u00E9
smfcore.SBSH1=SBSH1
smfcore.SBSH2=SBSH2
smfcore.SBDH1=SBDH1
smfcore.SBDH2=SBDH2
smfcore.SBDH3=SBDH3
smfcore.cl=CI
smfcore.mt=MT
smfcore.ml=MI1
smfcore.ml2=MI2
smfcore.diagnosis=Diagnostic
smfcore.helps=Aide
smfcore.error.storage.noPos=Le compartiment [{1}] du silo [{0}] est plein, impossible de continuer \u00E0 charger
smfcore.status=Statut
smfcore.storagePos.batch=Lot
smfcore.humiture.cid=CID
smfcore.humiture.temperature=Temp\u00E9rature
smfcore.humiture.humiture=Humidit\u00E9
smfcore.humiture.createDate=Date de cr\u00E9ation
smfcore.humiture.updateDate=Date de mise \u00E0 jour
smfcore.order.ri=RI
smfcore.order.pn=PN
smfcore.order.MPN=MPN
smfcore.order.side=C\u00F4t\u00E9
smfcore.order.tableNo=Num\u00E9ro de chariot
smfcore.order.feederInfo=Informations sur la station
smfcore.order.needReelCount=Nombre de rouleaux requis
smfcore.order.outReelCount=Nombre de rouleaux sortis
smfcore.order.needNum=Quantit\u00E9 requise
smfcore.order.outNum=Quantit\u00E9 sortie
smfcore.trayLog=Journal de la palette
smfcore.utilization=Taux d'utilisation
smfcore.errorLog=Journal des erreurs
smfcore.errorReport=Rapport d'erreur
smfcore.eventLog=Journal des \u00E9v\u00E9nements
smfcore.reports=Rapports
smfcore.queryPos.cannotFind=Impossible de trouver le nom de l'emplacement [{0}]
smfcore.queryPos.posIsEmpty=[{0}] est vide
smfcore.queryPos.cannotFindBarcode=Impossible de trouver le code-barres [{0}] dans le stockage
smfcore.storage.notAvailable=Le silo {0} n'est pas disponible, impossible de sortir
smfcore.selfAuditManagerment=Inventaire
smfcore.selfAudit=Inventaire
smfcore.selfAuditLog=Journal d'inventaire
smfcore.selfAudit.preNotEnd=L'inventaire pr\u00E9c\u00E9dent {0} n'est pas termin\u00E9
smfcore.selfAudit.noStorage=Veuillez s\u00E9lectionner l'\u00E9quipement \u00E0 inventorier
smfcore.selfAudit.notExist=Informations d'inventaire pour le num\u00E9ro de lot [{0}] non trouv\u00E9es
smfcore.selfAudit.hasEnd=L'inventaire [{0}] est termin\u00E9
smfcore.selfAudit.notFind=Informations d'inventaire non trouv\u00E9es
smfcore.selfAudit.pause=L'inventaire {0} est en pause
smfcore.shelf.error.orderError=La t\u00E2che ne correspond pas \u00E0 la commande sp\u00E9cifi\u00E9e [{0}]
smfcore.shelf.error.storageError=La t\u00E2che ne correspond pas \u00E0 l'\u00E9tag\u00E8re sp\u00E9cifi\u00E9e [{0}]
order.error.executing={0} est d\u00E9j\u00E0 dans la liste des t\u00E2ches
smfcore.queryPos.solderOutFail=[{0}] \u00C9chec de la sortie, statut actuel [{1}]
smfcore.operationFailure=\u00C9chec de l'op\u00E9ration
smfcore.hotayi.machineID.error=Incoh\u00E9rence de l'ID de la machine [{0}] [{1}]
smfcore.selfAudit.noPos=Num\u00E9ro de poste non trouv\u00E9 pour l'inventaire {0}
smfcore.mesApi.inCheck.error=Erreur de v\u00E9rification MES : {0}
smfcore.mesApi.loginCheck.fail=\u00C9chec de la v\u00E9rification de connexion MES
smfcore.mesApi.loginCheck.error=Erreur de v\u00E9rification de connexion MES : {0}
smfcore.lockMaterials=Verrouillage des mat\u00E9riaux
smfcore.storage.error.posNameExist=Le num\u00E9ro de poste existe d\u00E9j\u00E0 dans un autre silo : {0}
smfcore.selfAudit.hasOutTask=Le poste [{0}] a d\u00E9j\u00E0 une t\u00E2che de sortie
smfcore.order.out.barcode=D\u00E9tails du mat\u00E9riel sortant
smfcore.mesApi.codeResolveUrl.error=Erreur de validation : {0}
smfcore.mesApi.codeResolveUrl.paramNull={0} ne peut pas \u00EAtre vide
smfcore.storagePos.weight=Poids
smfcore.expireSolderPaste=P\u00E2te \u00E0 souder p\u00E9rim\u00E9e
smfcore.spbox.backFail=\u00C9chec de la validation de retour en stock
smfcore.spbox.expireOut=Sortie de mat\u00E9riel p\u00E9rim\u00E9
smfcore.humiture.codetemperature=Temp\u00E9rature de refroidissement
smfcore.humiture.ntemperature=Temp\u00E9rature de r\u00E9frig\u00E9ration
smfcore.cyclecount.executing=Ex\u00E9cution de Cycle Count en cours
smfcore.eleckanban=Tableau de bord 2
smfcore.agv.already.call=Appel d\u00E9j\u00E0 effectu\u00E9
smfcore.agv.pickup=AGV appel\u00E9 pour prendre la marchandise
smfcore.agv.dispatch=La marchandise a \u00E9t\u00E9 envoy\u00E9e au syst\u00E8me de stockage
smfcore.agv.awaitingInstruction=En attente d'instructions
smfcore.agv.operation=AGV en fonctionnement
smfcore.boxmimokanban=Tableau de bord 1
smfcore.neoai=Neo Ai
smfcore.duo.offline=Appareil {0} hors ligne
smfcore.msg.op.fail=\u00C9chec de l'op\u00E9ration
smfcore.equip.notExist=Appareil inexistant
smfcore.order.finished=Toutes les t\u00E2ches de la commande [{0}] sont termin\u00E9es
smfcore.spkanban=Tableau de bord SP
smfcore.neximWorkOrder=Commande Nexim
smfcore.storagePos.plateSize=Taille de la palette
smfcore.storagePos.w=Diam\u00E8tre
smfcore.storagePos.h=\u00C9paisseur
smfcore.storagePos.storageName=Nom de l'appareil
smfcore.storagePos.column=Colonne
smfcore.storagePos.magazine=Magasin
smfcore.storagePos.layer=Couche
smfcore.storagePos.slot=Emplacement
smfcore.storagePos.available=Disponibilit\u00E9
smfcore.storagePos.yes=Oui
smfcore.storagePos.no=Non
smfcore.dashBoard=Tableau de bord
smfcore.spHumiture=Temp\u00E9rature et humidit\u00E9
smfcore.storageOther=Autres appareils
smfcore.humiture.ntemperature2=Temp\u00E9rature de r\u00E9frig\u00E9ration 2
smfcore.humiture.ntemperature3=Temp\u00E9rature de r\u00E9frig\u00E9ration 3
smfcore.humiture.codetemperature2=Temp\u00E9rature de refroidissement 2
smfcore.humiture.wtemperature=Temp\u00E9rature de r\u00E9chauffement
smfcore.equipconfig.connectTimeout=Temps de connexion d\u00E9pass\u00E9
smfcore.equipApiMsg.url=URL
smfcore.equipApiMsg.request=Informations de la requ\u00EAte
smfcore.equipApiMsg.response=Informations de la r\u00E9ponse
smfcore.equipApiMsg.updateTime=Heure
smfcore.equipApiMsg.state=Type
smfcore.equipment.view.nsgroup=Neo Scan
smfcore.equipment.view.apigroup=Machines de placement
smfcore.language.displayLanName.zh-CN=\u4E2D\u6587
smfcore.language.displayLanName.zh-TW=\u7E41\u4F53
smfcore.language.displayLanName.en-US=EN
smfcore.language.displayLanName.ja-JP=\u65E5\u672C\u8A9E
smfcore.language.displayLanName.fr-FR=Fran\u00E7ais
smfcore.language.displayLanName.de-DE=Deutsch
smfcore.logMonitor=Surveillance des Journaux
smfcore.materialTrace=Tra\u00E7abilit\u00E9 des mati\u00E8res
\ No newline at end of file \ No newline at end of file
...@@ -74,7 +74,7 @@ smfcore.barcode=\u30D0\u30FC\u30B3\u30FC\u30C9\u7BA1\u7406 ...@@ -74,7 +74,7 @@ smfcore.barcode=\u30D0\u30FC\u30B3\u30FC\u30C9\u7BA1\u7406
smfcore.log=\u30ED\u30B0\u7BA1\u7406 smfcore.log=\u30ED\u30B0\u7BA1\u7406
smfcore.taskLog=\u30DE\u30C6\u30EA\u30A2\u30EB\u30ED\u30B0 smfcore.taskLog=\u30DE\u30C6\u30EA\u30A2\u30EB\u30ED\u30B0
smfcore.user=\u30E6\u30FC\u30B6\u30FC\u7BA1\u7406 smfcore.user=\u30E6\u30FC\u30B6\u30FC\u7BA1\u7406
smfcore.peoples=\u30E6\u30FC\u30B6\u30FC\u7BA1\u7406 smfcore.peoples=\u30A2\u30AB\u30A6\u30F3\u30C8\u7BA1\u7406
smfcore.role=\u5F79\u5272\u7BA1\u7406 smfcore.role=\u5F79\u5272\u7BA1\u7406
smfcore.menuNotExist=\u30E1\u30CB\u30E5\u30FC{0}\u304C\u5B58\u5728\u3057\u306A\u3044 smfcore.menuNotExist=\u30E1\u30CB\u30E5\u30FC{0}\u304C\u5B58\u5728\u3057\u306A\u3044
smfcore.noValidStorage=\u30D3\u30F3\u30EA\u30B9\u30C8\u306B\u5229\u7528\u53EF\u80FD\u306A\u30D3\u30F3\u304C\u898B\u3064\u304B\u3089\u306A\u3044 smfcore.noValidStorage=\u30D3\u30F3\u30EA\u30B9\u30C8\u306B\u5229\u7528\u53EF\u80FD\u306A\u30D3\u30F3\u304C\u898B\u3064\u304B\u3089\u306A\u3044
...@@ -390,3 +390,23 @@ smfcore.storagePos.no=\u5426 ...@@ -390,3 +390,23 @@ smfcore.storagePos.no=\u5426
smfcore.dashBoard=\u30C0\u30C3\u30B7\u30E5\u30DC\u30FC\u30C9 smfcore.dashBoard=\u30C0\u30C3\u30B7\u30E5\u30DC\u30FC\u30C9
smfcore.spHumiture=\u6E29\u6E7F\u5EA6 smfcore.spHumiture=\u6E29\u6E7F\u5EA6
smfcore.storageOther = \u305D\u306E\u4ED6\u6A5F\u5668 smfcore.storageOther = \u305D\u306E\u4ED6\u6A5F\u5668
smfcore.humiture.ntemperature2=\u51B7\u85CF\u6E29\u5EA62
smfcore.humiture.ntemperature3=\u51B7\u85CF\u6E29\u5EA63
smfcore.humiture.codetemperature2=\u5236\u51B7\u6E29\u5EA62
smfcore.humiture.wtemperature=\u56DE\u6E29\u6E29\u5EA6
smfcore.equipconfig.connectTimeout=\u63A5\u7D9A\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8
smfcore.equipApiMsg.url=URL
smfcore.equipApiMsg.request=\u30EA\u30AF\u30A8\u30B9\u30C8\u60C5\u5831
smfcore.equipApiMsg.response=\u30EC\u30B9\u30DD\u30F3\u30B9\u60C5\u5831
smfcore.equipApiMsg.updateTime=\u6642\u9593
smfcore.equipApiMsg.state=\u30B9\u30C6\u30FC\u30BF\u30B9
smfcore.equipment.view.nsgroup=\u30CD\u30AA\u30B9\u30AD\u30E3\u30F3
smfcore.equipment.view.apigroup=\u30D4\u30C3\u30AF\u30A2\u30F3\u30C9\u30D7\u30EC\u30FC\u30B9\u30DE\u30B7\u30F3
smfcore.language.displayLanName.zh-CN=\u4E2D\u6587
smfcore.language.displayLanName.zh-TW=\u7E41\u4F53
smfcore.language.displayLanName.en-US=EN
smfcore.language.displayLanName.ja-JP=\u65E5\u672C\u8A9E
smfcore.language.displayLanName.fr-FR=Fran\u00E7ais
smfcore.language.displayLanName.de-DE=Deutsch
smfcore.logMonitor=\u30ED\u30B0\u76E3\u8996
smfcore.materialTrace=\u30DE\u30C6\u30EA\u30A2\u30EB\u30C8\u30EC\u30FC\u30B9
\ No newline at end of file \ No newline at end of file
...@@ -76,7 +76,7 @@ smfcore.barcode=\u6761\u7801\u7BA1\u7406 ...@@ -76,7 +76,7 @@ smfcore.barcode=\u6761\u7801\u7BA1\u7406
smfcore.log=\u65E5\u5FD7\u7BA1\u7406 smfcore.log=\u65E5\u5FD7\u7BA1\u7406
smfcore.taskLog=\u7269\u6599\u65E5\u5FD7 smfcore.taskLog=\u7269\u6599\u65E5\u5FD7
smfcore.user=\u7528\u6237\u7BA1\u7406 smfcore.user=\u7528\u6237\u7BA1\u7406
smfcore.peoples=\u7528\u6237\u7BA1\u7406 smfcore.peoples=\u8D26\u53F7\u7BA1\u7406
smfcore.role=\u89D2\u8272\u7BA1\u7406 smfcore.role=\u89D2\u8272\u7BA1\u7406
smfcore.menuNotExist=\u83DC\u5355{0}\u4E0D\u5B58\u5728 smfcore.menuNotExist=\u83DC\u5355{0}\u4E0D\u5B58\u5728
smfcore.noValidStorage=\u6599\u4ED3\u5217\u8868\u4E2D\u672A\u627E\u5230\u53EF\u7528\u7684\u6599\u4ED3 smfcore.noValidStorage=\u6599\u4ED3\u5217\u8868\u4E2D\u672A\u627E\u5230\u53EF\u7528\u7684\u6599\u4ED3
...@@ -390,3 +390,23 @@ smfcore.storagePos.no=\u5426 ...@@ -390,3 +390,23 @@ smfcore.storagePos.no=\u5426
smfcore.dashBoard=\u4EEA\u8868\u76D8 smfcore.dashBoard=\u4EEA\u8868\u76D8
smfcore.spHumiture=\u6E29\u6E7F\u5EA6 smfcore.spHumiture=\u6E29\u6E7F\u5EA6
smfcore.storageOther=\u5176\u4ED6\u8BBE\u5907 smfcore.storageOther=\u5176\u4ED6\u8BBE\u5907
smfcore.humiture.ntemperature2=\u51B7\u85CF\u6E29\u5EA62
smfcore.humiture.ntemperature3=\u51B7\u85CF\u6E29\u5EA63
smfcore.humiture.codetemperature2=\u5236\u51B7\u6E29\u5EA62
smfcore.humiture.wtemperature=\u56DE\u6E29\u6E29\u5EA6
smfcore.equipconfig.connectTimeout=\u8FDE\u63A5\u8D85\u65F6
smfcore.equipApiMsg.url=URL
smfcore.equipApiMsg.request=\u8BF7\u6C42\u4FE1\u606F
smfcore.equipApiMsg.response=\u7ED3\u679C\u4FE1\u606F
smfcore.equipApiMsg.updateTime=\u65F6\u95F4
smfcore.equipApiMsg.state=\u7C7B\u578B
smfcore.equipment.view.nsgroup=Neo Scan
smfcore.equipment.view.apigroup=Pick and Place Machine
smfcore.language.displayLanName.zh-CN=\u4E2D\u6587
smfcore.language.displayLanName.zh-TW=\u7E41\u4F53
smfcore.language.displayLanName.en-US=EN
smfcore.language.displayLanName.ja-JP=\u65E5\u672C\u8A9E
smfcore.language.displayLanName.fr-FR=Fran\u00E7ais
smfcore.language.displayLanName.de-DE=Deutsch
smfcore.logMonitor=\u65E5\u5FD7\u76D1\u63A7
smfcore.materialTrace=\u7269\u6599\u8FFD\u6EAF
\ No newline at end of file \ No newline at end of file
...@@ -75,7 +75,7 @@ smfcore.barcode=\u689D\u78BC\u7BA1\u7406 ...@@ -75,7 +75,7 @@ smfcore.barcode=\u689D\u78BC\u7BA1\u7406
smfcore.log=\u65E5\u5FD7\u7BA1\u7406 smfcore.log=\u65E5\u5FD7\u7BA1\u7406
smfcore.taskLog=\u7269\u6599\u65E5\u5FD7 smfcore.taskLog=\u7269\u6599\u65E5\u5FD7
smfcore.user=\u7528\u6236\u7BA1\u7406 smfcore.user=\u7528\u6236\u7BA1\u7406
smfcore.peoples=\u7528\u6236\u7BA1\u7406 smfcore.peoples=\u8CEC\u865F\u7BA1\u7406
smfcore.role=\u89D2\u8272\u7BA1\u7406 smfcore.role=\u89D2\u8272\u7BA1\u7406
smfcore.menuNotExist=\u83DC\u55AE{0}\u4E0D\u5B58\u5728 smfcore.menuNotExist=\u83DC\u55AE{0}\u4E0D\u5B58\u5728
smfcore.noValidStorage=\u6599\u5009\u5217\u8868\u4E2D\u672A\u627E\u5230\u53EF\u7528\u7684\u6599\u5009 smfcore.noValidStorage=\u6599\u5009\u5217\u8868\u4E2D\u672A\u627E\u5230\u53EF\u7528\u7684\u6599\u5009
...@@ -390,3 +390,23 @@ smfcore.storagePos.no=\u5426 ...@@ -390,3 +390,23 @@ smfcore.storagePos.no=\u5426
smfcore.dashBoard=SP\u5100\u9336\u76E4 smfcore.dashBoard=SP\u5100\u9336\u76E4
smfcore.spHumiture=\u6E29\u6E7F\u5EA6 smfcore.spHumiture=\u6E29\u6E7F\u5EA6
smfcore.storageOther=\u5176\u4ED6\u8A2D\u5099 smfcore.storageOther=\u5176\u4ED6\u8A2D\u5099
smfcore.humiture.ntemperature2=\u51B7\u85CF\u6E29\u5EA62
smfcore.humiture.ntemperature3=\u51B7\u85CF\u6E29\u5EA63
smfcore.humiture.codetemperature2=\u5236\u51B7\u6E29\u5EA62
smfcore.humiture.wtemperature=\u56DE\u6E29\u6E29\u5EA6
smfcore.equipconfig.connectTimeout=\u8FDE\u63A5\u8D85\u65F6
smfcore.equipApiMsg.url=URL
smfcore.equipApiMsg.request=\u8BF7\u6C42\u4FE1\u606F
smfcore.equipApiMsg.response=\u7ED3\u679C\u4FE1\u606F
smfcore.equipApiMsg.updateTime=\u65F6\u95F4
smfcore.equipApiMsg.state=\u7C7B\u578B
smfcore.equipment.view.nsgroup=Neo Scan
smfcore.equipment.view.apigroup=Pick and Place Machine
smfcore.language.displayLanName.zh-CN=\u4E2D\u6587
smfcore.language.displayLanName.zh-TW=\u7E41\u4F53
smfcore.language.displayLanName.en-US=EN
smfcore.language.displayLanName.ja-JP=\u65E5\u672C\u8A9E
smfcore.language.displayLanName.fr-FR=Fran\u00E7ais
smfcore.language.displayLanName.de-DE=Deutsch
smfcore.logMonitor=\u65E5\u8A8C\u76E3\u63A7
smfcore.materialTrace=\u7269\u6599\u8FFD\u6EAF
\ No newline at end of file \ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!