Commit b3c77f8b sunke

PanaCIM对接

1 个父辈 befc4c4e
......@@ -186,17 +186,17 @@
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.3.1.Final</version>
<version>1.4.2.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.1.Final</version>
<version>1.4.2.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.4.0.Final</version>
<version>1.4.2.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.mina/mina-core -->
......@@ -220,6 +220,11 @@
<artifactId>core</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.4</version>
</dependency>
</dependencies>
......
package com.neotel.smfcore.common.exception;
/**
* Created by kangmor on 2015/11/12.
*/
public class ApiException extends Exception {
public ApiException(String message){
super(message);
}
}
package com.neotel.smfcore.common.utils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.neotel.smfcore.common.exception.ApiException;
import lombok.val;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.apache.logging.log4j.util.Strings;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.*;
import java.util.Map.Entry;
/**
* HTTP网络请求
*/
public class HttpHelper {
// 编码方式
private static final String CONTENT_CHARSET = "UTF-8";
public static String postJson(String url, Map<String, Object> params) throws ApiException {
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
httpPost.addHeader("Content-Type", "application/json;charset=utf-8");
// 设置请求参数
if (params != null && !params.isEmpty()) {
ObjectMapper mapper = new ObjectMapper();
try {
String requestBody = mapper.writeValueAsString(params);
httpPost.setEntity(new StringEntity(requestBody));
} catch (JsonProcessingException e) {
throw new ApiException("Request params to [" + url + "] failed:" + e.getMessage());
} catch (UnsupportedEncodingException e) {
throw new ApiException("Request params to [" + url + "] failed:" + e.getMessage());
}
}
try{
CloseableHttpResponse response = httpClient.execute(httpPost);
//System.out.println(response.getStatusLine().getStatusCode() + "\n");
HttpEntity entity = response.getEntity();
String responseContent = EntityUtils.toString(entity, CONTENT_CHARSET);
response.close();
httpClient.close();
return responseContent;
}catch (Exception e){
throw new ApiException("Request to [" + url + "] failed:" + e.getMessage());
}
}
}
//package com.neotel.smfcore.panacim;
//
//import com.fasterxml.jackson.databind.ObjectMapper;
//import com.google.common.base.Strings;
//import com.google.common.collect.Lists;
//import com.google.common.collect.Maps;
//import com.myproject.bean.json.PanaMaterial;
//import com.myproject.bean.update.*;
//import com.myproject.dao.mongo.IDataLogDao;
//import com.myproject.manager.IStoragePosManager;
//import com.myproject.util.HttpHelper;
//import com.myproject.util.StorageConstants;
//import com.myproject.webapp.controller.storage.BaseController;
//import com.neotel.smfcore.common.exception.ValidateException;
//import com.neotel.smfcore.core.barcode.service.po.Barcode;
//import com.neotel.smfcore.core.device.api.IOpAuthApi;
//import com.neotel.smfcore.core.system.listener.ITaskListener;
//import com.neotel.smfcore.core.system.service.po.DataLog;
//import org.apache.commons.lang.StringUtils;
//import org.apache.logging.log4j.LogManager;
//import org.apache.logging.log4j.Logger;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Controller;
//import org.springframework.web.bind.annotation.RequestBody;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.ResponseBody;
//
//import javax.servlet.http.HttpServletRequest;
//import java.text.SimpleDateFormat;
//import java.util.*;
//import java.util.concurrent.atomic.AtomicLong;
//
//
//@Controller
//@RequestMapping("/rest/api")
//public class PanaApiController implements IOpAuthApi, ITaskListener{
//
// @Autowired
// protected ITaskService taskService;
// @Autowired
// protected IStoragePosManager storagePosManager;
//
// protected static DataCache dataCache;
//
// @Autowired
// public void setDataCache(DataCache dataCache) {
// PanaApiController.dataCache = dataCache;
// }
//
// @Autowired
// protected IDataLogDao dataLogDao;
//
// protected final static Logger log = LogManager.getLogger(PanaApiController.class);
//
// private static String PanaCIMIP = "";
//
// private static String PanaCIMPort = "";
//
// private static String TowerID = "InoAutoB";
// private static AtomicLong seq = new AtomicLong(0);
//
// @RequestMapping(value = "/setConfiguration")
// @ResponseBody
// public String setConfiguration(@RequestBody Map<String,String> map) {
// String ip = map.get("PanaCIMIP");
// String port = map.get("PanaCIMPort");
//
// log.info("收到 PanaCIM 的注册信息【"+ip+":"+port+"】");
// if(Strings.isNullOrEmpty(ip)){
// return "ERROR:IP is empty.";
// }
//
// if(Strings.isNullOrEmpty(port)){
// return "ERROR: port is empty";
// }
// PanaCIMIP = ip;
// PanaCIMPort = port;
//
// return "OK";
// }
//
//
// private static String getInNotifyApi(){
// if(!Strings.isNullOrEmpty(PanaCIMIP)){
// return "http://"+PanaCIMIP + ":" + PanaCIMPort + "/api/Storage/checkInNotification";
// }
// return "";
// }
//
// private static String getOutNotifyApi(){
//
// if(!Strings.isNullOrEmpty(PanaCIMIP)){
// return "http://"+PanaCIMIP + ":" + PanaCIMPort + "/api/Storage/deliverNotification";
// }
// return "";
// }
//
// private static String getRequestReelUrl(){
// if(!Strings.isNullOrEmpty(PanaCIMIP)){
// return "http://"+PanaCIMIP + ":" + PanaCIMPort + "/api/Storage/requestReel";
// }
// return "";
// }
//
//
// @RequestMapping(value = "/keepAlive")
// @ResponseBody
// public String keepAlive(HttpServletRequest request) {
// return "OK";
// }
//
// //private static String getApiUrl(String apiPath){
// // return "http://"+PanaCIMIP + ":" + PanaCIMPort + apiPath;
// //}
//
// private static String nextSeq(){
// return "SMDBOX_"+TowerID+"_"+seq.incrementAndGet();
// }
//
//
//
// public static boolean checkInNotification(Barcode barcode) {
// String inNotifyApi = getInNotifyApi();
// try {
// if(Strings.isNullOrEmpty(inNotifyApi)){
// inNotifyApi = getInNotifyApi();
// log.info("没有配置API,查找setConfiguration注册的IP 及端口");
// }
// if(!Strings.isNullOrEmpty(inNotifyApi)){
// log.info("向 PanaCIM["+inNotifyApi+"] 通知料盘【"+barcode.getBarcode()+"】的入库信息");
// //String url = getApiUrl("/api/Storage/checkInNotification");
// Map<String, Object> params = new LinkedHashMap<>();
// params.put("TransactionID",nextSeq());
// params.put("ReelBarcode",barcode.getBarcode());
// params.put("PartNo",barcode.getPartNumber());
// params.put("Quantity",barcode.getAmount());
// params.put("Msd",false);
// params.put("MsdLevel","1");
// params.put("Location","0");
// params.put("TowerID",TowerID);
//
// String result = HttpHelper.postJson(inNotifyApi,params);
// log.info("Response Of checkInNotification From PanaCIM:"+result);
// if(!Strings.isNullOrEmpty(result)){
// ObjectMapper mapper = new ObjectMapper();
// HashMap<String,String> jsonMap = mapper.readValue(result, HashMap.class);
// String ErrorCode = jsonMap.get("ErrorCode");
// if("0".equals(ErrorCode)){//成功
// return true;
// }
// }
// }else{
// log.info("没有配置PanaCIM接口,无需通知");
// return true;
// }
//
// } catch (Exception e) {
// log.error("入库通知PanaCIM["+inNotifyApi+"]的料盘"+barcode.getBarcode()+"出错",e);
// }
// return false;
// }
//
// public static boolean deliverNotification(Barcode barcode) {
// String outNotifyApi = getOutNotifyApi();
// try {
// if(Strings.isNullOrEmpty(outNotifyApi)){
// outNotifyApi = getOutNotifyApi();
// log.info("没有配置API,查找setConfiguration注册的IP 及端口");
// }
// if(!Strings.isNullOrEmpty(outNotifyApi)){
// log.info("向 PanaCIM["+outNotifyApi+"] 通知料盘【"+barcode.getBarcode()+"】的出库信息");
// //String url = getApiUrl("/api/Storage/deliverNotification");
// Map<String, Object> params = new HashMap<String, Object>();
// params.put("TransactionID",nextSeq());
// params.put("ReelBarcode",barcode.getBarcode());
// params.put("PartNO",barcode.getPartNumber());
// params.put("Quantity",barcode.getAmount());
// SimpleDateFormat dataformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// params.put("Timestamp",dataformat.format(new Date()));
// params.put("TowerID",TowerID);
// params.put("JobID","");
// params.put("Msd",false);
// params.put("MsdLevel","1");
// params.put("Location","0");
//
// String result = HttpHelper.postJson(outNotifyApi,params);
// log.info("Response Of deliverNotification From PanaCIM:"+result);
// if(!Strings.isNullOrEmpty(result)){
// ObjectMapper mapper = new ObjectMapper();
// HashMap<String,String> jsonMap = mapper.readValue(result, HashMap.class);
// String ErrorCode = jsonMap.get("ErrorCode");
// if("0".equals(ErrorCode)){//成功
// return true;
// }
// }
//
// }else{
// log.info("没有配置PanaCIM接口,无需通知");
// return true;
// }
//
// } catch (Exception e) {
// log.error("出库通知PanaCIM["+outNotifyApi+"]料盘"+barcode.getBarcode()+" 出错",e);
// }
// return false;
// }
//
//
// @RequestMapping(value = "/deliverMaterial")
// @ResponseBody
// public Map<String,Object> deliverMaterial(@RequestBody PanaMaterial panaMaterial) {
// Map<String, Object> result = new HashMap<String, Object>();
// try {
// /*String TransactionID = map.get("TransactionID");
// String TowerID = map.get("TowerID");
//// String Timestamp = request.getParameter("Timestamp");//Date(2009-02-15T00:00:00Z)
// String JobID = map.get("JobID");
// String ReelBarcodes = map.get("ReelBarcodes");//["ABC123","BCD345","LL13212"]*/
// String TransactionID = panaMaterial.getTransactionID();
// String TowerID = panaMaterial.getTowerID();
//// String Timestamp = request.getParameter("Timestamp");//Date(2009-02-15T00:00:00Z)
// String JobID = panaMaterial.getJobID();
// List<String> ReelBarcodes = panaMaterial.getReelBarcodes();//["ABC123","BCD345","LL13212"]
// log.info("收到 PanaCIM 的deliverMaterial 命令:ReelBarcodes="+ StringUtils.join(ReelBarcodes,","));
// //ObjectMapper mapper = new ObjectMapper();
// //ArrayList<String> codes = mapper.readValue(ReelBarcodes, ArrayList.class);
//
// List<String> ReelBarcodesDelivered = Lists.newArrayList();
// List<String> ReelBarcodesNonExisting = Lists.newArrayList();
// for (String barcode : ReelBarcodes){//加入到出库列表
// try{
// StoragePos pos = storagePosManager.getByBarcode(barcode);
// if(pos == null){
// log.info( "二维码["+barcode+"]在仓库中不存在");
// ReelBarcodesNonExisting.add(barcode);
// continue;
// }
// log.info("出库["+barcode+"]位置仓位【"+pos.getPosName()+"】");
// taskService.checkout(pos,false,null,false);
// ReelBarcodesDelivered.add(barcode);
// }catch (Exception e){
// ReelBarcodesNonExisting.add(barcode);
// }
// }
// result.put("TransactionID",TransactionID);
// result.put("ErrorCode","0");
// result.put("JobID",JobID);
// result.put("TowerID",TowerID);
// result.put("ReelBarcodesDelivered",ReelBarcodesDelivered);
// result.put("ReelBarcodesNonExisting", ReelBarcodesNonExisting);
//
// } catch (Exception e) {
// log.error("PanaCIM的指令deliverMaterial出错",e);
// result.put("ErrorCode","100");
// }
// return result;
// }
//
//
//
// @RequestMapping(value = "/getInventory")
// @ResponseBody
// public Map<String,Object> getInventory(@RequestBody Map<String,String> map) {
// Map<String, Object> result = new HashMap<String, Object>();
// try {
// String TransactionID = map.get("TransactionID");
// //String TowerID = map.get("TowerID");
//
// //storagePosManager.getInventory()
//
// log.info("收到 PanaCIM 的getInventory 命令:TransactionID="+TransactionID/**+" TowerID="+TowerID*/);
// /**
// * {
// "ErrorCode":0,
// "ReelBarCodes":
// [{"JobID":"1234","Location":"0","Msd":false,"Msdlevel":"1","PartNo":"part123","Quantity":123,"ReelBarcode":"123456789","TowerID":"InoAuto A"},
// {"JobID":"1234","Location":"0","Msd":false,"Msdlevel":"1","PartNo":"part321","Quantity":321,"ReelBarcode":"123456789","TowerID":"InoAuto B"},
// {"JobID":"1234","Location":"0","Msd":false,"Msdlevel":"1","PartNo":"part213","Quantity":213,"ReelBarcode":"123456789","TowerID":"InoAuto C"}],
// "TransactionID":"testme"
// }
// */
// List ReelBarCodes = Lists.newArrayList();
// Storage storage = dataCache.defaultStorage();
// List<StoragePos> poses = storagePosManager.findNotEmptyByStorageId(storage.getId());
// for (StoragePos pos : poses){
// Barcode barcode = pos.getBarcode();
// Map<String,Object> item = Maps.newHashMap();
// item.put("TowerID",TowerID);
// item.put("JobID",barcode.getLockName());
// item.put("ReelBarcode",barcode.getBarcode());
// item.put("PartNo",barcode.getPartNumber());
// item.put("Quantity",barcode.getAmount());
// item.put("Msd",false);
// item.put("msdlevel","");
// item.put("Location","0");
// ReelBarCodes.add(item);
// }
// result.put("TransactionID",TransactionID);
// result.put("ErrorCode","0");
// result.put("ReelBarCodes",ReelBarCodes);
//
//
// } catch (Exception e) {
// log.error("PanaCIM的指令 getInventory 出错",e);
// result.put("ErrorCode","200");
// }
// return result;
// }
//
// @RequestMapping(value = "/reserveMaterial")
// @ResponseBody
// public Map<String,Object> reserveMaterial(@RequestBody PanaMaterial panaMaterial) {
// /**
// * "TransactionID":"testme",
// "TransactionType":0,
// "JobID":"job123",
// "ReelBarcodesReserved": ["ABC123","BCD345","LL13212"]
// */
// Map<String, Object> result = new HashMap<String, Object>();
// try {
// String TransactionID = panaMaterial.getTransactionID();
// //1=create reservation based on JobID 2=update 3=cancel
// String TransactionType = panaMaterial.getTransactionType();
// String JobID = panaMaterial.getJobID();
// List<String> reelBarcodesReserved = panaMaterial.getReelBarcodesReserved();
// log.info("收到 PanaCIM 的reserveMaterial 指令:TransactionID="+TransactionID+" TransactionType="+TransactionType+" JobID="+JobID+" ReelBarcodesReserved="+StringUtils.join(reelBarcodesReserved,","));
//
// if(reelBarcodesReserved == null){
// log.error("PanaCIM 的指令reserveMaterial 执行时发现reelBarcodesReserved为 NUll,直接返回");
// result.put("ErrorCode","301");
// result.put("ErrorMessage","The field ReelBarcodesReserved is empty");
// }else{
// List<String> ReelBarcodesRejected = Lists.newArrayList();
// //这里使用指定批次的锁定
// if("1".equals(TransactionType) || "2".equals(TransactionType)){//create//update
//
// for (String barcode :reelBarcodesReserved){
// StoragePos pos = storagePosManager.getByBarcode(barcode);
// if(pos == null){
// ReelBarcodesRejected.add(barcode);
// }else{
// pos.getBarcode().setLockId(JobID);
// pos.getBarcode().setLockName(JobID);
// storagePosManager.save(pos);
// }
// }
// }else if("3".equals(TransactionType)){//cancel
// List<StoragePos> lockPoses = storagePosManager.findLockPos(JobID);
// if(lockPoses.isEmpty()){
// result.put("ErrorCode","301");
// result.put("ErrorMessage","JobId 为"+JobID+"的 Job 不存在");
// }else{
// //查找所有的 POS
// for (StoragePos pos : lockPoses){
// pos.getBarcode().setLockId("");
// pos.getBarcode().setLockName("");
// storagePosManager.save(pos);
// }
// }
//
// }
//
// /**
// * "ErrorCode":0,
// "ErrorMessage":null,
// "JobID":"job123",
// "ReelBarcodesRejected":[],
// "TransactionID":"testme"
// */
// result.put("TransactionID",TransactionID);
// result.put("ErrorCode","0");
// result.put("ErrorMessage",null);
// result.put("JobID",JobID);
// result.put("ReelBarcodesRejected",ReelBarcodesRejected);
// }
//
//
// } catch (Exception e) {
// log.error("PanaCIM的指令 reserveMaterial 出错",e);
// result.put("ErrorCode","300");
// result.put("ErrorMessage",e.getMessage());
// }
// return result;
// }
//
//
// @RequestMapping(value = "/deliverJob")
// @ResponseBody
// public Map<String,Object> deliverJob(@RequestBody Map<String,String> map) {
// Map<String, Object> result = new HashMap<String, Object>();
// try {
// String TransactionID = map.get("TransactionID");
// String TowerID = map.get("TowerID");
// String JobID = map.get("JobID");
// String Timestamp = map.get("Timestamp");
// log.info("收到 PanaCIM deliverJob 指令:TransactionID=" + TransactionID + " TowerID=" + TowerID + " JobID=" + JobID + " Timestamp=" + Timestamp);
//
// List<StoragePos> lockPoses = storagePosManager.findLockPos(JobID);
// //if(batch != null){
// //查找所有的 POS
// if(lockPoses.isEmpty()){
// result.put("ErrorCode","401");
// result.put("ErrorMessage","JobID["+JobID+"]未包含物料");
// }else{
// List<DataLog> tasks = Lists.newArrayList();
// for (StoragePos pos :lockPoses){
// //已经加过的就不再加了
// Storage storage = dataCache.getStorageById(pos.getStorageId());
// Barcode barcode = pos.getBarcode();
// String partNumber = barcode.getPartNumber();
// DataLog task = new DataLog();
// task.setType(StorageConstants.OP.CHECKOUT);
// task.setStatus(StorageConstants.OP_STATUS.WAIT.name());
// task.setPartNumber(partNumber);
//
//
// //操作人
// //task.setCreator(loginUser.getUsername());
//
// //来源
// task.setSourceType(StorageConstants.TASK_SOURCE.BATCH.name());
// task.setSourceId(JobID);
// task.setSourceName("PanaCIM");
// task.setSubSourceId("");
// task.setSubSourceInfo("");
//
// task.setBarcode(barcode.getBarcode());
// task.setNum(barcode.getAmount());
//
// task.setCid(storage.getCid());
// task.setStorageId(storage.getId());
// task.setStorageName(storage.getName());
//
// task.setPosId(pos.getId());
// task.setPosName(pos.getPosName());
//
// tasks.add(task);
// }
//
// dataLogDao.insertAll(tasks);
//
// log.info("将"+ JobID + " 添加到出库列表,任务数["+tasks.size()+"]");
// List<String> ReelBarcodesFailed = Lists.newArrayList();
// result.put("TransactionID",TransactionID);
// result.put("ErrorCode","0");
// result.put("JobID",JobID);
// result.put("TowerID",TowerID);
// result.put("ReelBarcodesFailed",ReelBarcodesFailed);
// }
//
//// }else{
//// result.put("ErrorCode", "402");
//// result.put("ErrorMessage", "操作失败ID为["+JobID+"]的指定批次不存在");
//// }
//
// } catch (Exception e) {
// log.error("PanaCIM的指令 deliverJob 出错", e);
// result.put("ErrorCode", "400");
// result.put("ErrorMessage", e.getMessage());
// }
// return result;
// }
//
//
// @Override
// public Barcode canPutIn(Barcode barcode) throws ValidateException {
// String requestReelUrl = getRequestReelUrl();
// if(Strings.isNullOrEmpty(requestReelUrl)){
// requestReelUrl = getRequestReelUrl();
// log.info("没有配置PanaCIM条码检测接口,查找setConfiguration注册的IP 及端口");
// return null;
// }
// try {
// if(!Strings.isNullOrEmpty(requestReelUrl)){
// log.info("向 PanaCIM["+requestReelUrl+"]请求料盘【"+reelBarcode+"】的信息");
// //String url = getApiUrl("/api/Storage/requestReel");
// Map<String, Object> params = new HashMap<String, Object>();
// params.put("TransactionID", nextSeq());
// params.put("ErrorCode","0");
// params.put("Reelbarcode",reelBarcode);
// String result = HttpHelper.postJson(requestReelUrl,params);
// log.info("PanaCIM 返回料盘【"+reelBarcode+"】的信息:"+result);
// if(!Strings.isNullOrEmpty(result)){
// ObjectMapper mapper = new ObjectMapper();
// HashMap<String,String> jsonMap = mapper.readValue(result, HashMap.class);
// String ErrorCode = jsonMap.get("ErrorCode");
// if("0".equals(ErrorCode)){//成功
// return true;
// }
// }
package com.neotel.smfcore.panacim;//package com.neotel.smfcore.panacim;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.HttpHelper;
import com.neotel.smfcore.common.utils.StorageConstants;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.api.CodeValidateParam;
import com.neotel.smfcore.core.device.api.IOpAuthApi;
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.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.listener.ITaskListener;
import com.neotel.smfcore.core.system.service.dao.IDataLogDao;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.atomic.AtomicLong;
@Controller
@RequestMapping("/rest/api")
public class PanaApiController implements IOpAuthApi, ITaskListener{
@Autowired
protected TaskService taskService;
@Autowired
protected IStoragePosManager storagePosManager;
protected static DataCache dataCache;
@Autowired
public void setDataCache(DataCache dataCache) {
PanaApiController.dataCache = dataCache;
}
@Autowired
protected IDataLogDao dataLogDao;
protected final static Logger log = LogManager.getLogger(PanaApiController.class);
private static String PanaCIMIP = "";
private static String PanaCIMPort = "";
private static String TowerID = "InoAutoB";
private static AtomicLong seq = new AtomicLong(0);
@RequestMapping(value = "/setConfiguration")
@ResponseBody
public String setConfiguration(@RequestBody Map<String,String> map) {
String ip = map.get("PanaCIMIP");
String port = map.get("PanaCIMPort");
log.info("收到 PanaCIM 的注册信息【"+ip+":"+port+"】");
if(Strings.isNullOrEmpty(ip)){
return "ERROR:IP is empty.";
}
if(Strings.isNullOrEmpty(port)){
return "ERROR: port is empty";
}
PanaCIMIP = ip;
PanaCIMPort = port;
return "OK";
}
private static String getInNotifyApi(){
if(!Strings.isNullOrEmpty(PanaCIMIP)){
return "http://"+PanaCIMIP + ":" + PanaCIMPort + "/api/Storage/checkInNotification";
}
return "";
}
private static String getOutNotifyApi(){
if(!Strings.isNullOrEmpty(PanaCIMIP)){
return "http://"+PanaCIMIP + ":" + PanaCIMPort + "/api/Storage/deliverNotification";
}
return "";
}
private static String getRequestReelUrl(){
if(!Strings.isNullOrEmpty(PanaCIMIP)){
return "http://"+PanaCIMIP + ":" + PanaCIMPort + "/api/Storage/requestReel";
}
return "";
}
@RequestMapping(value = "/keepAlive")
@ResponseBody
public String keepAlive(HttpServletRequest request) {
return "OK";
}
private static String nextSeq(){
return "SMDBOX_"+TowerID+"_"+seq.incrementAndGet();
}
@RequestMapping(value = "/deliverMaterial")
@ResponseBody
public Map<String,Object> deliverMaterial(@RequestBody PanaMaterial panaMaterial) {
Map<String, Object> result = new HashMap<String, Object>();
try {
String TransactionID = panaMaterial.getTransactionID();
String TowerID = panaMaterial.getTowerID();
String JobID = panaMaterial.getJobID();
List<String> ReelBarcodes = panaMaterial.getReelBarcodes();//["ABC123","BCD345","LL13212"]
log.info("收到 PanaCIM 的deliverMaterial 命令:ReelBarcodes="+ StringUtils.join(ReelBarcodes,","));
List<String> ReelBarcodesDelivered = Lists.newArrayList();
List<String> ReelBarcodesNonExisting = Lists.newArrayList();
for (String barcode : ReelBarcodes){//加入到出库列表
try{
StoragePos pos = storagePosManager.getByBarcode(barcode);
if(pos == null){
log.info( "二维码["+barcode+"]在仓库中不存在");
ReelBarcodesNonExisting.add(barcode);
continue;
}
log.info("出库["+barcode+"]位置仓位【"+pos.getPosName()+"】");
taskService.checkout(pos,false,null,false);
ReelBarcodesDelivered.add(barcode);
}catch (Exception e){
ReelBarcodesNonExisting.add(barcode);
}
}
result.put("TransactionID",TransactionID);
result.put("ErrorCode","0");
result.put("JobID",JobID);
result.put("TowerID",TowerID);
result.put("ReelBarcodesDelivered",ReelBarcodesDelivered);
result.put("ReelBarcodesNonExisting", ReelBarcodesNonExisting);
} catch (Exception e) {
log.error("PanaCIM的指令deliverMaterial出错",e);
result.put("ErrorCode","100");
}
return result;
}
@RequestMapping(value = "/getInventory")
@ResponseBody
public Map<String,Object> getInventory(@RequestBody Map<String,String> map) {
Map<String, Object> result = new HashMap<String, Object>();
try {
String TransactionID = map.get("TransactionID");
String TowerID = map.get("TowerID");
log.info("收到 PanaCIM 的getInventory 命令:TransactionID="+TransactionID+" TowerID="+TowerID);
/**
* {
"ErrorCode":0,
"ReelBarCodes":
[{"JobID":"1234","Location":"0","Msd":false,"Msdlevel":"1","PartNo":"part123","Quantity":123,"ReelBarcode":"123456789","TowerID":"InoAuto A"},
{"JobID":"1234","Location":"0","Msd":false,"Msdlevel":"1","PartNo":"part321","Quantity":321,"ReelBarcode":"123456789","TowerID":"InoAuto B"},
{"JobID":"1234","Location":"0","Msd":false,"Msdlevel":"1","PartNo":"part213","Quantity":213,"ReelBarcode":"123456789","TowerID":"InoAuto C"}],
"TransactionID":"testme"
}
*/
Collection<Storage> allStorage = dataCache.getAllStorage().values();
List<Storage> storageList = Lists.newArrayList();
if(Strings.isNullOrEmpty(TowerID)){
storageList.addAll(allStorage);
}else{
for (Storage storage : allStorage) {
if(storage.getName().equals(TowerID)){
storageList.add(storage);
break;
}
}
}
List ReelBarCodes = Lists.newArrayList();
for (Storage storage : storageList) {
List<StoragePos> poses = storagePosManager.findNotEmptyByStorageId(storage.getId());
for (StoragePos pos : poses){
Barcode barcode = pos.getBarcode();
Map<String,Object> item = Maps.newHashMap();
item.put("TowerID",TowerID);
item.put("JobID",barcode.getLockName());
item.put("ReelBarcode",barcode.getBarcode());
item.put("PartNo",barcode.getPartNumber());
item.put("Quantity",barcode.getAmount());
item.put("Msd",false);
item.put("msdlevel","");
item.put("Location","0");
ReelBarCodes.add(item);
}
}
result.put("TransactionID",TransactionID);
result.put("ErrorCode","0");
result.put("ReelBarCodes",ReelBarCodes);
} catch (Exception e) {
log.error("PanaCIM的指令 getInventory 出错",e);
result.put("ErrorCode","200");
}
return result;
}
@RequestMapping(value = "/reserveMaterial")
@ResponseBody
public Map<String,Object> reserveMaterial(@RequestBody PanaMaterial panaMaterial) {
/**
* "TransactionID":"testme",
"TransactionType":0,
"JobID":"job123",
"ReelBarcodesReserved": ["ABC123","BCD345","LL13212"]
*/
Map<String, Object> result = new HashMap<String, Object>();
try {
String TransactionID = panaMaterial.getTransactionID();
//1=create reservation based on JobID 2=update 3=cancel
String TransactionType = panaMaterial.getTransactionType();
String JobID = panaMaterial.getJobID();
List<String> reelBarcodesReserved = panaMaterial.getReelBarcodesReserved();
log.info("收到 PanaCIM 的reserveMaterial 指令:TransactionID="+TransactionID+" TransactionType="+TransactionType+" JobID="+JobID+" ReelBarcodesReserved="+StringUtils.join(reelBarcodesReserved,","));
if(reelBarcodesReserved == null){
log.error("PanaCIM 的指令reserveMaterial 执行时发现reelBarcodesReserved为 NUll,直接返回");
result.put("ErrorCode","301");
result.put("ErrorMessage","The field ReelBarcodesReserved is empty");
}else{
List<String> ReelBarcodesRejected = Lists.newArrayList();
//这里使用指定批次的锁定
if("1".equals(TransactionType) || "2".equals(TransactionType)){//create//update
for (String barcode :reelBarcodesReserved){
StoragePos pos = storagePosManager.getByBarcode(barcode);
if(pos == null){
ReelBarcodesRejected.add(barcode);
}else{
pos.getBarcode().setLockId(JobID);
pos.getBarcode().setLockName(JobID);
storagePosManager.save(pos);
}
}
}else if("3".equals(TransactionType)){//cancel
List<StoragePos> lockPoses = storagePosManager.findLockPos(JobID);
if(lockPoses.isEmpty()){
result.put("ErrorCode","301");
result.put("ErrorMessage","JobId 为"+JobID+"的 Job 不存在");
}else{
//查找所有的 POS
for (StoragePos pos : lockPoses){
pos.getBarcode().setLockId("");
pos.getBarcode().setLockName("");
storagePosManager.save(pos);
}
}
}
/**
* "ErrorCode":0,
"ErrorMessage":null,
"JobID":"job123",
"ReelBarcodesRejected":[],
"TransactionID":"testme"
*/
result.put("TransactionID",TransactionID);
result.put("ErrorCode","0");
result.put("ErrorMessage",null);
result.put("JobID",JobID);
result.put("ReelBarcodesRejected",ReelBarcodesRejected);
}
} catch (Exception e) {
log.error("PanaCIM的指令 reserveMaterial 出错",e);
result.put("ErrorCode","300");
result.put("ErrorMessage",e.getMessage());
}
return result;
}
@RequestMapping(value = "/deliverJob")
@ResponseBody
public Map<String,Object> deliverJob(@RequestBody Map<String,String> map) {
Map<String, Object> result = new HashMap<String, Object>();
try {
String TransactionID = map.get("TransactionID");
String TowerID = map.get("TowerID");
String JobID = map.get("JobID");
String Timestamp = map.get("Timestamp");
log.info("收到 PanaCIM deliverJob 指令:TransactionID=" + TransactionID + " TowerID=" + TowerID + " JobID=" + JobID + " Timestamp=" + Timestamp);
List<StoragePos> lockPoses = storagePosManager.findLockPos(JobID);
//if(batch != null){
//查找所有的 POS
if(lockPoses.isEmpty()){
result.put("ErrorCode","401");
result.put("ErrorMessage","JobID["+JobID+"]未包含物料");
}else{
List<DataLog> tasks = Lists.newArrayList();
for (StoragePos pos :lockPoses){
//已经加过的就不再加了
Storage storage = dataCache.getStorageById(pos.getStorageId());
Barcode barcode = pos.getBarcode();
String partNumber = barcode.getPartNumber();
DataLog task = new DataLog();
task.setType(OP.CHECKOUT);
task.setStatus(OP_STATUS.WAIT.name());
task.setPartNumber(partNumber);
//操作人
//task.setCreator(loginUser.getUsername());
//来源
task.setSourceType(StorageConstants.TASK_SOURCE.BATCH.name());
task.setSourceId(JobID);
task.setSourceName("PanaCIM");
task.setSubSourceId("");
task.setSubSourceInfo("");
task.setBarcode(barcode.getBarcode());
task.setNum(barcode.getAmount());
task.setCid(storage.getCid());
task.setStorageId(storage.getId());
task.setStorageName(storage.getName());
task.setPosId(pos.getId());
task.setPosName(pos.getPosName());
tasks.add(task);
}
dataLogDao.insertAll(tasks);
log.info("将"+ JobID + " 添加到出库列表,任务数["+tasks.size()+"]");
List<String> ReelBarcodesFailed = Lists.newArrayList();
result.put("TransactionID",TransactionID);
result.put("ErrorCode","0");
result.put("JobID",JobID);
result.put("TowerID",TowerID);
result.put("ReelBarcodesFailed",ReelBarcodesFailed);
}
// }else{
// log.info("没有条码检测接口,无需验证");
// return true;
// result.put("ErrorCode", "402");
// result.put("ErrorMessage", "操作失败ID为["+JobID+"]的指定批次不存在");
// }
//
// } catch (Exception e) {
// log.error("向 PanaCIM请求料盘【"+reelBarcode+"】的信息出错",e);
// }
// return false;
//
// boolean checkResult = PanaApiController.requestReel(barcode.getBarcode());
// if (!checkResult) {
// throw new ValidateException("PanaCIM验证条码[" + barcode.getBarcode() + "]失败", "PanaCIM验证失败");
// }
// return null;
// }
//
// @Override
// public boolean canCheckout(Barcode barcode) throws ValidateException {
// return false;
// }
//
// @Override
// public void onTaskStatusChange(DataLog task) {
//
// }
//}
} catch (Exception e) {
log.error("PanaCIM的指令 deliverJob 出错", e);
result.put("ErrorCode", "400");
result.put("ErrorMessage", e.getMessage());
}
return result;
}
@Override
public Barcode resolveBarcode(CodeValidateParam param) throws ValidateException {
return null;
}
@Override
public Barcode canPutIn(Barcode barcode) throws ValidateException {
String requestReelUrl = getRequestReelUrl();
try {
if(!Strings.isNullOrEmpty(requestReelUrl)){
log.info("向 PanaCIM["+requestReelUrl+"]请求料盘【"+barcode.getBarcode()+"】的信息");
//String url = getApiUrl("/api/Storage/requestReel");
Map<String, Object> params = new HashMap<String, Object>();
params.put("TransactionID", nextSeq());
params.put("ErrorCode","0");
params.put("Reelbarcode",barcode.getBarcode());
String result = HttpHelper.postJson(requestReelUrl,params);
log.info("PanaCIM 返回料盘【"+barcode.getBarcode()+"】的信息:"+result);
if(!Strings.isNullOrEmpty(result)){
ObjectMapper mapper = new ObjectMapper();
HashMap<String,String> jsonMap = mapper.readValue(result, HashMap.class);
String ErrorCode = jsonMap.get("ErrorCode");
if("0".equals(ErrorCode)){//成功
String qtyStr = jsonMap.get("Quantity");
if(!Strings.isNullOrEmpty(qtyStr)){
/**
* Sample json Data: {
* "TransactionID": "101_MAT_1481090400", "ErrorCode": 0,
* "ReelBarcode": "MAT123567",
* "PartNo": "0805",
* "Quantity": 2000, "Msd": True, "Msdlevel": "4", "Location": "0",
* "MsdDetail”:{
* "FloorLifeExpirationTime":"2017-01-23T21:35:45.5403903Z",
* "ShelfLifeExpirationTime":"2018-06-23T21:35:45.5403903Z",
* “FloorTimeRunning”: true
* }
* } }
*/
int qty = Double.valueOf(qtyStr).intValue();
if(qty > 0){
barcode.setAmount(qty);
}
}
return barcode;
}else{
throw new ValidateException("PanaCIM [" + barcode.getBarcode() + "] NG:"+ ErrorCode, "PanaCIM验证失败");
}
}
}else{
log.info("没有配置PanaCIM条码检测接口,查找setConfiguration注册的IP 及端口");
return null;
}
} catch (Exception e) {
log.error("向 PanaCIM请求料盘【"+barcode.getBarcode()+"】的信息出错",e);
}
return null;
}
@Override
public boolean canCheckout(Barcode barcode) throws ValidateException {
return false;
}
@Override
public boolean isEnable() {
return false;
}
@Override
public void onTaskStatusChange(DataLog task) {
if(task.isFinished()){
if(task.isPutInTask()){
checkInNotification(task);
}else{
deliverNotification(task);
}
}
}
/**
* 入库完成通知
* @param task
*/
public static void checkInNotification(DataLog task) {
String inNotifyApi = getInNotifyApi();
try {
if(!Strings.isNullOrEmpty(inNotifyApi)){
log.info("向 PanaCIM["+inNotifyApi+"] 通知料盘【"+task.getBarcode()+"】的入库信息");
//String url = getApiUrl("/api/Storage/checkInNotification");
Map<String, Object> params = new LinkedHashMap<>();
params.put("TransactionID",nextSeq());
params.put("ReelBarcode",task.getBarcode());
params.put("PartNo",task.getPartNumber());
params.put("Quantity",task.getNum());
params.put("Msd",false);
params.put("MsdLevel","1");
params.put("Location","0");
params.put("TowerID",task.getStorageName());
String result = HttpHelper.postJson(inNotifyApi,params);
log.info("Response Of checkInNotification From PanaCIM:"+result);
}else{
log.info("没有配置PanaCIM接口,无需通知");
}
} catch (Exception e) {
log.error("入库通知PanaCIM["+inNotifyApi+"]的料盘"+task.getBarcode()+"出错",e);
}
}
/**
* 出库完成通知
*/
public static void deliverNotification(DataLog task) {
String outNotifyApi = getOutNotifyApi();
try {
if(!Strings.isNullOrEmpty(outNotifyApi)){
log.info("向 PanaCIM["+outNotifyApi+"] 通知料盘【"+task.getBarcode()+"】的出库信息");
//String url = getApiUrl("/api/Storage/deliverNotification");
Map<String, Object> params = new HashMap<String, Object>();
params.put("TransactionID",nextSeq());
params.put("ReelBarcode",task.getBarcode());
params.put("PartNO",task.getPartNumber());
params.put("Quantity",task.getNum());
SimpleDateFormat dataformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
params.put("Timestamp",dataformat.format(new Date()));
params.put("TowerID",task.getStorageName());
params.put("JobID","");
params.put("Msd",false);
params.put("MsdLevel","1");
params.put("Location","0");
String result = HttpHelper.postJson(outNotifyApi,params);
log.info("Response Of deliverNotification From PanaCIM:"+result);
}else{
log.info("没有配置PanaCIM接口,无需通知");
}
} catch (Exception e) {
log.error("出库通知PanaCIM["+outNotifyApi+"]料盘"+task.getBarcode()+" 出错",e);
}
}
}
package com.neotel.smfcore.panacim;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;
/**
* Created by sunke on 17/4/17.
*/
public class PanaMaterial {
@JsonProperty("TransactionID")
String transactionID;
@JsonProperty("TowerID")
String towerID;
@JsonProperty("Priority")
String priority;
@JsonProperty("Display")
String display;
// String Timestamp = request.getParameter("Timestamp");//Date(2009-02-15T00:00:00Z)
@JsonProperty("JobID")
String jobID;
@JsonProperty("ReelBarcodes")
List<String> ReelBarcodes;
@JsonProperty("TransactionType")
String transactionType;
@JsonProperty("ReelBarcodesReserved")
List<String> reelBarcodesReserved;
public String getTransactionID() {
return transactionID;
}
public void setTransactionID(String transactionID) {
this.transactionID = transactionID;
}
public String getTowerID() {
return towerID;
}
public void setTowerID(String towerID) {
this.towerID = towerID;
}
public String getJobID() {
return jobID;
}
public void setJobID(String jobID) {
this.jobID = jobID;
}
public List<String> getReelBarcodes() {
return ReelBarcodes;
}
public void setReelBarcodes(List<String> reelBarcodes) {
ReelBarcodes = reelBarcodes;
}
public String getTransactionType() {
return transactionType;
}
public void setTransactionType(String transactionType) {
this.transactionType = transactionType;
}
public List<String> getReelBarcodesReserved() {
return reelBarcodesReserved;
}
public void setReelBarcodesReserved(List<String> reelBarcodesReserved) {
this.reelBarcodesReserved = reelBarcodesReserved;
}
public String getDisplay() {
return display;
}
public void setDisplay(String display) {
this.display = display;
}
public String getPriority() {
return priority;
}
public void setPriority(String priority) {
this.priority = priority;
}
}
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!