Index: ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManager.java =================================================================== diff -u -r38649 -r38701 --- ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManager.java (.../UseRecordManager.java) (revision 38649) +++ ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManager.java (.../UseRecordManager.java) (revision 38701) @@ -480,4 +480,18 @@ * @param tousseInstanceIds */ public void uploadUseRecordTousseInfo(Long useRecordId, String hospitalNumber, String patientName, String tousseInstanceIds); + + /** + * 扫描条码,获取需要从使用记录移除的器械包实例及使用记录信息GDSRMYY-616 + * @param barcode + * @return + */ + public JSONObject scanRemoveTousseBracode(String barcode); + + /** + * 移除使用记录器械包实例GDSRMYY-616 + * @param tousseInstanceId + * @param removeCause 移除原因 + */ + public void removeUseRecordTousseInstance(Long tousseInstanceId, String removeCause); } Index: ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManagerImpl.java =================================================================== diff -u -r38649 -r38701 --- ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManagerImpl.java (.../UseRecordManagerImpl.java) (revision 38649) +++ ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManagerImpl.java (.../UseRecordManagerImpl.java) (revision 38701) @@ -103,7 +103,6 @@ import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseMaterialErrorDamage; import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.StorageRecord; import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; -import com.forgon.disinfectsystem.entity.becleanitem.ClassifyBasket; import com.forgon.disinfectsystem.entity.departmentstock.DepartmentStock; import com.forgon.disinfectsystem.entity.foreigntousseapplication.ForeignTousseApplication; import com.forgon.disinfectsystem.entity.goodsstock.GoodsStock; @@ -130,7 +129,6 @@ import com.forgon.disinfectsystem.entity.useRecord.UseRecordToRecycleApplication; import com.forgon.disinfectsystem.entity.useRecord.UseRecordUploadItem; import com.forgon.disinfectsystem.entity.useRecord.UseRecordUploadRecord; -import com.forgon.disinfectsystem.entity.washanddisinfectmanager.washanddisinfectrecord.WashAndDisinfectRecord; import com.forgon.disinfectsystem.expensiveGoods.service.ExpensiveGoodsInstanceManager; import com.forgon.disinfectsystem.expensiveGoods.service.ExpensiveGoodsStockManager; import com.forgon.disinfectsystem.foreigntousseapplication.service.ForeignTousseApplicationManager; @@ -2175,7 +2173,7 @@ tousseInstance.setUseRecord_id(null); //包实例最后的发货单 Invoice invoice = idToInvoiceMap.get(tousseInstance.getLastInvoiceId()); - if(invoice != null && warehouse == null){ + if(invoice != null){ warehouse = new WareHouse(); warehouse.setId(invoice.getWarehouseID()); warehouse.setName(invoice.getWarehouseName()); @@ -13444,5 +13442,274 @@ } }); } + + @Override + public JSONObject scanRemoveTousseBracode(String barcode) { + if(StringUtils.isBlank(barcode)){ + throw new SystemException("条码不能为空!"); + } + @SuppressWarnings("deprecation") + BarcodeDevice barcodeDevice = barcodeManager.getBarcodeByBarcode(barcode); + if(barcodeDevice == null + || !(barcodeDevice instanceof TousseInstance)){ + throw new SystemException(String.format("%s不是器械包条码!", barcode)); + } + TousseInstance tousseInstance = (TousseInstance) barcodeDevice; + UseRecord useRecord = tousseInstance.getUseRecord(objectDao); + if(useRecord == null){ + throw new SystemException(String.format("%s%s没有录入使用记录!", barcode, tousseInstance.getTousseName())); + } + + JSONObject tousseUseInfo = new JSONObject(); + tousseUseInfo.put("id", tousseInstance.getId()); + tousseUseInfo.put("barcode", tousseInstance.getBarcode()); + tousseUseInfo.put("tousseName", tousseInstance.getTousseName()); + String isRecycled = DatabaseUtil.isPoIdValid(tousseInstance.getRecyclingItemId()) ? Constants.STR_YES : Constants.STR_NO; + tousseUseInfo.put("isRecycled", isRecycled); + + JSONObject useRecordInfo = new JSONObject(); + useRecordInfo.put("enteringDate", useRecord.getEnteringDateStr()); + useRecordInfo.put("operator", useRecord.getOperator()); + useRecordInfo.put("reviewer", useRecord.getReviewer()); + useRecordInfo.put("patientId", useRecord.getPatientId()); + useRecordInfo.put("treatmentNum", useRecord.getTreatmentNum()); + useRecordInfo.put("patientName", useRecord.getPatientName()); + useRecordInfo.put("patientIDCard", useRecord.getPatientIDCard()); + useRecordInfo.put("doctorName", useRecord.getDoctorName()); + useRecordInfo.put("operation", useRecord.getOperation()); + useRecordInfo.put("circuitNurse", useRecord.getCircuitNurse()); + useRecordInfo.put("washHandNurse", useRecord.getWashHandNurse()); + tousseUseInfo.put("useRecord", useRecordInfo); + + return tousseUseInfo; + } + + @Override + public void removeUseRecordTousseInstance(Long tousseInstanceId, String removeCause) { + if(!DatabaseUtil.isPoIdValid(tousseInstanceId)){ + throw new SystemException("请扫描需要移除的器械包!"); + } + TousseInstance tousseInstance = tousseInstanceManager.get(tousseInstanceId); + if(tousseInstance == null){ + throw new SystemException("请扫描需要移除的器械包!"); + } + UseRecord useRecord = tousseInstance.getUseRecord(objectDao); + if(useRecord == null){ + throw new SystemException(String.format("%s%s没有录入使用记录!", tousseInstance.getBarcode(), tousseInstance.getTousseName())); + } + if (!tousseInstance.isUsed()) { + throw new RuntimeException( + String.format("器械包%s[%s]实例必须为已使用才能从使用记录中删除,当前状态为[%s]", + tousseInstance.getShowTousseName(), + tousseInstance.getBarcode(), + tousseInstance.getStatus()));// 状态校验 + } + List tousseInstanceList = new ArrayList(); + tousseInstanceList.add(tousseInstance); + //从使用记录移除器械包实例 + removeUseRecodTousseInstance(useRecord, tousseInstanceList); + //记录操作日志 + String description = "id=" + useRecord.getId() + ",useRecord=" + useRecord.toString(); + if(StringUtils.isNotBlank(removeCause)){ + description += ",解除原因为:" + removeCause; + } + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_USERECORD, "干预修改使用记录", description); + + } + + /** + * 从使用记录移除器械包实例 + * @param useRecord + * @param tousseInstance + */ + private void removeUseRecodTousseInstance(UseRecord useRecord, List deleteTousseInstanceList) { + if(useRecord == null || CollectionUtils.isEmpty(deleteTousseInstanceList)){ + return; + } + if(!useRecord.isApplied() && !useRecord.isAudited()){ + throw new SystemException(String.format("使用记录状态为%s,不需要解除器械包", useRecord.getStatus())); + } + Map tousseInstancesMap = new HashMap(); + List useRecordTousseInstanceList = useRecord.getTousseInstanceList(objectDao); + if(CollectionUtils.isEmpty(useRecordTousseInstanceList)){ + return; + } + for (TousseInstance ti : useRecordTousseInstanceList) { + tousseInstancesMap.put(ti.getId(), ti); + } + + List deletedTousseInstanceIDs = new ArrayList(); + for (TousseInstance ti : deleteTousseInstanceList) { + deletedTousseInstanceIDs.add(ti.getId()); + if(!tousseInstancesMap.containsKey(ti.getId())){ + throw new SystemException(String.format("器械包%s[%s]已被删除", ti.getTousseName(), ti.getBarcode())); + } + } + + /*if(deleteTousseInstanceList.size() == useRecordTousseInstanceList.size() + && CollectionUtils.isEmpty(useRecord.getDiposableGoodsItems()) + && CollectionUtils.isEmpty(useRecord.getExpensiveDisposableGoodsInstanceList(objectDao))){ + //使用记录上全部物品都被删除时,删除使用记录 + this.deleteUseRecordById(useRecord.getId()+"", true); + return; + }*/ + + //使用记录录入科室的默认仓库 + WareHouse defaultWareHouse = wareHouseManager.getDefaultWareHouseByUnitCode(useRecord.getDepartCoding()); + //器械包状态回滚后需要增加器械包库存的器械包实例集合 + List needRollbackStatusTousseInstanceList = new ArrayList(); + int updateObjectCount = 0; + + List invoiceIdList = new ArrayList(); + deletedTousseInstanceIDs.stream().forEach(id -> { + TousseInstance ti = tousseInstancesMap.get(id); + Long lastInvoiceId = ti.getLastInvoiceId(); + if(lastInvoiceId != null && !invoiceIdList.contains(lastInvoiceId)){ + invoiceIdList.add(lastInvoiceId); + } + }); + Map idToInvoiceMap = new HashMap(); + if(CollectionUtils.isNotEmpty(invoiceIdList)){ + @SuppressWarnings("unchecked") + List invoiceList = objectDao.getCollection(Invoice.class.getSimpleName(), "id", invoiceIdList); + if(CollectionUtils.isNotEmpty(invoiceList)){ + invoiceList.stream().forEach(invoice -> { + idToInvoiceMap.put(invoice.getId(), invoice); + }); + } + } + WareHouse warehouse = null; + List deletedTousseInstanceIDcarInstanceIdList = new ArrayList(); + for (Long id : deletedTousseInstanceIDs) { + TousseInstance tousseInstance = tousseInstancesMap.get(id); + if (tousseInstance == null) { + throw new SystemException(String.format("id=%s的器械包已被删除", id)); + } + if (!tousseInstance.isUsed()) { + throw new RuntimeException( + String.format("器械包%s[%s]实例必须为已使用才能从使用记录中删除,当前状态为[%s]", + tousseInstance.getShowTousseName(), + tousseInstance.getBarcode(), + tousseInstance.getStatus()));// 状态校验 + } + // 移除器械包实例与使用记录的关联关系 + tousseInstance.setUseRecord_id(null); + //包实例最后的发货单 + Invoice invoice = idToInvoiceMap.get(tousseInstance.getLastInvoiceId()); + if(invoice != null){ + warehouse = new WareHouse(); + warehouse.setId(invoice.getWarehouseID()); + warehouse.setName(invoice.getWarehouseName()); + } + //删除使用记录后,更新位置为发货时的科室(此方法一定要放在tousseInstance.setUseRecord_id方法后面调用) + tousseInstance.resetLocationInfoAndWarehouseForUseRecord(null,invoice,warehouse); + + tousseInstance.setOperationRoomName(null); + tousseInstance.setPatientName(null); + tousseInstance.setDoctorName(null); + tousseInstance.setUseTime(null); + + //如果为聚合包,则需要删除该聚合包对应使用记录中间表的数据 + if(tousseInstance.isComboTousse()){ + deleteComboTousseInstance(useRecord, tousseInstance, defaultWareHouse); + } + // 如果有签收时间则还原为签收状态,否则还原为器械包实例“已发货”状态 + if (tousseInstance.getSignedDate() != null) { + tousseInstance.setStatus(TousseInstance.STATUS_SIGNED); + } else { + tousseInstance.setStatus(TousseInstance.STATUS_SHIPPED); + } + //使用记录是否加急属性设置为否 + tousseInstance.setIsUrgentForUseRecord(Constants.STR_NO); + //清空使用记录加急信息ZSRY-53 + UrgentAdditionalInfo urgentAdditionalInfo = tousseInstance.searchUrgentAdditionalInfo(objectDao); + if(urgentAdditionalInfo != null){ + tousseInstance.setUrgentAdditionalInfoId(null); + objectDao.delete(urgentAdditionalInfo); + } + tousseInstance.setUrgentLevelForUseRecord(null); + //清空使用记录结算科室SZSDSRMYY-95 + tousseInstance.setSettleAccountDeptCodeUseRecord(null); + objectDao.saveOrUpdate(tousseInstance); + //清空该器械包实例的丢失报损备注及删除其丢失报损记录 + tousseInstance.clearDamageAndErrorRemarkAndData(objectDao); + //如果包实例有转换过申请单,则清空对应的申请项id字段 + if(DatabaseUtil.isPoIdValid(tousseInstance.getTousseItemId())){ + tousseInstance.setTousseItemId(null); + } + //不为聚合包时才扣减临床科室库存 + if(!tousseInstance.isComboTousse()){ + needRollbackStatusTousseInstanceList.add(tousseInstance); + } + //updatedTousseInstances.add(tousseInstance); + if(DatabaseUtil.isPoIdValid(tousseInstance.getIdCardInstanceID())){ + deletedTousseInstanceIDcarInstanceIdList.add(tousseInstance.getIdCardInstanceID()); + } + tousseInstanceUseRecordManager.delete(useRecord.getId(), tousseInstance.getId()); + if (++updateObjectCount % 20 == 0) { + objectDao.flush(); + } + } + + //对使用记录中需要回滚状态的器械包进行增加库存处理 + tousseInstanceManager.adjustTousseGoodsStockByTousseInstanceList(useRecord.getDepartCoding(), needRollbackStatusTousseInstanceList, GoodsStockManager.MODE_INSTOCK); + + // 修改使用记录,设置修改时间 + useRecord.setEditTime(new Date()); + //保存使用记录 + objectDao.saveOrUpdate(useRecord); + + //删除器械实例使用记录GYEY-779 + if(CollectionUtils.isNotEmpty(deletedTousseInstanceIDcarInstanceIdList)){ + @SuppressWarnings("unchecked") + List IDCardInstanceList = objectDao.findByIds(IDCardInstance.class.getSimpleName(), deletedTousseInstanceIDcarInstanceIdList); + if(CollectionUtils.isNotEmpty(IDCardInstanceList)){ + instrumentInstanceManager.addOrRemoveInstrumentInstanceBusinessData(InstrumentInstanceManager.operateTypeEnum.REMOVE, UseRecord.class, useRecord.getId(), IDCardInstanceList, new HashMap>()); + } + } + + //使用记录移除器械包时,删除器械包实例关联的流转记录的后续操作时间(GDSRMYY-578) + tousseInstanceManager.updateTousseInstanceTousseOperationNextOperationTime(deletedTousseInstanceIDs, useRecord, true); + + recyclingApplicationManager.updateRecyclingStatus(useRecord.getId()); + } + + /** + * 删除SubComboTousseUseRecord表数据、增加被之前扣减的库存 + * @param useRecord + * @param deleteTousseInstanceList + */ + @SuppressWarnings("unchecked") + private void deleteComboTousseInstance(UseRecord useRecord, TousseInstance tousseInstance, WareHouse wareHouse) { + if(tousseInstance.isComboTousse()){ + //1.删除SubComboTousseUseRecord表数据、增加被之前扣减的库存 + tousseInstanceUseRecordManager.delete(useRecord.getId(), tousseInstance.getId()); + List subComboTousseUseRecordList = + objectDao.findBySql(SubComboTousseUseRecord.class.getSimpleName(), "where useRecordId="+ useRecord.getId() +" and comboTousseInstanceId=" + tousseInstance.getId()); + if(CollectionUtils.isNotEmpty(subComboTousseUseRecordList)){ + for (SubComboTousseUseRecord subComboTousseUseRecord : subComboTousseUseRecordList) { + int usedAmount = subComboTousseUseRecord.getUsedAmount(); + GoodsStock goodsStock = (GoodsStock)objectDao.getBySql(GoodsStock.class.getSimpleName(), + "where orgUnitCode='"+ useRecord.getDepartCoding() +"' and tousseDefinitionId=" + subComboTousseUseRecord.getSubTousseDefinitionId()); + if(goodsStock != null){ + goodsStock.setAmount(goodsStock.getAmount() + usedAmount); + objectDao.saveOrUpdate(goodsStock); + }else{ + goodsStock = new GoodsStock(); + goodsStock.setAmount(usedAmount); + goodsStock.setGoodsType(GoodsStock.TYPE_TOUSSE); + goodsStock.setName(subComboTousseUseRecord.getTousseName()); + goodsStock.setOrgUnitCode(useRecord.getDepartCoding()); + goodsStock.setOrgUnitName(useRecord.getDepart()); + goodsStock.setTousseDefinitionId(subComboTousseUseRecord.getSubTousseDefinitionId()); + goodsStock.setWareHouseId(wareHouse.getId()); + goodsStock.setWareHouseName(wareHouse.getName()); + objectDao.saveOrUpdate(goodsStock); + } + objectDao.delete(subComboTousseUseRecord); + } + } + } + } } Index: ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/action/UseRecordAction.java =================================================================== diff -u -r38649 -r38701 --- ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/action/UseRecordAction.java (.../UseRecordAction.java) (revision 38649) +++ ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/action/UseRecordAction.java (.../UseRecordAction.java) (revision 38701) @@ -1080,4 +1080,39 @@ StrutsResponseUtils.output(result); } + /** + * 扫描器械包实例条码查询需要从使用记录移除的器械包实例及使用记录信息GDSRMYY-616 + */ + public void scanRemoveTousseBracode(){ + JSONObject result = JSONUtil.buildJsonObject(true); + try { + //器械包实例id + String barcode = StrutsParamUtils.getPraramValue("barcode", null); + JSONObject data = useRecordManager.scanRemoveTousseBracode(barcode); + result = JSONUtil.buildJsonObject(true, data); + } catch (Exception e) { + e.printStackTrace(); + result = JSONUtil.buildJsonObject(false, e.getMessage()); + } + StrutsResponseUtils.output(result); + } + + /** + * 移除使用记录的器械包实例GDSRMYY-616 + */ + public void removeUseRecodTousseInstance(){ + JSONObject result = JSONUtil.buildJsonObject(true, "器械包移除成功"); + try { + //器械包实例id + Long tousseInstanceId = StrutsParamUtils.getPraramLongValue("tousseInstanceId", null); + //解除的原因 + String removeCause = StrutsParamUtils.getPraramValue("removeCause", null); + useRecordManager.removeUseRecordTousseInstance(tousseInstanceId, removeCause); + } catch (Exception e) { + e.printStackTrace(); + result = JSONUtil.buildJsonObject(false, "器械包移除失败:" + e.getMessage()); + } + StrutsResponseUtils.output(result); + } + }