Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseDefinitionManager.java =================================================================== diff -u -r18383 -r18575 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseDefinitionManager.java (.../TousseDefinitionManager.java) (revision 18383) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseDefinitionManager.java (.../TousseDefinitionManager.java) (revision 18575) @@ -33,6 +33,7 @@ public TousseDefinition getTousseDefinitionById(String id); public TousseDefinition getTousseDefinitionById(Long id); + public TousseDefinition getTousseDefinitionById_ForUpdate(Long id); public TousseDefinition getById_ForUpdate_MANDATORY(String id); Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseDefinitionManagerImpl.java =================================================================== diff -u -r18383 -r18575 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseDefinitionManagerImpl.java (.../TousseDefinitionManagerImpl.java) (revision 18383) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseDefinitionManagerImpl.java (.../TousseDefinitionManagerImpl.java) (revision 18575) @@ -204,6 +204,11 @@ public TousseDefinition getTousseDefinitionById(Long id){ return getTousseDefinitionById(id + ""); } + @Override + public TousseDefinition getTousseDefinitionById_ForUpdate(Long id){ + return (TousseDefinition) objectDao.getByProperty_ForUpdate( + TousseDefinition.class.getSimpleName(), "id", id); + } @Override public TousseDefinition getById_ForUpdate_MANDATORY(String id){ Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/dwr/table/PackingTableManager.java =================================================================== diff -u -r18500 -r18575 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/dwr/table/PackingTableManager.java (.../PackingTableManager.java) (revision 18500) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/dwr/table/PackingTableManager.java (.../PackingTableManager.java) (revision 18575) @@ -495,18 +495,20 @@ * @param session * @return */ - public synchronized String packingComboTousse(String params,HttpSession session){ + public String packingComboTousse(String params,HttpSession session){ boolean success = true; String message = "保存成功!"; try { return packingManager.packingComboTousse(params,session); } catch (Exception e) { success = false; message = e.getMessage(); + e.printStackTrace(); } return JSONUtil.buildJsonObject(success, message).toString(); } + /** * 干预外来器械拆包 * @param params Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java =================================================================== diff -u -r18554 -r18575 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java (.../PackingManagerImpl.java) (revision 18554) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java (.../PackingManagerImpl.java) (revision 18575) @@ -2740,7 +2740,7 @@ } @Override - public String packingTousse_TRANS_REQUIRED(String params,HttpSession session) throws Exception { + public String packingTousse_TRANS_REQUIRED(String params,HttpSession session) { return packingTousse_internal(params, session); } @@ -3177,7 +3177,7 @@ * 增加一个确认继续的操作,参数名:confirm,为"true"时表示继续 * @return */ - private String packingTousse_internal(String params,HttpSession session) throws Exception { + private String packingTousse_internal(String params,HttpSession session) { JSONObject paramsObj = JSONObject.fromObject(params); String packingTaskIds = JSONUtil.optString(paramsObj, "taskIds", null); @@ -3266,22 +3266,14 @@ String batchLoadMsg = "";//器械包批量装入虚拟篮筐的信息提示 if (StringUtils.isNotBlank(packingTaskIds)) { logger.debug("装配任务packingTaskIds=" + packingTaskIds); - Query query = objectDao.getHibernateSession().createQuery( - "SELECT po FROM PackingTask po" - + " WHERE po.id in (:ids)"); String[] idsStr = packingTaskIds.split(";"); - List ids = new ArrayList(); - for (String id : idsStr){ if (StringUtils.isNumeric(id)){ ids.add(new Long(id)); } } - - query.setParameterList("ids", ids); - Map idToWashRecordMap = washAndDisinfectRecordManager.getIdToWashRecordMapByPackingTaskIds(ids); //本次器械包装配总数量 Integer currentPackAmount = 0; @@ -3294,7 +3286,8 @@ urgentAmountJson.put("currentUrgentAmount", Integer.parseInt(urgentAmountStr)); } - List packingTasks = query.list(); +// List packingTasks = query.list(); + List packingTasks = (List)objectDao.findByIds_ForUpdate(PackingTask.class.getSimpleName(), ids); Set recyclingRecordIds = new HashSet(); for (PackingTask packingTask : packingTasks) { logger.debug("装配任务packingTask[id=" + packingTask.getId() + "],tousseName=" + packingTask.getTousseDefinition().getName()+ "], [待装配数量=" + packingTask.getUnPackAmount() + "]"); @@ -3344,7 +3337,47 @@ });*/ Map packingTaskMap = new HashMap(); + // 锁定所有的装配任务的包定义 + Set packingTaskTousseDefinitionIdSet = new HashSet(); for (PackingTask packingTask : packingTasks) { +// String sql = String.format(" where po.id in(select p.tousseDefinition.id from PackingTask p where %s and p.tousseDefinition.id is not null)", SqlUtils.getNonStringFieldInCollectionsPredicate("p.id", ids)); + TousseDefinition td = packingTask.getTousseDefinition(); + if(td == null){ + throw new RuntimeException(String.format("装配任务%s的包定义为空!", packingTask.getId())); + } + packingTaskTousseDefinitionIdSet.add(td.getId()); + } + // 锁定所有的装配任务的篮筐 + Set packingTaskBasketBarcodeSet = new HashSet(); + for (PackingTask packingTask : packingTasks) { + String tempBasketBarcodeStr = packingTask.getBasketBarcode(); + if(StringUtils.isNotBlank(tempBasketBarcodeStr)){ + String [] basketArray = tempBasketBarcodeStr.split(";"); + for (String tempBasketBarcode : basketArray) { + packingTaskBasketBarcodeSet.add(tempBasketBarcode); + } + } + } + // 锁定所有的虚拟篮筐 + boolean needVirtualBasket = false; + for (PackingTask packingTask : packingTasks) { + TousseDefinition td = packingTask.getTousseDefinition(); + Integer packingAmountPerVirtualBasket = td.getPackingAmountPerVirtualBasket(); + if(packingAmountPerVirtualBasket != null + && packingAmountPerVirtualBasket > 0){ + needVirtualBasket = true; + break; + } + } + if(needVirtualBasket){ + String sql = String.format(" where purpose='%s'", Container.CONTAINER_PURPOSE_VIRTUAL); + objectDao.getBySql_ForUpdate2(Container.class.getSimpleName(), sql); + } + if(!packingTaskBasketBarcodeSet.isEmpty()){ + objectDao.findBySql_ForUpdate(Container.class.getSimpleName(), String.format(" where %s ", SqlUtils.getStringFieldInCollectionsPredicate("po.barcode", packingTaskBasketBarcodeSet))); + } + List packingTaskTousseDefinitionList = objectDao.findByIds_ForUpdate(TousseDefinition.class.getSimpleName(), packingTaskTousseDefinitionIdSet); + for (PackingTask packingTask : packingTasks) { TousseDefinition td = packingTask.getTousseDefinition(); //如果配置是否打印材料时 @@ -3416,7 +3449,7 @@ long foreignTousseApp_id = 0; if (td.isForeignOrSplitTousse()) { Long foreignTousseApplicationID = td.getInvoicePlanID(); - foreignTousseApplication = (ForeignTousseApplication) objectDao.getByProperty( + foreignTousseApplication = (ForeignTousseApplication) objectDao.getByProperty_ForUpdate( ForeignTousseApplication.class.getSimpleName(), "id",foreignTousseApplicationID); foreignTousseApp_id = foreignTousseApplication.getId().longValue(); } @@ -3746,7 +3779,7 @@ updatePackingConfigSession(session, inspector, inspectorCode, operator, operatorCode, reviewer, reviewerCode,sterileUserName,sterileUserCode,wrapper, wrapperCode, packageType, sterilingType, sterilizerName, sterileFrequency); // if(true){ -// throw new RuntimeException("装配速度测试"); +// throw new RuntimeException("装配速度测试 "); // } return json.toString(); } @@ -4252,7 +4285,7 @@ try { while(rs.next()){ String taskId = rs.getString("taskId"); - PackingTask urgentPackingTask = getPackingTaskById(taskId); + PackingTask urgentPackingTask = getPackingTaskByIdForUpdate_internal(taskId); if(urgentPackingTask != null){ urgentPackingTask.setUrgentAmount(urgentPackingTask.getUrgentAmount() - 1); tousseInstance.setIsUrgentTousse(TousseDefinition.STR_YES); @@ -5646,12 +5679,17 @@ SupplyRoomConfig systemConfig = supplyRoomConfigManager.getSystemParamsObj(); for (int i = 0; i < comboTousseJsonArray.size(); i++) { JSONObject comboTousseJson = comboTousseJsonArray.optJSONObject(i); - //验证数据 - comboTousseDataValidate(comboTousseJson,sterileDate); Long comboTousseId = comboTousseJson.optLong("id"); + String comboTousseName = comboTousseJson.optString("tousseName"); TousseDefinition comboTousseTD = tousseDefinitionManager - .getTousseDefinitionById(comboTousseId); + .getTousseDefinitionById_ForUpdate(comboTousseId); + if (comboTousseTD == null) { + throw new RuntimeException(comboTousseName + "定义已不存在!"); + } + //验证数据 + comboTousseDataValidate(comboTousseTD,comboTousseJson,sterileDate); + //装配聚合包 TousseInstance comboTousseInstance = createComboTousseInstanceAndPackingRecord( paramsObj, comboTousseTD, comboTousseJson); @@ -5789,19 +5827,14 @@ * @param comboTousseJsonArray * @return */ - private void comboTousseDataValidate(JSONObject tousseItem,Long produceDate){ + private void comboTousseDataValidate(TousseDefinition comboTousseTD,JSONObject tousseItem,Long produceDate){ String handlerDepartCode = AcegiHelper.getLoginUser().getOrgUnitCodingFromSupplyRoomConfig(); - String id = tousseItem.optString("id"); String comboTousseName = tousseItem.optString("tousseName"); String packageType = tousseItem.optString("packageType"); if(StringUtils.isBlank(packageType)){ throw new RuntimeException(comboTousseName + ",未设置包装类型!"); } //聚合包属于哪个临床科室 - TousseDefinition comboTousseTD = tousseDefinitionManager.getTousseDefinitionById(id); - if (comboTousseTD == null) { - throw new RuntimeException(comboTousseName + "定义已不存在!"); - } List> list = comboTousseManagerImpl.getComboTousseOrgUnitByTdId(comboTousseTD.getId()); if (CollectionUtils.isEmpty(list)) { throw new RuntimeException(comboTousseName + ",包定义未设置所属科室!"); @@ -5820,7 +5853,7 @@ Integer packingAmount = tousseJson.optInt("amount"); Integer amount = tousseJson.optInt("amount"); if(amount > 0){ - List taskList = findPackingTaskBySQL(tousseDefinitionId, handlerDepartCode, list); + List taskList = findPackingTaskBySQL(tousseDefinitionId, handlerDepartCode, list,true); String ids = ""; if(taskList != null){ for (PackingTask packingTask : taskList) { @@ -5846,7 +5879,11 @@ @Override @SuppressWarnings("unchecked") - public List findPackingTaskBySQL(Long tousseDefinitionId,String handlerDepartCode,List> departCodingList){ + public List findPackingTaskBySQL(Long tousseDefinitionId,String handlerDepartCode,List> departCodingList){ + return findPackingTaskBySQL(tousseDefinitionId, handlerDepartCode, departCodingList, false); + } + + private List findPackingTaskBySQL(Long tousseDefinitionId,String handlerDepartCode,List> departCodingList,boolean forUpdate){ if(tousseDefinitionId == null){ return null; } @@ -5868,7 +5905,11 @@ + "and po.departCoding in ('%s') and po.status = '%s'", tousseDefinitionId,handlerDepartCode, codingSQL,PackingTask.STATUS_AWAIT_PACKING); if(StringUtils.isNotBlank(sql)){ - return objectDao.findBySql(PackingTask.class.getSimpleName(), sql); + if(forUpdate){ + return objectDao.findBySql_ForUpdate(PackingTask.class.getSimpleName(), sql); + }else{ + return objectDao.findBySql(PackingTask.class.getSimpleName(), sql); + } } return null; } Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManager.java =================================================================== diff -u -r18500 -r18575 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManager.java (.../PackingManager.java) (revision 18500) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManager.java (.../PackingManager.java) (revision 18575) @@ -125,7 +125,7 @@ public String getIDCardInfoForPackingView(String barcode); - public String packingTousse_TRANS_REQUIRED(String params,HttpSession session) throws Exception; + public String packingTousse_TRANS_REQUIRED(String params,HttpSession session) ; /** * 装配聚合包