Index: ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManager.java =================================================================== diff -u -r36314 -r36558 --- ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManager.java (.../SterilizationRecordManager.java) (revision 36314) +++ ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManager.java (.../SterilizationRecordManager.java) (revision 36558) @@ -727,7 +727,13 @@ public JSONObject getBarcodeTypeByDisposableGoodsBatch(BarcodeDevice barcodeDevice); public void setRequest(HttpServletRequest request); + /** + * 设置是否使用新版本的二级供应室自动发货 + * @param useNewSecondSupplyRoomAutoInvoice + */ + public void setUseNewSecondSupplyRoomAutoInvoice(boolean useNewSecondSupplyRoomAutoInvoice); + /** * 获取匹配的灭菌记录id * @param beginStartTimeStr 开始时间 * @param endStartTimeStr 结束时间 Index: ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/action/SterilizationRecordAction.java =================================================================== diff -u -r36467 -r36558 --- ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/action/SterilizationRecordAction.java (.../SterilizationRecordAction.java) (revision 36467) +++ ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/action/SterilizationRecordAction.java (.../SterilizationRecordAction.java) (revision 36558) @@ -41,6 +41,7 @@ import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; @@ -76,6 +77,7 @@ import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseDefinitionManager; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseInstanceAdditionalInfoManagerImpl; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseInstanceManager; +import com.forgon.exception.InvoiceException; import com.forgon.exception.SterilingModeNotTheSameException; import com.forgon.exception.SystemException; import com.forgon.exception.UnScanSterilizationMonitoringPackageException; @@ -154,6 +156,7 @@ private TousseDefinitionManager tousseDefinitionManager; private SterilisationManager sterilisationManager; + private Logger logger = Logger.getLogger(getClass()); @Autowired private TousseInstanceAdditionalInfoManagerImpl tousseInstanceAdditionalInfoManagerImpl; public File[] getUploadFiles() { @@ -535,17 +538,32 @@ if(StringUtils.equals("true", needFinishConfirmStr)) { needFinishConfirm = true; } + JSONObject jsonResult = null; + Collection sterilizationRecordIds = null; + String orgUnitCode = null; try { sterilizationRecordManager.setRequest(StrutsParamUtils.getRequest()); - String orgUnitCode = AcegiHelper.getLoginUser() + orgUnitCode = AcegiHelper.getLoginUser() .getOrgUnitCodingFromSupplyRoomConfig(); - Collection sterilizationRecordIds = StringTools.parseToLongs( + sterilizationRecordIds = StringTools.parseToLongs( idsStr, ";"); - JSONObject jsonResult = null; + sterilizationRecordManager.setUseNewSecondSupplyRoomAutoInvoice(true); + logger.info("pc端灭菌完成时准备调用新版本二级供应室自动发货"); jsonResult = sterilizationRecordManager.completeSterilization( sterilizationRecordIds, orgUnitCode,null,finishComfirmer,needFinishConfirm, calcSterilizationResult); + logger.info("pc端灭菌完成时调用新版本二级供应室自动发货成功"); StrutsResponseUtils.output(jsonResult); + } catch (InvoiceException e) { + e.printStackTrace(); + logger.info("pc端灭菌完成时调用新版本二级供应室自动发货出现异常"); + sterilizationRecordManager.setUseNewSecondSupplyRoomAutoInvoice(false); + logger.info("pc端灭菌完成时准备调用旧版本二级供应室自动发货"); + jsonResult = sterilizationRecordManager.completeSterilization( + sterilizationRecordIds, orgUnitCode,null,finishComfirmer,needFinishConfirm, calcSterilizationResult); + logger.info("pc端灭菌完成时调用旧版本二级供应室自动发货成功"); + StrutsResponseUtils.output(jsonResult); } catch (Exception e) { + logger.info("pc端灭菌完成时操作发生异常" + e); e.printStackTrace(); StrutsResponseUtils.output(false, e.getMessage()); } @@ -590,16 +608,27 @@ if("true".equals(isConfirmShowUnloadStr)){ isConfirmShowUnload = true; } + Long sterilizationRecordId = null; + JSONObject jsonResult = null; try { + sterilizationRecordId = Long.valueOf(idStr); + sterilizationRecordManager.setUseNewSecondSupplyRoomAutoInvoice(true); + logger.info("pc端灭菌完成确认时准备调用新版本二级供应室自动发货"); sterilizationRecordManager.setRequest(StrutsParamUtils.getRequest()); -// String orgUnitCode = AcegiHelper.getLoginUser() -// .getOrgUnitCodingFromSupplyRoomConfig(); - Long sterilizationRecordId = Long.valueOf(idStr); - JSONObject jsonResult = null; jsonResult = sterilizationRecordManager.completeSterilizationConfirm( sterilizationRecordId, confirmUserName,barcodes,isConfirmShowUnload,completeBarcodes); + logger.info("pc端灭菌完成确认时调用新版本二级供应室自动发货成功"); StrutsResponseUtils.output(jsonResult); + } catch (InvoiceException e) { + e.printStackTrace(); + sterilizationRecordManager.setUseNewSecondSupplyRoomAutoInvoice(false); + logger.info("pc端灭菌完成确认时准备调用旧版本二级供应室自动发货"); + jsonResult = sterilizationRecordManager.completeSterilizationConfirm( + sterilizationRecordId, confirmUserName,barcodes,isConfirmShowUnload,completeBarcodes); + logger.info("pc端灭菌完成确认时调用旧版本二级供应室自动发货成功"); + StrutsResponseUtils.output(jsonResult); } catch (Exception e) { + logger.info("pc端灭菌完成确认时操作发生异常" + e); e.printStackTrace(); StrutsResponseUtils.output(false, e.getMessage()); } Index: ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java =================================================================== diff -u -r36505 -r36558 --- ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java (.../SterilizationRecordManagerImpl.java) (revision 36505) +++ ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java (.../SterilizationRecordManagerImpl.java) (revision 36558) @@ -20,6 +20,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; +import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; @@ -86,13 +87,17 @@ import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstanceAdditionalInfo; import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; import com.forgon.disinfectsystem.entity.customform.forminstance.FormInstance; +import com.forgon.disinfectsystem.entity.foreigntousseapplication.ForeignTousseApplication; import com.forgon.disinfectsystem.entity.goodsstock.GoodsStock; import com.forgon.disinfectsystem.entity.idcardinstance.IDCardInstance; import com.forgon.disinfectsystem.entity.invoicemanager.Invoice; +import com.forgon.disinfectsystem.entity.invoicemanager.InvoiceItem; +import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; import com.forgon.disinfectsystem.entity.packing.ReviewedBasket; import com.forgon.disinfectsystem.entity.qualitymonitoringmanager.qualitymonitoring.QualityMonitoringInstance; import com.forgon.disinfectsystem.entity.receiverecord.ReceiveRecord; import com.forgon.disinfectsystem.entity.sterilizationTransition.SterilizationTransitionItem; +import com.forgon.disinfectsystem.entity.sterilizationmanager.proxydisinfection.ProxyDisinfection; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationInterruptRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationRecordPic; @@ -124,6 +129,7 @@ import com.forgon.disinfectsystem.sterilizationmanager.sterilizationrecord.vo.SterilizationRecordPrintTousseItem; import com.forgon.disinfectsystem.sterilizationmanager.sterilizationunload.service.SterileUnloadScanTousseManager; import com.forgon.disinfectsystem.sterilizationmanager.sterilizerrecord.service.SenohSterilizerRecordManager; +import com.forgon.disinfectsystem.stockmanage.departmentstock.service.DepartmentStockManager; import com.forgon.disinfectsystem.tousse.imagefilemanager.service.ImageFileManager; import com.forgon.disinfectsystem.tousse.instrumentinstance.service.InstrumentInstanceManager; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseDefOptionalSterilizationManager; @@ -132,6 +138,7 @@ import com.forgon.disinfectsystem.vo.ItemDefinitionVO; import com.forgon.disinfectsystem.vo.SimpleInfoVo; import com.forgon.disinfectsystem.vo.TousseSimpleVO; +import com.forgon.exception.InvoiceException; import com.forgon.exception.SterilingModeNotTheSameException; import com.forgon.exception.SystemException; import com.forgon.exception.UnScanSterilizationMonitoringPackageException; @@ -221,6 +228,7 @@ private IDCardInstanceManager idCardInstanceManager; private InstrumentInstanceManager instrumentInstanceManager; private ReceiveRecordManager receiveRecordManager; + private DepartmentStockManager departmentStockManager; /** * http请求对象 @@ -229,6 +237,18 @@ private InvoiceManager invoiceOptimizeManager; + /** + * 是否使用新版的二级供应室自动发货(处理广东省中医等项目的现场场景引起的问题) + * 默认先用新版本进行二级供应室自动发货,如果在action调用时出现了异常,再调用旧版的方式 + * 1.先使用新版本的二级供应室自动发货方式时,灭菌完成的事务单独处理并提交掉,发货的事务单独放在一个事务中,便于在action/serviceManager调用时报发货的异常(InvoiceException)后再调用旧版本的二级供应室自动发货方式 + * 2.第1步的新版本调用异常后再使用旧版本的二级供应室自动发货方式,此时不再调用灭菌完成的业务方法(因为第1步用新版本调用时已经完成了) + */ + private boolean useNewSecondSupplyRoomAutoInvoice = true; + + public void setUseNewSecondSupplyRoomAutoInvoice( + boolean useNewSecondSupplyRoomAutoInvoice) { + this.useNewSecondSupplyRoomAutoInvoice = useNewSecondSupplyRoomAutoInvoice; + } private TousseDefOptionalSterilizationManager tousseDefOptionalSterilizationManager; public void setTousseDefOptionalSterilizationManager( TousseDefOptionalSterilizationManager tousseDefOptionalSterilizationManager) { @@ -364,6 +384,11 @@ public void setInvoiceOptimizeManager(InvoiceManager invoiceOptimizeManager) { this.invoiceOptimizeManager = invoiceOptimizeManager; } + public void setDepartmentStockManager( + DepartmentStockManager departmentStockManager) { + this.departmentStockManager = departmentStockManager; + } + /** * 更新旧的灭菌记录 有时器械包在灭菌后不合格需要重新灭菌,并非该炉灭菌失败,而是某几个器械包需要重新灭菌 * 这时需要将这些器械包重新扫入灭菌记录中,并用新的灭菌记录覆盖旧的灭菌记录 @@ -778,12 +803,15 @@ String finishOperater, String finishComfirmer, boolean needFinishConfirm, boolean calcSterilizationResult) { JSONObject result = JSONUtil.buildJsonObject(true, "完成灭菌。"); - runWithTransNewManager.runWith_TRANS_NEW(new RunWithTransNewTask() { - @Override - public void runTask() { - completeSterilization(sterilizationRecordIds, orgUnitCode, finishOperater, finishComfirmer, needFinishConfirm, calcSterilizationResult, null); - } - }); + //使用新版本二级供应室自动发货时必须要先单独把事务提交掉,否则到发货那里器械包状态还是灭菌中的状态导致发不了货 + if(useNewSecondSupplyRoomAutoInvoice){ + runWithTransNewManager.runWith_TRANS_NEW(new RunWithTransNewTask() { + @Override + public void runTask() { + completeSterilization(sterilizationRecordIds, orgUnitCode, finishOperater, finishComfirmer, needFinishConfirm, calcSterilizationResult, null); + } + }); + } //如果符合二级供应室发货的条件,则执行二级供应室自动发货 if(isSecondSupplyRoomAutoInvoice(orgUnitCode,needFinishConfirm)){ WareHouse defaultWareHouse = wareHouseManager.getDefaultWareHouseByUnitCode(orgUnitCode); @@ -824,12 +852,15 @@ @Override public JSONObject completeSterilizationConfirm(Long sterilizationRecordId, String confirmName,String barcodes,boolean isConfirmShowUnload,String completeBarcodes){ JSONObject result = JSONUtil.buildJsonObject(true, "完成灭菌。"); - runWithTransNewManager.runWith_TRANS_NEW(new RunWithTransNewTask() { - @Override - public void runTask() { - completeSterilizationConfirmImpl(sterilizationRecordId, confirmName, barcodes, isConfirmShowUnload, completeBarcodes); - } - }); + //使用新版本二级供应室自动发货时必须要先单独把事务提交掉,否则到发货那里器械包状态还是灭菌中的状态导致发不了货 + if(useNewSecondSupplyRoomAutoInvoice){ + runWithTransNewManager.runWith_TRANS_NEW(new RunWithTransNewTask() { + @Override + public void runTask() { + completeSterilizationConfirmImpl(sterilizationRecordId, confirmName, barcodes, isConfirmShowUnload, completeBarcodes); + } + }); + } String orgUnitCode = AcegiHelper.getCurrentOrgUnitCode(); //如果符合二级供应室发货的条件,则执行二级供应室自动发货 if(isSecondSupplyRoomAutoInvoice(orgUnitCode,false)){ @@ -3876,28 +3907,364 @@ //extractTousseInvoice(tousseInstances,deptName,deptCode); //生成外来器械包的发货单 //extractForeignTousseInvoice(foreignTousseInstances,deptName,deptCode); - List allTousseInstanceListOfSterilizationRecord = new ArrayList(); - if(CollectionUtils.isNotEmpty(tousseInstances)){ - allTousseInstanceListOfSterilizationRecord.addAll(tousseInstances); + //非外来器械包包实例集合或外来器械包包实例集合其中一个不为空时,则调用下面的方法 + if(CollectionUtils.isNotEmpty(tousseInstances) || CollectionUtils.isNotEmpty(foreignTousseInstances)){ + return autoInvoiceAfterSterilizationCompleteFinish(tousseInstances, foreignTousseInstances, deptName, deptCode,defaultWareHouse); } - if(CollectionUtils.isNotEmpty(foreignTousseInstances)){ - allTousseInstanceListOfSterilizationRecord.addAll(foreignTousseInstances); - } - if(CollectionUtils.isNotEmpty(allTousseInstanceListOfSterilizationRecord)){ - return autoInvoiceAfterSterilizationCompleteFinish(allTousseInstanceListOfSterilizationRecord, deptName, deptCode,defaultWareHouse); - } return JSONUtil.buildJsonObject(true); } /** + * 之前老的二级供应室自动发货的方式,现在将之前被删除的代码再找回来重新整合封装下 + * @param tousseInstances 非外来器械包的包实例集合 + * @param foreignTousseInstances 外来器械包的包实例集合 + * @param deptName 科室名称 + * @param deptCode 科室编码 + */ + private void extractAllTousseInvoice(List tousseInstances, List foreignTousseInstances, + String deptName, String deptCode){ + //生成普通器械包的发货单 + extractTousseInvoice(tousseInstances,deptName,deptCode); + //生成外来器械包的发货单 + extractForeignTousseInvoice(foreignTousseInstances,deptName,deptCode); + } + + /** + * 生成外来器械包的发货单. + * @param foreignTousseInstances + * @param deptName + * @param deptCode + */ + private void extractForeignTousseInvoice( + List foreignTousseInstances, String deptName, + String deptCode) { + if (foreignTousseInstances.size() > 0) { + Map> foreignTousseApplications = new HashMap>(); + for (TousseInstance instance : foreignTousseInstances) { + ForeignTousseApplication application = (ForeignTousseApplication) objectDao + .getByProperty(ForeignTousseApplication.class + .getSimpleName(), "id", instance + .getForeignTousseApp_id()); + + if (foreignTousseApplications.get(application) == null) { + List instanceOfForeignTousseApplication = new ArrayList(); + instanceOfForeignTousseApplication.add(instance); + foreignTousseApplications.put(application, + instanceOfForeignTousseApplication); + } else { + foreignTousseApplications.get(application).add(instance); + } + } + //String notSignedItemsCanRegistUseRecord = CssdUtils.getSystemSetConfigByName("notSignedItemsCanRegistUseRecord"); + for (ForeignTousseApplication application : foreignTousseApplications + .keySet()) { + Invoice invoice = new Invoice(); + invoice.setSerialNumber(serialNumManager + .getSerialNumberStr(SerialNum.TYPE_INVOICE)); + invoice.setSender(AcegiHelper.getLoginUser().getUserFullName()); + invoice.setSendTime(new Date()); + invoice.setApplicant(application.getApplicant()); + invoice.setApplicationTime(application.getApplicationTime()); + invoice.setDepart(deptName); + invoice.setSettleAccountsDepart(deptName); + invoice.setOrgUnitCoding(AcegiHelper.getLoginUser() + .getCurrentOrgUnitCode()); + invoice.setStatus(Invoice.STATUS_DELIVERED); + invoice.setRemark("二级供应室自动发货"); + List tousseInstanceList = foreignTousseApplications + .get(application); + Double foreignToussePrice = supplyRoomConfigManager + .getSystemParamsObj().getForeignToussePrice(); + invoice.setTotalPrice(new BigDecimal(foreignToussePrice) + .multiply( + new BigDecimal(foreignTousseApplications.get( + application).size() + + "")).doubleValue()); + Set items = new HashSet(); + for (TousseInstance instance : foreignTousseApplications + .get(application)) { + InvoiceItem item = new InvoiceItem(); + item.setTousseName(instance.getTousseName()); + TousseDefinition tousseDefinition = instance.getTousseDefinition(); + item.setTousseDefinitionId(tousseDefinition.getId()); + item.setMaterialAmount(tousseDefinition.getMaterialAmount()); + item.setDiposable("否"); + item.setTousseType(tousseDefinition.getTousseType()); + item.setAmount(1); + if(instance.getUrgentLevel() != null){ + invoice.setUrgent(Constants.STR_YES); + } + items.add(item); + } + invoice.setInvoiceItem(items); + invoice.setInvoicePlan(application); + invoice.setTousseAmount(tousseInstanceList.size()); + Integer tousseNotDeliveredAmount = objectDao.countObjectBySql( + TousseInstance.class.getName(), + "where po.foreignTousseApp_id =" + + application.getId()); + if (application.getInvoice() != null) { + for (Invoice invoiceOfApplication : application + .getInvoice()) { + tousseNotDeliveredAmount -= invoiceOfApplication + .getTousseAmount(); + } + } + //全部发货 + if (tousseNotDeliveredAmount - invoice.getTousseAmount() == 0) { + application + .setDeliverStatus(InvoicePlan.DELIVERSTATUS_DELIVERED); + application.setOrderByFiled(InvoicePlan.DELIVER_DELIVERED); + } else if (tousseNotDeliveredAmount - invoice.getTousseAmount() > 0) { + application + .setDeliverStatus(InvoicePlan.DELIVERSTATUS_PARTDELIVERED); + application.setOrderByFiled(InvoicePlan.DELIVER_PARTDELIVERED); + } + objectDao.saveOrUpdate(application); + for (TousseInstance tousseInstance : tousseInstanceList) { + tousseInstance.setStatus(TousseInstance.STATUS_SHIPPED); + //如果config.js配置需要签收才能录使用记录时,则该包自动发货后状态变为已签收(仅针对二级供应室自动发货的情况做如此处理) + //if("false".equalsIgnoreCase(notSignedItemsCanRegistUseRecord)){ + TousseDefinition td = tousseInstance.getTousseDefinition(); + TousseDefinition ancestor = td; + if(td.isSplit() && DatabaseUtil.isPoIdValid(td.getParentID())){ + td = (TousseDefinition) objectDao.getById(TousseDefinition.class.getSimpleName(), td.getParentID()); + } + Long ancestorId = td.getAncestorID(); + if(DatabaseUtil.isPoIdValid(ancestorId)){ + ancestor = (TousseDefinition) objectDao.getById(TousseDefinition.class.getSimpleName(), ancestorId); + } + if(Constants.STR_YES.equals(ancestor.getRegistUseRecordAfterSigned())){ + tousseInstance.setStatus(TousseInstance.STATUS_SIGNED); + tousseInstance.setSignedDate(new Date()); + tousseInstance.setSignedUser("二级供应室发货系统自动签收"); + } + tousseInstance.setLocation(deptCode); + tousseInstance.setLocationForDisplay(deptName); + //结算科室赋值为所在位置,解决不能退货的问题 + tousseInstance.setSettleAccountsDepartCode(deptCode); + tousseInstance.setSettleAccountsDepart(deptName); + tousseInstanceManager.save(tousseInstance); + } + objectDao.saveOrUpdate(invoice); + } + } + } + + /** + * 生成普通器械包的发货单. + * @param tousseInstances + * @param deptName + * @param deptCode + */ + private void extractTousseInvoice(List tousseInstances,String deptName,String deptCode) { + if (tousseInstances.size() > 0) { + Invoice invoice = new Invoice(); + invoice.setSerialNumber(serialNumManager + .getSerialNumberStr(SerialNum.TYPE_INVOICE)); + invoice.setSender(AcegiHelper.getLoginUser().getUserFullName()); + invoice.setSendTime(new Date()); + invoice.setDepart(deptName); + invoice.setDepartCoding(deptCode); + invoice.setSettleAccountsDepart(deptName); + invoice.setSettleAccountsDepartCoding(deptCode); + invoice.setOrgUnitCoding(AcegiHelper.getLoginUser() + .getCurrentOrgUnitCode()); + invoice.setStatus(Invoice.STATUS_DELIVERED); + invoice.setRemark("二级供应室自动发货"); + objectDao.saveOrUpdate(invoice); + Map map = new HashMap(); + Double totalPrice = 0.0; + Map> tousseNameTousseInstances = new HashMap>(); + Map proxyDisinfectionMap = new HashMap(); + boolean containTousseInstance = false; + //String notSignedItemsCanRegistUseRecord = CssdUtils.getSystemSetConfigByName("notSignedItemsCanRegistUseRecord"); + Map tousseNameAndIdMap = new HashMap(); + for (TousseInstance tousseInstance : tousseInstances) { + //如果该器械包实例是代理灭菌单内的包实例、且代理灭菌单的是否二次发货为"是",包实例的状态修改为"已灭菌",否则修改为"已发货" + Long proxyDisinfectionId = tousseInstance.getProxyDisinfection_id(); + TousseDefinition td = tousseInstance.getTousseDefinition(); + TousseDefinition ancestor = td; + Long ancestorId = td.getAncestorID(); + if(DatabaseUtil.isPoIdValid(ancestorId)){ + ancestor = (TousseDefinition) objectDao.getById(TousseDefinition.class.getSimpleName(), ancestorId); + } + if(DatabaseUtil.isPoIdValid(proxyDisinfectionId)){ + ProxyDisinfection proxyDisinfection = null; + if(proxyDisinfectionMap.containsKey(proxyDisinfectionId)){ + proxyDisinfection = proxyDisinfectionMap.get(proxyDisinfectionId); + }else{ + proxyDisinfection = (ProxyDisinfection)objectDao.getByProperty(ProxyDisinfection.class.getSimpleName(), "id", proxyDisinfectionId); + } + proxyDisinfectionMap.put(proxyDisinfectionId, proxyDisinfection); + if(proxyDisinfection != null && proxyDisinfection.canResendout()){ + tousseInstance.setStatus(TousseInstance.STATUS_STERILED); + }else{ + tousseInstance.setStatus(TousseInstance.STATUS_SHIPPED); + //如果config.js配置需要签收才能录使用记录时,则该包自动发货后状态变为已签收(仅针对二级供应室自动发货的情况做如此处理) + //if("false".equalsIgnoreCase(notSignedItemsCanRegistUseRecord)){ + if(Constants.STR_YES.equals(ancestor.getRegistUseRecordAfterSigned())){ + tousseInstance.setStatus(TousseInstance.STATUS_SIGNED); + tousseInstance.setSignedDate(new Date()); + tousseInstance.setSignedUser("二级供应室发货系统自动签收"); + if(TousseDefinition.canAddDepartmentStock(td)){ + tousseNameAndIdMap.put(td.getName(), td.getAncestorID()); + } + } + } + }else{ + tousseInstance.setStatus(TousseInstance.STATUS_SHIPPED); + //如果config.js配置需要签收才能录使用记录时,则该包自动发货后状态变为已签收(仅针对二级供应室自动发货的情况做如此处理) + //if("false".equalsIgnoreCase(notSignedItemsCanRegistUseRecord)){ + if(Constants.STR_YES.equals(ancestor.getRegistUseRecordAfterSigned())){ + tousseInstance.setStatus(TousseInstance.STATUS_SIGNED); + tousseInstance.setSignedDate(new Date()); + tousseInstance.setSignedUser("二级供应室发货系统自动签收"); + if(TousseDefinition.canAddDepartmentStock(td)){ + tousseNameAndIdMap.put(td.getName(), td.getAncestorID()); + } + } + } + + tousseInstance.setLocation(deptCode); + tousseInstance.setLocationForDisplay(deptName); + //结算科室赋值为所在位置,解决不能退货的问题 + tousseInstance.setSettleAccountsDepartCode(deptCode); + tousseInstance.setSettleAccountsDepart(deptName); + tousseInstance.setInvoice_id(invoice.getId()); + tousseInstanceManager.save(tousseInstance); + if(tousseInstance.getUrgentLevel() != null && !containTousseInstance && Constants.STR_YES.equals(invoice.getUrgent())){ + containTousseInstance = true; + invoice.setUrgent(Constants.STR_YES); + } + //包实例价格及折扣价 + Double tousseInstancePrice = tousseInstance.getPrice(); + Double tousseInstanceDiscountPrice = tousseInstance.getDiscountPrice(); + totalPrice = MathTools.add(totalPrice, tousseInstance.getPrice()).doubleValue(); + InvoiceItem item = map.get(tousseInstance.getTousseName()); + if (item == null) { + item = new InvoiceItem(); + item.setTousseName(tousseInstance.getTousseName()); + item.setTousseDefinitionId(td.getId()); + item.setMaterialAmount(td.getMaterialAmount()); + item.setDiposable("否"); + item.setTousseType(td.getTousseType()); + item.setAmount(1); + item.setSettlementPrice(tousseInstancePrice); + item.setSettlementDiscountPrice(tousseInstanceDiscountPrice); + map.put(item.getTousseName(), item); + } else { + item.setAmount(item.getAmount() + 1); + item.setSettlementPrice(MathTools.add(item.getSettlementPrice(), tousseInstancePrice).doubleValue()); + item.setSettlementDiscountPrice(MathTools.add(item.getSettlementDiscountPrice(), tousseInstanceDiscountPrice).doubleValue()); + } + // 普通器械包 + if (TousseDefinition.PACKAGE_TYPE_INSIDE.equals(tousseInstance + .getTousseDefinition().getTousseType())){ + List tis = tousseNameTousseInstances.get(tousseInstance.getTousseName()); + if(tis == null){ + tis = new LinkedList(); + tousseNameTousseInstances.put(tousseInstance.getTousseName(), tis); + } + tis.add(tousseInstance); + } + } + + //往临床科室仓库添加库存 + WareHouse defaultWareHouse = wareHouseManager.getDefaultWareHouseByUnitCode(deptCode); + List goodsStockList = new ArrayList(); + for (TousseInstance tousseInstance : tousseInstances) { + if(tousseInstance.getComboTousseInstanceId() == null){ + goodsStockManager.addToList(goodsStockList, tousseInstance, defaultWareHouse); + tousseInstanceManager.setToWarehouse(tousseInstance, defaultWareHouse); + } + } + try { + if(CollectionUtils.isNotEmpty(goodsStockList)){ + goodsStockManager.saveOrUpdateGoodsStock(goodsStockList, GoodsStockManager.MODE_INSTOCK); + } + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e.getMessage()); + } + + /**更新手术室二级库存**/ + //废弃原因:二级库存已改为基数管理 + /* List list = supplyRoomConfigManager + .getSupplyRoomList(SupplyRoomConfig.SUPPLYROOM_TYPE_SECOND_SUPPLYROOM); + String departmentCoding = ""; + String departmentName = ""; + if (list != null && list.size() > 0) { + departmentCoding = list.get(0).getOrgUnitCoding(); + departmentName = list.get(0).getOrgUnitName(); + } + departmentStockManager.addInsideTousseDepartmentStock(tousseNameTousseInstances, departmentCoding, departmentName);*/ + + Set items = new HashSet(); + items.addAll(map.values()); + invoice.setInvoiceItem(items); + invoice.setTotalPrice(totalPrice); + invoice.setTousseAmount(tousseInstances.size()); + objectDao.saveOrUpdate(invoice); + //重新计算代理灭菌单的发货状态(之前是有的,不知道现在还需要不需要,需要小黎确认) + reCalProxyDisinfecttionDeliverStatus(tousseInstances); + //基数管理添加科室库存(之前是有的,不知道现在还需要不需要,需要小黎确认) + if(MapUtils.isNotEmpty(tousseNameAndIdMap)){ + departmentStockManager.instrumentSetToBeAdded(deptName, deptCode, tousseNameAndIdMap); + } + } + } + + /** + * 根据器械包实例集合重新计算代理灭菌单的发货状态(用于二级供应室灭菌后自动发货时调用) + * @param tousseInstances 器械包实例集合 + */ + private void reCalProxyDisinfecttionDeliverStatus(List tousseInstances){ + if(CollectionUtils.isNotEmpty(tousseInstances)){ + List proxyDisinfecttionIdList = null; + for (TousseInstance tousseInstance : tousseInstances) { + if(DatabaseUtil.isPoIdValid(tousseInstance.getProxyDisinfection_id())){ + if(proxyDisinfecttionIdList == null){ + proxyDisinfecttionIdList = new ArrayList(); + } + if(!proxyDisinfecttionIdList.contains(tousseInstance.getProxyDisinfection_id())){ + proxyDisinfecttionIdList.add(tousseInstance.getProxyDisinfection_id()); + } + } + } + if(CollectionUtils.isNotEmpty(proxyDisinfecttionIdList)){ + String updateSql = String.format("update %s set deliverStatus=%s where %s" , + InvoicePlan.class.getSimpleName(), + "(case " + + "when (select count(0) from TousseInstance ti where ti.proxyDisinfection_id=invoicePlan.id and ti.invoice_id is not null and ti.status <> '"+ TousseInstance.STATUS_DISCARD +"') > 0 and (select count(0) from TousseInstance ti where ti.proxyDisinfection_id=invoicePlan.id and ti.invoice_id is null and ti.status <> '"+ TousseInstance.STATUS_DISCARD +"') > 0 then '"+ InvoicePlan.DELIVER_PARTDELIVERED +"' " + + "when (select count(0) from TousseInstance ti where ti.proxyDisinfection_id=invoicePlan.id and ti.invoice_id is not null and ti.status <> '"+ TousseInstance.STATUS_DISCARD +"') > 0 and (select count(0) from TousseInstance ti where ti.proxyDisinfection_id=invoicePlan.id and ti.invoice_id is null and ti.status <> '"+ TousseInstance.STATUS_DISCARD +"') = 0 then '"+ InvoicePlan.DELIVERSTATUS_DELIVERED +"' " + + "when (select count(0) from TousseInstance ti where ti.proxyDisinfection_id=invoicePlan.id and ti.invoice_id is not null and ti.status <> '"+ TousseInstance.STATUS_DISCARD +"') = 0 and (select count(0) from TousseInstance ti where ti.proxyDisinfection_id=invoicePlan.id and ti.invoice_id is null and ti.status <> '"+ TousseInstance.STATUS_DISCARD +"') > 0 then '"+ InvoicePlan.DELIVERSTATUS_AWAITDELIVER +"' " + + "when (select count(0) from TousseInstance ti where ti.proxyDisinfection_id=invoicePlan.id and ti.invoice_id is not null and ti.status <> '"+ TousseInstance.STATUS_DISCARD +"') = 0 and (select count(0) from TousseInstance ti where ti.proxyDisinfection_id=invoicePlan.id and ti.invoice_id is null and ti.status <> '"+ TousseInstance.STATUS_DISCARD +"') = 0 then '' " + + " else '' " + + "end)", + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("id", proxyDisinfecttionIdList)); + objectDao.excuteSQL(updateSql); + } + } + } + + /** * 二级供应室自动发货后调用科室的发货计划发货的接口 - * @param allTousseInstanceListOfSterilizationRecord + * @param tousseInstances + * @param foreignTousseInstances * @param deptName * @param deptCode * @return */ - private JSONObject autoInvoiceAfterSterilizationCompleteFinish(List allTousseInstanceListOfSterilizationRecord, String deptName, + private JSONObject autoInvoiceAfterSterilizationCompleteFinish(List tousseInstances, List foreignTousseInstances, String deptName, String deptCode,WareHouse defaultWareHouse){ + List allTousseInstanceListOfSterilizationRecord = new ArrayList(); + if(CollectionUtils.isNotEmpty(tousseInstances)){ + allTousseInstanceListOfSterilizationRecord.addAll(tousseInstances); + } + if(CollectionUtils.isNotEmpty(foreignTousseInstances)){ + allTousseInstanceListOfSterilizationRecord.addAll(foreignTousseInstances); + } if(CollectionUtils.isNotEmpty(allTousseInstanceListOfSterilizationRecord)){ //发货物品明细:示例如[{"barcode":"010641005","sendAmount":1},{"barcode":"010641005","sendAmount":1}] JSONArray invoiceItemArray = new JSONArray(); @@ -3908,7 +4275,21 @@ invoiceItemArray.add(obj); } // return execAutoInvoiceByPostingInvoiceActionRequest(deptName, deptCode, defaultWareHouse, invoiceItemArray); - execAutoInvoiceByInvokingInvoiceManagerMethod(deptName, deptCode, defaultWareHouse, invoiceItemArray); + //spring事务机制不允许一个业务方法调用链过程中对异常捕捉后处理,捕捉异常后必须抛至上层(action,serviceManager,junit的test类的方法调用等) + /*try{ + execAutoInvoiceByInvokingInvoiceManagerMethod(deptName, deptCode, defaultWareHouse, invoiceItemArray); + }catch(Exception e){ + extractAllTousseInvoice(tousseInstances, foreignTousseInstances, deptName, deptCode); + }*/ + if(useNewSecondSupplyRoomAutoInvoice){ + try{ + execAutoInvoiceByInvokingInvoiceManagerMethod(deptName, deptCode, defaultWareHouse, invoiceItemArray); + }catch(SystemException e){ + throw new InvoiceException(e.getMessage()); + } + }else{ + extractAllTousseInvoice(tousseInstances, foreignTousseInstances, deptName, deptCode); + } } return JSONUtil.buildJsonObject(true); } @@ -3974,6 +4355,8 @@ invoiceParams.put("sourceWarehouseId", defaultWareHouse.getId()); invoiceParams.put("sourceWarehouseName", defaultWareHouse.getName()); //发货的备注(用户可以输入的内容) + invoiceParams.put("invoiceRemark", "二级供应室自动发货"); + //发货的明细 invoiceParams.put("invoiceItems", invoiceItemArray); invoiceOptimizeManager.submitInvoice(invoiceParams); } Index: ssts-webservice/src/main/java/com/forgon/disinfectsystem/webservice/service/ServiceManagerImpl.java =================================================================== diff -u -r36553 -r36558 --- ssts-webservice/src/main/java/com/forgon/disinfectsystem/webservice/service/ServiceManagerImpl.java (.../ServiceManagerImpl.java) (revision 36553) +++ ssts-webservice/src/main/java/com/forgon/disinfectsystem/webservice/service/ServiceManagerImpl.java (.../ServiceManagerImpl.java) (revision 36558) @@ -194,6 +194,7 @@ import com.forgon.disinfectsystem.washanddisinfectmanager.washanddisinfectrecord.service.WashAndDisinfectRecordManager; import com.forgon.exception.BorrowUnRecturnException; import com.forgon.exception.CleanMethodNotTheSameException; +import com.forgon.exception.InvoiceException; import com.forgon.exception.OperationException; import com.forgon.exception.SterilingModeNotTheSameException; import com.forgon.exception.SystemException; @@ -3424,8 +3425,22 @@ if (SterilizationRecord.STERILIZATION_STATUS_END.equals(status)) { String finishOperator = AcegiHelper.getLoginUserFullName(); - sterilizationRecordManager.completeSterilization(sterileRecordIds, - departCode,finishOperator,finishOperator,CssdUtils.getSystemSetConfigByNameBool("sterilizationRecordFinishConfirm"),false); + boolean sterilizationRecordFinishConfirm = CssdUtils.getSystemSetConfigByNameBool("sterilizationRecordFinishConfirm"); + try{ + sterilizationRecordManager.setUseNewSecondSupplyRoomAutoInvoice(true); + logger.info("pda端灭菌完成时准备调用新版本二级供应室自动发货"); + sterilizationRecordManager.completeSterilization(sterileRecordIds, + departCode,finishOperator,finishOperator,sterilizationRecordFinishConfirm,false); + logger.info("pda端灭菌完成时调用新版本二级供应室自动发货成功"); + }catch (InvoiceException e) { + e.printStackTrace(); + logger.info("pda端灭菌完成时调用新版本二级供应室自动发货出现异常"); + sterilizationRecordManager.setUseNewSecondSupplyRoomAutoInvoice(false); + logger.info("pda端灭菌完成时准备调用旧版本二级供应室自动发货"); + sterilizationRecordManager.completeSterilization(sterileRecordIds, + departCode,finishOperator,finishOperator,sterilizationRecordFinishConfirm,false); + logger.info("pda端灭菌完成时调用旧版本二级供应室自动发货成功"); + } } else if (SterilizationRecord.STERILIZATION_STATUS_FAILURE .equals(status)) { sterilizationRecordManager Index: forgon-tools/src/main/java/com/forgon/exception/InvoiceException.java =================================================================== diff -u --- forgon-tools/src/main/java/com/forgon/exception/InvoiceException.java (revision 0) +++ forgon-tools/src/main/java/com/forgon/exception/InvoiceException.java (revision 36558) @@ -0,0 +1,21 @@ +package com.forgon.exception; + +/** + * 发货异常 + * @author syf + * @since 2023-08-12 + * + */ +public class InvoiceException extends SystemException { + + private static final long serialVersionUID = 6761169099471844913L; + + public InvoiceException(String message) { + super(message); + } + + public InvoiceException(String message, Throwable cause) { + super(message, cause); + } + +}