Index: ssts-web/src/main/webapp/disinfectsystem/config/xkyy/spring/HIS.xml =================================================================== diff -u -r31166 -r37072 --- ssts-web/src/main/webapp/disinfectsystem/config/xkyy/spring/HIS.xml (.../HIS.xml) (revision 31166) +++ ssts-web/src/main/webapp/disinfectsystem/config/xkyy/spring/HIS.xml (.../HIS.xml) (revision 37072) @@ -95,4 +95,7 @@ + + + \ No newline at end of file Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java =================================================================== diff -u -r37049 -r37072 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 37049) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 37072) @@ -66,6 +66,7 @@ import com.forgon.disinfectsystem.basedatamanager.urgent.service.UrgentLevelManager; 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.DiposableGoodBatchStockManager; import com.forgon.disinfectsystem.diposablegoods.service.DiposableGoodsManager; import com.forgon.disinfectsystem.diposablegoods.service.DisposableGoodsBatchManager; @@ -254,6 +255,10 @@ private InstrumentInstanceManager instrumentInstanceManager; @Autowired private TousseInstanceAdditionalInfoManagerImpl tousseInstanceAdditionalInfoManagerImpl; + + @Autowired(required = false) + protected TousseInstancePushDao tousseInstancePushDao; + public void setUrgentLevelManager(UrgentLevelManager urgentLevelManager) { this.urgentLevelManager = urgentLevelManager; } @@ -3343,6 +3348,10 @@ SubmitInvoiceContext submitInvoiceContext = submitInvoiceForCustom(params); //添加标识牌实例的器械实例发货数据SSTS-584(自定义发货的包,包内的器械实例的已使用次数没有增加的问题) addIdCardInstanceInstrumentInstanceInvoiceData(submitInvoiceContext); + //在追溯系统中进行发货保存操作时,使用SDK的API将发货的器械包信息推送至集成平台的MQ队列。XKYY-244 + new Thread(() -> { + pushTousseInstanceAfterInvoice(submitInvoiceContext); + }).start(); return submitInvoiceContext; } //校验是否符合科研项目发货条件(该业务方法仅用于广东省中医院,前提是有开启科室研目配置项.中山眼科中心的科室项目接口的配置不同,不适用于此业务) @@ -3459,10 +3468,43 @@ } //添加标识牌实例的器械实例发货数据 addIdCardInstanceInstrumentInstanceInvoiceData(submitInvoiceContext); + + //在追溯系统中进行发货保存操作时,使用SDK的API将发货的器械包信息推送至集成平台的MQ队列。XKYY-244 + new Thread(() -> { + pushTousseInstanceAfterInvoice(submitInvoiceContext); + }).start(); + return submitInvoiceContext; } /** + * 在追溯系统中进行发货保存操作时,使用SDK的API将发货的器械包信息推送至集成平台的MQ队列。XKYY-244 + * @param submitInvoiceContext + */ + private void pushTousseInstanceAfterInvoice(SubmitInvoiceContext submitInvoiceContext) { + if(tousseInstancePushDao == null + || submitInvoiceContext == null){ + return; + } + Map> updateStockInfoMap = submitInvoiceContext.getUpdateStockInfo(); + if(MapUtils.isEmpty(updateStockInfoMap)){ + return; + } + Collection tousseInstanceColl = new ArrayList(); + for (Entry> entry : updateStockInfoMap.entrySet()) { + Collection value = entry.getValue(); + if(CollectionUtils.isEmpty(value)){ + continue; + } + tousseInstanceColl.addAll(value); + } + if(CollectionUtils.isEmpty(tousseInstanceColl)){ + return; + } + tousseInstancePushDao.pushTousseInstanceAfterInvoice(tousseInstanceColl); + } + + /** * 插入表数据的id字段名(sqlserver数据库的id列为自增长所以不需要指定id列,oracle数据库需要指定id列) * @return */ Index: ssts-datasync/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/TousseInstancePushDao.java =================================================================== diff -u -r36834 -r37072 --- ssts-datasync/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/TousseInstancePushDao.java (.../TousseInstancePushDao.java) (revision 36834) +++ ssts-datasync/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/TousseInstancePushDao.java (.../TousseInstancePushDao.java) (revision 37072) @@ -14,5 +14,13 @@ * @param tousseInstances */ public void pushTousseInstance(Collection tousseInstances); + + /** + * 发货保存操作时,使用SDK的API将发货的器械包信息推送至集成平台的MQ队列XKYY-244 + * @param tousseInstances + */ + public default void pushTousseInstanceAfterInvoice(Collection tousseInstances) { + + } } Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/xkyy/TousseInstancePushDaoImpl.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/xkyy/TousseInstancePushDaoImpl.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/xkyy/TousseInstancePushDaoImpl.java (revision 37072) @@ -0,0 +1,147 @@ +package com.forgon.disinfectsystem.datasynchronization.dao.xkyy; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.util.Collection; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; + +import com.ewell.sdk.business.EwellServiceTool; +import com.forgon.disinfectsystem.datasynchronization.dao.TousseInstancePushDao; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; +import com.forgon.tools.date.DateTools; + +public class TousseInstancePushDaoImpl implements TousseInstancePushDao { + + /** + * 队列管理名称 + */ + public static String QUEUE_MANAGER_NAME = "QMGR.P17"; + + /** + * 数据通道 + */ + public static String FID = "PS30004"; + + Logger logger = Logger.getLogger(TousseInstancePushDaoImpl.class); + + @Override + public void pushTousseInstanceAfterInvoice(Collection tousseInstances) { + if(CollectionUtils.isEmpty(tousseInstances)){ + return; + } + EwellServiceTool ewellServiceTool = null; + try { + //创建连接对象 + ewellServiceTool = new EwellServiceTool(); + //定义请求体 + String msgbody = buildMsgBody(tousseInstances); + logger.debug("发货的器械包信息推送接口请求参数:" + msgbody); + //放入消息 + String messageId = ewellServiceTool.composePutMsg(QUEUE_MANAGER_NAME, FID, msgbody); + logger.debug("发货的器械包信息推送接口返回参数:" + messageId); + } catch (Exception e) { + e.printStackTrace(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + e.printStackTrace(new PrintStream(baos)); + String exception = baos.toString(); + logger.debug("发货的器械包信息推送接口调用失败:" + exception); + e.printStackTrace(); + } finally{ + if(ewellServiceTool != null){ + try { + ewellServiceTool.disconnect(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + } + + /** + * 构建请求信息 + * + * + * XGXT + * 123456 + * PS30004 + * PS30004S09001 + * 1 + * + * + * PS30004 + * PS30004S09001 + * S17 + * S00 + * GH01 + * -1 + * + * 2023-02-22 15:43:20 + * + * + * + * BAR_CODE + * PACKAGE_NAME + * STERILIZE_DATE + * TODAY_USE_TIMES + * EXP_DATE + * PACKAGE_OPERATOR + * NOTE + * + * + * + * @param tousseInstances + * @return + */ + private String buildMsgBody(Collection tousseInstances) { + if(CollectionUtils.isEmpty(tousseInstances)){ + return null; + } + String nowDateTime = DateTools.getCurrentDayByFormat(DateTools.COMMON_DATE_HMS); + StringBuffer msgBody = new StringBuffer(); + msgBody.append(""); + msgBody.append(""); + msgBody.append("XGXT"); + msgBody.append("123456"); + msgBody.append("" + FID + ""); + msgBody.append("PS30004S09001"); + msgBody.append("1"); + msgBody.append(""); + msgBody.append(""); + msgBody.append("" + FID + ""); + msgBody.append("PS30004S09001"); + msgBody.append("S17"); + msgBody.append("S00"); + msgBody.append("GH01"); + msgBody.append("-1"); + // + msgBody.append("" + nowDateTime + ""); + msgBody.append(""); + msgBody.append(""); + int index = 1; + for (TousseInstance tousseInstance : tousseInstances) { + msgBody.append(""); + msgBody.append("" + tousseInstance.getBarcode() + ""); + msgBody.append("" + tousseInstance.getTousseName() + ""); + msgBody.append("" + StringUtils.defaultString(tousseInstance.getSterileStartDate()) + ""); + msgBody.append("" + StringUtils.defaultString(tousseInstance.getSterileFrequency()) + ""); + msgBody.append("" + StringUtils.defaultString(tousseInstance.getValidUntilStr()) + ""); + msgBody.append("" + StringUtils.defaultString(tousseInstance.getOperator()) + ""); + msgBody.append(""); + msgBody.append(""); + index++; + } + msgBody.append(""); + msgBody.append(""); + return msgBody.toString(); + } + + @Override + public void pushTousseInstance(Collection tousseInstances) { + return; + } + +} Index: ssts-web/src/main/webapp/disinfectsystem/config/xkyy/interfaces/mqConfig/SDKConfig.properties =================================================================== diff -u --- ssts-web/src/main/webapp/disinfectsystem/config/xkyy/interfaces/mqConfig/SDKConfig.properties (revision 0) +++ ssts-web/src/main/webapp/disinfectsystem/config/xkyy/interfaces/mqConfig/SDKConfig.properties (revision 37072) @@ -0,0 +1,75 @@ +#查询推送的服务地址 +server.ip=http://192.168.111.44:8360 +#推送的服务地址 +push.server.ip=http://192.168.111.44:8380 +#订阅的服务地址 +websocket.ip=http://192.168.111.44:8350 +#页端的服务地址 +web.ip=http://192.168.111.44:8370 + + + +websocket.endpoint=endpointWisely + +#集群容错:FAIL_OVER FAIL_FAST +cluster.type=FAIL_FAST +cluster.retry=3 + + +#*****客户端配置****** +sys.code=S17 +client.key=478bb94423f547cb8fc5c707c9711f36 +#客户端IP +sys.ipaddr=192.168.100.81 + + +#v4.0.2.5 新增 +#*****apollo配置****** +apollo.bootstrap.enabled=false +app.id=sdk +#apollo环境变量key +env.key=env +env=dev +apollo.cluster=default +apollo.namespace=application +apollo.meta=http://192.168.10.11:8080 +local.meta=http://192.168.10.11:8080 +dev.meta=http://192.168.10.11:8080 +fat.meta=http://192.168.10.11:8080 +uat.meta=http://192.168.10.11:8080 +lpt.meta=http://192.168.10.11:8080 +pro.meta=http://192.168.10.11:8080 +tools.meta=http://192.168.10.11:8080 + + + +#v4.0.2.6 新增 +#ACK回执线程池配置 +#核心线程数 +ack.core.pool.size=50 +#最大线程数 +ack.max.pool.size=1000 +#任务队列大小 +ack.pool.queue.size=30 +#批量获取最大值 +ack.batch.max.size=1000 +#批量获取最小值 +ack.batch.min.size=100 +#批量获取初始值 +ack.batch.initial.size=500 +#批量获取值动态增幅 +ack.batch.increase.size=100 +#批量获取单条等待 +ack.poll.delay.time=3 +#ACK批量发送数 +ack.batch.send.size=100 + + +#4.0.3.1 新增 +#失败消息存储路径 +fail.msg.file.path=E:\\errorMsg +#单个文件大小 单位kb +fail.msg.file.size=10240 +#清除失败消息间隔 单位小时 +fail.msg.clear.inteval=3 + Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceOptimizeManagerImpl.java =================================================================== diff -u -r36327 -r37072 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceOptimizeManagerImpl.java (.../InvoiceOptimizeManagerImpl.java) (revision 36327) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceOptimizeManagerImpl.java (.../InvoiceOptimizeManagerImpl.java) (revision 37072) @@ -681,7 +681,7 @@ List comboTousseInstanceList = idToComboTousseInstanceMap.values().stream().collect(Collectors.toList()); validateUniqueTousseInstanceAndSort(comboTousseInstanceList, barcodeToSendAmountMap, params, warningTousseWhetherDelivery, validUtilTodayCanInvoice, currentDateTime); List comboTousseWrapperInvoiceList = invoiceWrapperComboTousse(idToComboTousseInstanceMap, invoicePlanId, departCoding, applyDate,appFormType, invoiceGroupByConfig, - invoiceOrigin, tousseDeliverOccasion,params,currentDateTime); + invoiceOrigin, tousseDeliverOccasion,params,currentDateTime, context); if(CollectionUtils.isNotEmpty(comboTousseWrapperInvoiceList)){ invoiceList.addAll(comboTousseWrapperInvoiceList); } @@ -734,6 +734,10 @@ throw new RuntimeException("test调试:" + comboTousseInvoiceDebugInfo); } context.setInvoiceList(invoiceList); + //在追溯系统中进行发货保存操作时,使用SDK的API将发货的器械包信息推送至集成平台的MQ队列。XKYY-244 + new Thread(() -> { + pushTousseInstanceAfterInvoice(context); + }).start(); return context; } /* @@ -1085,7 +1089,7 @@ currentDateTime,params,orgUnit,targetWarehouse, idToDisposableGoodsMap,idToDisposableGoodsBatchMap, invoiceOrigin,tousseDeliverOccasion, tousseInstanceIdToIsRoutineMap, - disposableGoodsStorageAdjustVoTotalList); + disposableGoodsStorageAdjustVoTotalList, context); invoiceList.addAll(invoiceExcludeComboTousseList); /* @@ -1103,8 +1107,28 @@ context.setInvoiceList(invoiceList); //添加标识牌实例的器械实例发货数据 addIdCardInstanceInstrumentInstanceInvoiceData(context); + //在追溯系统中进行发货保存操作时,使用SDK的API将发货的器械包信息推送至集成平台的MQ队列XKYY-244 + new Thread(() -> { + pushTousseInstanceAfterInvoice(context); + }).start(); return context; } + + /** + * 在追溯系统中进行发货保存操作时,使用SDK的API将发货的器械包信息推送至集成平台的MQ队列。XKYY-244 + * @param submitInvoiceContext + */ + private void pushTousseInstanceAfterInvoice(SubmitInvoiceContext submitInvoiceContext) { + if(tousseInstancePushDao == null + || submitInvoiceContext == null){ + return; + } + Collection tousseInstanceColl = submitInvoiceContext.getTousseInstancesToUpdate(); + if(CollectionUtils.isEmpty(tousseInstanceColl)){ + return; + } + tousseInstancePushDao.pushTousseInstanceAfterInvoice(tousseInstanceColl); + } /** * 根据聚合包实例提取出该聚合包对应的子包实例 @@ -4887,7 +4911,7 @@ Date currentDateTime , JSONObject params,OrgUnit orgUnit,WareHouse targetWarehouse, Map idToDisposableGoodsMap,Map idToDisposableGoodsBatchMap, String invoiceOrigin,String tousseDeliverOccasion,Map tousseInstanceIdToIsRoutineMap, - List disposableGoodsStorageAdjustVoTotalList){ + List disposableGoodsStorageAdjustVoTotalList, SubmitInvoiceContext context){ List invoiceList = new ArrayList(); //插入表数据的id字段名及值(sqlserver数据库的id列为自增长所以赋空值,即不需要指定id列,oracle数据库需要指定id列,且值为序列的值) String idColumnName = ""; @@ -4922,7 +4946,7 @@ idColumnName,idColumnValue,currentDateTime,params,orgUnit,targetWarehouse, invoiceOrigin, tousseDeliverOccasion, idToDisposableGoodsMap, idToDisposableGoodsBatchMap,idToInvoiceMap, tousseInstanceIdToIsRoutineMap, - disposableGoodsStorageAdjustVoTotalList); + disposableGoodsStorageAdjustVoTotalList,context); /*invoicePlanList.stream().forEach(invoicePlan -> { List> tousseItemMapList = @@ -5122,7 +5146,7 @@ JSONObject params,OrgUnit orgUnit,WareHouse targetWarehouse, String invoiceOrigin,String tousseDeliverOccasion, Map idToDisposableGoodsMap,Map idToDisposableGoodsBatchMap, - Map idToInvoiceMap,Map tousseInstanceIdToIsRoutineMap,List disposableGoodsStorageAdjustVoTotalList){ + Map idToInvoiceMap,Map tousseInstanceIdToIsRoutineMap,List disposableGoodsStorageAdjustVoTotalList,SubmitInvoiceContext context){ if(CollectionUtils.isEmpty(invoiceList)){ throw new SystemException("发货失败,未生成发货单."); } @@ -5587,6 +5611,16 @@ */ batchUpdateGoodsStockTableData(invoiceToInvoiceItemListMap,tousseItemToTdToTiListMapMap, params,orgUnit,targetWarehouse, idColumnName,idColumnValue); + + Set tousseInstancesToUpdate = context.getTousseInstancesToUpdate(); + tousseItemToTdToTiListMapMap.values().stream().forEach(map -> { + map.entrySet().forEach(entry -> { + List tiList = entry.getValue(); + if(CollectionUtils.isNotEmpty(tiList)){ + tousseInstancesToUpdate.addAll(tiList); + } + }); + }); } /* @@ -8544,7 +8578,7 @@ @SuppressWarnings("unchecked") private List invoiceWrapperComboTousse(Map idToComboTousseInstanceMap,Long invoicePlanId, String departCoding, String applyDate, String appFormType,String invoiceGroupByConfig, - String invoiceOrigin,String tousseDeliverOccasion,JSONObject params , Date currentDateTime){ + String invoiceOrigin,String tousseDeliverOccasion,JSONObject params , Date currentDateTime, SubmitInvoiceContext submitInvoiceContext){ if(MapUtils.isEmpty(idToComboTousseInstanceMap)){ return null; } @@ -8594,6 +8628,7 @@ OrgUnit orgunit = orgUnitManager.getByCode(departCoding); WareHouse wareHouse = wareHouseManager.getDefaultWareHouseByUnitCode(departCoding); OrgUnit settleAccountsDepartment = orgUnitManager.getSettleAccountsDepartment(departCoding); + Set tousseInstancesToUpdate = submitInvoiceContext.getTousseInstancesToUpdate(); for(Entry entry : idToComboTousseInstanceMap.entrySet()){ //聚合包包实例id Long comboTousseInstanceId = entry.getKey(); @@ -8673,6 +8708,8 @@ updateTousseInstanceMap.put("id", ti.getId()); updateTousseInstanceMapList.add(updateTousseInstanceMap); } + tousseInstancesToUpdate.add(comboTousseInstace); + tousseInstancesToUpdate.addAll(subTiList); index++; }