Commit b3c77f8b sunke

PanaCIM对接

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