Index: ssts-web/src/main/webapp/disinfectsystem/storageLocationManage/goodsAccess.js =================================================================== diff -u -r34350 -r34353 --- ssts-web/src/main/webapp/disinfectsystem/storageLocationManage/goodsAccess.js (.../goodsAccess.js) (revision 34350) +++ ssts-web/src/main/webapp/disinfectsystem/storageLocationManage/goodsAccess.js (.../goodsAccess.js) (revision 34353) @@ -379,7 +379,9 @@ var params = { storageLocationId:storageLocationId, addr:addr, - status:status + status:status, + host:'', + port:'' } if(storageLocationId == ''){ showResult('抽屉不能为空'); Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/service/StorageRecordManager.java =================================================================== diff -u -r26797 -r34353 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/service/StorageRecordManager.java (.../StorageRecordManager.java) (revision 26797) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/service/StorageRecordManager.java (.../StorageRecordManager.java) (revision 34353) @@ -80,5 +80,15 @@ * @param tousseInstanceIdList */ public void takeOutByTousseInstanceIdList(List tousseInstanceIdList); + + /** + * 向卡迪斯货柜发送存取物品的命令 + * @param storageLocationId 库位ID + * @param addr 开口地址 + * @param host 货柜IP地址 + * @param port 货柜端口15008 + * @param status "存入"/"取出" + */ + public String sendKardexContainerTCPCommand(String storageLocationId, String addr, String host, int port, String status); } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/action/StorageRecordAction.java =================================================================== diff -u -r26724 -r34353 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/action/StorageRecordAction.java (.../StorageRecordAction.java) (revision 26724) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/action/StorageRecordAction.java (.../StorageRecordAction.java) (revision 34353) @@ -15,6 +15,7 @@ import com.forgon.security.service.UserManager; import com.forgon.tools.StrutsParamUtils; import com.forgon.tools.StrutsResponseUtils; +import com.forgon.tools.json.JSONUtil; import com.opensymphony.xwork2.ModelDriven; import com.opensymphony.xwork2.Preparable; @@ -71,6 +72,28 @@ } StrutsResponseUtils.output(json.toString()); } + + /** + * 向卡迪斯货柜发送存取物品的命令 + */ + public void sendKardexContainerTCPCommand(){ + JSONObject jsonObj = JSONUtil.buildJsonObject(true, "操作成功!"); + try { + String storageLocationId = StrutsParamUtils.getPraramValue("storageLocationId", null); + String addr = StrutsParamUtils.getPraramValue("addr", null); + String status = StrutsParamUtils.getPraramValue("status", ""); + String host = StrutsParamUtils.getPraramValue("host", "192.168.2.180"); + int port = StrutsParamUtils.getPraramValue("port", 15008); + String errorMessage = storageRecordManager.sendKardexContainerTCPCommand(storageLocationId, addr, host, port, status); + if(StringUtils.isNotBlank(errorMessage)){ + throw new RuntimeException(errorMessage); + } + jsonObj = JSONUtil.buildJsonObject(true, "物品" + status + "成功!"); + } catch (Exception e) { + jsonObj = JSONUtil.buildJsonObject(false, "操作失败:" + e.getMessage()); + } + StrutsResponseUtils.output(jsonObj.toString()); + } @Override public void prepare() throws Exception { Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/service/StorageRecordManagerImpl.java =================================================================== diff -u -r26816 -r34353 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/service/StorageRecordManagerImpl.java (.../StorageRecordManagerImpl.java) (revision 26816) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/service/StorageRecordManagerImpl.java (.../StorageRecordManagerImpl.java) (revision 34353) @@ -1,5 +1,10 @@ package com.forgon.disinfectsystem.basedatamanager.warehouse.service; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintStream; +import java.net.Socket; import java.util.Date; import java.util.List; @@ -8,6 +13,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; import com.forgon.directory.acegi.tools.AcegiHelper; import com.forgon.directory.model.BarcodeDevice; @@ -17,6 +23,8 @@ import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.StorageLocation; import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.StorageRecord; +import com.forgon.exception.SystemException; +import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.hibernate.BasePoManagerImpl; import com.forgon.tools.json.JSONUtil; import com.forgon.tools.json.JsonPropertyFilter; @@ -28,6 +36,8 @@ private StorageLocationManager storageLocationManager; + private final Logger logger = Logger.getLogger(this.getClass()); + public void setBarcodeManager(BarcodeManager barcodeManager) { this.barcodeManager = barcodeManager; } @@ -223,5 +233,130 @@ StorageRecord.class.getSimpleName(), StorageRecord.OUT, SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tousseInstanceId", tousseInstanceIdList)); objectDao.excuteSQL(sql); } + + /** + * 向卡迪斯货柜发送存取物品的命令 + * @param storageLocationId + * @param addr + * @param host + * @param port + * @param status + */ + @Override + public String sendKardexContainerTCPCommand(String storageLocationId, String addr, String host, int port, String status){ + Socket socket = null; + if(!DatabaseUtil.isPoIdValid(storageLocationId)){ + throw new SystemException("库位ID不能为空"); + } + if(StringUtils.isBlank(addr)){ + throw new SystemException("没有选择开口"); + } + if(StringUtils.isBlank(status)){ + throw new SystemException("请确认“存入”或者“取出”物品"); + } + StorageLocation storageLocation = storageLocationManager.getStorageLocationById(storageLocationId); + if(storageLocation == null){ + throw new SystemException("库位不存在"); + } + String errorMessage = ""; + PrintStream out = null; + BufferedReader input = null; + try { + //获取卡迪斯货柜请求命令 + String command = buildKardexContainerTCPCommand(storageLocation, addr, status); + logger.info("卡迪斯货柜(" + host + ":" + port + ")" + status + "物品请求命令:" + command); + //创建一个流套接字并将其连接到指定主机上的指定端口号 + socket = new Socket(host, port); + //向服务器端发送数据 + out = new PrintStream(socket.getOutputStream()); + out.println(command); + out.flush(); + //读取服务器端数据(等待时间为20秒) + socket.setSoTimeout(20*1000); + input = new BufferedReader(new InputStreamReader(socket.getInputStream())); + String ret = input.readLine(); + logger.info("卡迪斯货柜返回消息:" + ret); + //如接收到响应成功的代码,则断开连接 + isCommandSuccess(ret); + logger.info("卡迪斯货柜成功" + status + "物品!"); + } catch (Exception e) { + errorMessage = e.getMessage(); + logger.info(errorMessage); + } finally { + if (socket != null) { + try { + socket.close(); + } catch (IOException e) { + socket = null; + } + } + if(out != null){ + out.close(); + } + if(input != null){ + try { + input.close(); + } catch (IOException e) {} + } + } + return errorMessage; + } + + /** + * 判断命令是否响应成功 + * 请求消息 :3|1|S01-4|5 + * 成功响应消息:0|1|S01-4|5 + * @param command 请求消息 + * @param ret 成功响应消息 + * @return + */ + private boolean isCommandSuccess(String ret) { + if(StringUtils.isNotBlank(ret)){ + String firstStr = ret.split("\\|")[0]; + if(StringUtils.equals("0", firstStr)){ + return true; + } + if(StringUtils.equals("101", firstStr)){ + throw new SystemException("101:general error at request, communication, confifiguration, machine"); + } + if(StringUtils.equals("102", firstStr)){ + throw new SystemException("102:序列号无效"); + } + if(StringUtils.equals("103", firstStr)){ + throw new SystemException("103:机器忙"); + } + if(StringUtils.equals("104", firstStr)){ + throw new SystemException("104:执行超时"); + } + if(StringUtils.equals("106", firstStr)){ + throw new SystemException("106:托盘不知道或在其他开口"); + } + if(StringUtils.equals("107", firstStr)){ + throw new SystemException("107:过程终止"); + } + if(StringUtils.equals("108", firstStr)){ + throw new SystemException("108:无效的用户输入数据"); + } + throw new SystemException(firstStr + ":返回信息异常!"); + } + return false; + } + + /** + * 构建请求消息 + * @param storageLocation + * @param status + * @return + */ + private String buildKardexContainerTCPCommand(StorageLocation storageLocation, String addr, String status) { + String commond = "|1|" + addr + "|" + storageLocation.getStorageLocationCode(); + if(StorageRecord.OUT.equals(status)){ + commond = "4" + commond; + }else if(StorageRecord.IN.equals(status)){ + commond = "3" + commond; + } + return commond; + } + }