Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/instrumentinstance/service/InstrumentInstanceManagerImpl.java =================================================================== diff -u -r34684 -r34690 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/instrumentinstance/service/InstrumentInstanceManagerImpl.java (.../InstrumentInstanceManagerImpl.java) (revision 34684) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/instrumentinstance/service/InstrumentInstanceManagerImpl.java (.../InstrumentInstanceManagerImpl.java) (revision 34690) @@ -3,7 +3,9 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.SQLType; import java.sql.Timestamp; +import java.sql.Types; import java.util.ArrayList; import java.util.Comparator; import java.util.Date; @@ -108,6 +110,27 @@ //追溯环节的class对象对应标识牌是否产生及重新的新的包实例的map Map classToHasGenerateNewTousseInstanceMap = new HashMap(); + /** + * 给全局的map对象设置初始值 + */ + private void putInitMapValue(){ + classToClassNameMap.put(RecyclingRecord.class, RecyclingRecord.class.getSimpleName()); + classToClassNameMap.put(WashAndDisinfectRecord.class, WashAndDisinfectRecord.class.getSimpleName()); + classToClassNameMap.put(PackingRecord.class, PackingRecord.class.getSimpleName()); + classToClassNameMap.put(SterilizationRecord.class, SterilizationRecord.class.getSimpleName()); + classToClassNameMap.put(Invoice.class, Invoice.class.getSimpleName()); + classToClassNameMap.put(SignRecord.class, SignRecord.class.getSimpleName()); + classToClassNameMap.put(UseRecord.class, UseRecord.class.getSimpleName()); + + classToHasGenerateNewTousseInstanceMap.put(RecyclingRecord.class, false); + classToHasGenerateNewTousseInstanceMap.put(WashAndDisinfectRecord.class, false); + classToHasGenerateNewTousseInstanceMap.put(PackingRecord.class, false); + classToHasGenerateNewTousseInstanceMap.put(SterilizationRecord.class, false); + classToHasGenerateNewTousseInstanceMap.put(Invoice.class, false); + classToHasGenerateNewTousseInstanceMap.put(SignRecord.class, false); + classToHasGenerateNewTousseInstanceMap.put(UseRecord.class, false); + } + @Override public void addOrRemoveInstrumentInstanceBusinessData(InstrumentInstanceManager.operateTypeEnum operateType, Class cls, Long recordId, List idCardInstanceList, @@ -134,6 +157,7 @@ && !StringUtils.equals(cls.getSimpleName(), UseRecord.class.getSimpleName())){ throw new SystemException("无效参数cls的值" + operateType); } + putInitMapValue(); //5.查出所有标识牌实例对应绑定的器械实例及器械实例的最新的器械循环实例(带锁) //6.逐一检查各标识牌实例当前绑定的器械实例是否完整,如不完整,阻止其业务并抛异常消息至前端进行提示 //7.检查各器械实例的最新循环实例的追溯环节数据,决定是否需要重新创建新的器械循环实例 @@ -145,21 +169,10 @@ }else{ throw new SystemException("无效参数operateType的值" + operateType); } - classToClassNameMap.put(RecyclingRecord.class, RecyclingRecord.class.getSimpleName()); - classToClassNameMap.put(WashAndDisinfectRecord.class, WashAndDisinfectRecord.class.getSimpleName()); - classToClassNameMap.put(PackingRecord.class, PackingRecord.class.getSimpleName()); - classToClassNameMap.put(SterilizationRecord.class, SterilizationRecord.class.getSimpleName()); - classToClassNameMap.put(Invoice.class, Invoice.class.getSimpleName()); - classToClassNameMap.put(SignRecord.class, SignRecord.class.getSimpleName()); - classToClassNameMap.put(UseRecord.class, UseRecord.class.getSimpleName()); - classToHasGenerateNewTousseInstanceMap.put(RecyclingRecord.class, false); - classToHasGenerateNewTousseInstanceMap.put(WashAndDisinfectRecord.class, false); - classToHasGenerateNewTousseInstanceMap.put(PackingRecord.class, false); - classToHasGenerateNewTousseInstanceMap.put(SterilizationRecord.class, false); - classToHasGenerateNewTousseInstanceMap.put(Invoice.class, false); - classToHasGenerateNewTousseInstanceMap.put(SignRecord.class, false); - classToHasGenerateNewTousseInstanceMap.put(UseRecord.class, false); + if(1==1){ +// throw new SystemException("test...."); + } } /** @@ -338,15 +351,60 @@ Map map = CollectionUtils.get(mapList, i); ps.setLong(1, (Long)map.get("instrumentInstanceId")); ps.setLong(2, (Long)map.get("idCardInstanceId")); - ps.setLong(3, (Long)map.get("tousseInstanceId")); - ps.setLong(4, (Long)map.get("lastCycleInstanceId")); - ps.setLong(5, (Long)map.get("recyclingRecordId")); - ps.setLong(6, (Long)map.get("packingRecordId")); - ps.setLong(7, (Long)map.get("sterilizationRecordId")); - ps.setLong(8, (Long)map.get("invoiceId")); - ps.setLong(9, (Long)map.get("secondInvoiceId")); - ps.setLong(10, (Long)map.get("signRecordId")); - ps.setLong(11, (Long)map.get("useRecordId")); + Long tousseInstanceId = (Long)map.get("tousseInstanceId"); + if(DatabaseUtil.isPoIdValid(tousseInstanceId)){ + ps.setLong(3, tousseInstanceId); + }else{ + ps.setNull(3, Types.BIGINT); + } + Long lastCycleInstanceId = (Long)map.get("lastCycleInstanceId"); + if(DatabaseUtil.isPoIdValid(lastCycleInstanceId)){ + ps.setLong(4, lastCycleInstanceId); + }else{ + ps.setNull(4, Types.BIGINT); + } + Long recyclingRecordId = (Long)map.get("recyclingRecordId"); + if(DatabaseUtil.isPoIdValid(recyclingRecordId)){ + ps.setLong(5, recyclingRecordId); + }else{ + ps.setNull(5, Types.BIGINT); + } + Long packingRecordId = (Long)map.get("packingRecordId"); + if(DatabaseUtil.isPoIdValid(packingRecordId)){ + ps.setLong(6, packingRecordId); + }else{ + ps.setNull(6, Types.BIGINT); + } + Long sterilizationRecordId = (Long)map.get("sterilizationRecordId"); + if(DatabaseUtil.isPoIdValid(sterilizationRecordId)){ + ps.setLong(7, sterilizationRecordId); + }else{ + ps.setNull(7, Types.BIGINT); + } + Long invoiceId = (Long)map.get("invoiceId"); + if(DatabaseUtil.isPoIdValid(invoiceId)){ + ps.setLong(8, invoiceId); + }else{ + ps.setNull(8, Types.BIGINT); + } + Long secondInvoiceId = (Long)map.get("secondInvoiceId"); + if(DatabaseUtil.isPoIdValid(secondInvoiceId)){ + ps.setLong(9, secondInvoiceId); + }else{ + ps.setNull(9, Types.BIGINT); + } + Long signRecordId = (Long)map.get("signRecordId"); + if(DatabaseUtil.isPoIdValid(signRecordId)){ + ps.setLong(10, signRecordId); + }else{ + ps.setNull(10, Types.BIGINT); + } + Long useRecordId = (Long)map.get("useRecordId"); + if(DatabaseUtil.isPoIdValid(useRecordId)){ + ps.setLong(11, useRecordId); + }else{ + ps.setNull(11, Types.BIGINT); + } } @Override @@ -502,11 +560,14 @@ //查询器械实例的最新一轮的器械循环实例 List instrumentInstanceIdList = instrumentInstanceList.stream().map(InstrumentInstance::getId).collect(Collectors.toList()); List> map = jdbcTemplate.queryForList(String.format("select instrumentInstanceId,max(id) id from %s where %s and %s group by instrumentInstanceId", - InstrumentCycleInstance.class.getSimpleName(), idCardInstance == null ? "" : String.format("idCardInstanceId=%s", idCardInstance.getId()), + InstrumentCycleInstance.class.getSimpleName(), idCardInstance == null ? "1=1" : String.format("idCardInstanceId=%s", idCardInstance.getId()), SqlUtils.getNonStringFieldInLargeCollectionsPredicate("instrumentInstanceId", instrumentInstanceIdList))); Map instrumentInstanceIdToMaxInstrumentInstanceIdMap = new HashMap(); Optional.of(map).orElse(new ArrayList>()).stream().forEach(item -> { - instrumentInstanceIdToMaxInstrumentInstanceIdMap.put((Long)item.get("instrumentInstanceId"), (Long)item.get("id")); + //有max函数查出来的字段值类型(sqlserver数据库是Deceima),所以要强转成number类型再调用Number类型的api方法转成long + Number instrumentInstanceIdNumber = (Number)item.get("instrumentInstanceId"); + Number idNumber = (Number)item.get("id"); + instrumentInstanceIdToMaxInstrumentInstanceIdMap.put(instrumentInstanceIdNumber.longValue(), idNumber.longValue()); }); return instrumentInstanceIdToMaxInstrumentInstanceIdMap; } @@ -607,7 +668,8 @@ SqlUtils.getNonStringFieldInLargeCollectionsPredicate("idCardInstanceID", idCardInstanceIdList))); List tiIdList = new ArrayList(); Optional.of(tousseInstanceMapList).orElse(new ArrayList>()).stream().forEach(map -> { - tiIdList.add((Long)map.get("id")); + Number idNumber = (Number)map.get("id"); + tiIdList.add(idNumber.longValue()); }); @SuppressWarnings("unchecked") List tiList = @@ -836,7 +898,8 @@ ps.setString(1, userName); ps.setTimestamp(2, currentTime); - ps.setString(3, "领用器械实例," + StringUtils.join(instrumentBarcodeList, "")); + String remark = StringUtils.join(instrumentBarcodeList, ","); + ps.setString(3, "领用器械实例," + (remark.length() > 200 ? (remark.substring(0, 200) + "...") : remark)); ps.setString(4, departName); ps.setString(5, departCode); ps.setDouble(6, totalPrice); Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java =================================================================== diff -u -r34661 -r34690 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 34661) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 34690) @@ -20,6 +20,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -87,6 +88,7 @@ import com.forgon.disinfectsystem.entity.expensivegoodsapplication.ExpensiveGoodsApplication; 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.DiposableGoodsItem; import com.forgon.disinfectsystem.entity.invoicemanager.ExpensiveGoodsItem; import com.forgon.disinfectsystem.entity.invoicemanager.Invoice; @@ -131,6 +133,7 @@ import com.forgon.disinfectsystem.recyclingapplication.vo.ApplicationGoodsVo; import com.forgon.disinfectsystem.recyclingapplication.vo.ExpressInvoiceApplicationGoodsVo; import com.forgon.disinfectsystem.recyclingapplication.vo.OperationReservationInvoiceGoodsDetail; +import com.forgon.disinfectsystem.tousse.instrumentinstance.service.InstrumentInstanceManager; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseDefinitionManager; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseInstanceManager; import com.forgon.disinfectsystem.tousseitem.service.TousseItemManager; @@ -236,6 +239,8 @@ * jdbc模板类,用于批量查询或操作数据 */ protected JdbcTemplate jdbcTemplate; + + private InstrumentInstanceManager instrumentInstanceManager; public void setUrgentLevelManager(UrgentLevelManager urgentLevelManager) { this.urgentLevelManager = urgentLevelManager; @@ -368,6 +373,11 @@ this.writeBackInventoryDao = writeBackInventoryDao; } + public void setInstrumentInstanceManager( + InstrumentInstanceManager instrumentInstanceManager) { + this.instrumentInstanceManager = instrumentInstanceManager; + } + @Override public Invoice getInvoiceById(String id) { return getInvoiceById(Long.valueOf(id)); @@ -3298,10 +3308,100 @@ if(CssdUtils.getSystemSetConfigByNameBool("enableInvoiceSubmitDebug")){ throw new RuntimeException(debugInfo); } + //添加标识牌实例的器械实例发货数据 + addIdCardInstanceInstrumentInstanceInvoiceData(submitInvoiceContext); return submitInvoiceContext; } /** + * gyey-779添加标识牌实例的器械实例发货数据 + * @param invoiceList + */ + protected void addIdCardInstanceInstrumentInstanceInvoiceData (SubmitInvoiceContext submitInvoiceContext){ + List invoiceList = submitInvoiceContext.getInvoiceList(); + if(CollectionUtils.isNotEmpty(invoiceList) && CssdUtils.getSystemSetConfigByNameBool("enableInstrumentLifeCycleTraceabilityManagement")){ + /*List invoiceIdList = invoiceList.stream().map(Invoice::getId).collect(Collectors.toList()); + //查询发货单的对应的器械包实例(且有绑定标识牌实例的包实例) + List tiList = + tousseInstanceManager.getBySql_ForUpdate(String.format("where idCardInstanceID is not null and ((invoice_id is null and %s) or (invoice_id is not null and %s))", + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("invoice_id", invoiceIdList),SqlUtils.getNonStringFieldInLargeCollectionsPredicate("invoice2_id", invoiceIdList))); + if(CollectionUtils.isNotEmpty(tiList)){ + List idCardInstanceIdList = tiList.stream().map(TousseInstance::getIdCardInstanceID).filter(idCardInstanceId -> { + return DatabaseUtil.isPoIdValid(idCardInstanceId); + }).collect(Collectors.toList()); + @SuppressWarnings("unchecked") + List idCardInstanceList = objectDao.findByIds_ForUpdate(IDCardInstance.class.getSimpleName(), idCardInstanceIdList); + if(CollectionUtils.isNotEmpty(idCardInstanceList)){ + Map idToIDCardInstanceMap = new HashMap(); + idCardInstanceList.stream().forEach(idCardInstance -> { + idToIDCardInstanceMap.put(idCardInstance.getId(), idCardInstance); + }); + Map> invoiceIdToIDCardInstanceListMap = new HashMap>(); + tiList.stream().forEach(ti -> { + Long idCardInstanceID = ti.getIdCardInstanceID(); + Long lastInvoiceId = ti.getLastInvoiceId(); + List idCardInstanceListTemp = invoiceIdToIDCardInstanceListMap.get(lastInvoiceId); + if(idCardInstanceListTemp == null){ + idCardInstanceListTemp = new ArrayList(); + } + idCardInstanceListTemp.add(idToIDCardInstanceMap.get(idCardInstanceID)); + invoiceIdToIDCardInstanceListMap.put(lastInvoiceId,idCardInstanceListTemp); + }); + + //对每个标识牌包实例进行器械实例的发货处理 + invoiceList.stream().forEach(invoice -> { + Long invoiceId = invoice.getId(); + List idCardInstanceListOfInvoice = invoiceIdToIDCardInstanceListMap.get(invoiceId); + if(CollectionUtils.isNotEmpty(idCardInstanceListOfInvoice)){ + instrumentInstanceManager.addOrRemoveInstrumentInstanceBusinessData(InstrumentInstanceManager.operateTypeEnum.ADD, + Invoice.class, invoiceId, idCardInstanceListOfInvoice, null); + } + }); + } + }*/ + + Map> map = submitInvoiceContext.getUpdateStockInfo(); + if(MapUtils.isNotEmpty(map)){ + //对每个标识牌包实例进行器械实例的发货处理 + invoiceList.stream().forEach(invoice -> { + Long invoiceId = invoice.getId(); + Collection tiList = map.get(invoice); + if(CollectionUtils.isNotEmpty(tiList)){ + List idCardInstanceIdList = tiList.stream().map(TousseInstance::getIdCardInstanceID).filter(idCardInstanceId -> { + return DatabaseUtil.isPoIdValid(idCardInstanceId); + }).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(idCardInstanceIdList)){ + @SuppressWarnings("unchecked") + List idCardInstanceList = objectDao.findByIds_ForUpdate(IDCardInstance.class.getSimpleName(), idCardInstanceIdList); + if(CollectionUtils.isNotEmpty(idCardInstanceList)){ + Map idToIDCardInstanceMap = new HashMap(); + idCardInstanceList.stream().forEach(idCardInstance -> { + idToIDCardInstanceMap.put(idCardInstance.getId(), idCardInstance); + }); + List idCardInstanceListTemp = new ArrayList(); + tiList.stream().forEach(ti -> { + Long idCardInstanceID = ti.getIdCardInstanceID(); + if(DatabaseUtil.isPoIdValid(idCardInstanceID)){ + idCardInstanceListTemp.add(idToIDCardInstanceMap.get(idCardInstanceID)); + } + }); + + if(CollectionUtils.isNotEmpty(idCardInstanceListTemp)){ + instrumentInstanceManager.addOrRemoveInstrumentInstanceBusinessData(InstrumentInstanceManager.operateTypeEnum.ADD, + Invoice.class, invoiceId, idCardInstanceListTemp, null); + } + } + } + } + }); + } + } + /*if(1==1){ + throw new SystemException("test...."); + }*/ + } + + /** * 此方法不会被调用,都调用子类里的方法 */ @Override