Commit fe0b0488 LN

增加与Mes对接代码

1 个父辈 baecefe2
......@@ -225,6 +225,11 @@
<artifactId>httpclient</artifactId>
<version>4.4</version>
</dependency>
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
</dependencies>
......
......@@ -143,4 +143,9 @@ public class Constants {
*/
public static final String CACHE_languageType="CACHE_languageType";
/**
* HIKAPI重发消息key
*/
public static final String CACHE_failedRequestMap = "CACHE_failedRequestMap";
}
......@@ -68,17 +68,19 @@ public class SingleInController {
public List<ShelfPosInfo> codeIn(@RequestParam Map<String,String> paramsMap) {
String code = paramsMap.get("code");
if (ObjectUtils.isEmpty(code)) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"code"});
int width=0;
int height=0;
if (!ObjectUtils.isEmpty(code)) {
// throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"code"});
Barcode barcode = resolveBarcode(code);
width = barcode.getPlateSize();
height = barcode.getHeight();
}
Barcode barcode = resolveBarcode(code);
List<ShelfPosInfo> shelfPosInfos = new ArrayList<>();
int width = barcode.getPlateSize();
int height = barcode.getHeight();
//获取对应尺寸的空位列表
//TODO 增加用户权限判断
String userId = SecurityUtils.getCurrentUserId();
User user = userManager.get(userId);
Set<String> mygroups = user.getGroups();
......@@ -101,8 +103,10 @@ public class SingleInController {
//
for (UsageItem item :
storage.getUsageMap().values()) {
if (item.getH() == height && item.getW() == width) {
if (height == 0 || width == 0) {
posTotalCount += item.getTotalCount();
posUsedCount = item.getUsedCount();
} else if (item.getH() == height && item.getW() == width) {
posTotalCount += item.getTotalCount();
posUsedCount = item.getUsedCount();
}
......@@ -120,10 +124,6 @@ public class SingleInController {
}
}
// List<Storage> storageList = storageManager.findAll();
// for (Storage storage : storageList
// ) {
// }
//根据空位数排序
Collections.sort(shelfPosInfos);
return shelfPosInfos;
......
......@@ -248,9 +248,9 @@ public class LiteOrder extends BasePo implements Serializable {
this.setBaseCode(outInfo.getBaseCode());
this.setLgort(outInfo.getLgort());
this.setWorkLine(outInfo.getWorkLine());
this.setStartDate(outInfo.getStartDate());
this.setStartDate(outInfo.getStartD());
this.setUpdateDate(new Date());
this.setEndDate(outInfo.getEndDate());
this.setEndDate(outInfo.getEndD());
this.setWemng(outInfo.getWemng());
}
......
package com.neotel.smfcore.hikvision;
import com.neotel.smfcore.common.exception.ApiException;
import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.hikvision.bean.api.HikApiRequest;
import com.neotel.smfcore.hikvision.bean.api.ResponseParam;
import com.neotel.smfcore.hikvision.util.HttpHelper;
import com.neotel.smfcore.hikvision.util.JsonUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
@Repository
public class HikApiCache {
@Autowired
private static DataCache dataCache;
/**
* 需要重发的指令列表
*/
private static Map<String, HikApiRequest> failedRequestMap;
private static boolean isProcessTimer = false;
/**
* 定时器,每10秒执行一次
*/
public static void runTimer() {
if (!isProcessTimer) {
isProcessTimer = true;
try {
sendFailedRequest();
} catch (Exception e) {
log.error("发送失败请求定时器执行出错:" + e.getMessage());
} finally {
isProcessTimer = false;
}
}
}
public static void addFailedRequest(HikApiRequest apiRequest) {
String mapKey = apiRequest.getParam().getReqCode();
if (failedRequestMap.get(mapKey) == null) {
log.info(mapKey + "通知指令发送到Hik失败,加入到缓存");
failedRequestMap.put(apiRequest.getParam().getReqCode(), apiRequest);
dataCache.updateCache(Constants.CACHE_failedRequestMap, failedRequestMap);
}
}
public static void removeFailedRequest(HikApiRequest apiRequest) {
String mapKey = apiRequest.getParam().getReqCode();
if (failedRequestMap.get(mapKey) != null) {
log.info(mapKey + "通知指令发送到Hik成功,从缓存中移除");
failedRequestMap.remove(apiRequest.getParam().getReqCode());
dataCache.updateCache(Constants.CACHE_failedRequestMap, failedRequestMap);
}
}
/**
* 加载请求指令信息
*/
private static void initApiRequestMap() {
if (failedRequestMap == null) {
failedRequestMap = new ConcurrentHashMap<>();
Map<String, HikApiRequest> dbFailedRequestMap = dataCache.getCache(Constants.CACHE_failedRequestMap);
if (dbFailedRequestMap != null) {
failedRequestMap.putAll(dbFailedRequestMap);
log.info("当前发送通知失败指令:" + failedRequestMap);
}
}
}
/**
* 获取失败列表,进行定时发送
*/
private static void sendFailedRequest() throws ApiException {
List<HikApiRequest> failedList = new ArrayList<>();
failedList.addAll(failedRequestMap.values());
failedList.sort(new Comparator<HikApiRequest>() {
@Override
public int compare(HikApiRequest o1, HikApiRequest o2) {
return o1.getCreateTime().compareTo(o2.getCreateTime());
}
});
for (HikApiRequest apiRequest : failedList) {
ResponseParam responseParam = HttpHelper.postJson(apiRequest.getUrl(), apiRequest.getParam());
boolean needResend = false;
if (responseParam == null || responseParam.getCode().equals(-1)) {
needResend = true;
log.info("Hik 转储单接口 (transferOrderThread): 未收到返回值,需要重发");
} else if (responseParam.getCode().equals(HikApi.CODE_PARAMERROR) || responseParam.getCode().equals(HikApi.CODE_REPEAT)) {
needResend = true;
log.info("Hik 转储单接口 (transferOrderThread): 返回code=" + responseParam.getCode() + ",需要重发," + JsonUtil.toJsonStr(responseParam));
} else {
log.info("Hik 转储单接口 (transferOrderThread): 返回" + JsonUtil.toJsonStr(responseParam));
// Map<String, Object> result = JsonUtil.toMap(responseParam.getData());
// return result;
}
}
}
}
package com.neotel.smfcore.hikvision.bean;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.unit.DataUnit;
import java.io.Serializable;
import java.util.Date;
@Slf4j
@Getter
@Setter
public class HikOutInfo implements Serializable {
/**
* jobNo String true 工单号/合单号[合并唯一]
*/
private String jobNo;
protected String jobNo;
/**
*replenishmentNo String false 补料单号,如果有值表示此单为补料单[合并唯一]
*/
private String replenishmentNo;
protected String replenishmentNo;
/**
*baseCode String true 基地编号
*/
private String baseCode;
protected String baseCode;
/**
*lgort String true 库位
*/
private String lgort;
protected String lgort;
/**
*workLine String true 产线
*/
private String workLine;
protected String workLine;
/**
*startDate String true 开工时间
* "startDate": "2022-03-01 08:00:00",
*/
private Date startDate;
protected String startDate;
/**
*endDate String true 完工时间
* "endDate": "2022-03-01 22:00:00",
*/
private Date endDate;
protected String endDate;
/**
* materialNo String true 物料号[详情]
*/
private String materialNo;
protected String materialNo;
/**
* station String true 站位号
*/
private String station;
protected String station;
/**
*qty Integer true 需求数量
*/
private Integer qty;
protected Integer qty;
/**
*overFlag Integer true 超发标识[贵重物料](1是不允许超发,0是允许超发)
*/
private Integer overFlag;
protected Integer overFlag;
/**
*increment Integer true 发料增量
*/
private Integer increment;
protected Integer increment;
/**
*wemng Integer true 排程数量
*/
private Integer wemng;
protected Integer wemng;
/**
*reason String false 移动原因
*/
private String reason;
protected String reason;
public LiteOrderItem crateOrderItem(String orderNo) {
LiteOrderItem item = new LiteOrderItem();
......@@ -87,4 +93,24 @@ public class HikOutInfo implements Serializable {
return item;
}
public Date getStartD(){
// "startDate": "2022-03-01 08:00:00",
Date sDate=null;
try {
sDate= DateUtil.toDate(startDate,"yyyy-MM-dd HH:mm:ss");
}catch (Exception ex){
log.error("HitOutInfo getStartD ["+startDate+"] 出错:"+ex.toString());
}
return sDate;
}
public Date getEndD(){
Date sDate=null;
try {
sDate= DateUtil.toDate(endDate,"yyyy-MM-dd HH:mm:ss");
}catch (Exception ex){
log.error("HitOutInfo getStartD ["+endDate+"] 出错:"+ex.toString());
}
return sDate;
}
}
package com.neotel.smfcore.hikvision.bean;
import com.sun.corba.se.impl.resolver.SplitLocalResolverImpl;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 7.5入库上架过账接口
* 7.6出库下架过账接口
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class InOutApiInfo {
// warehousingType Integer 是 入库类型(0普通入库1退料入库2并盘入库3截料入库)
// trayId String 41 是 料盘ID/唯一码
// qty Integer 是 数量
// baseCode String 16 是 基地
// lgort String 16 是 库位
// warehousingType Integer 是 出库类型(0普通出库1并盘出库 2湿敏出库)
// trayId String 41 是 料盘ID/唯一码
// qty Integer 是 数量
// baseCode String 16 是 基地
// lgort String 16 是 库位
/**
* 入库类型(0普通入库1退料入库2并盘入库3截料入库)
*/
private Integer inType;
/**
* 出库类型(0普通出库1并盘出库 2湿敏出库)
*/
private Integer outType;
/**
* 料盘ID/唯一码
*/
private String trayId;
/**
* 数量
*/
private Integer qty;
/**
* 基地
*/
private String baseCode;
/**
* 库位
*/
private String lgort;
}
package com.neotel.smfcore.hikvision.bean;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.Date;
@Getter
@Setter
public class OrderItemInfo extends HikOutInfo {
// jobNo String 16 工单号/合单号
// station String 32 站位号
// baseCode String 16 基地编号
// lgort String 16 库位
// workLine String 16 产线
// startDate String 19 开工时间
// endDate String 19 完工时间
// materialNo String 9 物料号
// qty Integer 需求数量
// overFlag Integer 超发标识(1是不允许超发,0是允许超发)
// prepareIncrement Integer 发料增量
// wemng Integer 排程数量
/**
*increment Integer true 发料增量
*/
private Integer prepareIncrement;
public Integer getIncrement(){
if(getIncrement()<=0&&prepareIncrement>=0){
return prepareIncrement;
}
return increment;
}
}
package com.neotel.smfcore.hikvision.bean;
import io.swagger.models.auth.In;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 7.3排程发料过账接口 参数
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ScheduleTaskInfo {
// jobNo String 32 是 工单号/合单号
// replenishmentNo String 32 否 补料单号(补料单业务补料单为必填项)
// station String 40 是 站位号
// factoryCode String 8 是 工厂
// lgort  String 8 是 库位
// qty Integer 数量
// interceptFlag Integer 截料标识(0为不截料,1为截料)
// interceptQty Integer 截料数量
// trayId String 41 是 料盘ID
/**
* 工单号/合单号
*/
private String jobNo;
/**
*补料单号(补料单业务补料单为必填项)
*/
private String replenishmentNo;
/**
*站位号
*/
private String station;
/**
*工厂
*/
private String factoryCode;
/**
*库位
*/
private String lgort;
/**
*数量
*/
private Integer qty;
/**
*截料标识(0为不截料,1为截料)
*/
private Integer interceptFlag;
/**
*截料数量
*/
private Integer interceptQty;
/**
*料盘ID
*/
private String trayId;
}
package com.neotel.smfcore.hikvision.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 转储单入库信息 ,7.2 转储单入库过账接口
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TransferOrderInInfo {
// docNo String 16 是 单据号
// docType Integer 是 单据类型(0物料凭证,1交货单,2预留单、3AGV任务单)
// trayId String 41 唯一码
// baseCode String 16 基地编号
// lgort String 16 库位
// qty Integer 数量
/**
* 单据号
*/
private String docNo;
/**
*单据类型(0物料凭证,1交货单,2预留单、3AGV任务单)
*/
private Integer docType;
/**
* 唯一码
*/
private String trayId;
/**
* 基地编号
*/
private String baseCode;
/**
* 库位
*/
private String lgort;
/**
* 数量
*/
private String qty;
}
package com.neotel.smfcore.hikvision.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 转储单 ,7.1 转储单接口
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TransferOrderInfo {
// docNo String 32 单据号
// outLgort String 16 转出库位
// inLgort String 16 转入库位
// materialNo String 16 物料号
// baseCode String 16 基地编号
// dumpQty Integer 转出数量
/**
* 单据号
*/
private String docNo;
/**
* 单据类型(0物料凭证,1交货单,2预留单、3AGV任务单)
*/
private Integer docType=0;
/**
* 转出库位
*/
private String outLgort;
/**
* 转入库位
*/
private String inLgort;
/**
* 物料号
*/
private String materialNo;
/**
*基地编号
*/
private String baseCode;
/**
*转出数量
*/
private String dumpQty;
}
package com.neotel.smfcore.hikvision.bean.api;
import com.neotel.smfcore.hikvision.bean.api.RequestParam;
import lombok.*;
import java.io.Serializable;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class HikApiRequest implements Serializable {
/**
* 消息类型
*/
private int apiType=0;
/**
* url
*/
private String url="";
/**
* 消息创建时间
*/
private Date createTime;
/**
* 参数信息
*/
private RequestParam param;
}
package com.neotel.smfcore.hikvision.bean.api;
import lombok.*;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class RequestParam {
/**
* reqCode 是 String 请求唯一标识
*/
private String reqCode;
/**
*userCode String 32 是 操作人
*/
private String userCode;
/**
* data 否 Json 视具体业务而定
*/
private String data;
}
package com.neotel.smfcore.hikvision.bean.api;
import lombok.*;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResponseParam implements Serializable {
/**
* reqCode 是 String 唯一请求号,与传入的参数reqCode保持一致
*/
private String reqCode;
/**
* code 是 String 结果码:0-成功,1~N-失败
*/
private String code;
/**
* message 是 String 0:成功 1~N:失败原因
*/
private String message;
/**
*data 选填 Json 返回的数据结构
*/
private String data;
}
package com.neotel.smfcore.hikvision.util;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
public class JsonUtil {
// 定义jackson对象
private static final ObjectMapper MAPPER = new ObjectMapper();
static{
MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
/**
* 将对象转换成json字符串。
* <p>Title: pojoToJson</p>
* <p>Description: </p>
* @param data
* @return
*/
public static String toJsonStr(Object data) {
try {
String string = MAPPER.writeValueAsString(data);
return string;
} catch (Exception e) {
log.info("转换JSON字符串出错:",e);
}
return null;
}
/**
* 将json结果集转化为对象
*
* @param jsonStr json数据
* @param beanType 对象中的object类型
* @return
*/
public static <T> T toObj(String jsonStr, Class<T> beanType) {
try {
T t = MAPPER.readValue(jsonStr, beanType);
return t;
} catch (Exception e) {
log.info(jsonStr + "转换对象出错:",e);
}
return null;
}
/**
* 将json数据转换成对象list
* <p>Title: jsonToList</p>
* <p>Description: </p>
* @param jsonStr
* @param beanType
* @return
*/
public static <T> List<T> toList(String jsonStr, Class<T> beanType) {
JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);
try {
List<T> list = MAPPER.readValue(jsonStr, javaType);
return list;
} catch (Exception e) {
log.info(jsonStr + "转换List出错:",e);
}
return new ArrayList<>();
}
public static Map<String, Object> toMap(String jsonStr){
//JavaType javaType = MAPPER.getTypeFactory().constructParametricType(HashMap.class, String.class, String.class);
try {
//Map<String, String> map = MAPPER.readValue(jsonStr, javaType);
Map<String, Object> map = MAPPER.readValue(jsonStr, Map.class);
return map;
} catch (Exception e) {
log.info(jsonStr + "转换Map出错:",e);
}
return new HashMap<>();
}
public static void main(String args[]) throws Exception{
String jsonStr = "[{\n" +
" \"action\": \"补料\",\n" +
" \"hSerial\": \"82\",\n" +
" \"so\": \"879235\",\n" +
"\"refno\": \"F001_879235N_1\",\n" +
"\"partNum\": \"7H.47134.1F1\",\n" +
" \"slot\": \"1-11\",\n" +
"\"qty\": \"2006\",\n" +
"\"facility\": \"SU\",\n" +
"\"sdte\": \"20191118\",\n" +
"\"stme\": \"85957\",\n" +
"\"reelcut\": \"N\",\n" +
"\"mdte\": \"20191115\",\n" +
"\"mtme\": \"172238\"\n" +
"},\n{\n" +
" \"action\": \"补料\",\n" +
" \"hSerial\": \"82\",\n" +
" \"so\": \"879235\",\n" +
"\"refno\": \"F001_879235N_1\",\n" +
"\"partNum\": \"7H.47134.1F1\",\n" +
" \"slot\": \"1-11\",\n" +
"\"qty\": \"2006\",\n" +
"\"facility\": \"SU\",\n" +
"\"sdte\": \"20191118\",\n" +
"\"stme\": \"85957\",\n" +
"\"reelcut\": \"N\",\n" +
"\"mdte\": \"20191115\",\n" +
"\"mtme\": \"172238\"\n" +
"}\n]";
// List<RequestOutItemBean> items = JsonUtil.toList(jsonStr, RequestOutItemBean.class);
// for (RequestOutItemBean item : items) {
// System.out.println(item);
// }
// System.out.println(DateUtil.toDateString(new Date(),"yyyyMMddHHmmssS"));
// System.out.println(DateUtil.toDateString(new Date(),"yyyyMMddHHmmssS"));
// System.out.println(DateUtil.toDateString(new Date(),"yyyyMMddHHmmssS"));
// System.out.println(DateUtil.toDateString(new Date(),"yyyyMMddHHmmssS"));
//
// System.out.println(System.nanoTime());
// System.out.println(System.nanoTime());
// System.out.println(System.currentTimeMillis());
// System.out.println(System.currentTimeMillis());
jsonStr = "{\"state\":\"0\",\"msg\":\"鏂欏嵎浣嶆暟涓嶅尮閰??\",\"info\":{\"so\":\"\",\"facility\":\"12334\",\"company\":\"\",\"qty\":\"\",\"soseq\":\"\"}}";
jsonStr = "{\"data\":[{\"Serial\":\"58890\",\"VehicleID\":\"D15\",\"Status\":\"\"},{\"Serial\":\"58890\",\"VehicleID\":\"D44\",\"Status\":\"\"},{\"Serial\":\"58890\",\"VehicleID\":\"D83\",\"Status\":\"\"},{\"Serial\":\"58890\",\"VehicleID\":\"D90\",\"Status\":\"\"},{\"Serial\":\"58890\",\"VehicleID\":\"D98\",\"Status\":\"\"}]}";
Map<String, Object> map = JsonUtil.toMap(jsonStr);
Object data = map.get("data");
if(data != null){
List<Object> dataList = (List)data;
for (Object info : dataList) {
Map<String,String> infoMap = (Map)info;
System.out.println(infoMap.get("Serial"));
}
}
}
}
......@@ -4,7 +4,7 @@ spring:
mongodb:
host: localhost # 主机地址
port: 27017 # 端口
database: smf # 数据库
database: hikvision # 数据库
# 登录相关配置
login:
......
server:
port: 8800
hella:
#host: 127.0.0.1
port: 3333
hik:
server:
# 文件存储路径
file:
......@@ -22,7 +20,7 @@ spring:
mongodb:
host: localhost # 主机地址
port: 27017 # 端口
database: smf # 数据库
database: hikvision # 数据库
messages:
encoding: utf-8
main:
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!