Commit f9bf1e74 孙克

Merge remote-tracking branch 'origin/master'

2 个父辈 5a6d6a8c 4b410f44
正在显示 106 个修改的文件 包含 2124 行增加338 行删除
......@@ -89,7 +89,7 @@ public class DataInitManager {
operator = roleManager.save(operator);
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);
log.info("创建默认用户:" + admin.toString());
......
......@@ -121,7 +121,7 @@ public class MenuInit {
//addDefaultFunctionMenu(-1,null,"Neo Ai","neoai","neoai/index","neoai");
//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);
......@@ -150,11 +150,11 @@ public class MenuInit {
addDefaultFunctionMenu(2, poutOut,"PN出库", "tacticsOuput", "neolight/tacticsOuput/index", "tacticsOuput",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(6, poutOut, "物料标签", "labelOuput", "neolight/labelOuput/index", "mgroup");
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");
addDefaultFunctionMenu(9, poutOut, "入库单", "inList", "system/inList/index", "headIcon");
addDefaultFunctionMenu(10, poutOut, "物料入库", "putIn", "system/putIn/index", "headIcon");
......@@ -163,7 +163,7 @@ public class MenuInit {
// addDefaultFunctionMenu(12, poutOut, "单盘入库", "singleDiskWarehousing", "system/singleDiskWarehousing/index", "headIcon");
addDefaultFunctionMenu(13, poutOut, "呆滞物料", "sluggishMaterials", "system/sluggishMaterials/index", "sMaterial");
//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设置
......@@ -181,6 +181,7 @@ public class MenuInit {
addDefaultFunctionMenu(34,solderPaste, "设置", "solderPasteSetting", "neolight/solderPasteSetting/index","system",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);
......@@ -189,13 +190,16 @@ public class MenuInit {
//条形码:条码管理,条码设置
Menu pMenuBarcode = Menu.CreatePMenu("条形码", 7, "barcodes", "barcodeMenu",null);
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);
addDefaultFunctionMenu(61, pMenuLog, "物料日志", "taskLog", "neolight/taskLog/index", "education",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);
......@@ -205,7 +209,7 @@ public class MenuInit {
addDefaultFunctionMenu(71, pMenuReport, "出入库", "inOutDataCount", "neolight/inOutDataCount/index", "outPut",DEFAULT_SHOW_MENU);
addDefaultFunctionMenu(72, pMenuReport,"库存", "inventory", "neolight/inventory/index", "inventory");
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(75, pMenuReport,"过期物料", "expireMaterials", "system/expireMaterials/index", "sMaterial");
addDefaultFunctionMenu(81,pMenuReport, "物料追踪", "materialChart", "neolight/materialChart/index", "maChart");
......@@ -229,11 +233,14 @@ public class MenuInit {
addDefaultFunctionMenu(103, poutSet, "菜单管理", "menu", "system/menu/index", "menu");
// Menu sysSetting = new Menu(, "barcode", "条码设置", "barcodeSetting", "system/barcodeSetting/index", "database");
// Menu outSet = new Menu(, "outSetting", "出库策略", "outSetting", "system/outSetting/index", "outSet");
addDefaultFunctionMenu(104,poutSet, "系统设置", "sysSetting", "system/sysSetting/index", "sysSet",DEFAULT_SHOW_MENU);
addDefaultFunctionMenu(105,poutSet, "资源翻译", "translation", "system/translation/index", "translation");
// Menu orderSet = new Menu(, "orderSetting", "工单设置", "orderSetting", "system/orderSetting/index", "sysSet");
addDefaultFunctionMenu(106,poutSet, "料架设置", "shelfSetting", "system/shelfSetting/index", "translation",NL_SHOW_MENU);
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);
addDefaultFunctionMenu(99991, helpAbout, "说明书", "instruction", "system/instruction/index","aboutBook");
......
......@@ -169,6 +169,12 @@ public class Constants {
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";
......
......@@ -28,6 +28,7 @@ import org.apache.logging.log4j.util.Strings;
import org.springframework.util.CollectionUtils;
import java.io.*;
import java.net.InetAddress;
import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
......@@ -148,6 +149,9 @@ public class HttpHelper {
return postJsonWithAuth(url, params, null);
}
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 = "";
// 设置请求参数
......@@ -171,6 +175,16 @@ public class HttpHelper {
if (auth != null && !auth.isEmpty()) {
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));
httpClient = HttpClients.createDefault();
response = httpClient.execute(httpPost);
......@@ -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 {
// 设置请求参数
if (params != null) {
......@@ -637,5 +704,17 @@ public class HttpHelper {
stringBuffer.append(paramStr);
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;
import com.neotel.smfcore.security.service.po.User;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.*;
@Slf4j
public class UserCodeUtil {
public static void main(String[] args) {
public static void main(String[] args)
{
// FilePro();
CreateUserCode( );
}
public static void CreateUserCode( ) {
try {
String filePath = "F:\\";
String fileName="用户.csv";
String fileName="2024-11-20 09_24_35-.csv";
List<User> list = ReadFile(filePath+fileName);
//创建验证码
for (int i = 0; i < list.size(); i++
......@@ -29,7 +28,7 @@ public class UserCodeUtil {
list.get(i).setCheckCode(code);
}
String targetFile=filePath+"更新后_"+fileName;
String targetFile=filePath+"New_"+fileName;
if(FileUtil.exist(targetFile)){
FileUtil.del(targetFile);
}
......@@ -43,7 +42,9 @@ public class UserCodeUtil {
//
// 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);
for (User user :
list) {
......@@ -69,6 +70,9 @@ public class UserCodeUtil {
}
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>();
CsvReader csvRead = CsvReader.newReader(fileURL,"用户ID","ID");
......@@ -107,7 +111,7 @@ public class UserCodeUtil {
String langu="";
String roleId="";
User user=new User(username,email,langu,roleId,"",true
,false,new Date(),new HashSet<>(),"");
,false,new Date(),new HashSet<>(),"","");
user.setId(id);
user.setCreateDate(createData);
list.add(user);
......
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 lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@Data
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 String url;
......@@ -15,7 +25,9 @@ public class ApiInteractionQuery {
//private String param;
//private String result;
private String status = ApiInteraction_Status.OK;
@QueryCondition
private String status ="";
@QueryCondition
private String type="";
}
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.utils.DateUtil;
import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.common.utils.QueryHelp;
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.po.ApiInteraction;
import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
......@@ -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.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
@RequestMapping("/apiInteraction")
@RestController
......@@ -26,7 +39,45 @@ public class ApiInteractionController {
@AnonymousAccess
public PageData list(ApiInteractionQuery query, Pageable pageable){
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;
import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.core.apiInteraction.enums.ApiInteraction_Status;
import com.neotel.smfcore.core.equipment.enums.EquipmentType;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
......@@ -14,6 +15,17 @@ import java.util.Date;
@NoArgsConstructor
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 String url;
......@@ -23,4 +35,7 @@ public class ApiInteraction extends BasePo implements Serializable {
private String result;
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;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import com.google.common.collect.Lists;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.bean.ResultBean;
......@@ -7,9 +9,12 @@ import com.neotel.smfcore.common.csv.CsvReader;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.common.utils.StringUtils;
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.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.mapstruct.BarcodeMapper;
import com.neotel.smfcore.core.barcode.rest.bean.query.BarcodeQueryCriteria;
......@@ -39,10 +44,7 @@ import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
@Slf4j
@RestController
......@@ -123,9 +125,34 @@ public class BarcodeController {
public BarcodeRuleDto getRules() {
Settings settings = dataCache.getSettings();
BarcodeRuleDto ruleDto = new BarcodeRuleDto();
ruleDto.setCodeRuleList(settings.getCodeRuleList());
List<String> codeRuleList = settings.getCodeRuleList();
ruleDto.setCodeRuleList(codeRuleList);
ruleDto.setPageHeight(settings.getPageHeight());
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;
}
......@@ -152,6 +179,25 @@ public class BarcodeController {
settings.setCodeRuleList(params.getCodeRuleList());
settings.setPageHeight(params.getPageHeight());
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);
//修改设置
return new ResponseEntity<>(HttpStatus.OK);
......@@ -189,9 +235,12 @@ public class BarcodeController {
@ApiOperation("根据条码信息获取条码规则")
@PostMapping(value = "getBarcodeRule")
@AnonymousAccess
//@AnonymousAccess
public ResultBean getBarcodeRule(@RequestBody Map<String, String> paramMap) {
String codeStr = paramMap.get("codeStr");
if(ObjectUtil.isEmpty(codeStr)){
throw new ValidateException("smfcore.valueCanotNull","{0}不能为空",new String[]{"codeStr"} );
}
paramMap.remove("codeStr");
String ruleStr = BarcodeRule.toCodeRule(codeStr, paramMap);
return ResultBean.newOkResult(ruleStr);
......@@ -200,18 +249,52 @@ public class BarcodeController {
@ApiOperation("获取条码内容")
@PostMapping("/getBarCodeInfo")
@AnonymousAccess
//@AnonymousAccess
public ResultBean getBarCodeInfo(@RequestBody Map<String, String> paramMap) {
//获取条码内容
String codeStr = paramMap.get("code");
List<BarcodeRule> barcodeRuleList = codeResolve.getBarcodeRuleList();
if (barcodeRuleList != null && !barcodeRuleList.isEmpty()) {
for (BarcodeRule barcodeRule : barcodeRuleList) {
if (ObjectUtil.isEmpty(codeStr)) {
codeStr = "";
}
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);
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 {
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 {
@ApiModelProperty("打印条码的纸张高度")
private int pageHeight = 160;
@ApiModelProperty("具体规则详情")
private List<BarcodeRuleDetailDto> codeRuleDetailList = Lists.newArrayList();
}
......@@ -763,6 +763,9 @@ public class StatusBean {
} else if (msg.startsWith("W=")) {
msgType = MessageType.WARNING.name();
msg = msg.substring(2);
} else if (msg.startsWith("C=")){
msgType = MessageType.CRITICAL.name();
msg = msg.substring(2);
}
if (msgArray.length == 1) {
......
......@@ -31,6 +31,7 @@ import com.neotel.smfcore.core.storage.service.manager.IStorageManager;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.service.dao.IAlarmInfoDao;
import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
import com.neotel.smfcore.core.system.service.po.AlarmInfo;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
......@@ -82,6 +83,9 @@ public class DeviceController {
@Autowired
private IBarcodeManager barcodeManager;
@Autowired
private IDataLogManager dataLogManager;
/**
* 权限验证API列表
*/
......@@ -423,9 +427,15 @@ public class DeviceController {
boolean cancelResult = taskService.cancelTask(task.getId());
log.info("客户端取消["+codeStr+"]的未执行完成的出库任务结果:" + cancelResult);
return ResultBean.newOkResult(cancelResult);
}else{
return ResultBean.newErrorResult(2005, "smfcore.cancelOutTask.taskHasEnd","客户端取消入库任务[{0}]失败:任务已结束或已取消", new String[]{codeStr });
} else {
if (!task.isFinished() && !task.isCancel()) {
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{
// //禁用库位
......
package com.neotel.smfcore.core.equipment.enums;
import com.google.common.collect.Lists;
import com.neotel.smfcore.core.storage.enums.DeviceType;
import java.util.List;
......@@ -16,31 +15,35 @@ public enum EquipmentType {
AUTO(),
/**
* 1 扫码贴标
* 扫码贴标
*/
@Deprecated
NEOSCAN(),
NS100(),
/**
* NS200
*/
NS200(),
/**
* 2 点料机
* 点料机
*/
COUNTING(),
// COUNTING(),
NEOCOUNTER(),
/**
* 3 插件机
* 插件机
*/
NEOSTATION(),
/**
* 4 FUJINEOLINK
*/
FUJINEOLINK(),
// /**
// * 4 FUJINEOLINK
// */
// FUJINEOLINK(),
/**
* 5 PANACIMNEOLINK
......@@ -55,7 +58,7 @@ public enum EquipmentType {
/**
* 韩华
*/
HANWHA(),
T_SOLUTION(),
/**
* NEXIM
......@@ -64,6 +67,16 @@ public enum EquipmentType {
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;
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.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.util.EquipmentCache;
import com.neotel.smfcore.core.equipment.bean.EquipMsg;
import com.neotel.smfcore.core.equipment.bean.EquipStatusBean;
import com.neotel.smfcore.core.equipment.rest.dto.EquipStatusDto;
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.storage.enums.DeviceType;
import com.neotel.smfcore.core.storage.service.po.Storage;
......@@ -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.config.FujiCacheConfig;
import com.neotel.smfcore.custom.hanwha.handler.TMSCommunicator;
import com.neotel.smfcore.custom.panacim.PanaApiController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
......@@ -31,6 +35,7 @@ import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
......@@ -49,10 +54,74 @@ public class EquipViewController {
@Autowired
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("获取看板数据")
@GetMapping
@PreAuthorize("@el.check('equipmentView:info')")
public List<EquipStatusDto> info(HttpServletRequest servletRequest) {
public EquipKanbanDto info(HttpServletRequest servletRequest) {
Locale locale=servletRequest.getLocale();
List<EquipStatusDto> resultList=new ArrayList<>();
......@@ -60,6 +129,9 @@ public class EquipViewController {
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()){
......@@ -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()){
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.setActivate(true);
if (config != null) {
// dto.setStatus(1);
}
}
}else if(equip.getType().equalsIgnoreCase(EquipmentType.PANACIMNEOLINK.name())) {
if (PanaApiController.isOnLine()) {
dto.setOnLine(true);
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);
// }
// }
//再把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());
// 把 pana,nexim,t-solution放到 Pick and Place Machine 里面
// Neo Scan 包括 Neo Scan 和 Scan Plus
List<EquipGroupDto> list=new ArrayList<>();
//三个组
List<EquipStatusDto> apiList=resultList.stream().filter(dto->EquipmentType.apiTypeList().contains(dto.getType())).collect(Collectors.toList());
if(apiList.size()>0){
EquipGroupDto dto=new EquipGroupDto(MessageUtils.getText("smfcore.equipment.view.apigroup",locale,"Pick and Place Machine"),apiList);
list.add(dto);
}
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看板数据")
......
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.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.common.utils.SecurityUtils;
......@@ -22,6 +24,7 @@ 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.http.HttpStatus;
import org.springframework.http.ResponseEntity;
......@@ -57,6 +60,13 @@ public class EquipmentController {
Query query= QueryHelp.getQuery(criteria);
PageData<Equipment> pages = equipmentManager.findByPage(query, pageable);
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());
}
......@@ -82,6 +92,11 @@ public class EquipmentController {
}
}
}
if(equipment.isAPIEquip()){
equipment.setActivate(false);
}else{
equipment.setActivate(true);
}
equipment = equipmentManager.save(equipment);
equipmentCache.reloadEquipment(equipment,equipment.getCid());
return new ResponseEntity<>(HttpStatus.CREATED);
......@@ -104,6 +119,7 @@ public class EquipmentController {
} if(StringUtils.isEmpty(equipment.getType())){
throw new ValidateException("smfcore.valueCanotNull","{0}不能为空",new String[]{"type"} );
}
String oldCid="";
for (Equipment equ : equipmentCache.getAllEquipment().values()) {
if (!equipment.getId().equals(equ.getId())){
if(equipment.getName().equals(equ.getName())){
......@@ -112,10 +128,15 @@ public class EquipmentController {
if(equipment.getCid().equals(equ.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);
equipmentCache.reloadEquipment(equipment,equipment.getCid());
equipmentCache.reloadEquipment(equipment,oldCid);
return new ResponseEntity<>(HttpStatus.OK);
}
......@@ -153,4 +174,48 @@ public class EquipmentController {
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
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 {
@ApiModelProperty("是否可用")
private boolean available = true;
@ApiModelProperty("是否激活")
private boolean activate=true;
@ApiModelProperty("是否是第三方对接设备")
private boolean aPIEquip=false;
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 {
*/
private boolean available = true;
/**
* 是否激活
*/
private boolean activate=true;
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 {
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.humiture.cid", locale, "CID")));
if (isSpStorage) {
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.codetemperature2", locale, "制冷温度2")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.humiture.wtemperature", locale, "回温温度")));
}else{
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.humiture.temperature", locale, "温度")));
}
......@@ -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.updateDate", locale, "更新时间")));
return header;
}
......@@ -164,12 +169,18 @@ public class HumitureController {
data.add(humiture.getCid());
data.add(humiture.getTemperature());
if (isSpStorage) {
data.add(humiture.getTemperature2());
data.add(humiture.getTemperature3());
data.add(humiture.getCodeAirTemp());
data.add(humiture.getCodeAirTemp2() );
data.add(humiture.getWTemp());
}
data.add(humiture.getHumidity());
data.add(createDate);
// data.add(updateDate);
dataList.add(data);
}
return dataList;
}
......
......@@ -21,10 +21,8 @@ import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
@Slf4j
@RestController
......@@ -36,22 +34,30 @@ public class LanguageSetController {
@Autowired
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);
// if (lanList == null || lanList.size() <= 0) {
// lanList = MessageUtils.getDefaultLanList();
// dataCache.updateCache(Constants.CACHE_languageType, lanList);
// }
return dataCache.getLanguageList();
List<LanguageInfo> lanList = dataCache.getLanguageList();
//没有缩写的加上
for (int i = 0; i < lanList.size(); i++) {
String disName = MessageUtils.getText("smfcore.language.displayLanName." + lanList.get(i).getLanCode(), locale, "");
lanList.get(i).setDisplayLanName(disName);
}
return lanList;
}
@ApiOperation("获取语言列表")
@GetMapping
@AnonymousAccess
// @PreAuthorize("@el.check('translation')")
public List<LanguageInfo> getList(){
return getAllLanList();
public List<LanguageInfo> getList(HttpServletRequest request){
return getAllLanList(request.getLocale());
}
@ApiOperation("新增语言")
@PostMapping
......
......@@ -24,6 +24,12 @@ public class LanguageInfo implements Serializable {
private String lanName;
/**
* 登录界面显示的语言名称,简写
*/
@ApiModelProperty("登录界面显示文本:CN,EN 等")
private String displayLanName;
/**
* 语言图标
*/
@ApiModelProperty("语言图标")
......
......@@ -85,6 +85,8 @@ public class MessageUtils {
public static final String ZH_TW = "zh-TW";
public static final String EN_US = "en-US";
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
public static final String smfcore="smfcore";
......@@ -227,10 +229,12 @@ public class MessageUtils {
List<LanguageInfo> lanList = new ArrayList<>();
if (lanList == null || lanList.size() <= 0) {
lanList=new ArrayList<>();
lanList.add(new LanguageInfo(MessageUtils.ZH_CN,"简体中文",""));
lanList.add(new LanguageInfo(MessageUtils.ZH_TW,"繁体中文",""));
lanList.add(new LanguageInfo(MessageUtils.EN_US,"English",""));
lanList.add(new LanguageInfo(MessageUtils.JA_JP,"日本语",""));
lanList.add(new LanguageInfo(MessageUtils.ZH_CN,"简体中文","CN",""));
lanList.add(new LanguageInfo(MessageUtils.ZH_TW,"繁体中文","TC",""));
lanList.add(new LanguageInfo(MessageUtils.EN_US,"English","EN",""));
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;
}
......
......@@ -25,4 +25,9 @@ public enum MessageType {
* 4 显示数据,仅显示不保存
*/
SHOW,
/**
* 5 需要人员立即操作的
*/
CRITICAL
}
package com.neotel.smfcore.core.message.rest;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
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.ResultBean;
import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.core.language.util.MessageUtils;
......@@ -32,9 +36,7 @@ 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;
import java.util.*;
@Slf4j
@RestController
......@@ -89,6 +91,8 @@ public class MessageController {
return getMsgReportList(criteria, request.getLocale());
}
private List<MsgCountDto> getMsgReportList(MessageCriteria criteria,Locale locale) {
Criteria c = Criteria.where("type").is("ERROR");
if (ObjectUtil.isNotEmpty(criteria.getDeviceName())) {
......@@ -147,5 +151,50 @@ public class MessageController {
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;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import java.util.List;
@Data
public class MessageCriteria {
......@@ -18,7 +19,7 @@ public class MessageCriteria {
private BetweenData<Date> createDate;
@QueryCondition(type = QueryCondition.Type.BETWEEN, propName = "updateDate")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private BetweenData<Date> updateDate;
@QueryCondition
......@@ -36,4 +37,8 @@ public class MessageCriteria {
@QueryCondition
@ApiModelProperty("类型")
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;
import org.springframework.data.mongodb.core.query.Query;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.List;
import java.util.Locale;
......@@ -18,4 +19,6 @@ public interface IMessageManager extends IBaseManager<Message> {
Message findOne(Query query);
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;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.DateUtil;
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.po.LanguageMsg;
import com.neotel.smfcore.core.language.util.MessageUtils;
......@@ -16,6 +17,7 @@ import com.neotel.smfcore.core.message.service.po.Message;
import com.neotel.smfcore.security.service.po.User;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.util.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
......@@ -131,6 +133,17 @@ public class MessageManagerImpl implements IMessageManager {
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
private class MsgDeviceName {
private String deviceName;
......
......@@ -97,7 +97,7 @@ public class DeviceMessageUtil {
if(result){
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) {
......@@ -114,7 +114,7 @@ public class DeviceMessageUtil {
if(result){
messageManager.save(message);
}
messageManager.save(message);
// messageManager.save(message);
}
}
......
......@@ -60,11 +60,11 @@ public class LiteOrderCache {
@Autowired
private SmfApi smfApi;
//最大工单数
public int MaxOrderCount=1;
public boolean SingleOrderMode(){
return MaxOrderCount==1;
}
// //最大工单数
// public int MaxOrderCount=1;
// public boolean SingleOrderMode(){
// return MaxOrderCount==1;
// }
/**
......@@ -496,6 +496,7 @@ public class LiteOrderCache {
}
List<String> availableStorageIds = dataCache.getAvailableStorageIds(cidList);
boolean shortage=false;
//其他出库模式一次性全部生成任务
for (LiteOrderItem orderItem : cacheOrder.getOrderItems()) {
orderItem.setOutNum(0);
......@@ -533,6 +534,7 @@ public class LiteOrderCache {
break;
}
}else{
shortage=true;
log.info("工单[" + orderNo + "]RI出库时,库存中未找到料盘["+reelId+"]");
}
}else if (Strings.isNullOrEmpty(reelId) && !Strings.isNullOrEmpty(partNumber)){
......@@ -543,6 +545,7 @@ public class LiteOrderCache {
}
if (pos == null) {
// log.error("未找到可以出库的物料[" + partNumber + "]");
shortage=true;
break;
} else {
assignNum = assignNum + pos.getBarcode().getAmount();
......@@ -572,6 +575,11 @@ public class LiteOrderCache {
}
if(shortage){
cacheOrder.addAppendDate("shortage","true");
}else{
cacheOrder.addAppendDate("shortage","false");
}
cacheOrder.setTaskReelCount(taskReelCount);
cacheOrder.setTotalTaskReelCount(cacheOrder.getTotalTaskReelCount()+taskReelCount);
log.info("工单[" + orderNo + "]任务分配结束,任务数[" + taskReelCount + "]");
......@@ -679,6 +687,7 @@ public class LiteOrderCache {
}
if(shortReel){
cacheOrder.addAppendDate("shortage","true");
cacheOrder.setClosed(true);
cacheOrder.setStatus(LITEORDER_STATUS.CLOSED);
liteOrderManager.save(cacheOrder);
......@@ -847,6 +856,7 @@ public class LiteOrderCache {
cacheOrder.setTaskReelCount(outCount);
cacheOrder.setTaskFinishedTime(-1);
cacheOrder.setFinishedReelCount(0);
cacheOrder.setStatus(LITEORDER_STATUS.ONE);
liteOrderManager.save(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 {
protected LiteOrderCache liteOrderCache;
@Override
public boolean handleOrderFile(File orderFile) {
public boolean handleOrderFile(File orderFile,int sourceType) {
String fileName = orderFile.getName();
//String backupFileName = fileName +"_" + System.currentTimeMillis();
//看数据库是否已有此工单
......@@ -64,6 +64,7 @@ public class DefaultOrderFileListener implements IOrderFileListener {
LiteOrder liteOrder = new LiteOrder(so, liteOrderItems);
liteOrder.setSource(fileName);
liteOrder.setSourceType(sourceType);//0=手动创建,1=共享文件夹
LiteOrder dbOrder = liteOrderManager.findByOrderNo(liteOrder.getOrderNo());
if (dbOrder != null) {
......
......@@ -7,6 +7,6 @@ import java.io.File;
*/
public interface IOrderFileListener {
boolean handleOrderFile(File orderFile);
boolean handleOrderFile(File orderFile,int sourceType);
}
......@@ -3,7 +3,6 @@ package com.neotel.smfcore.core.order.rest;
import cn.hutool.core.util.ObjectUtil;
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.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException;
......@@ -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.order.LiteOrderCache;
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.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.OrderMapper;
import com.neotel.smfcore.core.order.rest.bean.query.OrderQueryCondition;
......@@ -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.security.annotation.AnonymousAccess;
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.IUserManager;
import com.neotel.smfcore.security.service.po.Group;
......@@ -51,23 +51,16 @@ 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.http.HttpStatus;
import org.springframework.http.ResponseEntity;
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.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
......@@ -144,7 +137,7 @@ public class OrderController {
}
File folder = new File(properties.getPath(), "pos");
File localFile = FileUtil.upload(orderFile, folder.getAbsolutePath());
boolean result = orderFileWatch.handleOrderFile(localFile);
boolean result = orderFileWatch.handleOrderFile(localFile, LITEORDER_STYPE.MANUAL);
if (result) {
return ResultBean.newOkResult("smfcore.order.uploadOK", "工单上传成功");
} else {
......@@ -258,6 +251,14 @@ public class OrderController {
query.addCriteria(Criteria.where("status").is(LITEORDER_STATUS.CLOSED));
} else if (criteria.getStatus() == 2) {
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);
......@@ -769,4 +770,32 @@ public class OrderController {
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;
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 lombok.Getter;
import lombok.Setter;
......@@ -69,6 +69,8 @@ public class OrderDto implements Serializable {
@ApiModelProperty("工单来源")
private String source = "";
@ApiModelProperty("工单来源类型,0=手动创建,1=共享文件夹,2=系统对接")
private int sourceType = LITEORDER_STYPE.MANUAL;
@ApiModelProperty("任务完成时间(用于关闭页面显示)")
@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;
import com.neotel.smfcore.common.annotation.QueryCondition;
import com.neotel.smfcore.common.bean.BetweenData;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import java.util.List;
......@@ -11,10 +12,14 @@ import java.util.List;
@Data
public class OrderQueryCondition {
@QueryCondition(blurry = "orderNo")
@QueryCondition(blurry = "orderNo,so,soId,source,line")
private String blurry;
@QueryCondition(blurry = "orderNo")
private String orderNo = "";
@QueryCondition(type = QueryCondition.Type.BETWEEN)
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private BetweenData<Date> createDate;
@QueryCondition(type = QueryCondition.Type.IN, propName = "source")
......@@ -22,8 +27,12 @@ public class OrderQueryCondition {
@QueryCondition(type = QueryCondition.Type.NIN, propName = "source")
private List<String> excludeSourceList;
//状态,0=所有,1=已关闭,2=未关闭
//状态,0=所有,1=已关闭,2=未关闭,3=进行中,4=等待中
private Integer status;
@QueryCondition(blurry = "line")
private String line;
//
// @QueryCondition(type=QueryCondition.Type.IN,propName = "status")
// private List<Integer> statusList ;
......
......@@ -2,5 +2,8 @@ package com.neotel.smfcore.core.order.service.dao;
import com.neotel.smfcore.common.base.IBaseDao;
import java.util.List;
public interface ILiteOrderDao extends IBaseDao {
List<String> findAllLines();
}
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.core.order.service.dao.ILiteOrderDao;
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 java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@Service
public class LiteOrderDaoImpl extends AbstractBaseDao implements ILiteOrderDao {
@Override
public Class getEntityClass() {
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;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import org.springframework.data.mongodb.core.query.Query;
import java.util.List;
......@@ -12,9 +13,13 @@ public interface ILiteOrderManager extends IBaseManager<LiteOrder> {
int countByCondition(String field, String value);
int countByQuery(Query query);
LiteOrder createWithItems(LiteOrder liteOrder) throws ValidateException;
List<LiteOrder> findUnEndOrdersList();
LiteOrder findBySource(String source);
List<String> findAllLines();
}
......@@ -51,6 +51,13 @@ public class LiteOrderManagerImpl implements ILiteOrderManager {
}
@Override
public int countByQuery(Query query) {
if(query==null){
return (int)liteOrderDao.count();
}
return liteOrderDao.countByQuery(query);
}
@Override
public LiteOrder get(String id) {
LiteOrder order= liteOrderDao.findOneById(id);
if(order!=null&& order.getOrderItems()==null){
......@@ -111,6 +118,11 @@ public class LiteOrderManagerImpl implements ILiteOrderManager {
}
@Override
public List<String> findAllLines() {
return liteOrderDao.findAllLines();
}
@Override
public PageData<LiteOrder> findByPage(Query query, Pageable pageable) {
int totalCount = liteOrderDao.countByQuery(query);
List<LiteOrder> list = liteOrderDao.findByQuery(query, pageable);
......
package com.neotel.smfcore.core.order.service.po;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil;
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_STYPE;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import lombok.Data;
import org.springframework.data.annotation.Transient;
......@@ -66,6 +66,11 @@ public class LiteOrder extends BasePo implements Serializable {
private boolean closed = false;
/**
* 工单来源类型,0=手动创建,1=共享文件夹,2=系统对接
*/
private int sourceType = LITEORDER_STYPE.MANUAL;
/**
* 工单来源
......@@ -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
......
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.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.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 org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.activation.MimeType;
import java.io.File;
import java.io.FileFilter;
import java.nio.file.Files;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
......@@ -88,7 +78,7 @@ public class OrderFileWatch {
}
};
for (File file : orderFolder.listFiles(fileFilter)) {
boolean handled = handleOrderFile(file);
boolean handled = handleOrderFile(file, LITEORDER_STYPE.SHAREDFOLDER);
String backupFileName = file.getName() +"_" + System.currentTimeMillis();
File resultFile = null;
......@@ -114,11 +104,11 @@ public class OrderFileWatch {
* @param orderFile
* @return
*/
public boolean handleOrderFile(File orderFile){
public boolean handleOrderFile(File orderFile,int sourceType){
log.info("开始处理Order文件:" + orderFile.getAbsolutePath());
for (IOrderFileListener orderFileListener : orderFileListenerList) {
boolean result = orderFileListener.handleOrderFile(orderFile);
boolean result = orderFileListener.handleOrderFile(orderFile,sourceType);
if(result){
return true;
}
......
......@@ -136,6 +136,11 @@ public class SpSolderController {
SpSettingsDto dto = mapper.toDto(spSettings);
dto.setMinTemperature(msdSettiings.getMinTemperature());
dto.setMaxTemperature(msdSettiings.getMaxTemperature());
Boolean autoStartMixed=dataCache.getCache(Constants.CACHE_SP_AUTO_START_MIXED);
if(autoStartMixed==null){
autoStartMixed=false;
}
dto.setAutoStartMixed(autoStartMixed);
return dto;
}
......@@ -161,6 +166,10 @@ public class SpSolderController {
msdSettiings.setMaxTemperature(dto.getMaxTemperature());
dataCache.updateCache(Constants.CACHE_msdSetting, msdSettiings);
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("保存成功");
}
......
......@@ -24,4 +24,7 @@ public class SpSettingsDto {
@ApiModelProperty("最高温度")
private float maxTemperature = 38.0F;
@ApiModelProperty("回温完成自动开始搅拌")
private boolean autoStartMixed=false;
}
......@@ -2,6 +2,7 @@ package com.neotel.smfcore.core.solder.util;
import com.google.common.base.Strings;
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.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
......@@ -141,10 +142,24 @@ public class SolderBoxCache {
log.info(barcode.getBarcode() + "到达回温时间,搅拌时间为0,修改状态为待出库");
barcode.setSolderStatus(SOLDER_STATUS.TO_BE_OUT.name());
}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() + "到达回温时间,修改状态为等待搅拌,待手动开始搅拌后再开始搅拌");
barcode.setSolderStatus(SOLDER_STATUS.WAIT_MIXED.name());
}
}
barcode = barcodeManager.save(barcode);
storagePos.setBarcode(barcode);
storagePosManager.save(storagePos);
......
package com.neotel.smfcore.core.storage.rest;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.neotel.smfcore.common.bean.PageData;
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.utils.*;
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.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.language.util.MessageUtils;
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.mapstruct.InventoryItemMapper;
import com.neotel.smfcore.core.storage.rest.mapstruct.StoragePosMapper;
......@@ -77,6 +82,9 @@ public class MaterialController {
@Autowired
private final IGroupManager groupManager;
@Autowired
private CodeResolve codeResolve;
@ApiOperation("导出库存列表")
@GetMapping(value = "/inventory/download")
@PreAuthorize("@el.check('tacticsOuput')")
......@@ -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 {
*/
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 {
break;
}
}
Boolean closeWorkOrder = dataCache.getCache(Constants.CACHE_closeWorkOrder);
if(closeWorkOrder!=null){
orderSetting.setCloseWorkOrder(closeWorkOrder);
}
return orderSetting;
}
......@@ -208,6 +212,7 @@ public class SettingsController {
}
dataCache.updateCache(Constants.CACHE_OrderSetting, orderSetting);
dataCache.updateCache(Constants.CACHE_closeWorkOrder,orderSetting.isCloseWorkOrder());
log.info("更改工单设置:"+Constants.CACHE_OrderSetting+"=" + orderSetting.toString());
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 {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.HOUR_OF_DAY,-48);
c.and("updateDate").gte(calendar.getTime());
c.and("closed").is(false);
Query query = Query.query(c);
List<DataLog> unFinishedTasks = findByQuery(query);
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>
private String line = "";
//是否关闭
private boolean closed = false;
public String getBarcode() {
if(barcode == null){
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;
import com.google.common.collect.Lists;
import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.core.barcode.bean.BarcodeRuleDetail;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Data
public class Settings extends BasePo implements Serializable {
......@@ -181,4 +184,9 @@ public class Settings extends BasePo implements Serializable {
private String notIntoCids = "";
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 {
@Autowired
protected SelfAuditUtil selfAuditUtil;
@Autowired
private MaterialTraceUtil materialTraceUtil;
@Autowired
private SmfApi smfApi;
......@@ -165,6 +169,7 @@ public class TaskService {
liteOrderCache.onTaskStatusChange(task);
smfApi.onTaskStatusChange(task);
selfAuditUtil.onTaskStatusChange(task);
materialTraceUtil.onTaskStatusChange(task);
}
/**
......
......@@ -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.listener.BaseSmfApiListener;
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.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
......@@ -370,6 +371,7 @@ public class AdvantechApi extends BaseSmfApiListener {
liteOrder.setSoId(wip_no);
liteOrder.setLine(line_desc);
liteOrder.setSource(line_id);
liteOrder.setSourceType(LITEORDER_STYPE.API);
liteOrder.setSo(model_no);
}
......
......@@ -22,8 +22,9 @@ public class FujiMenu {
String menuLabel = "fuji";
Menu nexim = Menu.CreatePMenu("Nexim", 3, "nexim", "nexim", null);
MenuInit.addMenu(menuLabel,nexim,3, "Nexim 工单","neximWorkOrder", "neolight/neximWorkOrder/index","neximWorkOrder");
// Menu nexim = Menu.CreatePMenu("Nexim", 3, "nexim", "nexim", null);
Menu poutOut = Menu.CreatePMenu("物料管理", 3, "order", "workOrder", null);
MenuInit.addMenu(menuLabel,poutOut,3, "Nexim 工单","neximWorkOrder", "neolight/neximWorkOrder/index","neximWorkOrder");
String apiName = smfApi.getApiName();
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;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.custom.fuji.FujiApi;
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.order.service.JobService;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
......@@ -21,6 +22,8 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
......@@ -71,7 +74,19 @@ public class FujiController {
if (config == null) {
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注册")
......@@ -97,7 +112,7 @@ public class FujiController {
@ApiOperation("job出库")
@RequestMapping("/jobCheckOut")
@AnonymousAccess
//@AnonymousAccess
public synchronized ResultBean jobCheckOut(String orderNo) {
LiteOrder liteOrder = liteOrderCache.getLiteOrder(orderNo);
if (liteOrder == null){
......@@ -117,7 +132,7 @@ public class FujiController {
@ApiOperation("获取需要出库/正在执行中的job任务")
@RequestMapping("/jobInfo")
@AnonymousAccess
//@AnonymousAccess
public ResultBean getJobInfo() {
List<Map<String, Object>> resultList = new ArrayList<>();
Collection<LiteOrder> allLiteOrder = liteOrderCache.getAllLiteOrder();
......@@ -172,4 +187,41 @@ public class FujiController {
}
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;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.LiteOrderCache;
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.ILiteOrderManager;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
......@@ -192,6 +193,7 @@ public class JobService {
//设置工单名和额外字段
liteOrder.setOrderNo(jobName + "_" + fileName);
liteOrder.setSource("nexim");
liteOrder.setSourceType(LITEORDER_STYPE.API);
liteOrder.addAppendDate("jobState", jobState);
liteOrder.addAppendDate("jobName", jobName);
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 {
protected IHamanBinPosDao hamanBinPosDao;
@Override
public boolean handleOrderFile(File orderFile) {
public boolean handleOrderFile(File orderFile,int sourceType) {
String fileName = orderFile.getName();
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;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.List;
......@@ -45,15 +42,16 @@ public class HanwhaController {
@ApiOperation("更新最大工单数")
@GetMapping("/UpdateOrderMode")
@PostMapping("/UpdateOrderMode")
@AnonymousAccess
public ResultBean UpdateOrderMode(@RequestParam Integer maxOrderCount) {
if(ObjectUtil.isEmpty(maxOrderCount)){
return ResultBean.newErrorResult(-1,"Error","Error");
}
liteOrderCache.MaxOrderCount=maxOrderCount;
log.info("UpdateOrderMode 设置 liteOrderCache.MaxOrderCount="+liteOrderCache.MaxOrderCount);
return ResultBean.newOkResult(maxOrderCount);
// if(ObjectUtil.isEmpty(maxOrderCount)){
// return ResultBean.newErrorResult(-1,"Error","Error");
// }
// liteOrderCache.MaxOrderCount=maxOrderCount;
// log.info("UpdateOrderMode 设置 liteOrderCache.MaxOrderCount="+liteOrderCache.MaxOrderCount);
// return ResultBean.newOkResult(maxOrderCount);
return ResultBean.newOkResult("");
}
}
......@@ -5,15 +5,31 @@ 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.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 lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.net.URI;
import java.util.*;
@Service
@Slf4j
public class TMSApis {
@Autowired
private IApiInteractionManager apiInteractionManager;
@Autowired
private DataCache dataCache;
/**
* 3.16 RequestGetPartInfo
* Request part information of given ReelCode to TMS (when the Rack needs it).
......@@ -473,10 +489,113 @@ public class TMSApis {
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=["+JsonUtil.toJsonStr(sendData)+"],response=["+responseStr+"]");
log.info("PostJson, url=[" + url + "],send=[" + requestParam + "],response=[" + responseStr + "]");
apiInteractionManager.save(new ApiInteraction(new Date(), url, requestParam, responseStr, ApiInteraction_Status.OK, EquipmentType.T_SOLUTION.name()));
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;
}
}
......@@ -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.Component;
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.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.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
......@@ -57,6 +61,9 @@ public class TMSUtil {
@Autowired
private TMSApis tmsApis;
@Autowired
private EquipConfigUtil equipConfigUtil;
public TMSReserve GetOrderInfo(LiteOrder liteOrder) {
TMSReserve tmsReserve = new TMSReserve();
......@@ -161,6 +168,7 @@ public class TMSUtil {
LiteOrder liteOrder = new LiteOrder(orderNo, items);
liteOrder.setSource(requestCmd);
liteOrder.setSourceType(LITEORDER_STYPE.API);
LiteOrder dbOrder = liteOrderManager.findByOrderNo(liteOrder.getOrderNo());
if (dbOrder != null) {
orderNo = orderNo + "-" + requestID;
......@@ -302,7 +310,14 @@ public class TMSUtil {
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));
List<LiteOrder> orderList = liteOrderManager.findByQuery(query);
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;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
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.service.manager.ILiteOrderManager;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
......@@ -465,6 +466,7 @@ public class HellaServiceHandler extends BaseSmfApiListener implements IoHandler
}
liteOrder = new LiteOrder(workorderNumber,items);
liteOrder.setSource(groupName);
liteOrder.setSourceType(LITEORDER_STYPE.API);
log.info("新增加订单:" + liteOrder.getOrderNo()+",设备组名称["+groupName+"],标签名称["+labelName+"]");
liteOrder = liteOrderManager.createWithItems(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 {
//已经在任务当中,返回对应的信息
if (dataLog.getBarcode().equals(barcode.getBarcode())) {
if (dataLog.isPutInTask()) {
if (cidList.contains(dataLog.getCid())) {
//已有入库任务
errorMsg = "物料[" + dataLog.getBarcode() + "]已有入库任务,需继续执行入库动作";
resultMap.put("pos", dataLog.getPosName());
......@@ -142,6 +143,9 @@ public class KebodaController {
resultMap.put("cid", dataLog.getCid());
return resultMap;
} else {
throw new ValidateException("smfcore.error.barcode.taskNotEnd", "料盘[{0}}]的操作未完成,无法执行入库操作", new String[]{barcode.getBarcode()});
}
} else {
//已有出库任务
errorMsg = "物料[" + dataLog.getBarcode() + "]已有出库任务,需继续执行出库动作";
resultMap.put("result", "98");
......@@ -371,7 +375,9 @@ public class KebodaController {
private StoragePos findBestFixPos(List<Storage> storageList,Barcode barcode, String rfid, String lastPosId){
StoragePos pos = null;
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.getW() == barcode.getPlateSize() && tempPos.getH() == barcode.getHeight()){
//库位尺寸与料盘尺寸完全一致,直接返回
......
......@@ -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.util.DataCache;
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.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
......@@ -130,6 +131,7 @@ public class TianTongController {
LiteOrder liteOrder = new LiteOrder();
liteOrder.setOrderNo(orderNo);
liteOrder.setSource(source);
liteOrder.setSourceType(LITEORDER_STYPE.API);
liteOrder.setSo(so);
liteOrder.setOrderItems(orderItemList);
liteOrder = liteOrderManager.createWithItems(liteOrder);
......
......@@ -105,7 +105,7 @@ public class AuthorizationController {
try {
long seconds = onlineUserService.properties.getTokenValidityInSeconds() / 1000;
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) {
log.error(e.getMessage(),e);
}
......
......@@ -20,6 +20,8 @@ import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.csv.CsvReader;
import com.neotel.smfcore.common.exception.ValidateException;
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.RsaProperties;
import com.neotel.smfcore.security.rest.bean.dto.UserDto;
......@@ -68,6 +70,8 @@ public class UserController {
@Autowired
private final FileProperties properties;
@Autowired
private DataCache dataCache;
@ApiOperation("导出用户数据")
@GetMapping(value = "/download")
......@@ -85,7 +89,17 @@ public class UserController {
Query query = QueryHelp.getQuery(criteria);
PageData<User> userPageData = userManager.findByPage(query, pageable);
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("新增用户")
......
......@@ -78,4 +78,10 @@ public class JwtUserDto implements UserDetails {
public boolean isEnabled() {
return user.getEnabled();
}
public String getImageStr(){ return user.getImageStr();}
}
......@@ -64,5 +64,8 @@ public class OnlineUserDto {
*/
private Date expiresTime;
/**
* 头像
*/
private String imageStr;
}
......@@ -52,5 +52,10 @@ public class UserDto implements Serializable {
@ApiModelProperty("是否已进入调试模式")
private Boolean debugModel=false;
@ApiModelProperty("头像")
private String imageStr;
@ApiModelProperty("语言名称:简体中文,繁体中文 等")
private String lanName;
}
......@@ -100,6 +100,7 @@ public class UserManagerImpl implements IUserManager {
dataUser.setGroups(user.getGroups());
dataUser.setLanguage(user.getLanguage());
dataUser.setPwdResetTime(user.getPwdResetTime());
dataUser.setImageStr(user.getImageStr());
userDao.save(dataUser);
}
}
......@@ -114,6 +115,7 @@ public class UserManagerImpl implements IUserManager {
//只能修改邮箱和语言
dataUser.setEmail(resources.getEmail());
dataUser.setLanguage(resources.getLanguage());
dataUser.setImageStr(resources.getImageStr());
}
userDao.save(dataUser);
......
......@@ -58,6 +58,12 @@ public class User extends BasePo implements Serializable {
private String checkCode;
/**
* 头像
*/
private String imageStr;
public boolean hasGroup(String groupId) {
if (groupId == null || groupId.equals("") || groupId.equals("-1")) {
......
......@@ -76,7 +76,7 @@ smfcore.barcode=\u6761\u7801\u7BA1\u7406
smfcore.log=\u65E5\u5FD7\u7BA1\u7406
smfcore.taskLog=\u7269\u6599\u65E5\u5FD7
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.menuNotExist=\u83DC\u5355{0}\u4E0D\u5B58\u5728
smfcore.noValidStorage=\u6599\u4ED3\u5217\u8868\u4E2D\u672A\u627E\u5230\u53EF\u7528\u7684\u6599\u4ED3
......@@ -403,3 +403,23 @@ smfcore.storagePos.no=\u5426
smfcore.dashBoard=\u4EEA\u8868\u76D8
smfcore.spHumiture=\u6E29\u6E7F\u5EA6
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
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!