Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/zdwy/DatasyncConstant.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/zdwy/DatasyncConstant.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/zdwy/DatasyncConstant.java (revision 36834) @@ -0,0 +1,13 @@ +package com.forgon.disinfectsystem.datasynchronization.dao.zdwy; + +/** + * 中大五院接口相关常量ZSWY-176 + */ +public class DatasyncConstant { + + /** + * 智慧手术系统接口地址 + */ + public final static String URL = "http://172.24.5.181:60000/jx/interfaceBreachGZZS/receiveInstrumentPackList"; + +} Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/zdwy/TousseInstancePushDaoImpl.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/zdwy/TousseInstancePushDaoImpl.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/zdwy/TousseInstancePushDaoImpl.java (revision 36834) @@ -0,0 +1,92 @@ +package com.forgon.disinfectsystem.datasynchronization.dao.zdwy; + +import java.util.Collection; + +import net.sf.json.JSONObject; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; + +import com.forgon.disinfectsystem.datasynchronization.dao.TousseInstancePushDao; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; +import com.forgon.tools.util.ForgonDateUtils; + +/** + * 【物品签收】新功能(接口)向智慧手术系统推送签收的手术器械包的器械包信息ZSWY-176 + */ +public class TousseInstancePushDaoImpl implements TousseInstancePushDao{ + + Logger logger = Logger.getLogger(this.getClass()); + + @Override + public void pushTousseInstance(Collection tousseInstances) { + if(CollectionUtils.isEmpty(tousseInstances)){ + return; + } + String msg = ""; + try { + String request = buildRequest(tousseInstances); + logger.info("智慧手术系统推送签收的手术器械包接口的请求信息:" + request); + String responce = HttpClientHelper.sendPost(DatasyncConstant.URL, request); + logger.info("智慧手术系统推送签收的手术器械包接口的返回信息:" + responce); + if(StringUtils.isEmpty(responce)){ + throw new RuntimeException("接口返回信息为空!"); + } + JSONObject json = JSONObject.fromObject(responce); + boolean success = json.optBoolean("success", false); + if(!success){ + String message = json.optString("message", "success = false"); + throw new RuntimeException(message); + } + } catch (Exception e) { + e.printStackTrace(); + msg = "签收失败,智慧手术系统推送失败,请检查接口状态:" + e.getMessage(); + } + if(StringUtils.isNotBlank(msg)){ + throw new RuntimeException(msg); + } + } + + /** + * 构建请求信息 + * @param tousseInstances + * @return + */ + private String buildRequest(Collection tousseInstances) { + if(CollectionUtils.isEmpty(tousseInstances)){ + return ""; + } + StringBuffer requestStringBuffer = new StringBuffer(); + requestStringBuffer.append(""); + for (TousseInstance ti : tousseInstances) { + TousseDefinition td = ti.getTousseDefinition(); + requestStringBuffer.append(""); + //消毒供应系统的器械包ID + requestStringBuffer.append("" + (td == null ? "" : td.getId()) + ""); + //器械包名称 + requestStringBuffer.append("" + (td == null ? "" : td.getName()) + ""); + //器械包条码 + requestStringBuffer.append("" + ti.getBarcode() + ""); + //批次 + requestStringBuffer.append(""); + //灭菌时间 + requestStringBuffer.append("" + StringUtils.defaultString(ti.getSterileStartTime()) + ""); + //失效时间 + requestStringBuffer.append("" + ti.getValidUntilStr(ForgonDateUtils.SIMPLEDATEFORMAT_YYYYMMDD) + ""); + //签收时间 + requestStringBuffer.append("" + ForgonDateUtils.safelyFormatDate(ti.getSignedDate(), ForgonDateUtils.SIMPLEDATEFORMAT_YYYYMMDDHHMMSS, "") + ""); + //使用次数 + requestStringBuffer.append("" + ti.getUseAmount() == null ? "" : ti.getUseAmount() + ""); + //数量 + requestStringBuffer.append("1"); + //包装类型 + requestStringBuffer.append("" + StringUtils.defaultString(ti.getPackageType()) + ""); + requestStringBuffer.append(""); + } + requestStringBuffer.append(""); + return requestStringBuffer.toString(); + } + +} Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java =================================================================== diff -u -r36814 -r36834 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java (.../TousseInstanceManagerImpl.java) (revision 36814) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java (.../TousseInstanceManagerImpl.java) (revision 36834) @@ -44,6 +44,7 @@ import org.apache.log4j.Logger; import org.hibernate.Query; import org.hibernate.Session; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.BatchPreparedStatementSetter; import org.springframework.jdbc.core.JdbcTemplate; @@ -76,6 +77,7 @@ import com.forgon.disinfectsystem.basedatamanager.warehouse.service.StorageRecordManager; import com.forgon.disinfectsystem.basedatamanager.warehouse.service.WareHouseManager; import com.forgon.disinfectsystem.common.CssdUtils; +import com.forgon.disinfectsystem.datasynchronization.dao.TousseInstancePushDao; import com.forgon.disinfectsystem.diposablegoods.service.DiposableGoodsManager; import com.forgon.disinfectsystem.disposablegoods.service.DisposableGoodsServiceContext; import com.forgon.disinfectsystem.entity.assestmanagement.DiposableGoodsInstance; @@ -235,6 +237,9 @@ private JdbcTemplate jdbcTemplate; + @Autowired(required=false) + private TousseInstancePushDao tousseInstancePushDao; + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @@ -1075,7 +1080,6 @@ * 加载待灭菌器械包信息 */ @Override - @SuppressWarnings("unchecked") public List getAllReviewedTousseInstanceWithOutBasketDate(String orgUnitCode,int start ,int limit,String searchKeyWord,String field,String direction,String sterilingMode , boolean enableUrgentFunction){ String findSql = ""; @@ -3489,39 +3493,123 @@ return result; } - @Override + @SuppressWarnings("unchecked") + @Override public boolean signByInvoiceId(Collection ids, String signer, Date signDate,Long signRecordId) { - //签收完发货单,需要同步TousseInstance - String update = "update TousseInstance po set po.signedUser=?,po.signedDate=?,signRecordId=?,po.status=?"; - String where = SqlBuilder.build_number_IN_Statement("invoice_id",SqlBuilder.IN, ids); - String where2 = " po.status = '" + TousseInstance.STATUS_SHIPPED + "'"; - String hql = String.format("%s where %s and %s", update,where,where2); - Object[] params = new Object[]{signer,signDate,signRecordId,TousseInstance.STATUS_SIGNED}; - boolean result = objectDao.executeHQL(hql,params); + + boolean result = false; + //签收一次发货的包实例 + result = updateTousseInstanceSignInfo(ids, signer, signDate, signRecordId, true); + //签收二次发货的包实例 + result = updateTousseInstanceSignInfo(ids, signer, signDate, signRecordId, false); + if(result){ departmentStockManager.instrumentSetToBeAddedByInvoiceIds(ids); + if(DatabaseUtil.isPoIdValid(signRecordId)){ + //签收器械包数量 + String signAmountSql = String.format("update %s set signAmount = (select count (1) from %s where signRecordId = %s), " + + "disposableGoodsAmount = (select sum(diposableGoodsAmount) from %s where signRecordId = %s) where id = %s", + SignRecord.class.getSimpleName(), + TousseInstance.class.getSimpleName(), + signRecordId, + Invoice.class.getSimpleName(), + signRecordId, + signRecordId); + result = objectDao.excuteSQL(signAmountSql); + } + if(tousseInstancePushDao != null){ + //向智慧手术系统推送签收的手术器械包 + Collection tis = null; + if(DatabaseUtil.isPoIdValid(signRecordId)){ + tis = objectDao.findByProperty(TousseInstance.class.getSimpleName(), "signRecordId", signRecordId); + } + if(CollectionUtils.isEmpty(tis)){ + tis = getWaiteSignTousseInstanceByInvoiceIds(ids); + } + tousseInstancePushDao.pushTousseInstance(tis); + } } - //签收聚合包。如果发货单关联的包实例所对应的聚合包下所有包实例都已经签收,那就签收这个聚合包。否则不签收 - String where3 = "id in ( select comboTousseInstanceId from TousseInstance where " + where + ")" - +" and id not in(select comboTousseInstanceId from TousseInstance where " + where+" and status<>'已签收' )"; - hql = String.format("%s where (%s) and %s", update,where3,where2); - result = objectDao.executeHQL(hql,params); - if(DatabaseUtil.isPoIdValid(signRecordId)){ - //签收器械包数量 - String signAmountSql = String.format("update %s set signAmount = (select count (1) from %s where signRecordId = %s), " - + "disposableGoodsAmount = (select sum(diposableGoodsAmount) from %s where signRecordId = %s) where id = %s", - SignRecord.class.getSimpleName(), - TousseInstance.class.getSimpleName(), - signRecordId, - Invoice.class.getSimpleName(), - signRecordId, - signRecordId); - result = objectDao.excuteSQL(signAmountSql); - } return result; } + + /** + * 根据发货单id查询待签收的器械包实例 + * @param ids + * @return + */ + @SuppressWarnings("unchecked") + private List getWaiteSignTousseInstanceByInvoiceIds(Collection invoiceIdList) { + List tousseInstanceList = new ArrayList(); + if(CollectionUtils.isEmpty(invoiceIdList)){ + return tousseInstanceList; + } + //一次发货的器械包实例 + String tousseInstanceHql1 = String.format("select po from %s po where %s and po.status='%s' ", + TousseInstance.class.getSimpleName(), + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("po.invoice_id", invoiceIdList), + TousseInstance.STATUS_SHIPPED); + List tousseInstanceList1 = objectDao.findByHql(tousseInstanceHql1); + //二次发货的器械包实例 + String tousseInstanceHql2 = String.format("select po from %s po where %s and po.status='%s' ", + TousseInstance.class.getSimpleName(), + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("po.invoice2_id", invoiceIdList), + TousseInstance.STATUS_SHIPPED); + List tousseInstanceList2 = objectDao.findByHql(tousseInstanceHql2); + + if(CollectionUtils.isNotEmpty(tousseInstanceList1)){ + tousseInstanceList.addAll(tousseInstanceList1); + } + + if(CollectionUtils.isNotEmpty(tousseInstanceList2)){ + tousseInstanceList.addAll(tousseInstanceList2); + } + if(CollectionUtils.isNotEmpty(tousseInstanceList)){ + tousseInstanceList = distinctTousseInstanceById(tousseInstanceList); + } + return tousseInstanceList; + } - private String signTousseInstance(TousseInstance tousseInstance,String signer, + /** + * 修改包实例的签收信息 + * @param ids + * @param signer + * @param signDate + * @param signRecordId + * @param firstInvoice 一次发货或者二次发货 + * @return + */ + private boolean updateTousseInstanceSignInfo(Collection ids, String signer, Date signDate, Long signRecordId, boolean firstInvoice) { + //签收完发货单,需要同步TousseInstance + String update = "update TousseInstance po set po.signedUser=?,po.signedDate=?,signRecordId=?,po.status=?"; + String invoiceIdSql = SqlBuilder.build_number_IN_Statement("invoice_id",SqlBuilder.IN, ids); + if(!firstInvoice){ + invoiceIdSql = SqlBuilder.build_number_IN_Statement("invoice2_id",SqlBuilder.IN, ids); + } + String statusSql = " po.status = '" + TousseInstance.STATUS_SHIPPED + "'"; + String hql = String.format("%s where %s and %s", update,invoiceIdSql,statusSql); + Object[] params = new Object[]{signer,signDate,signRecordId,TousseInstance.STATUS_SIGNED}; + boolean result = objectDao.executeHQL(hql,params); + //签收聚合包。如果发货单关联的包实例所对应的聚合包下所有包实例都已经签收,那就签收这个聚合包。否则不签收 + String where3 = "id in ( select comboTousseInstanceId from TousseInstance where " + invoiceIdSql + ")" + +" and id not in(select comboTousseInstanceId from TousseInstance where " + invoiceIdSql+" and status<>'已签收' )"; + hql = String.format("%s where (%s) and %s", update,where3,statusSql); + result = objectDao.executeHQL(hql,params); + return result; + } + + /** + * 查询发货单关联的器械包实例 + * @param ids + * @return + */ + private Collection getTousseInstanceBySignRecordId(Long signRecordId) { + if(!DatabaseUtil.isPoIdValid(signRecordId)){ + return null; + } + return objectDao.findByProperty(TousseInstance.class.getSimpleName(), "signRecordId", signRecordId); + } + + private String signTousseInstance(TousseInstance tousseInstance,String signer, String signerOrgUnitCoding, Long signRecordId, String beginDate, String endDate){ return signTousseInstance(tousseInstance,signer,signerOrgUnitCoding,new Date(),signRecordId, beginDate, endDate); } @@ -3800,6 +3888,12 @@ } Map tousseNameAndIdMap = new HashMap(); + //查询待签收的器械包实例 + List allSignedTousseInstanceList = new ArrayList(); + if(tousseInstancePushDao != null){ + allSignedTousseInstanceList.addAll(tis); + allSignedTousseInstanceList = searchWaitSignComboTousseInstance(allSignedTousseInstanceList); + } for(TousseInstance ti : tis){ //发现有固定条码的包实例,则直接跳过(用于 SZSLGZXYY-17 PDA【发货单签收】新增显示物品明细以及可移除操作模式) if(BooleanUtils.isTrue(ti.getTousseFixedBarcode())){ @@ -3818,6 +3912,9 @@ if(MapUtils.isNotEmpty(tousseNameAndIdMap)){ departmentStockManager.instrumentSetToBeAdded(orgUnit.getName(), orgUnit.getOrgUnitCoding(), tousseNameAndIdMap); } + if(tousseInstancePushDao != null){ + tousseInstancePushDao.pushTousseInstance(allSignedTousseInstanceList); + } } @Override @@ -3829,6 +3926,11 @@ if (StringUtils.isNotBlank(barcode)) { TousseInstance tousseInstance = getTousseInstanceByBarcode(barcode); if(tousseInstance != null){ + List waiteSignTousseInstances = new ArrayList(); + if(tousseInstancePushDao != null){ + waiteSignTousseInstances.add(tousseInstance); + waiteSignTousseInstances = searchWaitSignComboTousseInstance(waiteSignTousseInstances); + } msg = signTousseInstance(tousseInstance, signer, orgUnitCoding, null,null,null); if(msg == null){ SimpleDateFormat dateFormat = new SimpleDateFormat( @@ -3853,6 +3955,10 @@ departmentStockManager.instrumentSetToBeAdded(orgUnitName, orgUnitCoding, tousseNameAndIdMap); } } + //向智慧手术系统推送签收的手术器械包 + if(tousseInstancePushDao != null){ + tousseInstancePushDao.pushTousseInstance(waiteSignTousseInstances); + } } } } @@ -5537,19 +5643,13 @@ } if (tousseInstanceList.size()>0) { - try { - //签收器械包实例,并返回签收结果vo - SignResultVo signResultVo = batchSignTousseInstanceAndReturnSignResult(tousseInstanceList, beginDate, endDate, signRecordId, signOrgUnitCode, signOrgUnitName, signUserCode, signUserFullName, signDate, false); - if(signResultVo != null){ - return signReturn(barcode, signType, signResultVo); - } - } catch (Exception e) { - msg = e.getMessage(); - isSuccess = false; - e.printStackTrace(); - } - //返回数据 - return signReturn(barcode, msg, isSuccess, tIInfoJSONArray, signType, signRecordId); + //签收器械包实例,并返回签收结果vo + SignResultVo signResultVo = batchSignTousseInstanceAndReturnSignResult(tousseInstanceList, beginDate, endDate, signRecordId, signOrgUnitCode, signOrgUnitName, signUserCode, signUserFullName, signDate, false); + if(signResultVo != null){ + return signReturn(barcode, signType, signResultVo); + } + //返回数据 + return signReturn(barcode, msg, isSuccess, tIInfoJSONArray, signType, signRecordId); } } return signReturn(barcode,msg,false,tIInfoJSONArray,signType,signRecordId); @@ -5580,111 +5680,105 @@ JSONArray tIInfoJSONArray = new JSONArray(); //包含一次性物品的发货单 List disposableGoodsInvoiceList = new ArrayList(); - try { - //根据发货单号或者发货单集合码获取包实例,并按发货单分组 - Map> tousseInstanceMap = getTousseInstanceByInvoiceSerialNums(signType, barcode, signOrgUnitCode); - if(MapUtils.isEmpty(tousseInstanceMap)){ - throw new RuntimeException("该条码下没有可签收的物品!"); + //根据发货单号或者发货单集合码获取包实例,并按发货单分组 + Map> tousseInstanceMap = getTousseInstanceByInvoiceSerialNums(signType, barcode, signOrgUnitCode); + if(MapUtils.isEmpty(tousseInstanceMap)){ + throw new RuntimeException("该条码下没有可签收的物品!"); + } + // 器械包数量 + int signAmount = 0; + // 一次性物品数量 + int disposableGoodsAmount = 0; + //发货单关联的包实例 + List tousseInstanceList = new ArrayList(); + for (Invoice invoice : tousseInstanceMap.keySet()) { + List tempList = tousseInstanceMap.get(invoice); + if(CollectionUtils.isNotEmpty(tempList)){ + tousseInstanceList.addAll(tempList); } - // 器械包数量 - int signAmount = 0; - // 一次性物品数量 - int disposableGoodsAmount = 0; - //发货单关联的包实例 - List tousseInstanceList = new ArrayList(); - for (Invoice invoice : tousseInstanceMap.keySet()) { - List tempList = tousseInstanceMap.get(invoice); - if(CollectionUtils.isNotEmpty(tempList)){ - tousseInstanceList.addAll(tempList); + Integer diposableGoodsAmount = invoice.getDiposableGoodsAmount(); + if(diposableGoodsAmount != null && diposableGoodsAmount.intValue() > 0){ + disposableGoodsInvoiceList.add(invoice); + disposableGoodsAmount += invoice.getDiposableGoodsAmount(); + } + } + + if(CollectionUtils.isEmpty(tousseInstanceList) && CollectionUtils.isEmpty(disposableGoodsInvoiceList)){ + throw new RuntimeException("该条码下没有可签收的物品!"); + } + + //获取签收记录,signModuleVersion=1时,签收器械包时不创建签收记录,返回null + SignRecord signRecord = getSignRecordByIDOrNewSignRecordBySignModuleVersion(signRecordId, signOrgUnitCode, signUserCode, signUserFullName, signDate); + if(signRecord != null){ + signRecordId = signRecord.getId(); + } + //签收器械包 + if(CollectionUtils.isNotEmpty(tousseInstanceList)){ + SignResultVo signResultVo = batchSignTousseInstanceAndReturnSignResult(tousseInstanceList, beginDate, endDate, signRecordId, signOrgUnitCode, signOrgUnitName, signUserCode, signUserFullName, signDate, false); + if(signResultVo != null){ + msg = signResultVo.getMessage(); + isSuccess = signResultVo.getSuccess(); + signRecordId = signResultVo.getSignRecordId(); + tIInfoJSONArray = signResultVo.gettIInfoJSONArray(); + List signTousseInstances = signResultVo.getTousseInstances(); + if(isSuccess && CollectionUtils.isNotEmpty(signTousseInstances)){ + //器械包签收数量 + signAmount = signTousseInstances.size(); } - Integer diposableGoodsAmount = invoice.getDiposableGoodsAmount(); - if(diposableGoodsAmount != null && diposableGoodsAmount.intValue() > 0){ - disposableGoodsInvoiceList.add(invoice); - disposableGoodsAmount += invoice.getDiposableGoodsAmount(); - } + }else{ + isSuccess = false; } - - if(CollectionUtils.isEmpty(tousseInstanceList) && CollectionUtils.isEmpty(disposableGoodsInvoiceList)){ - throw new RuntimeException("该条码下没有可签收的物品!"); - } - - //获取签收记录,signModuleVersion=1时,签收器械包时不创建签收记录,返回null - SignRecord signRecord = getSignRecordByIDOrNewSignRecordBySignModuleVersion(signRecordId, signOrgUnitCode, signUserCode, signUserFullName, signDate); + } + if(!isSuccess){ + //器械包签收失败 + return signReturn(barcode, msg, isSuccess, tIInfoJSONArray, signType, signRecordId); + } + + // 签收一次性物品 + if(CollectionUtils.isNotEmpty(disposableGoodsInvoiceList)){ + signRecord = signDisposableGoods(disposableGoodsInvoiceList, signRecord); if(signRecord != null){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); signRecordId = signRecord.getId(); + JSONArray disposableGoodsInfoJSONArray = disposableGoodsJsonString(disposableGoodsInvoiceList, signRecord, dateFormat); + tIInfoJSONArray.addAll(disposableGoodsInfoJSONArray); } - //签收器械包 - if(CollectionUtils.isNotEmpty(tousseInstanceList)){ - SignResultVo signResultVo = batchSignTousseInstanceAndReturnSignResult(tousseInstanceList, beginDate, endDate, signRecordId, signOrgUnitCode, signOrgUnitName, signUserCode, signUserFullName, signDate, false); - if(signResultVo != null){ - msg = signResultVo.getMessage(); - isSuccess = signResultVo.getSuccess(); - signRecordId = signResultVo.getSignRecordId(); - tIInfoJSONArray = signResultVo.gettIInfoJSONArray(); - List signTousseInstances = signResultVo.getTousseInstances(); - if(isSuccess && CollectionUtils.isNotEmpty(signTousseInstances)){ - //器械包签收数量 - signAmount = signTousseInstances.size(); - } + } + + if(isSuccess){ + // 修改发货单签收状态为已经签收 + List invoiceIdList = new ArrayList(); + for (Invoice invoice : tousseInstanceMap.keySet()) { + invoiceIdList.add(invoice.getId()); + } + + //更新发货单的签收信息 + String updateSql = String.format("update %s set signStatus = '%s', signRecordId = %s" + + ", receiptor = '%s', receiptingTime = %s " + + "where %s", + Invoice.class.getSimpleName(), + Invoice.SIGNSTATUS_SIGNED, + signRecordId, + signUserFullName, + dateQueryAdapter.dateAdapter(signDate), + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("id", invoiceIdList)); + objectDao.excuteSQL(updateSql); + + // 返回签收信息 + msg = ""; + if(signAmount > 0){ + msg = "签收成功,复用物品总数量为" + signAmount; + } + if(disposableGoodsAmount > 0){ + if(StringUtils.isNotBlank(msg)){ + msg += ",一次性物品的总数量为" + disposableGoodsAmount; }else{ - isSuccess = false; + msg += "签收成功,一次性物品的总数量为" + disposableGoodsAmount; } } - if(!isSuccess){ - //器械包签收失败 - return signReturn(barcode, msg, isSuccess, tIInfoJSONArray, signType, signRecordId); - } - - // 签收一次性物品 - if(CollectionUtils.isNotEmpty(disposableGoodsInvoiceList)){ - signRecord = signDisposableGoods(disposableGoodsInvoiceList, signRecord); - if(signRecord != null){ - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - signRecordId = signRecord.getId(); - JSONArray disposableGoodsInfoJSONArray = disposableGoodsJsonString(disposableGoodsInvoiceList, signRecord, dateFormat); - tIInfoJSONArray.addAll(disposableGoodsInfoJSONArray); - } - } - - if(isSuccess){ - // 修改发货单签收状态为已经签收 - List invoiceIdList = new ArrayList(); - for (Invoice invoice : tousseInstanceMap.keySet()) { - invoiceIdList.add(invoice.getId()); - } - - //更新发货单的签收信息 - String updateSql = String.format("update %s set signStatus = '%s', signRecordId = %s" - + ", receiptor = '%s', receiptingTime = %s " - + "where %s", - Invoice.class.getSimpleName(), - Invoice.SIGNSTATUS_SIGNED, - signRecordId, - signUserFullName, - dateQueryAdapter.dateAdapter(signDate), - SqlUtils.getNonStringFieldInLargeCollectionsPredicate("id", invoiceIdList)); - objectDao.excuteSQL(updateSql); - - // 返回签收信息 - msg = ""; - if(signAmount > 0){ - msg = "签收成功,复用物品总数量为" + signAmount; - } - if(disposableGoodsAmount > 0){ - if(StringUtils.isNotBlank(msg)){ - msg += ",一次性物品的总数量为" + disposableGoodsAmount; - }else{ - msg += "签收成功,一次性物品的总数量为" + disposableGoodsAmount; - } - } - } - } catch (Exception e) { - e.printStackTrace(); - isSuccess = false; - msg = e.getMessage(); - } + } return signReturn(barcode, msg, isSuccess, tIInfoJSONArray, signType, signRecordId); - } + } /** * 一次性物品签收物品信息 @@ -5839,28 +5933,9 @@ invoiceIdList.add(invoice.getId()); } - List tousseInstanceList = new ArrayList(); - //一次发货的器械包实例 - String tousseInstanceHql1 = String.format("select po from %s po where %s and po.status='%s' ", - TousseInstance.class.getSimpleName(), - SqlUtils.getNonStringFieldInLargeCollectionsPredicate("po.invoice_id", invoiceIdList), - TousseInstance.STATUS_SHIPPED); - List tousseInstanceList1 = objectDao.findByHql(tousseInstanceHql1); - //二次发货的器械包实例 - String tousseInstanceHql2 = String.format("select po from %s po where %s and po.status='%s' ", - TousseInstance.class.getSimpleName(), - SqlUtils.getNonStringFieldInLargeCollectionsPredicate("po.invoice2_id", invoiceIdList), - TousseInstance.STATUS_SHIPPED); - List tousseInstanceList2 = objectDao.findByHql(tousseInstanceHql2); + //根据发货单查询待签收的器械包实例 + List tousseInstanceList = getWaiteSignTousseInstanceByInvoiceIds(invoiceIdList); - if(CollectionUtils.isNotEmpty(tousseInstanceList1)){ - tousseInstanceList.addAll(tousseInstanceList1); - } - - if(CollectionUtils.isNotEmpty(tousseInstanceList2)){ - tousseInstanceList.addAll(tousseInstanceList2); - } - if(CollectionUtils.isEmpty(tousseInstanceList)){ return tousseInstanceMap; } @@ -10930,171 +11005,6 @@ return json.toString(); } - /** - * 器械包实例自动回退,并产生回退的流转记录 - * 自动将该物品的流转记录进行到最初所在的位置 - * @param tousseInstance - */ - private void autoReturnTousseInstanceAfterPutInStorage(TousseInstance tousseInstance) { - - try { - if(tousseInstance == null){ - return; - } - String status = tousseInstance.getStatus(); - if (!StringUtils.equals(status, TousseInstance.STATUS_SHIPPED) && !StringUtils.equals(status, TousseInstance.STATUS_SIGNED)) { - return; - } - String status2 = tousseInstance.getStatus2(); - if (!StringUtils.equals(status2, TousseOperation.STATUS_SENDING) && !StringUtils.equals(status2, TousseOperation.STATUS_SIGNED)) { - return; - } - Long tousseOperationId = tousseInstance.getTousseOperationId(); - if(!DatabaseUtil.isPoIdValid(tousseOperationId)){ - return; - } - //查询操作类型为“发货”、“签收自动发货”,并且流转记录没有做过回退的流转记录, - List canReturnTousseOperationList = getCanReturnTousseOperationListByTousseInstance(tousseInstance); - if(CollectionUtils.isEmpty(canReturnTousseOperationList)){ - return; - } - //最初的流转记录 - TousseOperation firstCanReturnTousseOperation = canReturnTousseOperationList.get(canReturnTousseOperationList.size() - 1); - // 修改器械包信息 - tousseInstance.setStatus2(firstCanReturnTousseOperation.getSrcStatus()); - tousseInstance.setDepart2(firstCanReturnTousseOperation.getSrcDepart()); - tousseInstance.setDepartCoding2(firstCanReturnTousseOperation.getSrcDepartCoding()); - tousseInstance.setLocation2(firstCanReturnTousseOperation.getSrcLocation()); - tousseInstance.setLocation2Type(firstCanReturnTousseOperation.getSrcLocationType()); - tousseInstance.setOperationRoomId(firstCanReturnTousseOperation.getSrcOperationRoomId()); - if(DatabaseUtil.isPoIdValid(firstCanReturnTousseOperation.getSrcWareHouseId())){ - tousseInstance.setWareHouseId2(firstCanReturnTousseOperation.getSrcWareHouseId()); - } - tousseInstance.setTousseOperationId(null); - objectDao.saveOrUpdate(tousseInstance); - - //回退时间 - Date operationTime = new Date(); - //回退操作人 - String operator = AcegiHelper.getLoginUserFullName(); - //批量创建回退流转记录 - for (TousseOperation lastCanReturnTousseOperation : canReturnTousseOperationList) { - // 创建回退记录 - TousseOperation tousseOperation = new TousseOperation(); - tousseOperation.setOperation(TousseOperation.OPERATION_RETURN); - tousseOperation.setOperationTime(operationTime); - tousseOperation.setOperator(operator); - //src是原记录的dest - tousseOperation.setSrcDepart(lastCanReturnTousseOperation.getDestDepart()); - tousseOperation.setSrcDepartCoding(lastCanReturnTousseOperation.getDestDepartCoding()); - tousseOperation.setSrcLocation(lastCanReturnTousseOperation.getDestLocation()); - tousseOperation.setSrcLocationType(lastCanReturnTousseOperation.getDestLocationType()); - tousseOperation.setSrcOperationRoomId(lastCanReturnTousseOperation.getDestOperationRoomId()); - tousseOperation.setSrcWareHouseId(lastCanReturnTousseOperation.getDestWareHouseId()); - //dest是原纪录的src - tousseOperation.setDestDepart(lastCanReturnTousseOperation.getSrcDepart()); - tousseOperation.setDestDepartCoding(lastCanReturnTousseOperation.getSrcDepartCoding()); - tousseOperation.setDestLocation(lastCanReturnTousseOperation.getSrcLocation()); - tousseOperation.setDestLocationType(lastCanReturnTousseOperation.getSrcLocationType()); - tousseOperation.setDestOperationRoomId(lastCanReturnTousseOperation.getSrcOperationRoomId()); - tousseOperation.setDestWareHouseId(lastCanReturnTousseOperation.getSrcWareHouseId()); - - tousseOperation.setTousseInstanceId(tousseInstance.getId()); - tousseOperation.setReturnByTousseOperationId(lastCanReturnTousseOperation.getId()); - tousseOperation.setRemark("入库自动回退"); - objectDao.saveOrUpdate(tousseOperation); - - lastCanReturnTousseOperation.setReturnTousseOperationId(tousseOperation.getId()); - objectDao.saveOrUpdate(lastCanReturnTousseOperation); - } - } catch (Exception e) { - e.printStackTrace(); - logger.info("自动回退失败:" + e.getMessage()); - } - } - - /** - * 查询器械包实例可回退的流转记录 - * @param tousseInstance - * @return - */ - @SuppressWarnings("unchecked") - private List getCanReturnTousseOperationListByTousseInstance(TousseInstance tousseInstance) { - List canReturnTousseOperationList = new ArrayList(); - String[] operations = new String[]{TousseOperation.OPERATION_INVOICE,TousseOperation.OPERATION_SIGN_INVOICE}; - String hql = String.format("select po from %s po where po.tousseInstanceId=%s " - + " and not exists (select 1 from %s to where to.returnByTousseOperationId = po.id and to.operation = '%s') and %s " - + " order by po.id desc", - TousseOperation.class.getSimpleName(), - tousseInstance.getId(), - TousseOperation.class.getSimpleName(), - TousseOperation.OPERATION_RETURN, - SqlUtils.getStringFieldInLargeCollectionsPredicate("po.operation", Arrays.asList(operations))); - List allTousseOperationList = objectDao.findByHql(hql); - if(CollectionUtils.isEmpty(allTousseOperationList)){ - return canReturnTousseOperationList; - } - for (TousseOperation lastTousseOperation : allTousseOperationList) { - if(StringUtils.isBlank(lastTousseOperation.getSrcDepart()) || StringUtils.isBlank(lastTousseOperation.getSrcDepartCoding())){ - throw new RuntimeException("源科室为空,无法回退!"); - } - if(StringUtils.isBlank(lastTousseOperation.getSrcLocation()) || StringUtils.isBlank(lastTousseOperation.getSrcLocationType())){ - throw new RuntimeException("源位置信息为空,无法回退!"); - } - if(StringUtils.equals(lastTousseOperation.getSrcLocationType(), TousseOperation.DESTTYPE_OPERATIONROOM)){ - if(!DatabaseUtil.isPoIdValid(lastTousseOperation.getSrcOperationRoomId())){ - throw new RuntimeException("源手术间id为空,无法回退!"); - } - }else{ - if(!DatabaseUtil.isPoIdValid(lastTousseOperation.getSrcWareHouseId())){ - throw new RuntimeException("原仓库id为空,无法回退!"); - } - } - canReturnTousseOperationList.add(lastTousseOperation); - } - return canReturnTousseOperationList; - } - - /** - * 入库时自动签收自动签收 - * @param ti - * @return - */ - private String autoSignTousseInstanceAfterPutInStorage(TousseInstance ti) { - String msg = null; - if(ti == null){ - throw new SystemException("参数异常,ti不能为空"); - } - //已经签收的包入库时不需要再自动签收 - if(StringUtils.equals(ti.getStatus(), TousseInstance.STATUS_SIGNED)){ - return msg; - } - List tousseInstanceBarcodes = new ArrayList(); - tousseInstanceBarcodes.add(ti.getBarcode()); - try { - String signUserName = AcegiHelper.getLoginUserFullName(); - String signUserCode = AcegiHelper.getLoginUser().getUserName(); - String departCoding = AcegiHelper.getCurrentOrgUnitCode(); - - SignRecord sr = new SignRecord(); - sr.setSignUserName(signUserName); - sr.setDepartCode(departCoding); - sr.setSignUserCode(signUserCode); - Date now = new Date(); - sr.setSignDate(now); - sr.setCreateDate(now); - sr.setRemark("入库自动签收"); - objectDao.saveOrUpdate(sr); - this.batchSignTousseInstance(tousseInstanceBarcodes, - departCoding, signUserName,sr.getSignDate(),sr.getId()); - sr.setSignAmount(1); - objectDao.saveOrUpdate(sr); - } catch (Exception e) { - e.printStackTrace(); - msg = "入库失败:" + e.getMessage(); - } - return msg; - } @Override public List getTousseInstancesBySetCode(String setCode) { return getTousseInstancesBySetCode(setCode, null, null); @@ -11471,6 +11381,10 @@ } } + if(tousseInstancePushDao != null){ + tousseInstancePushDao.pushTousseInstance(waitSignTousseInstanceList); + } + return signRecordId; } @@ -11542,16 +11456,16 @@ /** * 去除重复id的器械包实例 - * @param waitSignTousseInstanceList + * @param tis * @return */ - private List distinctTousseInstanceById(List waitSignTousseInstanceList) { + private List distinctTousseInstanceById(Collection tis) { List distinctTousseInstanceList = new ArrayList(); - if(CollectionUtils.isEmpty(waitSignTousseInstanceList)){ + if(CollectionUtils.isEmpty(tis)){ return distinctTousseInstanceList; } Set tousseInstanceIdSet = new HashSet(); - for (TousseInstance tousseInstance : waitSignTousseInstanceList) { + for (TousseInstance tousseInstance : tis) { Long id = tousseInstance.getId(); if(tousseInstanceIdSet.contains(id)){ continue; Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/zdwy/HttpClientHelper.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/zdwy/HttpClientHelper.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/zdwy/HttpClientHelper.java (revision 36834) @@ -0,0 +1,62 @@ +package com.forgon.disinfectsystem.datasynchronization.dao.zdwy; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.dom4j.Document; +import org.dom4j.Node; +import org.dom4j.XPath; + +/** + * 中大五院webservice帮助类 + */ +public class HttpClientHelper { + + public static Logger logger = Logger.getLogger(HttpClientHelper.class); + + public static String sendPost(String url, String content) throws Exception { + BufferedReader in = null; + String result = ""; + URL realUrl = new URL(url); + HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection(); + conn.setRequestProperty("Content-Type", "application/xml; charset=utf-8"); + conn.setDoOutput(true); + conn.setDoInput(true); + conn.setInstanceFollowRedirects(true); + conn.getOutputStream().write(content.getBytes("UTF-8")); + conn.getOutputStream().flush(); + InputStream is = conn.getInputStream(); + in = new BufferedReader(new InputStreamReader(is, "UTF-8")); + String line; + while ((line = in.readLine()) != null) { + result += line; + } + try{is.close();}catch(Exception e){} + try{in.close();}catch(Exception e){} + return result; + } + + /** + * 根据document和Xpath表达式解析数据 + * @param document + * @param nameSpaceURIMap + * @param xpathExp + * @return + */ + public static String processDataByXpath(Document document, String xpathExp) { + if ((StringUtils.isNotBlank(xpathExp)) && (document != null)) { + XPath xpath = document.createXPath(xpathExp); + Node node = xpath.selectSingleNode(document); + if (node != null) { + return node.getStringValue(); + } + } + return null; + } + +} Index: ssts-datasync/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/TousseInstancePushDao.java =================================================================== diff -u --- ssts-datasync/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/TousseInstancePushDao.java (revision 0) +++ ssts-datasync/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/TousseInstancePushDao.java (revision 36834) @@ -0,0 +1,18 @@ +package com.forgon.disinfectsystem.datasynchronization.dao; + +import java.util.Collection; + +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; + +/** + * 推送器械包实例(ZSWY-176物品签收后向智慧手术系统推送签收的手术器械包的器械包信息) + */ +public interface TousseInstancePushDao { + + /** + * 推送器械包实例 + * @param tousseInstances + */ + public void pushTousseInstance(Collection tousseInstances); + +} Index: ssts-web/src/main/webapp/disinfectsystem/config/zd5y/spring/HIS.xml =================================================================== diff -u -r35405 -r36834 --- ssts-web/src/main/webapp/disinfectsystem/config/zd5y/spring/HIS.xml (.../HIS.xml) (revision 35405) +++ ssts-web/src/main/webapp/disinfectsystem/config/zd5y/spring/HIS.xml (.../HIS.xml) (revision 36834) @@ -17,5 +17,8 @@ + + + \ No newline at end of file