Index: ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/service/RecyclingRecordManagerImpl.java =================================================================== diff -u -r35499 -r35525 --- ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/service/RecyclingRecordManagerImpl.java (.../RecyclingRecordManagerImpl.java) (revision 35499) +++ ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/service/RecyclingRecordManagerImpl.java (.../RecyclingRecordManagerImpl.java) (revision 35525) @@ -84,6 +84,7 @@ import com.forgon.disinfectsystem.entity.recyclingrecord.RecyclingItem; import com.forgon.disinfectsystem.entity.recyclingrecord.RecyclingRecord; import com.forgon.disinfectsystem.entity.tousseitem.MaterialModifyRecord; +import com.forgon.disinfectsystem.entity.tousseitem.PrepareRecyleScanBarcode; import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; import com.forgon.disinfectsystem.entity.urgent.UrgentLevel; import com.forgon.disinfectsystem.entity.useRecord.UseRecord; @@ -8726,6 +8727,7 @@ TousseDefinition ancestorTd = null; //扫码回收发货到了科室的包必须是已使用状态 boolean scanBarcodeToRecycleTousseDeliveredToDepartmentMustBeInUsedState; + boolean enablePrerecycleAmountScanToAddOrDeleteAmountFunction = CssdUtils.getSystemSetConfigByNameBool("enablePrerecycleAmountScanToAddOrDeleteAmountFunction", false); out : if (StringUtils.isNotBlank(barcode)) { orgUnit = orgUnitManager.getOrgUnitJsonByBarcode(barcode); if (orgUnit != null) { @@ -8838,13 +8840,22 @@ } else if(!checkDisinfection(td, invoicePlanId, recyclingRecordId)){ errorMessage = "申请单上的"+ td.getName() +"的材料清单与所扫描的物品不同,请另外填单进行回收!"; }else{ - if(!isFixedBarcode){ + if(!isFixedBarcode && !enablePrerecycleAmountScanToAddOrDeleteAmountFunction){ String recyclingErrorMsg = getRecyclingErrorMsg(null,tousseInstance, invoicePlanId, recyclingRecordId); if(StringUtils.isNotBlank(recyclingErrorMsg)){ errorMessage = recyclingErrorMsg; break out; } } + //验证是否被其他申请单预回收 + + if(enablePrerecycleAmountScanToAddOrDeleteAmountFunction){ + errorMessage = getVerifyPreRecycledByOtherApplicationMsg(invoicePlanId, null, td, tousseInstance.getBarcode()); + if(StringUtils.isNotBlank(errorMessage)){ + break out; + } + } + //验证器械包是否属于当前科室处理 LoginUserData loginUserData = AcegiHelper.getLoginUser(); String cssdOrgUnitCode = loginUserData.getOrgUnitCodingFromSupplyRoomConfig(); @@ -8950,17 +8961,27 @@ //tousseInstance.setLocationForDisplay("新器械包标识牌"); } } else { + //验证是否被其他申请单预回收 + if(enablePrerecycleAmountScanToAddOrDeleteAmountFunction){ + errorMessage = getVerifyPreRecycledByOtherApplicationMsg(invoicePlanId, barcode, tousseDefinition, tousseInstance.getBarcode()); + if(StringUtils.isNotBlank(errorMessage)){ + break out; + } + } + scanBarcodeToRecycleTousseDeliveredToDepartmentMustBeInUsedState = CssdUtils.getSystemSetConfigByNameBool("scanBarcodeToRecycleTousseDeliveredToDepartmentMustBeInUsedState", false); if(scanBarcodeToRecycleTousseDeliveredToDepartmentMustBeInUsedState){ errorMessage = getScanBarcodeToRecycleTousseDeliveredToDepartmentMustBeInUsedStateErrorMessage(tousseInstance, "标识牌条码", barcode); if(StringUtils.isNotBlank(errorMessage)){ break out; } } - String recyclingErrorMsg = getRecyclingErrorMsg(idCardInstance, tousseInstance, invoicePlanId, recyclingRecordId); - if(StringUtils.isNotBlank(recyclingErrorMsg)){ - errorMessage = recyclingErrorMsg; - break out; + if(!enablePrerecycleAmountScanToAddOrDeleteAmountFunction){ + String recyclingErrorMsg = getRecyclingErrorMsg(idCardInstance, tousseInstance, invoicePlanId, recyclingRecordId); + if(StringUtils.isNotBlank(recyclingErrorMsg)){ + errorMessage = recyclingErrorMsg; + break out; + } } if(TousseInstance.STATUS_DISCARD.equals(tousseInstance.getStatus())){ errorMessage = checkTousseStatus(idCardInstance.getId()); @@ -9144,6 +9165,49 @@ } } /** + * 获取验证包实例条码是否被其他申请单预回收了的错误消息 + * @param invoicePlanId 申请单id + * @param idCardInstanceBarcode 标识牌条码 + * @param td 包定义id + * @param verifyBarcode 验证的条码 + * @return + */ + private String getVerifyPreRecycledByOtherApplicationMsg(Long invoicePlanId, String idCardInstanceBarcode, TousseDefinition td, String verifyBarcode){ + if(!DatabaseUtil.isPoIdValid(invoicePlanId)){ + return "参数异常invoicePlanId:"+invoicePlanId; + } + if(!verifyPreRecycledByOtherApplication(invoicePlanId, verifyBarcode)){ + InvoicePlan ip = invoicePlanManager.get(invoicePlanId); + return StringUtils.isNotBlank(idCardInstanceBarcode)?idCardInstanceBarcode:verifyBarcode + + "【"+ td.getName() + +"】已经被【" + + ip.getDepart() + +"】的" + + ip.getSerialNumber() + +"申请单预回收,请打开对应的申请单进行回收!"; + } + return null; + } + /** + * 验证包实例条码是否被其他申请单预回收了 + * @param invoicePlanId 申请单id + * @param barcode 包实例条码 + * @return false 被预回收了 不通过验证 + */ + private boolean verifyPreRecycledByOtherApplication(Long invoicePlanId, String barcode){ + String sql = "select count(*) from " + + TousseItem.class.getSimpleName() + +" ti join " + + PrepareRecyleScanBarcode.class.getSimpleName() + + " prb on prb.tousseItemId=ti.id " + + "where ti.recyclingApplication_ID<>" + + invoicePlanId + + " and prb.tousseInstanceBarcode='" + + barcode + +"'"; + return objectDao.countBySql(sql) > 0? false:true; + } + /** * 获取scanBarcodeToRecycleTousseDeliveredToDepartmentMustBeInUsedState配置项开启后的验证信息 KSDQDYRMYY-11 * @param tousseInstance 包实例 * @param scavengingSource 扫码来源 包外标签条码 或 标识牌条码 Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/PrepareRecycleTousseManagerImpl.java =================================================================== diff -u -r35507 -r35525 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/PrepareRecycleTousseManagerImpl.java (.../PrepareRecycleTousseManagerImpl.java) (revision 35507) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/PrepareRecycleTousseManagerImpl.java (.../PrepareRecycleTousseManagerImpl.java) (revision 35525) @@ -1,11 +1,14 @@ package com.forgon.disinfectsystem.recyclingapplication.service; import java.util.ArrayList; +import java.util.Collection; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import java.util.stream.Collectors; @@ -23,6 +26,7 @@ import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.SupplyRoomConfig; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; +import com.forgon.disinfectsystem.entity.tousseitem.PrepareRecyleScanBarcode; import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; import com.forgon.disinfectsystem.recyclingapplication.vo.ReturnGoodVo; import com.forgon.disinfectsystem.vo.TousseItemVo; @@ -32,6 +36,8 @@ import com.forgon.tools.MathTools; import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.json.JSONUtil; +import com.forgon.tools.util.SqlUtils; +import com.google.gson.Gson; /** * 预回收业务实现类 @@ -48,8 +54,74 @@ //如果保存成功,返回{succesee:true},否则返回{succesee:false,message:"具体的消息"} //以下代码为原serviceManager实现方法的代码,现已移值到此manager实现类中,在此基础上做新增的需求内容 boolean success = false; + boolean enablePrerecycleAmountScanToAddOrDeleteAmountFunction = CssdUtils.getSystemSetConfigByNameBool("enablePrerecycleAmountScanToAddOrDeleteAmountFunction", false); String error = ""; - if(params != null){ + out : if(enablePrerecycleAmountScanToAddOrDeleteAmountFunction && StringUtils.isNotBlank(scanBarcodeInfo)){ + Gson gson = new Gson(); + Map> map = new HashMap>(); + map = gson.fromJson(scanBarcodeInfo, map.getClass()); + if(MapUtils.isEmpty(map)){ + break out; + } + //数据收集 + List prepareRecyleScanBarcodes = objectDao.findByHql("select po from " + + PrepareRecyleScanBarcode.class.getSimpleName() + + " where " + + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("po.tousseItemId", map.keySet())); + //数据组装 + Map> tousseBarcodesMap = new HashMap>(); + for (PrepareRecyleScanBarcode prepareRecyleScanBarcode : prepareRecyleScanBarcodes) { + Set barcodes = new HashSet(); + if(tousseBarcodesMap.containsKey(prepareRecyleScanBarcode.getTousseItemId())){ + barcodes = tousseBarcodesMap.get(prepareRecyleScanBarcode.getTousseItemId()); + }else{ + barcodes = new HashSet(); + } + barcodes.add(prepareRecyleScanBarcode.getTousseInstanceBarcode()); + } + //数据校验 + for (String idStr : map.keySet()) { + Long id = Long.valueOf(idStr); + List scanBarcodes = map.get(id); + Set recyedBarcodes = getBarcodesPreRecoveredByOtherTousseItems(scanBarcodes, id); + if(CollectionUtils.isNotEmpty(recyedBarcodes)){ + for (String recyedBarcode : recyedBarcodes) { + error += "," + recyedBarcode; + } + error = error.substring(1) + "已经被预回收,无法重复预回收"; + break out; + } + } + //新增或删除数据 + for (String idStr : map.keySet()) { + Long tousseItemId = Long.valueOf(idStr); + List scanBarcodes = map.get(tousseItemId); + Set tousseBarcodes = tousseBarcodesMap.get(tousseItemId); + //要删除的条码 + Collection delBarcodes = CollectionUtils.subtract(tousseBarcodes, scanBarcodes); + if(CollectionUtils.isNotEmpty(delBarcodes)){ + String delSql = "delete from " + + PrepareRecyleScanBarcode.class.getSimpleName() + + " where " + + SqlUtils.getStringFieldInLargeCollectionsPredicate("tousseInstanceBarcode", delBarcodes) + + " and tousseItemId=" + + tousseItemId; + objectDao.excuteSQL(delSql); + } + //要添加的条码 + Collection addBarcodes = CollectionUtils.subtract(tousseBarcodes, scanBarcodes); + if(CollectionUtils.isNotEmpty(addBarcodes)){ + for (String addBarcode : addBarcodes) { + PrepareRecyleScanBarcode prepareRecyleScanBarcode = new PrepareRecyleScanBarcode(); + prepareRecyleScanBarcode.setTousseInstanceBarcode(addBarcode); + prepareRecyleScanBarcode.setTousseItemId(tousseItemId); + objectDao.save(prepareRecyleScanBarcode); + } + } + } + } + + if(params != null && StringUtils.isBlank(error)){ JSONArray array = params.optJSONArray("tousseItems"); if(CollectionUtils.isNotEmpty(array)){ String invoiceplanId = params.optString("app_id"); @@ -255,6 +327,19 @@ return JSONUtil.buildJsonObject(success, error); } /** + * 获取被其他申请项预回收的条码 + * @param barcodes 包实例条码 + * @param tousseItemId 申请项id + * @return + */ + private Set getBarcodesPreRecoveredByOtherTousseItems(List barcodes, Long tousseItemId){ + String sql = "select po.tousseInstanceBarcode from "+ PrepareRecyleScanBarcode.class.getSimpleName() +" p where " + + SqlUtils.getStringFieldInLargeCollectionsPredicate("po.tousseInstanceBarcode", barcodes) + + " and p.tousseItemId<>" + + tousseItemId; + return objectDao.getStringSet(sql, ""); + } + /** * 获取申请的物品 * @param array * @return